diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index d57d95ffcd..0504a85ea4 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1007,7 +1007,7 @@ .4byte \jumpInstr .endm - .macro unused_bb + .macro tryhealingitem .byte 0xbb .endm @@ -1140,9 +1140,8 @@ .4byte \failInstr .endm - .macro trywish turnNumber:req, failInstr:req + .macro trywish failInstr:req .byte 0xd4 - .byte \turnNumber .4byte \failInstr .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index f4ef3b8274..474bbe09ec 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -410,12 +410,12 @@ BattleScript_MoveEffectSaltCure:: return BattleScript_SaltCureExtraDamage:: - playanimation BS_TARGET, B_ANIM_SALT_CURE_DAMAGE, NULL + playanimation BS_ATTACKER, B_ANIM_SALT_CURE_DAMAGE, NULL waitanimation call BattleScript_HurtTarget_NoString printstring STRINGID_TARGETISHURTBYSALTCURE waitmessage B_WAIT_TIME_LONG - tryfaintmon BS_TARGET + tryfaintmon BS_ATTACKER end2 BattleScript_HurtTarget_NoString: @@ -5044,7 +5044,7 @@ BattleScript_EffectWish:: attackcanceler attackstring ppreduce - trywish 0, BattleScript_ButItFailed + trywish BattleScript_ButItFailed attackanimation waitanimation goto BattleScript_MoveEnd @@ -5842,13 +5842,13 @@ BattleScript_FogEnded_Ret:: return BattleScript_IceBodyHeal:: - call BattleScript_AbilityPopUpScripting - playanimation BS_SCRIPTING, B_ANIM_SIMPLE_HEAL - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING + call BattleScript_AbilityPopUp + playanimation BS_ATTACKER, B_ANIM_SIMPLE_HEAL + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER printstring STRINGID_ICEBODYHPGAIN waitmessage B_WAIT_TIME_LONG - end2 + end3 BattleScript_OverworldStatusStarts:: printfromtable gStartingStatusStringIds @@ -6674,7 +6674,6 @@ BattleScript_SelectingNotAllowedCurrentMoveInPalace:: goto BattleScript_SelectingUnusableMoveInPalace BattleScript_WishComesTrue:: - trywish 1, BattleScript_WishButFullHp playanimation BS_TARGET, B_ANIM_WISH_HEAL printstring STRINGID_PKMNWISHCAMETRUE waitmessage B_WAIT_TIME_LONG @@ -6993,7 +6992,7 @@ BattleScript_CudChewActivates:: pause B_WAIT_TIME_SHORTEST call BattleScript_AbilityPopUp setbyte sBERRY_OVERRIDE, 1 @ override the requirements for eating berries - consumeberry BS_SCRIPTING, FALSE + consumeberry BS_ATTACKER, FALSE setbyte sBERRY_OVERRIDE, 0 end3 @@ -7145,6 +7144,7 @@ BattleScript_DoTurnDmg: datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER checkteamslost BattleScript_DoTurnDmgEnd + tryhealingitem BattleScript_DoTurnDmgEnd: end2 @@ -7608,6 +7608,37 @@ BattleScript_EmergencyExitWildNoPopUp:: finishaction return +BattleScript_EmergencyExitEnd2:: + pause 5 + call BattleScript_AbilityPopUp + pause B_WAIT_TIME_LONG + playanimation BS_ATTACKER, B_ANIM_SLIDE_OFFSCREEN + waitanimation + openpartyscreen BS_ATTACKER, BattleScript_EmergencyExitRetEnd2 + switchoutabilities BS_ATTACKER + waitstate + switchhandleorder BS_ATTACKER, 2 + returntoball BS_TARGET, FALSE + getswitchedmondata BS_ATTACKER + switchindataupdate BS_ATTACKER + hpthresholds BS_ATTACKER + printstring STRINGID_SWITCHINMON + switchinanim BS_ATTACKER, FALSE, TRUE + waitstate + switchineffects BS_ATTACKER +BattleScript_EmergencyExitRetEnd2: + end2 + +BattleScript_EmergencyExitWildEnd2:: + pause 5 + call BattleScript_AbilityPopUp + pause B_WAIT_TIME_LONG + playanimation BS_ATTACKER, B_ANIM_SLIDE_OFFSCREEN + waitanimation + setoutcomeonteleport BS_ATTACKER + finishaction + end2 + BattleScript_TraceActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUpScripting @@ -7650,6 +7681,7 @@ BattleScript_PickupActivates:: call BattleScript_AbilityPopUp printstring STRINGID_XFOUNDONEY waitmessage B_WAIT_TIME_LONG + tryhealingitem BattleScript_PickupActivatesEnd: end3 @@ -7659,6 +7691,7 @@ BattleScript_HarvestActivates:: call BattleScript_AbilityPopUp printstring STRINGID_HARVESTBERRY waitmessage B_WAIT_TIME_LONG + tryhealingitem BattleScript_HarvestActivatesEnd: end3 @@ -9937,7 +9970,7 @@ BattleScript_DynamaxBegins:: BattleScript_DynamaxEnds:: flushtextbox updatedynamax - playanimation BS_SCRIPTING, B_ANIM_FORM_CHANGE + playanimation BS_ATTACKER, B_ANIM_FORM_CHANGE waitanimation end2 diff --git a/endturneffect_bak.c b/endturneffect_bak.c new file mode 100644 index 0000000000..c28ea3fcfe --- /dev/null +++ b/endturneffect_bak.c @@ -0,0 +1,23 @@ +bool32 HandleWishPerishSongOnTurnEnd(void) +{ + gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); + + if ((gBattleTypeFlags & BATTLE_TYPE_ARENA) + && gBattleStruct->arenaTurnCounter == 2 + && IsBattlerAlive(B_POSITION_PLAYER_LEFT) && IsBattlerAlive(B_POSITION_OPPONENT_LEFT)) + { + s32 i; + + // This seems to be a bug? + for (i = 0; i < 2; i++) + CancelMultiTurnMoves(i); + + gBattlescriptCurrInstr = BattleScript_ArenaDoJudgment; + BattleScriptExecute(BattleScript_ArenaDoJudgment); + return TRUE; + } + + gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); + + return FALSE; +} diff --git a/include/battle.h b/include/battle.h index e417d176b8..68a0367106 100644 --- a/include/battle.h +++ b/include/battle.h @@ -104,7 +104,7 @@ struct DisableStruct u8 telekinesisTimer; u8 healBlockTimer; u8 laserFocusTimer; - u8 throatChopTimer; + u16 throatChopTimer; u8 wrapTurns; u8 syrupBombTimer; u8 tormentTimer:4; // used for G-Max Meltdown @@ -647,9 +647,9 @@ struct BattlerState struct BattleStruct { struct BattlerState battlerState[MAX_BATTLERS_COUNT]; - u8 turnEffectsTracker; + u8 eventBlockCounter; u8 turnEffectsBattlerId; - u8 turnCountersTracker; + u8 endTurnEventsCounter; u16 wrappedMove[MAX_BATTLERS_COUNT]; u16 moveTarget[MAX_BATTLERS_COUNT]; u32 expShareExpValue; @@ -721,8 +721,6 @@ struct BattleStruct struct LinkBattlerHeader linkBattlerHeader; struct BattleVideo battleVideo; } multiBuffer; - u8 wishPerishSongState; - u8 wishPerishSongBattlerId; u8 startingStatus:6; // status to apply at battle start. defined in constants/battle.h u8 startingStatusDone:1; u8 terrainDone:1; diff --git a/include/battle_end_turn.h b/include/battle_end_turn.h new file mode 100644 index 0000000000..577d1ab615 --- /dev/null +++ b/include/battle_end_turn.h @@ -0,0 +1,6 @@ +#ifndef GUARD_BATTLE_END_TURN +#define GUARD_BATTLE_END_TURN + +u32 DoEndTurnEffects(void); + +#endif // GUARD_BATTLE_END_TURN \ No newline at end of file diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 7326647d41..c13ba806ed 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -42,7 +42,7 @@ bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget); bool32 CanParalyzeType(u8 battlerAttacker, u8 battlerTarget); bool32 CanUseLastResort(u8 battlerId); u32 IsFlowerVeilProtected(u32 battler); -u32 IsLeafGuardProtected(u32 battler); +u32 IsLeafGuardProtected(u32 battler, u32 ability); bool32 IsShieldsDownProtected(u32 battler); u32 IsAbilityStatusProtected(u32 battler); bool32 TryResetBattlerStatChanges(u8 battler); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 5b02c4a225..e77b0a2193 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -101,6 +101,7 @@ extern const u8 BattleScript_SelectingTormentedMoveInPalace[]; extern const u8 BattleScript_SelectingNotAllowedMoveTaunt[]; extern const u8 BattleScript_MoveUsedIsTaunted[]; extern const u8 BattleScript_SelectingNotAllowedMoveTauntInPalace[]; +extern const u8 BattleScript_WishButFullHp[]; extern const u8 BattleScript_WishComesTrue[]; extern const u8 BattleScript_IngrainTurnHeal[]; extern const u8 BattleScript_AtkDefDown[]; @@ -387,6 +388,8 @@ extern const u8 BattleScript_EmergencyExit[]; extern const u8 BattleScript_EmergencyExitNoPopUp[]; extern const u8 BattleScript_EmergencyExitWild[]; extern const u8 BattleScript_EmergencyExitWildNoPopUp[]; +extern const u8 BattleScript_EmergencyExitEnd2[]; +extern const u8 BattleScript_EmergencyExitWildEnd2[]; extern const u8 BattleScript_CheekPouchActivates[]; extern const u8 BattleScript_TotemVar[]; extern const u8 BattleScript_TotemFlaredToLife[]; diff --git a/include/battle_util.h b/include/battle_util.h index 0dd0d9ce81..94f5c08833 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -73,6 +73,7 @@ enum ItemCaseId ITEMEFFECT_ON_SWITCH_IN, ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN, ITEMEFFECT_NORMAL, + ITEMEFFECT_TRY_HEALING, ITEMEFFECT_MOVE_END, ITEMEFFECT_KINGSROCK, ITEMEFFECT_TARGET, @@ -174,6 +175,8 @@ enum SleepClauseBlock }; void HandleAction_ThrowBall(void); +u32 GetCurrentBattleWeather(void); +u32 EndOrConinueWeather(void); bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move); void HandleAction_UseMove(void); void HandleAction_Switch(void); @@ -206,10 +209,8 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler); u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check); bool32 AreAllMovesUnusable(u32 battler); u8 GetImprisonedMovesCount(u32 battler, u16 move); -u8 DoFieldEndTurnEffects(void); s32 GetDrainedBigRootHp(u32 battler, s32 hp); -u8 DoBattlerEndTurnEffects(void); -bool32 HandleWishPerishSongOnTurnEnd(void); +u32 DoEndTurnEffects(void); bool32 HandleFaintedMonActions(void); void TryClearRageAndFuryCutter(void); u32 AtkCanceller_MoveSuccessOrder(void); @@ -327,6 +328,7 @@ bool32 CanBeConfused(u32 battler); bool32 IsBattlerTerrainAffected(u32 battler, u32 terrainFlag); u32 GetBattlerAffectionHearts(u32 battler); void TryToRevertMimicryAndFlags(void); +bool32 BattleArenaTurnEnd(void); u32 CountBattlerStatIncreases(u32 battler, bool32 countEvasionAcc); bool32 ChangeTypeBasedOnTerrain(u32 battler); void RemoveConfusionStatus(u32 battler); diff --git a/include/config/general.h b/include/config/general.h index cff1432bb7..bd34106832 100644 --- a/include/config/general.h +++ b/include/config/general.h @@ -6,7 +6,7 @@ // still has them in the ROM. This is because the developers forgot // to define NDEBUG before release, however this has been changed as // Ruby's actual debug build does not use the AGBPrint features. -#define NDEBUG +// #define NDEBUG // To enable printf debugging, comment out "#define NDEBUG". This allows // the various AGBPrint functions to be used. (See include/gba/isagbprint.h). diff --git a/include/constants/battle.h b/include/constants/battle.h index 7f09e7f89b..1093c14230 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -533,9 +533,6 @@ enum BattleWeather #define HANDLE_TYPE_PRIMAL_REVERSION 1 #define HANDLE_TYPE_ULTRA_BURST 2 -// Constants for Torment -#define PERMANENT_TORMENT 0xF - // Constants for B_VAR_STARTING_STATUS // Timer value controlled by B_VAR_STARTING_STATUS_TIMER enum StartingStatus diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 24f60ecfde..6625aab010 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1058,7 +1058,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // the following checks apply to any target (including user) // throat chop check - if (gDisableStructs[battlerAtk].throatChopTimer && IsSoundMove(move)) + if (gDisableStructs[battlerAtk].throatChopTimer > gBattleTurnCounter && IsSoundMove(move)) return 0; // Can't even select move at all // heal block check if (gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK && IsHealBlockPreventingMove(battlerAtk, move)) @@ -2463,7 +2463,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_EMBARGO: if (aiData->abilities[battlerDef] == ABILITY_KLUTZ || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM - || gDisableStructs[battlerDef].embargoTimer != 0 + || gStatuses3[battlerDef] & STATUS3_EMBARGO || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; @@ -2481,7 +2481,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_HEAL_BLOCK: - if (gDisableStructs[battlerDef].healBlockTimer != 0 + if (gStatuses3[battlerDef] & STATUS3_HEAL_BLOCK || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index cae562bf4e..e741bbfdbd 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -178,7 +178,7 @@ void ActivateDynamax(u32 battler) // Set appropriate use flags. SetActiveGimmick(battler, GIMMICK_DYNAMAX); SetGimmickAsActivated(battler, GIMMICK_DYNAMAX); - gBattleStruct->dynamax.dynamaxTurns[battler] = DYNAMAX_TURNS_COUNT; + gBattleStruct->dynamax.dynamaxTurns[battler] = gBattleTurnCounter + DYNAMAX_TURNS_COUNT; // Substitute is removed upon Dynamaxing. gBattleMons[battler].status2 &= ~STATUS2_SUBSTITUTE; @@ -212,7 +212,6 @@ void UndoDynamax(u32 battler) // Makes sure there are no Dynamax flags set, including on switch / faint. SetActiveGimmick(battler, GIMMICK_NONE); - gBattleStruct->dynamax.dynamaxTurns[battler] = 0; // Undo form change if needed. if (IsGigantamaxed(battler)) @@ -511,13 +510,12 @@ static u32 GetMaxMoveStatusEffect(u32 move) void BS_UpdateDynamax(void) { NATIVE_ARGS(); - u32 battler = gBattleScripting.battler; - struct Pokemon *mon = GetPartyBattlerData(battler); + struct Pokemon *mon = GetPartyBattlerData(gBattlerAttacker); - if (!IsGigantamaxed(battler)) // RecalcBattlerStats will get called on form change. - RecalcBattlerStats(battler, mon, GetActiveGimmick(battler) == GIMMICK_DYNAMAX); + if (!IsGigantamaxed(gBattlerAttacker)) // RecalcBattlerStats will get called on form change. + RecalcBattlerStats(gBattlerAttacker, mon, GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX); - UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], mon, HEALTHBOX_ALL); + UpdateHealthboxAttribute(gHealthboxSpriteIds[gBattlerAttacker], mon, HEALTHBOX_ALL); gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c new file mode 100644 index 0000000000..8c147c3840 --- /dev/null +++ b/src/battle_end_turn.c @@ -0,0 +1,1422 @@ +#include "global.h" +#include "battle.h" +#include "battle_util.h" +#include "battle_controllers.h" +#include "battle_ai_util.h" +#include "battle_gimmick.h" +#include "battle_scripts.h" +#include "constants/battle.h" +#include "constants/battle_string_ids.h" +#include "constants/hold_effects.h" +#include "constants/abilities.h" +#include "constants/items.h" +#include "constants/moves.h" + +enum EndTurnResolutionOrder +{ + ENDTURN_ORDER, + ENDTURN_VARIOUS, + ENDTURN_WEATHER, + ENDTURN_WEATHER_DAMAGE, + ENDTURN_EMERGENCY_EXIT_1, + ENDTURN_AFFECTION, + ENDTURN_FUTURE_SIGHT, + ENDTURN_WISH, + ENDTURN_FIRST_EVENT_BLOCK, + ENDTURN_EMERGENCY_EXIT_2, + ENDTURN_AQUA_RING, + ENDTURN_INGRAIN, + ENDTURN_LEECH_SEED, + ENDTURN_POISON, + ENDTURN_BURN, + ENDTURN_FROSTBITE, + ENDTURN_NIGHTMARE, + ENDTURN_CURSE, + ENDTURN_WRAP, + ENDTURN_SALT_CURE, + ENDTURN_OCTOLOCK, + ENDTURN_SYRUP_BOMB, + ENDTURN_TAUNT, + ENDTURN_TORMENT, + ENDTURN_ENCORE, + ENDTURN_DISABLE, + ENDTURN_MAGNET_RISE, + ENDTURN_TELEKINESIS, + ENDTURN_HEAL_BLOCK, + ENDTURN_EMBARGO, + ENDTURN_YAWN, + ENDTURN_PERISH_SONG, + ENDTURN_ROOST, + ENDTURN_EMERGENCY_EXIT_3, + ENDTURN_SECOND_EVENT_BLOCK, + ENDTURN_TRICK_ROOM, + ENDTURN_GRAVITY, + ENDTURN_WATER_SPORT, + ENDTURN_MUD_SPORT, + ENDTURN_WONDER_ROOM, + ENDTURN_MAGIC_ROOM, + ENDTURN_TERRAIN, + ENDTURN_THIRD_EVENT_BLOCK, + ENDTURN_EMERGENCY_EXIT_4, + ENDTURN_ABILITIES, + ENDTURN_FOURTH_EVENT_BLOCK, + ENDTURN_DYNAMAX, + ENDTURN_COUNT, +}; + +enum FirstEventBlock +{ + FIRST_EVENT_BLOCK_GMAX_MOVE_RESIDUAL, + FIRST_EVENT_BLOCK_SEA_OF_FIRE_DAMAGE, + FIRST_EVENT_BLOCK_THRASH, + FIRST_EVENT_BLOCK_GRASSY_TERRAIN_HEAL, + FIRST_EVENT_BLOCK_ABILITIES, + FIRST_EVENT_BLOCK_HEAL_ITEMS, +}; + +enum SecondEventBlock +{ + SECOND_EVENT_BLOCK_REFLECT, + SECOND_EVENT_BLOCK_LIGHT_SCREEN, + SECOND_EVENT_BLOCK_SAFEGUARD, + SECOND_EVENT_BLOCK_MIST, + SECOND_EVENT_BLOCK_TAILWIND, + SECOND_EVENT_BLOCK_LUCKY_CHANT, + SECOND_EVENT_BLOCK_RAINBOW, + SECOND_EVENT_BLOCK_SEA_OF_FIRE, + SECOND_EVENT_BLOCK_SWAMP, + SECOND_EVENT_BLOCK_AURORA_VEIL, +}; + +enum ThirdEventBlock +{ + THIRD_EVENT_BLOCK_UPROAR, + THIRD_EVENT_BLOCK_ABILITIES, + THIRD_EVENT_BLOCK_ITEMS, +}; + +enum FourthEventBlock +{ + FOURTH_EVENT_BLOCK_HUNGER_SWITCH, + FOURTH_EVENT_BLOCK_EJECT_PACK, +}; + +static inline bool32 IsBattlerProtectedByMagicGuard(u32 battler, u32 ability) +{ + if (ability != ABILITY_MAGIC_GUARD) + return FALSE; + + RecordAbilityBattle(battler, ability); + return TRUE; +} + +static void HandleEndTurnOrder(u32 battler, u32 *effect) +{ + gBattleTurnCounter++; + gBattleStruct->endTurnEventsCounter++; + + u32 i, j; + for (i = 0; i < gBattlersCount; i++) + { + gBattlerByTurnOrder[i] = i; + } + for (i = 0; i < gBattlersCount - 1; i++) + { + for (j = i + 1; j < gBattlersCount; j++) + { + if (GetWhichBattlerFaster(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], FALSE) == -1) + SwapTurnOrder(i, j); + } + } +} + +static void HandleEndTurnVarious(u32 battler, u32 *effect) +{ + u32 i; + gBattleStruct->endTurnEventsCounter++; + + if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK && gFieldTimers.fairyLockTimer == gBattleTurnCounter) + gFieldStatuses &= ~STATUS_FIELD_FAIRY_LOCK; + + for (i = 0; i < NUM_BATTLE_SIDES; i++) + { + if (gSideStatuses[i] & SIDE_STATUS_DAMAGE_NON_TYPES && gSideTimers[i].damageNonTypesTimer == gBattleTurnCounter) + gSideStatuses[i] &= ~SIDE_STATUS_DAMAGE_NON_TYPES; + } + + for (i = 0; i < gBattlersCount; i++) + { + if (gStatuses3[i] & STATUS3_ALWAYS_HITS) + gStatuses3[i] -= STATUS3_ALWAYS_HITS_TURN(1); + + if (gDisableStructs[i].chargeTimer && --gDisableStructs[i].chargeTimer == 0) + gStatuses3[i] &= ~STATUS3_CHARGED_UP; + + if (gStatuses3[i] & STATUS3_LASER_FOCUS && gDisableStructs[i].laserFocusTimer == gBattleTurnCounter) + gStatuses3[i] &= ~STATUS3_LASER_FOCUS; + + gBattleStruct->hpBefore[i] = gBattleMons[i].hp; + } +} + +static void HandleEndTurnWeather(u32 battler, u32 *effect) +{ + gBattleStruct->endTurnEventsCounter++; + *effect = EndOrConinueWeather(); +} + +static void HandleEndTurnWeatherDamage(u32 battler, u32 *effect) +{ + u32 ability = GetBattlerAbility(battler); + u32 currBattleWeather = 0xFF; + + if (currBattleWeather == 0xFF) + { + gBattleStruct->turnEffectsBattlerId = 0; + gBattleStruct->endTurnEventsCounter++; // If there is no weather on the field, no need to check other battlers so go to next state + return; + } + + gBattleStruct->turnEffectsBattlerId++; + + if (!IsBattlerAlive(battler) || !HasWeatherEffect()) + return; + + currBattleWeather = GetCurrentBattleWeather(); + + switch (currBattleWeather) + { + case BATTLE_WEATHER_FOG: + case BATTLE_WEATHER_STRONG_WINDS: + break; + case BATTLE_WEATHER_RAIN: + case BATTLE_WEATHER_RAIN_PRIMAL: + case BATTLE_WEATHER_RAIN_DOWNPOUR: + if (ability == ABILITY_DRY_SKIN || ability == ABILITY_RAIN_DISH) + { + if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) + *effect = 1; + } + break; + case BATTLE_WEATHER_SUN: + case BATTLE_WEATHER_SUN_PRIMAL: + if (ability == ABILITY_DRY_SKIN) + { + if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) + *effect = 1; + } + break; + case BATTLE_WEATHER_SANDSTORM: + if (ability != ABILITY_SAND_VEIL + && ability != ABILITY_SAND_FORCE + && ability != ABILITY_SAND_RUSH + && ability != ABILITY_OVERCOAT + && !IS_BATTLER_ANY_TYPE(gBattlerAttacker, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) + && !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) + && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES + && !IsBattlerProtectedByMagicGuard(battler, ability)) + { + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SANDSTORM; + BattleScriptExecute(BattleScript_DamagingWeather); + *effect = 1; + } + break; + case BATTLE_WEATHER_HAIL: + case BATTLE_WEATHER_SNOW: + if (ability == ABILITY_ICE_BODY) + { + if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) + *effect = 1; + } + else if (currBattleWeather == BATTLE_WEATHER_HAIL) + { + if (ability != ABILITY_SNOW_CLOAK + && ability != ABILITY_OVERCOAT + && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE) + && !(gStatuses3[battler] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) + && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES + && !IsBattlerProtectedByMagicGuard(battler, ability)) + { + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_HAIL; + BattleScriptExecute(BattleScript_DamagingWeather); + *effect = 1; + } + } + break; + } +} + +static void HandleEndTurnEmergencyExit(u32 battler, u32 *effect) +{ + u32 ability = GetBattlerAbility(battler); + + gBattleStruct->turnEffectsBattlerId++; + + if (ability == ABILITY_EMERGENCY_EXIT || ability == ABILITY_WIMP_OUT) + { + u32 cutoff = gBattleMons[battler].maxHP / 2; + bool32 HadMoreThanHalfHpNowDoesnt = gBattleStruct->hpBefore[battler] > cutoff && gBattleMons[battler].hp <= cutoff; + + if (HadMoreThanHalfHpNowDoesnt + && IsBattlerAlive(battler) + && (CanBattlerSwitch(battler) || !(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) + && !(gBattleTypeFlags & BATTLE_TYPE_ARENA) + && CountUsablePartyMons(battler) > 0 + && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) // Not currently held by Sky Drop + { + gBattlerAbility = battler; + gLastUsedAbility = ability; + + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER || GetBattlerSide(battler) == B_SIDE_PLAYER) + BattleScriptExecute(BattleScript_EmergencyExitEnd2); + else + BattleScriptExecute(BattleScript_EmergencyExitWildEnd2); + + *effect = 1; + } + } +} + +static void HandleEndTurnAffection(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (!B_AFFECTION_MECHANICS + || !IsBattlerAlive(battler) + || GetBattlerSide(battler) != B_SIDE_PLAYER) + return; + + if (GetBattlerAffectionHearts(gBattlerAttacker) >= AFFECTION_FOUR_HEARTS && (Random() % 100 < 20)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + BattleScriptExecute(BattleScript_AffectionBasedStatusHeal); + *effect = 1; + } +} + +// Note: Technically Future Sight, Doom Desire and Wish need a queue but +// I think we should accept this slight inconsistency so custom moves don't have to touch this code +static void HandleEndTurnFutureSight(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gWishFutureKnock.futureSightCounter[battler] == gBattleTurnCounter) + { + struct Pokemon *party; + + if (gWishFutureKnock.futureSightCounter[battler] == gBattleTurnCounter + && gWishFutureKnock.futureSightCounter[BATTLE_PARTNER(battler)] <= gBattleTurnCounter) + { + gSideStatuses[GetBattlerSide(battler)] &= ~SIDE_STATUS_FUTUREATTACK; + } + + if (!IsBattlerAlive(battler)) + return; + + if (gWishFutureKnock.futureSightMove[battler] == MOVE_FUTURE_SIGHT) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FUTURE_SIGHT; + else + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE; + + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gWishFutureKnock.futureSightMove[battler]); + + gBattlerTarget = battler; + gBattlerAttacker = gWishFutureKnock.futureSightBattlerIndex[battler]; + gCurrentMove = gWishFutureKnock.futureSightMove[battler]; + + party = GetSideParty(GetBattlerSide(gBattlerAttacker)); + if (&party[gWishFutureKnock.futureSightPartyIndex[gBattlerTarget]] == &party[gBattlerPartyIndexes[gBattlerAttacker]]) + SetTypeBeforeUsingMove(gCurrentMove, gBattlerAttacker); + + BattleScriptExecute(BattleScript_MonTookFutureAttack); + *effect = 1; + } +} + +static void HandleEndTurnWish(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gWishFutureKnock.wishCounter[battler] == gBattleTurnCounter && IsBattlerAlive(battler)) + { + gBattlerTarget = battler; + PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, battler, gWishFutureKnock.wishPartyId[battler]) + if (B_WISH_HP_SOURCE >= GEN_5) + { + if (GetBattlerSide(battler) == B_SIDE_PLAYER) + gBattleStruct->moveDamage[battler] = max(1, GetMonData(&gPlayerParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2); + else + gBattleStruct->moveDamage[battler] = max(1, GetMonData(&gEnemyParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2); + } + else + { + gBattleStruct->moveDamage[battler] = max(1, GetNonDynamaxMaxHP(battler) / 2); + } + + gBattleStruct->moveDamage[battler] *= -1; + if (gBattleMons[battler].hp == gBattleMons[battler].maxHP) + BattleScriptExecute(BattleScript_WishButFullHp); + else + BattleScriptExecute(BattleScript_WishComesTrue); + + *effect = 1; + } +} + +static void HandleEndTurnFirstEventBlock(u32 battler, u32 *effect) +{ + u32 side; + + switch (gBattleStruct->eventBlockCounter) + { + case FIRST_EVENT_BLOCK_GMAX_MOVE_RESIDUAL: // TODO: Needs a queue + side = GetBattlerSide(battler); + if (gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES) + { + if (IsBattlerAlive(battler) + && !IS_BATTLER_OF_TYPE(battler, gSideTimers[side].damageNonTypesType) + && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + { + gBattlerAttacker = battler; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 6; + ChooseDamageNonTypesString(gSideTimers[side].damageNonTypesType); + BattleScriptExecute(BattleScript_DamageNonTypesContinues); + *effect = 1; + } + } + gBattleStruct->eventBlockCounter++; + break; + case FIRST_EVENT_BLOCK_SEA_OF_FIRE_DAMAGE: + if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SEA_OF_FIRE && IsBattlerAlive(battler)) + { + gBattlerAttacker = battler; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; + BtlController_EmitStatusAnimation(battler, BUFFER_A, FALSE, STATUS1_BURN); + MarkBattlerForControllerExec(battler); + BattleScriptExecute(BattleScript_HurtByTheSeaOfFire); + *effect = 1; + } + gBattleStruct->eventBlockCounter++; + break; + case FIRST_EVENT_BLOCK_THRASH: // TODO: Move to moveend + if (gBattleMons[battler].status2 & STATUS2_LOCK_CONFUSE && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) + { + gBattleMons[battler].status2 -= STATUS2_LOCK_CONFUSE_TURN(1); + if (WasUnableToUseMove(battler)) + { + CancelMultiTurnMoves(battler); + } + else if (!(gBattleMons[battler].status2 & STATUS2_LOCK_CONFUSE) && (gBattleMons[battler].status2 & STATUS2_MULTIPLETURNS)) + { + gBattleMons[battler].status2 &= ~STATUS2_MULTIPLETURNS; + if (!(gBattleMons[battler].status2 & STATUS2_CONFUSION)) + { + gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER; + SetMoveEffect(TRUE, FALSE); + if (gBattleMons[battler].status2 & STATUS2_CONFUSION) + BattleScriptExecute(BattleScript_ThrashConfuses); + *effect = 1; + } + } + } + gBattleStruct->eventBlockCounter++; + break; + case FIRST_EVENT_BLOCK_GRASSY_TERRAIN_HEAL: + if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && IsBattlerAlive(battler) && !IsBattlerAtMaxHp(battler)) + { + gBattlerAttacker = battler; + gBattleStruct->moveDamage[battler] = -(GetNonDynamaxMaxHP(battler) / 16); + BattleScriptExecute(BattleScript_GrassyTerrainHeals); + *effect = 1; + } + gBattleStruct->eventBlockCounter++; + break; + case FIRST_EVENT_BLOCK_ABILITIES: + { + u32 ability = GetBattlerAbility(battler); + switch (ability) + { + case ABILITY_HEALER: + case ABILITY_HYDRATION: + case ABILITY_SHED_SKIN: + if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) + *effect = 1; + break; + } + gBattleStruct->eventBlockCounter++; + break; + } + case FIRST_EVENT_BLOCK_HEAL_ITEMS: + { + u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); + switch (holdEffect) + { + case HOLD_EFFECT_LEFTOVERS: + case HOLD_EFFECT_BLACK_SLUDGE: + if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) + *effect = 1; + break; + } + gBattleStruct->eventBlockCounter = 0; + gBattleStruct->turnEffectsBattlerId++; + break; + } + } +} + +static void HandleEndTurnAquaRing(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gStatuses3[battler] & STATUS3_AQUA_RING + && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) + && !IsBattlerAtMaxHp(battler) + && IsBattlerAlive(battler)) + { + gBattleStruct->moveDamage[battler] = GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16); + BattleScriptExecute(BattleScript_AquaRingHeal); + *effect = 1; + } +} + +static void HandleEndTurnIngrain(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gStatuses3[battler] & STATUS3_ROOTED + && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) + && !IsBattlerAtMaxHp(battler) + && IsBattlerAlive(battler)) + { + gBattleStruct->moveDamage[battler] = GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16); + BattleScriptExecute(BattleScript_IngrainTurnHeal); + *effect = 1; + } +} + +static void HandleEndTurnLeechSeed(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gStatuses3[battler] & STATUS3_LEECHSEED + && IsBattlerAlive(gStatuses3[battler] & STATUS3_LEECHSEED_BATTLER) + && IsBattlerAlive(battler) + && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + { + gBattlerTarget = gStatuses3[battler] & STATUS3_LEECHSEED_BATTLER; // Notice gBattlerTarget is actually the HP receiver. + gBattleScripting.animArg1 = gBattlerTarget; + gBattleScripting.animArg2 = gBattlerAttacker; + gBattleStruct->moveDamage[gBattlerAttacker] = max(1, GetNonDynamaxMaxHP(battler) / 8); + gBattleStruct->moveDamage[gBattlerTarget] = GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerAttacker]); + gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE; + if (GetBattlerAbility(battler) == ABILITY_LIQUID_OOZE) + { + gBattleStruct->moveDamage[gBattlerTarget] = gBattleStruct->moveDamage[gBattlerTarget] * -1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_OOZE; + BattleScriptExecute(BattleScript_LeechSeedTurnDrainLiquidOoze); + } + else if (gStatuses3[gBattlerTarget] & STATUS3_HEAL_BLOCK) + { + BattleScriptExecute(BattleScript_LeechSeedTurnDrainHealBlock); + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_DRAIN; + BattleScriptExecute(BattleScript_LeechSeedTurnDrainRecovery); + } + *effect = 1; + } +} + +static void HandleEndTurnPoison(u32 battler, u32 *effect) +{ + u32 ability = GetBattlerAbility(battler); + + gBattleStruct->turnEffectsBattlerId++; + + if ((gBattleMons[battler].status1 & STATUS1_POISON || gBattleMons[battler].status1 & STATUS1_TOXIC_POISON) + && IsBattlerAlive(battler) + && !IsBattlerProtectedByMagicGuard(battler, ability)) + { + if (ability == ABILITY_POISON_HEAL) + { + if (!IsBattlerAtMaxHp(battler) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) + { + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleStruct->moveDamage[battler] *= -1; + BattleScriptExecute(BattleScript_PoisonHealActivates); + *effect = 1; + } + } + else if (gBattleMons[battler].status1 & STATUS1_TOXIC_POISON) + { + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + if ((gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_TURN(15)) // not 16 turns + gBattleMons[battler].status1 += STATUS1_TOXIC_TURN(1); + gBattleStruct->moveDamage[battler] *= (gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) >> 8; + BattleScriptExecute(BattleScript_PoisonTurnDmg); + *effect = 1; + } + else + { + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + BattleScriptExecute(BattleScript_PoisonTurnDmg); + *effect = 1; + } + } +} + +static void HandleEndTurnBurn(u32 battler, u32 *effect) +{ + u32 ability = GetBattlerAbility(battler); + + gBattleStruct->turnEffectsBattlerId++; + + if (gBattleMons[battler].status1 & STATUS1_BURN + && IsBattlerAlive(battler) + && !IsBattlerProtectedByMagicGuard(battler, ability)) + { + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); + if (ability == ABILITY_HEATPROOF) + { + if (gBattleStruct->moveDamage[battler] > (gBattleStruct->moveDamage[battler] / 2) + 1) // Record ability if the burn takes less damage than it normally would. + RecordAbilityBattle(battler, ABILITY_HEATPROOF); + gBattleStruct->moveDamage[battler] /= 2; + } + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + BattleScriptExecute(BattleScript_BurnTurnDmg); + *effect = 1; + } +} + +static void HandleEndTurnFrostbite(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gBattleMons[battler].status1 & STATUS1_FROSTBITE + && IsBattlerAlive(battler) + && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + { + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + BattleScriptExecute(BattleScript_FrostbiteTurnDmg); + *effect = 1; + } +} + +static void HandleEndTurnNightmare(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gBattleMons[battler].status2 & STATUS2_NIGHTMARE + && IsBattlerAlive(battler) + && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + { + if (gBattleMons[battler].status1 & STATUS1_SLEEP) + { + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + BattleScriptExecute(BattleScript_NightmareTurnDmg); + *effect = 1; + } + else + { + gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; + } + } +} + +static void HandleEndTurnCurse(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gBattleMons[battler].status2 & STATUS2_CURSED + && IsBattlerAlive(battler) + && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + { + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + BattleScriptExecute(BattleScript_CurseTurnDmg); + *effect = 1; + } +} + +static void HandleEndTurnWrap(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gBattleMons[battler].status2 & STATUS2_WRAPPED && IsBattlerAlive(battler)) + { + if (--gDisableStructs[battler].wrapTurns != 0 && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + { + gBattleScripting.animArg1 = gBattleStruct->wrappedMove[battler]; + gBattleScripting.animArg2 = gBattleStruct->wrappedMove[battler] >> 8; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[battler]); + BattleScriptExecute(BattleScript_WrapTurnDmg); + if (GetBattlerHoldEffect(gBattleStruct->wrappedBy[battler], TRUE) == HOLD_EFFECT_BINDING_BAND) + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); + else + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16); + + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + } + else // broke free + { + gBattleMons[battler].status2 &= ~STATUS2_WRAPPED; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[battler]); + BattleScriptExecute(BattleScript_WrapEnds); + } + *effect = 1; + } +} + +static void HandleEndTurnSaltCure(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gStatuses4[battler] & STATUS4_SALT_CURE + && IsBattlerAlive(battler) + && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + { + if (IS_BATTLER_ANY_TYPE(battler, TYPE_STEEL, TYPE_WATER)) + gBattleStruct->moveDamage[battler] = gBattleMons[battler].maxHP / 4; + else + gBattleStruct->moveDamage[battler] = gBattleMons[battler].maxHP / 8; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SALT_CURE); + BattleScriptExecute(BattleScript_SaltCureExtraDamage); + *effect = 1; + } +} + +static void HandleEndTurnOctolock(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gDisableStructs[battler].octolock) + { + gBattlerTarget = battler; + gBattlerAttacker = gDisableStructs[battler].battlerPreventingEscape; + BattleScriptExecute(BattleScript_OctolockEndTurn); + *effect = 1; + } +} + +static void HandleEndTurnSyrupBomb(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if ((gStatuses4[battler] & STATUS4_SYRUP_BOMB) && (IsBattlerAlive(battler))) + { + if (gDisableStructs[battler].syrupBombTimer > 0 && --gDisableStructs[battler].syrupBombTimer == 0) + gStatuses4[battler] &= ~STATUS4_SYRUP_BOMB; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SYRUP_BOMB); + gBattlescriptCurrInstr = BattleScript_SyrupBombEndTurn; + BattleScriptExecute(gBattlescriptCurrInstr); + *effect = 1; + } +} + +static void HandleEndTurnTaunt(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gDisableStructs[battler].tauntTimer && --gDisableStructs[battler].tauntTimer == 0) + { + BattleScriptExecute(BattleScript_BufferEndTurn); + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT); + *effect = 1; + } +} + +static void HandleEndTurnTorment(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gDisableStructs[battler].tormentTimer > 0 && --gDisableStructs[battler].tormentTimer == 0) + { + gBattleMons[battler].status2 &= ~STATUS2_TORMENT; + BattleScriptExecute(BattleScript_TormentEnds); + *effect = 1; + } +} + +static void HandleEndTurnEncore(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gDisableStructs[battler].encoreTimer != 0) + { + if (gBattleMons[battler].moves[gDisableStructs[battler].encoredMovePos] != gDisableStructs[battler].encoredMove) // Pokémon does not have the encored move anymore + { + gDisableStructs[battler].encoredMove = 0; + gDisableStructs[battler].encoreTimer = 0; + } + else if (--gDisableStructs[battler].encoreTimer == 0 + || gBattleMons[battler].pp[gDisableStructs[battler].encoredMovePos] == 0) + { + gDisableStructs[battler].encoredMove = 0; + gDisableStructs[battler].encoreTimer = 0; + BattleScriptExecute(BattleScript_EncoredNoMore); + *effect = 1; + } + } +} + +static void HandleEndTurnDisable(u32 battler, u32 *effect) +{ + u32 moveIndex = 0; + gBattleStruct->turnEffectsBattlerId++; + + if (gDisableStructs[battler].disableTimer != 0) + { + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (gDisableStructs[battler].disabledMove == gBattleMons[battler].moves[moveIndex]) + break; + } + if (moveIndex == MAX_MON_MOVES) // Pokémon does not have the disabled move anymore + { + gDisableStructs[battler].disabledMove = 0; + gDisableStructs[battler].disableTimer = 0; + } + else if (--gDisableStructs[battler].disableTimer == 0) // disable ends + { + gDisableStructs[battler].disabledMove = 0; + BattleScriptExecute(BattleScript_DisabledNoMore); + *effect = 1; + } + } +} + +static void HandleEndTurnMagnetRise(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gStatuses3[battler] & STATUS3_MAGNET_RISE && gDisableStructs[battler].magnetRiseTimer == gBattleTurnCounter) + { + gStatuses3[battler] &= ~STATUS3_MAGNET_RISE; + BattleScriptExecute(BattleScript_BufferEndTurn); + PREPARE_STRING_BUFFER(gBattleTextBuff1, STRINGID_ELECTROMAGNETISM); + *effect = 1; + } +} + +static void HandleEndTurnTelekinesis(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gStatuses3[battler] & STATUS3_TELEKINESIS && gDisableStructs[battler].telekinesisTimer == gBattleTurnCounter) + { + gStatuses3[battler] &= ~STATUS3_TELEKINESIS; + BattleScriptExecute(BattleScript_TelekinesisEndTurn); + *effect = 1; + } +} + +static void HandleEndTurnHealBlock(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gStatuses3[battler] & STATUS3_HEAL_BLOCK && gDisableStructs[battler].healBlockTimer == gBattleTurnCounter) + { + gStatuses3[battler] &= ~STATUS3_HEAL_BLOCK; + BattleScriptExecute(BattleScript_BufferEndTurn); + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_HEAL_BLOCK); + *effect = 1; + } +} + +static void HandleEndTurnEmbargo(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gStatuses3[battler] & STATUS3_EMBARGO && gDisableStructs[battler].embargoTimer == gBattleTurnCounter) + { + gStatuses3[battler] &= ~STATUS3_EMBARGO; + BattleScriptExecute(BattleScript_EmbargoEndTurn); + *effect = 1; + } +} + +static void HandleEndTurnYawn(u32 battler, u32 *effect) +{ + u32 ability = GetBattlerAbility(battler); + + gBattleStruct->turnEffectsBattlerId++; + + if (gStatuses3[battler] & STATUS3_YAWN) + { + gStatuses3[battler] -= STATUS3_YAWN_TURN(1); + if (!(gStatuses3[battler] & STATUS3_YAWN) && !(gBattleMons[battler].status1 & STATUS1_ANY) + && ability != ABILITY_VITAL_SPIRIT + && ability != ABILITY_INSOMNIA + && !UproarWakeUpCheck(battler) + && !IsLeafGuardProtected(battler, ability)) + { + CancelMultiTurnMoves(battler); + gEffectBattler = gBattlerTarget = battler; + if (IsBattlerTerrainAffected(battler, STATUS_FIELD_ELECTRIC_TERRAIN)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAINPREVENTS_ELECTRIC; + BattleScriptExecute(BattleScript_TerrainPreventsEnd2); + } + else if (IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAINPREVENTS_MISTY; + BattleScriptExecute(BattleScript_TerrainPreventsEnd2); + } + else if (IsSleepClauseActiveForSide(GetBattlerSide(battler))) + { + BattleScriptExecute(BattleScript_SleepClausePreventsEnd); + } + else + { + if (B_SLEEP_TURNS >= GEN_5) + gBattleMons[battler].status1 |= ((Random() % 3) + 2); + else + gBattleMons[battler].status1 |= ((Random() % 4) + 3); + + TryActivateSleepClause(battler, gBattlerPartyIndexes[battler]); + BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); + MarkBattlerForControllerExec(battler); + BattleScriptExecute(BattleScript_YawnMakesAsleep); + } + *effect = 1; + } + } +} + +static void HandleEndTurnPerishSong(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (IsBattlerAlive(battler) && gStatuses3[battler] & STATUS3_PERISH_SONG) + { + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[battler].perishSongTimer); + if (gDisableStructs[battler].perishSongTimer == 0) + { + gStatuses3[battler] &= ~STATUS3_PERISH_SONG; + gBattleStruct->moveDamage[battler] = gBattleMons[battler].hp; + BattleScriptExecute(BattleScript_PerishSongTakesLife); + } + else + { + gDisableStructs[battler].perishSongTimer--; + BattleScriptExecute(BattleScript_PerishSongCountGoesDown); + } + *effect = 1; + } +} + +static void HandleEndTurnRoost(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (gDisableStructs[battler].roostActive) + gDisableStructs[battler].roostActive = FALSE; +} + +static void HandleEndTurnSecondEventBlock(u32 battler, u32 *effect) +{ + u32 side = gBattleStruct->turnSideTracker; + + switch (gBattleStruct->eventBlockCounter) + { + case SECOND_EVENT_BLOCK_REFLECT: + if (gSideStatuses[side] & SIDE_STATUS_REFLECT && gSideTimers[side].reflectTimer == gBattleTurnCounter) + { + gBattlerAttacker = gSideTimers[side].reflectBattlerId; + gSideStatuses[side] &= ~SIDE_STATUS_REFLECT; + BattleScriptExecute(BattleScript_SideStatusWoreOff); + gBattleCommunication[MULTISTRING_CHOOSER] = side; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_REFLECT); + *effect = 1; + } + gBattleStruct->eventBlockCounter++; + break; + case SECOND_EVENT_BLOCK_LIGHT_SCREEN: + if (gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN && gSideTimers[side].lightscreenTimer == gBattleTurnCounter) + { + gBattlerAttacker = gSideTimers[side].lightscreenBattlerId; + gSideStatuses[side] &= ~SIDE_STATUS_LIGHTSCREEN; + BattleScriptExecute(BattleScript_SideStatusWoreOff); + gBattleCommunication[MULTISTRING_CHOOSER] = side; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_LIGHT_SCREEN); + *effect = 1; + } + gBattleStruct->eventBlockCounter++; + break; + case SECOND_EVENT_BLOCK_SAFEGUARD: + if (gSideStatuses[side] & SIDE_STATUS_SAFEGUARD && gSideTimers[side].safeguardTimer == gBattleTurnCounter) + { + gBattlerAttacker = gSideTimers[side].safeguardBattlerId; + gSideStatuses[side] &= ~SIDE_STATUS_SAFEGUARD; + BattleScriptExecute(BattleScript_SafeguardEnds); + *effect = 1; + } + gBattleStruct->eventBlockCounter++; + break; + case SECOND_EVENT_BLOCK_MIST: + if (gSideTimers[side].mistTimer != 0 && gSideTimers[side].mistTimer == gBattleTurnCounter) + { + gBattlerAttacker = gSideTimers[side].mistBattlerId; + gSideStatuses[side] &= ~SIDE_STATUS_MIST; + BattleScriptExecute(BattleScript_SideStatusWoreOff); + gBattleCommunication[MULTISTRING_CHOOSER] = side; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_MIST); + *effect = 1; + } + gBattleStruct->eventBlockCounter++; + break; + case SECOND_EVENT_BLOCK_TAILWIND: + if (gSideStatuses[side] & SIDE_STATUS_TAILWIND && gSideTimers[side].tailwindTimer == gBattleTurnCounter) + { + gBattlerAttacker = gSideTimers[side].tailwindBattlerId; + gSideStatuses[side] &= ~SIDE_STATUS_TAILWIND; + BattleScriptExecute(BattleScript_TailwindEnds); + *effect = 1; + } + gBattleStruct->eventBlockCounter++; + break; + case SECOND_EVENT_BLOCK_LUCKY_CHANT: + if (gSideStatuses[side] & SIDE_STATUS_LUCKY_CHANT && gSideTimers[side].luckyChantTimer == gBattleTurnCounter) + { + gBattlerAttacker = gSideTimers[side].luckyChantBattlerId; + gSideStatuses[side] &= ~SIDE_STATUS_LUCKY_CHANT; + BattleScriptExecute(BattleScript_LuckyChantEnds); + *effect = 1; + } + gBattleStruct->eventBlockCounter++; + break; + case SECOND_EVENT_BLOCK_RAINBOW: + if (gSideStatuses[side] & SIDE_STATUS_RAINBOW) + { + for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) + { + if (GetBattlerSide(gBattlerAttacker) == side) + break; + } + + if (gSideTimers[side].rainbowTimer == gBattleTurnCounter) + { + gSideStatuses[side] &= ~SIDE_STATUS_RAINBOW; + BattleScriptExecute(BattleScript_TheRainbowDisappeared); + *effect = 1; + } + } + gBattleStruct->eventBlockCounter++; + break; + case SECOND_EVENT_BLOCK_SEA_OF_FIRE: + if (gSideStatuses[side] & SIDE_STATUS_SEA_OF_FIRE) + { + for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) + { + if (GetBattlerSide(gBattlerAttacker) == side) + break; + } + + if (gSideTimers[side].seaOfFireTimer == gBattleTurnCounter) + { + gSideStatuses[side] &= ~SIDE_STATUS_SEA_OF_FIRE; + BattleScriptExecute(BattleScript_TheSeaOfFireDisappeared); + *effect = 1; + } + } + gBattleStruct->eventBlockCounter++; + break; + case SECOND_EVENT_BLOCK_SWAMP: + if (gSideStatuses[side] & SIDE_STATUS_SWAMP) + { + for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) + { + if (GetBattlerSide(gBattlerAttacker) == side) + break; + } + + if (gSideTimers[side].swampTimer == gBattleTurnCounter) + { + gSideStatuses[side] &= ~SIDE_STATUS_SWAMP; + BattleScriptExecute(BattleScript_TheSwampDisappeared); + *effect = 1; + } + } + gBattleStruct->eventBlockCounter++; + break; + case SECOND_EVENT_BLOCK_AURORA_VEIL: + if (gSideStatuses[side] & SIDE_STATUS_AURORA_VEIL && gSideTimers[side].auroraVeilTimer == gBattleTurnCounter) + { + gBattlerAttacker = gSideTimers[side].auroraVeilBattlerId; + gSideStatuses[side] &= ~SIDE_STATUS_AURORA_VEIL; + BattleScriptExecute(BattleScript_SideStatusWoreOff); + gBattleCommunication[MULTISTRING_CHOOSER] = side; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_AURORA_VEIL); + *effect = 1; + } + gBattleStruct->turnSideTracker++; + gBattleStruct->eventBlockCounter = 0; + break; + } +} + +static void HandleEndTurnTrickRoom(u32 battler, u32 *effect) +{ + gBattleStruct->endTurnEventsCounter++; + + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter) + { + gFieldStatuses &= ~STATUS_FIELD_TRICK_ROOM; + BattleScriptExecute(BattleScript_TrickRoomEnds); + *effect = 1; + } +} + +static void HandleEndTurnGravity(u32 battler, u32 *effect) +{ + gBattleStruct->endTurnEventsCounter++; + + if (gFieldStatuses & STATUS_FIELD_GRAVITY && gFieldTimers.gravityTimer == gBattleTurnCounter) + { + gFieldStatuses &= ~STATUS_FIELD_GRAVITY; + BattleScriptExecute(BattleScript_GravityEnds); + *effect = 1; + } +} + +static void HandleEndTurnWaterSport(u32 battler, u32 *effect) +{ + gBattleStruct->endTurnEventsCounter++; + + if (gFieldStatuses & STATUS_FIELD_WATERSPORT && gFieldTimers.waterSportTimer == gBattleTurnCounter) + { + gFieldStatuses &= ~STATUS_FIELD_WATERSPORT; + BattleScriptExecute(BattleScript_WaterSportEnds); + *effect = 1; + } +} + +static void HandleEndTurnMudSport(u32 battler, u32 *effect) +{ + gBattleStruct->endTurnEventsCounter++; + + if (gFieldStatuses & STATUS_FIELD_MUDSPORT && gFieldTimers.mudSportTimer == gBattleTurnCounter) + { + gFieldStatuses &= ~STATUS_FIELD_MUDSPORT; + BattleScriptExecute(BattleScript_MudSportEnds); + *effect = 1; + } +} + +static void HandleEndTurnWonderRoom(u32 battler, u32 *effect) +{ + gBattleStruct->endTurnEventsCounter++; + + if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM && gFieldTimers.wonderRoomTimer == gBattleTurnCounter) + { + gFieldStatuses &= ~STATUS_FIELD_WONDER_ROOM; + BattleScriptExecute(BattleScript_WonderRoomEnds); + *effect = 1; + } +} + +static void HandleEndTurnMagicRoom(u32 battler, u32 *effect) +{ + gBattleStruct->endTurnEventsCounter++; + + if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM && gFieldTimers.magicRoomTimer == gBattleTurnCounter) + { + gFieldStatuses &= ~STATUS_FIELD_MAGIC_ROOM; + BattleScriptExecute(BattleScript_MagicRoomEnds); + *effect = 1; + } +} + +static u32 EndTurnTerrain(u32 terrainFlag, u32 stringTableId) +{ + if (gFieldStatuses & terrainFlag && gFieldTimers.terrainTimer == gBattleTurnCounter) + { + gFieldStatuses &= ~terrainFlag; + TryToRevertMimicryAndFlags(); + gBattleCommunication[MULTISTRING_CHOOSER] = stringTableId; + BattleScriptExecute(BattleScript_TerrainEnds); + return 1; + } + + return 0; +} + +static void HandleEndTurnTerrain(u32 battler, u32 *effect) +{ + gBattleStruct->endTurnEventsCounter++; + + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) + *effect = EndTurnTerrain(STATUS_FIELD_ELECTRIC_TERRAIN, B_MSG_TERRAIN_END_ELECTRIC); + else if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN) + *effect = EndTurnTerrain(STATUS_FIELD_MISTY_TERRAIN, B_MSG_TERRAIN_END_MISTY); + else if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN) + *effect = EndTurnTerrain(STATUS_FIELD_GRASSY_TERRAIN, B_MSG_TERRAIN_END_GRASSY); + else if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN) + *effect = EndTurnTerrain(STATUS_FIELD_PSYCHIC_TERRAIN, B_MSG_TERRAIN_END_PSYCHIC); +} + +static void HandleEndTurnThirdEventBlock(u32 battler, u32 *effect) +{ + if (!IsBattlerAlive(battler)) + { + gBattleStruct->turnEffectsBattlerId++; + return; + } + + switch (gBattleStruct->eventBlockCounter) + { + case THIRD_EVENT_BLOCK_UPROAR: + if (gBattleMons[battler].status2 & STATUS2_UPROAR) + { + for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) + { + if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) + && GetBattlerAbility(gBattlerAttacker) != ABILITY_SOUNDPROOF) + { + gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + BattleScriptExecute(BattleScript_MonWokeUpInUproar); + BtlController_EmitSetMonData(gBattlerAttacker, BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBattlerAttacker].status1); + MarkBattlerForControllerExec(gBattlerAttacker); + break; + } + } + if (gBattlerAttacker != gBattlersCount) + { + *effect = 2; // a Pokémon was awaken + break; + } + else + { + gBattlerAttacker = battler; + gBattleMons[battler].status2 -= STATUS2_UPROAR_TURN(1); // uproar timer goes down + if (WasUnableToUseMove(battler)) + { + CancelMultiTurnMoves(battler); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_ENDS; + } + else if (gBattleMons[battler].status2 & STATUS2_UPROAR) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_CONTINUES; + gBattleMons[battler].status2 |= STATUS2_MULTIPLETURNS; + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_ENDS; + CancelMultiTurnMoves(battler); + } + BattleScriptExecute(BattleScript_PrintUproarOverTurns); + *effect = 1; + } + } + gBattleStruct->eventBlockCounter++; + break; + case THIRD_EVENT_BLOCK_ABILITIES: + { + u32 ability = GetBattlerAbility(battler); + switch (ability) + { + case ABILITY_TRUANT: // Not fully accurate but it has to be handled somehow. TODO: Find a better way. + case ABILITY_CUD_CHEW: + case ABILITY_SLOW_START: + case ABILITY_BAD_DREAMS: + case ABILITY_BALL_FETCH: + case ABILITY_HARVEST: + case ABILITY_MOODY: + case ABILITY_PICKUP: + case ABILITY_SPEED_BOOST: + if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) + *effect = 1; + break; + } + gBattleStruct->eventBlockCounter++; + break; + } + case THIRD_EVENT_BLOCK_ITEMS: + { + u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); + switch (holdEffect) + { + case HOLD_EFFECT_FLAME_ORB: + case HOLD_EFFECT_STICKY_BARB: + case HOLD_EFFECT_TOXIC_ORB: + if (ItemBattleEffects(ITEMEFFECT_ORBS, battler, FALSE)) + *effect = 1; + break; + case HOLD_EFFECT_RESTORE_STATS: + if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) + *effect = 1; + break; + } + gBattleStruct->eventBlockCounter = 0; + gBattleStruct->turnEffectsBattlerId++; + break; + } + } +} + +static void HandleEndTurnAbilities(u32 battler, u32 *effect) +{ + u32 ability = GetBattlerAbility(battler); + + gBattleStruct->turnEffectsBattlerId++; + + switch (ability) + { + case ABILITY_POWER_CONSTRUCT: + case ABILITY_SCHOOLING: + case ABILITY_SHIELDS_DOWN: + case ABILITY_ZEN_MODE: + if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) + *effect = 1; + } +} + +static void HandleEndTurnFourthEventBlock(u32 battler, u32 *effect) +{ + switch (gBattleStruct->eventBlockCounter) + { + case FOURTH_EVENT_BLOCK_HUNGER_SWITCH: + { + u32 ability = GetBattlerAbility(battler); + if (ability == ABILITY_HUNGER_SWITCH) + { + if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) + *effect = 1; + } + gBattleStruct->eventBlockCounter++; + break; + } + case FOURTH_EVENT_BLOCK_EJECT_PACK: + { + u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); + if (holdEffect == HOLD_EFFECT_EJECT_PACK) + { + if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) + *effect = 1; + } + gBattleStruct->eventBlockCounter = 0; + gBattleStruct->turnEffectsBattlerId++; + break; + } + } +} + +static void HandleEndTurnDynamax(u32 battler, u32 *effect) +{ + gBattleStruct->turnEffectsBattlerId++; + + if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX && gBattleStruct->dynamax.dynamaxTurns[battler] == gBattleTurnCounter) + { + UndoDynamax(battler); + BattleScriptExecute(BattleScript_DynamaxEnds); + *effect = 1; + } +} + +static void (*const sEndTurnEffectHandlers[])(u32 battler, u32 *effect) = +{ + [ENDTURN_ORDER] = HandleEndTurnOrder, + [ENDTURN_VARIOUS] = HandleEndTurnVarious, + [ENDTURN_WEATHER] = HandleEndTurnWeather, + [ENDTURN_WEATHER_DAMAGE] = HandleEndTurnWeatherDamage, + [ENDTURN_EMERGENCY_EXIT_1] = HandleEndTurnEmergencyExit, + [ENDTURN_AFFECTION] = HandleEndTurnAffection, + [ENDTURN_FUTURE_SIGHT] = HandleEndTurnFutureSight, + [ENDTURN_WISH] = HandleEndTurnWish, + [ENDTURN_FIRST_EVENT_BLOCK] = HandleEndTurnFirstEventBlock, + [ENDTURN_EMERGENCY_EXIT_2] = HandleEndTurnEmergencyExit, + [ENDTURN_AQUA_RING] = HandleEndTurnAquaRing, + [ENDTURN_INGRAIN] = HandleEndTurnIngrain, + [ENDTURN_LEECH_SEED] = HandleEndTurnLeechSeed, + [ENDTURN_POISON] = HandleEndTurnPoison, + [ENDTURN_BURN] = HandleEndTurnBurn, + [ENDTURN_FROSTBITE] = HandleEndTurnFrostbite, + [ENDTURN_NIGHTMARE] = HandleEndTurnNightmare, + [ENDTURN_CURSE] = HandleEndTurnCurse, + [ENDTURN_WRAP] = HandleEndTurnWrap, + [ENDTURN_SALT_CURE] = HandleEndTurnSaltCure, + [ENDTURN_OCTOLOCK] = HandleEndTurnOctolock, + [ENDTURN_SYRUP_BOMB] = HandleEndTurnSyrupBomb, + [ENDTURN_TAUNT] = HandleEndTurnTaunt, + [ENDTURN_TORMENT] = HandleEndTurnTorment, + [ENDTURN_ENCORE] = HandleEndTurnEncore, + [ENDTURN_DISABLE] = HandleEndTurnDisable, + [ENDTURN_MAGNET_RISE] = HandleEndTurnMagnetRise, + [ENDTURN_TELEKINESIS] = HandleEndTurnTelekinesis, + [ENDTURN_HEAL_BLOCK] = HandleEndTurnHealBlock, + [ENDTURN_EMBARGO] = HandleEndTurnEmbargo, + [ENDTURN_YAWN] = HandleEndTurnYawn, + [ENDTURN_PERISH_SONG] = HandleEndTurnPerishSong, + [ENDTURN_ROOST] = HandleEndTurnRoost, + [ENDTURN_EMERGENCY_EXIT_3] = HandleEndTurnEmergencyExit, + [ENDTURN_SECOND_EVENT_BLOCK] = HandleEndTurnSecondEventBlock, + [ENDTURN_TRICK_ROOM] = HandleEndTurnTrickRoom, + [ENDTURN_GRAVITY] = HandleEndTurnGravity, + [ENDTURN_WATER_SPORT] = HandleEndTurnWaterSport, + [ENDTURN_MUD_SPORT] = HandleEndTurnMudSport, + [ENDTURN_WONDER_ROOM] = HandleEndTurnWonderRoom, + [ENDTURN_MAGIC_ROOM] = HandleEndTurnMagicRoom, + [ENDTURN_TERRAIN] = HandleEndTurnTerrain, + [ENDTURN_THIRD_EVENT_BLOCK] = HandleEndTurnThirdEventBlock, + [ENDTURN_EMERGENCY_EXIT_4] = HandleEndTurnEmergencyExit, + [ENDTURN_ABILITIES] = HandleEndTurnAbilities, + [ENDTURN_FOURTH_EVENT_BLOCK] = HandleEndTurnFourthEventBlock, + [ENDTURN_DYNAMAX] = HandleEndTurnDynamax, +}; + +u32 DoEndTurnEffects(void) +{ + u32 battler = MAX_BATTLERS_COUNT; + u32 effect = 0; + + gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); + + for (;;) + { + // If either turnEffectsBattlerId or turnSideTracker are at max count, reest values and go to the next state + if (gBattleStruct->turnEffectsBattlerId == gBattlersCount || gBattleStruct->turnSideTracker == NUM_BATTLE_SIDES) + { + gBattleStruct->turnEffectsBattlerId = 0; + gBattleStruct->turnSideTracker = 0; + gBattleStruct->eventBlockCounter = 0; + gBattleStruct->endTurnEventsCounter++; + } + + // Jump out if possible after endTurnEventsCounter was increased in the above code block + if (gBattleStruct->endTurnEventsCounter == ENDTURN_COUNT) + { + gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); + return FALSE; + } + + battler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->turnEffectsBattlerId]; + sEndTurnEffectHandlers[gBattleStruct->endTurnEventsCounter](battler, &effect); + + if (effect != 0) + return TRUE; + } +} diff --git a/src/battle_main.c b/src/battle_main.c index f47c54bcf5..e9f4c7ad07 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5,6 +5,7 @@ #include "battle_ai_util.h" #include "battle_arena.h" #include "battle_controllers.h" +#include "battle_end_turn.h" #include "battle_interface.h" #include "battle_main.h" #include "battle_message.h" @@ -3895,13 +3896,11 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleStruct->appearedInBattle |= 1u << gBattlerPartyIndexes[i]; } - *(&gBattleStruct->turnEffectsTracker) = 0; + *(&gBattleStruct->eventBlockCounter) = 0; *(&gBattleStruct->turnEffectsBattlerId) = 0; - *(&gBattleStruct->wishPerishSongState) = 0; - *(&gBattleStruct->wishPerishSongBattlerId) = 0; gBattleScripting.moveendState = 0; gBattleStruct->faintedActionsState = 0; - gBattleStruct->turnCountersTracker = 0; + gBattleStruct->endTurnEventsCounter = 0; memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts)); SetShellSideArmCategory(); @@ -3935,11 +3934,9 @@ static void HandleEndTurn_ContinueBattle(void) if ((gBattleMons[i].status1 & STATUS1_SLEEP) && (gBattleMons[i].status2 & STATUS2_MULTIPLETURNS)) CancelMultiTurnMoves(i); } - gBattleStruct->turnEffectsTracker = 0; + gBattleStruct->eventBlockCounter = 0; gBattleStruct->turnEffectsBattlerId = 0; - gBattleStruct->wishPerishSongState = 0; - gBattleStruct->wishPerishSongBattlerId = 0; - gBattleStruct->turnCountersTracker = 0; + gBattleStruct->endTurnEventsCounter = 0; } } @@ -3950,18 +3947,14 @@ void BattleTurnPassed(void) gBattleStruct->speedTieBreaks = RandomUniform(RNG_SPEED_TIE, 0, Factorial(MAX_BATTLERS_COUNT) - 1); TurnValuesCleanUp(TRUE); - if (gBattleOutcome == 0) - { - if (DoFieldEndTurnEffects()) - return; - if (DoBattlerEndTurnEffects()) - return; - if (HandleWishPerishSongOnTurnEnd()) - return; - } + if (gBattleOutcome == 0 && DoEndTurnEffects()) + return; + if (BattleArenaTurnEnd()) + return; if (HandleFaintedMonActions()) return; + gBattleStruct->faintedActionsState = 0; TurnValuesCleanUp(FALSE); @@ -3995,15 +3988,19 @@ void BattleTurnPassed(void) gChosenMoveByBattler[i] = MOVE_NONE; gBattleStruct->battlerState[i].absentBattlerFlags = gAbsentBattlerFlags & (1u << i); gBattleStruct->monToSwitchIntoId[i] = PARTY_SIZE; + gStatuses4[i] &= ~STATUS4_ELECTRIFIED; + gBattleMons[i].status2 &= ~STATUS2_FLINCHED; + gBattleMons[i].status2 &= ~STATUS2_POWDER; } for (i = 0; i < NUM_BATTLE_SIDES; i++) { if (gSideTimers[i].retaliateTimer > 0) gSideTimers[i].retaliateTimer--; - } + gFieldStatuses &= ~STATUS_FIELD_ION_DELUGE; + BattlePutTextOnWindow(gText_EmptyString3, B_WIN_MSG); AssignUsableGimmicks(); SetShellSideArmCategory(); diff --git a/src/battle_message.c b/src/battle_message.c index 1538aec1c9..c3d6501521 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -955,7 +955,8 @@ const u16 gTerrainPreventsStringIds[] = const u16 gHealingWishStringIds[] = { - STRINGID_HEALINGWISHCAMETRUE, STRINGID_LUNARDANCECAMETRUE + STRINGID_HEALINGWISHCAMETRUE, + STRINGID_LUNARDANCECAMETRUE }; const u16 gDmgHazardsStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 8bf9c8731c..a00bdd1b0c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -523,7 +523,7 @@ static void Cmd_presentdamagecalculation(void); static void Cmd_setsafeguard(void); static void Cmd_magnitudedamagecalculation(void); static void Cmd_jumpifnopursuitswitchdmg(void); -static void Cmd_unused_bb(void); +static void Cmd_tryhealingitem(void); static void Cmd_halvehp(void); static void Cmd_copyfoestats(void); static void Cmd_rapidspinfree(void); @@ -782,7 +782,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = Cmd_setsafeguard, //0xB8 Cmd_magnitudedamagecalculation, //0xB9 Cmd_jumpifnopursuitswitchdmg, //0xBA - Cmd_unused_bb, //0xBB + Cmd_tryhealingitem, //0xBB Cmd_halvehp, //0xBC Cmd_copyfoestats, //0xBD Cmd_rapidspinfree, //0xBE @@ -3935,7 +3935,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) } break; case MOVE_EFFECT_THROAT_CHOP: - gDisableStructs[gEffectBattler].throatChopTimer = 2; + gDisableStructs[gEffectBattler].throatChopTimer = gBattleTurnCounter + 2; gBattlescriptCurrInstr++; break; case MOVE_EFFECT_INCINERATE: @@ -4142,7 +4142,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) else if (!(gStatuses3[gEffectBattler] & STATUS3_HEAL_BLOCK)) { gStatuses3[gEffectBattler] |= STATUS3_HEAL_BLOCK; - gDisableStructs[gEffectBattler].healBlockTimer = 2; + gDisableStructs[gEffectBattler].healBlockTimer = gBattleTurnCounter + 2; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_EffectPsychicNoise; } @@ -7106,7 +7106,7 @@ static void Cmd_sethealblock(void) else { gStatuses3[gBattlerTarget] |= STATUS3_HEAL_BLOCK; - gDisableStructs[gBattlerTarget].healBlockTimer = 5; + gDisableStructs[gBattlerTarget].healBlockTimer = gBattleTurnCounter + 5; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -7760,6 +7760,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) else if ((gBattleStruct->battlerState[battler].storedHealingWish || gBattleStruct->battlerState[battler].storedLunarDance) && (gBattleMons[battler].hp != gBattleMons[battler].maxHP || gBattleMons[battler].status1 != 0 || B_HEALING_WISH_SWITCH < GEN_8)) { + gBattlerAttacker = battler; if (gBattleStruct->battlerState[battler].storedHealingWish) { BattleScriptPushCursor(); @@ -9320,10 +9321,10 @@ u32 IsFlowerVeilProtected(u32 battler) return 0; } -u32 IsLeafGuardProtected(u32 battler) +u32 IsLeafGuardProtected(u32 battler, u32 ability) { if (IsBattlerWeatherAffected(battler, B_WEATHER_SUN)) - return GetBattlerAbility(battler) == ABILITY_LEAF_GUARD; + return ability == ABILITY_LEAF_GUARD; else return 0; } @@ -9337,7 +9338,7 @@ bool32 IsShieldsDownProtected(u32 battler) u32 IsAbilityStatusProtected(u32 battler) { return IsFlowerVeilProtected(battler) - || IsLeafGuardProtected(battler) + || IsLeafGuardProtected(battler, GetBattlerAbility(battler)) || IsShieldsDownProtected(battler); } @@ -11169,7 +11170,7 @@ static void Cmd_various(void) case VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED: { VARIOUS_ARGS(const u8 *jumpInstr); - if (IsLeafGuardProtected(battler)) + if (IsLeafGuardProtected(battler, GetBattlerAbility(battler))) { gBattlerAbility = battler; gBattlescriptCurrInstr = cmd->jumpInstr; @@ -13896,7 +13897,7 @@ static void Cmd_setembargo(void) else { gStatuses3[gBattlerTarget] |= STATUS3_EMBARGO; - gDisableStructs[gBattlerTarget].embargoTimer = 5; + gDisableStructs[gBattlerTarget].embargoTimer = gBattleTurnCounter + 5; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -14073,8 +14074,18 @@ static void Cmd_jumpifnopursuitswitchdmg(void) } } -static void Cmd_unused_bb(void) +static void Cmd_tryhealingitem(void) { + CMD_ARGS(); + + if (gItemsInfo[gBattleMons[gBattlerAttacker].item].pocket == POCKET_BERRIES + || GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_RESTORE_HP) // Edge case for Berry Juice + { + if (ItemBattleEffects(ITEMEFFECT_TRY_HEALING, gBattlerAttacker, FALSE)) + return; + } + + gBattlescriptCurrInstr = cmd->nextInstr; } // Belly Drum, Fillet Away @@ -14528,7 +14539,6 @@ static void Cmd_settorment(void) else { gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT; - gDisableStructs[gBattlerTarget].tormentTimer = PERMANENT_TORMENT; // permanent gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -14736,43 +14746,17 @@ static void Cmd_trycopyability(void) static void Cmd_trywish(void) { - CMD_ARGS(u8 turnNumber, const u8 *failInstr); + CMD_ARGS(const u8 *failInstr); - switch (cmd->turnNumber) + if (gWishFutureKnock.wishCounter[gBattlerAttacker] <= gBattleTurnCounter) { - case 0: // use wish - if (gWishFutureKnock.wishCounter[gBattlerAttacker] <= gBattleTurnCounter) - { - gWishFutureKnock.wishCounter[gBattlerAttacker] = gBattleTurnCounter + 2; - gWishFutureKnock.wishPartyId[gBattlerAttacker] = gBattlerPartyIndexes[gBattlerAttacker]; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } - break; - case 1: // heal effect - PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerTarget, gWishFutureKnock.wishPartyId[gBattlerTarget]) - if (B_WISH_HP_SOURCE >= GEN_5) - { - if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) - gBattleStruct->moveDamage[gBattlerTarget] = max(1, GetMonData(&gPlayerParty[gWishFutureKnock.wishPartyId[gBattlerTarget]], MON_DATA_MAX_HP) / 2); - else - gBattleStruct->moveDamage[gBattlerTarget] = max(1, GetMonData(&gEnemyParty[gWishFutureKnock.wishPartyId[gBattlerTarget]], MON_DATA_MAX_HP) / 2); - } - else - { - gBattleStruct->moveDamage[gBattlerTarget] = max(1, GetNonDynamaxMaxHP(gBattlerAttacker) / 2); - } - - gBattleStruct->moveDamage[gBattlerTarget] *= -1; - if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) - gBattlescriptCurrInstr = cmd->failInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - - break; + gWishFutureKnock.wishCounter[gBattlerAttacker] = gBattleTurnCounter + 2; + gWishFutureKnock.wishPartyId[gBattlerAttacker] = gBattlerPartyIndexes[gBattlerAttacker]; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; } } @@ -15005,9 +14989,9 @@ static void Cmd_setuserstatus3(void) { gStatuses3[gBattlerAttacker] |= flags; if (flags & STATUS3_MAGNET_RISE) - gDisableStructs[gBattlerAttacker].magnetRiseTimer = 5; + gDisableStructs[gBattlerAttacker].magnetRiseTimer = gBattleTurnCounter + 5; if (flags & STATUS3_LASER_FOCUS) - gDisableStructs[gBattlerAttacker].laserFocusTimer = 2; + gDisableStructs[gBattlerAttacker].laserFocusTimer = gBattleTurnCounter + 2; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -16144,7 +16128,7 @@ static void Cmd_settelekinesis(void) else { gStatuses3[gBattlerTarget] |= STATUS3_TELEKINESIS; - gDisableStructs[gBattlerTarget].telekinesisTimer = 3; + gDisableStructs[gBattlerTarget].telekinesisTimer = gBattleTurnCounter + 3; gBattlescriptCurrInstr = cmd->nextInstr; } } diff --git a/src/battle_util.c b/src/battle_util.c index 42cfffc677..305a6025c8 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -97,7 +97,6 @@ static const u8 sPkblToEscapeFactor[][3] = { static const u8 sGoNearCounterToCatchFactor[] = {4, 3, 2, 1}; static const u8 sGoNearCounterToEscapeFactor[] = {4, 4, 4, 4}; - struct BattleWeatherInfo { u16 flag; @@ -200,6 +199,49 @@ static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = }, }; +u32 GetCurrentBattleWeather(void) +{ + u32 currBattleWeather = 0xFF; + + for (u32 weather = 0; weather < ARRAY_COUNT(sBattleWeatherInfo); weather++) + { + if (gBattleWeather & sBattleWeatherInfo[weather].flag) + { + currBattleWeather = weather; + break; + } + } + + return currBattleWeather; +} + +u32 EndOrConinueWeather(void) +{ + u32 currBattleWeather = GetCurrentBattleWeather(); + + if (currBattleWeather == 0xFF) + return 1; + + if (gWishFutureKnock.weatherDuration > 0 && --gWishFutureKnock.weatherDuration == 0) + { + gBattleWeather = B_WEATHER_NONE; + for (u32 battler = 0; battler < gBattlersCount; battler++) + gDisableStructs[battler].weatherAbilityDone = FALSE; + gBattleCommunication[MULTISTRING_CHOOSER] = sBattleWeatherInfo[currBattleWeather].endMessage; + BattleScriptExecute(BattleScript_WeatherFaded); + return 1; + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = sBattleWeatherInfo[currBattleWeather].continuesMessage; + gBattleScripting.animArg1 = sBattleWeatherInfo[currBattleWeather].animation; + BattleScriptExecute(BattleScript_WeatherContinues); + return 1; + } + + return 0; +} + static u8 CalcBeatUpPower(void) { u8 basePower; @@ -1016,7 +1058,7 @@ const u8* CancelMultiTurnMoves(u32 battler) // If target was sky dropped in the middle of Outrage/Thrash/Petal Dance, // confuse them upon release and display "confused by fatigue" message & animation. // Don't do this if this CancelMultiTurnMoves is caused by falling asleep via Yawn. - if (gBattleMons[otherSkyDropper].status2 & STATUS2_LOCK_CONFUSE && gBattleStruct->turnEffectsTracker != 24) + if (gBattleMons[otherSkyDropper].status2 & STATUS2_LOCK_CONFUSE && gBattleStruct->eventBlockCounter != 24) { gBattleMons[otherSkyDropper].status2 &= ~(STATUS2_LOCK_CONFUSE); @@ -1289,7 +1331,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[battler].throatChopTimer != 0 && IsSoundMove(move)) + if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[battler].throatChopTimer > gBattleTurnCounter && IsSoundMove(move)) { gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1529,7 +1571,7 @@ u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) else if (check & MOVE_LIMITATION_BELCH && IsBelchPreventingMove(battler, move)) unusableMoves |= 1u << i; // Throat Chop - else if (check & MOVE_LIMITATION_THROAT_CHOP && gDisableStructs[battler].throatChopTimer && IsSoundMove(move)) + else if (check & MOVE_LIMITATION_THROAT_CHOP && gDisableStructs[battler].throatChopTimer > gBattleTurnCounter && IsSoundMove(move)) unusableMoves |= 1u << i; // Stuff Cheeks else if (check & MOVE_LIMITATION_STUFF_CHEEKS && moveEffect == EFFECT_STUFF_CHEEKS && ItemId_GetPocket(gBattleMons[battler].item) != POCKET_BERRIES) @@ -1617,588 +1659,27 @@ void TryToRevertMimicryAndFlags(void) } } -enum +bool32 BattleArenaTurnEnd(void) { - ENDTURN_ORDER, - ENDTURN_REFLECT, - ENDTURN_LIGHT_SCREEN, - ENDTURN_AURORA_VEIL, - ENDTURN_MIST, - ENDTURN_LUCKY_CHANT, - ENDTURN_SAFEGUARD, - ENDTURN_TAILWIND, - ENDTURN_WISH, - ENDTURN_WEATHER, - ENDTURN_DAMAGE_NON_TYPES, - ENDTURN_GRAVITY, - ENDTURN_WATER_SPORT, - ENDTURN_MUD_SPORT, - ENDTURN_TRICK_ROOM, - ENDTURN_WONDER_ROOM, - ENDTURN_MAGIC_ROOM, - ENDTURN_ELECTRIC_TERRAIN, - ENDTURN_MISTY_TERRAIN, - ENDTURN_GRASSY_TERRAIN, - ENDTURN_PSYCHIC_TERRAIN, - ENDTURN_ION_DELUGE, - ENDTURN_FAIRY_LOCK, - ENDTURN_STATUS_HEAL, - ENDTURN_RAINBOW, - ENDTURN_SEA_OF_FIRE, - ENDTURN_SWAMP, - ENDTURN_FIELD_COUNT, -}; + gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); -static bool32 EndTurnTerrain(u32 terrainFlag, u32 stringTableId) -{ - if (gFieldStatuses & terrainFlag) + if ((gBattleTypeFlags & BATTLE_TYPE_ARENA) + && gBattleStruct->arenaTurnCounter == 2 + && IsBattlerAlive(B_POSITION_PLAYER_LEFT) && IsBattlerAlive(B_POSITION_OPPONENT_LEFT)) { - if (terrainFlag & STATUS_FIELD_GRASSY_TERRAIN) - BattleScriptExecute(BattleScript_GrassyTerrainHeals); - if (gFieldTimers.terrainTimer == gBattleTurnCounter) - { - gFieldStatuses &= ~terrainFlag; - TryToRevertMimicryAndFlags(); - gBattleCommunication[MULTISTRING_CHOOSER] = stringTableId; - if (terrainFlag & STATUS_FIELD_GRASSY_TERRAIN) - BattleScriptExecute(BattleScript_GrassyTerrainEnds); - else - BattleScriptExecute(BattleScript_TerrainEnds); - return TRUE; - } + for (u32 battler = 0; battler < 2; battler++) + CancelMultiTurnMoves(battler); + + gBattlescriptCurrInstr = BattleScript_ArenaDoJudgment; + BattleScriptExecute(BattleScript_ArenaDoJudgment); + return TRUE; } + + gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); + return FALSE; } -static bool32 TryEndTurnWeather(void) -{ - u32 i = 0; - u32 effect = 0; - u32 currBattleWeather = 0xFF; - - for (i = 0; i < ARRAY_COUNT(sBattleWeatherInfo); i++) - { - if (gBattleWeather & sBattleWeatherInfo[i].flag) - { - currBattleWeather = i; - break; - } - } - - if (currBattleWeather == 0xFF) - return effect; - - if (gWishFutureKnock.weatherDuration > 0 && --gWishFutureKnock.weatherDuration == 0) - { - gBattleWeather = B_WEATHER_NONE; - for (i = 0; i < gBattlersCount; i++) - gDisableStructs[i].weatherAbilityDone = FALSE; - gBattleCommunication[MULTISTRING_CHOOSER] = sBattleWeatherInfo[currBattleWeather].endMessage; - BattleScriptExecute(BattleScript_WeatherFaded); - effect++; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = sBattleWeatherInfo[currBattleWeather].continuesMessage; - gBattleScripting.animArg1 = sBattleWeatherInfo[currBattleWeather].animation; - BattleScriptExecute(BattleScript_WeatherContinues); - effect++; - } - - return effect; -} - -u8 DoFieldEndTurnEffects(void) -{ - u8 effect = 0; - - for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount && gAbsentBattlerFlags & (1u << gBattlerAttacker); gBattlerAttacker++) - { - } - for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount && gAbsentBattlerFlags & (1u << gBattlerTarget); gBattlerTarget++) - { - } - - do - { - s32 i; - u32 side; - - switch (gBattleStruct->turnCountersTracker) - { - case ENDTURN_ORDER: - for (i = 0; i < gBattlersCount - 1; i++) - { - s32 j; - for (j = i + 1; j < gBattlersCount; j++) - { - if (!(gProtectStructs[i].quash && gProtectStructs[j].quash) - && GetWhichBattlerFaster(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], FALSE) == -1) - SwapTurnOrder(i, j); - } - } - gBattleTurnCounter++; - gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; - // fall through - case ENDTURN_REFLECT: - while (gBattleStruct->turnSideTracker < 2) - { - side = gBattleStruct->turnSideTracker; - gBattlerAttacker = gSideTimers[side].reflectBattlerId; - if (gSideStatuses[side] & SIDE_STATUS_REFLECT) - { - if (gSideTimers[side].reflectTimer == gBattleTurnCounter) - { - gSideStatuses[side] &= ~SIDE_STATUS_REFLECT; - BattleScriptExecute(BattleScript_SideStatusWoreOff); - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_REFLECT); - effect++; - } - } - gBattleStruct->turnSideTracker++; - if (effect != 0) - break; - } - if (effect == 0) - { - gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; - } - break; - case ENDTURN_LIGHT_SCREEN: - while (gBattleStruct->turnSideTracker < 2) - { - side = gBattleStruct->turnSideTracker; - gBattlerAttacker = gSideTimers[side].lightscreenBattlerId; - if (gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN) - { - if (gSideTimers[side].lightscreenTimer == gBattleTurnCounter) - { - gSideStatuses[side] &= ~SIDE_STATUS_LIGHTSCREEN; - BattleScriptExecute(BattleScript_SideStatusWoreOff); - gBattleCommunication[MULTISTRING_CHOOSER] = side; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_LIGHT_SCREEN); - effect++; - } - } - gBattleStruct->turnSideTracker++; - if (effect != 0) - break; - } - if (effect == 0) - { - gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; - } - break; - case ENDTURN_AURORA_VEIL: - while (gBattleStruct->turnSideTracker < 2) - { - side = gBattleStruct->turnSideTracker; - gBattlerAttacker = gSideTimers[side].auroraVeilBattlerId; - if (gSideStatuses[side] & SIDE_STATUS_AURORA_VEIL) - { - if (gSideTimers[side].auroraVeilTimer == gBattleTurnCounter) - { - gSideStatuses[side] &= ~SIDE_STATUS_AURORA_VEIL; - BattleScriptExecute(BattleScript_SideStatusWoreOff); - gBattleCommunication[MULTISTRING_CHOOSER] = side; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_AURORA_VEIL); - effect++; - } - } - gBattleStruct->turnSideTracker++; - if (effect != 0) - break; - } - if (!effect) - { - gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; - } - break; - case ENDTURN_MIST: - while (gBattleStruct->turnSideTracker < 2) - { - side = gBattleStruct->turnSideTracker; - gBattlerAttacker = gSideTimers[side].mistBattlerId; - if (gSideTimers[side].mistTimer == gBattleTurnCounter) - { - gSideStatuses[side] &= ~SIDE_STATUS_MIST; - BattleScriptExecute(BattleScript_SideStatusWoreOff); - gBattleCommunication[MULTISTRING_CHOOSER] = side; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_MIST); - effect++; - } - gBattleStruct->turnSideTracker++; - if (effect != 0) - break; - } - if (effect == 0) - { - gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; - } - break; - case ENDTURN_SAFEGUARD: - while (gBattleStruct->turnSideTracker < 2) - { - side = gBattleStruct->turnSideTracker; - gBattlerAttacker = gSideTimers[side].safeguardBattlerId; - if (gSideStatuses[side] & SIDE_STATUS_SAFEGUARD) - { - if (gSideTimers[side].safeguardTimer == gBattleTurnCounter) - { - gSideStatuses[side] &= ~SIDE_STATUS_SAFEGUARD; - BattleScriptExecute(BattleScript_SafeguardEnds); - effect++; - } - } - gBattleStruct->turnSideTracker++; - if (effect != 0) - break; - } - if (effect == 0) - { - gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; - } - break; - case ENDTURN_LUCKY_CHANT: - while (gBattleStruct->turnSideTracker < 2) - { - side = gBattleStruct->turnSideTracker; - gBattlerAttacker = gSideTimers[side].luckyChantBattlerId; - if (gSideStatuses[side] & SIDE_STATUS_LUCKY_CHANT) - { - if (gSideTimers[side].luckyChantTimer == gBattleTurnCounter) - { - gSideStatuses[side] &= ~SIDE_STATUS_LUCKY_CHANT; - BattleScriptExecute(BattleScript_LuckyChantEnds); - effect++; - } - } - gBattleStruct->turnSideTracker++; - if (effect != 0) - break; - } - if (!effect) - { - gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; - } - break; - case ENDTURN_TAILWIND: - while (gBattleStruct->turnSideTracker < 2) - { - side = gBattleStruct->turnSideTracker; - gBattlerAttacker = gSideTimers[side].tailwindBattlerId; - if (gSideStatuses[side] & SIDE_STATUS_TAILWIND) - { - if (gSideTimers[side].tailwindTimer == gBattleTurnCounter) - { - gSideStatuses[side] &= ~SIDE_STATUS_TAILWIND; - BattleScriptExecute(BattleScript_TailwindEnds); - effect++; - } - } - gBattleStruct->turnSideTracker++; - if (effect != 0) - break; - } - if (!effect) - { - gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; - } - break; - case ENDTURN_WISH: - while (gBattleStruct->turnSideTracker < gBattlersCount) - { - u32 battler = gBattlerByTurnOrder[gBattleStruct->turnSideTracker]; - if (gWishFutureKnock.wishCounter[battler] == gBattleTurnCounter && IsBattlerAlive(battler)) - { - gBattlerTarget = battler; - BattleScriptExecute(BattleScript_WishComesTrue); - effect++; - } - gBattleStruct->turnSideTracker++; - if (effect != 0) - break; - } - if (effect == 0) - { - gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; - } - break; - case ENDTURN_WEATHER: - effect = TryEndTurnWeather(); - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_DAMAGE_NON_TYPES: - while (gBattleStruct->turnSideTracker < 2) - { - side = gBattleStruct->turnSideTracker; - if (gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES && gSideTimers[side].damageNonTypesTimer == gBattleTurnCounter) - { - // There is no in-game message when this side status ends. - gSideStatuses[side] &= ~SIDE_STATUS_DAMAGE_NON_TYPES; - effect++; - } - gBattleStruct->turnSideTracker++; - if (effect != 0) - break; - } - if (!effect) - { - gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; - } - break; - case ENDTURN_TRICK_ROOM: - if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter) - { - gFieldStatuses &= ~STATUS_FIELD_TRICK_ROOM; - BattleScriptExecute(BattleScript_TrickRoomEnds); - effect++; - } - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_WONDER_ROOM: - if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM && gFieldTimers.wonderRoomTimer == gBattleTurnCounter) - { - gFieldStatuses &= ~STATUS_FIELD_WONDER_ROOM; - BattleScriptExecute(BattleScript_WonderRoomEnds); - effect++; - } - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_MAGIC_ROOM: - if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM && gFieldTimers.magicRoomTimer == gBattleTurnCounter) - { - gFieldStatuses &= ~STATUS_FIELD_MAGIC_ROOM; - BattleScriptExecute(BattleScript_MagicRoomEnds); - effect++; - } - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_ELECTRIC_TERRAIN: - effect = EndTurnTerrain(STATUS_FIELD_ELECTRIC_TERRAIN, B_MSG_TERRAIN_END_ELECTRIC); - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_MISTY_TERRAIN: - effect = EndTurnTerrain(STATUS_FIELD_MISTY_TERRAIN, B_MSG_TERRAIN_END_MISTY); - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_GRASSY_TERRAIN: - effect = EndTurnTerrain(STATUS_FIELD_GRASSY_TERRAIN, B_MSG_TERRAIN_END_GRASSY); - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_PSYCHIC_TERRAIN: - effect = EndTurnTerrain(STATUS_FIELD_PSYCHIC_TERRAIN, B_MSG_TERRAIN_END_PSYCHIC); - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_WATER_SPORT: - if (gFieldStatuses & STATUS_FIELD_WATERSPORT && gFieldTimers.waterSportTimer == gBattleTurnCounter) - { - gFieldStatuses &= ~STATUS_FIELD_WATERSPORT; - BattleScriptExecute(BattleScript_WaterSportEnds); - effect++; - } - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_MUD_SPORT: - if (gFieldStatuses & STATUS_FIELD_MUDSPORT && gFieldTimers.mudSportTimer == gBattleTurnCounter) - { - gFieldStatuses &= ~STATUS_FIELD_MUDSPORT; - BattleScriptExecute(BattleScript_MudSportEnds); - effect++; - } - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_GRAVITY: - if (gFieldStatuses & STATUS_FIELD_GRAVITY && gFieldTimers.gravityTimer == gBattleTurnCounter) - { - gFieldStatuses &= ~STATUS_FIELD_GRAVITY; - BattleScriptExecute(BattleScript_GravityEnds); - effect++; - } - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_ION_DELUGE: - gFieldStatuses &= ~STATUS_FIELD_ION_DELUGE; - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_FAIRY_LOCK: - if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK && gFieldTimers.fairyLockTimer == gBattleTurnCounter) - { - gFieldStatuses &= ~STATUS_FIELD_FAIRY_LOCK; - } - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_STATUS_HEAL: - for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) - { - if (B_AFFECTION_MECHANICS == TRUE - && GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER - && GetBattlerAffectionHearts(gBattlerAttacker) >= AFFECTION_FOUR_HEARTS - && (Random() % 100 < 20)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - BattleScriptExecute(BattleScript_AffectionBasedStatusHeal); - break; - } - } - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_RAINBOW: - while (gBattleStruct->turnSideTracker < 2) - { - side = gBattleStruct->turnSideTracker; - if (gSideStatuses[side] & SIDE_STATUS_RAINBOW) - { - for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) - { - if (GetBattlerSide(gBattlerAttacker) == side) - break; - } - - if (gSideTimers[side].rainbowTimer == gBattleTurnCounter) - { - gSideStatuses[side] &= ~SIDE_STATUS_RAINBOW; - BattleScriptExecute(BattleScript_TheRainbowDisappeared); - effect++; - } - } - gBattleStruct->turnSideTracker++; - if (effect != 0) - break; - } - if (!effect) - { - gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; - } - break; - case ENDTURN_SEA_OF_FIRE: - while (gBattleStruct->turnSideTracker < 2) - { - side = gBattleStruct->turnSideTracker; - - if (gSideStatuses[side] & SIDE_STATUS_SEA_OF_FIRE) - { - for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) - { - if (GetBattlerSide(gBattlerAttacker) == side) - break; - } - - if (gSideTimers[side].seaOfFireTimer == gBattleTurnCounter) - { - gSideStatuses[side] &= ~SIDE_STATUS_SEA_OF_FIRE; - BattleScriptExecute(BattleScript_TheSeaOfFireDisappeared); - effect++; - } - } - gBattleStruct->turnSideTracker++; - if (effect != 0) - break; - } - if (!effect) - { - gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; - } - break; - case ENDTURN_SWAMP: - while (gBattleStruct->turnSideTracker < 2) - { - side = gBattleStruct->turnSideTracker; - - if (gSideStatuses[side] & SIDE_STATUS_SWAMP) - { - for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) - { - if (GetBattlerSide(gBattlerAttacker) == side) - break; - } - - if (gSideTimers[side].swampTimer == gBattleTurnCounter) - { - gSideStatuses[side] &= ~SIDE_STATUS_SWAMP; - BattleScriptExecute(BattleScript_TheSwampDisappeared); - effect++; - } - } - gBattleStruct->turnSideTracker++; - if (effect != 0) - break; - } - if (!effect) - { - gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; - } - break; - case ENDTURN_FIELD_COUNT: - effect++; - break; - } - } while (effect == 0); - - return (gBattleMainFunc != BattleTurnPassed); -} - -enum -{ - ENDTURN_WEATHER_DAMAGE, - ENDTURN_INGRAIN, - ENDTURN_AQUA_RING, - ENDTURN_ABILITIES, - ENDTURN_ITEMS1, - ENDTURN_LEECH_SEED, - ENDTURN_POISON, - ENDTURN_BAD_POISON, - ENDTURN_BURN, - ENDTURN_FROSTBITE, - ENDTURN_NIGHTMARES, - ENDTURN_CURSE, - ENDTURN_WRAP, - ENDTURN_OCTOLOCK, - ENDTURN_UPROAR, - ENDTURN_THRASH, - ENDTURN_FLINCH, - ENDTURN_DISABLE, - ENDTURN_ENCORE, - ENDTURN_MAGNET_RISE, - ENDTURN_TELEKINESIS, - ENDTURN_HEALBLOCK, - ENDTURN_EMBARGO, - ENDTURN_LOCK_ON, - ENDTURN_LASER_FOCUS, - ENDTURN_CHARGE, - ENDTURN_TAUNT, - ENDTURN_YAWN, - ENDTURN_ITEMS2, - ENDTURN_ORBS, - ENDTURN_ROOST, - ENDTURN_ELECTRIFY, - ENDTURN_POWDER, - ENDTURN_THROAT_CHOP, - ENDTURN_SLOW_START, - ENDTURN_CUD_CHEW, - ENDTURN_TORMENT, // supposedly this goes after Taunt, before Encore, but Encore is first right now? - ENDTURN_SALT_CURE, - ENDTURN_SYRUP_BOMB, - ENDTURN_DYNAMAX, - ENDTURN_GMAX_MOVE_RESIDUAL_DAMAGE, - ENDTURN_SEA_OF_FIRE_DAMAGE, - ENDTURN_ITEMS3, - ENDTURN_BATTLER_COUNT -}; - // Ingrain, Leech Seed, Strength Sap and Aqua Ring s32 GetDrainedBigRootHp(u32 battler, s32 hp) { @@ -2210,812 +1691,7 @@ s32 GetDrainedBigRootHp(u32 battler, s32 hp) return hp * -1; } -static inline bool32 IsBattlerProtectedByMagicGuard(u32 battler, u32 ability) -{ - if (ability != ABILITY_MAGIC_GUARD) - return FALSE; - - RecordAbilityBattle(battler, ability); - return TRUE; -} - -u8 DoBattlerEndTurnEffects(void) -{ - u32 battler, ability, i, effect = 0; - - gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); - while (gBattleStruct->turnEffectsBattlerId < gBattlersCount && gBattleStruct->turnEffectsTracker <= ENDTURN_BATTLER_COUNT) - { - battler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->turnEffectsBattlerId]; - if (gAbsentBattlerFlags & (1u << battler)) - { - gBattleStruct->turnEffectsBattlerId++; - continue; - } - - ability = GetBattlerAbility(battler); - switch (gBattleStruct->turnEffectsTracker) - { - case ENDTURN_WEATHER_DAMAGE: - ability = GetBattlerAbility(battler); - if (!IsBattlerAlive(battler) || !HasWeatherEffect() || ability == ABILITY_MAGIC_GUARD) - { - gBattleStruct->turnEffectsTracker++; - break; - } - else if (gBattleWeather & B_WEATHER_SANDSTORM - && ability != ABILITY_SAND_VEIL - && ability != ABILITY_SAND_FORCE - && ability != ABILITY_SAND_RUSH - && ability != ABILITY_OVERCOAT - && !IS_BATTLER_ANY_TYPE(gBattlerAttacker, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) - && !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES) - { - gBattleScripting.battler = battler; - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SANDSTORM; - BattleScriptExecute(BattleScript_DamagingWeather); - effect++; - } - else if (gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW) - && ability == ABILITY_ICE_BODY - && !(gStatuses3[battler] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - && !IsBattlerAtMaxHp(battler) - && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) - { - gBattleScripting.battler = battler; - gBattleStruct->moveDamage[battler] = -1 * max(1, GetNonDynamaxMaxHP(battler) / 16); - BattleScriptExecute(BattleScript_IceBodyHeal); - effect++; - } - else if (gBattleWeather & B_WEATHER_HAIL - && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE) - && ability != ABILITY_SNOW_CLOAK - && ability != ABILITY_OVERCOAT - && ability != ABILITY_ICE_BODY - && !(gStatuses3[battler] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES) - { - gBattleScripting.battler = battler; - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_HAIL; - BattleScriptExecute(BattleScript_DamagingWeather); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_INGRAIN: // ingrain - if ((gStatuses3[battler] & STATUS3_ROOTED) - && !IsBattlerAtMaxHp(battler) - && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) - && IsBattlerAlive(battler)) - { - gBattleStruct->moveDamage[battler] = GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16); - BattleScriptExecute(BattleScript_IngrainTurnHeal); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_AQUA_RING: // aqua ring - if ((gStatuses3[battler] & STATUS3_AQUA_RING) - && !IsBattlerAtMaxHp(battler) - && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) - && IsBattlerAlive(battler)) - { - gBattleStruct->moveDamage[battler] = GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16); - BattleScriptExecute(BattleScript_AquaRingHeal); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_ABILITIES: // end turn abilities - if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, 0, 0, 0)) - effect++; - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_ITEMS1: // item effects - if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) - effect++; - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_ITEMS2: // item effects again - if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, TRUE)) - effect++; - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_ITEMS3: // berry effects - if (gItemsInfo[gBattleMons[battler].item].pocket == POCKET_BERRIES - || GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_RESTORE_HP) // Edge case for Berry Juice - { - if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_ORBS: - if (IsBattlerAlive(battler) && ItemBattleEffects(ITEMEFFECT_ORBS, battler, FALSE)) - effect++; - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_LEECH_SEED: // leech seed - if ((gStatuses3[battler] & STATUS3_LEECHSEED) - && IsBattlerAlive(gStatuses3[battler] & STATUS3_LEECHSEED_BATTLER) - && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, ability)) - { - gBattlerTarget = gStatuses3[battler] & STATUS3_LEECHSEED_BATTLER; // Notice gBattlerTarget is actually the HP receiver. - gBattlerAttacker = battler; - gBattleScripting.animArg1 = gBattlerTarget; - gBattleScripting.animArg2 = gBattlerAttacker; - gBattleStruct->moveDamage[gBattlerAttacker] = max(1, GetNonDynamaxMaxHP(battler) / 8); - gBattleStruct->moveDamage[gBattlerTarget] = GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerAttacker]); - gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE; - if (GetBattlerAbility(battler) == ABILITY_LIQUID_OOZE) - { - gBattleStruct->moveDamage[gBattlerTarget] = gBattleStruct->moveDamage[gBattlerTarget] * -1; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_OOZE; - BattleScriptExecute(BattleScript_LeechSeedTurnDrainLiquidOoze); - } - else if (gStatuses3[gBattlerTarget] & STATUS3_HEAL_BLOCK) - { - BattleScriptExecute(BattleScript_LeechSeedTurnDrainHealBlock); - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_DRAIN; - BattleScriptExecute(BattleScript_LeechSeedTurnDrainRecovery); - } - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_POISON: // poison - if ((gBattleMons[battler].status1 & STATUS1_POISON) - && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, ability)) - { - if (ability == ABILITY_POISON_HEAL) - { - if (!IsBattlerAtMaxHp(battler) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; - BattleScriptExecute(BattleScript_PoisonHealActivates); - effect++; - } - } - else - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - BattleScriptExecute(BattleScript_PoisonTurnDmg); - effect++; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_BAD_POISON: // toxic poison - if ((gBattleMons[battler].status1 & STATUS1_TOXIC_POISON) - && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, ability)) - { - if (ability == ABILITY_POISON_HEAL) - { - if (!IsBattlerAtMaxHp(battler) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; - BattleScriptExecute(BattleScript_PoisonHealActivates); - effect++; - } - } - else - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - if ((gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_TURN(15)) // not 16 turns - gBattleMons[battler].status1 += STATUS1_TOXIC_TURN(1); - gBattleStruct->moveDamage[battler] *= (gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) >> 8; - BattleScriptExecute(BattleScript_PoisonTurnDmg); - effect++; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_BURN: // burn - if ((gBattleMons[battler].status1 & STATUS1_BURN) - && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, ability)) - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); - if (ability == ABILITY_HEATPROOF) - { - if (gBattleStruct->moveDamage[battler] > (gBattleStruct->moveDamage[battler] / 2) + 1) // Record ability if the burn takes less damage than it normally would. - RecordAbilityBattle(battler, ABILITY_HEATPROOF); - gBattleStruct->moveDamage[battler] /= 2; - } - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - BattleScriptExecute(BattleScript_BurnTurnDmg); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_FROSTBITE: // burn - if ((gBattleMons[battler].status1 & STATUS1_FROSTBITE) - && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, ability)) - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - BattleScriptExecute(BattleScript_FrostbiteTurnDmg); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_NIGHTMARES: // spooky nightmares - if ((gBattleMons[battler].status2 & STATUS2_NIGHTMARE) - && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, ability)) - { - // R/S does not perform this sleep check, which causes the nightmare effect to - // persist even after the affected Pokémon has been awakened by Shed Skin. - if (gBattleMons[battler].status1 & STATUS1_SLEEP) - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - BattleScriptExecute(BattleScript_NightmareTurnDmg); - effect++; - } - else - { - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_CURSE: // curse - if ((gBattleMons[battler].status2 & STATUS2_CURSED) - && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, ability)) - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - BattleScriptExecute(BattleScript_CurseTurnDmg); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_WRAP: // wrap - if ((gBattleMons[battler].status2 & STATUS2_WRAPPED) && IsBattlerAlive(battler)) - { - if (--gDisableStructs[battler].wrapTurns != 0) // damaged by wrap - { - if (IsBattlerProtectedByMagicGuard(battler, ability)) - { - gBattleStruct->turnEffectsTracker++; - break; - } - - gBattleScripting.animArg1 = gBattleStruct->wrappedMove[battler]; - gBattleScripting.animArg2 = gBattleStruct->wrappedMove[battler] >> 8; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[battler]); - gBattlescriptCurrInstr = BattleScript_WrapTurnDmg; - if (GetBattlerHoldEffect(gBattleStruct->wrappedBy[battler], TRUE) == HOLD_EFFECT_BINDING_BAND) - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); - else - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16); - - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - } - else // broke free - { - gBattleMons[battler].status2 &= ~STATUS2_WRAPPED; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[battler]); - gBattlescriptCurrInstr = BattleScript_WrapEnds; - } - BattleScriptExecute(gBattlescriptCurrInstr); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_OCTOLOCK: - if (gDisableStructs[battler].octolock) - { - gBattlerAttacker = gDisableStructs[battler].battlerPreventingEscape; - gBattlerTarget = battler; - BattleScriptExecute(BattleScript_OctolockEndTurn); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_UPROAR: // uproar - if (gBattleMons[battler].status2 & STATUS2_UPROAR) - { - for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) - { - if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) - && (B_UPROAR_IGNORE_SOUNDPROOF >= GEN_5 || GetBattlerAbility(gBattlerAttacker) != ABILITY_SOUNDPROOF)) - { - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - BattleScriptExecute(BattleScript_MonWokeUpInUproar); - BtlController_EmitSetMonData(gBattlerAttacker, BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBattlerAttacker].status1); - MarkBattlerForControllerExec(gBattlerAttacker); - break; - } - } - if (gBattlerAttacker != gBattlersCount) - { - effect = 2; // a Pokémon was awaken - break; - } - else - { - gBattlerAttacker = battler; - gBattleMons[battler].status2 -= STATUS2_UPROAR_TURN(1); // uproar timer goes down - if (WasUnableToUseMove(battler)) - { - CancelMultiTurnMoves(battler); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_ENDS; - } - else if (gBattleMons[battler].status2 & STATUS2_UPROAR) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_CONTINUES; - gBattleMons[battler].status2 |= STATUS2_MULTIPLETURNS; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_ENDS; - CancelMultiTurnMoves(battler); - } - BattleScriptExecute(BattleScript_PrintUproarOverTurns); - effect = 1; - } - } - if (effect != 2) - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_THRASH: // thrash - // Don't decrement STATUS2_LOCK_CONFUSE if the target is held by Sky Drop - if (gBattleMons[battler].status2 & STATUS2_LOCK_CONFUSE && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) - { - gBattleMons[battler].status2 -= STATUS2_LOCK_CONFUSE_TURN(1); - if (WasUnableToUseMove(battler)) - CancelMultiTurnMoves(battler); - else if (!(gBattleMons[battler].status2 & STATUS2_LOCK_CONFUSE) - && (gBattleMons[battler].status2 & STATUS2_MULTIPLETURNS)) - { - gBattleMons[battler].status2 &= ~STATUS2_MULTIPLETURNS; - if (!(gBattleMons[battler].status2 & STATUS2_CONFUSION)) - { - gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER; - SetMoveEffect(TRUE, FALSE); - if (gBattleMons[battler].status2 & STATUS2_CONFUSION) - BattleScriptExecute(BattleScript_ThrashConfuses); - effect++; - } - } - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_FLINCH: // reset flinch - gBattleMons[battler].status2 &= ~STATUS2_FLINCHED; - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_DISABLE: // disable - if (gDisableStructs[battler].disableTimer != 0) - { - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gDisableStructs[battler].disabledMove == gBattleMons[battler].moves[i]) - break; - } - if (i == MAX_MON_MOVES) // Pokémon does not have the disabled move anymore - { - gDisableStructs[battler].disabledMove = 0; - gDisableStructs[battler].disableTimer = 0; - } - else if (--gDisableStructs[battler].disableTimer == 0) // disable ends - { - gDisableStructs[battler].disabledMove = 0; - BattleScriptExecute(BattleScript_DisabledNoMore); - effect++; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_ENCORE: // encore - if (gDisableStructs[battler].encoreTimer != 0) - { - if (gBattleMons[battler].moves[gDisableStructs[battler].encoredMovePos] != gDisableStructs[battler].encoredMove) // Pokémon does not have the encored move anymore - { - gDisableStructs[battler].encoredMove = 0; - gDisableStructs[battler].encoreTimer = 0; - } - else if (--gDisableStructs[battler].encoreTimer == 0 - || gBattleMons[battler].pp[gDisableStructs[battler].encoredMovePos] == 0) - { - gDisableStructs[battler].encoredMove = 0; - gDisableStructs[battler].encoreTimer = 0; - BattleScriptExecute(BattleScript_EncoredNoMore); - effect++; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_LOCK_ON: // lock-on decrement - if (gStatuses3[battler] & STATUS3_ALWAYS_HITS) - gStatuses3[battler] -= STATUS3_ALWAYS_HITS_TURN(1); - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_CHARGE: // charge - if (gDisableStructs[battler].chargeTimer > 0 && --gDisableStructs[battler].chargeTimer == 0) - gStatuses3[battler] &= ~STATUS3_CHARGED_UP; - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_TAUNT: // taunt - if (gDisableStructs[battler].tauntTimer && --gDisableStructs[battler].tauntTimer == 0) - { - BattleScriptExecute(BattleScript_BufferEndTurn); - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_YAWN: // yawn - if (gStatuses3[battler] & STATUS3_YAWN) - { - u16 battlerAbility = GetBattlerAbility(battler); - gStatuses3[battler] -= STATUS3_YAWN_TURN(1); - if (!(gStatuses3[battler] & STATUS3_YAWN) && !(gBattleMons[battler].status1 & STATUS1_ANY) - && battlerAbility != ABILITY_VITAL_SPIRIT - && battlerAbility != ABILITY_INSOMNIA && !UproarWakeUpCheck(battler) - && !IsLeafGuardProtected(battler)) - { - CancelMultiTurnMoves(battler); - gEffectBattler = gBattlerTarget = battler; - if (IsBattlerTerrainAffected(battler, STATUS_FIELD_ELECTRIC_TERRAIN)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAINPREVENTS_ELECTRIC; - BattleScriptExecute(BattleScript_TerrainPreventsEnd2); - } - else if (IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAINPREVENTS_MISTY; - BattleScriptExecute(BattleScript_TerrainPreventsEnd2); - } - else if (IsSleepClauseActiveForSide(GetBattlerSide(battler))) - { - BattleScriptExecute(BattleScript_SleepClausePreventsEnd); - } - else - { - if (B_SLEEP_TURNS >= GEN_5) - gBattleMons[battler].status1 |= ((Random() % 3) + 2); - else - gBattleMons[battler].status1 |= ((Random() % 4) + 3); - - TryActivateSleepClause(battler, gBattlerPartyIndexes[battler]); - BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - BattleScriptExecute(BattleScript_YawnMakesAsleep); - } - effect++; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_LASER_FOCUS: - if (gStatuses3[battler] & STATUS3_LASER_FOCUS) - { - if (gDisableStructs[battler].laserFocusTimer == 0 || --gDisableStructs[battler].laserFocusTimer == 0) - gStatuses3[battler] &= ~STATUS3_LASER_FOCUS; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_EMBARGO: - if (gStatuses3[battler] & STATUS3_EMBARGO) - { - if (gDisableStructs[battler].embargoTimer == 0 || --gDisableStructs[battler].embargoTimer == 0) - { - gStatuses3[battler] &= ~STATUS3_EMBARGO; - BattleScriptExecute(BattleScript_EmbargoEndTurn); - effect++; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_MAGNET_RISE: - if (gStatuses3[battler] & STATUS3_MAGNET_RISE) - { - if (gDisableStructs[battler].magnetRiseTimer == 0 || --gDisableStructs[battler].magnetRiseTimer == 0) - { - gStatuses3[battler] &= ~STATUS3_MAGNET_RISE; - BattleScriptExecute(BattleScript_BufferEndTurn); - PREPARE_STRING_BUFFER(gBattleTextBuff1, STRINGID_ELECTROMAGNETISM); - effect++; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_TELEKINESIS: - if (gStatuses3[battler] & STATUS3_TELEKINESIS) - { - if (gDisableStructs[battler].telekinesisTimer == 0 || --gDisableStructs[battler].telekinesisTimer == 0) - { - gStatuses3[battler] &= ~STATUS3_TELEKINESIS; - BattleScriptExecute(BattleScript_TelekinesisEndTurn); - effect++; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_HEALBLOCK: - if (gStatuses3[battler] & STATUS3_HEAL_BLOCK) - { - if (gDisableStructs[battler].healBlockTimer == 0 || --gDisableStructs[battler].healBlockTimer == 0) - { - gStatuses3[battler] &= ~STATUS3_HEAL_BLOCK; - BattleScriptExecute(BattleScript_BufferEndTurn); - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_HEAL_BLOCK); - effect++; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_ROOST: // Return flying type. - if (gDisableStructs[battler].roostActive) - gDisableStructs[battler].roostActive = FALSE; - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_ELECTRIFY: - gStatuses4[battler] &= ~STATUS4_ELECTRIFIED; - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_POWDER: - gBattleMons[battler].status2 &= ~STATUS2_POWDER; - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_THROAT_CHOP: - if (gDisableStructs[battler].throatChopTimer && --gDisableStructs[battler].throatChopTimer == 0) - { - BattleScriptExecute(BattleScript_ThroatChopEndTurn); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_SLOW_START: - if (gDisableStructs[battler].slowStartTimer - && --gDisableStructs[battler].slowStartTimer == 0 - && ability == ABILITY_SLOW_START) - { - BattleScriptExecute(BattleScript_SlowStartEnds); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_CUD_CHEW: - if (GetBattlerAbility(battler) == ABILITY_CUD_CHEW && !gDisableStructs[battler].cudChew && ItemId_GetPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES) - gDisableStructs[battler].cudChew = TRUE; - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_SALT_CURE: - if (gStatuses4[battler] & STATUS4_SALT_CURE - && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, ability)) - { - gBattlerTarget = battler; - if (IS_BATTLER_ANY_TYPE(battler, TYPE_STEEL, TYPE_WATER)) - gBattleStruct->moveDamage[battler] = gBattleMons[battler].maxHP / 4; - else - gBattleStruct->moveDamage[battler] = gBattleMons[battler].maxHP / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SALT_CURE); - BattleScriptExecute(BattleScript_SaltCureExtraDamage); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_SYRUP_BOMB: - if ((gStatuses4[battler] & STATUS4_SYRUP_BOMB) && (IsBattlerAlive(battler))) - { - if (gDisableStructs[battler].syrupBombTimer > 0 && --gDisableStructs[battler].syrupBombTimer == 0) - gStatuses4[battler] &= ~STATUS4_SYRUP_BOMB; - gBattlerTarget = battler; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SYRUP_BOMB); - gBattlescriptCurrInstr = BattleScript_SyrupBombEndTurn; - BattleScriptExecute(gBattlescriptCurrInstr); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_TORMENT: - if (gDisableStructs[battler].tormentTimer != PERMANENT_TORMENT - && --gDisableStructs[battler].tormentTimer == 0) - { - gBattleMons[battler].status2 &= ~STATUS2_TORMENT; - BattleScriptExecute(BattleScript_TormentEnds); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_DYNAMAX: - if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX - && --gBattleStruct->dynamax.dynamaxTurns[battler] == 0) - { - gBattleScripting.battler = battler; - UndoDynamax(battler); - BattleScriptExecute(BattleScript_DynamaxEnds); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_GMAX_MOVE_RESIDUAL_DAMAGE: - { - u32 side = GetBattlerSide(gBattlerAttacker); - if (gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES - && !IS_BATTLER_OF_TYPE(gBattlerAttacker, gSideTimers[side].damageNonTypesType) - && IsBattlerAlive(gBattlerAttacker) - && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) - { - gBattleScripting.battler = battler; - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 6; - ChooseDamageNonTypesString(gSideTimers[side].damageNonTypesType); - BattleScriptExecute(BattleScript_DamageNonTypesContinues); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - } - case ENDTURN_SEA_OF_FIRE_DAMAGE: - if (IsBattlerAlive(battler) && gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SEA_OF_FIRE) - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - BtlController_EmitStatusAnimation(battler, BUFFER_A, FALSE, STATUS1_BURN); - MarkBattlerForControllerExec(battler); - BattleScriptExecute(BattleScript_HurtByTheSeaOfFire); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_BATTLER_COUNT: // done - gBattleStruct->turnEffectsTracker = 0; - gBattleStruct->turnEffectsBattlerId++; - break; - } - - if (effect != 0) - return effect; - - } - gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); - return 0; -} - -bool32 HandleWishPerishSongOnTurnEnd(void) -{ - u32 battler; - - gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); - switch (gBattleStruct->wishPerishSongState) - { - case 0: - while (gBattleStruct->wishPerishSongBattlerId < gBattlersCount) - { - battler = gBattleStruct->wishPerishSongBattlerId; - - gBattleStruct->wishPerishSongBattlerId++; - - if (gWishFutureKnock.futureSightCounter[battler] == gBattleTurnCounter && !(gAbsentBattlerFlags & (1u << battler))) - { - struct Pokemon *party; - - if (gWishFutureKnock.futureSightCounter[battler] == gBattleTurnCounter - && gWishFutureKnock.futureSightCounter[BATTLE_PARTNER(battler)] <= gBattleTurnCounter) - { - gSideStatuses[GetBattlerSide(battler)] &= ~SIDE_STATUS_FUTUREATTACK; - } - - if (!IsBattlerAlive(battler)) - continue; - - if (gWishFutureKnock.futureSightMove[battler] == MOVE_FUTURE_SIGHT) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FUTURE_SIGHT; - else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE; - - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gWishFutureKnock.futureSightMove[battler]); - - gBattlerTarget = battler; - gBattlerAttacker = gWishFutureKnock.futureSightBattlerIndex[battler]; - gCurrentMove = gWishFutureKnock.futureSightMove[battler]; - - party = GetSideParty(GetBattlerSide(gBattlerAttacker)); - if (&party[gWishFutureKnock.futureSightPartyIndex[gBattlerTarget]] == &party[gBattlerPartyIndexes[gBattlerAttacker]]) - SetTypeBeforeUsingMove(gCurrentMove, gBattlerAttacker); - - BattleScriptExecute(BattleScript_MonTookFutureAttack); - - return TRUE; - } - } - gBattleStruct->wishPerishSongState = 1; - gBattleStruct->wishPerishSongBattlerId = 0; - // fall through - case 1: - while (gBattleStruct->wishPerishSongBattlerId < gBattlersCount) - { - battler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->wishPerishSongBattlerId]; - if (gAbsentBattlerFlags & (1u << battler)) - { - gBattleStruct->wishPerishSongBattlerId++; - continue; - } - gBattleStruct->wishPerishSongBattlerId++; - if (gStatuses3[battler] & STATUS3_PERISH_SONG) - { - PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[battler].perishSongTimer); - if (gDisableStructs[battler].perishSongTimer == 0) - { - gStatuses3[battler] &= ~STATUS3_PERISH_SONG; - gBattleStruct->moveDamage[battler] = gBattleMons[battler].hp; - gBattlescriptCurrInstr = BattleScript_PerishSongTakesLife; - } - else - { - gDisableStructs[battler].perishSongTimer--; - gBattlescriptCurrInstr = BattleScript_PerishSongCountGoesDown; - } - BattleScriptExecute(gBattlescriptCurrInstr); - return TRUE; - } - } - gBattleStruct->wishPerishSongState = 2; - gBattleStruct->wishPerishSongBattlerId = 0; - // fall through - case 2: - if ((gBattleTypeFlags & BATTLE_TYPE_ARENA) - && gBattleStruct->arenaTurnCounter == 2 - && IsBattlerAlive(B_POSITION_PLAYER_LEFT) && IsBattlerAlive(B_POSITION_OPPONENT_LEFT)) - { - s32 i; - - for (i = 0; i < 2; i++) - CancelMultiTurnMoves(i); - - gBattlescriptCurrInstr = BattleScript_ArenaDoJudgment; - BattleScriptExecute(BattleScript_ArenaDoJudgment); - gBattleStruct->wishPerishSongState++; - return TRUE; - } - break; - } - - gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); - - return FALSE; -} - #define FAINTED_ACTIONS_MAX_CASE 7 - bool32 HandleFaintedMonActions(void) { if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) @@ -3404,7 +2080,7 @@ static void CancellerGravity(u32 *effect) static void CancellerThroatChop(u32 *effect) { - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].throatChopTimer && IsSoundMove(gCurrentMove)) + if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].throatChopTimer > gBattleTurnCounter && IsSoundMove(gCurrentMove)) { gProtectStructs[gBattlerAttacker].usedThroatChopPreventedMove = TRUE; CancelMultiTurnMoves(gBattlerAttacker); @@ -4177,8 +2853,8 @@ static inline bool32 HadMoreThanHalfHpNowDoesnt(u32 battler) { u32 cutoff = gBattleMons[battler].maxHP / 2; // Had more than half of hp before, now has less - return (gBattleStruct->hpBefore[battler] > cutoff - && gBattleMons[battler].hp <= cutoff); + return (gBattleStruct->hpBefore[battler] > cutoff + && gBattleMons[battler].hp <= cutoff); } #define ANIM_STAT_HP 0 @@ -4396,6 +3072,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (special) gLastUsedAbility = special; + else if (ability) + gLastUsedAbility = ability; else gLastUsedAbility = GetBattlerAbility(battler); @@ -4701,7 +3379,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_SLOW_START: if (!gSpecialStatuses[battler].switchInAbilityDone) { - gDisableStructs[battler].slowStartTimer = 5; + gDisableStructs[battler].slowStartTimer = gBattleTurnCounter + 5; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_SLOWSTART; gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); @@ -5290,6 +3968,19 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 effect++; } break; + case ABILITY_ICE_BODY: + if (!IsBattlerAtMaxHp(battler) + && !(gStatuses3[battler] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) + && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) + { + BattleScriptPushCursorAndCallback(BattleScript_IceBodyHeal); + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleStruct->moveDamage[battler] *= -1; + effect++; + } + break; case ABILITY_DRY_SKIN: if (IsBattlerWeatherAffected(battler, B_WEATHER_SUN)) goto SOLAR_POWER_HP_DROP; @@ -5394,6 +4085,13 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_TRUANT: gDisableStructs[gBattlerAttacker].truantCounter ^= 1; break; + case ABILITY_SLOW_START: + if (gDisableStructs[battler].slowStartTimer == gBattleTurnCounter) + { + BattleScriptExecute(BattleScript_SlowStartEnds); + effect++; + } + break; case ABILITY_BAD_DREAMS: BattleScriptPushCursorAndCallback(BattleScript_BadDreamsActivates); effect++; @@ -5465,6 +4163,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 BattleScriptPushCursorAndCallback(BattleScript_CudChewActivates); effect++; } + else if (!gDisableStructs[battler].cudChew && ItemId_GetPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES) + { + gDisableStructs[battler].cudChew = TRUE; + } break; } } @@ -7892,6 +6594,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) } break; case ITEMEFFECT_NORMAL: + case ITEMEFFECT_TRY_HEALING: if (gBattleMons[battler].hp) { switch (battlerHoldEffect) @@ -9750,7 +8453,7 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; case ABILITY_SLOW_START: - if (gDisableStructs[battlerAtk].slowStartTimer != 0) + if (gDisableStructs[battlerAtk].slowStartTimer > gBattleTurnCounter) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.5)); break; case ABILITY_SOLAR_POWER: @@ -11446,7 +10149,7 @@ bool32 CanFling(u32 battler) if (item == ITEM_NONE || (B_KLUTZ_FLING_INTERACTION >= GEN_5 && GetBattlerAbility(battler) == ABILITY_KLUTZ) || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM - || gDisableStructs[battler].embargoTimer != 0 + || gStatuses3[battler] & STATUS3_EMBARGO || GetFlingPowerFromItemId(item) == 0 || !CanBattlerGetOrLoseItem(battler, item)) return FALSE; diff --git a/src/data/trainers.h b/src/data/trainers.h index a491b482ed..af19c90ae2 100644 --- a/src/data/trainers.h +++ b/src/data/trainers.h @@ -303,7 +303,7 @@ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = #line 196 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 197 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 198 @@ -555,7 +555,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, .encounterMusic_gender = #line 294 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 295 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 296 @@ -1007,7 +1007,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, .encounterMusic_gender = #line 474 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 475 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 476 @@ -1041,7 +1041,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, .encounterMusic_gender = #line 487 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 488 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 489 @@ -1075,7 +1075,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, .encounterMusic_gender = #line 500 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 501 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 502 @@ -1229,7 +1229,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AQUA_ADMIN_F, .encounterMusic_gender = #line 561 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 562 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 563 @@ -1274,7 +1274,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AQUA_ADMIN_F, .encounterMusic_gender = #line 578 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 579 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 580 @@ -1375,7 +1375,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = #line 617 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 618 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 619 @@ -1409,7 +1409,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AROMA_LADY, .encounterMusic_gender = #line 630 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 631 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 632 @@ -1454,7 +1454,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AROMA_LADY, .encounterMusic_gender = #line 647 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 648 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 649 @@ -1564,7 +1564,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AROMA_LADY, .encounterMusic_gender = #line 689 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 690 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 691 @@ -1609,7 +1609,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AROMA_LADY, .encounterMusic_gender = #line 706 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 707 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 708 @@ -1654,7 +1654,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AROMA_LADY, .encounterMusic_gender = #line 723 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 724 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 725 @@ -1710,7 +1710,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AROMA_LADY, .encounterMusic_gender = #line 744 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 745 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 746 @@ -1766,7 +1766,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AROMA_LADY, .encounterMusic_gender = #line 765 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 766 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 767 @@ -2421,7 +2421,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = #line 1039 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1040 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1041 @@ -2466,7 +2466,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = #line 1056 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1057 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1058 @@ -2500,7 +2500,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = #line 1069 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1070 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1071 @@ -2534,7 +2534,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = #line 1082 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1083 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1084 @@ -2579,7 +2579,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = #line 1099 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1100 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1101 @@ -2624,7 +2624,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = #line 1116 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1117 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1118 @@ -2669,7 +2669,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = #line 1133 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1134 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1135 @@ -3953,7 +3953,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 1656 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1657 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1658 @@ -3994,7 +3994,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 1672 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1673 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1674 @@ -4036,7 +4036,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 1689 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1690 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1691 @@ -4077,7 +4077,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 1705 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1706 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1707 @@ -4156,7 +4156,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 1739 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1740 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1741 @@ -4203,7 +4203,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 1757 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1758 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1759 @@ -4261,7 +4261,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 1779 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1780 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1781 @@ -4297,7 +4297,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 1793 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1794 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1795 @@ -4333,7 +4333,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 1807 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1808 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1809 @@ -4369,7 +4369,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 1821 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1822 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1823 @@ -4427,7 +4427,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 1843 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1844 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1845 @@ -4474,7 +4474,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 1861 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1862 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1863 @@ -4532,7 +4532,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 1883 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1884 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1885 @@ -4590,7 +4590,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 1905 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1906 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1907 @@ -4648,7 +4648,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 1927 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1928 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1929 @@ -4706,7 +4706,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 1949 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1950 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1951 @@ -4764,7 +4764,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = #line 1971 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1972 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 1973 @@ -4809,7 +4809,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = #line 1988 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 1989 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 1990 @@ -4854,7 +4854,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = #line 2005 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2006 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2007 @@ -4899,7 +4899,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = #line 2022 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2023 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2024 @@ -4933,7 +4933,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = #line 2035 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2036 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2037 @@ -4967,7 +4967,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = #line 2048 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2049 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2050 @@ -5012,7 +5012,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = #line 2065 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2066 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2067 @@ -5057,7 +5057,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = #line 2082 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2083 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2084 @@ -5102,7 +5102,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = #line 2099 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2100 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2101 @@ -5158,7 +5158,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = #line 2120 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2121 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2122 @@ -5196,7 +5196,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = #line 2134 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2135 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2136 @@ -5315,7 +5315,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = #line 2181 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2182 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2183 @@ -5358,7 +5358,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = #line 2197 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2198 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2199 @@ -5396,7 +5396,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = #line 2211 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2212 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2213 @@ -5434,7 +5434,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = #line 2225 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2226 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2227 @@ -5472,7 +5472,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = #line 2239 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2240 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2241 @@ -5510,7 +5510,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = #line 2253 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2254 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2255 @@ -5548,7 +5548,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = #line 2267 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2268 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2269 @@ -5593,7 +5593,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 2285 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2286 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2287 @@ -5627,7 +5627,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 2298 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2299 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2300 @@ -5661,7 +5661,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 2311 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2312 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2313 @@ -5695,7 +5695,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 2324 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2325 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2326 @@ -5754,7 +5754,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 2349 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2350 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2351 @@ -5788,7 +5788,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 2362 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2363 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2364 @@ -5822,7 +5822,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 2375 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2376 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2377 @@ -5898,7 +5898,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 2407 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2408 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2409 @@ -5943,7 +5943,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 2424 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2425 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2426 @@ -6002,7 +6002,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 2449 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2450 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2451 @@ -6061,7 +6061,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 2474 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2475 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2476 @@ -6120,7 +6120,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 2499 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2500 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2501 @@ -6215,7 +6215,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_EXPERT_F, .encounterMusic_gender = #line 2538 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2539 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 2540 @@ -6479,7 +6479,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 2642 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2643 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2644 @@ -6556,7 +6556,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, .encounterMusic_gender = #line 2672 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 2673 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 2674 @@ -8342,7 +8342,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, .encounterMusic_gender = #line 3385 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 3386 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 3387 @@ -9414,7 +9414,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 3814 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 3815 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 3816 @@ -10595,7 +10595,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 4277 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 4278 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4279 @@ -10633,7 +10633,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 4291 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 4292 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4293 @@ -10667,7 +10667,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 4304 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 4305 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4306 @@ -10701,7 +10701,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 4317 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 4318 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4319 @@ -10735,7 +10735,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 4330 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 4331 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4332 @@ -10791,7 +10791,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 4351 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 4352 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4353 @@ -10836,7 +10836,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 4368 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 4369 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4370 @@ -10881,7 +10881,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 4385 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 4386 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4387 @@ -10926,7 +10926,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 4402 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 4403 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4404 @@ -10971,7 +10971,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 4419 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 4420 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4421 @@ -11016,7 +11016,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 4436 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 4437 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4438 @@ -11505,7 +11505,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_ELITE_FOUR_PHOEBE, .encounterMusic_gender = #line 4642 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 4643 TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, #line 4644 @@ -11624,7 +11624,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_ELITE_FOUR_GLACIA, .encounterMusic_gender = #line 4693 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 4694 TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, #line 4695 @@ -11860,7 +11860,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LEADER_ROXANNE, .encounterMusic_gender = #line 4795 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 4796 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 4797 @@ -12117,7 +12117,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LEADER_FLANNERY, .encounterMusic_gender = #line 4905 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 4906 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 4907 @@ -12313,7 +12313,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LEADER_WINONA, .encounterMusic_gender = #line 4989 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 4990 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 4991 @@ -12945,7 +12945,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SCHOOL_KID_F, .encounterMusic_gender = #line 5250 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5251 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 5252 @@ -12979,7 +12979,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SCHOOL_KID_F, .encounterMusic_gender = #line 5263 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5264 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 5265 @@ -13024,7 +13024,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SCHOOL_KID_F, .encounterMusic_gender = #line 5280 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5281 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 5282 @@ -13069,7 +13069,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SCHOOL_KID_F, .encounterMusic_gender = #line 5297 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5298 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 5299 @@ -13114,7 +13114,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SCHOOL_KID_F, .encounterMusic_gender = #line 5314 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5315 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 5316 @@ -13159,7 +13159,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SCHOOL_KID_F, .encounterMusic_gender = #line 5331 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5332 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 5333 @@ -13899,7 +13899,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEFAN_F, .encounterMusic_gender = #line 5632 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5633 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5634 @@ -13935,7 +13935,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEFAN_F, .encounterMusic_gender = #line 5645 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5646 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5647 @@ -13971,7 +13971,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEFAN_F, .encounterMusic_gender = #line 5658 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5659 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5660 @@ -14033,7 +14033,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEFAN_F, .encounterMusic_gender = #line 5679 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5680 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5681 @@ -14082,7 +14082,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEFAN_F, .encounterMusic_gender = #line 5696 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5697 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5698 @@ -14131,7 +14131,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEFAN_F, .encounterMusic_gender = #line 5713 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5714 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5715 @@ -14180,7 +14180,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEFAN_F, .encounterMusic_gender = #line 5730 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5731 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5732 @@ -14229,7 +14229,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEFAN_F, .encounterMusic_gender = #line 5747 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5748 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5749 @@ -14466,7 +14466,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_EXPERT_F, .encounterMusic_gender = #line 5845 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5846 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5847 @@ -14507,7 +14507,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_EXPERT_F, .encounterMusic_gender = #line 5862 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5863 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5864 @@ -14552,7 +14552,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_EXPERT_F, .encounterMusic_gender = #line 5879 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5880 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5881 @@ -14597,7 +14597,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_EXPERT_F, .encounterMusic_gender = #line 5896 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5897 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5898 @@ -14642,7 +14642,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_EXPERT_F, .encounterMusic_gender = #line 5913 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5914 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5915 @@ -14687,7 +14687,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_EXPERT_F, .encounterMusic_gender = #line 5930 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 5931 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5932 @@ -15034,7 +15034,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 6072 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 6073 TRAINER_ENCOUNTER_MUSIC_COOL, #line 6074 @@ -16662,7 +16662,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, .encounterMusic_gender = #line 6720 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 6721 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6722 @@ -16696,7 +16696,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, .encounterMusic_gender = #line 6733 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 6734 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6735 @@ -16752,7 +16752,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, .encounterMusic_gender = #line 6754 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 6755 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6756 @@ -16786,7 +16786,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, .encounterMusic_gender = #line 6767 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 6768 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6769 @@ -16820,7 +16820,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, .encounterMusic_gender = #line 6780 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 6781 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6782 @@ -16854,7 +16854,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, .encounterMusic_gender = #line 6793 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 6794 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6795 @@ -17048,7 +17048,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, .encounterMusic_gender = #line 6871 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 6872 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6873 @@ -17082,7 +17082,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, .encounterMusic_gender = #line 6884 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 6885 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6886 @@ -17116,7 +17116,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, .encounterMusic_gender = #line 6897 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 6898 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6899 @@ -17150,7 +17150,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, .encounterMusic_gender = #line 6910 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 6911 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6912 @@ -17184,7 +17184,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, .encounterMusic_gender = #line 6923 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 6924 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6925 @@ -17550,7 +17550,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, .encounterMusic_gender = #line 7069 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7070 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7071 @@ -17584,7 +17584,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, .encounterMusic_gender = #line 7082 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7083 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7084 @@ -17629,7 +17629,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, .encounterMusic_gender = #line 7099 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7100 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7101 @@ -17663,7 +17663,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, .encounterMusic_gender = #line 7112 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7113 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7114 @@ -17697,7 +17697,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, .encounterMusic_gender = #line 7125 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7126 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7127 @@ -17742,7 +17742,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, .encounterMusic_gender = #line 7142 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7143 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7144 @@ -17776,7 +17776,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, .encounterMusic_gender = #line 7155 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7156 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7157 @@ -17810,7 +17810,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, .encounterMusic_gender = #line 7168 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7169 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7170 @@ -17844,7 +17844,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, .encounterMusic_gender = #line 7181 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7182 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7183 @@ -18929,7 +18929,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 7611 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7612 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7613 @@ -18984,7 +18984,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = #line 7632 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7633 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 7634 @@ -19482,7 +19482,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 7838 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7839 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7840 @@ -19516,7 +19516,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 7851 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7852 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7853 @@ -19550,7 +19550,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 7864 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7865 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7866 @@ -19595,7 +19595,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 7881 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7882 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7883 @@ -19629,7 +19629,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 7894 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7895 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7896 @@ -19663,7 +19663,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 7907 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7908 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7909 @@ -19708,7 +19708,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 7924 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7925 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7926 @@ -19753,7 +19753,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 7941 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7942 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7943 @@ -19798,7 +19798,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 7958 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7959 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7960 @@ -19843,7 +19843,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = #line 7975 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7976 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 7977 @@ -19884,7 +19884,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = #line 7992 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 7993 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 7994 @@ -19929,7 +19929,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = #line 8009 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8010 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 8011 @@ -19970,7 +19970,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = #line 8026 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8027 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 8028 @@ -20011,7 +20011,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = #line 8043 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8044 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 8045 @@ -20052,7 +20052,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = #line 8060 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8061 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 8062 @@ -20111,7 +20111,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = #line 8085 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8086 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 8087 @@ -20170,7 +20170,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8110 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8111 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8112 @@ -20215,7 +20215,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8127 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8128 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8129 @@ -20249,7 +20249,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8140 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8141 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8142 @@ -20283,7 +20283,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8153 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8154 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8155 @@ -20328,7 +20328,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8170 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8171 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8172 @@ -20362,7 +20362,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8183 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8184 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8185 @@ -20407,7 +20407,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8200 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8201 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8202 @@ -20441,7 +20441,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8213 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8214 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8215 @@ -20497,7 +20497,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8234 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8235 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8236 @@ -20531,7 +20531,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8247 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8248 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8249 @@ -20565,7 +20565,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8260 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8261 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8262 @@ -20599,7 +20599,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8273 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8274 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8275 @@ -20633,7 +20633,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8286 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8287 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8288 @@ -20678,7 +20678,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8303 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8304 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8305 @@ -20712,7 +20712,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8316 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8317 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8318 @@ -20757,7 +20757,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8333 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8334 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8335 @@ -20791,7 +20791,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8346 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8347 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8348 @@ -20825,7 +20825,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8359 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8360 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8361 @@ -20859,7 +20859,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8372 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8373 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8374 @@ -20904,7 +20904,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8389 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8390 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8391 @@ -20938,7 +20938,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8402 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8403 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8404 @@ -20983,7 +20983,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8419 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8420 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8421 @@ -21028,7 +21028,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8436 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8437 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8438 @@ -21073,7 +21073,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8453 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8454 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8455 @@ -21107,7 +21107,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8466 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8467 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8468 @@ -21141,7 +21141,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8479 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8480 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8481 @@ -21175,7 +21175,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8492 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8493 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8494 @@ -21220,7 +21220,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 8509 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8510 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8511 @@ -21276,7 +21276,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 8530 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8531 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8532 @@ -21335,7 +21335,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 8555 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8556 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8557 @@ -21394,7 +21394,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 8580 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8581 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8582 @@ -21439,7 +21439,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 8597 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8598 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8599 @@ -21484,7 +21484,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 8614 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8615 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8616 @@ -21529,7 +21529,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 8631 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8632 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8633 @@ -21624,7 +21624,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 8669 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8670 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8671 @@ -21669,7 +21669,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 8686 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8687 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8688 @@ -21725,7 +21725,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 8707 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8708 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8709 @@ -21781,7 +21781,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 8728 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8729 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8730 @@ -21837,7 +21837,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 8749 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 8750 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8751 @@ -22878,7 +22878,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEFAN_F, .encounterMusic_gender = #line 9163 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 9164 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 9165 @@ -22941,7 +22941,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 9188 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 9189 TRAINER_ENCOUNTER_MUSIC_COOL, #line 9190 @@ -23016,7 +23016,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = #line 9219 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 9220 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9221 @@ -23143,7 +23143,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 9270 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 9271 TRAINER_ENCOUNTER_MUSIC_COOL, #line 9272 @@ -23186,7 +23186,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 9288 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 9289 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 9290 @@ -24151,7 +24151,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = #line 9673 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 9674 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9675 @@ -24185,7 +24185,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = #line 9686 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 9687 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9688 @@ -24241,7 +24241,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = #line 9707 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 9708 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9709 @@ -24297,7 +24297,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = #line 9728 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 9729 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9730 @@ -24331,7 +24331,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = #line 9741 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 9742 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9743 @@ -24387,7 +24387,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = #line 9762 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 9763 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9764 @@ -24443,7 +24443,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = #line 9783 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 9784 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9785 @@ -24477,7 +24477,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = #line 9796 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 9797 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9798 @@ -24533,7 +24533,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = #line 9817 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 9818 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9819 @@ -25113,7 +25113,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = #line 10041 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10042 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 10043 @@ -25202,7 +25202,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 10074 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10075 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10076 @@ -25281,7 +25281,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = #line 10105 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10106 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 10107 @@ -25370,7 +25370,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = #line 10138 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10139 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 10140 @@ -25459,7 +25459,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = #line 10171 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10172 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 10173 @@ -25548,7 +25548,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = #line 10204 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10205 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 10206 @@ -25908,7 +25908,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .encounterMusic_gender = #line 10347 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10348 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10349 @@ -25955,7 +25955,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .encounterMusic_gender = #line 10365 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10366 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10367 @@ -26013,7 +26013,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .encounterMusic_gender = #line 10387 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10388 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10389 @@ -26060,7 +26060,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .encounterMusic_gender = #line 10405 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10406 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10407 @@ -26107,7 +26107,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .encounterMusic_gender = #line 10423 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10424 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10425 @@ -26154,7 +26154,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .encounterMusic_gender = #line 10441 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10442 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10443 @@ -26201,7 +26201,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .encounterMusic_gender = #line 10459 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10460 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10461 @@ -26323,7 +26323,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, .encounterMusic_gender = #line 10507 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10508 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 10509 @@ -26368,7 +26368,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, .encounterMusic_gender = #line 10524 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10525 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 10526 @@ -26531,7 +26531,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 10588 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10589 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 10590 @@ -26597,7 +26597,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = #line 10614 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10615 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 10616 @@ -26663,7 +26663,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 10640 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10641 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10642 @@ -26817,7 +26817,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 10702 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10703 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 10704 @@ -26883,7 +26883,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = #line 10728 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10729 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 10730 @@ -26981,7 +26981,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, .encounterMusic_gender = #line 10767 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10768 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10769 @@ -27154,7 +27154,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 10836 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10837 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 10838 @@ -27317,7 +27317,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, .encounterMusic_gender = #line 10900 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10901 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 10902 @@ -27351,7 +27351,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, .encounterMusic_gender = #line 10913 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10914 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 10915 @@ -27549,7 +27549,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = #line 10990 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 10991 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 10992 @@ -27706,7 +27706,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = #line 11051 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 11052 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11053 @@ -27751,7 +27751,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = #line 11068 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 11069 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11070 @@ -27796,7 +27796,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = #line 11085 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 11086 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11087 @@ -27830,7 +27830,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = #line 11098 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 11099 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11100 @@ -27886,7 +27886,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = #line 11119 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 11120 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11121 @@ -27931,7 +27931,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = #line 11136 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 11137 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11138 @@ -27976,7 +27976,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = #line 11153 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 11154 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11155 @@ -28021,7 +28021,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = #line 11170 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 11171 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11172 @@ -28077,7 +28077,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = #line 11191 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 11192 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11193 @@ -28111,7 +28111,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = #line 11204 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 11205 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11206 @@ -28167,7 +28167,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = #line 11225 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 11226 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11227 @@ -28201,7 +28201,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = #line 11238 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 11239 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11240 @@ -29769,7 +29769,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 11853 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 11854 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11855 @@ -29844,7 +29844,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 11884 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 11885 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 11886 @@ -29903,7 +29903,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 11909 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 11910 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 11911 @@ -30158,7 +30158,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 12018 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 12019 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 12020 @@ -30893,7 +30893,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = #line 12327 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 12328 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 12329 @@ -30960,7 +30960,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = #line 12352 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 12353 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 12354 @@ -31027,7 +31027,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = #line 12377 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 12378 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 12379 @@ -31245,7 +31245,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 12461 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 12462 TRAINER_ENCOUNTER_MUSIC_COOL, #line 12463 @@ -31509,7 +31509,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 12565 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 12566 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12567 @@ -32453,7 +32453,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = #line 12956 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 12957 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 12958 @@ -32534,7 +32534,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = #line 12987 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 12988 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 12989 @@ -32701,7 +32701,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, .encounterMusic_gender = #line 13051 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13052 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 13053 @@ -32831,7 +32831,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AROMA_LADY, .encounterMusic_gender = #line 13103 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13104 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 13105 @@ -32865,7 +32865,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 13116 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13117 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 13118 @@ -32931,7 +32931,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 13142 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13143 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 13144 @@ -33105,7 +33105,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 13210 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13211 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 13212 @@ -33182,7 +33182,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 13240 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13241 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 13242 @@ -33708,7 +33708,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, .encounterMusic_gender = #line 13451 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13452 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13453 @@ -33742,7 +33742,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, .encounterMusic_gender = #line 13464 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13465 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13466 @@ -33776,7 +33776,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, .encounterMusic_gender = #line 13477 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13478 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13479 @@ -33875,7 +33875,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 13515 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13516 TRAINER_ENCOUNTER_MUSIC_COOL, #line 13517 @@ -34008,7 +34008,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = #line 13567 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13568 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 13569 @@ -34214,7 +34214,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 13648 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13649 TRAINER_ENCOUNTER_MUSIC_COOL, #line 13650 @@ -34315,7 +34315,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = #line 13687 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13688 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 13689 @@ -34489,7 +34489,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_AROMA_LADY, .encounterMusic_gender = #line 13755 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13756 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 13757 @@ -34534,7 +34534,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, .encounterMusic_gender = #line 13772 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13773 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 13774 @@ -34622,7 +34622,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 13806 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13807 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13808 @@ -34667,7 +34667,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 13823 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13824 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13825 @@ -34712,7 +34712,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 13840 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13841 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13842 @@ -34843,7 +34843,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, .encounterMusic_gender = #line 13891 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13892 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 13893 @@ -34877,7 +34877,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 13904 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13905 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13906 @@ -34911,7 +34911,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 13917 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13918 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13919 @@ -34945,7 +34945,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_EXPERT_F, .encounterMusic_gender = #line 13930 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13931 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13932 @@ -35067,7 +35067,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = #line 13978 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 13979 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 13980 @@ -35141,7 +35141,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 14008 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 14009 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 14010 @@ -35316,7 +35316,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = #line 14075 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 14076 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 14077 @@ -35405,7 +35405,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 14108 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 14109 TRAINER_ENCOUNTER_MUSIC_COOL, #line 14110 @@ -35452,7 +35452,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = #line 14126 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 14127 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 14128 @@ -35497,7 +35497,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = #line 14143 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 14144 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 14145 @@ -35542,7 +35542,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LEADER_ROXANNE, .encounterMusic_gender = #line 14160 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 14161 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 14162 @@ -35643,7 +35643,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LEADER_ROXANNE, .encounterMusic_gender = #line 14202 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 14203 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 14204 @@ -35762,7 +35762,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LEADER_ROXANNE, .encounterMusic_gender = #line 14252 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 14253 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 14254 @@ -35881,7 +35881,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LEADER_ROXANNE, .encounterMusic_gender = #line 14302 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 14303 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 14304 @@ -36936,7 +36936,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LEADER_FLANNERY, .encounterMusic_gender = #line 14752 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 14753 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 14754 @@ -37039,7 +37039,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LEADER_FLANNERY, .encounterMusic_gender = #line 14794 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 14795 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 14796 @@ -37160,7 +37160,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LEADER_FLANNERY, .encounterMusic_gender = #line 14844 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 14845 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 14846 @@ -37299,7 +37299,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LEADER_FLANNERY, .encounterMusic_gender = #line 14902 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 14903 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 14904 @@ -37906,7 +37906,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LEADER_WINONA, .encounterMusic_gender = #line 15160 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 15161 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 15162 @@ -38025,7 +38025,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LEADER_WINONA, .encounterMusic_gender = #line 15210 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 15211 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 15212 @@ -38162,7 +38162,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LEADER_WINONA, .encounterMusic_gender = #line 15268 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 15269 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 15270 @@ -38299,7 +38299,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LEADER_WINONA, .encounterMusic_gender = #line 15326 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 15327 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 15328 @@ -39690,7 +39690,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_SALON_MAIDEN_ANABEL, .encounterMusic_gender = #line 15918 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 15919 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15920 @@ -39788,7 +39788,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_ARENA_TYCOON_GRETA, .encounterMusic_gender = #line 15957 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 15958 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15959 @@ -39854,7 +39854,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PIKE_QUEEN_LUCY, .encounterMusic_gender = #line 15983 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 15984 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15985 @@ -40751,7 +40751,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 16333 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 16334 TRAINER_ENCOUNTER_MUSIC_COOL, #line 16335 @@ -40798,7 +40798,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 16351 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 16352 TRAINER_ENCOUNTER_MUSIC_COOL, #line 16353 @@ -40856,7 +40856,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 16373 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 16374 TRAINER_ENCOUNTER_MUSIC_COOL, #line 16375 @@ -40914,7 +40914,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 16395 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 16396 TRAINER_ENCOUNTER_MUSIC_COOL, #line 16397 @@ -41393,7 +41393,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = #line 16581 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 16582 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 16583 @@ -41482,7 +41482,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = #line 16614 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 16615 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 16616 @@ -41571,7 +41571,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = #line 16647 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 16648 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 16649 @@ -41660,7 +41660,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = #line 16680 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 16681 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 16682 @@ -41749,7 +41749,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 16713 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 16714 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 16715 @@ -41794,7 +41794,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 16730 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 16731 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 16732 @@ -41850,7 +41850,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 16751 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 16752 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 16753 @@ -41906,7 +41906,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = #line 16772 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 16773 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 16774 @@ -41962,7 +41962,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 16793 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 16794 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16795 @@ -42095,7 +42095,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_LEAF, .encounterMusic_gender = #line 16845 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 16846 TRAINER_ENCOUNTER_MUSIC_MALE, #line 16847 @@ -42157,7 +42157,7 @@ F_TRAINER_FEMALE | .trainerPic = TRAINER_PIC_RS_MAY, .encounterMusic_gender = #line 16869 -F_TRAINER_FEMALE | +F_TRAINER_FEMALE | #line 16870 TRAINER_ENCOUNTER_MUSIC_MALE, #line 16871 diff --git a/test/battle/ability/emergency_exit.c b/test/battle/ability/emergency_exit.c index 68724450e1..e17987ba09 100644 --- a/test/battle/ability/emergency_exit.c +++ b/test/battle/ability/emergency_exit.c @@ -47,3 +47,45 @@ SINGLE_BATTLE_TEST("Emergency Exit switches out when going below 50% max-HP but ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); } } + +SINGLE_BATTLE_TEST("Emergency Exit activ out when taking taking residual damage and falling under 50% max-hp damage - Burn") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(134); Status1(STATUS1_BURN); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SEND_OUT(opponent, 1); } + } SCENE { + HP_BAR(opponent); + ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); + } +} + +SINGLE_BATTLE_TEST("Emergency Exit activ out when taking taking residual damage and falling under 50% max-hp damage - Weather") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(134); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SANDSTORM); SEND_OUT(opponent, 1); } + } SCENE { + HP_BAR(opponent); + ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); + } +} + +SINGLE_BATTLE_TEST("Emergency Exit activ out when taking taking residual damage and falling under 50% max-hp damage - Salt Cure") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(160); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SALT_CURE); SEND_OUT(opponent, 1); } + } SCENE { + HP_BAR(opponent); + ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); + } +} diff --git a/test/battle/move_effect/court_change.c b/test/battle/move_effect/court_change.c index 817ab134ca..41381df18c 100644 --- a/test/battle/move_effect/court_change.c +++ b/test/battle/move_effect/court_change.c @@ -107,11 +107,11 @@ DOUBLE_BATTLE_TEST("Court Change used by the player swaps Mist, Safeguard, Auror MESSAGE("Wynaut used Court Change!"); MESSAGE("Wynaut swapped the battle effects affecting each side of the field!"); // The effects now end for the player side. - MESSAGE("Your team's Mist wore off!"); MESSAGE("Your team is no longer protected by Safeguard!"); + MESSAGE("Your team's Mist wore off!"); MESSAGE("Your team's Reflect wore off!"); - MESSAGE("Your team's Aurora Veil wore off!"); MESSAGE("Your team's Tailwind petered out!"); + MESSAGE("Your team's Aurora Veil wore off!"); MESSAGE("Your team's Light Screen wore off!"); } } @@ -144,11 +144,12 @@ DOUBLE_BATTLE_TEST("Court Change used by the opponent swaps Mist, Safeguard, Aur MESSAGE("The opposing Wynaut used Court Change!"); MESSAGE("The opposing Wynaut swapped the battle effects affecting each side of the field!"); // The effects now end for the player side. - MESSAGE("The opposing team's Mist wore off!"); + MESSAGE("The snow stopped."); MESSAGE("The opposing team is no longer protected by Safeguard!"); + MESSAGE("The opposing team's Mist wore off!"); MESSAGE("The opposing team's Reflect wore off!"); - MESSAGE("The opposing team's Aurora Veil wore off!"); MESSAGE("The opposing team's Tailwind petered out!"); + MESSAGE("The opposing team's Aurora Veil wore off!"); MESSAGE("The opposing team's Light Screen wore off!"); } } diff --git a/test/battle/move_effect/wish.c b/test/battle/move_effect/wish.c new file mode 100644 index 0000000000..c1e5459f02 --- /dev/null +++ b/test/battle/move_effect/wish.c @@ -0,0 +1,25 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_WISH) == EFFECT_WISH); +} + +SINGLE_BATTLE_TEST("Wish restores 50% of max player HP") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WISH); } + TURN { } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WISH, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + MESSAGE("Wynaut's wish came true!"); + HP_BAR(player, hp: 100); + MESSAGE("Wynaut's HP was restored."); + } +} + diff --git a/test/battle/move_effect_secondary/throat_chop.c b/test/battle/move_effect_secondary/throat_chop.c index e640948c95..c2724a0f38 100644 --- a/test/battle/move_effect_secondary/throat_chop.c +++ b/test/battle/move_effect_secondary/throat_chop.c @@ -24,22 +24,24 @@ SINGLE_BATTLE_TEST("Throat Chop prevents the usage of sound moves") } } -SINGLE_BATTLE_TEST("Throat Chop won't work through a substitute") +SINGLE_BATTLE_TEST("Throat Chop prevents sound base moves for 2 turns") { GIVEN { - PLAYER(SPECIES_INCINEROAR) { Speed(100); }; - OPPONENT(SPECIES_WOBBUFFET) { Speed(50); }; + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HYPER_VOICE, MOVE_ALLURING_VOICE, MOVE_OVERDRIVE, MOVE_ROUND); } } WHEN { - TURN { MOVE(opponent, MOVE_SUBSTITUTE); } - TURN { MOVE(player, MOVE_THROAT_CHOP); MOVE(opponent, MOVE_HYPER_VOICE); } - TURN {} + TURN { MOVE(opponent, MOVE_HYPER_VOICE); MOVE(player, MOVE_THROAT_CHOP); } + TURN { FORCED_MOVE(opponent); } + TURN { MOVE(opponent, MOVE_HYPER_VOICE); MOVE(player, MOVE_THROAT_CHOP); } + TURN { FORCED_MOVE(opponent); } + TURN { MOVE(opponent, MOVE_HYPER_VOICE); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, opponent); - HP_BAR(opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, opponent); ANIMATION(ANIM_TYPE_MOVE, MOVE_THROAT_CHOP, player); - NONE_OF { - MESSAGE("The effects of Throat Chop prevent the opposing Wobbuffet from using certain moves!"); - } + ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_THROAT_CHOP, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, opponent); ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, opponent); } }