diff --git a/data/maps/PewterCity_Gym/text.inc b/data/maps/PewterCity_Gym/text.inc index 0b12ccd6c..a92ebe095 100644 --- a/data/maps/PewterCity_Gym/text.inc +++ b/data/maps/PewterCity_Gym/text.inc @@ -16,7 +16,7 @@ PewterCity_Gym_Text_BrockIntro:: @ NOTE: This defeat text actually causes a buffer overflow. It's too long for the gDisplayedStringBattle @ buffer that it's put into, and it stomps all over the gBattleTextBuffs after, as well as the otherwise -@ unused array after that, gUnknown_2022AE8. Perhaps that's the reason why said array exists. +@ unused array after that, sFlickerArray. Perhaps that's the reason why said array exists. PewterCity_Gym_Text_BrockDefeat:: .string "I took you for granted, and so\n" .string "I lost.\p" diff --git a/include/battle.h b/include/battle.h index b581190d6..ec98208a9 100644 --- a/include/battle.h +++ b/include/battle.h @@ -188,7 +188,7 @@ struct ProtectStruct u32 confusionSelfDmg:1; u32 targetNotAffected:1; u32 chargingTurn:1; - u32 fleeFlag:2; // for RunAway and Smoke Ball + u32 fleeType:2; // for RunAway and Smoke Ball u32 usedImprisonedMove:1; u32 loveImmobility:1; u32 usedDisabledMove:1; @@ -361,7 +361,7 @@ struct BattleResults extern struct BattleResults gBattleResults; -struct LinkPartnerHeader +struct LinkBattlerHeader { u8 versionSignatureLo; u8 versionSignatureHi; @@ -452,7 +452,7 @@ struct BattleStruct u8 field_182; // align 4 union { - struct LinkPartnerHeader linkPartnerHeader; + struct LinkBattlerHeader linkBattlerHeader; struct MultiBattlePokemonTx multiBattleMons[3]; } multiBuffer; u8 padding_1E4[0x1C]; @@ -681,8 +681,8 @@ extern u8 gActionSelectionCursor[MAX_BATTLERS_COUNT]; extern void (*gPreBattleCallback1)(void); extern bool8 gDoingBattleAnim; extern struct PokedudeBattlerState *gPokedudeBattlerStates[MAX_BATTLERS_COUNT]; -extern u8 *gBattleAnimMons_BgTilesBuffer; -extern u8 *gBattleAnimMons_BgTilemapBuffer; +extern u8 *gBattleAnimBgTileBuffer; +extern u8 *gBattleAnimBgTilemapBuffer; extern void (*gBattleMainFunc)(void); extern u8 gMoveSelectionCursor[MAX_BATTLERS_COUNT]; extern u32 gUnknown_2022B54; diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 12e786fc9..b473f5022 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -101,6 +101,8 @@ enum { #define INSTANT_HP_BAR_DROP 0x7FFF +#define PARTY_SUMM_SKIP_DRAW_DELAY (1 << 7) + // Special return values in gBattleBufferB from Battle Controller functions. #define RET_VALUE_LEVELED_UP 11 diff --git a/include/battle_main.h b/include/battle_main.h index 8d5e1d19d..009e0e562 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -73,10 +73,10 @@ u32 GetBattleBgTemplateData(u8 arrayId, u8 caseId); void SpriteCB_EnemyMon(struct Sprite *sprite); void SpriteCallbackDummy_2(struct Sprite *sprite); void SpriteCB_FaintOpponentMon(struct Sprite *sprite); -void SpriteCb_ShowAsMoveTarget(struct Sprite *sprite); -void SpriteCb_HideAsMoveTarget(struct Sprite *sprite); +void SpriteCB_ShowAsMoveTarget(struct Sprite *sprite); +void SpriteCB_HideAsMoveTarget(struct Sprite *sprite); void SpriteCB_AllyMon(struct Sprite *sprite); -void SpriteCB_SetToDummy3(struct Sprite *sprite); +void SetIdleSpriteCallback(struct Sprite *sprite); void SpriteCB_FaintSlideAnim(struct Sprite *sprite); void DoBounceEffect(u8 battler, u8 which, s8 delta, s8 amplitude); void EndBounceEffect(u8 battler, u8 which); diff --git a/include/battle_util.h b/include/battle_util.h index cd0b1ab12..fe19aace0 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -9,6 +9,7 @@ #define MOVE_LIMITATION_TORMENTED (1 << 3) #define MOVE_LIMITATION_TAUNT (1 << 4) #define MOVE_LIMITATION_IMPRISON (1 << 5) +#define MOVE_LIMITATIONS_ALL 0xFF #define ABILITYEFFECT_ON_SWITCHIN 0 #define ABILITYEFFECT_ENDTURN 1 @@ -38,9 +39,12 @@ #define ABILITY_ON_FIELD(abilityId)(AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, abilityId, 0, 0)) #define ABILITY_ON_FIELD2(abilityId)(AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, abilityId, 0, 0)) -#define ITEMEFFECT_ON_SWITCH_IN 0x0 -#define ITEMEFFECT_MOVE_END 0x3 -#define ITEMEFFECT_KINGSROCK_SHELLBELL 0x4 +// For the first argument of ItemBattleEffects, to deteremine which block of item effects to try +#define ITEMEFFECT_ON_SWITCH_IN 0 +#define ITEMEFFECT_NORMAL 1 +#define ITEMEFFECT_DUMMY 2 // Unused, empty +#define ITEMEFFECT_MOVE_END 3 +#define ITEMEFFECT_KINGSROCK_SHELLBELL 4 #define WEATHER_HAS_EFFECT ((!AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_CLOUD_NINE, 0, 0) && !AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_AIR_LOCK, 0, 0))) #define WEATHER_HAS_EFFECT2 ((!AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_CLOUD_NINE, 0, 0) && !AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_AIR_LOCK, 0, 0))) @@ -58,7 +62,6 @@ u8 GetBattlerForBattleScript(u8 caseId); void PressurePPLose(u8 target, u8 attacker, u16 move); void PressurePPLoseOnUsingImprison(u8 attacker); void PressurePPLoseOnUsingPerishSong(u8 attacker); -void MarkAllBattlersForControllerExec(void); void MarkBattlerForControllerExec(u8 battlerId); void MarkBattlerReceivedLinkData(u8 battlerId); void CancelMultiTurnMoves(u8 battler); diff --git a/include/constants/battle.h b/include/constants/battle.h index 0b4c372a2..f628e7fed 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -316,6 +316,9 @@ #define NUM_CASTFORM_FORMS 4 #define CASTFORM_SUBSTITUTE (1 << 7) +#define FLEE_ITEM 1 +#define FLEE_ABILITY 2 + // Return value for IsRunningFromBattleImpossible. #define BATTLE_RUN_SUCCESS 0 #define BATTLE_RUN_FORBIDDEN 1 @@ -351,4 +354,7 @@ #define B_TEXT_FLAG_NPC_CONTEXT_FONT (1 << 6) #define B_TEXT_FLAG_WINDOW_CLEAR (1 << 7) +// Indicator for the party summary bar to display an empty slot. +#define HP_EMPTY_SLOT 0xFFFF + #endif // GUARD_CONSTANTS_BATTLE_H diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index dbea7dff5..8e59604d7 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -224,7 +224,6 @@ #define EV_ITEM_RAISE_LIMIT 100 #define PARTY_SIZE 6 -#define UNOWN_FORM_COUNT 28 #define BOX_NAME_LENGTH 8 #define EVO_MODE_NORMAL 0 diff --git a/include/pokemon.h b/include/pokemon.h index 0c5657f24..29ed66072 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -314,6 +314,15 @@ struct Evolution #define EVOS_PER_MON 5 +#define NUM_UNOWN_FORMS 28 + +#define GET_UNOWN_LETTER(personality) (( \ + (((personality) & 0x03000000) >> 18) \ + | (((personality) & 0x00030000) >> 12) \ + | (((personality) & 0x00000300) >> 6) \ + | (((personality) & 0x00000003) >> 0) \ +) % NUM_UNOWN_FORMS) + extern u8 gPlayerPartyCount; extern struct Pokemon gPlayerParty[PARTY_SIZE]; extern u8 gEnemyPartyCount; diff --git a/include/pokemon_summary_screen.h b/include/pokemon_summary_screen.h index aee4c27be..e4be91f1f 100644 --- a/include/pokemon_summary_screen.h +++ b/include/pokemon_summary_screen.h @@ -3,8 +3,8 @@ #include "main.h" -extern const u8 * const gMoveDescriptionPointers[]; -extern const u8 * const gNatureNamePointers[]; +extern const u8 *const gMoveDescriptionPointers[]; +extern const u8 *const gNatureNamePointers[]; void ShowSelectMovePokemonSummaryScreen(struct Pokemon *, u8, u8, MainCallback, u16); u8 GetMoveSlotToReplace(void); diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index fa59a20c9..81536395c 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -9,13 +9,6 @@ #include "util.h" #include "constants/battle_anim.h" -#define GET_UNOWN_LETTER(personality) (( \ - (((personality & 0x03000000) >> 24) << 6) \ - | (((personality & 0x00030000) >> 16) << 4) \ - | (((personality & 0x00000300) >> 8) << 2) \ - | (((personality & 0x00000003) >> 0) << 0) \ -) % 28) - #define IS_DOUBLE_BATTLE() (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) static u8 GetBattlerSpriteFinal_Y(u8 battlerId, u16 species, bool8 a3); @@ -811,8 +804,8 @@ bool8 IsDoubleBattle(void) void GetBattleAnimBg1Data(struct BattleAnimBgData *animBgData) { - animBgData->bgTiles = gBattleAnimMons_BgTilesBuffer; - animBgData->bgTilemap = (u16 *)gBattleAnimMons_BgTilemapBuffer; + animBgData->bgTiles = gBattleAnimBgTileBuffer; + animBgData->bgTilemap = (u16 *)gBattleAnimBgTilemapBuffer; animBgData->paletteId = 8; animBgData->bgId = 1; animBgData->tilesOffset = 0x200; @@ -827,8 +820,8 @@ void GetBattleAnimBgData(struct BattleAnimBgData *animBgData, u32 bgId) } else { - animBgData->bgTiles = gBattleAnimMons_BgTilesBuffer; - animBgData->bgTilemap = (u16 *)gBattleAnimMons_BgTilemapBuffer; + animBgData->bgTiles = gBattleAnimBgTileBuffer; + animBgData->bgTilemap = (u16 *)gBattleAnimBgTilemapBuffer; animBgData->paletteId = 9; animBgData->bgId = 2; animBgData->tilesOffset = 0x300; @@ -838,8 +831,8 @@ void GetBattleAnimBgData(struct BattleAnimBgData *animBgData, u32 bgId) void GetBattleAnimBgDataByPriorityRank(struct BattleAnimBgData *animBgData, u8 unused) { - animBgData->bgTiles = gBattleAnimMons_BgTilesBuffer; - animBgData->bgTilemap = (u16 *)gBattleAnimMons_BgTilemapBuffer; + animBgData->bgTiles = gBattleAnimBgTileBuffer; + animBgData->bgTilemap = (u16 *)gBattleAnimBgTilemapBuffer; if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1) { animBgData->paletteId = 8; @@ -869,9 +862,9 @@ void InitBattleAnimBg(u32 bgId) void AnimLoadCompressedBgGfx(u32 bgId, const u32 *src, u32 tilesOffset) { - CpuFill32(0, gBattleAnimMons_BgTilesBuffer, 0x2000); - LZDecompressWram(src, gBattleAnimMons_BgTilesBuffer); - LoadBgTiles(bgId, gBattleAnimMons_BgTilesBuffer, 0x2000, tilesOffset); + CpuFill32(0, gBattleAnimBgTileBuffer, 0x2000); + LZDecompressWram(src, gBattleAnimBgTileBuffer); + LoadBgTiles(bgId, gBattleAnimBgTileBuffer, 0x2000, tilesOffset); } void InitAnimBgTilemapBuffer(u32 bgId, const void *src) diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 16c812fb0..2ebffdc77 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -337,7 +337,7 @@ static void HandleInputChooseTarget(void) if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCb_HideAsMoveTarget; + gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); PlayerBufferExecCompleted(); @@ -345,7 +345,7 @@ static void HandleInputChooseTarget(void) else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); - gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCb_HideAsMoveTarget; + gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove; DoBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX, 7, 1); DoBounceEffect(gActiveBattler, BOUNCE_MON, 7, 1); @@ -354,7 +354,7 @@ static void HandleInputChooseTarget(void) else if (JOY_NEW(DPAD_LEFT | DPAD_UP)) { PlaySE(SE_SELECT); - gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCb_HideAsMoveTarget; + gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; do { @@ -389,12 +389,12 @@ static void HandleInputChooseTarget(void) i = 0; } while (i == 0); - gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCb_ShowAsMoveTarget; + gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_ShowAsMoveTarget; } else if (JOY_NEW(DPAD_RIGHT | DPAD_DOWN)) { PlaySE(SE_SELECT); - gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCb_HideAsMoveTarget; + gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; do { @@ -429,7 +429,7 @@ static void HandleInputChooseTarget(void) i = 0; } while (i == 0); - gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCb_ShowAsMoveTarget; + gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_ShowAsMoveTarget; } } @@ -496,7 +496,7 @@ void HandleInputChooseMove(void) gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); else gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCb_ShowAsMoveTarget; + gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_ShowAsMoveTarget; } } else if (JOY_NEW(B_BUTTON)) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index f259903e7..205c49362 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -1100,13 +1100,13 @@ void BtlController_EmitIntroTrainerBallThrow(u8 bufferId) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -void BtlController_EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus* hpAndStatus, u8 param) +void BtlController_EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus* hpAndStatus, u8 flags) { s32 i; sBattleBuffersTransferData[0] = CONTROLLER_DRAWPARTYSTATUSSUMMARY; - sBattleBuffersTransferData[1] = param & 0x7F; - sBattleBuffersTransferData[2] = (param & 0x80) >> 7; + sBattleBuffersTransferData[1] = flags & ~PARTY_SUMM_SKIP_DRAW_DELAY; // If true, skip player side + sBattleBuffersTransferData[2] = (flags & PARTY_SUMM_SKIP_DRAW_DELAY) >> 7; // If true, skip delay after drawing. True during intro sBattleBuffersTransferData[3] = CONTROLLER_DRAWPARTYSTATUSSUMMARY; for (i = 0; i < (s32)(sizeof(struct HpAndStatus) * PARTY_SIZE); ++i) sBattleBuffersTransferData[4 + i] = *(i + (u8 *)(hpAndStatus)); diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 88334ba9c..327253c04 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -140,7 +140,7 @@ void SpriteCB_WaitForBattlerBallReleaseAnim(struct Sprite *sprite) gSprites[spriteId].animPaused = 0; else if (gSprites[spriteId].animEnded) { - gSprites[spriteId].callback = SpriteCB_SetToDummy3; + gSprites[spriteId].callback = SetIdleSpriteCallback; StartSpriteAffineAnim(&gSprites[spriteId], 0); sprite->callback = SpriteCallbackDummy; } diff --git a/src/battle_interface.c b/src/battle_interface.c index d0713bda1..57130c9ee 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1137,8 +1137,9 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - if (partyInfo[i].hp == 0xFFFF) // empty slot or an egg + if (partyInfo[i].hp == HP_EMPTY_SLOT) { + // empty slot or an egg gSprites[ballIconSpritesIds[i]].oam.tileNum += 1; gSprites[ballIconSpritesIds[i]].data[7] = 1; } @@ -1153,17 +1154,20 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, } else { - if (i >= nValidMons) // empty slot or an egg + if (i >= nValidMons) { + // empty slot or an egg gSprites[ballIconSpritesIds[i]].oam.tileNum += 1; gSprites[ballIconSpritesIds[i]].data[7] = 1; } - else if (partyInfo[i].hp == 0) // fainted mon + else if (partyInfo[i].hp == 0) { + // fainted mon gSprites[ballIconSpritesIds[i]].oam.tileNum += 3; } - else if (partyInfo[i].status != 0) // mon with major status + else if (partyInfo[i].status != 0) { + // mon with major status gSprites[ballIconSpritesIds[i]].oam.tileNum += 2; } } @@ -1175,17 +1179,20 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - if (partyInfo[i].hp == 0xFFFF) // empty slot or an egg + if (partyInfo[i].hp == HP_EMPTY_SLOT) { + // empty slot or an egg gSprites[ballIconSpritesIds[5 - i]].oam.tileNum += 1; gSprites[ballIconSpritesIds[5 - i]].data[7] = 1; } - else if (partyInfo[i].hp == 0) // fainted mon + else if (partyInfo[i].hp == 0) { + // fainted mon gSprites[ballIconSpritesIds[5 - i]].oam.tileNum += 3; } - else if (partyInfo[i].status != 0) // mon with major status + else if (partyInfo[i].status != 0) { + // mon with major status gSprites[ballIconSpritesIds[5 - i]].oam.tileNum += 2; } } diff --git a/src/battle_main.c b/src/battle_main.c index 710463543..681230482 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -79,9 +79,9 @@ static void SpriteCB_MoveWildMonToRight(struct Sprite *sprite); static void SpriteCB_WildMonShowHealthbox(struct Sprite *sprite); static void SpriteCB_Unused_8011E28_Step(struct Sprite *sprite); static void SpriteCB_AnimFaintOpponent(struct Sprite *sprite); -static void SpriteCb_BlinkVisible(struct Sprite *sprite); +static void SpriteCB_BlinkVisible(struct Sprite *sprite); static void oac_poke_ally_(struct Sprite *sprite); -static void SpriteCallbackDummy3(struct Sprite *sprite); +static void SpriteCB_Idle(struct Sprite *sprite); static void SpriteCB_BounceEffect(struct Sprite *sprite); static void SpriteCB_PlayerThrowUpdate(struct Sprite *sprite); static void BattleStartClearSetData(void); @@ -125,13 +125,18 @@ EWRAM_DATA u8 gDisplayedStringBattle[300] = {0}; EWRAM_DATA u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT] = {0}; EWRAM_DATA u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT] = {0}; EWRAM_DATA u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT] = {0}; -static EWRAM_DATA u32 gUnknown_2022AE8[25] = {0}; // Note: This shouldn't be removed without adjusting the size of gDisplayedStringBattle. +// The below array is never intentionally used. However, Brock's +// defeat text (PewterCity_Gym_Text_BrockDefeat) is too long +// for gDisplayedStringBattle and overflows into this array. If it +// is removed (and none of the buffers above are increased in size) +// it will instead overflow into useful data. +static EWRAM_DATA u32 sFlickerArray[25] = {0}; EWRAM_DATA u32 gBattleTypeFlags = 0; EWRAM_DATA u8 gBattleTerrain = 0; EWRAM_DATA u32 gUnknown_2022B54 = 0; EWRAM_DATA struct MultiBattlePokemonTx gMultiPartnerParty[3] = {0}; -EWRAM_DATA u8 *gBattleAnimMons_BgTilesBuffer = NULL; -EWRAM_DATA u8 *gBattleAnimMons_BgTilemapBuffer = NULL; +EWRAM_DATA u8 *gBattleAnimBgTileBuffer = NULL; +EWRAM_DATA u8 *gBattleAnimBgTilemapBuffer = NULL; static EWRAM_DATA u16 *sUnknownDebugSpriteDataBuffer = NULL; EWRAM_DATA u8 gBattleBufferA[MAX_BATTLERS_COUNT][0x200] = {0}; EWRAM_DATA u8 gBattleBufferB[MAX_BATTLERS_COUNT][0x200] = {0}; @@ -178,7 +183,7 @@ EWRAM_DATA u8 gLastHitBy[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gMoveResultFlags = 0; EWRAM_DATA u32 gHitMarker = 0; -static EWRAM_DATA u8 gUnknown_2023DD4[MAX_BATTLERS_COUNT] = {0}; +static EWRAM_DATA u8 sUnusedBattlersArray[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gTakenDmgByBattler[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gUnknown_2023DDC = 0; EWRAM_DATA u16 gSideStatuses[2] = {0}; @@ -425,188 +430,188 @@ const u8 gTypeEffectiveness[336] = TYPE_ENDTABLE, TYPE_ENDTABLE, TYPE_MUL_NO_EFFECT }; -const u8 gTypeNames[][TYPE_NAME_LENGTH + 1] = +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. const struct TrainerMoney gTrainerMoneyTable[] = { - { TRAINER_CLASS_LEADER, 25 }, - { TRAINER_CLASS_ELITE_FOUR, 25 }, - { TRAINER_CLASS_PKMN_PROF, 25 }, - { TRAINER_CLASS_RIVAL_EARLY, 4 }, - { TRAINER_CLASS_RIVAL_LATE, 9 }, - { TRAINER_CLASS_CHAMPION, 25 }, - { TRAINER_CLASS_YOUNGSTER, 4 }, - { TRAINER_CLASS_BUG_CATCHER, 3 }, - { TRAINER_CLASS_HIKER, 9 }, - { TRAINER_CLASS_BIRD_KEEPER, 6 }, - { TRAINER_CLASS_PICNICKER, 5 }, - { TRAINER_CLASS_SUPER_NERD, 6 }, - { TRAINER_CLASS_FISHERMAN, 9 }, - { TRAINER_CLASS_TEAM_ROCKET, 8 }, - { TRAINER_CLASS_LASS, 4 }, - { TRAINER_CLASS_BEAUTY, 18 }, - { TRAINER_CLASS_BLACK_BELT, 6 }, - { TRAINER_CLASS_CUE_BALL, 6 }, - { TRAINER_CLASS_CHANNELER, 8 }, - { TRAINER_CLASS_ROCKER, 6 }, - { TRAINER_CLASS_GENTLEMAN, 18 }, - { TRAINER_CLASS_BURGLAR, 22 }, - { TRAINER_CLASS_SWIMMER_M, 1 }, - { TRAINER_CLASS_ENGINEER, 12 }, - { TRAINER_CLASS_JUGGLER, 10 }, - { TRAINER_CLASS_SAILOR, 8 }, - { TRAINER_CLASS_COOLTRAINER, 9 }, - { TRAINER_CLASS_POKEMANIAC, 12 }, - { TRAINER_CLASS_TAMER, 10 }, - { TRAINER_CLASS_CAMPER, 5 }, - { TRAINER_CLASS_PSYCHIC, 5 }, - { TRAINER_CLASS_BIKER, 5 }, - { TRAINER_CLASS_GAMER, 18 }, - { TRAINER_CLASS_SCIENTIST, 12 }, - { TRAINER_CLASS_CRUSH_GIRL, 6 }, - { TRAINER_CLASS_TUBER, 1 }, - { TRAINER_CLASS_PKMN_BREEDER, 7 }, - { TRAINER_CLASS_PKMN_RANGER, 9 }, - { TRAINER_CLASS_AROMA_LADY, 7 }, - { TRAINER_CLASS_RUIN_MANIAC, 12 }, - { TRAINER_CLASS_LADY, 50 }, - { TRAINER_CLASS_PAINTER, 4 }, - { TRAINER_CLASS_TWINS, 3 }, - { TRAINER_CLASS_YOUNG_COUPLE, 7 }, - { TRAINER_CLASS_SIS_AND_BRO, 1 }, - { TRAINER_CLASS_COOL_COUPLE, 6 }, - { TRAINER_CLASS_CRUSH_KIN, 6 }, - { TRAINER_CLASS_SWIMMER_F, 1 }, - { TRAINER_CLASS_PLAYER, 1 }, - { TRAINER_CLASS_RS_LEADER, 25 }, - { TRAINER_CLASS_RS_ELITE_FOUR, 25 }, - { TRAINER_CLASS_RS_LASS, 4 }, - { TRAINER_CLASS_RS_YOUNGSTER, 4 }, - { TRAINER_CLASS_PKMN_TRAINER, 15 }, - { TRAINER_CLASS_RS_HIKER, 10 }, - { TRAINER_CLASS_RS_BEAUTY, 20 }, - { TRAINER_CLASS_RS_FISHERMAN, 10 }, - { TRAINER_CLASS_RS_LADY, 50 }, - { TRAINER_CLASS_TRIATHLETE, 10 }, - { TRAINER_CLASS_TEAM_AQUA, 5 }, - { TRAINER_CLASS_RS_TWINS, 3 }, - { TRAINER_CLASS_RS_SWIMMER_F, 2 }, - { TRAINER_CLASS_RS_BUG_CATCHER, 4 }, - { TRAINER_CLASS_SCHOOL_KID, 5 }, - { TRAINER_CLASS_RICH_BOY, 50 }, - { TRAINER_CLASS_SR_AND_JR, 4 }, - { TRAINER_CLASS_RS_BLACK_BELT, 8 }, - { TRAINER_CLASS_RS_TUBER_F, 1 }, - { TRAINER_CLASS_HEX_MANIAC, 6 }, - { TRAINER_CLASS_RS_PKMN_BREEDER, 10 }, - { TRAINER_CLASS_TEAM_MAGMA, 5 }, - { TRAINER_CLASS_INTERVIEWER, 12 }, - { TRAINER_CLASS_RS_TUBER_M, 1 }, - { TRAINER_CLASS_RS_YOUNG_COUPLE, 8 }, - { TRAINER_CLASS_GUITARIST, 8 }, - { TRAINER_CLASS_RS_GENTLEMAN, 20 }, - { TRAINER_CLASS_RS_CHAMPION, 50 }, - { TRAINER_CLASS_MAGMA_LEADER, 20 }, - { TRAINER_CLASS_BATTLE_GIRL, 6 }, - { TRAINER_CLASS_RS_SWIMMER_M, 2 }, - { TRAINER_CLASS_POKEFAN, 20 }, - { TRAINER_CLASS_EXPERT, 10 }, - { TRAINER_CLASS_DRAGON_TAMER, 12 }, - { TRAINER_CLASS_RS_BIRD_KEEPER, 8 }, - { TRAINER_CLASS_NINJA_BOY, 3 }, - { TRAINER_CLASS_PARASOL_LADY, 10 }, - { TRAINER_CLASS_BUG_MANIAC, 15 }, - { TRAINER_CLASS_RS_SAILOR, 8 }, - { TRAINER_CLASS_COLLECTOR, 15 }, - { TRAINER_CLASS_RS_PKMN_RANGER, 12 }, - { TRAINER_CLASS_MAGMA_ADMIN, 10 }, - { TRAINER_CLASS_RS_AROMA_LADY, 10 }, - { TRAINER_CLASS_RS_RUIN_MANIAC, 15 }, - { TRAINER_CLASS_RS_COOLTRAINER, 12 }, - { TRAINER_CLASS_RS_POKEMANIAC, 15 }, - { TRAINER_CLASS_KINDLER, 8 }, - { TRAINER_CLASS_RS_CAMPER, 4 }, - { TRAINER_CLASS_RS_PICNICKER, 4 }, - { TRAINER_CLASS_RS_PSYCHIC, 6 }, - { TRAINER_CLASS_RS_SIS_AND_BRO, 3 }, - { TRAINER_CLASS_OLD_COUPLE, 10 }, - { TRAINER_CLASS_AQUA_ADMIN, 10 }, - { TRAINER_CLASS_AQUA_LEADER, 20 }, - { TRAINER_CLASS_BOSS, 25 }, - { 0xFF, 5 }, + {TRAINER_CLASS_LEADER, 25}, + {TRAINER_CLASS_ELITE_FOUR, 25}, + {TRAINER_CLASS_PKMN_PROF, 25}, + {TRAINER_CLASS_RIVAL_EARLY, 4}, + {TRAINER_CLASS_RIVAL_LATE, 9}, + {TRAINER_CLASS_CHAMPION, 25}, + {TRAINER_CLASS_YOUNGSTER, 4}, + {TRAINER_CLASS_BUG_CATCHER, 3}, + {TRAINER_CLASS_HIKER, 9}, + {TRAINER_CLASS_BIRD_KEEPER, 6}, + {TRAINER_CLASS_PICNICKER, 5}, + {TRAINER_CLASS_SUPER_NERD, 6}, + {TRAINER_CLASS_FISHERMAN, 9}, + {TRAINER_CLASS_TEAM_ROCKET, 8}, + {TRAINER_CLASS_LASS, 4}, + {TRAINER_CLASS_BEAUTY, 18}, + {TRAINER_CLASS_BLACK_BELT, 6}, + {TRAINER_CLASS_CUE_BALL, 6}, + {TRAINER_CLASS_CHANNELER, 8}, + {TRAINER_CLASS_ROCKER, 6}, + {TRAINER_CLASS_GENTLEMAN, 18}, + {TRAINER_CLASS_BURGLAR, 22}, + {TRAINER_CLASS_SWIMMER_M, 1}, + {TRAINER_CLASS_ENGINEER, 12}, + {TRAINER_CLASS_JUGGLER, 10}, + {TRAINER_CLASS_SAILOR, 8}, + {TRAINER_CLASS_COOLTRAINER, 9}, + {TRAINER_CLASS_POKEMANIAC, 12}, + {TRAINER_CLASS_TAMER, 10}, + {TRAINER_CLASS_CAMPER, 5}, + {TRAINER_CLASS_PSYCHIC, 5}, + {TRAINER_CLASS_BIKER, 5}, + {TRAINER_CLASS_GAMER, 18}, + {TRAINER_CLASS_SCIENTIST, 12}, + {TRAINER_CLASS_CRUSH_GIRL, 6}, + {TRAINER_CLASS_TUBER, 1}, + {TRAINER_CLASS_PKMN_BREEDER, 7}, + {TRAINER_CLASS_PKMN_RANGER, 9}, + {TRAINER_CLASS_AROMA_LADY, 7}, + {TRAINER_CLASS_RUIN_MANIAC, 12}, + {TRAINER_CLASS_LADY, 50}, + {TRAINER_CLASS_PAINTER, 4}, + {TRAINER_CLASS_TWINS, 3}, + {TRAINER_CLASS_YOUNG_COUPLE, 7}, + {TRAINER_CLASS_SIS_AND_BRO, 1}, + {TRAINER_CLASS_COOL_COUPLE, 6}, + {TRAINER_CLASS_CRUSH_KIN, 6}, + {TRAINER_CLASS_SWIMMER_F, 1}, + {TRAINER_CLASS_PLAYER, 1}, + {TRAINER_CLASS_RS_LEADER, 25}, + {TRAINER_CLASS_RS_ELITE_FOUR, 25}, + {TRAINER_CLASS_RS_LASS, 4}, + {TRAINER_CLASS_RS_YOUNGSTER, 4}, + {TRAINER_CLASS_PKMN_TRAINER, 15}, + {TRAINER_CLASS_RS_HIKER, 10}, + {TRAINER_CLASS_RS_BEAUTY, 20}, + {TRAINER_CLASS_RS_FISHERMAN, 10}, + {TRAINER_CLASS_RS_LADY, 50}, + {TRAINER_CLASS_TRIATHLETE, 10}, + {TRAINER_CLASS_TEAM_AQUA, 5}, + {TRAINER_CLASS_RS_TWINS, 3}, + {TRAINER_CLASS_RS_SWIMMER_F, 2}, + {TRAINER_CLASS_RS_BUG_CATCHER, 4}, + {TRAINER_CLASS_SCHOOL_KID, 5}, + {TRAINER_CLASS_RICH_BOY, 50}, + {TRAINER_CLASS_SR_AND_JR, 4}, + {TRAINER_CLASS_RS_BLACK_BELT, 8}, + {TRAINER_CLASS_RS_TUBER_F, 1}, + {TRAINER_CLASS_HEX_MANIAC, 6}, + {TRAINER_CLASS_RS_PKMN_BREEDER, 10}, + {TRAINER_CLASS_TEAM_MAGMA, 5}, + {TRAINER_CLASS_INTERVIEWER, 12}, + {TRAINER_CLASS_RS_TUBER_M, 1}, + {TRAINER_CLASS_RS_YOUNG_COUPLE, 8}, + {TRAINER_CLASS_GUITARIST, 8}, + {TRAINER_CLASS_RS_GENTLEMAN, 20}, + {TRAINER_CLASS_RS_CHAMPION, 50}, + {TRAINER_CLASS_MAGMA_LEADER, 20}, + {TRAINER_CLASS_BATTLE_GIRL, 6}, + {TRAINER_CLASS_RS_SWIMMER_M, 2}, + {TRAINER_CLASS_POKEFAN, 20}, + {TRAINER_CLASS_EXPERT, 10}, + {TRAINER_CLASS_DRAGON_TAMER, 12}, + {TRAINER_CLASS_RS_BIRD_KEEPER, 8}, + {TRAINER_CLASS_NINJA_BOY, 3}, + {TRAINER_CLASS_PARASOL_LADY, 10}, + {TRAINER_CLASS_BUG_MANIAC, 15}, + {TRAINER_CLASS_RS_SAILOR, 8}, + {TRAINER_CLASS_COLLECTOR, 15}, + {TRAINER_CLASS_RS_PKMN_RANGER, 12}, + {TRAINER_CLASS_MAGMA_ADMIN, 10}, + {TRAINER_CLASS_RS_AROMA_LADY, 10}, + {TRAINER_CLASS_RS_RUIN_MANIAC, 15}, + {TRAINER_CLASS_RS_COOLTRAINER, 12}, + {TRAINER_CLASS_RS_POKEMANIAC, 15}, + {TRAINER_CLASS_KINDLER, 8}, + {TRAINER_CLASS_RS_CAMPER, 4}, + {TRAINER_CLASS_RS_PICNICKER, 4}, + {TRAINER_CLASS_RS_PSYCHIC, 6}, + {TRAINER_CLASS_RS_SIS_AND_BRO, 3}, + {TRAINER_CLASS_OLD_COUPLE, 10}, + {TRAINER_CLASS_AQUA_ADMIN, 10}, + {TRAINER_CLASS_AQUA_LEADER, 20}, + {TRAINER_CLASS_BOSS, 25}, + { 0xFF, 5}, }; #include "data/text/abilities.h" static void (*const sTurnActionsFuncsTable[])(void) = { - [B_ACTION_USE_MOVE] = HandleAction_UseMove, - [B_ACTION_USE_ITEM] = HandleAction_UseItem, - [B_ACTION_SWITCH] = HandleAction_Switch, - [B_ACTION_RUN] = HandleAction_Run, + [B_ACTION_USE_MOVE] = HandleAction_UseMove, + [B_ACTION_USE_ITEM] = HandleAction_UseItem, + [B_ACTION_SWITCH] = HandleAction_Switch, + [B_ACTION_RUN] = HandleAction_Run, [B_ACTION_SAFARI_WATCH_CAREFULLY] = HandleAction_WatchesCarefully, - [B_ACTION_SAFARI_BALL] = HandleAction_SafariZoneBallThrow, - [B_ACTION_SAFARI_BAIT] = HandleAction_ThrowBait, - [B_ACTION_SAFARI_GO_NEAR] = HandleAction_ThrowRock, - [B_ACTION_SAFARI_RUN] = HandleAction_SafariZoneRun, - [B_ACTION_OLDMAN_THROW] = HandleAction_OldManBallThrow, - [B_ACTION_EXEC_SCRIPT] = HandleAction_RunBattleScript, - [B_ACTION_TRY_FINISH] = HandleAction_TryFinish, - [B_ACTION_FINISHED] = HandleAction_ActionFinished, - [B_ACTION_NOTHING_FAINTED] = HandleAction_NothingIsFainted, + [B_ACTION_SAFARI_BALL] = HandleAction_SafariZoneBallThrow, + [B_ACTION_SAFARI_BAIT] = HandleAction_ThrowBait, + [B_ACTION_SAFARI_GO_NEAR] = HandleAction_ThrowRock, + [B_ACTION_SAFARI_RUN] = HandleAction_SafariZoneRun, + [B_ACTION_OLDMAN_THROW] = HandleAction_OldManBallThrow, + [B_ACTION_EXEC_SCRIPT] = HandleAction_RunBattleScript, + [B_ACTION_TRY_FINISH] = HandleAction_TryFinish, + [B_ACTION_FINISHED] = HandleAction_ActionFinished, + [B_ACTION_NOTHING_FAINTED] = HandleAction_NothingIsFainted, }; static void (*const sEndTurnFuncsTable[])(void) = { - [0] = HandleEndTurn_ContinueBattle, //B_OUTCOME_NONE? - [B_OUTCOME_WON] = HandleEndTurn_BattleWon, - [B_OUTCOME_LOST] = HandleEndTurn_BattleLost, - [B_OUTCOME_DREW] = HandleEndTurn_BattleLost, - [B_OUTCOME_RAN] = HandleEndTurn_RanFromBattle, + [0] = HandleEndTurn_ContinueBattle, + [B_OUTCOME_WON] = HandleEndTurn_BattleWon, + [B_OUTCOME_LOST] = HandleEndTurn_BattleLost, + [B_OUTCOME_DREW] = HandleEndTurn_BattleLost, + [B_OUTCOME_RAN] = HandleEndTurn_RanFromBattle, [B_OUTCOME_PLAYER_TELEPORTED] = HandleEndTurn_FinishBattle, - [B_OUTCOME_MON_FLED] = HandleEndTurn_MonFled, - [B_OUTCOME_CAUGHT] = HandleEndTurn_FinishBattle, - [B_OUTCOME_NO_SAFARI_BALLS] = HandleEndTurn_FinishBattle, + [B_OUTCOME_MON_FLED] = HandleEndTurn_MonFled, + [B_OUTCOME_CAUGHT] = HandleEndTurn_FinishBattle, + [B_OUTCOME_NO_SAFARI_BALLS] = HandleEndTurn_FinishBattle, }; -const u8 gStatusConditionString_PoisonJpn[8] = _("どく$$$$$"); -const u8 gStatusConditionString_SleepJpn[8] = _("ねむり$$$$"); -const u8 gStatusConditionString_ParalysisJpn[8] = _("まひ$$$$$"); -const u8 gStatusConditionString_BurnJpn[8] = _("やけど$$$$"); -const u8 gStatusConditionString_IceJpn[8] = _("こおり$$$$"); -const u8 gStatusConditionString_ConfusionJpn[8] = _("こんらん$$$"); -const u8 gStatusConditionString_LoveJpn[8] = _("メロメロ$$$"); +const u8 gStatusConditionString_PoisonJpn[] = _("どく$$$$$"); +const u8 gStatusConditionString_SleepJpn[] = _("ねむり$$$$"); +const u8 gStatusConditionString_ParalysisJpn[] = _("まひ$$$$$"); +const u8 gStatusConditionString_BurnJpn[] = _("やけど$$$$"); +const u8 gStatusConditionString_IceJpn[] = _("こおり$$$$"); +const u8 gStatusConditionString_ConfusionJpn[] = _("こんらん$$$"); +const u8 gStatusConditionString_LoveJpn[] = _("メロメロ$$$"); -const u8 *const gStatusConditionStringsTable[7][2] = +const u8 *const gStatusConditionStringsTable[][2] = { - { gStatusConditionString_PoisonJpn, gText_Poison }, - { gStatusConditionString_SleepJpn, gText_Sleep }, - { gStatusConditionString_ParalysisJpn, gText_Paralysis }, - { gStatusConditionString_BurnJpn, gText_Burn }, - { gStatusConditionString_IceJpn, gText_Ice }, - { gStatusConditionString_ConfusionJpn, gText_Confusion }, - { gStatusConditionString_LoveJpn, gText_Love } + {gStatusConditionString_PoisonJpn, gText_Poison}, + {gStatusConditionString_SleepJpn, gText_Sleep}, + {gStatusConditionString_ParalysisJpn, gText_Paralysis}, + {gStatusConditionString_BurnJpn, gText_Burn}, + {gStatusConditionString_IceJpn, gText_Ice}, + {gStatusConditionString_ConfusionJpn, gText_Confusion}, + {gStatusConditionString_LoveJpn, gText_Love} }; void CB2_InitBattle(void) @@ -651,15 +656,19 @@ static void CB2_InitBattleInternal(void) SetHBlankCallback(NULL); SetVBlankCallback(NULL); - CpuFill32(0, (void *)VRAM, VRAM_SIZE); + + CpuFill32(0, (void *)(VRAM), VRAM_SIZE); + SetGpuReg(REG_OFFSET_MOSAIC, 0); - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 0xF0)); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0x50, 0x51)); + 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 = WIN_RANGE(0, 0xF0); - gBattle_WIN0V = WIN_RANGE(0x50, 0x51); + + gBattle_WIN0H = DISPLAY_WIDTH; + gBattle_WIN0V = WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2 + 1); ScanlineEffect_Clear(); + for (i = 0; i < 80; ++i) { gScanlineEffectRegBuffers[0][i] = 0xF0; @@ -671,6 +680,7 @@ static void CB2_InitBattleInternal(void) gScanlineEffectRegBuffers[1][i] = 0xFF10; } ScanlineEffect_SetParams(sIntroScanlineParams16Bit); + ResetPaletteFade(); gBattle_BG0_X = 0; gBattle_BG0_Y = 0; @@ -680,7 +690,9 @@ static void CB2_InitBattleInternal(void) gBattle_BG2_Y = 0; gBattle_BG3_X = 0; gBattle_BG3_Y = 0; + gBattleTerrain = BattleSetup_GetTerrainId(); + InitBattleBgsVideo(); LoadBattleTextboxAndBackground(); ResetSpriteData(); @@ -690,6 +702,7 @@ static void CB2_InitBattleInternal(void) gReservedSpritePaletteCount = 4; SetVBlankCallback(VBlankCB_Battle); SetUpBattleVars(); + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) SetMainCallback2(CB2_HandleStartMultiBattle); else @@ -699,9 +712,11 @@ static void CB2_InitBattleInternal(void) CreateNPCTrainerParty(&gEnemyParty[0], gTrainerBattleOpponent_A); SetWildMonHeldItem(); } + gMain.inBattle = TRUE; - for (i = 0; i < PARTY_SIZE; ++i) + for (i = 0; i < PARTY_SIZE; i++) AdjustFriendship(&gPlayerParty[i], FRIENDSHIP_EVENT_LEAGUE_BATTLE); + gBattleCommunication[MULTIUSE_STATE] = 0; } @@ -734,28 +749,29 @@ static void CB2_InitBattleInternal(void) (flags) |= 3 << (i) * 2; \ } +// For Vs Screen at link battle start static void BufferPartyVsScreenHealth_AtStart(void) { u16 flags = 0; s32 i; BUFFER_PARTY_VS_SCREEN_STATUS(gPlayerParty, flags, i); - gBattleStruct->multiBuffer.linkPartnerHeader.vsScreenHealthFlagsLo = flags; - *(&gBattleStruct->multiBuffer.linkPartnerHeader.vsScreenHealthFlagsHi) = flags >> 8; + gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsLo = flags; + *(&gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsHi) = flags >> 8; } static void SetPlayerBerryDataInBattleStruct(void) { s32 i; struct BattleStruct *battleStruct = gBattleStruct; - struct BattleEnigmaBerry *battleBerry = &battleStruct->multiBuffer.linkPartnerHeader.battleEnigmaBerry; + struct BattleEnigmaBerry *battleBerry = &battleStruct->multiBuffer.linkBattlerHeader.battleEnigmaBerry; if (IsEnigmaBerryValid() == TRUE) { - for (i = 0; i < BERRY_NAME_LENGTH; ++i) + for (i = 0; i < BERRY_NAME_LENGTH; i++) battleBerry->name[i] = gSaveBlock1Ptr->enigmaBerry.berry.name[i]; battleBerry->name[i] = EOS; - for (i = 0; i < BERRY_ITEM_EFFECT_COUNT; ++i) + for (i = 0; i < BERRY_ITEM_EFFECT_COUNT; i++) battleBerry->itemEffect[i] = gSaveBlock1Ptr->enigmaBerry.itemEffect[i]; battleBerry->holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; battleBerry->holdEffectParam = gSaveBlock1Ptr->enigmaBerry.holdEffectParam; @@ -764,10 +780,10 @@ static void SetPlayerBerryDataInBattleStruct(void) { const struct Berry *berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY)); - for (i = 0; i < BERRY_NAME_LENGTH; ++i) + for (i = 0; i < BERRY_NAME_LENGTH; i++) battleBerry->name[i] = berryData->name[i]; battleBerry->name[i] = EOS; - for (i = 0; i < BERRY_ITEM_EFFECT_COUNT; ++i) + for (i = 0; i < BERRY_ITEM_EFFECT_COUNT; i++) battleBerry->itemEffect[i] = 0; battleBerry->holdEffect = HOLD_EFFECT_NONE; battleBerry->holdEffectParam = 0; @@ -782,18 +798,20 @@ static void SetAllPlayersBerryData(void) { if (IsEnigmaBerryValid() == TRUE) { - for (i = 0; i < BERRY_NAME_LENGTH; ++i) + for (i = 0; i < BERRY_NAME_LENGTH; i++) { gEnigmaBerries[0].name[i] = gSaveBlock1Ptr->enigmaBerry.berry.name[i]; gEnigmaBerries[2].name[i] = gSaveBlock1Ptr->enigmaBerry.berry.name[i]; } gEnigmaBerries[0].name[i] = EOS; gEnigmaBerries[2].name[i] = EOS; - for (i = 0; i < BERRY_ITEM_EFFECT_COUNT; ++i) + + for (i = 0; i < BERRY_ITEM_EFFECT_COUNT; i++) { gEnigmaBerries[0].itemEffect[i] = gSaveBlock1Ptr->enigmaBerry.itemEffect[i]; gEnigmaBerries[2].itemEffect[i] = gSaveBlock1Ptr->enigmaBerry.itemEffect[i]; } + gEnigmaBerries[0].holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; gEnigmaBerries[2].holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; gEnigmaBerries[0].holdEffectParam = gSaveBlock1Ptr->enigmaBerry.holdEffectParam; @@ -803,18 +821,20 @@ static void SetAllPlayersBerryData(void) { const struct Berry *berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY)); - for (i = 0; i < BERRY_NAME_LENGTH; ++i) + for (i = 0; i < BERRY_NAME_LENGTH; i++) { gEnigmaBerries[0].name[i] = berryData->name[i]; gEnigmaBerries[2].name[i] = berryData->name[i]; } gEnigmaBerries[0].name[i] = EOS; gEnigmaBerries[2].name[i] = EOS; - for (i = 0; i < BERRY_ITEM_EFFECT_COUNT; ++i) + + for (i = 0; i < BERRY_ITEM_EFFECT_COUNT; i++) { gEnigmaBerries[0].itemEffect[i] = 0; gEnigmaBerries[2].itemEffect[i] = 0; } + gEnigmaBerries[0].holdEffect = HOLD_EFFECT_NONE; gEnigmaBerries[2].holdEffect = HOLD_EFFECT_NONE; gEnigmaBerries[0].holdEffectParam = 0; @@ -829,14 +849,14 @@ static void SetAllPlayersBerryData(void) if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - for (i = 0; i < 4; ++i) + for (i = 0; i < 4; i++) { src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2); battlerId = gLinkPlayers[i].id; - for (j = 0; j < BERRY_NAME_LENGTH; ++j) + for (j = 0; j < BERRY_NAME_LENGTH; j++) gEnigmaBerries[battlerId].name[j] = src->name[j]; gEnigmaBerries[battlerId].name[j] = EOS; - for (j = 0; j < BERRY_ITEM_EFFECT_COUNT; ++j) + for (j = 0; j < BERRY_ITEM_EFFECT_COUNT; j++) gEnigmaBerries[battlerId].itemEffect[j] = src->itemEffect[j]; gEnigmaBerries[battlerId].holdEffect = src->holdEffect; gEnigmaBerries[battlerId].holdEffectParam = src->holdEffectParam; @@ -844,17 +864,17 @@ static void SetAllPlayersBerryData(void) } else { - for (i = 0; i < 2; ++i) + for (i = 0; i < 2; i++) { src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2); - for (j = 0; j < BERRY_NAME_LENGTH; ++j) + for (j = 0; j < BERRY_NAME_LENGTH; j++) { gEnigmaBerries[i].name[j] = src->name[j]; gEnigmaBerries[i + 2].name[j] = src->name[j]; } gEnigmaBerries[i].name[j] = EOS; gEnigmaBerries[i + 2].name[j] = EOS; - for (j = 0; j < BERRY_ITEM_EFFECT_COUNT; ++j) + for (j = 0; j < BERRY_ITEM_EFFECT_COUNT; j++) { gEnigmaBerries[i].itemEffect[j] = src->itemEffect[j]; gEnigmaBerries[i + 2].itemEffect[j] = src->itemEffect[j]; @@ -879,14 +899,14 @@ static void LinkBattleComputeBattleTypeFlags(u8 numPlayers, u8 multiPlayerId) gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER; else gBattleTypeFlags |= BATTLE_TYPE_TRAINER; - ++found; + found++; } if (found == 0) { // If multiple different versions are being used, player 1 is master. s32 i; - for (i = 0; i < numPlayers; ++i) + for (i = 0; i < numPlayers; i++) if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0]) break; if (i == numPlayers) @@ -895,12 +915,12 @@ static void LinkBattleComputeBattleTypeFlags(u8 numPlayers, u8 multiPlayerId) gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER; else gBattleTypeFlags |= BATTLE_TYPE_TRAINER; - ++found; + found++; } if (found == 0) { // Lowest index player with the highest game version is master. - for (i = 0; i < numPlayers; ++i) + for (i = 0; i < numPlayers; i++) { if (gBlockRecvBuffer[i][0] == 0x201 && i != multiPlayerId) if (i < multiPlayerId) @@ -950,11 +970,11 @@ static void CB2_HandleStartBattle(void) if (IsLinkTaskFinished()) { // 0x201 - *(&gBattleStruct->multiBuffer.linkPartnerHeader.versionSignatureLo) = 1; - *(&gBattleStruct->multiBuffer.linkPartnerHeader.versionSignatureHi) = 2; + *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureLo) = 1; + *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureHi) = 2; BufferPartyVsScreenHealth_AtStart(); SetPlayerBerryDataInBattleStruct(); - SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.linkPartnerHeader, sizeof(gBattleStruct->multiBuffer.linkPartnerHeader)); + SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.linkBattlerHeader, sizeof(gBattleStruct->multiBuffer.linkBattlerHeader)); gBattleCommunication[MULTIUSE_STATE] = 2; } if (gWirelessCommType != 0) @@ -980,17 +1000,17 @@ static void CB2_HandleStartBattle(void) gTasks[taskId].data[1] = 270; gTasks[taskId].data[2] = 90; gTasks[taskId].data[5] = 0; - gTasks[taskId].data[3] = gBattleStruct->multiBuffer.linkPartnerHeader.vsScreenHealthFlagsLo | (gBattleStruct->multiBuffer.linkPartnerHeader.vsScreenHealthFlagsHi << 8); + gTasks[taskId].data[3] = gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsLo | (gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsHi << 8); gTasks[taskId].data[4] = gBlockRecvBuffer[enemyMultiplayerId][1]; SetDeoxysStats(); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; } break; case 3: if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(struct Pokemon) * 2); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; } break; case 4: @@ -998,14 +1018,14 @@ static void CB2_HandleStartBattle(void) { ResetBlockReceivedFlags(); memcpy(gEnemyParty, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; } break; case 7: if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(struct Pokemon) * 2); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; } break; case 8: @@ -1013,14 +1033,14 @@ static void CB2_HandleStartBattle(void) { ResetBlockReceivedFlags(); memcpy(gEnemyParty + 2, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; } break; case 11: if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 4, sizeof(struct Pokemon) * 2); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; } break; case 12: @@ -1034,12 +1054,12 @@ static void CB2_HandleStartBattle(void) TryCorrectShedinjaLanguage(&gEnemyParty[3]); TryCorrectShedinjaLanguage(&gEnemyParty[4]); TryCorrectShedinjaLanguage(&gEnemyParty[5]); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; } break; case 15: InitBtlControllers(); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; gBattleCommunication[SPRITES_INIT_STATE1] = 0; gBattleCommunication[SPRITES_INIT_STATE2] = 0; break; @@ -1058,13 +1078,13 @@ static void CB2_HandleStartBattle(void) case 5: case 9: case 13: - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; gBattleCommunication[1] = 1; case 6: case 10: case 14: if (--gBattleCommunication[1] == 0) - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; break; } } @@ -1074,7 +1094,7 @@ static void PrepareOwnMultiPartnerBuffer(void) s32 i, j; u8 *nick, *cur; - for (i = 0; i < 3; ++i) + for (i = 0; i < 3; i++) { gMultiPartnerParty[i].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES); gMultiPartnerParty[i].heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); @@ -1089,7 +1109,7 @@ static void PrepareOwnMultiPartnerBuffer(void) StripExtCtrlCodes(nick); if (GetMonData(&gPlayerParty[i], MON_DATA_LANGUAGE) != LANGUAGE_JAPANESE) { - for (cur = nick, j = 0; cur[j] != EOS; ++j) + for (cur = nick, j = 0; cur[j] != EOS; j++) ; while (j < 6) cur[j++] = 0; @@ -1122,14 +1142,14 @@ static void CB2_PreInitMultiBattle(void) { PrepareOwnMultiPartnerBuffer(); SendBlock(bitmask_all_link_players_but_self(), gBattleStruct->multiBuffer.multiBattleMons, sizeof(gBattleStruct->multiBuffer.multiBattleMons)); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; } break; case 1: if ((GetBlockReceivedStatus() & r4) == r4) { ResetBlockReceivedFlags(); - for (i = 0; i < 4; ++i) + for (i = 0; i < 4; i++) { if (i == playerMultiplierId) continue; @@ -1137,7 +1157,7 @@ static void CB2_PreInitMultiBattle(void) || (gLinkPlayers[i].id & 1 && gLinkPlayers[playerMultiplierId].id & 1)) memcpy(gMultiPartnerParty, gBlockRecvBuffer[i], sizeof(gMultiPartnerParty)); } - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; *savedCallback = gMain.savedCallback; *savedBattleTypeFlags = gBattleTypeFlags; gMain.savedCallback = CB2_PreInitMultiBattle; @@ -1147,7 +1167,7 @@ static void CB2_PreInitMultiBattle(void) case 2: if (!gPaletteFade.active) { - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; if (gWirelessCommType) SetLinkStandbyCallback(); else @@ -1206,12 +1226,12 @@ static void CB2_HandleStartMultiBattle(void) if (IsLinkTaskFinished()) { // 0x201 - *(&gBattleStruct->multiBuffer.linkPartnerHeader.versionSignatureLo) = 1; - *(&gBattleStruct->multiBuffer.linkPartnerHeader.versionSignatureHi) = 2; + *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureLo) = 1; + *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureHi) = 2; BufferPartyVsScreenHealth_AtStart(); SetPlayerBerryDataInBattleStruct(); - SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.linkPartnerHeader, sizeof(gBattleStruct->multiBuffer.linkPartnerHeader)); - ++gBattleCommunication[MULTIUSE_STATE]; + SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.linkBattlerHeader, sizeof(gBattleStruct->multiBuffer.linkBattlerHeader)); + gBattleCommunication[MULTIUSE_STATE]++; } if (gWirelessCommType) CreateWirelessStatusIndicatorSprite(0, 0); @@ -1251,7 +1271,7 @@ static void CB2_HandleStartMultiBattle(void) } ZeroPlayerPartyMons(); ZeroEnemyPartyMons(); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; } else { @@ -1262,7 +1282,7 @@ static void CB2_HandleStartMultiBattle(void) if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gDecompressionBuffer, sizeof(struct Pokemon) * 2); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; } break; case 4: @@ -1318,14 +1338,14 @@ static void CB2_HandleStartMultiBattle(void) } } } - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; } break; case 7: if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gDecompressionBuffer + sizeof(struct Pokemon) * 2, sizeof(struct Pokemon)); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; } break; case 8: @@ -1393,12 +1413,12 @@ static void CB2_HandleStartMultiBattle(void) TryCorrectShedinjaLanguage(&gEnemyParty[3]); TryCorrectShedinjaLanguage(&gEnemyParty[4]); TryCorrectShedinjaLanguage(&gEnemyParty[5]); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; } break; case 11: InitBtlControllers(); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; gBattleCommunication[SPRITES_INIT_STATE1] = 0; gBattleCommunication[SPRITES_INIT_STATE2] = 0; break; @@ -1432,11 +1452,12 @@ void BattleMainCB2(void) RunTextPrinters(); UpdatePaletteFade(); RunTasks(); + if (JOY_HELD(B_BUTTON) && gBattleTypeFlags & BATTLE_TYPE_POKEDUDE) { gSpecialVar_Result = gBattleOutcome = B_OUTCOME_DREW; ResetPaletteFadeControl(); - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); SetMainCallback2(CB2_QuitPokedudeBattle); } } @@ -1525,31 +1546,35 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum) if (trainerNum == TRAINER_SECRET_BASE) return 0; + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER_TOWER))) { ZeroEnemyPartyMons(); - for (i = 0; i < gTrainers[trainerNum].partySize; ++i) + for (i = 0; i < gTrainers[trainerNum].partySize; i++) { if (gTrainers[trainerNum].doubleBattle == TRUE) personalityValue = 0x80; - else if (gTrainers[trainerNum].encounterMusic_gender & 0x80) - personalityValue = 0x78; + else if (gTrainers[trainerNum].encounterMusic_gender & F_TRAINER_FEMALE) + personalityValue = 0x78; // Use personality more likely to result in a female Pokémon else - personalityValue = 0x88; - for (j = 0; gTrainers[trainerNum].trainerName[j] != EOS; ++j) + personalityValue = 0x88; // Use personality more likely to result in a male Pokémon + + for (j = 0; gTrainers[trainerNum].trainerName[j] != EOS; j++) nameHash += gTrainers[trainerNum].trainerName[j]; + switch (gTrainers[trainerNum].partyFlags) { case 0: { const struct TrainerMonNoItemDefaultMoves *partyData = gTrainers[trainerNum].party.NoItemDefaultMoves; - for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; ++j) + for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++) 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; } @@ -1557,12 +1582,14 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum) { const struct TrainerMonNoItemCustomMoves *partyData = gTrainers[trainerNum].party.NoItemCustomMoves; - for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; ++j) + for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++) 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) + + for (j = 0; j < MAX_MON_MOVES; j++) { SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]); SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); @@ -1573,10 +1600,11 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum) { const struct TrainerMonItemDefaultMoves *partyData = gTrainers[trainerNum].party.ItemDefaultMoves; - for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; ++j) + for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++) 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); @@ -1586,13 +1614,15 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum) { const struct TrainerMonItemCustomMoves *partyData = gTrainers[trainerNum].party.ItemCustomMoves; - for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; ++j) + for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++) 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); - for (j = 0; j < MAX_MON_MOVES; ++j) + + for (j = 0; j < MAX_MON_MOVES; j++) { SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]); SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); @@ -1601,15 +1631,17 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum) } } } + gBattleTypeFlags |= gTrainers[trainerNum].doubleBattle; } + return gTrainers[trainerNum].partySize; } -// not used -UNUSED static void unused_80116CC(void) +// Unused +static void HBlankCB_Battle(void) { - if (REG_VCOUNT < 0xA0 && REG_VCOUNT >= 0x6F) + if (REG_VCOUNT < DISPLAY_HEIGHT && REG_VCOUNT >= 111) REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(24) | BGCNT_16COLOR | BGCNT_TXT256x512; } @@ -1617,6 +1649,7 @@ void VBlankCB_Battle(void) { // Change gRngSeed every vblank. Random(); + SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_X); SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_Y); SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); @@ -1637,6 +1670,7 @@ void VBlankCB_Battle(void) void SpriteCB_VsLetterDummy(struct Sprite *sprite) { + } static void SpriteCB_VsLetter(struct Sprite *sprite) @@ -1645,7 +1679,9 @@ static void SpriteCB_VsLetter(struct Sprite *sprite) sprite->x = sprite->data[1] + ((sprite->data[2] & 0xFF00) >> 8); else sprite->x = sprite->data[1] - ((sprite->data[2] & 0xFF00) >> 8); + sprite->data[2] += 0x180; + if (sprite->affineAnimEnded) { FreeSpriteTilesByTag(ANIM_SPRITES_START); @@ -1667,7 +1703,7 @@ static void BufferPartyVsScreenHealth_AtEnd(u8 taskId) struct Pokemon *party1 = NULL; struct Pokemon *party2 = NULL; u8 multiplayerId = gBattleStruct->multiplayerId; - u32 r7; + u32 flags; s32 i; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) @@ -1691,12 +1727,14 @@ static void BufferPartyVsScreenHealth_AtEnd(u8 taskId) party1 = gPlayerParty; party2 = gEnemyParty; } - r7 = 0; - BUFFER_PARTY_VS_SCREEN_STATUS(party1, r7, i); - gTasks[taskId].data[3] = r7; - r7 = 0; - BUFFER_PARTY_VS_SCREEN_STATUS(party2, r7, i); - gTasks[taskId].data[4] = r7; + + flags = 0; + BUFFER_PARTY_VS_SCREEN_STATUS(party1, flags, i); + gTasks[taskId].data[3] = flags; + + flags = 0; + BUFFER_PARTY_VS_SCREEN_STATUS(party2, flags, i); + gTasks[taskId].data[4] = flags; } void CB2_InitEndLinkBattle(void) @@ -1715,13 +1753,13 @@ void CB2_InitEndLinkBattle(void) gBattle_WIN0H = WIN_RANGE(0, 0xF0); gBattle_WIN0V = WIN_RANGE(0x50, 0x51); ScanlineEffect_Clear(); - for (i = 0; i < 80; ++i) + for (i = 0; i < 80; i++) { gScanlineEffectRegBuffers[0][i] = 0xF0; gScanlineEffectRegBuffers[1][i] = 0xF0; } - for (; i < 160; ++i) + for (; i < 160; i++) { gScanlineEffectRegBuffers[0][i] = 0xFF10; gScanlineEffectRegBuffers[1][i] = 0xFF10; @@ -1774,13 +1812,13 @@ static void EndLinkBattleInSteps(void) ShowBg(1); ShowBg(2); gBattleCommunication[1] = 0xFF; - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; break; case 1: if (--gBattleCommunication[1] == 0) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; } break; case 2: @@ -1901,7 +1939,7 @@ static void SpriteCB_Unused_8011E28_Step(struct Sprite *sprite) { sprite->invisible = FALSE; sprite->callback = SpriteCallbackDummy_2; - gUnknown_2022AE8[0] = 0; + sFlickerArray[0] = 0; } } } @@ -1916,17 +1954,20 @@ void SpriteCB_FaintOpponentMon(struct Sprite *sprite) species = gBattleSpritesDataPtr->battlerData[battler].transformSpecies; else species = sprite->sSpeciesId; + GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY); // Unused return value. + 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) unownSpecies = SPECIES_UNOWN; // Use the A Unown form. else unownSpecies = NUM_SPECIES + unownForm; // Use one of the other Unown letters. + yOffset = gMonFrontPicCoords[unownSpecies].y_offset; } else if (species == SPECIES_CASTFORM) @@ -1941,6 +1982,7 @@ void SpriteCB_FaintOpponentMon(struct Sprite *sprite) { yOffset = gMonFrontPicCoords[species].y_offset; } + sprite->data[3] = 8 - yOffset / 8; sprite->data[4] = 1; sprite->callback = SpriteCB_AnimFaintOpponent; @@ -1963,31 +2005,31 @@ static void SpriteCB_AnimFaintOpponent(struct Sprite *sprite) { u8 *dst = (u8 *)gMonSpritesGfxPtr->sprites[GetBattlerPosition(sprite->sBattler)] + (gBattleMonForms[sprite->sBattler] << 11) + (sprite->data[3] << 8); - for (i = 0; i < 0x100; ++i) + for (i = 0; i < 0x100; i++) *(dst++) = 0; StartSpriteAnim(sprite, gBattleMonForms[sprite->sBattler]); } } } -void SpriteCb_ShowAsMoveTarget(struct Sprite *sprite) +// Used when selecting a move, which can hit multiple targets, in double battles. +void SpriteCB_ShowAsMoveTarget(struct Sprite *sprite) { sprite->data[3] = 8; sprite->data[4] = sprite->invisible; - sprite->callback = SpriteCb_BlinkVisible; + sprite->callback = SpriteCB_BlinkVisible; } -static void SpriteCb_BlinkVisible(struct Sprite *sprite) +static void SpriteCB_BlinkVisible(struct Sprite *sprite) { - --sprite->data[3]; - if (sprite->data[3] == 0) + if (--sprite->data[3] == 0) { sprite->invisible ^= 1; sprite->data[3] = 8; } } -void SpriteCb_HideAsMoveTarget(struct Sprite *sprite) +void SpriteCB_HideAsMoveTarget(struct Sprite *sprite) { sprite->invisible = sprite->data[4]; sprite->data[4] = FALSE; @@ -2006,30 +2048,36 @@ static void oac_poke_ally_(struct Sprite *sprite) sprite->x2 -= 2; if (sprite->x2 == 0) { - sprite->callback = SpriteCallbackDummy3; + sprite->callback = SpriteCB_Idle; sprite->data[1] = 0; } } } -void SpriteCB_SetToDummy3(struct Sprite *sprite) +void SetIdleSpriteCallback(struct Sprite *sprite) { - sprite->callback = SpriteCallbackDummy3; + sprite->callback = SpriteCB_Idle; } -static void SpriteCallbackDummy3(struct Sprite *sprite) +static void SpriteCB_Idle(struct Sprite *sprite) { } +#define sSpeedX data[1] +#define sSpeedY data[2] + void SpriteCB_FaintSlideAnim(struct Sprite *sprite) { if (!(gIntroSlideFlags & 1)) { - sprite->x2 += sprite->data[1]; - sprite->y2 += sprite->data[2]; + sprite->x2 += sprite->sSpeedX; + sprite->y2 += sprite->sSpeedY; } } +#define sSpeedX data[1] +#define sSpeedY data[2] + #define sSinIndex data[0] #define sDelta data[1] #define sAmplitude data[2] @@ -2053,6 +2101,7 @@ void DoBounceEffect(u8 battler, u8 which, s8 delta, s8 amplitude) return; break; } + invisibleSpriteId = CreateInvisibleSpriteWithCallback(SpriteCB_BounceEffect); if (which == BOUNCE_HEALTHBOX) { @@ -2098,6 +2147,7 @@ void EndBounceEffect(u8 battler, u8 which) DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].battlerBounceSpriteId]); gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing = 0; } + gSprites[bouncerSpriteId].x2 = 0; gSprites[bouncerSpriteId].y2 = 0; } @@ -2131,7 +2181,7 @@ static void SpriteCB_PlayerThrowUpdate(struct Sprite *sprite) { UpdatePlayerPosInThrowAnim(sprite); if (sprite->animEnded) - sprite->callback = SpriteCallbackDummy3; + sprite->callback = SpriteCB_Idle; } void BattleDummy(void) @@ -2148,7 +2198,8 @@ void BeginBattleIntro(void) static void BattleMainCB1(void) { gBattleMainFunc(); - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) gBattlerControllerFuncs[gActiveBattler](); } @@ -2160,14 +2211,17 @@ static void BattleStartClearSetData(void) TurnValuesCleanUp(FALSE); SpecialStatusesClear(); - for (i = 0; i < MAX_BATTLERS_COUNT; ++i) + + for (i = 0; i < MAX_BATTLERS_COUNT; i++) { gStatuses3[i] = 0; + dataPtr = (u8 *)&gDisableStructs[i]; - for (j = 0; j < sizeof(struct DisableStruct); ++j) + for (j = 0; j < sizeof(struct DisableStruct); j++) dataPtr[j] = 0; + gDisableStructs[i].isFirstTurn = 2; - gUnknown_2023DD4[i] = 0; + sUnusedBattlersArray[i] = 0; gLastMoves[i] = MOVE_NONE; gLastLandedMoves[i] = MOVE_NONE; gLastHitByType[i] = 0; @@ -2177,31 +2231,41 @@ static void BattleStartClearSetData(void) gLastPrintedMoves[i] = MOVE_NONE; gBattleResources->flags->flags[i] = 0; } - for (i = 0; i < 2; ++i) + + for (i = 0; i < 2; i++) { gSideStatuses[i] = 0; + dataPtr = (u8 *)&gSideTimers[i]; - for (j = 0; j < sizeof(struct SideTimer); ++j) + for (j = 0; j < sizeof(struct SideTimer); j++) dataPtr[j] = 0; } + gBattlerAttacker = 0; gBattlerTarget = 0; gBattleWeather = 0; + dataPtr = (u8 *)&gWishFutureKnock; - for (i = 0; i < sizeof(struct WishFutureKnock); ++i) + for (i = 0; i < sizeof(struct WishFutureKnock); i++) dataPtr[i] = 0; + gHitMarker = 0; + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_POKEDUDE)) && gSaveBlock2Ptr->optionsBattleSceneOff) gHitMarker |= HITMARKER_NO_ANIMATIONS; + gBattleScripting.battleStyle = gSaveBlock2Ptr->optionsBattleStyle; + gMultiHitCounter = 0; gBattleOutcome = 0; gBattleControllerExecFlags = 0; gPaydayMoney = 0; gBattleResources->battleScriptsStack->size = 0; gBattleResources->battleCallbackStack->size = 0; - for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; ++i) + + for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; i++) gBattleCommunication[i] = 0; + gPauseCounterBattle = 0; gBattleMoveDamage = 0; gIntroSlideFlags = 0; @@ -2218,7 +2282,8 @@ static void BattleStartClearSetData(void) gBattleStruct->safariEscapeFactor = 2; gBattleStruct->wildVictorySong = 0; gBattleStruct->moneyMultiplier = 1; - for (i = 0; i < 8; ++i) + + for (i = 0; i < 8; i++) { *((u8 *)gBattleStruct->lastTakenMove + i) = MOVE_NONE; *((u8 *)gBattleStruct->usedHeldItems + i) = ITEM_NONE; @@ -2232,7 +2297,7 @@ static void BattleStartClearSetData(void) *(gBattleStruct->AI_monToSwitchIntoId + 0) = PARTY_SIZE; *(gBattleStruct->AI_monToSwitchIntoId + 1) = PARTY_SIZE; *(&gBattleStruct->givenExpMons) = 0; - for (i = 0; i < 11; ++i) + for (i = 0; i < 11; i++) gBattleResults.catchAttempts[i] = 0; gBattleResults.battleTurnCounter = 0; gBattleResults.playerFaintCounter = 0; @@ -2264,9 +2329,9 @@ void SwitchInClearSetData(void) if (gBattleMoves[gCurrentMove].effect != EFFECT_BATON_PASS) { - for (i = 0; i < NUM_BATTLE_STATS; ++i) - gBattleMons[gActiveBattler].statStages[i] = 6; - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < NUM_BATTLE_STATS; i++) + gBattleMons[gActiveBattler].statStages[i] = DEFAULT_STAT_STAGE; + for (i = 0; i < gBattlersCount; i++) { if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].battlerPreventingEscape == gActiveBattler) gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION; @@ -2281,14 +2346,14 @@ void SwitchInClearSetData(void) { gBattleMons[gActiveBattler].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED); gStatuses3[gActiveBattler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_MUDSPORT | STATUS3_WATERSPORT); - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (GetBattlerSide(gActiveBattler) != GetBattlerSide(i) && (gStatuses3[i] & STATUS3_ALWAYS_HITS) != 0 && (gDisableStructs[i].battlerWithSureHit == gActiveBattler)) { - gStatuses3[i] &= ~(STATUS3_ALWAYS_HITS); - gStatuses3[i] |= 0x10; + gStatuses3[i] &= ~STATUS3_ALWAYS_HITS; + gStatuses3[i] |= STATUS3_ALWAYS_HITS_TURN(2); } } } @@ -2297,18 +2362,22 @@ void SwitchInClearSetData(void) gBattleMons[gActiveBattler].status2 = 0; gStatuses3[gActiveBattler] = 0; } - for (i = 0; i < gBattlersCount; ++i) + + for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].status2 & STATUS2_INFATUATED_WITH(gActiveBattler)) - gBattleMons[i].status2 &= ~(STATUS2_INFATUATED_WITH(gActiveBattler)); + gBattleMons[i].status2 &= ~STATUS2_INFATUATED_WITH(gActiveBattler); if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && *(gBattleStruct->wrappedBy + i) == gActiveBattler) - gBattleMons[i].status2 &= ~(STATUS2_WRAPPED); + gBattleMons[i].status2 &= ~STATUS2_WRAPPED; } + gActionSelectionCursor[gActiveBattler] = 0; gMoveSelectionCursor[gActiveBattler] = 0; + ptr = (u8 *)&gDisableStructs[gActiveBattler]; - for (i = 0; i < sizeof(struct DisableStruct); ++i) + for (i = 0; i < sizeof(struct DisableStruct); i++) ptr[i] = 0; + if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) { gDisableStructs[gActiveBattler].substituteHP = disableStructCopy.substituteHP; @@ -2317,6 +2386,7 @@ void SwitchInClearSetData(void) gDisableStructs[gActiveBattler].perishSongTimerStartValue = disableStructCopy.perishSongTimerStartValue; gDisableStructs[gActiveBattler].battlerPreventingEscape = disableStructCopy.battlerPreventingEscape; } + gMoveResultFlags = 0; gDisableStructs[gActiveBattler].isFirstTurn = 2; gLastMoves[gActiveBattler] = MOVE_NONE; @@ -2325,6 +2395,7 @@ void SwitchInClearSetData(void) gLastResultingMoves[gActiveBattler] = MOVE_NONE; gLastPrintedMoves[gActiveBattler] = MOVE_NONE; gLastHitBy[gActiveBattler] = 0xFF; + *(gBattleStruct->lastTakenMove + gActiveBattler * 2 + 0) = MOVE_NONE; *(gBattleStruct->lastTakenMove + gActiveBattler * 2 + 1) = MOVE_NONE; *(0 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; @@ -2335,7 +2406,8 @@ void SwitchInClearSetData(void) *(2 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; *(3 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; *(3 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; - for (i = 0; i < gBattlersCount; ++i) + + for (i = 0; i < gBattlersCount; i++) { if (i != gActiveBattler) { @@ -2345,8 +2417,10 @@ void SwitchInClearSetData(void) *(i * 8 + gActiveBattler * 2 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; *(i * 8 + gActiveBattler * 2 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; } + *((u8 *)(&gBattleStruct->choicedMove[gActiveBattler]) + 0) = MOVE_NONE; *((u8 *)(&gBattleStruct->choicedMove[gActiveBattler]) + 1) = MOVE_NONE; + gBattleResources->flags->flags[gActiveBattler] = 0; gCurrentMove = MOVE_NONE; } @@ -2356,24 +2430,29 @@ void FaintClearSetData(void) s32 i; u8 *ptr; - for (i = 0; i < NUM_BATTLE_STATS; ++i) - gBattleMons[gActiveBattler].statStages[i] = 6; + for (i = 0; i < NUM_BATTLE_STATS; i++) + gBattleMons[gActiveBattler].statStages[i] = DEFAULT_STAT_STAGE; + gBattleMons[gActiveBattler].status2 = 0; gStatuses3[gActiveBattler] = 0; - for (i = 0; i < gBattlersCount; ++i) + + for (i = 0; i < gBattlersCount; i++) { if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].battlerPreventingEscape == gActiveBattler) gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION; if (gBattleMons[i].status2 & STATUS2_INFATUATED_WITH(gActiveBattler)) - gBattleMons[i].status2 &= ~(STATUS2_INFATUATED_WITH(gActiveBattler)); + gBattleMons[i].status2 &= ~STATUS2_INFATUATED_WITH(gActiveBattler); if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && *(gBattleStruct->wrappedBy + i) == gActiveBattler) - gBattleMons[i].status2 &= ~(STATUS2_WRAPPED); + gBattleMons[i].status2 &= ~STATUS2_WRAPPED; } + gActionSelectionCursor[gActiveBattler] = 0; gMoveSelectionCursor[gActiveBattler] = 0; + ptr = (u8 *)&gDisableStructs[gActiveBattler]; - for (i = 0; i < sizeof(struct DisableStruct); ++i) + for (i = 0; i < sizeof(struct DisableStruct); i++) ptr[i] = 0; + gProtectStructs[gActiveBattler].protected = FALSE; gProtectStructs[gActiveBattler].endured = FALSE; gProtectStructs[gActiveBattler].noValidMoves = FALSE; @@ -2385,7 +2464,7 @@ void FaintClearSetData(void) gProtectStructs[gActiveBattler].confusionSelfDmg = FALSE; gProtectStructs[gActiveBattler].targetNotAffected = FALSE; gProtectStructs[gActiveBattler].chargingTurn = FALSE; - gProtectStructs[gActiveBattler].fleeFlag = 0; + gProtectStructs[gActiveBattler].fleeType = 0; gProtectStructs[gActiveBattler].usedImprisonedMove = FALSE; gProtectStructs[gActiveBattler].loveImmobility = FALSE; gProtectStructs[gActiveBattler].usedDisabledMove = FALSE; @@ -2393,15 +2472,19 @@ void FaintClearSetData(void) gProtectStructs[gActiveBattler].flag2Unknown = FALSE; gProtectStructs[gActiveBattler].flinchImmobility = FALSE; gProtectStructs[gActiveBattler].notFirstStrike = FALSE; + gDisableStructs[gActiveBattler].isFirstTurn = 2; + gLastMoves[gActiveBattler] = MOVE_NONE; gLastLandedMoves[gActiveBattler] = MOVE_NONE; - gLastHitByType[gActiveBattler] = MOVE_NONE; + gLastHitByType[gActiveBattler] = 0; gLastResultingMoves[gActiveBattler] = MOVE_NONE; gLastPrintedMoves[gActiveBattler] = MOVE_NONE; gLastHitBy[gActiveBattler] = 0xFF; + *((u8 *)(&gBattleStruct->choicedMove[gActiveBattler]) + 0) = MOVE_NONE; *((u8 *)(&gBattleStruct->choicedMove[gActiveBattler]) + 1) = MOVE_NONE; + *(gBattleStruct->lastTakenMove + gActiveBattler * 2 + 0) = MOVE_NONE; *(gBattleStruct->lastTakenMove + gActiveBattler * 2 + 1) = MOVE_NONE; *(0 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; @@ -2412,7 +2495,8 @@ void FaintClearSetData(void) *(2 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; *(3 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; *(3 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; - for (i = 0; i < gBattlersCount; ++i) + + for (i = 0; i < gBattlersCount; i++) { if (i != gActiveBattler) { @@ -2435,12 +2519,12 @@ static void BattleIntroGetMonsData(void) gActiveBattler = gBattleCommunication[1]; BtlController_EmitGetMonData(BUFFER_A, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; break; case 1: if (gBattleControllerExecFlags == 0) { - ++gBattleCommunication[1]; + gBattleCommunication[1]++; if (gBattleCommunication[1] == gBattlersCount) gBattleMainFunc = BattleIntroPrepareBackgroundSlide; else @@ -2455,7 +2539,7 @@ static void BattleIntroPrepareBackgroundSlide(void) if (gBattleControllerExecFlags == 0) { gActiveBattler = GetBattlerAtPosition(0); - BtlController_EmitIntroSlide(0, gBattleTerrain); + BtlController_EmitIntroSlide(BUFFER_A, gBattleTerrain); MarkBattlerForControllerExec(gActiveBattler); gBattleMainFunc = BattleIntroDrawTrainersOrMonsSprites; gBattleCommunication[MULTIUSE_STATE] = 0; @@ -2468,85 +2552,90 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) u8 *ptr; s32 i; - if (gBattleControllerExecFlags == 0) - { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) - { - if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) - && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) - { - ptr = (u8 *)&gBattleMons[gActiveBattler]; - for (i = 0; i < sizeof(struct BattlePokemon); ++i) - ptr[i] = 0; - } - else - { - u16 *hpOnSwitchout; + if (gBattleControllerExecFlags) + return; - ptr = (u8 *)&gBattleMons[gActiveBattler]; - for (i = 0; i < sizeof(struct BattlePokemon); ++i) - ptr[i] = gBattleBufferB[gActiveBattler][4 + i]; - gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; - gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; - gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].abilityNum); - hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(gActiveBattler)]; - *hpOnSwitchout = gBattleMons[gActiveBattler].hp; - for (i = 0; i < NUM_BATTLE_STATS; ++i) - gBattleMons[gActiveBattler].statStages[i] = 6; - gBattleMons[gActiveBattler].status2 = 0; - } - if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) + { + if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) + && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + { + ptr = (u8 *)&gBattleMons[gActiveBattler]; + for (i = 0; i < sizeof(struct BattlePokemon); i++) + ptr[i] = 0; + } + else + { + u16 *hpOnSwitchout; + + ptr = (u8 *)&gBattleMons[gActiveBattler]; + for (i = 0; i < sizeof(struct BattlePokemon); i++) + ptr[i] = gBattleBufferB[gActiveBattler][4 + i]; + + gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; + gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; + gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].abilityNum); + hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(gActiveBattler)]; + *hpOnSwitchout = gBattleMons[gActiveBattler].hp; + for (i = 0; i < NUM_BATTLE_STATS; i++) + gBattleMons[gActiveBattler].statStages[i] = DEFAULT_STAT_STAGE; + gBattleMons[gActiveBattler].status2 = 0; + } + + if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) + { + BtlController_EmitDrawTrainerPic(BUFFER_A); + MarkBattlerForControllerExec(gActiveBattler); + } + + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) { - BtlController_EmitDrawTrainerPic(0); + BtlController_EmitDrawTrainerPic(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); } - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT + && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_POKEDUDE + | BATTLE_TYPE_LINK + | BATTLE_TYPE_GHOST + | BATTLE_TYPE_OLD_MAN_TUTORIAL + | BATTLE_TYPE_LEGENDARY))) { - if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) - { - BtlController_EmitDrawTrainerPic(0); - MarkBattlerForControllerExec(gActiveBattler); - } - if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT - && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_POKEDUDE - | BATTLE_TYPE_LINK - | BATTLE_TYPE_GHOST - | BATTLE_TYPE_OLD_MAN_TUTORIAL - | BATTLE_TYPE_LEGENDARY))) - HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); + HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); } - else + } + else + { + if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) { - if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) + if (gBattleTypeFlags & (BATTLE_TYPE_GHOST | BATTLE_TYPE_GHOST_UNVEILED)) { - if (gBattleTypeFlags & (BATTLE_TYPE_GHOST | BATTLE_TYPE_GHOST_UNVEILED)) - { - if (!IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags)) - HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); - } - else if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_POKEDUDE - | BATTLE_TYPE_LINK - | BATTLE_TYPE_GHOST - | BATTLE_TYPE_OLD_MAN_TUTORIAL - | BATTLE_TYPE_LEGENDARY))) - { + if (!IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags)) HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); - } - BtlController_EmitLoadMonSprite(0); - MarkBattlerForControllerExec(gActiveBattler); } - } - if (gBattleTypeFlags & BATTLE_TYPE_MULTI - && (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT || GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT)) - { - BtlController_EmitDrawTrainerPic(0); + else if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_POKEDUDE + | BATTLE_TYPE_LINK + | BATTLE_TYPE_GHOST + | BATTLE_TYPE_OLD_MAN_TUTORIAL + | BATTLE_TYPE_LEGENDARY))) + { + HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); + } + BtlController_EmitLoadMonSprite(0); MarkBattlerForControllerExec(gActiveBattler); } } - gBattleMainFunc = BattleIntroDrawPartySummaryScreens; + if (gBattleTypeFlags & BATTLE_TYPE_MULTI + && (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT || GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT)) + { + BtlController_EmitDrawTrainerPic(BUFFER_A); + MarkBattlerForControllerExec(gActiveBattler); + } } + gBattleMainFunc = BattleIntroDrawPartySummaryScreens; } static void BattleIntroDrawPartySummaryScreens(void) @@ -2554,68 +2643,71 @@ static void BattleIntroDrawPartySummaryScreens(void) s32 i; struct HpAndStatus hpStatus[PARTY_SIZE]; - if (gBattleControllerExecFlags == 0) - { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - for (i = 0; i < PARTY_SIZE; ++i) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE - || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) - { - hpStatus[i].hp = 0xFFFF; - hpStatus[i].status = 0; - } - else - { - hpStatus[i].hp = GetMonData(&gEnemyParty[i], MON_DATA_HP); - hpStatus[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS); - } - } - gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - BtlController_EmitDrawPartyStatusSummary(0, hpStatus, 0x80); - MarkBattlerForControllerExec(gActiveBattler); - for (i = 0; i < PARTY_SIZE; ++i) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_NONE - || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) - { - hpStatus[i].hp = 0xFFFF; - hpStatus[i].status = 0; - } - else - { - hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); - } - } - gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - BtlController_EmitDrawPartyStatusSummary(0, hpStatus, 0x80); - MarkBattlerForControllerExec(gActiveBattler); + if (gBattleControllerExecFlags) + return; - gBattleMainFunc = BattleIntroPrintTrainerWantsToBattle; - } - else + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + for (i = 0; i < PARTY_SIZE; i++) { - // The struct gets set here, but nothing is ever done with it since - // wild battles don't show the party summary. - // Still, there's no point in having dead code. - for (i = 0; i < PARTY_SIZE; ++i) + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE + || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_NONE - || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) - { - hpStatus[i].hp = 0xFFFF; - hpStatus[i].status = 0; - } - else - { - hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); - } + hpStatus[i].hp = HP_EMPTY_SLOT; + hpStatus[i].status = 0; + } + else + { + hpStatus[i].hp = GetMonData(&gEnemyParty[i], MON_DATA_HP); + hpStatus[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS); } - gBattleMainFunc = BattleIntroPrintWildMonAttacked; } + gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + BtlController_EmitDrawPartyStatusSummary(BUFFER_A, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); + MarkBattlerForControllerExec(gActiveBattler); + + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_NONE + || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) + { + hpStatus[i].hp = HP_EMPTY_SLOT; + hpStatus[i].status = 0; + } + else + { + hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); + hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); + } + } + gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + BtlController_EmitDrawPartyStatusSummary(BUFFER_A, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); + MarkBattlerForControllerExec(gActiveBattler); + + gBattleMainFunc = BattleIntroPrintTrainerWantsToBattle; + } + else + { + // The struct gets set here, but nothing is ever done with it since + // wild battles don't show the party summary. + // Still, there's no point in having dead code. + + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_NONE + || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) + { + hpStatus[i].hp = HP_EMPTY_SLOT; + hpStatus[i].status = 0; + } + else + { + hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); + hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); + } + } + + gBattleMainFunc = BattleIntroPrintWildMonAttacked; } } @@ -2656,7 +2748,7 @@ static void BattleIntroOpponentSendsOutMonAnimation(void) { if (gBattleControllerExecFlags == 0) { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) { @@ -2677,7 +2769,7 @@ static void BattleIntroRecordMonsToDex(void) { if (gBattleControllerExecFlags == 0) { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_POKEDUDE @@ -2697,7 +2789,7 @@ static void Unused_AutoProgressToIntro(void) gBattleMainFunc = BattleIntroPrintPlayerSendsOut; } -void BattleIntroPrintPlayerSendsOut(void) +static void BattleIntroPrintPlayerSendsOut(void) { if (gBattleControllerExecFlags == 0) { @@ -2711,34 +2803,35 @@ static void BattleIntroPlayerSendsOutMonAnimation(void) { u32 position; - if (gBattleControllerExecFlags == 0) + if (gBattleControllerExecFlags) + return; + + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) { - if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) - { - BtlController_EmitIntroTrainerBallThrow(0); - MarkBattlerForControllerExec(gActiveBattler); - } - if (gBattleTypeFlags & BATTLE_TYPE_MULTI && GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT) - { - BtlController_EmitIntroTrainerBallThrow(0); - MarkBattlerForControllerExec(gActiveBattler); - } + BtlController_EmitIntroTrainerBallThrow(0); + MarkBattlerForControllerExec(gActiveBattler); + } + if (gBattleTypeFlags & BATTLE_TYPE_MULTI && GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT) + { + BtlController_EmitIntroTrainerBallThrow(0); + MarkBattlerForControllerExec(gActiveBattler); } - gBattleStruct->switchInAbilitiesCounter = 0; - gBattleStruct->switchInItemsCounter = 0; - gBattleStruct->overworldWeatherDone = FALSE; - gBattleMainFunc = TryDoEventsBeforeFirstTurn; } + gBattleStruct->switchInAbilitiesCounter = 0; + gBattleStruct->switchInItemsCounter = 0; + gBattleStruct->overworldWeatherDone = FALSE; + + gBattleMainFunc = TryDoEventsBeforeFirstTurn; } -// not used -static void Unused_AutoProgressToSwitchInAnims(void) +// Unused +static void BattleIntroSwitchInPlayerMons(void) { if (gBattleControllerExecFlags == 0) { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { @@ -2746,9 +2839,11 @@ static void Unused_AutoProgressToSwitchInAnims(void) MarkBattlerForControllerExec(gActiveBattler); } } + gBattleStruct->switchInAbilitiesCounter = 0; gBattleStruct->switchInItemsCounter = 0; gBattleStruct->overworldWeatherDone = FALSE; + gBattleMainFunc = TryDoEventsBeforeFirstTurn; } } @@ -2758,73 +2853,72 @@ static void TryDoEventsBeforeFirstTurn(void) s32 i, j; u8 effect = 0; - if (gBattleControllerExecFlags == 0) - { + if (gBattleControllerExecFlags) + return; - if (gBattleStruct->switchInAbilitiesCounter == 0) - { - for (i = 0; i < gBattlersCount; ++i) - gBattlerByTurnOrder[i] = i; - for (i = 0; i < gBattlersCount - 1; ++i) - for (j = i + 1; j < gBattlersCount; ++j) - if (GetWhoStrikesFirst(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], TRUE) != 0) - SwapTurnOrder(i, j); - } - if (!gBattleStruct->overworldWeatherDone - && AbilityBattleEffects(0, 0, 0, ABILITYEFFECT_SWITCH_IN_WEATHER, 0) != 0) - { - gBattleStruct->overworldWeatherDone = TRUE; - return; - } - // Check all switch in abilities happening from the fastest mon to slowest. - while (gBattleStruct->switchInAbilitiesCounter < gBattlersCount) - { - if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gBattlerByTurnOrder[gBattleStruct->switchInAbilitiesCounter], 0, 0, 0) != 0) - ++effect; - ++gBattleStruct->switchInAbilitiesCounter; - if (effect) - return; - } - if (AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE1, 0, 0, 0, 0) != 0) - return; - if (AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0) != 0) - return; - // Check all switch in items having effect from the fastest mon to slowest. - while (gBattleStruct->switchInItemsCounter < gBattlersCount) - { - if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gBattlerByTurnOrder[gBattleStruct->switchInItemsCounter], FALSE)) - ++effect; - ++gBattleStruct->switchInItemsCounter; - if (effect) - return; - } - for (i = 0; i < gBattlersCount; ++i) // pointless, ruby leftover - ; - for (i = 0; i < MAX_BATTLERS_COUNT; ++i) - { - *(gBattleStruct->monToSwitchIntoId + i) = PARTY_SIZE; - gChosenActionByBattler[i] = B_ACTION_NONE; - gChosenMoveByBattler[i] = MOVE_NONE; - } - TurnValuesCleanUp(FALSE); - SpecialStatusesClear(); - *(&gBattleStruct->absentBattlerFlags) = gAbsentBattlerFlags; - gBattleMainFunc = HandleTurnActionSelectionState; - ResetSentPokesToOpponentValue(); - for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; ++i) - gBattleCommunication[i] = 0; - for (i = 0; i < gBattlersCount; ++i) - gBattleMons[i].status2 &= ~(STATUS2_FLINCHED); - *(&gBattleStruct->turnEffectsTracker) = 0; - *(&gBattleStruct->turnEffectsBattlerId) = 0; - *(&gBattleStruct->wishPerishSongState) = 0; - *(&gBattleStruct->wishPerishSongBattlerId) = 0; - gBattleScripting.moveendState = 0; - gBattleStruct->faintedActionsState = 0; - gBattleStruct->turnCountersTracker = 0; - gMoveResultFlags = 0; - gRandomTurnNumber = Random(); + if (gBattleStruct->switchInAbilitiesCounter == 0) + { + for (i = 0; i < gBattlersCount; i++) + gBattlerByTurnOrder[i] = i; + for (i = 0; i < gBattlersCount - 1; i++) + for (j = i + 1; j < gBattlersCount; j++) + if (GetWhoStrikesFirst(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], TRUE) != 0) + SwapTurnOrder(i, j); } + if (!gBattleStruct->overworldWeatherDone + && AbilityBattleEffects(0, 0, 0, ABILITYEFFECT_SWITCH_IN_WEATHER, 0) != 0) + { + gBattleStruct->overworldWeatherDone = TRUE; + return; + } + // Check all switch in abilities happening from the fastest mon to slowest. + while (gBattleStruct->switchInAbilitiesCounter < gBattlersCount) + { + if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gBattlerByTurnOrder[gBattleStruct->switchInAbilitiesCounter], 0, 0, 0) != 0) + effect++; + ++gBattleStruct->switchInAbilitiesCounter; + if (effect != 0) + return; + } + if (AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE1, 0, 0, 0, 0) != 0) + return; + if (AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0) != 0) + return; + // Check all switch in items having effect from the fastest mon to slowest. + while (gBattleStruct->switchInItemsCounter < gBattlersCount) + { + if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gBattlerByTurnOrder[gBattleStruct->switchInItemsCounter], FALSE)) + effect++; + ++gBattleStruct->switchInItemsCounter; + if (effect != 0) + return; + } + for (i = 0; i < gBattlersCount; i++) // pointless, ruby leftover + ; + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + *(gBattleStruct->monToSwitchIntoId + i) = PARTY_SIZE; + gChosenActionByBattler[i] = B_ACTION_NONE; + gChosenMoveByBattler[i] = MOVE_NONE; + } + TurnValuesCleanUp(FALSE); + SpecialStatusesClear(); + *(&gBattleStruct->absentBattlerFlags) = gAbsentBattlerFlags; + gBattleMainFunc = HandleTurnActionSelectionState; + ResetSentPokesToOpponentValue(); + for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; i++) + gBattleCommunication[i] = 0; + for (i = 0; i < gBattlersCount; i++) + gBattleMons[i].status2 &= ~(STATUS2_FLINCHED); + *(&gBattleStruct->turnEffectsTracker) = 0; + *(&gBattleStruct->turnEffectsBattlerId) = 0; + *(&gBattleStruct->wishPerishSongState) = 0; + *(&gBattleStruct->wishPerishSongBattlerId) = 0; + gBattleScripting.moveendState = 0; + gBattleStruct->faintedActionsState = 0; + gBattleStruct->turnCountersTracker = 0; + gMoveResultFlags = 0; + gRandomTurnNumber = Random(); } static void HandleEndTurn_ContinueBattle(void) @@ -2834,9 +2928,9 @@ static void HandleEndTurn_ContinueBattle(void) if (gBattleControllerExecFlags == 0) { gBattleMainFunc = BattleTurnPassed; - for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; ++i) + for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; i++) gBattleCommunication[i] = 0; - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { gBattleMons[i].status2 &= ~(STATUS2_FLINCHED); if ((gBattleMons[i].status1 & STATUS1_SLEEP) && (gBattleMons[i].status2 & STATUS2_MULTIPLETURNS)) @@ -2878,7 +2972,7 @@ void BattleTurnPassed(void) gBattleScripting.moveendState = 0; gBattleMoveDamage = 0; gMoveResultFlags = 0; - for (i = 0; i < 5; ++i) + for (i = 0; i < 5; i++) gBattleCommunication[i] = 0; if (gBattleOutcome != 0) { @@ -2888,12 +2982,12 @@ void BattleTurnPassed(void) } if (gBattleResults.battleTurnCounter < 0xFF) ++gBattleResults.battleTurnCounter; - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { gChosenActionByBattler[i] = B_ACTION_NONE; gChosenMoveByBattler[i] = MOVE_NONE; } - for (i = 0; i < MAX_BATTLERS_COUNT; ++i) + for (i = 0; i < MAX_BATTLERS_COUNT; i++) *(gBattleStruct->monToSwitchIntoId + i) = PARTY_SIZE; *(&gBattleStruct->absentBattlerFlags) = gAbsentBattlerFlags; gBattleMainFunc = HandleTurnActionSelectionState; @@ -2916,7 +3010,7 @@ u8 IsRunningFromBattleImpossible(void) || gBattleMons[gActiveBattler].ability == ABILITY_RUN_AWAY) return BATTLE_RUN_SUCCESS; side = GetBattlerSide(gActiveBattler); - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (side != GetBattlerSide(i) && gBattleMons[i].ability == ABILITY_SHADOW_TAG) @@ -2964,14 +3058,14 @@ void UpdatePartyOwnerOnSwitch_NonMulti(u8 battler) s32 i; u8 r4, r1; - for (i = 0; i < 3; ++i) + for (i = 0; i < 3; i++) gBattlePartyCurrentOrder[i] = *(battler * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders)); r4 = GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[battler]); r1 = GetPartyIdFromBattlePartyId(*(gBattleStruct->monToSwitchIntoId + battler)); SwitchPartyMonSlots(r4, r1); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - for (i = 0; i < 3; ++i) + for (i = 0; i < 3; i++) { *(battler * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders)) = gBattlePartyCurrentOrder[i]; *(BATTLE_PARTNER(battler) * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders)) = gBattlePartyCurrentOrder[i]; @@ -2979,7 +3073,7 @@ void UpdatePartyOwnerOnSwitch_NonMulti(u8 battler) } else { - for (i = 0; i < 3; ++i) + for (i = 0; i < 3; i++) *(battler * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders)) = gBattlePartyCurrentOrder[i]; } } @@ -3000,7 +3094,7 @@ static void HandleTurnActionSelectionState(void) s32 i; gBattleCommunication[ACTIONS_CONFIRMED_COUNT] = 0; - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { u8 position = GetBattlerPosition(gActiveBattler); @@ -3033,7 +3127,7 @@ static void HandleTurnActionSelectionState(void) { BtlController_EmitChooseAction(0, gChosenActionByBattler[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8)); MarkBattlerForControllerExec(gActiveBattler); - ++gBattleCommunication[gActiveBattler]; + gBattleCommunication[gActiveBattler]++; } } } @@ -3067,7 +3161,7 @@ static void HandleTurnActionSelectionState(void) moveInfo.species = gBattleMons[gActiveBattler].species; moveInfo.monType1 = gBattleMons[gActiveBattler].type1; moveInfo.monType2 = gBattleMons[gActiveBattler].type2; - for (i = 0; i < MAX_MON_MOVES; ++i) + for (i = 0; i < MAX_MON_MOVES; i++) { moveInfo.moves[i] = gBattleMons[gActiveBattler].moves[i]; moveInfo.currentPp[i] = gBattleMons[gActiveBattler].pp[i]; @@ -3155,7 +3249,7 @@ static void HandleTurnActionSelectionState(void) } else { - ++gBattleCommunication[gActiveBattler]; + gBattleCommunication[gActiveBattler]++; } } break; @@ -3188,7 +3282,7 @@ static void HandleTurnActionSelectionState(void) *(gBattleStruct->chosenMovePositions + gActiveBattler) = gBattleBufferB[gActiveBattler][2]; gChosenMoveByBattler[gActiveBattler] = gBattleMons[gActiveBattler].moves[*(gBattleStruct->chosenMovePositions + gActiveBattler)]; *(gBattleStruct->moveTarget + gActiveBattler) = gBattleBufferB[gActiveBattler][3]; - ++gBattleCommunication[gActiveBattler]; + gBattleCommunication[gActiveBattler]++; } break; } @@ -3201,7 +3295,7 @@ static void HandleTurnActionSelectionState(void) else { gLastUsedItem = (gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8)); - ++gBattleCommunication[gActiveBattler]; + gBattleCommunication[gActiveBattler]++; } break; case B_ACTION_SWITCH: @@ -3221,29 +3315,29 @@ static void HandleTurnActionSelectionState(void) *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4; *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 2) = gBattleBufferB[gActiveBattler][3]; } - ++gBattleCommunication[gActiveBattler]; + gBattleCommunication[gActiveBattler]++; } break; case B_ACTION_RUN: gHitMarker |= HITMARKER_RUN; - ++gBattleCommunication[gActiveBattler]; + gBattleCommunication[gActiveBattler]++; break; case B_ACTION_SAFARI_WATCH_CAREFULLY: - ++gBattleCommunication[gActiveBattler]; + gBattleCommunication[gActiveBattler]++; break; case B_ACTION_SAFARI_BALL: - ++gBattleCommunication[gActiveBattler]; + gBattleCommunication[gActiveBattler]++; break; case B_ACTION_SAFARI_BAIT: case B_ACTION_SAFARI_GO_NEAR: - ++gBattleCommunication[gActiveBattler]; + gBattleCommunication[gActiveBattler]++; break; case B_ACTION_SAFARI_RUN: gHitMarker |= HITMARKER_RUN; - ++gBattleCommunication[gActiveBattler]; + gBattleCommunication[gActiveBattler]++; break; case B_ACTION_OLDMAN_THROW: - ++gBattleCommunication[gActiveBattler]; + gBattleCommunication[gActiveBattler]++; break; } } @@ -3258,7 +3352,7 @@ static void HandleTurnActionSelectionState(void) else BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_STOP_BOUNCE_ONLY); MarkBattlerForControllerExec(gActiveBattler); - ++gBattleCommunication[gActiveBattler]; + gBattleCommunication[gActiveBattler]++; } break; case STATE_WAIT_ACTION_CONFIRMED: @@ -3310,12 +3404,12 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) if (WEATHER_HAS_EFFECT) { if ((gBattleMons[battler1].ability == ABILITY_SWIFT_SWIM && gBattleWeather & B_WEATHER_RAIN) - || (gBattleMons[battler1].ability == ABILITY_CHLOROPHYLL && gBattleWeather & B_WEATHER_SUN)) + || (gBattleMons[battler1].ability == ABILITY_CHLOROPHYLL && gBattleWeather & B_WEATHER_SUN)) speedMultiplierBattler1 = 2; else speedMultiplierBattler1 = 1; if ((gBattleMons[battler2].ability == ABILITY_SWIFT_SWIM && gBattleWeather & B_WEATHER_RAIN) - || (gBattleMons[battler2].ability == ABILITY_CHLOROPHYLL && gBattleWeather & B_WEATHER_SUN)) + || (gBattleMons[battler2].ability == ABILITY_CHLOROPHYLL && gBattleWeather & B_WEATHER_SUN)) speedMultiplierBattler2 = 2; else speedMultiplierBattler2 = 1; @@ -3325,9 +3419,11 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) speedMultiplierBattler1 = 1; speedMultiplierBattler2 = 1; } + speedBattler1 = (gBattleMons[battler1].speed * speedMultiplierBattler1) - * (gStatStageRatios[gBattleMons[battler1].statStages[STAT_SPEED]][0]) - / (gStatStageRatios[gBattleMons[battler1].statStages[STAT_SPEED]][1]); + * (gStatStageRatios[gBattleMons[battler1].statStages[STAT_SPEED]][0]) + / (gStatStageRatios[gBattleMons[battler1].statStages[STAT_SPEED]][1]); + if (gBattleMons[battler1].item == ITEM_ENIGMA_BERRY) { holdEffect = gEnigmaBerries[battler1].holdEffect; @@ -3435,18 +3531,18 @@ static void SetActionsAndBattlersTurnOrder(void) if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler]; gBattlerByTurnOrder[turnOrderId] = gActiveBattler; - ++turnOrderId; + turnOrderId++; } } else { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (gChosenActionByBattler[gActiveBattler] == B_ACTION_RUN) { @@ -3465,13 +3561,13 @@ static void SetActionsAndBattlersTurnOrder(void) gActionsByTurnOrder[0] = gChosenActionByBattler[gActiveBattler]; gBattlerByTurnOrder[0] = gActiveBattler; turnOrderId = 1; - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (i != gActiveBattler) { gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[i]; gBattlerByTurnOrder[turnOrderId] = i; - ++turnOrderId; + turnOrderId++; } } gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; @@ -3480,27 +3576,27 @@ static void SetActionsAndBattlersTurnOrder(void) } else { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (gChosenActionByBattler[gActiveBattler] == B_ACTION_USE_ITEM || gChosenActionByBattler[gActiveBattler] == B_ACTION_SWITCH) { gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler]; gBattlerByTurnOrder[turnOrderId] = gActiveBattler; - ++turnOrderId; + turnOrderId++; } } - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (gChosenActionByBattler[gActiveBattler] != B_ACTION_USE_ITEM && gChosenActionByBattler[gActiveBattler] != B_ACTION_SWITCH) { gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler]; gBattlerByTurnOrder[turnOrderId] = gActiveBattler; - ++turnOrderId; + turnOrderId++; } } - for (i = 0; i < gBattlersCount - 1; ++i) + for (i = 0; i < gBattlersCount - 1; i++) { - for (j = i + 1; j < gBattlersCount; ++j) + for (j = i + 1; j < gBattlersCount; j++) { u8 battler1 = gBattlerByTurnOrder[i]; u8 battler2 = gBattlerByTurnOrder[j]; @@ -3524,7 +3620,7 @@ static void TurnValuesCleanUp(bool8 var0) s32 i; u8 *dataPtr; - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (var0) { @@ -3534,7 +3630,7 @@ static void TurnValuesCleanUp(bool8 var0) else { dataPtr = (u8 *)(&gProtectStructs[gActiveBattler]); - for (i = 0; i < sizeof(struct ProtectStruct); ++i) + for (i = 0; i < sizeof(struct ProtectStruct); i++) dataPtr[i] = 0; if (gDisableStructs[gActiveBattler].isFirstTurn) --gDisableStructs[gActiveBattler].isFirstTurn; @@ -3555,12 +3651,12 @@ static void TurnValuesCleanUp(bool8 var0) static void SpecialStatusesClear(void) { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { s32 i; u8 *dataPtr = (u8 *)(&gSpecialStatuses[gActiveBattler]); - for (i = 0; i < sizeof(struct SpecialStatus); ++i) + for (i = 0; i < sizeof(struct SpecialStatus); i++) dataPtr[i] = 0; } } @@ -3697,7 +3793,7 @@ static void HandleEndTurn_BattleLost(void) static void HandleEndTurn_RanFromBattle(void) { gCurrentActionFuncId = 0; - switch (gProtectStructs[gBattlerAttacker].fleeFlag) + switch (gProtectStructs[gBattlerAttacker].fleeType) { default: gBattlescriptCurrInstr = BattleScript_GotAwaySafely; @@ -3726,7 +3822,7 @@ static void HandleEndTurn_FinishBattle(void) { if (!(gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_SAFARI | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_LINK))) { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { @@ -3782,7 +3878,7 @@ static void TryEvolvePokemon(void) while (gLeveledUpInBattle != 0) { - for (i = 0; i < PARTY_SIZE; ++i) + for (i = 0; i < PARTY_SIZE; i++) { if (gLeveledUpInBattle & gBitTable[i]) { @@ -3791,6 +3887,7 @@ static void TryEvolvePokemon(void) levelUpBits &= ~(gBitTable[i]); gLeveledUpInBattle = levelUpBits; + species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_NORMAL, levelUpBits); if (species != SPECIES_NONE) { @@ -3842,7 +3939,7 @@ void RunBattleScriptCommands_PopCallbacksStack(void) if (gCurrentActionFuncId == B_ACTION_TRY_FINISH || gCurrentActionFuncId == B_ACTION_FINISHED) { if (gBattleResources->battleCallbackStack->size != 0) - --gBattleResources->battleCallbackStack->size; + gBattleResources->battleCallbackStack->size--; gBattleMainFunc = gBattleResources->battleCallbackStack->function[gBattleResources->battleCallbackStack->size]; } else @@ -3882,7 +3979,7 @@ static void HandleAction_UseMove(void) gProtectStructs[gBattlerAttacker].noValidMoves = 0; gCurrentMove = gChosenMove = MOVE_STRUGGLE; gHitMarker |= HITMARKER_NO_PPDEDUCT; - *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(MOVE_STRUGGLE, 0); + *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(MOVE_STRUGGLE, NO_TARGET_OVERRIDE); } else if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS || gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE) { @@ -3894,7 +3991,7 @@ static void HandleAction_UseMove(void) { gCurrentMove = gChosenMove = gDisableStructs[gBattlerAttacker].encoredMove; gCurrMovePos = gChosenMovePos = gDisableStructs[gBattlerAttacker].encoredMovePos; - *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, 0); + *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); } // check if the encored move wasn't overwritten else if (gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE @@ -3905,12 +4002,12 @@ static void HandleAction_UseMove(void) gDisableStructs[gBattlerAttacker].encoredMove = MOVE_NONE; gDisableStructs[gBattlerAttacker].encoredMovePos = 0; gDisableStructs[gBattlerAttacker].encoreTimer = 0; - *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, 0); + *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); } else if (gBattleMons[gBattlerAttacker].moves[gCurrMovePos] != gChosenMoveByBattler[gBattlerAttacker]) { gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; - *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, 0); + *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); } else { @@ -3937,7 +4034,7 @@ static void HandleAction_UseMove(void) && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) { side = GetBattlerSide(gBattlerAttacker); - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) if (side != GetBattlerSide(gActiveBattler) && *(gBattleStruct->moveTarget + gBattlerAttacker) != gActiveBattler && gBattleMons[gActiveBattler].ability == ABILITY_LIGHTNING_ROD @@ -4138,19 +4235,19 @@ bool8 TryRunFromBattle(u8 battler) if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN) { gLastUsedItem = gBattleMons[battler].item; - gProtectStructs[battler].fleeFlag = 1; - ++effect; + gProtectStructs[battler].fleeType = FLEE_ITEM; + effect++; } else if (gBattleMons[battler].ability == ABILITY_RUN_AWAY) { gLastUsedAbility = ABILITY_RUN_AWAY; - gProtectStructs[battler].fleeFlag = 2; - ++effect; + gProtectStructs[battler].fleeType = FLEE_ABILITY; + effect++; } else if (IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags)) { if (GetBattlerSide(battler) == B_SIDE_PLAYER) - ++effect; + effect++; } else { @@ -4160,17 +4257,17 @@ bool8 TryRunFromBattle(u8 battler) { speedVar = (gBattleMons[battler].speed * 128) / (gBattleMons[BATTLE_OPPOSITE(battler)].speed) + (gBattleStruct->runTries * 30); if (speedVar > (Random() & 0xFF)) - ++effect; + effect++; } else // same speed or faster { - ++effect; + effect++; } } ++gBattleStruct->runTries; } - if (effect) + if (effect != 0) { gCurrentTurnActionNumber = gBattlersCount; gBattleOutcome = B_OUTCOME_RAN; @@ -4185,7 +4282,7 @@ static void HandleAction_Run(void) if (gBattleTypeFlags & BATTLE_TYPE_LINK) { gCurrentTurnActionNumber = gBattlersCount; - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { diff --git a/src/battle_util.c b/src/battle_util.c index 383a8fc0e..bad9457a2 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -27,16 +27,17 @@ #include "constants/battle_move_effects.h" #include "constants/battle_script_commands.h" +#define SOUND_MOVES_END 0xFFFF + static const u16 sSoundMovesTable[] = { MOVE_GROWL, MOVE_ROAR, MOVE_SING, MOVE_SUPERSONIC, MOVE_SCREECH, MOVE_SNORE, - MOVE_UPROAR, MOVE_METAL_SOUND, MOVE_GRASS_WHISTLE, MOVE_HYPER_VOICE, 0xFFFF + MOVE_UPROAR, MOVE_METAL_SOUND, MOVE_GRASS_WHISTLE, MOVE_HYPER_VOICE, SOUND_MOVES_END }; u8 GetBattlerForBattleScript(u8 caseId) { - u32 ret = 0; - + u8 ret = 0; switch (caseId) { case BS_TARGET: @@ -57,7 +58,7 @@ u8 GetBattlerForBattleScript(u8 caseId) case BS_FAINTED: ret = gBattlerFainted; break; - case 5: + case BS_FAINTED_LINK_MULTIPLE_1: ret = gBattlerFainted; break; case BS_PLAYER1: @@ -66,10 +67,10 @@ u8 GetBattlerForBattleScript(u8 caseId) case BS_OPPONENT1: ret = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); break; - case 4: - case 6: - case 8: - case 9: + case BS_ATTACKER_WITH_PARTNER: + case BS_FAINTED_LINK_MULTIPLE_2: + case BS_ATTACKER_SIDE: + case BS_NOT_ATTACKER_SIDE: break; } return ret; @@ -77,99 +78,115 @@ u8 GetBattlerForBattleScript(u8 caseId) void PressurePPLose(u8 target, u8 attacker, u16 move) { - s32 i; + int moveIndex; - if (gBattleMons[target].ability == ABILITY_PRESSURE) + if (gBattleMons[target].ability != ABILITY_PRESSURE) + return; + + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - for (i = 0; i < MAX_MON_MOVES && gBattleMons[attacker].moves[i] != move; ++i); - if (i != MAX_MON_MOVES) - { - if (gBattleMons[attacker].pp[i]) - --gBattleMons[attacker].pp[i]; - if (!(gBattleMons[attacker].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[attacker].mimickedMoves & gBitTable[i])) - { - gActiveBattler = attacker; - BtlController_EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBattler].pp[i]); - MarkBattlerForControllerExec(gActiveBattler); - } - } + if (gBattleMons[attacker].moves[moveIndex] == move) + break; + } + + if (moveIndex == MAX_MON_MOVES) + return; + + if (gBattleMons[attacker].pp[moveIndex] != 0) + gBattleMons[attacker].pp[moveIndex]--; + + if (MOVE_IS_PERMANENT(attacker, moveIndex)) + { + gActiveBattler = attacker; + BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + moveIndex, 0, 1, &gBattleMons[gActiveBattler].pp[moveIndex]); + MarkBattlerForControllerExec(gActiveBattler); } } void PressurePPLoseOnUsingImprison(u8 attacker) { - s32 i, j; - s32 imprisonPos = 4; + int i, j; + int imprisonPos = MAX_MON_MOVES; u8 atkSide = GetBattlerSide(attacker); - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (atkSide != GetBattlerSide(i) && gBattleMons[i].ability == ABILITY_PRESSURE) { - for (j = 0; j < MAX_MON_MOVES && gBattleMons[attacker].moves[j] != MOVE_IMPRISON; ++j); + for (j = 0; j < MAX_MON_MOVES; j++) + { + if (gBattleMons[attacker].moves[j] == MOVE_IMPRISON) + break; + } if (j != MAX_MON_MOVES) { imprisonPos = j; - if (gBattleMons[attacker].pp[j]) - --gBattleMons[attacker].pp[j]; + if (gBattleMons[attacker].pp[j] != 0) + gBattleMons[attacker].pp[j]--; } } } - if (imprisonPos != 4 - && !(gBattleMons[attacker].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[attacker].mimickedMoves & gBitTable[imprisonPos])) + + if (imprisonPos != MAX_MON_MOVES && MOVE_IS_PERMANENT(attacker, imprisonPos)) { gActiveBattler = attacker; - BtlController_EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + imprisonPos, 0, 1, &gBattleMons[gActiveBattler].pp[imprisonPos]); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + imprisonPos, 0, 1, &gBattleMons[gActiveBattler].pp[imprisonPos]); MarkBattlerForControllerExec(gActiveBattler); } } void PressurePPLoseOnUsingPerishSong(u8 attacker) { - s32 i, j; - s32 perishSongPos = 4; + int i, j; + int perishSongPos = MAX_MON_MOVES; - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ABILITY_PRESSURE && i != attacker) { - for (j = 0; j < MAX_MON_MOVES && gBattleMons[attacker].moves[j] != MOVE_PERISH_SONG; ++j); + for (j = 0; j < MAX_MON_MOVES; j++) + { + if (gBattleMons[attacker].moves[j] == MOVE_PERISH_SONG) + break; + } if (j != MAX_MON_MOVES) { perishSongPos = j; - if (gBattleMons[attacker].pp[j]) - --gBattleMons[attacker].pp[j]; + if (gBattleMons[attacker].pp[j] != 0) + gBattleMons[attacker].pp[j]--; } } } - if (perishSongPos != MAX_MON_MOVES - && !(gBattleMons[attacker].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[attacker].mimickedMoves & gBitTable[perishSongPos])) + + if (perishSongPos != MAX_MON_MOVES && MOVE_IS_PERMANENT(attacker, perishSongPos)) { gActiveBattler = attacker; - BtlController_EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + perishSongPos, 0, 1, &gBattleMons[gActiveBattler].pp[perishSongPos]); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + perishSongPos, 0, 1, &gBattleMons[gActiveBattler].pp[perishSongPos]); MarkBattlerForControllerExec(gActiveBattler); } } -void MarkAllBattlersForControllerExec(void) +// Unused +static void MarkAllBattlersForControllerExec(void) { - s32 i; + int i; if (gBattleTypeFlags & BATTLE_TYPE_LINK) - for (i = 0; i < gBattlersCount; ++i) - gBattleControllerExecFlags |= gBitTable[i] << 0x1C; + { + for (i = 0; i < gBattlersCount; i++) + gBattleControllerExecFlags |= gBitTable[i] << (32 - MAX_BATTLERS_COUNT); + } else - for (i = 0; i < gBattlersCount; ++i) + { + for (i = 0; i < gBattlersCount; i++) gBattleControllerExecFlags |= gBitTable[i]; + } } void MarkBattlerForControllerExec(u8 battlerId) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) - gBattleControllerExecFlags |= gBitTable[battlerId] << 0x1C; + gBattleControllerExecFlags |= gBitTable[battlerId] << (32 - MAX_BATTLERS_COUNT); else gBattleControllerExecFlags |= gBitTable[battlerId]; } @@ -178,19 +195,21 @@ void MarkBattlerReceivedLinkData(u8 battlerId) { s32 i; - for (i = 0; i < GetLinkPlayerCount(); ++i) + for (i = 0; i < GetLinkPlayerCount(); i++) gBattleControllerExecFlags |= gBitTable[battlerId] << (i << 2); - gBattleControllerExecFlags &= ~(0x10000000 << battlerId); + gBattleControllerExecFlags &= ~((1 << 28) << battlerId); } void CancelMultiTurnMoves(u8 battler) { - gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS); - gBattleMons[battler].status2 &= ~(STATUS2_LOCK_CONFUSE); - gBattleMons[battler].status2 &= ~(STATUS2_UPROAR); - gBattleMons[battler].status2 &= ~(STATUS2_BIDE); - gStatuses3[battler] &= ~(STATUS3_SEMI_INVULNERABLE); + gBattleMons[battler].status2 &= ~STATUS2_MULTIPLETURNS; + gBattleMons[battler].status2 &= ~STATUS2_LOCK_CONFUSE; + gBattleMons[battler].status2 &= ~STATUS2_UPROAR; + gBattleMons[battler].status2 &= ~STATUS2_BIDE; + + gStatuses3[battler] &= ~STATUS3_SEMI_INVULNERABLE; + gDisableStructs[battler].rolloutTimer = 0; gDisableStructs[battler].furyCutterCounter = 0; } @@ -198,14 +217,14 @@ void CancelMultiTurnMoves(u8 battler) bool8 WasUnableToUseMove(u8 battler) { if (gProtectStructs[battler].prlzImmobility - || gProtectStructs[battler].targetNotAffected - || gProtectStructs[battler].usedImprisonedMove - || gProtectStructs[battler].loveImmobility - || gProtectStructs[battler].usedDisabledMove - || gProtectStructs[battler].usedTauntedMove - || gProtectStructs[battler].flag2Unknown - || gProtectStructs[battler].flinchImmobility - || gProtectStructs[battler].confusionSelfDmg) + || gProtectStructs[battler].targetNotAffected + || gProtectStructs[battler].usedImprisonedMove + || gProtectStructs[battler].loveImmobility + || gProtectStructs[battler].usedDisabledMove + || gProtectStructs[battler].usedTauntedMove + || gProtectStructs[battler].flag2Unknown + || gProtectStructs[battler].flinchImmobility + || gProtectStructs[battler].confusionSelfDmg) return TRUE; else return FALSE; @@ -214,7 +233,7 @@ bool8 WasUnableToUseMove(u8 battler) void PrepareStringBattle(u16 stringId, u8 battler) { gActiveBattler = battler; - BtlController_EmitPrintString(0, stringId); + BtlController_EmitPrintString(BUFFER_A, stringId); MarkBattlerForControllerExec(gActiveBattler); } @@ -225,8 +244,10 @@ void ResetSentPokesToOpponentValue(void) gSentPokesToOpponent[0] = 0; gSentPokesToOpponent[1] = 0; + for (i = 0; i < gBattlersCount; i += 2) bits |= gBitTable[gBattlerPartyIndexes[i]]; + for (i = 1; i < gBattlersCount; i += 2) gSentPokesToOpponent[(i & BIT_FLANK) >> 1] = bits; } @@ -242,8 +263,10 @@ void OpponentSwitchInResetSentPokesToOpponentValue(u8 battler) gSentPokesToOpponent[flank] = 0; for (i = 0; i < gBattlersCount; i += 2) + { if (!(gAbsentBattlerFlags & gBitTable[i])) bits |= gBitTable[gBattlerPartyIndexes[i]]; + } gSentPokesToOpponent[flank] = bits; } } @@ -257,8 +280,7 @@ void UpdateSentPokesToOpponentValue(u8 battler) else { s32 i; - - for (i = 1; i < gBattlersCount; ++i) + for (i = 1; i < gBattlersCount; i++) gSentPokesToOpponent[(i & BIT_FLANK) >> 1] |= gBitTable[gBattlerPartyIndexes[battler]]; } } @@ -292,40 +314,47 @@ u8 TrySetCantSelectMoveBattleScript(void) gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingDisabledMove; limitations = 1; } + if (move == gLastMoves[gActiveBattler] && move != MOVE_STRUGGLE && (gBattleMons[gActiveBattler].status2 & STATUS2_TORMENT)) { CancelMultiTurnMoves(gActiveBattler); gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingTormentedMove; - ++limitations; + limitations++; } - if (gDisableStructs[gActiveBattler].tauntTimer && !gBattleMoves[move].power) + + if (gDisableStructs[gActiveBattler].tauntTimer != 0 && gBattleMoves[move].power == 0) { gCurrentMove = move; gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveTaunt; - ++limitations; + limitations++; } + if (GetImprisonedMovesCount(gActiveBattler, move)) { gCurrentMove = move; gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingImprisonedMove; - ++limitations; + limitations++; } + if (gBattleMons[gActiveBattler].item == ITEM_ENIGMA_BERRY) holdEffect = gEnigmaBerries[gActiveBattler].holdEffect; else holdEffect = ItemId_GetHoldEffect(gBattleMons[gActiveBattler].item); + gPotentialItemEffectBattler = gActiveBattler; - if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove && *choicedMove != 0xFFFF && *choicedMove != move) + + if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) { gCurrentMove = *choicedMove; gLastUsedItem = gBattleMons[gActiveBattler].item; gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveChoiceItem; - ++limitations; + limitations++; } - if (!gBattleMons[gActiveBattler].pp[gBattleBufferB[gActiveBattler][2]]) + + if (gBattleMons[gActiveBattler].pp[gBattleBufferB[gActiveBattler][2]] == 0) { gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingMoveWithNoPP; - ++limitations; + limitations++; } return limitations; } @@ -340,37 +369,47 @@ u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check) holdEffect = gEnigmaBerries[battlerId].holdEffect; else holdEffect = ItemId_GetHoldEffect(gBattleMons[battlerId].item); + gPotentialItemEffectBattler = battlerId; - for (i = 0; i < MAX_MON_MOVES; ++i) + for (i = 0; i < MAX_MON_MOVES; i++) { - if (gBattleMons[battlerId].moves[i] == 0 && check & MOVE_LIMITATION_ZEROMOVE) + // No move + if (gBattleMons[battlerId].moves[i] == MOVE_NONE && check & MOVE_LIMITATION_ZEROMOVE) unusableMoves |= gBitTable[i]; + // No PP if (gBattleMons[battlerId].pp[i] == 0 && check & MOVE_LIMITATION_PP) unusableMoves |= gBitTable[i]; + // Disable if (gBattleMons[battlerId].moves[i] == gDisableStructs[battlerId].disabledMove && check & MOVE_LIMITATION_DISABLED) unusableMoves |= gBitTable[i]; + // Torment if (gBattleMons[battlerId].moves[i] == gLastMoves[battlerId] && check & MOVE_LIMITATION_TORMENTED && gBattleMons[battlerId].status2 & STATUS2_TORMENT) unusableMoves |= gBitTable[i]; + // Taunt if (gDisableStructs[battlerId].tauntTimer && check & MOVE_LIMITATION_TAUNT && gBattleMoves[gBattleMons[battlerId].moves[i]].power == 0) unusableMoves |= gBitTable[i]; + // Imprison if (GetImprisonedMovesCount(battlerId, gBattleMons[battlerId].moves[i]) && check & MOVE_LIMITATION_IMPRISON) unusableMoves |= gBitTable[i]; + // Encore if (gDisableStructs[battlerId].encoreTimer && gDisableStructs[battlerId].encoredMove != gBattleMons[battlerId].moves[i]) unusableMoves |= gBitTable[i]; - if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != gBattleMons[battlerId].moves[i]) + // Choice Band + if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != gBattleMons[battlerId].moves[i]) unusableMoves |= gBitTable[i]; } return unusableMoves; } +#define ALL_MOVES_MASK ((1 << MAX_MON_MOVES) - 1) bool8 AreAllMovesUnusable(void) { - u8 unusable = CheckMoveLimitations(gActiveBattler, 0, 0xFF); + u8 unusable = CheckMoveLimitations(gActiveBattler, 0, MOVE_LIMITATIONS_ALL); - if (unusable == 0xF) // All moves are unusable. + if (unusable == ALL_MOVES_MASK) // All moves are unusable. { - gProtectStructs[gActiveBattler].noValidMoves = 1; + gProtectStructs[gActiveBattler].noValidMoves = TRUE; gSelectionBattleScripts[gActiveBattler] = BattleScript_NoMovesLeft; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) gBattleBufferB[gActiveBattler][3] = GetBattlerAtPosition((BATTLE_OPPOSITE(GetBattlerPosition(gActiveBattler))) | (Random() & 2)); @@ -379,10 +418,12 @@ bool8 AreAllMovesUnusable(void) } else { - gProtectStructs[gActiveBattler].noValidMoves = 0; + gProtectStructs[gActiveBattler].noValidMoves = FALSE; } - return (unusable == 0xF); + + return (unusable == ALL_MOVES_MASK); } +#undef ALL_MOVES_MASK u8 GetImprisonedMovesCount(u8 battlerId, u16 move) { @@ -390,17 +431,21 @@ u8 GetImprisonedMovesCount(u8 battlerId, u16 move) u8 imprisonedMoves = 0; u8 battlerSide = GetBattlerSide(battlerId); - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (battlerSide != GetBattlerSide(i) && gStatuses3[i] & STATUS3_IMPRISONED_OTHERS) { s32 j; - - for (j = 0; j < MAX_MON_MOVES && move != gBattleMons[i].moves[j]; ++j); + for (j = 0; j < MAX_MON_MOVES; j++) + { + if (move == gBattleMons[i].moves[j]) + break; + } if (j < MAX_MON_MOVES) - ++imprisonedMoves; + imprisonedMoves++; } } + return imprisonedMoves; } @@ -424,8 +469,13 @@ u8 DoFieldEndTurnEffects(void) u8 effect = 0; s32 i; - for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount && gAbsentBattlerFlags & gBitTable[gBattlerAttacker]; ++gBattlerAttacker); - for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount && gAbsentBattlerFlags & gBitTable[gBattlerTarget]; ++gBattlerTarget); + for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount && gAbsentBattlerFlags & gBitTable[gBattlerAttacker]; gBattlerAttacker++) + { + } + for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount && gAbsentBattlerFlags & gBitTable[gBattlerTarget]; gBattlerTarget++) + { + } + do { u8 side; @@ -433,15 +483,18 @@ u8 DoFieldEndTurnEffects(void) switch (gBattleStruct->turnCountersTracker) { case ENDTURN_ORDER: - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) + { gBattlerByTurnOrder[i] = i; - for (i = 0; i < gBattlersCount - 1; ++i) + } + for (i = 0; i < gBattlersCount - 1; i++) { s32 j; - - for (j = i + 1; j < gBattlersCount; ++j) - if (GetWhoStrikesFirst(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], 0)) + for (j = i + 1; j < gBattlersCount; j++) + { + if (GetWhoStrikesFirst(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], FALSE)) SwapTurnOrder(i, j); + } } { u8 *var = &gBattleStruct->turnCountersTracker; @@ -462,16 +515,16 @@ u8 DoFieldEndTurnEffects(void) gSideStatuses[side] &= ~SIDE_STATUS_REFLECT; BattleScriptExecute(BattleScript_SideStatusWoreOff); PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_REFLECT); - ++effect; + effect++; } } - ++gBattleStruct->turnSideTracker; - if (effect) + gBattleStruct->turnSideTracker++; + if (effect != 0) break; } - if (!effect) + if (effect == 0) { - ++gBattleStruct->turnCountersTracker; + gBattleStruct->turnCountersTracker++; gBattleStruct->turnSideTracker = 0; } break; @@ -488,16 +541,16 @@ u8 DoFieldEndTurnEffects(void) BattleScriptExecute(BattleScript_SideStatusWoreOff); gBattleCommunication[MULTISTRING_CHOOSER] = side; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_LIGHT_SCREEN); - ++effect; + effect++; } } - ++gBattleStruct->turnSideTracker; - if (effect) + gBattleStruct->turnSideTracker++; + if (effect != 0) break; } - if (!effect) + if (effect == 0) { - ++gBattleStruct->turnCountersTracker; + gBattleStruct->turnCountersTracker++; gBattleStruct->turnSideTracker = 0; } break; @@ -512,15 +565,15 @@ u8 DoFieldEndTurnEffects(void) BattleScriptExecute(BattleScript_SideStatusWoreOff); gBattleCommunication[MULTISTRING_CHOOSER] = side; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_MIST); - ++effect; + effect++; } - ++gBattleStruct->turnSideTracker; - if (effect) + gBattleStruct->turnSideTracker++; + if (effect != 0) break; } - if (!effect) + if (effect == 0) { - ++gBattleStruct->turnCountersTracker; + gBattleStruct->turnCountersTracker++; gBattleStruct->turnSideTracker = 0; } break; @@ -535,16 +588,16 @@ u8 DoFieldEndTurnEffects(void) { gSideStatuses[side] &= ~SIDE_STATUS_SAFEGUARD; BattleScriptExecute(BattleScript_SafeguardEnds); - ++effect; + effect++; } } - ++gBattleStruct->turnSideTracker; - if (effect) + gBattleStruct->turnSideTracker++; + if (effect != 0) break; } - if (!effect) + if (effect == 0) { - ++gBattleStruct->turnCountersTracker; + gBattleStruct->turnCountersTracker++; gBattleStruct->turnSideTracker = 0; } break; @@ -558,14 +611,16 @@ u8 DoFieldEndTurnEffects(void) { gBattlerTarget = gActiveBattler; BattleScriptExecute(BattleScript_WishComesTrue); - ++effect; + effect++; } - ++gBattleStruct->turnSideTracker; - if (effect) + gBattleStruct->turnSideTracker++; + if (effect != 0) break; } - if (!effect) - ++gBattleStruct->turnCountersTracker; + if (effect == 0) + { + gBattleStruct->turnCountersTracker++; + } break; case ENDTURN_RAIN: if (gBattleWeather & B_WEATHER_RAIN) @@ -576,25 +631,26 @@ u8 DoFieldEndTurnEffects(void) { gBattleWeather &= ~B_WEATHER_RAIN_TEMPORARY; gBattleWeather &= ~B_WEATHER_RAIN_DOWNPOUR; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_RAIN_STOPPED; } else if (gBattleWeather & B_WEATHER_RAIN_DOWNPOUR) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOWNPOUR_CONTINUES; else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_RAIN_CONTINUES; } else if (gBattleWeather & B_WEATHER_RAIN_DOWNPOUR) { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOWNPOUR_CONTINUES; } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_RAIN_CONTINUES; } + BattleScriptExecute(BattleScript_RainContinuesOrEnds); - ++effect; + effect++; } - ++gBattleStruct->turnCountersTracker; + gBattleStruct->turnCountersTracker++; break; case ENDTURN_SANDSTORM: if (gBattleWeather & B_WEATHER_SANDSTORM) @@ -608,12 +664,13 @@ u8 DoFieldEndTurnEffects(void) { gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; } + gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SANDSTORM; BattleScriptExecute(gBattlescriptCurrInstr); - ++effect; + effect++; } - ++gBattleStruct->turnCountersTracker; + gBattleStruct->turnCountersTracker++; break; case ENDTURN_SUN: if (gBattleWeather & B_WEATHER_SUN) @@ -627,10 +684,11 @@ u8 DoFieldEndTurnEffects(void) { gBattlescriptCurrInstr = BattleScript_SunlightContinues; } + BattleScriptExecute(gBattlescriptCurrInstr); - ++effect; + effect++; } - ++gBattleStruct->turnCountersTracker; + gBattleStruct->turnCountersTracker++; break; case ENDTURN_HAIL: if (gBattleWeather & B_WEATHER_HAIL) @@ -644,18 +702,19 @@ u8 DoFieldEndTurnEffects(void) { gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; } + gBattleScripting.animArg1 = B_ANIM_HAIL_CONTINUES; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_HAIL; BattleScriptExecute(gBattlescriptCurrInstr); - ++effect; + effect++; } - ++gBattleStruct->turnCountersTracker; + gBattleStruct->turnCountersTracker++; break; case ENDTURN_FIELD_COUNT: - ++effect; + effect++; break; } - } while (!effect); + } while (effect == 0); return (gBattleMainFunc != BattleTurnPassed); } @@ -693,7 +752,7 @@ u8 DoBattlerEndTurnEffects(void) gActiveBattler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->turnEffectsBattlerId]; if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) { - ++gBattleStruct->turnEffectsBattlerId; + gBattleStruct->turnEffectsBattlerId++; } else { @@ -709,24 +768,24 @@ u8 DoBattlerEndTurnEffects(void) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; BattleScriptExecute(BattleScript_IngrainTurnHeal); - ++effect; + effect++; } - ++gBattleStruct->turnEffectsTracker; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_ABILITIES: // end turn abilities if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, gActiveBattler, 0, 0, 0)) - ++effect; - ++gBattleStruct->turnEffectsTracker; + effect++; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_ITEMS1: // item effects - if (ItemBattleEffects(1, gActiveBattler, FALSE)) - ++effect; - ++gBattleStruct->turnEffectsTracker; + if (ItemBattleEffects(ITEMEFFECT_NORMAL, gActiveBattler, FALSE)) + effect++; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_ITEMS2: // item effects again - if (ItemBattleEffects(1, gActiveBattler, TRUE)) - ++effect; - ++gBattleStruct->turnEffectsTracker; + if (ItemBattleEffects(ITEMEFFECT_NORMAL, gActiveBattler, TRUE)) + effect++; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_LEECH_SEED: // leech seed if ((gStatuses3[gActiveBattler] & STATUS3_LEECHSEED) @@ -740,9 +799,9 @@ u8 DoBattlerEndTurnEffects(void) gBattleScripting.animArg1 = gBattlerTarget; gBattleScripting.animArg2 = gBattlerAttacker; BattleScriptExecute(BattleScript_LeechSeedTurnDrain); - ++effect; + effect++; } - ++gBattleStruct->turnEffectsTracker; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_POISON: // poison if ((gBattleMons[gActiveBattler].status1 & STATUS1_POISON) && gBattleMons[gActiveBattler].hp != 0) @@ -751,9 +810,9 @@ u8 DoBattlerEndTurnEffects(void) if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_PoisonTurnDmg); - ++effect; + effect++; } - ++gBattleStruct->turnEffectsTracker; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_BAD_POISON: // toxic poison if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON) && gBattleMons[gActiveBattler].hp != 0) @@ -761,13 +820,13 @@ u8 DoBattlerEndTurnEffects(void) gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - if ((gBattleMons[gActiveBattler].status1 & 0xF00) != 0xF00) // not 16 turns - gBattleMons[gActiveBattler].status1 += 0x100; - gBattleMoveDamage *= (gBattleMons[gActiveBattler].status1 & 0xF00) >> 8; + if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_TURN(15)) // not 16 turns + gBattleMons[gActiveBattler].status1 += STATUS1_TOXIC_TURN(1); + gBattleMoveDamage *= (gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_COUNTER) >> 8; BattleScriptExecute(BattleScript_PoisonTurnDmg); - ++effect; + effect++; } - ++gBattleStruct->turnEffectsTracker; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_BURN: // burn if ((gBattleMons[gActiveBattler].status1 & STATUS1_BURN) && gBattleMons[gActiveBattler].hp != 0) @@ -776,9 +835,9 @@ u8 DoBattlerEndTurnEffects(void) if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_BurnTurnDmg); - ++effect; + effect++; } - ++gBattleStruct->turnEffectsTracker; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_NIGHTMARES: // spooky nightmares if ((gBattleMons[gActiveBattler].status2 & STATUS2_NIGHTMARE) && gBattleMons[gActiveBattler].hp != 0) @@ -791,14 +850,14 @@ u8 DoBattlerEndTurnEffects(void) if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_NightmareTurnDmg); - ++effect; + effect++; } else { gBattleMons[gActiveBattler].status2 &= ~STATUS2_NIGHTMARE; } } - ++gBattleStruct->turnEffectsTracker; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_CURSE: // curse if ((gBattleMons[gActiveBattler].status2 & STATUS2_CURSED) && gBattleMons[gActiveBattler].hp != 0) @@ -807,14 +866,14 @@ u8 DoBattlerEndTurnEffects(void) if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_CurseTurnDmg); - ++effect; + effect++; } - ++gBattleStruct->turnEffectsTracker; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_WRAP: // wrap if ((gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) && gBattleMons[gActiveBattler].hp != 0) { - gBattleMons[gActiveBattler].status2 -= 0x2000; + gBattleMons[gActiveBattler].status2 -= STATUS2_WRAPPED_TURN(1); if (gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) // damaged by wrap { gBattleScripting.animArg1 = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 0); @@ -839,24 +898,24 @@ u8 DoBattlerEndTurnEffects(void) gBattlescriptCurrInstr = BattleScript_WrapEnds; } BattleScriptExecute(gBattlescriptCurrInstr); - ++effect; + effect++; } - ++gBattleStruct->turnEffectsTracker; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_UPROAR: // uproar if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR) { - for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; ++gBattlerAttacker) + for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) { if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) && gBattleMons[gBattlerAttacker].ability != ABILITY_SOUNDPROOF) { - gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP); - gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; gBattleCommunication[MULTISTRING_CHOOSER] = 1; BattleScriptExecute(BattleScript_MonWokeUpInUproar); gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); break; } @@ -869,20 +928,20 @@ u8 DoBattlerEndTurnEffects(void) else { gBattlerAttacker = gActiveBattler; - gBattleMons[gActiveBattler].status2 -= 0x10; // uproar timer goes down + gBattleMons[gActiveBattler].status2 -= STATUS2_UPROAR_TURN(1); if (WasUnableToUseMove(gActiveBattler)) { CancelMultiTurnMoves(gActiveBattler); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_ENDS; } else if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR) { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_CONTINUES; gBattleMons[gActiveBattler].status2 |= STATUS2_MULTIPLETURNS; } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_ENDS; CancelMultiTurnMoves(gActiveBattler); } BattleScriptExecute(BattleScript_PrintUproarOverTurns); @@ -890,36 +949,35 @@ u8 DoBattlerEndTurnEffects(void) } } if (effect != 2) - ++gBattleStruct->turnEffectsTracker; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_THRASH: // thrash if (gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE) { - gBattleMons[gActiveBattler].status2 -= 0x400; + gBattleMons[gActiveBattler].status2 -= STATUS2_LOCK_CONFUSE_TURN(1); if (WasUnableToUseMove(gActiveBattler)) CancelMultiTurnMoves(gActiveBattler); else if (!(gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE) - && (gBattleMons[gActiveBattler].status2 & STATUS2_MULTIPLETURNS)) + && (gBattleMons[gActiveBattler].status2 & STATUS2_MULTIPLETURNS)) { - gBattleMons[gActiveBattler].status2 &= ~(STATUS2_MULTIPLETURNS); + gBattleMons[gActiveBattler].status2 &= ~STATUS2_MULTIPLETURNS; if (!(gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION)) { gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER; - SetMoveEffect(1, 0); + SetMoveEffect(TRUE, 0); if (gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION) BattleScriptExecute(BattleScript_ThrashConfuses); - ++effect; + effect++; } } } - ++gBattleStruct->turnEffectsTracker; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_DISABLE: // disable if (gDisableStructs[gActiveBattler].disableTimer != 0) { s32 i; - - for (i = 0; i < MAX_MON_MOVES; ++i) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gDisableStructs[gActiveBattler].disabledMove == gBattleMons[gActiveBattler].moves[i]) break; @@ -933,10 +991,10 @@ u8 DoBattlerEndTurnEffects(void) { gDisableStructs[gActiveBattler].disabledMove = MOVE_NONE; BattleScriptExecute(BattleScript_DisabledNoMore); - ++effect; + effect++; } } - ++gBattleStruct->turnEffectsTracker; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_ENCORE: // encore if (gDisableStructs[gActiveBattler].encoreTimer != 0) @@ -947,56 +1005,56 @@ u8 DoBattlerEndTurnEffects(void) gDisableStructs[gActiveBattler].encoreTimer = 0; } else if (--gDisableStructs[gActiveBattler].encoreTimer == 0 - || gBattleMons[gActiveBattler].pp[gDisableStructs[gActiveBattler].encoredMovePos] == 0) + || gBattleMons[gActiveBattler].pp[gDisableStructs[gActiveBattler].encoredMovePos] == 0) { gDisableStructs[gActiveBattler].encoredMove = MOVE_NONE; gDisableStructs[gActiveBattler].encoreTimer = 0; BattleScriptExecute(BattleScript_EncoredNoMore); - ++effect; + effect++; } } - ++gBattleStruct->turnEffectsTracker; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_LOCK_ON: // lock-on decrement if (gStatuses3[gActiveBattler] & STATUS3_ALWAYS_HITS) - gStatuses3[gActiveBattler] -= 0x8; - ++gBattleStruct->turnEffectsTracker; + gStatuses3[gActiveBattler] -= STATUS3_ALWAYS_HITS_TURN(1); + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_CHARGE: // charge if (gDisableStructs[gActiveBattler].chargeTimer && --gDisableStructs[gActiveBattler].chargeTimer == 0) gStatuses3[gActiveBattler] &= ~STATUS3_CHARGED_UP; - ++gBattleStruct->turnEffectsTracker; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_TAUNT: // taunt if (gDisableStructs[gActiveBattler].tauntTimer) - --gDisableStructs[gActiveBattler].tauntTimer; - ++gBattleStruct->turnEffectsTracker; + gDisableStructs[gActiveBattler].tauntTimer--; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_YAWN: // yawn if (gStatuses3[gActiveBattler] & STATUS3_YAWN) { - gStatuses3[gActiveBattler] -= 0x800; + gStatuses3[gActiveBattler] -= STATUS3_YAWN_TURN(1); if (!(gStatuses3[gActiveBattler] & STATUS3_YAWN) && !(gBattleMons[gActiveBattler].status1 & STATUS1_ANY) && gBattleMons[gActiveBattler].ability != ABILITY_VITAL_SPIRIT && gBattleMons[gActiveBattler].ability != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBattler)) { CancelMultiTurnMoves(gActiveBattler); - gBattleMons[gActiveBattler].status1 |= (Random() & 3) + 2; - BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + gBattleMons[gActiveBattler].status1 |= STATUS1_SLEEP_TURN((Random() & 3) + 2); // 2-5 turns of sleep + BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); gEffectBattler = gActiveBattler; BattleScriptExecute(BattleScript_YawnMakesAsleep); - ++effect; + effect++; } } - ++gBattleStruct->turnEffectsTracker; + gBattleStruct->turnEffectsTracker++; break; case ENDTURN_BATTLER_COUNT: // done gBattleStruct->turnEffectsTracker = 0; - ++gBattleStruct->turnEffectsBattlerId; + gBattleStruct->turnEffectsBattlerId++; break; } - if (effect) + if (effect != 0) return effect; } } @@ -1007,6 +1065,7 @@ u8 DoBattlerEndTurnEffects(void) bool8 HandleWishPerishSongOnTurnEnd(void) { gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); + switch (gBattleStruct->wishPerishSongState) { case 0: @@ -1015,19 +1074,22 @@ bool8 HandleWishPerishSongOnTurnEnd(void) gActiveBattler = gBattleStruct->wishPerishSongBattlerId; if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) { - ++gBattleStruct->wishPerishSongBattlerId; + gBattleStruct->wishPerishSongBattlerId++; continue; } - ++gBattleStruct->wishPerishSongBattlerId; + + gBattleStruct->wishPerishSongBattlerId++; if (gWishFutureKnock.futureSightCounter[gActiveBattler] != 0 && --gWishFutureKnock.futureSightCounter[gActiveBattler] == 0 && gBattleMons[gActiveBattler].hp != 0) { if (gWishFutureKnock.futureSightMove[gActiveBattler] == MOVE_FUTURE_SIGHT) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FUTURE_SIGHT; else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gWishFutureKnock.futureSightMove[gActiveBattler]); + gBattlerTarget = gActiveBattler; gBattlerAttacker = gWishFutureKnock.futureSightAttacker[gActiveBattler]; gBattleMoveDamage = gWishFutureKnock.futureSightDmg[gActiveBattler]; @@ -1038,7 +1100,6 @@ bool8 HandleWishPerishSongOnTurnEnd(void) } { u8 *state = &gBattleStruct->wishPerishSongState; - *state = 1; gBattleStruct->wishPerishSongBattlerId = 0; } @@ -1049,10 +1110,10 @@ bool8 HandleWishPerishSongOnTurnEnd(void) gActiveBattler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->wishPerishSongBattlerId]; if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) { - ++gBattleStruct->wishPerishSongBattlerId; + gBattleStruct->wishPerishSongBattlerId++; continue; } - ++gBattleStruct->wishPerishSongBattlerId; + gBattleStruct->wishPerishSongBattlerId++; if (gStatuses3[gActiveBattler] & STATUS3_PERISH_SONG) { PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gActiveBattler].perishSongTimer); @@ -1064,7 +1125,7 @@ bool8 HandleWishPerishSongOnTurnEnd(void) } else { - --gDisableStructs[gActiveBattler].perishSongTimer; + gDisableStructs[gActiveBattler].perishSongTimer--; gBattlescriptCurrInstr = BattleScript_PerishSongCountGoesDown; } BattleScriptExecute(gBattlescriptCurrInstr); @@ -1073,7 +1134,9 @@ bool8 HandleWishPerishSongOnTurnEnd(void) } break; } + gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); + return FALSE; } @@ -1090,8 +1153,8 @@ bool8 HandleFaintedMonActions(void) { case 0: gBattleStruct->faintedActionsBattlerId = 0; - ++gBattleStruct->faintedActionsState; - for (i = 0; i < gBattlersCount; ++i) + gBattleStruct->faintedActionsState++; + for (i = 0; i < gBattlersCount; i++) { if (gAbsentBattlerFlags & gBitTable[i] && !HasNoMonsToSwitch(i, PARTY_SIZE, PARTY_SIZE)) gAbsentBattlerFlags &= ~(gBitTable[i]); @@ -1121,7 +1184,7 @@ bool8 HandleFaintedMonActions(void) break; case 3: gBattleStruct->faintedActionsBattlerId = 0; - ++gBattleStruct->faintedActionsState; + gBattleStruct->faintedActionsState++; // fall through case 4: do @@ -1144,9 +1207,12 @@ bool8 HandleFaintedMonActions(void) gBattleStruct->faintedActionsState = 4; break; case 6: - if (AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE1, 0, 0, 0, 0) || AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0) || ItemBattleEffects(1, 0, TRUE) || AbilityBattleEffects(ABILITYEFFECT_FORECAST, 0, 0, 0, 0)) + if (AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE1, 0, 0, 0, 0) + || AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0) + || ItemBattleEffects(ITEMEFFECT_NORMAL, 0, TRUE) + || AbilityBattleEffects(ABILITYEFFECT_FORECAST, 0, 0, 0, 0)) return TRUE; - ++gBattleStruct->faintedActionsState; + gBattleStruct->faintedActionsState++; break; case FAINTED_ACTIONS_MAX_CASE: break; @@ -1158,10 +1224,11 @@ bool8 HandleFaintedMonActions(void) void TryClearRageStatuses(void) { s32 i; - - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) + { if ((gBattleMons[i].status2 & STATUS2_RAGE) && gChosenMoveByBattler[i] != MOVE_RAGE) - gBattleMons[i].status2 &= ~(STATUS2_RAGE); + gBattleMons[i].status2 &= ~STATUS2_RAGE; + } } enum @@ -1188,38 +1255,36 @@ u8 AtkCanceller_UnableToUseMove(void) { u8 effect = 0; s32 *bideDmg = &gBattleScripting.bideDmg; - do { switch (gBattleStruct->atkCancellerTracker) { case CANCELLER_FLAGS: // flags clear - gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_DESTINY_BOND); - gStatuses3[gBattlerAttacker] &= ~(STATUS3_GRUDGE); - ++gBattleStruct->atkCancellerTracker; + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_DESTINY_BOND; + gStatuses3[gBattlerAttacker] &= ~STATUS3_GRUDGE; + gBattleStruct->atkCancellerTracker++; break; case CANCELLER_ASLEEP: // check being asleep if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) { if (UproarWakeUpCheck(gBattlerAttacker)) { - gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP); - gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; effect = 2; } else { u8 toSub; - if (gBattleMons[gBattlerAttacker].ability == ABILITY_EARLY_BIRD) toSub = 2; else toSub = 1; if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) < toSub) - gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP); + gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; else gBattleMons[gBattlerAttacker].status1 -= toSub; if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) @@ -1233,15 +1298,15 @@ u8 AtkCanceller_UnableToUseMove(void) } else { - gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP; gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; effect = 2; } } } - ++gBattleStruct->atkCancellerTracker; + gBattleStruct->atkCancellerTracker++; break; case CANCELLER_FROZEN: // check being frozen if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) @@ -1255,56 +1320,56 @@ u8 AtkCanceller_UnableToUseMove(void) } else { - ++gBattleStruct->atkCancellerTracker; + gBattleStruct->atkCancellerTracker++; break; } } else // unfreeze { - gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_FREEZE); + gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED; } effect = 2; } - ++gBattleStruct->atkCancellerTracker; + gBattleStruct->atkCancellerTracker++; break; case CANCELLER_TRUANT: // truant if (gBattleMons[gBattlerAttacker].ability == ABILITY_TRUANT && gDisableStructs[gBattlerAttacker].truantCounter) { CancelMultiTurnMoves(gBattlerAttacker); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LOAFING; gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; gMoveResultFlags |= MOVE_RESULT_MISSED; effect = 1; } - ++gBattleStruct->atkCancellerTracker; + gBattleStruct->atkCancellerTracker++; break; case CANCELLER_RECHARGE: // recharge if (gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE) { - gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_RECHARGE); + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RECHARGE; gDisableStructs[gBattlerAttacker].rechargeTimer = 0; CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } - ++gBattleStruct->atkCancellerTracker; + gBattleStruct->atkCancellerTracker++; break; case CANCELLER_FLINCH: // flinch if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FLINCHED) { - gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_FLINCHED); + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_FLINCHED; gProtectStructs[gBattlerAttacker].flinchImmobility = 1; CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } - ++gBattleStruct->atkCancellerTracker; + gBattleStruct->atkCancellerTracker++; break; case CANCELLER_DISABLED: // disabled move if (gDisableStructs[gBattlerAttacker].disabledMove == gCurrentMove && gDisableStructs[gBattlerAttacker].disabledMove != MOVE_NONE) @@ -1316,7 +1381,7 @@ u8 AtkCanceller_UnableToUseMove(void) gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } - ++gBattleStruct->atkCancellerTracker; + gBattleStruct->atkCancellerTracker++; break; case CANCELLER_TAUNTED: // taunt if (gDisableStructs[gBattlerAttacker].tauntTimer && gBattleMoves[gCurrentMove].power == 0) @@ -1327,7 +1392,7 @@ u8 AtkCanceller_UnableToUseMove(void) gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } - ++gBattleStruct->atkCancellerTracker; + gBattleStruct->atkCancellerTracker++; break; case CANCELLER_IMPRISONED: // imprisoned if (GetImprisonedMovesCount(gBattlerAttacker, gCurrentMove)) @@ -1338,22 +1403,24 @@ u8 AtkCanceller_UnableToUseMove(void) gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } - ++gBattleStruct->atkCancellerTracker; + gBattleStruct->atkCancellerTracker++; break; case CANCELLER_CONFUSED: // confusion if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) { - --gBattleMons[gBattlerAttacker].status2; + gBattleMons[gBattlerAttacker].status2 -= STATUS2_CONFUSION_TURN(1); if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) { if (Random() & 1) { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + // The MULTISTRING_CHOOSER is used here as a bool to signal + // to BattleScript_MoveUsedIsConfused whether or not damage was taken + gBattleCommunication[MULTISTRING_CHOOSER] = FALSE; BattleScriptPushCursor(); } else // confusion dmg { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = TRUE; gBattlerTarget = gBattlerAttacker; gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerAttacker], MOVE_POUND, 0, 40, 0, gBattlerAttacker, gBattlerAttacker); gProtectStructs[gBattlerAttacker].confusionSelfDmg = 1; @@ -1368,17 +1435,19 @@ u8 AtkCanceller_UnableToUseMove(void) } effect = 1; } - ++gBattleStruct->atkCancellerTracker; + gBattleStruct->atkCancellerTracker++; break; case CANCELLER_PARALYSED: // paralysis if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && (Random() % 4) == 0) { gProtectStructs[gBattlerAttacker].prlzImmobility = 1; + // This is removed in FRLG and Emerald for some reason + //CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } - ++gBattleStruct->atkCancellerTracker; + gBattleStruct->atkCancellerTracker++; break; case CANCELLER_GHOST: // GHOST in pokemon tower if (IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags)) @@ -1390,7 +1459,7 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleCommunication[MULTISTRING_CHOOSER] = 0; effect = 1; } - ++gBattleStruct->atkCancellerTracker; + gBattleStruct->atkCancellerTracker++; break; case CANCELLER_IN_LOVE: // infatuation if (gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) @@ -1410,25 +1479,27 @@ u8 AtkCanceller_UnableToUseMove(void) gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; effect = 1; } - ++gBattleStruct->atkCancellerTracker; + gBattleStruct->atkCancellerTracker++; break; case CANCELLER_BIDE: // bide if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) { - gBattleMons[gBattlerAttacker].status2 -= 0x100; + gBattleMons[gBattlerAttacker].status2 -= STATUS2_BIDE_TURN(1); if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) { gBattlescriptCurrInstr = BattleScript_BideStoringEnergy; } else { + // This is removed in FRLG and Emerald for some reason + //gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_MULTIPLETURNS; if (gTakenDmg[gBattlerAttacker]) { gCurrentMove = MOVE_BIDE; *bideDmg = gTakenDmg[gBattlerAttacker] * 2; gBattlerTarget = gTakenDmgByBattler[gBattlerAttacker]; if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) - gBattlerTarget = GetMoveTarget(MOVE_BIDE, 1); + gBattlerTarget = GetMoveTarget(MOVE_BIDE, MOVE_TARGET_SELECTED + 1); gBattlescriptCurrInstr = BattleScript_BideAttack; } else @@ -1438,31 +1509,32 @@ u8 AtkCanceller_UnableToUseMove(void) } effect = 1; } - ++gBattleStruct->atkCancellerTracker; + gBattleStruct->atkCancellerTracker++; break; case CANCELLER_THAW: // move thawing if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) { if (gBattleMoves[gCurrentMove].effect == EFFECT_THAW_HIT) { - gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_FREEZE); + gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED_BY_MOVE; } effect = 2; } - ++gBattleStruct->atkCancellerTracker; + gBattleStruct->atkCancellerTracker++; break; case CANCELLER_END: break; } - } while (gBattleStruct->atkCancellerTracker != CANCELLER_END && !effect); + } while (gBattleStruct->atkCancellerTracker != CANCELLER_END && effect == 0); + if (effect == 2) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } return effect; @@ -1475,59 +1547,56 @@ bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2) s32 i; if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { return FALSE; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + flankId = GetBattlerMultiplayerId(battler); + if (GetBattlerSide(battler) == B_SIDE_PLAYER) + party = gPlayerParty; + else + party = gEnemyParty; + + playerId = GetLinkTrainerFlankId(flankId); + for (i = playerId * MULTI_PARTY_SIZE; i < playerId * MULTI_PARTY_SIZE + MULTI_PARTY_SIZE; i++) + { + if (GetMonData(&party[i], MON_DATA_HP) != 0 + && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE + && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG) + break; + } + return (i == playerId * MULTI_PARTY_SIZE + MULTI_PARTY_SIZE); } else { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + if (GetBattlerSide(battler) == B_SIDE_OPPONENT) { - playerId = GetBattlerMultiplayerId(battler); - if (GetBattlerSide(battler) == B_SIDE_PLAYER) - party = gPlayerParty; - else - party = gEnemyParty; - flankId = GetLinkTrainerFlankId(playerId); - for (i = flankId * 3; i < flankId * 3 + 3; ++i) - { - if (GetMonData(&party[i], MON_DATA_HP) != 0 - && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE - && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG) - break; - } - return (i == flankId * 3 + 3); + flankId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + playerId = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + party = gEnemyParty; } else { - if (GetBattlerSide(battler) == B_SIDE_OPPONENT) - { - playerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - flankId = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); - party = gEnemyParty; - } - else - { - playerId = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - flankId = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); - party = gPlayerParty; - } - if (partyIdBattlerOn1 == PARTY_SIZE) - partyIdBattlerOn1 = gBattlerPartyIndexes[playerId]; - if (partyIdBattlerOn2 == PARTY_SIZE) - partyIdBattlerOn2 = gBattlerPartyIndexes[flankId]; - for (i = 0; i < PARTY_SIZE; ++i) - { - if (GetMonData(&party[i], MON_DATA_HP) != 0 - && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE - && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG - && i != partyIdBattlerOn1 - && i != partyIdBattlerOn2 - && i != *(gBattleStruct->monToSwitchIntoId + playerId) - && i != flankId[gBattleStruct->monToSwitchIntoId]) - break; - } - return (i == PARTY_SIZE); + flankId = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + playerId = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); + party = gPlayerParty; } + + if (partyIdBattlerOn1 == PARTY_SIZE) + partyIdBattlerOn1 = gBattlerPartyIndexes[flankId]; + if (partyIdBattlerOn2 == PARTY_SIZE) + partyIdBattlerOn2 = gBattlerPartyIndexes[playerId]; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&party[i], MON_DATA_HP) != 0 + && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE + && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG + && i != partyIdBattlerOn1 && i != partyIdBattlerOn2 + && i != *(gBattleStruct->monToSwitchIntoId + flankId) && i != playerId[gBattleStruct->monToSwitchIntoId]) + break; + } + return (i == PARTY_SIZE); } } @@ -1587,24 +1656,31 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (gBattlerAttacker >= gBattlersCount) gBattlerAttacker = battler; + if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) pokeAtk = &gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]]; else pokeAtk = &gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker]]; + if (gBattlerTarget >= gBattlersCount) gBattlerTarget = battler; + if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) pokeDef = &gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]]; else pokeDef = &gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]]; + speciesAtk = GetMonData(pokeAtk, MON_DATA_SPECIES); pidAtk = GetMonData(pokeAtk, MON_DATA_PERSONALITY); + speciesDef = GetMonData(pokeDef, MON_DATA_SPECIES); pidDef = GetMonData(pokeDef, MON_DATA_PERSONALITY); + if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) // Why isn't that check done at the beginning? { u8 moveType; s32 i; + u16 move; u8 side; u8 target1; @@ -1612,12 +1688,18 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gLastUsedAbility = special; else gLastUsedAbility = gBattleMons[battler].ability; - if (!moveArg) - moveArg = gCurrentMove; - GET_MOVE_TYPE(moveArg, moveType); + + if (moveArg) + move = moveArg; + else + move = gCurrentMove; + + GET_MOVE_TYPE(move, moveType); + if (IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags) && (gLastUsedAbility == ABILITY_INTIMIDATE || gLastUsedAbility == ABILITY_TRACE)) return effect; + switch (caseID) { case ABILITYEFFECT_ON_SWITCHIN: // 0 @@ -1636,29 +1718,29 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattleWeather = (B_WEATHER_RAIN_TEMPORARY | B_WEATHER_RAIN_PERMANENT); gBattleScripting.animArg1 = B_ANIM_RAIN_CONTINUES; gBattleScripting.battler = battler; - ++effect; + effect++; } break; case WEATHER_SANDSTORM: if (!(gBattleWeather & B_WEATHER_SANDSTORM)) { - gBattleWeather = (B_WEATHER_SANDSTORM_PERMANENT | B_WEATHER_SANDSTORM_TEMPORARY); + gBattleWeather = B_WEATHER_SANDSTORM; gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES; gBattleScripting.battler = battler; - ++effect; + effect++; } break; case WEATHER_DROUGHT: if (!(gBattleWeather & B_WEATHER_SUN)) { - gBattleWeather = (B_WEATHER_SUN_PERMANENT | B_WEATHER_SUN_TEMPORARY); + gBattleWeather = B_WEATHER_SUN; gBattleScripting.animArg1 = B_ANIM_SUN_CONTINUES; gBattleScripting.battler = battler; - ++effect; + effect++; } break; } - if (effect) + if (effect != 0) { gBattleCommunication[MULTISTRING_CHOOSER] = GetCurrentWeather(); BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts); @@ -1670,25 +1752,25 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattleWeather = (B_WEATHER_RAIN_PERMANENT | B_WEATHER_RAIN_TEMPORARY); BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); gBattleScripting.battler = battler; - ++effect; + effect++; } break; case ABILITY_SAND_STREAM: if (!(gBattleWeather & B_WEATHER_SANDSTORM_PERMANENT)) { - gBattleWeather = (B_WEATHER_SANDSTORM_PERMANENT | B_WEATHER_SANDSTORM_TEMPORARY); + gBattleWeather = B_WEATHER_SANDSTORM; BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates); gBattleScripting.battler = battler; - ++effect; + effect++; } break; case ABILITY_DROUGHT: if (!(gBattleWeather & B_WEATHER_SUN_PERMANENT)) { - gBattleWeather = (B_WEATHER_SUN_PERMANENT | B_WEATHER_SUN_TEMPORARY); + gBattleWeather = B_WEATHER_SUN; BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates); gBattleScripting.battler = battler; - ++effect; + effect++; } break; case ABILITY_INTIMIDATE: @@ -1717,7 +1799,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITY_CLOUD_NINE: case ABILITY_AIR_LOCK: { - for (target1 = 0; target1 < gBattlersCount; ++target1) + for (target1 = 0; target1 < gBattlersCount; target1++) { effect = CastformDataTypeChange(target1); if (effect != 0) @@ -1748,7 +1830,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; - ++effect; + effect++; } break; case ABILITY_SHED_SKIN: @@ -1765,23 +1847,23 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (gBattleMons[battler].status1 & STATUS1_FREEZE) StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); gBattleMons[battler].status1 = 0; - gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); // fix nightmare glitch + gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; // fix nightmare glitch gBattleScripting.battler = gActiveBattler = battler; BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates); - BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); MarkBattlerForControllerExec(gActiveBattler); - ++effect; + effect++; } break; case ABILITY_SPEED_BOOST: - if (gBattleMons[battler].statStages[STAT_SPEED] < 0xC && gDisableStructs[battler].isFirstTurn != 2) + if (gBattleMons[battler].statStages[STAT_SPEED] < MAX_STAT_STAGE && gDisableStructs[battler].isFirstTurn != 2) { - ++gBattleMons[battler].statStages[STAT_SPEED]; - gBattleScripting.animArg1 = 0x11; + gBattleMons[battler].statStages[STAT_SPEED]++; + gBattleScripting.animArg1 = 14 + STAT_SPEED; gBattleScripting.animArg2 = 0; BattleScriptPushCursorAndCallback(BattleScript_SpeedBoostActivates); gBattleScripting.battler = battler; - ++effect; + effect++; } break; case ABILITY_TRUANT: @@ -1793,10 +1875,12 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITYEFFECT_MOVES_BLOCK: // 2 if (gLastUsedAbility == ABILITY_SOUNDPROOF) { - for (i = 0; sSoundMovesTable[i] != 0xFFFF; ++i) - if (sSoundMovesTable[i] == moveArg) + for (i = 0; sSoundMovesTable[i] != SOUND_MOVES_END; i++) + { + if (sSoundMovesTable[i] == move) break; - if (sSoundMovesTable[i] != 0xFFFF) + } + if (sSoundMovesTable[i] != SOUND_MOVES_END) { if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) gHitMarker |= HITMARKER_NO_PPDEDUCT; @@ -1806,27 +1890,29 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } break; case ABILITYEFFECT_ABSORBING: // 3 - if (moveArg) + if (move) { switch (gLastUsedAbility) { case ABILITY_VOLT_ABSORB: - if (moveType == TYPE_ELECTRIC && gBattleMoves[moveArg].power != 0) + if (moveType == TYPE_ELECTRIC && gBattleMoves[move].power != 0) { if (gProtectStructs[gBattlerAttacker].notFirstStrike) gBattlescriptCurrInstr = BattleScript_MoveHPDrain; else gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; + effect = 1; } break; case ABILITY_WATER_ABSORB: - if (moveType == TYPE_WATER && gBattleMoves[moveArg].power != 0) + if (moveType == TYPE_WATER && gBattleMoves[move].power != 0) { if (gProtectStructs[gBattlerAttacker].notFirstStrike) gBattlescriptCurrInstr = BattleScript_MoveHPDrain; else gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; + effect = 1; } break; @@ -1835,21 +1921,23 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA { if (!(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_FLASH_FIRE)) { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_BOOST; if (gProtectStructs[gBattlerAttacker].notFirstStrike) gBattlescriptCurrInstr = BattleScript_FlashFireBoost; else gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; + gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_FLASH_FIRE; effect = 2; } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_NO_BOOST; if (gProtectStructs[gBattlerAttacker].notFirstStrike) gBattlescriptCurrInstr = BattleScript_FlashFireBoost; else gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; + effect = 2; } } @@ -1879,8 +1967,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA { case ABILITY_COLOR_CHANGE: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && moveArg != MOVE_STRUGGLE - && gBattleMoves[moveArg].power != 0 + && move != MOVE_STRUGGLE + && gBattleMoves[move].power != 0 && TARGET_TURN_DAMAGED && !IS_BATTLER_OF_TYPE(battler, moveType) && gBattleMons[battler].hp != 0) @@ -1889,7 +1977,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ColorChangeActivates; - ++effect; + effect++; } break; case ABILITY_ROUGH_SKIN: @@ -1897,14 +1985,14 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED - && (gBattleMoves[moveArg].flags & FLAG_MAKES_CONTACT)) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_RoughSkinActivates; - ++effect; + effect++; } break; case ABILITY_EFFECT_SPORE: @@ -1912,20 +2000,22 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED - && (gBattleMoves[moveArg].flags & FLAG_MAKES_CONTACT) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && (Random() % 10) == 0) { do + { gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3; - while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0); + } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0); if (gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_BURN) gBattleCommunication[MOVE_EFFECT_BYTE] += 2; // 5 MOVE_EFFECT_PARALYSIS + gBattleCommunication[MOVE_EFFECT_BYTE] += MOVE_EFFECT_AFFECTS_USER; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - ++effect; + effect++; } break; case ABILITY_POISON_POINT: @@ -1933,14 +2023,14 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED - && (gBattleMoves[moveArg].flags & FLAG_MAKES_CONTACT) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && (Random() % 3) == 0) { gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_POISON; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - ++effect; + effect++; } break; case ABILITY_STATIC: @@ -1948,21 +2038,21 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED - && (gBattleMoves[moveArg].flags & FLAG_MAKES_CONTACT) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && (Random() % 3) == 0) { gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_PARALYSIS; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - ++effect; + effect++; } break; case ABILITY_FLAME_BODY: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && (gBattleMoves[moveArg].flags & FLAG_MAKES_CONTACT) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && TARGET_TURN_DAMAGED && (Random() % 3) == 0) { @@ -1970,14 +2060,14 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - ++effect; + effect++; } break; case ABILITY_CUTE_CHARM: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && (gBattleMoves[moveArg].flags & FLAG_MAKES_CONTACT) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && TARGET_TURN_DAMAGED && gBattleMons[gBattlerTarget].hp != 0 && (Random() % 3) == 0 @@ -1990,13 +2080,13 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattleMons[gBattlerAttacker].status2 |= STATUS2_INFATUATED_WITH(gBattlerTarget); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_CuteCharmActivates; - ++effect; + effect++; } break; } break; case ABILITYEFFECT_IMMUNITY: // 5 - for (battler = 0; battler < gBattlersCount; ++battler) + for (battler = 0; battler < gBattlersCount; battler++) { switch (gBattleMons[battler].ability) { @@ -2025,7 +2115,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITY_VITAL_SPIRIT: if (gBattleMons[battler].status1 & STATUS1_SLEEP) { - gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); effect = 1; } @@ -2052,7 +2142,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } break; } - if (effect) + if (effect != 0) { switch (effect) { @@ -2060,10 +2150,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattleMons[battler].status1 = 0; break; case 2: // get rid of confusion - gBattleMons[battler].status2 &= ~(STATUS2_CONFUSION); + gBattleMons[battler].status2 &= ~STATUS2_CONFUSION; break; case 3: // get rid of infatuation - gBattleMons[battler].status2 &= ~(STATUS2_INFATUATION); + gBattleMons[battler].status2 &= ~STATUS2_INFATUATION; break; } @@ -2071,19 +2161,19 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; gBattleScripting.battler = battler; gActiveBattler = battler; - BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); return effect; } } break; case ABILITYEFFECT_FORECAST: // 6 - for (battler = 0; battler < gBattlersCount; ++battler) + for (battler = 0; battler < gBattlersCount; battler++) { if (gBattleMons[battler].ability == ABILITY_FORECAST) { effect = CastformDataTypeChange(battler); - if (effect) + if (effect != 0) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); gBattleScripting.battler = battler; @@ -2096,80 +2186,81 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITYEFFECT_SYNCHRONIZE: // 7 if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) { - gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); + gHitMarker &= ~HITMARKER_SYNCHRONISE_EFFECT; gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; + gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchronizeMoveEffect + MOVE_EFFECT_AFFECTS_USER; gBattleScripting.battler = gBattlerTarget; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - ++effect; + effect++; } break; case ABILITYEFFECT_ATK_SYNCHRONIZE: // 8 if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) { - gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); + gHitMarker &= ~HITMARKER_SYNCHRONISE_EFFECT; gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; + gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchronizeMoveEffect; gBattleScripting.battler = gBattlerAttacker; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - ++effect; + effect++; } break; case ABILITYEFFECT_INTIMIDATE1: // 9 - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gStatuses3[i] & STATUS3_INTIMIDATE_POKES) { gLastUsedAbility = ABILITY_INTIMIDATE; - gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); + gStatuses3[i] &= ~STATUS3_INTIMIDATE_POKES; BattleScriptPushCursorAndCallback(BattleScript_IntimidateActivatesEnd3); gBattleStruct->intimidateBattler = i; - ++effect; + effect++; break; } } break; case ABILITYEFFECT_TRACE: // 11 - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ABILITY_TRACE && (gStatuses3[i] & STATUS3_TRACE)) { u8 target2; - side = (GetBattlerPosition(i) ^ BIT_SIDE) & BIT_SIDE; // side of the opposing pokemon target1 = GetBattlerAtPosition(side); target2 = GetBattlerAtPosition(side + BIT_FLANK); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0 - && gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) + if (gBattleMons[target1].ability != ABILITY_NONE && gBattleMons[target1].hp != 0 + && gBattleMons[target2].ability != ABILITY_NONE && gBattleMons[target2].hp != 0) { gActiveBattler = GetBattlerAtPosition(((Random() & 1) * 2) | side); gBattleMons[i].ability = gBattleMons[gActiveBattler].ability; gLastUsedAbility = gBattleMons[gActiveBattler].ability; - ++effect; + effect++; } - else if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0) + else if (gBattleMons[target1].ability != ABILITY_NONE && gBattleMons[target1].hp != 0) { gActiveBattler = target1; gBattleMons[i].ability = gBattleMons[gActiveBattler].ability; gLastUsedAbility = gBattleMons[gActiveBattler].ability; - ++effect; + effect++; } - else if (gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) + else if (gBattleMons[target2].ability != ABILITY_NONE && gBattleMons[target2].hp != 0) { gActiveBattler = target2; gBattleMons[i].ability = gBattleMons[gActiveBattler].ability; gLastUsedAbility = gBattleMons[gActiveBattler].ability; - ++effect; + effect++; } } else @@ -2179,14 +2270,15 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA { gBattleMons[i].ability = gBattleMons[target1].ability; gLastUsedAbility = gBattleMons[target1].ability; - ++effect; + effect++; } } - if (effect) + if (effect != 0) { BattleScriptPushCursorAndCallback(BattleScript_TraceActivates); - gStatuses3[i] &= ~(STATUS3_TRACE); + gStatuses3[i] &= ~STATUS3_TRACE; gBattleScripting.battler = i; + PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]) PREPARE_ABILITY_BUFFER(gBattleTextBuff2, gLastUsedAbility) break; @@ -2195,23 +2287,23 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } break; case ABILITYEFFECT_INTIMIDATE2: // 10 - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ABILITY_INTIMIDATE && (gStatuses3[i] & STATUS3_INTIMIDATE_POKES)) { gLastUsedAbility = ABILITY_INTIMIDATE; - gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); + gStatuses3[i] &= ~STATUS3_INTIMIDATE_POKES; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_IntimidateActivates; gBattleStruct->intimidateBattler = i; - ++effect; + effect++; break; } } break; case ABILITYEFFECT_CHECK_OTHER_SIDE: // 12 side = GetBattlerSide(battler); - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (GetBattlerSide(i) != side && gBattleMons[i].ability == ability) { @@ -2222,7 +2314,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA break; case ABILITYEFFECT_CHECK_BATTLER_SIDE: // 13 side = GetBattlerSide(battler); - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (GetBattlerSide(i) == side && gBattleMons[i].ability == ability) { @@ -2235,17 +2327,21 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA switch (gLastUsedAbility) { case ABILITYEFFECT_MUD_SPORT: - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) + { if (gStatuses3[i] & STATUS3_MUDSPORT) effect = i + 1; + } break; case ABILITYEFFECT_WATER_SPORT: - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) + { if (gStatuses3[i] & STATUS3_WATERSPORT) effect = i + 1; + } break; default: - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ability) { @@ -2257,7 +2353,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } break; case ABILITYEFFECT_CHECK_ON_FIELD: // 19 - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ability && gBattleMons[i].hp != 0) { @@ -2268,7 +2364,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA break; case ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER: // 15 side = GetBattlerSide(battler); - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (GetBattlerSide(i) != side && gBattleMons[i].ability == ability) { @@ -2277,9 +2373,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA break; } } - if (!effect) + if (effect == 0) { - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ability && GetBattlerSide(i) == side && i != battler) { @@ -2291,40 +2387,42 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA break; case ABILITYEFFECT_COUNT_OTHER_SIDE: // 16 side = GetBattlerSide(battler); - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (GetBattlerSide(i) != side && gBattleMons[i].ability == ability) { gLastUsedAbility = ability; - ++effect; + effect++; } } break; case ABILITYEFFECT_COUNT_BATTLER_SIDE: // 17 side = GetBattlerSide(battler); - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (GetBattlerSide(i) == side && gBattleMons[i].ability == ability) { gLastUsedAbility = ability; - ++effect; + effect++; } } break; case ABILITYEFFECT_COUNT_ON_FIELD: // 18 - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ability && i != battler) { gLastUsedAbility = ability; - ++effect; + effect++; } } break; } + if (effect && caseID < ABILITYEFFECT_CHECK_OTHER_SIDE && gLastUsedAbility != 0xFF) RecordAbilityBattle(battler, gLastUsedAbility); } + return effect; } @@ -2354,6 +2452,36 @@ enum ITEM_STATS_CHANGE, }; +#define TRY_EAT_CONFUSE_BERRY(flavor) \ + if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) \ + { \ + PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavor); \ + gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; \ + if (gBattleMoveDamage == 0) \ + gBattleMoveDamage = 1; \ + if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) \ + gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; \ + gBattleMoveDamage *= -1; \ + if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, flavor) < 0) \ + BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); \ + else \ + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); \ + effect = ITEM_HP_CHANGE; \ + } + +#define TRY_EAT_STAT_UP_BERRY(stat) \ + if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam \ + && !moveTurn && gBattleMons[battlerId].statStages[stat] < MAX_STAT_STAGE) \ + { \ + PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); \ + gEffectBattler = battlerId; \ + SET_STATCHANGER(stat, 1, FALSE); \ + gBattleScripting.animArg1 = 14 + (stat); \ + gBattleScripting.animArg2 = 0; \ + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); \ + effect = ITEM_STATS_CHANGE; \ + } + u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) { int i = 0; @@ -2399,6 +2527,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) defHoldEffect = ItemId_GetHoldEffect(defItem); defHoldEffectParam = ItemId_GetHoldEffectParam(defItem); } + switch (caseID) { case ITEMEFFECT_ON_SWITCH_IN: @@ -2408,15 +2537,15 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gBattleStruct->moneyMultiplier = 2; break; case HOLD_EFFECT_RESTORE_STATS: - for (i = 0; i < NUM_BATTLE_STATS; ++i) + for (i = 0; i < NUM_BATTLE_STATS; i++) { - if (gBattleMons[battlerId].statStages[i] < 6) + if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE) { - gBattleMons[battlerId].statStages[i] = 6; + gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE; effect = ITEM_STATS_CHANGE; } } - if (effect) + if (effect != 0) { gBattleScripting.battler = battlerId; gPotentialItemEffectBattler = battlerId; @@ -2426,7 +2555,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) break; } break; - case 1: + case ITEMEFFECT_NORMAL: if (gBattleMons[battlerId].hp) { switch (battlerHoldEffect) @@ -2439,7 +2568,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; gBattleMoveDamage *= -1; BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = 4; + effect = ITEM_HP_CHANGE; } break; case HOLD_EFFECT_RESTORE_PP: @@ -2453,7 +2582,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]]; else mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]]; - for (i = 0; i < MAX_MON_MOVES; ++i) + for (i = 0; i < MAX_MON_MOVES; i++) { move = GetMonData(mon, MON_DATA_MOVE1 + i); changedPP = GetMonData(mon, MON_DATA_PP1 + i); @@ -2468,24 +2597,26 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) changedPP = maxPP; else changedPP = changedPP + battlerHoldEffectParam; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); + BattleScriptExecute(BattleScript_BerryPPHealEnd2); - BtlController_EmitSetMonData(0, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); + BtlController_EmitSetMonData(BUFFER_A, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); MarkBattlerForControllerExec(gActiveBattler); effect = ITEM_PP_CHANGE; } } break; case HOLD_EFFECT_RESTORE_STATS: - for (i = 0; i < NUM_BATTLE_STATS; ++i) + for (i = 0; i < NUM_BATTLE_STATS; i++) { - if (gBattleMons[battlerId].statStages[i] < 6) + if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE) { - gBattleMons[battlerId].statStages[i] = 6; + gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE; effect = ITEM_STATS_CHANGE; } } - if (effect) + if (effect != 0) { gBattleScripting.battler = battlerId; gPotentialItemEffectBattler = battlerId; @@ -2508,153 +2639,49 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CONFUSE_SPICY: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) - { - PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SPICY); - gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) - gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; - gBattleMoveDamage *= -1; - if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_SPICY) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } + TRY_EAT_CONFUSE_BERRY(FLAVOR_SPICY); break; case HOLD_EFFECT_CONFUSE_DRY: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) - { - PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_DRY); - gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) - gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; - gBattleMoveDamage *= -1; - if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_DRY) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } + TRY_EAT_CONFUSE_BERRY(FLAVOR_DRY); break; case HOLD_EFFECT_CONFUSE_SWEET: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) - { - PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SWEET); - gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) - gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; - gBattleMoveDamage *= -1; - if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_SWEET) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } + TRY_EAT_CONFUSE_BERRY(FLAVOR_SWEET); break; case HOLD_EFFECT_CONFUSE_BITTER: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) - { - PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_BITTER); - gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) - gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; - gBattleMoveDamage *= -1; - if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_BITTER) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } + TRY_EAT_CONFUSE_BERRY(FLAVOR_BITTER); break; case HOLD_EFFECT_CONFUSE_SOUR: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) - { - PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SOUR); - gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) - gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; - gBattleMoveDamage *= -1; - if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_SOUR) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } + TRY_EAT_CONFUSE_BERRY(FLAVOR_SOUR); break; case HOLD_EFFECT_ATTACK_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < 0xC) + if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam + && !moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < MAX_STAT_STAGE) { PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); - PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE); + PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE); // Only the Attack stat-up berry has this gEffectBattler = battlerId; SET_STATCHANGER(STAT_ATK, 1, FALSE); - gBattleScripting.animArg1 = 0xE + STAT_ATK; + gBattleScripting.animArg1 = 14 + STAT_ATK; gBattleScripting.animArg2 = 0; BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); effect = ITEM_STATS_CHANGE; } break; case HOLD_EFFECT_DEFENSE_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_DEF] < 0xC) - { - PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_DEF); - gEffectBattler = battlerId; - SET_STATCHANGER(STAT_DEF, 1, FALSE); - gBattleScripting.animArg1 = 0xE + STAT_DEF; - gBattleScripting.animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } + TRY_EAT_STAT_UP_BERRY(STAT_DEF); break; case HOLD_EFFECT_SPEED_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPEED] < 0xC) - { - PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPEED); - gEffectBattler = battlerId; - SET_STATCHANGER(STAT_SPEED, 1, FALSE); - gBattleScripting.animArg1 = 0xE + STAT_SPEED; - gBattleScripting.animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } + TRY_EAT_STAT_UP_BERRY(STAT_SPEED); break; case HOLD_EFFECT_SP_ATTACK_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPATK] < 0xC) - { - PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); - gEffectBattler = battlerId; - SET_STATCHANGER(STAT_SPATK, 1, FALSE); - gBattleScripting.animArg1 = 0xE + STAT_SPATK; - gBattleScripting.animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } + TRY_EAT_STAT_UP_BERRY(STAT_SPATK); break; case HOLD_EFFECT_SP_DEFENSE_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPDEF] < 0xC) - { - PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPDEF); - gEffectBattler = battlerId; - SET_STATCHANGER(STAT_SPDEF, 1, FALSE); - gBattleScripting.animArg1 = 0xE + STAT_SPDEF; - gBattleScripting.animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } + TRY_EAT_STAT_UP_BERRY(STAT_SPDEF); break; case HOLD_EFFECT_CRITICAL_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY)) + if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn + && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY)) { gBattleMons[battlerId].status2 |= STATUS2_FOCUS_ENERGY; BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); @@ -2664,13 +2691,20 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_RANDOM_STAT_UP: if (!moveTurn && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam) { - for (i = 0; i < 5 && gBattleMons[battlerId].statStages[STAT_ATK + i] >= 0xC; ++i); - if (i != 5) + for (i = 0; i < NUM_STATS - 1; i++) + { + if (gBattleMons[battlerId].statStages[STAT_ATK + i] < MAX_STAT_STAGE) + break; + } + if (i != NUM_STATS - 1) { do - i = Random() % 5; - while (gBattleMons[battlerId].statStages[STAT_ATK + i] == 0xC); + { + i = Random() % (NUM_STATS - 1); + } while (gBattleMons[battlerId].statStages[STAT_ATK + i] == MAX_STAT_STAGE); + PREPARE_STAT_BUFFER(gBattleTextBuff1, i + 1); + gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; gBattleTextBuff2[1] = B_BUFF_STRING; gBattleTextBuff2[2] = STRINGID_STATSHARPLY; @@ -2679,6 +2713,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gBattleTextBuff2[5] = STRINGID_STATROSE; gBattleTextBuff2[6] = STRINGID_STATROSE >> 8; gBattleTextBuff2[7] = EOS; + gEffectBattler = battlerId; SET_STATCHANGER(i + 1, 2, FALSE); gBattleScripting.animArg1 = 0x21 + i + 6; @@ -2691,7 +2726,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_CURE_PAR: if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) { - gBattleMons[battlerId].status1 &= ~(STATUS1_PARALYSIS); + gBattleMons[battlerId].status1 &= ~STATUS1_PARALYSIS; BattleScriptExecute(BattleScript_BerryCurePrlzEnd2); effect = ITEM_STATUS_CHANGE; } @@ -2707,7 +2742,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_CURE_BRN: if (gBattleMons[battlerId].status1 & STATUS1_BURN) { - gBattleMons[battlerId].status1 &= ~(STATUS1_BURN); + gBattleMons[battlerId].status1 &= ~STATUS1_BURN; BattleScriptExecute(BattleScript_BerryCureBrnEnd2); effect = ITEM_STATUS_CHANGE; } @@ -2715,7 +2750,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_CURE_FRZ: if (gBattleMons[battlerId].status1 & STATUS1_FREEZE) { - gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE); + gBattleMons[battlerId].status1 &= ~STATUS1_FREEZE; BattleScriptExecute(BattleScript_BerryCureFrzEnd2); effect = ITEM_STATUS_CHANGE; } @@ -2723,8 +2758,8 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_CURE_SLP: if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) { - gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP); - gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[battlerId].status1 &= ~STATUS1_SLEEP; + gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE; BattleScriptExecute(BattleScript_BerryCureSlpEnd2); effect = ITEM_STATUS_CHANGE; } @@ -2732,7 +2767,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_CURE_CONFUSION: if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION) { - gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION); + gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION; BattleScriptExecute(BattleScript_BerryCureConfusionEnd2); effect = ITEM_EFFECT_OTHER; } @@ -2744,40 +2779,40 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY) { StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - ++i; + i++; } if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) { - gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE; StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - ++i; + i++; } if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) { StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - ++i; + i++; } if (gBattleMons[battlerId].status1 & STATUS1_BURN) { StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - ++i; + i++; } if (gBattleMons[battlerId].status1 & STATUS1_FREEZE) { StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - ++i; + i++; } if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION) { StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); - ++i; + i++; } - if (!(i > 1)) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + if (i <= 1) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_NORMALIZED_STATUS; gBattleMons[battlerId].status1 = 0; - gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION); + gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION; BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); effect = ITEM_STATUS_CHANGE; } @@ -2785,15 +2820,15 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_CURE_ATTRACT: if (gBattleMons[battlerId].status2 & STATUS2_INFATUATION) { - gBattleMons[battlerId].status2 &= ~(STATUS2_INFATUATION); + gBattleMons[battlerId].status2 &= ~STATUS2_INFATUATION; StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; effect = ITEM_EFFECT_OTHER; } break; } - if (effect) + if (effect != 0) { gBattleScripting.battler = battlerId; gPotentialItemEffectBattler = battlerId; @@ -2801,21 +2836,21 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) switch (effect) { case ITEM_STATUS_CHANGE: - BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battlerId].status1); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battlerId].status1); MarkBattlerForControllerExec(gActiveBattler); break; case ITEM_PP_CHANGE: - if (!(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED) && !(gDisableStructs[battlerId].mimickedMoves & gBitTable[i])) + if (MOVE_IS_PERMANENT(battlerId, i)) gBattleMons[battlerId].pp[i] = changedPP; break; } } } break; - case 2: + case ITEMEFFECT_DUMMY: break; case ITEMEFFECT_MOVE_END: - for (battlerId = 0; battlerId < gBattlersCount; ++battlerId) + for (battlerId = 0; battlerId < gBattlersCount; battlerId++) { gLastUsedItem = gBattleMons[battlerId].item; if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY) @@ -2833,7 +2868,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_CURE_PAR: if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) { - gBattleMons[battlerId].status1 &= ~(STATUS1_PARALYSIS); + gBattleMons[battlerId].status1 &= ~STATUS1_PARALYSIS; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureParRet; effect = ITEM_STATUS_CHANGE; @@ -2851,7 +2886,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_CURE_BRN: if (gBattleMons[battlerId].status1 & STATUS1_BURN) { - gBattleMons[battlerId].status1 &= ~(STATUS1_BURN); + gBattleMons[battlerId].status1 &= ~STATUS1_BURN; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureBrnRet; effect = ITEM_STATUS_CHANGE; @@ -2860,7 +2895,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_CURE_FRZ: if (gBattleMons[battlerId].status1 & STATUS1_FREEZE) { - gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE); + gBattleMons[battlerId].status1 &= ~STATUS1_FREEZE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureFrzRet; effect = ITEM_STATUS_CHANGE; @@ -2869,8 +2904,8 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_CURE_SLP: if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) { - gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP); - gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[battlerId].status1 &= ~STATUS1_SLEEP; + gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet; effect = ITEM_STATUS_CHANGE; @@ -2879,7 +2914,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_CURE_CONFUSION: if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION) { - gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION); + gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureConfusionRet; effect = ITEM_EFFECT_OTHER; @@ -2888,10 +2923,10 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_CURE_ATTRACT: if (gBattleMons[battlerId].status2 & STATUS2_INFATUATION) { - gBattleMons[battlerId].status2 &= ~(STATUS2_INFATUATION); + gBattleMons[battlerId].status2 &= ~STATUS2_INFATUATION; StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; effect = ITEM_EFFECT_OTHER; } @@ -2900,48 +2935,44 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) if (gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION) { if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY) - { StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - } + if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) { - gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE; StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); } + if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) - { StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - } + if (gBattleMons[battlerId].status1 & STATUS1_BURN) - { StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - } + if (gBattleMons[battlerId].status1 & STATUS1_FREEZE) - { StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - } + if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION) - { StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); - } + gBattleMons[battlerId].status1 = 0; - gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION); + gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION; BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_RESTORE_STATS: - for (i = 0; i < NUM_BATTLE_STATS; ++i) + for (i = 0; i < NUM_BATTLE_STATS; i++) { - if (gBattleMons[battlerId].statStages[i] < 6) + if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE) { - gBattleMons[battlerId].statStages[i] = 6; + gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE; effect = ITEM_STATS_CHANGE; } } - if (effect) + if (effect != 0) { gBattleScripting.battler = battlerId; gPotentialItemEffectBattler = battlerId; @@ -2951,12 +2982,12 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; } - if (effect) + if (effect != 0) { gBattleScripting.battler = battlerId; gPotentialItemEffectBattler = battlerId; gActiveBattler = battlerId; - BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); break; } @@ -2969,10 +3000,10 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) { case HOLD_EFFECT_FLINCH: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && TARGET_TURN_DAMAGED - && (Random() % 100) < battlerHoldEffectParam - && gBattleMoves[gCurrentMove].flags & FLAG_KINGS_ROCK_AFFECTED - && gBattleMons[gBattlerTarget].hp) + && TARGET_TURN_DAMAGED + && (Random() % 100) < battlerHoldEffectParam + && gBattleMoves[gCurrentMove].flags & FLAG_KINGS_ROCK_AFFECTED + && gBattleMons[gBattlerTarget].hp) { gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_FLINCH; BattleScriptPushCursor(); @@ -2982,11 +3013,11 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) break; case HOLD_EFFECT_SHELL_BELL: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gSpecialStatuses[gBattlerTarget].dmg != 0 - && gSpecialStatuses[gBattlerTarget].dmg != 0xFFFF - && gBattlerAttacker != gBattlerTarget - && gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP - && gBattleMons[gBattlerAttacker].hp != 0) + && gSpecialStatuses[gBattlerTarget].dmg != 0 + && gSpecialStatuses[gBattlerTarget].dmg != 0xFFFF + && gBattlerAttacker != gBattlerTarget + && gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP + && gBattleMons[gBattlerAttacker].hp != 0) { gLastUsedItem = atkItem; gPotentialItemEffectBattler = gBattlerAttacker; @@ -2997,21 +3028,22 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gSpecialStatuses[gBattlerTarget].dmg = 0; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ItemHealHP_Ret; - ++effect; + effect++; } break; } } break; } + return effect; } void ClearFuryCutterDestinyBondGrudge(u8 battlerId) { gDisableStructs[battlerId].furyCutterCounter = 0; - gBattleMons[battlerId].status2 &= ~(STATUS2_DESTINY_BOND); - gStatuses3[battlerId] &= ~(STATUS3_GRUDGE); + gBattleMons[battlerId].status2 &= ~STATUS2_DESTINY_BOND; + gStatuses3[battlerId] &= ~STATUS3_GRUDGE; } void HandleAction_RunBattleScript(void) // identical to RunBattleScriptCommands @@ -3026,10 +3058,11 @@ u8 GetMoveTarget(u16 move, u8 setTarget) u8 moveTarget; u8 side; - if (setTarget) + if (setTarget != NO_TARGET_OVERRIDE) moveTarget = setTarget - 1; else moveTarget = gBattleMoves[move].target; + switch (moveTarget) { case MOVE_TARGET_SELECTED: @@ -3044,8 +3077,8 @@ u8 GetMoveTarget(u16 move, u8 setTarget) targetBattler = Random() % gBattlersCount; } while (targetBattler == gBattlerAttacker || side == GetBattlerSide(targetBattler) || gAbsentBattlerFlags & gBitTable[targetBattler]); if (gBattleMoves[move].type == TYPE_ELECTRIC - && AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBattlerAttacker, ABILITY_LIGHTNING_ROD, 0, 0) - && gBattleMons[targetBattler].ability != ABILITY_LIGHTNING_ROD) + && AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBattlerAttacker, ABILITY_LIGHTNING_ROD, 0, 0) + && gBattleMons[targetBattler].ability != ABILITY_LIGHTNING_ROD) { targetBattler ^= BIT_FLANK; RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); @@ -3092,16 +3125,19 @@ u8 GetMoveTarget(u16 move, u8 setTarget) targetBattler = gBattlerAttacker; break; } + *(gBattleStruct->moveTarget + gBattlerAttacker) = targetBattler; + return targetBattler; } -static bool32 IsNotEventLegalMewOrDeoxys(u8 battlerId) +static bool32 IsMonEventLegal(u8 battlerId) { - if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT - || (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS - && GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES, NULL) != SPECIES_MEW)) + if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT) return TRUE; + if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS + && GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES, NULL) != SPECIES_MEW) + return TRUE; return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_EVENT_LEGAL, NULL); } @@ -3111,13 +3147,20 @@ u8 IsMonDisobedient(void) s32 calc; u8 obedienceLevel = 0; - if ((gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_POKEDUDE)) || GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT) + if ((gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_POKEDUDE))) return 0; - if (IsNotEventLegalMewOrDeoxys(gBattlerAttacker)) // only if species is Mew or Deoxys + if (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT) + return 0; + + if (IsMonEventLegal(gBattlerAttacker)) // only false if illegal Mew or Deoxys { - if (!IsOtherTrainer(gBattleMons[gBattlerAttacker].otId, gBattleMons[gBattlerAttacker].otName) || FlagGet(FLAG_BADGE08_GET)) + if (!IsOtherTrainer(gBattleMons[gBattlerAttacker].otId, gBattleMons[gBattlerAttacker].otName)) return 0; + if (FlagGet(FLAG_BADGE08_GET)) + return 0; + obedienceLevel = 10; + if (FlagGet(FLAG_BADGE02_GET)) obedienceLevel = 30; if (FlagGet(FLAG_BADGE04_GET)) @@ -3125,39 +3168,46 @@ u8 IsMonDisobedient(void) if (FlagGet(FLAG_BADGE06_GET)) obedienceLevel = 70; } + if (gBattleMons[gBattlerAttacker].level <= obedienceLevel) return 0; rnd = (Random() & 255); calc = (gBattleMons[gBattlerAttacker].level + obedienceLevel) * rnd >> 8; if (calc < obedienceLevel) return 0; + // is not obedient if (gCurrentMove == MOVE_RAGE) - gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_RAGE); + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RAGE; if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && (gCurrentMove == MOVE_SNORE || gCurrentMove == MOVE_SLEEP_TALK)) { gBattlescriptCurrInstr = BattleScript_IgnoresWhileAsleep; return 1; } + rnd = (Random() & 255); calc = (gBattleMons[gBattlerAttacker].level + obedienceLevel) * rnd >> 8; if (calc < obedienceLevel && gCurrentMove != MOVE_FOCUS_PUNCH) // Additional check for focus punch in FR { - calc = CheckMoveLimitations(gBattlerAttacker, gBitTable[gCurrMovePos], 0xFF); + calc = CheckMoveLimitations(gBattlerAttacker, gBitTable[gCurrMovePos], MOVE_LIMITATIONS_ALL); if (calc == 0xF) // all moves cannot be used { - gBattleCommunication[MULTISTRING_CHOOSER] = Random() & 3; + // Randomly select, then print a disobedient string + // B_MSG_LOAFING, B_MSG_WONT_OBEY, B_MSG_TURNED_AWAY, or B_MSG_PRETEND_NOT_NOTICE + gBattleCommunication[MULTISTRING_CHOOSER] = Random() & (NUM_LOAF_STRINGS - 1); gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; return 1; } else // use a random move { do - gCurrMovePos = gChosenMovePos = Random() & 3; - while (gBitTable[gCurrMovePos] & calc); + { + gCurrMovePos = gChosenMovePos = Random() & (MAX_MON_MOVES - 1); + } while (gBitTable[gCurrMovePos] & calc); + gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove; - gBattlerTarget = GetMoveTarget(gCalledMove, 0); + gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); gHitMarker |= HITMARKER_DISOBEDIENT_MOVE; return 2; } @@ -3165,15 +3215,17 @@ u8 IsMonDisobedient(void) else { obedienceLevel = gBattleMons[gBattlerAttacker].level - obedienceLevel; + calc = (Random() & 255); if (calc < obedienceLevel && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) && gBattleMons[gBattlerAttacker].ability != ABILITY_VITAL_SPIRIT && gBattleMons[gBattlerAttacker].ability != ABILITY_INSOMNIA) { // try putting asleep int i; - - for (i = 0; i < gBattlersCount; ++i) + for (i = 0; i < gBattlersCount; i++) + { if (gBattleMons[i].status2 & STATUS2_UPROAR) break; + } if (i == gBattlersCount) { gBattlescriptCurrInstr = BattleScript_IgnoresAndFallsAsleep; @@ -3191,7 +3243,9 @@ u8 IsMonDisobedient(void) } else { - gBattleCommunication[MULTISTRING_CHOOSER] = Random() & 3; + // Randomly select, then print a disobedient string + // B_MSG_LOAFING, B_MSG_WONT_OBEY, B_MSG_TURNED_AWAY, or B_MSG_PRETEND_NOT_NOTICE + gBattleCommunication[MULTISTRING_CHOOSER] = Random() & (NUM_LOAF_STRINGS - 1); gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; return 1; } diff --git a/src/battle_util2.c b/src/battle_util2.c index e3fa1a6a7..8a5fbccf6 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -2,8 +2,8 @@ #include "bg.h" #include "battle.h" #include "battle_anim.h" -#include "pokemon.h" #include "malloc.h" +#include "pokemon.h" #include "trainer_tower.h" void AllocateBattleResources(void) @@ -14,10 +14,12 @@ void AllocateBattleResources(void) { s32 i; - for (i = 0; i < 4; ++i) + for (i = 0; i < 4; i++) gPokedudeBattlerStates[i] = AllocZeroed(sizeof(struct PokedudeBattlerState)); } + gBattleStruct = AllocZeroed(sizeof(*gBattleStruct)); + gBattleResources = AllocZeroed(sizeof(*gBattleResources)); gBattleResources->secretBase = AllocZeroed(sizeof(*gBattleResources->secretBase)); gBattleResources->flags = AllocZeroed(sizeof(*gBattleResources->flags)); @@ -27,12 +29,15 @@ void AllocateBattleResources(void) gBattleResources->ai = AllocZeroed(sizeof(*gBattleResources->ai)); gBattleResources->battleHistory = AllocZeroed(sizeof(*gBattleResources->battleHistory)); gBattleResources->AI_ScriptsStack = AllocZeroed(sizeof(*gBattleResources->AI_ScriptsStack)); + gLinkBattleSendBuffer = AllocZeroed(BATTLE_BUFFER_LINK_SIZE); gLinkBattleRecvBuffer = AllocZeroed(BATTLE_BUFFER_LINK_SIZE); - gBattleAnimMons_BgTilesBuffer = AllocZeroed(0x2000); - gBattleAnimMons_BgTilemapBuffer = AllocZeroed(0x1000); - SetBgTilemapBuffer(1, gBattleAnimMons_BgTilemapBuffer); - SetBgTilemapBuffer(2, gBattleAnimMons_BgTilemapBuffer); + + gBattleAnimBgTileBuffer = AllocZeroed(0x2000); + gBattleAnimBgTilemapBuffer = AllocZeroed(0x1000); + + SetBgTilemapBuffer(1, gBattleAnimBgTilemapBuffer); + SetBgTilemapBuffer(2, gBattleAnimBgTilemapBuffer); } void FreeBattleResources(void) @@ -43,7 +48,7 @@ void FreeBattleResources(void) { s32 i; - for (i = 0; i < 4; ++i) + for (i = 0; i < 4; i++) { FREE_AND_SET_NULL(gPokedudeBattlerStates[i]); } @@ -51,6 +56,7 @@ void FreeBattleResources(void) if (gBattleResources != NULL) { FREE_AND_SET_NULL(gBattleStruct); + FREE_AND_SET_NULL(gBattleResources->secretBase); FREE_AND_SET_NULL(gBattleResources->flags); FREE_AND_SET_NULL(gBattleResources->battleScriptsStack); @@ -60,21 +66,26 @@ void FreeBattleResources(void) FREE_AND_SET_NULL(gBattleResources->battleHistory); FREE_AND_SET_NULL(gBattleResources->AI_ScriptsStack); FREE_AND_SET_NULL(gBattleResources); + FREE_AND_SET_NULL(gLinkBattleSendBuffer); FREE_AND_SET_NULL(gLinkBattleRecvBuffer); - FREE_AND_SET_NULL(gBattleAnimMons_BgTilesBuffer); - FREE_AND_SET_NULL(gBattleAnimMons_BgTilemapBuffer); + + FREE_AND_SET_NULL(gBattleAnimBgTileBuffer); + FREE_AND_SET_NULL(gBattleAnimBgTilemapBuffer); } } void AdjustFriendshipOnBattleFaint(u8 battlerId) { - u8 opposingBattlerId, opposingBattlerId2; + u8 opposingBattlerId; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { + u8 opposingBattlerId2; + opposingBattlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); opposingBattlerId2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + if (gBattleMons[opposingBattlerId2].level > gBattleMons[opposingBattlerId].level) opposingBattlerId = opposingBattlerId2; } @@ -82,6 +93,7 @@ void AdjustFriendshipOnBattleFaint(u8 battlerId) { opposingBattlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); } + if (gBattleMons[opposingBattlerId].level > gBattleMons[battlerId].level) { if (gBattleMons[opposingBattlerId].level - gBattleMons[battlerId].level > 29) diff --git a/src/mail_data.c b/src/mail_data.c index bb5fa6581..9bff74b6d 100644 --- a/src/mail_data.c +++ b/src/mail_data.c @@ -5,6 +5,8 @@ #include "constants/items.h" #include "pokemon_icon.h" +#define UNOWN_OFFSET 30000 + void ClearMailData(void) { u8 i; @@ -73,7 +75,7 @@ u8 GiveMailToMon(struct Pokemon *mon, u16 itemId) u16 SpeciesToMailSpecies(u16 species, u32 personality) { if (species == SPECIES_UNOWN) { - u32 mailSpecies = GetUnownLetterByPersonality(personality) + 30000; + u32 mailSpecies = GetUnownLetterByPersonality(personality) + UNOWN_OFFSET; return mailSpecies; } return species; @@ -83,10 +85,10 @@ u16 MailSpeciesToSpecies(u16 mailSpecies, u16 *unownLetter) { u16 result; - if (mailSpecies >= 30000 && mailSpecies < (30000 + UNOWN_FORM_COUNT)) + if (mailSpecies >= UNOWN_OFFSET && mailSpecies < (UNOWN_OFFSET + NUM_UNOWN_FORMS)) { result = SPECIES_UNOWN; - *unownLetter = mailSpecies - 30000; + *unownLetter = mailSpecies - UNOWN_OFFSET; } else { diff --git a/src/pokedex_screen.c b/src/pokedex_screen.c index 764d3c770..17f29ac13 100644 --- a/src/pokedex_screen.c +++ b/src/pokedex_screen.c @@ -797,7 +797,7 @@ const u8 (*const sCategoryPageIconCoords[])[4] = { sPageIconCoords_4Mons, }; -static const u8 * const sDexCategoryNamePtrs[] = { +static const u8 *const sDexCategoryNamePtrs[] = { gText_DexCategory_GrasslandPkmn, gText_DexCategory_ForestPkmn, gText_DexCategory_WatersEdgePkmn, diff --git a/src/pokemon.c b/src/pokemon.c index e2bfb20cf..070b7bbb7 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1856,7 +1856,7 @@ void CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, { u32 personality; - if ((u8)(unownLetter - 1) < 28) + if ((u8)(unownLetter - 1) < NUM_UNOWN_FORMS) { u16 actualLetter; @@ -3919,7 +3919,7 @@ static void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex) *hpSwitchout = gBattleMons[battlerId].hp; for (i = 0; i < 8; i++) - gBattleMons[battlerId].statStages[i] = 6; + gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE; gBattleMons[battlerId].status2 = 0; UpdateSentPokesToOpponentValue(battlerId); diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index fa3731083..0b510f5e8 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -626,14 +626,14 @@ static const u32 sBgTilemap_MovesPage[] = INCBIN_U32( "graphics/interface/pokesu #include "data/text/nature_names.h" -static const u8 * const sEggHatchTimeTexts[] = { +static const u8 *const sEggHatchTimeTexts[] = { gText_PokeSum_EggHatch_LongTime, gText_PokeSum_EggHatch_SomeTime, gText_PokeSum_EggHatch_Soon, gText_PokeSum_EggHatch_AlmostReady }; -static const u8 * const sEggOriginTexts[] = { +static const u8 *const sEggOriginTexts[] = { gText_PokeSum_EggOrigin_DayCare, gText_PokeSum_EggOrigin_Trade, gText_PokeSum_EggOrigin_TravelingMan, diff --git a/src/rom_header_gf.c b/src/rom_header_gf.c index 9b7975c72..ee6dffcbd 100644 --- a/src/rom_header_gf.c +++ b/src/rom_header_gf.c @@ -16,7 +16,7 @@ struct GFRomHeader const struct CompressedSpriteSheet * monBackPics; const struct CompressedSpritePalette * monNormalPalettes; const struct CompressedSpritePalette * monShinyPalettes; - const u8 * const * monIcons; + const u8 *const * monIcons; const u8 * monIconPaletteIds; const struct SpritePalette * monIconPalettes; const u8 (* monSpeciesNames)[]; @@ -63,7 +63,7 @@ struct GFRomHeader u32 unk18; const struct BaseStats * baseStats; const u8 (* abilityNames)[]; - const u8 * const * abilityDescriptions; + const u8 *const * abilityDescriptions; const struct Item * items; const struct BattleMove * moves; const struct CompressedSpriteSheet * ballGfx;