From c428d1bdbbff34858304a13d2c70ddeabc3cd38b Mon Sep 17 00:00:00 2001 From: MissingNoL Date: Sun, 23 May 2021 17:59:14 -0700 Subject: [PATCH 001/193] Coded Hyperspace Fury --- data/battle_scripts_1.s | 11 +++++++++++ include/battle_scripts.h | 1 + src/battle_script_commands.c | 7 ++++++- src/data/battle_moves.h | 10 +++++----- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 77eddc8ab..3c59041b6 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6058,6 +6058,17 @@ BattleScript_AtkDefDownTryDef: BattleScript_AtkDefDownRet: return +BattleScript_DefDown:: + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE + setstatchanger STAT_DEF, 1, TRUE + statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_BUFF_ALLOW_PTR, BattleScript_DefDownRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_DefDownRet + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_DefDownRet: + return + BattleScript_DefSpDefDown:: setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 0b94a6ae7..196383dc3 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -90,6 +90,7 @@ extern const u8 BattleScript_SelectingNotAllowedMoveTauntInPalace[]; extern const u8 BattleScript_WishComesTrue[]; extern const u8 BattleScript_IngrainTurnHeal[]; extern const u8 BattleScript_AtkDefDown[]; +extern const u8 BattleScript_DefDown[]; // Hyperspace Fury extern const u8 BattleScript_DefSpDefDown[]; extern const u8 BattleScript_KnockedOff[]; extern const u8 BattleScript_MoveUsedIsImprisoned[]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index fc0eedcbc..b990f7d7d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3148,7 +3148,12 @@ void SetMoveEffect(bool32 primary, u32 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectFeint; } - } + } + if (gCurrentMove == MOVE_HYPERSPACE_FURY) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_DefDown; + } break; case MOVE_EFFECT_SPECTRAL_THIEF: gBattleStruct->stolenStats[0] = 0; // Stats to steal. diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 61050e44f..fa1d54c39 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -9581,15 +9581,15 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_HYPERSPACE_FURY] = { - .effect = EFFECT_PLACEHOLDER, - .power = 0, + .effect = EFFECT_FEINT, + .power = 100, .type = TYPE_DARK, .accuracy = 0, - .pp = 0, - .secondaryEffectChance = 0, + .pp = 5, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, From 0d47269798452d1fa05fde08e25323f0c605b003 Mon Sep 17 00:00:00 2001 From: MissingNoL Date: Sun, 23 May 2021 18:11:53 -0700 Subject: [PATCH 002/193] Spaces instead of tabs --- src/battle_script_commands.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b990f7d7d..ede3d16a3 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3149,11 +3149,11 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattlescriptCurrInstr = BattleScript_MoveEffectFeint; } } - if (gCurrentMove == MOVE_HYPERSPACE_FURY) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_DefDown; - } + if (gCurrentMove == MOVE_HYPERSPACE_FURY) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_DefDown; + } break; case MOVE_EFFECT_SPECTRAL_THIEF: gBattleStruct->stolenStats[0] = 0; // Stats to steal. From 07a9674d22dc60fb2f5f059573ec48a950803d0c Mon Sep 17 00:00:00 2001 From: MissingNoL Date: Sun, 23 May 2021 18:30:22 -0700 Subject: [PATCH 003/193] Fixed --- data/battle_scripts_1.s | 11 ----------- include/battle_scripts.h | 1 - src/battle_script_commands.c | 5 ----- src/data/battle_moves.h | 3 ++- 4 files changed, 2 insertions(+), 18 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3c59041b6..77eddc8ab 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6058,17 +6058,6 @@ BattleScript_AtkDefDownTryDef: BattleScript_AtkDefDownRet: return -BattleScript_DefDown:: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE - setstatchanger STAT_DEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_BUFF_ALLOW_PTR, BattleScript_DefDownRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_DefDownRet - printfromtable gStatDownStringIds - waitmessage 0x40 -BattleScript_DefDownRet: - return - BattleScript_DefSpDefDown:: setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 196383dc3..0b94a6ae7 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -90,7 +90,6 @@ extern const u8 BattleScript_SelectingNotAllowedMoveTauntInPalace[]; extern const u8 BattleScript_WishComesTrue[]; extern const u8 BattleScript_IngrainTurnHeal[]; extern const u8 BattleScript_AtkDefDown[]; -extern const u8 BattleScript_DefDown[]; // Hyperspace Fury extern const u8 BattleScript_DefSpDefDown[]; extern const u8 BattleScript_KnockedOff[]; extern const u8 BattleScript_MoveUsedIsImprisoned[]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ede3d16a3..e9fce3ac6 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3149,11 +3149,6 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattlescriptCurrInstr = BattleScript_MoveEffectFeint; } } - if (gCurrentMove == MOVE_HYPERSPACE_FURY) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_DefDown; - } break; case MOVE_EFFECT_SPECTRAL_THIEF: gBattleStruct->stolenStats[0] = 0; // Stats to steal. diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index fa1d54c39..5a9de6b9e 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -9581,7 +9581,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_HYPERSPACE_FURY] = { - .effect = EFFECT_FEINT, + .effect = EFFECT_ATTACKER_DEFENSE_DOWN_HIT, .power = 100, .type = TYPE_DARK, .accuracy = 0, @@ -9591,6 +9591,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .priority = 0, .flags = FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, .split = SPLIT_PHYSICAL, + .argument = MOVE_EFFECT_FEINT, }, [MOVE_SHORE_UP] = From 031504cd1217c3a0358b3e3466a09ecf02da7118 Mon Sep 17 00:00:00 2001 From: MissingNoL Date: Sun, 23 May 2021 18:31:49 -0700 Subject: [PATCH 004/193] Spaces instead of tabs --- src/battle_script_commands.c | 2 +- src/data/battle_moves.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e9fce3ac6..fc0eedcbc 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3148,7 +3148,7 @@ void SetMoveEffect(bool32 primary, u32 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectFeint; } - } + } break; case MOVE_EFFECT_SPECTRAL_THIEF: gBattleStruct->stolenStats[0] = 0; // Stats to steal. diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 5a9de6b9e..689218c3a 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -9591,7 +9591,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .priority = 0, .flags = FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, .split = SPLIT_PHYSICAL, - .argument = MOVE_EFFECT_FEINT, + .argument = MOVE_EFFECT_FEINT, }, [MOVE_SHORE_UP] = From 5840b1f0ede5d9c82cf545b5ff2c175d6b826dd3 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Mon, 24 May 2021 09:52:45 -0600 Subject: [PATCH 005/193] utility umbrella effect --- asm/macros/battle_script.inc | 6 +++ data/battle_scripts_1.s | 8 ++- include/battle_util.h | 1 + include/constants/battle_script_commands.h | 1 + src/battle_main.c | 13 ++--- src/battle_script_commands.c | 34 ++++++++----- src/battle_util.c | 57 ++++++++++++++-------- 7 files changed, 76 insertions(+), 44 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 9fa3fe0c3..649afc834 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1768,6 +1768,12 @@ .macro tryactivategrimneigh, battler:req various \battler, VARIOUS_TRY_ACTIVATE_GRIM_NEIGH .endm + + .macro jumpifweatheraffected battler:req, weather:req, ptr:req + various \battler, VARIOUS_JUMP_IF_WEATHER_AFFECTED + .4byte \weather + .4byte \ptr + .endm @ helpful macros .macro setstatchanger stat:req, stages:req, down:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 77eddc8ab..f73c59590 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1288,7 +1288,7 @@ BattleScript_GrowthDoMoveAnim:: waitanimation setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK, 0 - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_ANY, BattleScript_GrowthAtk2 + jumpifweatheraffected BS_ATTACKER, WEATHER_SUN_ANY, BattleScript_GrowthAtk2 setstatchanger STAT_ATK, 1, FALSE goto BattleScript_GrowthAtk BattleScript_GrowthAtk2: @@ -1299,7 +1299,7 @@ BattleScript_GrowthAtk: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GrowthTrySpAtk:: - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_ANY, BattleScript_GrowthSpAtk2 + jumpifweatheraffected BS_ATTACKER, WEATHER_SUN_ANY, BattleScript_GrowthSpAtk2 setstatchanger STAT_SPATK, 1, FALSE goto BattleScript_GrowthSpAtk BattleScript_GrowthSpAtk2: @@ -4015,9 +4015,7 @@ BattleScript_EffectGust:: goto BattleScript_EffectHit BattleScript_EffectSolarbeam:: - jumpifabilitypresent ABILITY_CLOUD_NINE, BattleScript_SolarbeamDecideTurn - jumpifabilitypresent ABILITY_AIR_LOCK, BattleScript_SolarbeamDecideTurn - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_TEMPORARY | WEATHER_SUN_PERMANENT, BattleScript_SolarbeamOnFirstTurn + jumpifweatheraffected BS_ATTACKER, WEATHER_SUN_ANY, BattleScript_SolarbeamOnFirstTurn BattleScript_SolarbeamDecideTurn:: jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn diff --git a/include/battle_util.h b/include/battle_util.h index f06a58938..98439e4e1 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -138,6 +138,7 @@ bool32 IsTelekinesisBannedSpecies(u16 species); bool32 IsHealBlockPreventingMove(u32 battler, u32 move); bool32 IsThawingMove(u8 battlerId, u16 move); bool32 HasEnoughHpToEatBerry(u32 battlerId, u32 hpFraction, u32 itemId); +bool32 IsBattlerWeatherAffected(u8 battlerId, u32 weatherFlags); // ability checks bool32 IsRolePlayBannedAbilityAtk(u16 ability); diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index faaf8f17e..a738fd9e0 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -173,6 +173,7 @@ #define VARIOUS_DESTROY_ABILITY_POPUP 102 #define VARIOUS_TOTEM_BOOST 103 #define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 104 +#define VARIOUS_JUMP_IF_WEATHER_AFFECTED 105 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_main.c b/src/battle_main.c index 814bcb66c..9825f1680 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4229,9 +4229,9 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId) // weather abilities if (WEATHER_HAS_EFFECT) { - if (ability == ABILITY_SWIFT_SWIM && gBattleWeather & WEATHER_RAIN_ANY) + if (ability == ABILITY_SWIFT_SWIM && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA && gBattleWeather & WEATHER_RAIN_ANY) speed *= 2; - else if (ability == ABILITY_CHLOROPHYLL && gBattleWeather & WEATHER_SUN_ANY) + else if (ability == ABILITY_CHLOROPHYLL && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA && gBattleWeather & WEATHER_SUN_ANY) speed *= 2; else if (ability == ABILITY_SAND_RUSH && gBattleWeather & WEATHER_SANDSTORM_ANY) speed *= 2; @@ -5002,6 +5002,7 @@ void RunBattleScriptCommands(void) void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) { u32 moveType, ateType, attackerAbility; + u16 holdEffect = GetBattlerHoldEffect(battlerAtk, TRUE); if (move == MOVE_STRUGGLE) return; @@ -5014,11 +5015,11 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) { if (WEATHER_HAS_EFFECT) { - if (gBattleWeather & WEATHER_RAIN_ANY) + if (gBattleWeather & WEATHER_RAIN_ANY && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA) gBattleStruct->dynamicMoveType = TYPE_WATER | 0x80; else if (gBattleWeather & WEATHER_SANDSTORM_ANY) gBattleStruct->dynamicMoveType = TYPE_ROCK | 0x80; - else if (gBattleWeather & WEATHER_SUN_ANY) + else if (gBattleWeather & WEATHER_SUN_ANY && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA) gBattleStruct->dynamicMoveType = TYPE_FIRE | 0x80; else if (gBattleWeather & WEATHER_HAIL_ANY) gBattleStruct->dynamicMoveType = TYPE_ICE | 0x80; @@ -5042,7 +5043,7 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) } else if (gBattleMoves[move].effect == EFFECT_CHANGE_TYPE_ON_ITEM) { - if (GetBattlerHoldEffect(battlerAtk, TRUE) == gBattleMoves[move].argument) + if (holdEffect == gBattleMoves[move].argument) gBattleStruct->dynamicMoveType = ItemId_GetSecondaryId(gBattleMons[battlerAtk].item) | 0x80; } else if (gBattleMoves[move].effect == EFFECT_REVELATION_DANCE) @@ -5098,7 +5099,7 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) // Check if a gem should activate. GET_MOVE_TYPE(move, moveType); - if (GetBattlerHoldEffect(battlerAtk, TRUE) == HOLD_EFFECT_GEMS + if (holdEffect == HOLD_EFFECT_GEMS && moveType == ItemId_GetSecondaryId(gBattleMons[battlerAtk].item)) { gSpecialStatuses[battlerAtk].gemParam = GetBattlerHoldEffectParam(battlerAtk); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2c6bc25bf..ae8f22075 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1474,13 +1474,13 @@ static bool32 AccuracyCalcHelper(u16 move) return TRUE; } - if ((WEATHER_HAS_EFFECT && - (((gBattleWeather & WEATHER_RAIN_ANY) && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE)) - || (((gBattleWeather & WEATHER_HAIL_ANY) && move == MOVE_BLIZZARD)))) - || (gBattleMoves[move].effect == EFFECT_VITAL_THROW) - || (gBattleMoves[move].accuracy == 0) - || ((B_MINIMIZE_DMG_ACC >= GEN_6) && (gStatuses3[gBattlerTarget] & STATUS3_MINIMIZED) && (gBattleMoves[move].flags & FLAG_DMG_MINIMIZE))) + if (gBattleMoves[move].effect == EFFECT_VITAL_THROW + || gBattleMoves[move].accuracy == 0 + || ((B_MINIMIZE_DMG_ACC >= GEN_6) && (gStatuses3[gBattlerTarget] & STATUS3_MINIMIZED) && (gBattleMoves[move].flags & FLAG_DMG_MINIMIZE)) + || (IsBattlerWeatherAffected(gBattlerTarget, WEATHER_RAIN_ANY) && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE)) + || (gBattleWeather & WEATHER_HAIL_ANY && move == MOVE_BLIZZARD)) { + // thunder/hurricane ignore acc checks in rain unless target is holding utility umbrella JumpIfMoveFailed(7, move); return TRUE; } @@ -1523,8 +1523,8 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move) moveAcc = gBattleMoves[move].accuracy; // Check Thunder and Hurricane on sunny weather. - if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY - && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE)) + if (IsBattlerWeatherAffected(battlerDef, WEATHER_SUN_ANY) + && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE)) moveAcc = 50; // Check Wonder Skin. if (defAbility == ABILITY_WONDER_SKIN && gBattleMoves[move].power == 0) @@ -2552,7 +2552,7 @@ void SetMoveEffect(bool32 primary, u32 certain) statusChanged = TRUE; break; case STATUS1_FREEZE: - if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) + if (IsBattlerWeatherAffected(gEffectBattler, WEATHER_SUN_ANY)) noSunCanFreeze = FALSE; if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_ICE)) break; @@ -7056,7 +7056,7 @@ u32 IsFlowerVeilProtected(u32 battler) u32 IsLeafGuardProtected(u32 battler) { - if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_SUN_ANY)) + if (IsBattlerWeatherAffected(battler, WEATHER_SUN_ANY)) return GetBattlerAbility(battler) == ABILITY_LEAF_GUARD; else return 0; @@ -8349,6 +8349,15 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; // exit if loop failed (failsafe) } return; + case VARIOUS_JUMP_IF_WEATHER_AFFECTED: + { + u32 weatherFlags = T1_READ_32(gBattlescriptCurrInstr + 3); + if (IsBattlerWeatherAffected(gActiveBattler, weatherFlags)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 7); + else + gBattlescriptCurrInstr += 11; + } + return; } gBattlescriptCurrInstr += 3; @@ -10154,11 +10163,12 @@ static bool8 IsTwoTurnsMove(u16 move) return FALSE; } +// unused static u8 AttacksThisTurn(u8 battlerId, u16 move) // Note: returns 1 if it's a charging turn, otherwise 2 { // first argument is unused if (gBattleMoves[move].effect == EFFECT_SOLARBEAM - && (gBattleWeather & WEATHER_SUN_ANY)) + && IsBattlerWeatherAffected(battlerId, WEATHER_SUN_ANY)) return 2; if (gBattleMoves[move].effect == EFFECT_SKULL_BASH @@ -10816,7 +10826,7 @@ static void Cmd_recoverbasedonsunlight(void) { if (!(gBattleWeather & WEATHER_ANY) || !WEATHER_HAS_EFFECT) gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; - else if (gBattleWeather & WEATHER_SUN_ANY) + else if (IsBattlerWeatherAffected(gBattlerAttacker, WEATHER_SUN_ANY)) gBattleMoveDamage = 20 * gBattleMons[gBattlerAttacker].maxHP / 30; else // not sunny weather gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; diff --git a/src/battle_util.c b/src/battle_util.c index 4c3f795de..b8c6a4168 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3608,7 +3608,8 @@ u8 TryWeatherFormChange(u8 battler) { u8 ret = 0; bool32 weatherEffect = WEATHER_HAS_EFFECT; - + u16 holdEffect = GetBattlerHoldEffect(battler, TRUE); + if (gBattleMons[battler].species == SPECIES_CASTFORM) { if (gBattleMons[battler].ability != ABILITY_FORECAST || gBattleMons[battler].hp == 0) @@ -3624,17 +3625,17 @@ u8 TryWeatherFormChange(u8 battler) { ret = 0; } - else if (!(gBattleWeather & (WEATHER_RAIN_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY)) && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL)) + else if (holdEffect == HOLD_EFFECT_UTILITY_UMBRELLA || (!(gBattleWeather & (WEATHER_RAIN_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY)) && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL))) { SET_BATTLER_TYPE(battler, TYPE_NORMAL); ret = 1; } - else if (gBattleWeather & WEATHER_SUN_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_FIRE)) + else if (gBattleWeather & WEATHER_SUN_ANY && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA && !IS_BATTLER_OF_TYPE(battler, TYPE_FIRE)) { SET_BATTLER_TYPE(battler, TYPE_FIRE); ret = 2; } - else if (gBattleWeather & WEATHER_RAIN_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_WATER)) + else if (gBattleWeather & WEATHER_RAIN_ANY && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA && !IS_BATTLER_OF_TYPE(battler, TYPE_WATER)) { SET_BATTLER_TYPE(battler, TYPE_WATER); ret = 3; @@ -3649,9 +3650,9 @@ u8 TryWeatherFormChange(u8 battler) { if (gBattleMons[battler].ability != ABILITY_FLOWER_GIFT || gBattleMons[battler].hp == 0) ret = 0; - else if (gBattleMonForms[battler] == 0 && weatherEffect && gBattleWeather & WEATHER_SUN_ANY) + else if (gBattleMonForms[battler] == 0 && weatherEffect && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA && gBattleWeather & WEATHER_SUN_ANY) ret = 2; - else if (gBattleMonForms[battler] != 0 && (!weatherEffect || !(gBattleWeather & WEATHER_SUN_ANY))) + else if (gBattleMonForms[battler] != 0 && (!weatherEffect || holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA || !(gBattleWeather & WEATHER_SUN_ANY))) ret = 1; } @@ -4258,7 +4259,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move switch (gLastUsedAbility) { case ABILITY_HARVEST: - if (((WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) || Random() % 2 == 0) + if ((IsBattlerWeatherAffected(battler, WEATHER_SUN_ANY) || Random() % 2 == 0) && gBattleMons[battler].item == ITEM_NONE && gBattleStruct->changedItems[battler] == ITEM_NONE && ItemId_GetPocket(gBattleStruct->usedHeldItems[battler]) == POCKET_BERRIES) @@ -4270,12 +4271,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move } break; case ABILITY_DRY_SKIN: - if (gBattleWeather & WEATHER_SUN_ANY) + if (IsBattlerWeatherAffected(battler, WEATHER_SUN_ANY)) goto SOLAR_POWER_HP_DROP; // Dry Skin works similarly to Rain Dish in Rain case ABILITY_RAIN_DISH: - if (WEATHER_HAS_EFFECT - && (gBattleWeather & WEATHER_RAIN_ANY) + if (IsBattlerWeatherAffected(battler, WEATHER_RAIN_ANY) && !BATTLER_MAX_HP(battler) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) { @@ -4288,8 +4288,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move } break; case ABILITY_HYDRATION: - if (WEATHER_HAS_EFFECT - && (gBattleWeather & WEATHER_RAIN_ANY) + if (IsBattlerWeatherAffected(battler, WEATHER_RAIN_ANY) && gBattleMons[battler].status1 & STATUS1_ANY) { goto ABILITY_HEAL_MON_STATUS; @@ -4384,7 +4383,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move break; SOLAR_POWER_HP_DROP: case ABILITY_SOLAR_POWER: - if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) + if (IsBattlerWeatherAffected(battler, WEATHER_SUN_ANY)) { BattleScriptPushCursorAndCallback(BattleScript_SolarPowerActivates); gBattleMoveDamage = gBattleMons[battler].maxHP / 8; @@ -7467,7 +7466,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe // todo break; case EFFECT_SOLARBEAM: - if (WEATHER_HAS_EFFECT && gBattleWeather & (WEATHER_HAIL_ANY | WEATHER_SANDSTORM_ANY | WEATHER_RAIN_ANY)) + if (IsBattlerWeatherAffected(battlerAtk, (WEATHER_HAIL_ANY | WEATHER_SANDSTORM_ANY | WEATHER_RAIN_ANY))) MulModifier(&modifier, UQ_4_12(0.5)); break; case EFFECT_STOMPING_TANTRUM: @@ -7564,7 +7563,7 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b MulModifier(&modifier, UQ_4_12(0.5)); break; case ABILITY_SOLAR_POWER: - if (IS_MOVE_SPECIAL(move) && WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) + if (IS_MOVE_SPECIAL(move) && IsBattlerWeatherAffected(battlerAtk, WEATHER_SUN_ANY)) MulModifier(&modifier, UQ_4_12(1.5)); break; case ABILITY_DEFEATIST: @@ -7601,7 +7600,7 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b } break; case ABILITY_FLOWER_GIFT: - if (gBattleMons[battlerAtk].species == SPECIES_CHERRIM && WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_SUN_ANY) && IS_MOVE_PHYSICAL(move)) + if (gBattleMons[battlerAtk].species == SPECIES_CHERRIM && IsBattlerWeatherAffected(battlerAtk, WEATHER_SUN_ANY) && IS_MOVE_PHYSICAL(move)) MulModifier(&modifier, UQ_4_12(1.5)); break; case ABILITY_HUSTLE: @@ -7641,7 +7640,7 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b switch (GetBattlerAbility(BATTLE_PARTNER(battlerAtk))) { case ABILITY_FLOWER_GIFT: - if (gBattleMons[BATTLE_PARTNER(battlerAtk)].species == SPECIES_CHERRIM && IS_MOVE_PHYSICAL(move)) + if (gBattleMons[BATTLE_PARTNER(battlerAtk)].species == SPECIES_CHERRIM && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerAtk), WEATHER_SUN_ANY) && IS_MOVE_PHYSICAL(move)) MulModifier(&modifier, UQ_4_12(1.5)); break; } @@ -7771,7 +7770,7 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, } break; case ABILITY_FLOWER_GIFT: - if (gBattleMons[battlerDef].species == SPECIES_CHERRIM && WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY && !usesDefStat) + if (gBattleMons[battlerDef].species == SPECIES_CHERRIM && IsBattlerWeatherAffected(battlerDef, WEATHER_SUN_ANY) && !usesDefStat) MulModifier(&modifier, UQ_4_12(1.5)); break; case ABILITY_PUNK_ROCK: @@ -7786,7 +7785,7 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, switch (GetBattlerAbility(BATTLE_PARTNER(battlerDef))) { case ABILITY_FLOWER_GIFT: - if (gBattleMons[BATTLE_PARTNER(battlerDef)].species == SPECIES_CHERRIM && !usesDefStat) + if (gBattleMons[BATTLE_PARTNER(battlerDef)].species == SPECIES_CHERRIM && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerDef), WEATHER_SUN_ANY) && !usesDefStat) MulModifier(&modifier, UQ_4_12(1.5)); break; } @@ -7852,14 +7851,14 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move dmg = ApplyModifier(UQ_4_12(0.5), dmg); // check sunny/rain weather - if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_RAIN_ANY) + if (IsBattlerWeatherAffected(battlerAtk, WEATHER_RAIN_ANY)) { if (moveType == TYPE_FIRE) dmg = ApplyModifier(UQ_4_12(0.5), dmg); else if (moveType == TYPE_WATER) dmg = ApplyModifier(UQ_4_12(1.5), dmg); } - else if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) + else if (IsBattlerWeatherAffected(battlerAtk, WEATHER_SUN_ANY)) { if (moveType == TYPE_FIRE) dmg = ApplyModifier(UQ_4_12(1.5), dmg); @@ -8657,3 +8656,19 @@ bool32 IsEntrainmentTargetOrSimpleBeamBannedAbility(u16 ability) return FALSE; } +bool32 IsBattlerWeatherAffected(u8 battlerId, u32 weatherFlags) +{ + if (!WEATHER_HAS_EFFECT) + return FALSE; + + if (gBattleWeather & weatherFlags) + { + // given weather is active -> check if its sun, rain against utility umbrella ( since only 1 weather can be active at once) + if (gBattleWeather & (WEATHER_SUN_ANY | WEATHER_RAIN_ANY) && GetBattlerHoldEffect(battlerId, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) + return FALSE; // utility umbrella blocks sun, rain effects + + return TRUE; + } + return FALSE; +} + From bfc66a21cc6a03ea34e3f1dd4d8647a7943b54fd Mon Sep 17 00:00:00 2001 From: MissingNoL Date: Sun, 6 Jun 2021 19:14:11 -0700 Subject: [PATCH 006/193] `gBattlescriptCurrInstr[3]` is not reading `species` parameter --- asm/macros/battle_script.inc | 6 ++++++ data/battle_scripts_1.s | 13 +++++++++++++ include/constants/battle_config.h | 2 ++ include/constants/battle_move_effects.h | 3 ++- include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 4 +++- include/constants/pokemon.h | 1 + src/battle_message.c | 4 ++++ src/battle_script_commands.c | 8 ++++++++ src/data/battle_moves.h | 4 ++-- 10 files changed, 42 insertions(+), 4 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 9fa3fe0c3..9d624195b 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1769,6 +1769,12 @@ various \battler, VARIOUS_TRY_ACTIVATE_GRIM_NEIGH .endm + .macro jumpifspecies battler:req, species:req, ptr:req + various \battler, VARIOUS_JUMP_IF_SPECIES + .byte \species + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b5dc673a0..6fb81c9ac 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -11,6 +11,7 @@ #include "constants/game_stat.h" #include "constants/trainers.h" #include "constants/battle_config.h" +#include "constants/species.h" .include "asm/macros.inc" .include "asm/macros/battle_script.inc" .include "constants/constants.inc" @@ -369,6 +370,18 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSleepHit .4byte BattleScript_EffectAttackerDefenseDownHit .4byte BattleScript_EffectBodyPress + .4byte BattleScript_EffectHyperspaceFury + +BattleScript_EffectHyperspaceFury: + jumpifspecies BS_ATTACKER, SPECIES_HOOPA_UNBOUND, BattleScript_EffectAttackerDefenseDownHit + jumpifspecies BS_ATTACKER, SPECIES_HOOPA, BattleScript_ButHoopaCantUseIt + printstring STRINGID_BUTPOKEMONCANTUSETHEMOVE + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd +BattleScript_ButHoopaCantUseIt: + printstring STRINGID_BUTHOOPACANTUSEIT + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd BattleScript_EffectAttackerDefenseDownHit: setmoveeffect MOVE_EFFECT_DEF_MINUS_1 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index fe376da8d..9e610b43c 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -35,6 +35,8 @@ #define SPECIES_ZYGARDE 0 // 50% #define SPECIES_ZYGARDE_10 10011 // 10 % #define SPECIES_ZYGARDE_COMPLETE 10012 // 100 % + #define SPECIES_HOOPA 0 + #define SPECIES_HOOPA_UNBOUND 10013 #endif // Items with peculiar battle effects. diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 6174ca496..0fa6dea89 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -353,7 +353,8 @@ #define EFFECT_SLEEP_HIT 347 // Relic Song #define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 348 #define EFFECT_BODY_PRESS 349 +#define EFFECT_HYPERSPACE_FURY 350 -#define NUM_BATTLE_MOVE_EFFECTS 350 +#define NUM_BATTLE_MOVE_EFFECTS 351 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index faaf8f17e..87139bbe0 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -173,6 +173,7 @@ #define VARIOUS_DESTROY_ABILITY_POPUP 102 #define VARIOUS_TOTEM_BOOST 103 #define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 104 +#define VARIOUS_JUMP_IF_SPECIES 105 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 266aef147..9e3941324 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -570,8 +570,10 @@ #define STRINGID_MICLEBERRYACTIVATES 566 #define STRINGID_PKMNSHOOKOFFTHETAUNT 567 #define STRINGID_PKMNGOTOVERITSINFATUATION 568 +#define STRINGID_BUTPOKEMONCANTUSETHEMOVE 569 +#define STRINGID_BUTHOOPACANTUSEIT 570 -#define BATTLESTRINGS_COUNT 569 +#define BATTLESTRINGS_COUNT 571 // The below IDs are all indexes into battle message tables, // used to determine which of a set of messages to print. diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 322bee706..39157a53b 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -315,6 +315,7 @@ #define FLAG_DMG_2X_IN_AIR (1 << 22) // If target is in the air, can hit and deal double damage. #define FLAG_DMG_IN_AIR (1 << 23) // If target is in the air, can hit. #define FLAG_DMG_UNGROUNDED_IGNORE_TYPE_IF_FLYING (1 << 24) // Makes a Ground type move do 1x damage to flying and levitating targets +#define FLAG_HIT_IN_SUBSTITUTE (1 << 25) // Hyperspace Fury // Split defines. #define SPLIT_PHYSICAL 0x0 diff --git a/src/battle_message.c b/src/battle_message.c index d4d5756f9..9f4de13d9 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -696,6 +696,8 @@ static const u8 sText_CanActFaster[] = _("{B_ATK_NAME_WITH_PREFIX} can act faste static const u8 sText_MicleBerryActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} boosted the accuracy of its\nnext move using {B_LAST_ITEM}!"); static const u8 sText_PkmnShookOffTheTaunt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} shook off\nthe taunt!"); static const u8 sText_PkmnGotOverItsInfatuation[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} got over\nits infatuation!"); +static const u8 sText_ButPokemonCantUseTheMove[] = _("But {B_ATK_NAME_WITH_PREFIX} can't\nuse the move!"); +static const u8 sText_ButHoopaCantUseIt[] = _("But Hoopa can't use it\nthe way it is now!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1256,6 +1258,8 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_AURABREAKENTERS - 12] = sText_AuraBreakActivates, [STRINGID_COMATOSEENTERS - 12] = sText_ComatoseActivates, [STRINGID_SCREENCLEANERENTERS - 12] = sText_ScreenCleanerActivates, + [STRINGID_BUTPOKEMONCANTUSETHEMOVE - 12] = sText_ButPokemonCantUseTheMove, + [STRINGID_BUTHOOPACANTUSEIT - 12] = sText_ButHoopaCantUseIt, }; const u16 gTerrainStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4c95ecb63..2a4b2e347 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8426,6 +8426,12 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; // exit if loop failed (failsafe) } return; + case VARIOUS_JUMP_IF_SPECIES: + if (gBattleMons[gBattlerAttacker].species == gBattlescriptCurrInstr[3]) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 4); + else + gBattlescriptCurrInstr += 8; + return; } gBattlescriptCurrInstr += 3; @@ -11862,6 +11868,8 @@ bool32 DoesSubstituteBlockMove(u8 battlerAtk, u8 battlerDef, u32 move) return FALSE; else if (GetBattlerAbility(battlerAtk) == ABILITY_INFILTRATOR) return FALSE; + else if (gBattleMoves[move].flags & FLAG_HIT_IN_SUBSTITUTE) + return FALSE; else return TRUE; } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 7746b1196..ecc0f907b 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -9678,7 +9678,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_HYPERSPACE_FURY] = { - .effect = EFFECT_ATTACKER_DEFENSE_DOWN_HIT, + .effect = EFFECT_HYPERSPACE_FURY, .power = 100, .type = TYPE_DARK, .accuracy = 0, @@ -9686,7 +9686,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_HIT_IN_SUBSTITUTE, .split = SPLIT_PHYSICAL, .argument = MOVE_EFFECT_FEINT, }, From beb126b534a0df8af3ffb9d105b10793401665ac Mon Sep 17 00:00:00 2001 From: MissingNoL Date: Sat, 12 Jun 2021 13:58:54 -0700 Subject: [PATCH 007/193] Implemented Zippy Zap's effect --- data/battle_scripts_1.s | 5 +++++ include/constants/battle_move_effects.h | 3 ++- src/data/battle_moves.h | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 11616e300..39a5ddca7 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -369,6 +369,11 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSleepHit .4byte BattleScript_EffectAttackerDefenseDownHit .4byte BattleScript_EffectBodyPress + .4byte BattleScript_EffectEvasionUpHit + +BattleScript_EffectEvasionUpHit: + setmoveeffect MOVE_EFFECT_EVS_PLUS_1 | MOVE_EFFECT_AFFECTS_USER + goto BattleScript_EffectHit BattleScript_EffectAttackerDefenseDownHit: setmoveeffect MOVE_EFFECT_DEF_MINUS_1 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 6174ca496..3e831cfd3 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -353,7 +353,8 @@ #define EFFECT_SLEEP_HIT 347 // Relic Song #define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 348 #define EFFECT_BODY_PRESS 349 +#define EFFECT_EVASION_UP_HIT 350 -#define NUM_BATTLE_MOVE_EFFECTS 350 +#define NUM_BATTLE_MOVE_EFFECTS 351 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index db02083b0..41aad29f6 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -10456,7 +10456,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = { #if B_UPDATED_MOVE_DATA >= GEN_8 .power = 80, - .effect = EFFECT_PLACEHOLDER, // TODO: EFFECT_EVASION_UP_HIT + .effect = EFFECT_EVASION_UP_HIT, // TODO: EFFECT_EVASION_UP_HIT .pp = 10, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, #else From 610b18bfdbfbf6564978385e37a84989d7e9c928 Mon Sep 17 00:00:00 2001 From: MissingNoL Date: Sat, 12 Jun 2021 14:27:50 -0700 Subject: [PATCH 008/193] Implemented Double Iron Bash's effect --- data/battle_scripts_1.s | 11 +++++++++++ include/constants/battle_move_effects.h | 3 ++- src/data/battle_moves.h | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 39a5ddca7..d41231dcd 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -370,6 +370,17 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectAttackerDefenseDownHit .4byte BattleScript_EffectBodyPress .4byte BattleScript_EffectEvasionUpHit + .4byte BattleScript_EffectDoubleIronBash + +BattleScript_EffectDoubleIronBash: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + setmultihitcounter 2 + initmultihitstring + sethword sMULTIHIT_EFFECT, MOVE_EFFECT_FLINCH + goto BattleScript_MultiHitLoop BattleScript_EffectEvasionUpHit: setmoveeffect MOVE_EFFECT_EVS_PLUS_1 | MOVE_EFFECT_AFFECTS_USER diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 3e831cfd3..d056edf6a 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -354,7 +354,8 @@ #define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 348 #define EFFECT_BODY_PRESS 349 #define EFFECT_EVASION_UP_HIT 350 +#define EFFECT_DOUBLE_IRON_BASH 351 -#define NUM_BATTLE_MOVE_EFFECTS 351 +#define NUM_BATTLE_MOVE_EFFECTS 352 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 41aad29f6..4a917dc9b 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -10456,7 +10456,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = { #if B_UPDATED_MOVE_DATA >= GEN_8 .power = 80, - .effect = EFFECT_EVASION_UP_HIT, // TODO: EFFECT_EVASION_UP_HIT + .effect = EFFECT_EVASION_UP_HIT, .pp = 10, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, #else @@ -10716,7 +10716,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = #else .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_DMG_MINIMIZE | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST, #endif - .effect = EFFECT_PLACEHOLDER, //TODO (EFFECT_FLINCH_HIT + EFFECT_DOUBLE_HIT) + .effect = EFFECT_DOUBLE_IRON_BASH, .power = 60, .type = TYPE_STEEL, .accuracy = 100, From 721dbe917849039df29644729aa879256b24fe16 Mon Sep 17 00:00:00 2001 From: MissingNoL Date: Sat, 12 Jun 2021 18:01:35 -0700 Subject: [PATCH 009/193] Implemented all PLG effects --- data/battle_scripts_1.s | 31 +++++++++++++++++++++++++ include/constants/battle_move_effects.h | 7 +++++- src/data/battle_moves.h | 10 ++++---- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index d41231dcd..1343b0523 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -371,6 +371,37 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectBodyPress .4byte BattleScript_EffectEvasionUpHit .4byte BattleScript_EffectDoubleIronBash + .4byte BattleScript_EffectGlitzyGlow + .4byte BattleScript_EffectBaddyBad + .4byte BattleScript_EffectSappySeed + .4byte BattleScript_EffectFreezyFrost + .4byte BattleScript_EffectSparklySwirl + +BattleScript_EffectSparklySwirl: + healpartystatus + waitstate + updatestatusicon BS_ATTACKER_WITH_PARTNER + waitstate + goto BattleScript_EffectHit + +BattleScript_EffectFreezyFrost: + normalisebuffs + goto BattleScript_EffectHit + +BattleScript_EffectSappySeed: + jumpifstatus3 BS_TARGET, STATUS3_LEECHSEED, BattleScript_EffectHit + setseeded + goto BattleScript_EffectHit + +BattleScript_EffectBaddyBad: + jumpifsideaffecting BS_ATTACKER, SIDE_STATUS_REFLECT, BattleScript_EffectHit + setreflect + goto BattleScript_EffectHit + +BattleScript_EffectGlitzyGlow: + jumpifsideaffecting BS_ATTACKER, SIDE_STATUS_LIGHTSCREEN, BattleScript_EffectHit + setlightscreen + goto BattleScript_EffectHit BattleScript_EffectDoubleIronBash: attackcanceler diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index d056edf6a..884a83d60 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -355,7 +355,12 @@ #define EFFECT_BODY_PRESS 349 #define EFFECT_EVASION_UP_HIT 350 #define EFFECT_DOUBLE_IRON_BASH 351 +#define EFFECT_GLITZY_GLOW 352 +#define EFFECT_BADDY_BAD 353 +#define EFFECT_SAPPY_SEED 354 +#define EFFECT_FREEZY_FROST 355 +#define EFFECT_SPARKLY_SWIRL 356 -#define NUM_BATTLE_MOVE_EFFECTS 352 +#define NUM_BATTLE_MOVE_EFFECTS 357 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 4a917dc9b..df33efb21 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -10599,7 +10599,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 100, .flags = FLAG_PROTECT_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, #endif - .effect = EFFECT_PLACEHOLDER, //TODO (Light Screen + Hit) + .effect = EFFECT_GLITZY_GLOW, .type = TYPE_PSYCHIC, .pp = 15, .secondaryEffectChance = 0, @@ -10619,7 +10619,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 100, .flags = FLAG_PROTECT_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, #endif - .effect = EFFECT_PLACEHOLDER, //TODO (Reflect + Hit) + .effect = EFFECT_BADDY_BAD, .type = TYPE_DARK, .pp = 15, .secondaryEffectChance = 0, @@ -10641,7 +10641,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .pp = 15, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, #endif - .effect = EFFECT_PLACEHOLDER, //TODO (Leech Seed + Hit) + .effect = EFFECT_SAPPY_SEED, .type = TYPE_GRASS, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, @@ -10662,7 +10662,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .pp = 15, .flags = FLAG_PROTECT_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, #endif - .effect = EFFECT_PLACEHOLDER, //TODO (Haze + Hit) + .effect = EFFECT_FREEZY_FROST, .type = TYPE_ICE, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, @@ -10683,7 +10683,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .pp = 15, .flags = FLAG_PROTECT_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, #endif - .effect = EFFECT_PLACEHOLDER, //TODO (Heal Bell + Hit) + .effect = EFFECT_SPARKLY_SWIRL, .type = TYPE_FAIRY, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, From 32c8de5eca8b2ee46917d5bc6fb4988fb0a2224c Mon Sep 17 00:00:00 2001 From: MissingNoL Date: Sat, 12 Jun 2021 21:23:56 -0700 Subject: [PATCH 010/193] Finished! --- data/battle_scripts_1.s | 114 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 109 insertions(+), 5 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 1343b0523..13b8d720f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -378,30 +378,134 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSparklySwirl BattleScript_EffectSparklySwirl: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + critcalc + damagecalc + adjustdamage + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage B_WAIT_TIME_LONG + resultmessage + waitmessage B_WAIT_TIME_LONG + tryfaintmon BS_TARGET, FALSE, NULL healpartystatus waitstate updatestatusicon BS_ATTACKER_WITH_PARTNER waitstate - goto BattleScript_EffectHit + goto BattleScript_MoveEnd BattleScript_EffectFreezyFrost: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + critcalc + damagecalc + adjustdamage + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage B_WAIT_TIME_LONG + resultmessage + waitmessage B_WAIT_TIME_LONG + tryfaintmon BS_TARGET, FALSE, NULL normalisebuffs - goto BattleScript_EffectHit + printstring STRINGID_STATCHANGESGONE + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd BattleScript_EffectSappySeed: jumpifstatus3 BS_TARGET, STATUS3_LEECHSEED, BattleScript_EffectHit + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + critcalc + damagecalc + adjustdamage + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage B_WAIT_TIME_LONG + resultmessage + waitmessage B_WAIT_TIME_LONG + tryfaintmon BS_TARGET, FALSE, NULL + jumpifhasnohp BS_TARGET, BattleScript_MoveEnd setseeded - goto BattleScript_EffectHit + printfromtable gLeechSeedStringIds + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd BattleScript_EffectBaddyBad: jumpifsideaffecting BS_ATTACKER, SIDE_STATUS_REFLECT, BattleScript_EffectHit + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + critcalc + damagecalc + adjustdamage + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage B_WAIT_TIME_LONG + resultmessage + waitmessage B_WAIT_TIME_LONG + tryfaintmon BS_TARGET, FALSE, NULL setreflect - goto BattleScript_EffectHit + printfromtable gReflectLightScreenSafeguardStringIds + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd BattleScript_EffectGlitzyGlow: jumpifsideaffecting BS_ATTACKER, SIDE_STATUS_LIGHTSCREEN, BattleScript_EffectHit + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + critcalc + damagecalc + adjustdamage + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage B_WAIT_TIME_LONG + resultmessage + waitmessage B_WAIT_TIME_LONG + tryfaintmon BS_TARGET, FALSE, NULL setlightscreen - goto BattleScript_EffectHit + printfromtable gReflectLightScreenSafeguardStringIds + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd BattleScript_EffectDoubleIronBash: attackcanceler From c06029bc721119b0efd6e26c24a3f77772dfd77b Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Fri, 25 Jun 2021 13:37:59 -0600 Subject: [PATCH 011/193] add last used ball --- graphics/battle_interface/ability_pop_up.pal | 19 ++ graphics/battle_interface/last_used_ball.png | Bin 0 -> 223 bytes include/battle.h | 2 + include/battle_interface.h | 4 + include/battle_util.h | 1 + include/constants/battle_config.h | 4 + include/global.h | 3 +- include/item_use.h | 1 + src/battle_controller_player.c | 16 +- src/battle_interface.c | 181 +++++++++++++++++++ src/battle_main.c | 4 + src/battle_script_commands.c | 3 +- src/battle_util.c | 11 ++ src/item_use.c | 54 ++++-- src/new_game.c | 2 + 15 files changed, 283 insertions(+), 22 deletions(-) create mode 100644 graphics/battle_interface/ability_pop_up.pal create mode 100644 graphics/battle_interface/last_used_ball.png diff --git a/graphics/battle_interface/ability_pop_up.pal b/graphics/battle_interface/ability_pop_up.pal new file mode 100644 index 000000000..19895d0bc --- /dev/null +++ b/graphics/battle_interface/ability_pop_up.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +1 177 91 +143 129 149 +103 91 111 +79 65 85 +59 31 81 +103 89 109 +231 239 245 +249 253 255 +0 0 0 +0 0 0 +107 115 115 +74 66 82 +0 0 0 +214 214 206 +132 140 140 +0 0 0 diff --git a/graphics/battle_interface/last_used_ball.png b/graphics/battle_interface/last_used_ball.png new file mode 100644 index 0000000000000000000000000000000000000000..581569cf1bf4ce3f5cee78fcd83a7a34b149d012 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ipSH_Le)y2(0UQw2Yj+z{f zK*sa;Uw{7n50nRj?BZfCCy?fA*Uq){^Z*&j&Z>)mRF^unv_P&x8 zS#yg)?8er2d6p7uYPU)$efU;Y`E%9Nr%yw_D=__j$HY1FVdQ&MBb@0Cx9FNdN!< literal 0 HcmV?d00001 diff --git a/include/battle.h b/include/battle.h index f009cbe7f..9a10ae77d 100644 --- a/include/battle.h +++ b/include/battle.h @@ -37,6 +37,7 @@ #define B_ACTION_CANCEL_PARTNER 12 // when choosing an action #define B_ACTION_NOTHING_FAINTED 13 // when choosing an action #define B_ACTION_DEBUG 20 +#define B_ACTION_THROW_BALL 21 // R to throw last used ball #define B_ACTION_NONE 0xFF #define MAX_TRAINER_ITEMS 4 @@ -586,6 +587,7 @@ struct BattleStruct u16 moveEffect2; // For Knock Off u16 changedSpecies[PARTY_SIZE]; // For Zygarde or future forms when multiple mons can change into the same pokemon. u8 quickClawBattlerId; + u8 ballSpriteIds[2]; // item gfx, window gfx }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_interface.h b/include/battle_interface.h index 0bcadaaac..c852b776a 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -93,5 +93,9 @@ u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale); u8 GetHPBarLevel(s16 hp, s16 maxhp); void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle); void DestroyAbilityPopUp(u8 battlerId); +bool32 CanThrowLastUsedBall(void); +void TryHideLastUsedBall(void); +void TryRestoreLastUsedBall(void); +void TryAddLastUsedBallItemSprites(void); #endif // GUARD_BATTLE_INTERFACE_H diff --git a/include/battle_util.h b/include/battle_util.h index 0bf49dadf..717017c06 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -46,6 +46,7 @@ struct TypePower extern const struct TypePower gNaturalGiftTable[]; +void HandleAction_ThrowBall(void); void HandleAction_UseMove(void); void HandleAction_Switch(void); void HandleAction_UseItem(void); diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index fe376da8d..0f878d3af 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -151,6 +151,10 @@ #define B_CRITICAL_CAPTURE TRUE // If set to TRUE, Critical Capture will be enabled. #define B_CATCHING_CHARM_BOOST 20 // % boost in Critical Capture odds if player has the Catching Charm. +// Last Used Ball +#define B_LAST_USED_BALL TRUE // If TRUE, the "last used ball" feature from Gen 7 will be implemented +#define B_LAST_USED_BALL_BUTTON R_BUTTON // If last used ball is implemented, this button (or button combo) will trigger throwing the last used ball. + // Other #define B_DOUBLE_WILD_CHANCE 0 // % chance of encountering two Pokémon in a Wild Encounter. #define B_SLEEP_TURNS GEN_7 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. diff --git a/include/global.h b/include/global.h index e6b0797e7..a5d720eda 100644 --- a/include/global.h +++ b/include/global.h @@ -490,7 +490,8 @@ struct SaveBlock2 u16 optionsBattleSceneOff:1; // whether battle animations are disabled u16 regionMapZoom:1; // whether the map is zoomed in /*0x18*/ struct Pokedex pokedex; - /*0x90*/ u8 filler_90[0x8]; + /*0x90*/ u16 lastUsedBall; + /*0x92*/ u8 filler_90[0x6]; /*0x98*/ struct Time localTimeOffset; /*0xA0*/ struct Time lastBerryTreeUpdate; /*0xA8*/ u32 gcnLinkFlags; // Read by Pokemon Colosseum/XD diff --git a/include/item_use.h b/include/item_use.h index f577f8d46..42db6ff10 100644 --- a/include/item_use.h +++ b/include/item_use.h @@ -33,5 +33,6 @@ void ItemUseInBattle_EnigmaBerry(u8); void Task_UseDigEscapeRopeOnField(u8 taskId); u8 CanUseDigOrEscapeRopeOnCurMap(void); u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId); +u32 CanThrowBall(void); #endif // GUARD_ITEM_USE_H diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 89f73ffc4..89a044275 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -249,7 +249,8 @@ static void HandleInputChooseAction(void) if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - + TryHideLastUsedBall(); + switch (gActionSelectionCursor[gActiveBattler]) { case 0: @@ -336,6 +337,15 @@ static void HandleInputChooseAction(void) BtlController_EmitTwoReturnValues(1, B_ACTION_DEBUG, 0); PlayerBufferExecCompleted(); } + #if B_LAST_USED_BALL == TRUE + else if (JOY_NEW(B_LAST_USED_BALL_BUTTON) && CanThrowLastUsedBall()) + { + PlaySE(SE_SELECT); + TryHideLastUsedBall(); + BtlController_EmitTwoReturnValues(1, B_ACTION_THROW_BALL, 0); + PlayerBufferExecCompleted(); + } + #endif } static void UnusedEndBounceEffect(void) @@ -372,6 +382,7 @@ static void HandleInputChooseTarget(void) else BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); + TryHideLastUsedBall(); HideMegaTriggerSprite(); PlayerBufferExecCompleted(); } @@ -514,6 +525,7 @@ static void HandleInputShowTargets(void) else BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); HideMegaTriggerSprite(); + TryHideLastUsedBall(); PlayerBufferExecCompleted(); } else if (gMain.newKeys & B_BUTTON || gPlayerDpadHoldFrames > 59) @@ -606,6 +618,7 @@ static void HandleInputChooseMove(void) else BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); HideMegaTriggerSprite(); + TryHideLastUsedBall(); PlayerBufferExecCompleted(); } else if (canSelectTarget == 1) @@ -2691,6 +2704,7 @@ static void PlayerHandleChooseAction(void) for (i = 0; i < 4; i++) ActionSelectionDestroyCursorAt(i); + TryRestoreLastUsedBall(); ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPkmnDo); BattlePutTextOnWindow(gDisplayedStringBattle, 1); diff --git a/src/battle_interface.c b/src/battle_interface.c index 128f342df..828b57a2f 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -27,6 +27,9 @@ #include "constants/battle_config.h" #include "data.h" #include "pokemon_summary_screen.h" +#include "item_icon.h" +#include "item_use.h" +#include "item.h" enum { // Corresponds to gHealthboxElementsGfxTable (and the tables after it) in graphics.c @@ -196,6 +199,9 @@ static u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32 static void SpriteCb_AbilityPopUp(struct Sprite *sprite); static void Task_FreeAbilityPopUpGfx(u8 taskId); +static void SpriteCB_LastUsedBall(struct Sprite *sprite); +static void SpriteCB_LastUsedBallWin(struct Sprite *sprite); + // const rom data static const struct OamData sUnknown_0832C138 = { @@ -812,6 +818,9 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) gSprites[megaIndicatorSpriteId].invisible = TRUE; } + gBattleStruct->ballSpriteIds[0] = MAX_SPRITES; + gBattleStruct->ballSpriteIds[1] = MAX_SPRITES; + return healthboxLeftSpriteId; } @@ -3128,3 +3137,175 @@ static void Task_FreeAbilityPopUpGfx(u8 taskId) DestroyTask(taskId); } } + +// last used ball +#define LAST_BALL_WINDOW_TAG 0xD721 + +static const struct OamData sOamData_LastUsedBall = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = SPRITE_SHAPE(32x32), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(32x32), + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct SpriteTemplate sSpriteTemplate_LastUsedBallWindow = +{ + .tileTag = LAST_BALL_WINDOW_TAG, + .paletteTag = ABILITY_POP_UP_TAG, + .oam = &sOamData_LastUsedBall, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_LastUsedBallWin +}; + +static const u8 sLastUsedBallWindowGfx[] = INCBIN_U8("graphics/battle_interface/last_used_ball.4bpp"); +static const struct SpriteSheet sSpriteSheet_LastUsedBallWindow = +{ + sLastUsedBallWindowGfx, sizeof(sLastUsedBallWindowGfx), LAST_BALL_WINDOW_TAG +}; + +#define LAST_USED_BALL_X_F 15 +#define LAST_USED_BALL_X_0 -15 +#define LAST_USED_BALL_Y 68 + +#define LAST_BALL_WIN_X_F (LAST_USED_BALL_X_F - 1) +#define LAST_BALL_WIN_X_0 (LAST_USED_BALL_X_0 - 0) +#define LAST_USED_WIN_Y (LAST_USED_BALL_Y - 8) + +#define sHide data[0] + +bool32 CanThrowLastUsedBall(void) +{ + return (!(CanThrowBall() != 0 + || (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + || !CheckBagHasItem(gSaveBlock2Ptr->lastUsedBall, 1))); +} + + +void TryAddLastUsedBallItemSprites(void) +{ + if (CanThrowBall() != 0 + || (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + || !CheckBagHasItem(gSaveBlock2Ptr->lastUsedBall, 1)) + return; + + // ball + if (gBattleStruct->ballSpriteIds[0] == MAX_SPRITES) + { + gBattleStruct->ballSpriteIds[0] = AddItemIconSprite(102, 102, gSaveBlock2Ptr->lastUsedBall); + gSprites[gBattleStruct->ballSpriteIds[0]].pos1.x = LAST_USED_BALL_X_0; + gSprites[gBattleStruct->ballSpriteIds[0]].pos1.y = LAST_USED_BALL_Y; + gSprites[gBattleStruct->ballSpriteIds[0]].sHide = FALSE; // restore + gSprites[gBattleStruct->ballSpriteIds[0]].callback = SpriteCB_LastUsedBall; + } + + // window + LoadSpritePalette(&sSpritePalette_AbilityPopUp); + if (GetSpriteTileStartByTag(LAST_BALL_WINDOW_TAG) == 0xFFFF) + LoadSpriteSheet(&sSpriteSheet_LastUsedBallWindow); + + if (gBattleStruct->ballSpriteIds[1] == MAX_SPRITES) + { + gBattleStruct->ballSpriteIds[1] = CreateSprite(&sSpriteTemplate_LastUsedBallWindow, + LAST_BALL_WIN_X_0, + LAST_USED_WIN_Y, 5); + gSprites[gBattleStruct->ballSpriteIds[0]].sHide = FALSE; // restore + } +} + +static void DestroyLastUsedBallWinGfx(struct Sprite *sprite) +{ + FreeSpriteTilesByTag(LAST_BALL_WINDOW_TAG); + FreeSpritePaletteByTag(ABILITY_POP_UP_TAG); + DestroySprite(sprite); + gBattleStruct->ballSpriteIds[1] = MAX_SPRITES; +} + +static void DestroyLastUsedBallGfx(struct Sprite *sprite) +{ + FreeSpriteTilesByTag(102); + FreeSpritePaletteByTag(102); + DestroySprite(sprite); + gBattleStruct->ballSpriteIds[0] = MAX_SPRITES; +} + +static void SpriteCB_LastUsedBallWin(struct Sprite *sprite) +{ + if (sprite->sHide) + { + if (sprite->pos1.x != LAST_BALL_WIN_X_0) + sprite->pos1.x--; + + if (sprite->pos1.x == LAST_BALL_WIN_X_0) + DestroyLastUsedBallWinGfx(sprite); + } + else + { + if (sprite->pos1.x != LAST_BALL_WIN_X_F) + sprite->pos1.x++; + } +} + +static void SpriteCB_LastUsedBall(struct Sprite *sprite) +{ + if (sprite->sHide) + { + if (sprite->pos1.x != LAST_USED_BALL_X_0) + sprite->pos1.x--; + + if (sprite->pos1.x == LAST_USED_BALL_X_0) + DestroyLastUsedBallGfx(sprite); + } + else + { + if (sprite->pos1.x != LAST_USED_BALL_X_F) + sprite->pos1.x++; + } +} + +static void TryHideOrRestoreLastUsedBall(u8 caseId) +{ + if (gBattleStruct->ballSpriteIds[0] == MAX_SPRITES) + return; + + switch (caseId) + { + case 0: // hide + if (gBattleStruct->ballSpriteIds[0] != MAX_SPRITES) + gSprites[gBattleStruct->ballSpriteIds[0]].sHide = TRUE; // hide + if (gBattleStruct->ballSpriteIds[1] != MAX_SPRITES) + gSprites[gBattleStruct->ballSpriteIds[1]].sHide = TRUE; // hide + break; + case 1: // restore + if (gBattleStruct->ballSpriteIds[0] != MAX_SPRITES) + gSprites[gBattleStruct->ballSpriteIds[0]].sHide = FALSE; // restore + if (gBattleStruct->ballSpriteIds[1] != MAX_SPRITES) + gSprites[gBattleStruct->ballSpriteIds[1]].sHide = FALSE; // restore + break; + } +} + +void TryHideLastUsedBall(void) +{ + TryHideOrRestoreLastUsedBall(0); +} + +void TryRestoreLastUsedBall(void) +{ + if (gBattleStruct->ballSpriteIds[0] != MAX_SPRITES) + TryHideOrRestoreLastUsedBall(1); + else + TryAddLastUsedBallItemSprites(); +} + diff --git a/src/battle_main.c b/src/battle_main.c index 9cf56abf7..2d4dfa16f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -401,6 +401,7 @@ static void (* const sTurnActionsFuncsTable[])(void) = [B_ACTION_TRY_FINISH] = HandleAction_TryFinish, [B_ACTION_FINISHED] = HandleAction_ActionFinished, [B_ACTION_NOTHING_FAINTED] = HandleAction_NothingIsFainted, + [B_ACTION_THROW_BALL] = HandleAction_ThrowBall, }; static void (* const sEndTurnFuncsTable[])(void) = @@ -4053,6 +4054,9 @@ static void HandleTurnActionSelectionState(void) case B_ACTION_SAFARI_BALL: gBattleCommunication[gActiveBattler]++; break; + case B_ACTION_THROW_BALL: + gBattleCommunication[gActiveBattler]++; + break; case B_ACTION_SAFARI_POKEBLOCK: if ((gBattleResources->bufferB[gActiveBattler][1] | (gBattleResources->bufferB[gActiveBattler][2] << 8)) != 0) { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c8a393da3..f5f093cc5 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12017,7 +12017,8 @@ static void Cmd_handleballthrow(void) { u32 odds; u8 catchRate; - + + gSaveBlock2Ptr->lastUsedBall = gLastUsedItem; if (gLastUsedItem == ITEM_SAFARI_BALL) catchRate = gBattleStruct->safariCatchFactor * 1275 / 100; else diff --git a/src/battle_util.c b/src/battle_util.c index 87f9003e0..7a86b659f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -742,6 +742,17 @@ void HandleAction_SafariZoneBallThrow(void) gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } +void HandleAction_ThrowBall(void) +{ + gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gLastUsedItem = gSaveBlock2Ptr->lastUsedBall; + RemoveBagItem(gLastUsedItem, 1); + gBattlescriptCurrInstr = BattleScript_BallThrow; + gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; +} + void HandleAction_ThrowPokeblock(void) { gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; diff --git a/src/item_use.c b/src/item_use.c index 6b1519e9b..ad7a46499 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -936,42 +936,58 @@ void ItemUseOutOfBattle_EvolutionStone(u8 taskId) SetUpItemUseCallback(taskId); } -void ItemUseInBattle_PokeBall(u8 taskId) +u32 CanThrowBall(void) { if (IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) - && IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) // There are two present pokemon. + && IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) { - static const u8 textCantThrowPokeBall[] = _("Cannot throw a ball!\nThere are two pokemon out there!\p"); - - if (!InBattlePyramid()) - DisplayItemMessage(taskId, 1, textCantThrowPokeBall, BagMenu_InitListsMenu); - else - DisplayItemMessageInBattlePyramid(taskId, textCantThrowPokeBall, Task_CloseBattlePyramidBagMessage); + return 1; // There are two present pokemon. } else if (gBattlerInMenuId == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT) - && IsBattlerAlive(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) // Attempting to throw a ball with the second pokemon while both are alive. + && IsBattlerAlive(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) { - static const u8 textCantThrowPokeBall[] = _("Cannot throw a ball!\p"); - - if (!InBattlePyramid()) - DisplayItemMessage(taskId, 1, textCantThrowPokeBall, BagMenu_InitListsMenu); - else - DisplayItemMessageInBattlePyramid(taskId, textCantThrowPokeBall, Task_CloseBattlePyramidBagMessage); + return 2; // Attempting to throw a ball with the second pokemon while both are alive. } - else if (IsPlayerPartyAndPokemonStorageFull() == FALSE) // have room for mon? + else if (IsPlayerPartyAndPokemonStorageFull() == TRUE) { + return 3; // No room for mon + } + + return 0; // usable +} + +static const u8 sText_CantThrowPokeBall_TwoMons[] = _("Cannot throw a ball!\nThere are two pokemon out there!\p"); +static const u8 sText_CantThrowPokeBall[] = _("Cannot throw a ball!\p"); +void ItemUseInBattle_PokeBall(u8 taskId) +{ + switch (CanThrowBall()) + { + case 0: // usable + default: RemoveBagItem(gSpecialVar_ItemId, 1); if (!InBattlePyramid()) Task_FadeAndCloseBagMenu(taskId); else CloseBattlePyramidBag(taskId); - } - else - { + break; + case 1: // There are two present pokemon. + if (!InBattlePyramid()) + DisplayItemMessage(taskId, 1, sText_CantThrowPokeBall_TwoMons, BagMenu_InitListsMenu); + else + DisplayItemMessageInBattlePyramid(taskId, sText_CantThrowPokeBall_TwoMons, Task_CloseBattlePyramidBagMessage); + break; + case 2: // Attempting to throw a ball with the second pokemon while both are alive. + if (!InBattlePyramid()) + DisplayItemMessage(taskId, 1, sText_CantThrowPokeBall_TwoMons, BagMenu_InitListsMenu); + else + DisplayItemMessageInBattlePyramid(taskId, sText_CantThrowPokeBall_TwoMons, Task_CloseBattlePyramidBagMessage); + break; + case 3: // No room for mon if (!InBattlePyramid()) DisplayItemMessage(taskId, 1, gText_BoxFull, BagMenu_InitListsMenu); else DisplayItemMessageInBattlePyramid(taskId, gText_BoxFull, Task_CloseBattlePyramidBagMessage); + break; } } diff --git a/src/new_game.c b/src/new_game.c index 2a950efbc..c1dd85e90 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -45,6 +45,7 @@ #include "berry_powder.h" #include "mevent.h" #include "union_room_chat.h" +#include "constants/items.h" extern const u8 EventScript_ResetAllMapFlags[]; @@ -204,6 +205,7 @@ void NewGameInitData(void) WipeTrainerNameRecords(); ResetTrainerHillResults(); ResetContestLinkResults(); + gSaveBlock2Ptr->lastUsedBall = ITEM_POKE_BALL; } static void ResetMiniGamesRecords(void) From d28ac33b0e8f350d49511257d0d5df10ae2c8352 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sun, 4 Jul 2021 09:28:59 -0600 Subject: [PATCH 012/193] fix throw last used ball action turn order checks --- src/battle_main.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index 2d4dfa16f..6befbfbf5 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4485,7 +4485,9 @@ static void SetActionsAndBattlersTurnOrder(void) { for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { - if (gChosenActionByBattler[gActiveBattler] == B_ACTION_USE_ITEM || gChosenActionByBattler[gActiveBattler] == B_ACTION_SWITCH) + if (gChosenActionByBattler[gActiveBattler] == B_ACTION_USE_ITEM + || gChosenActionByBattler[gActiveBattler] == B_ACTION_SWITCH + || gChosenActionByBattler[gActiveBattler] == B_ACTION_THROW_BALL) { gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler]; gBattlerByTurnOrder[turnOrderId] = gActiveBattler; @@ -4494,7 +4496,9 @@ static void SetActionsAndBattlersTurnOrder(void) } for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { - if (gChosenActionByBattler[gActiveBattler] != B_ACTION_USE_ITEM && gChosenActionByBattler[gActiveBattler] != B_ACTION_SWITCH) + if (gChosenActionByBattler[gActiveBattler] != B_ACTION_USE_ITEM + && gChosenActionByBattler[gActiveBattler] != B_ACTION_SWITCH + && gChosenActionByBattler[gActiveBattler] != B_ACTION_THROW_BALL) { gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler]; gBattlerByTurnOrder[turnOrderId] = gActiveBattler; @@ -4510,7 +4514,9 @@ static void SetActionsAndBattlersTurnOrder(void) if (gActionsByTurnOrder[i] != B_ACTION_USE_ITEM && gActionsByTurnOrder[j] != B_ACTION_USE_ITEM && gActionsByTurnOrder[i] != B_ACTION_SWITCH - && gActionsByTurnOrder[j] != B_ACTION_SWITCH) + && gActionsByTurnOrder[j] != B_ACTION_SWITCH + && gActionsByTurnOrder[i] != B_ACTION_THROW_BALL + && gActionsByTurnOrder[j] != B_ACTION_THROW_BALL) { if (GetWhoStrikesFirst(battler1, battler2, FALSE)) SwapTurnOrder(i, j); From 542f0accf5a4f0c3dde59e6e76dca98c7ab08db6 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sun, 4 Jul 2021 10:09:57 -0600 Subject: [PATCH 013/193] fix updating last used ball when run out of item id --- src/battle_interface.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/battle_interface.c b/src/battle_interface.c index 828b57a2f..b233627d8 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -729,6 +729,12 @@ u8 GetMegaIndicatorSpriteId(u32 healthboxSpriteId) return gSprites[spriteId].hOther_IndicatorSpriteId; } +static void InitLastUsedBallAssets(void) +{ + gBattleStruct->ballSpriteIds[0] = MAX_SPRITES; + gBattleStruct->ballSpriteIds[1] = MAX_SPRITES; +} + u8 CreateBattlerHealthboxSprites(u8 battlerId) { s16 data6 = 0; @@ -3195,6 +3201,14 @@ bool32 CanThrowLastUsedBall(void) void TryAddLastUsedBallItemSprites(void) { + if (gSaveBlock2Ptr->lastUsedBall != ITEM_NONE && !CheckBagHasItem(gSaveBlock2Ptr->lastUsedBall, 1)) + { + // we're out of the last used ball, so just set it to the first ball in the bag + // we have to compact the bag first bc it is typically only compacted when you open it + CompactItemsInBagPocket(&gBagPockets[BALLS_POCKET]); + gSaveBlock2Ptr->lastUsedBall = gBagPockets[BALLS_POCKET].itemSlots[0].itemId; + } + if (CanThrowBall() != 0 || (gBattleTypeFlags & BATTLE_TYPE_TRAINER) || !CheckBagHasItem(gSaveBlock2Ptr->lastUsedBall, 1)) From 07e3e73372eb6d625a198e07fd4a2360c5d25031 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sun, 18 Jul 2021 11:20:51 -0600 Subject: [PATCH 014/193] fix ITEM_NONE to 0 for compilation reasons --- src/battle_interface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_interface.c b/src/battle_interface.c index b233627d8..1564881e4 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -3201,7 +3201,7 @@ bool32 CanThrowLastUsedBall(void) void TryAddLastUsedBallItemSprites(void) { - if (gSaveBlock2Ptr->lastUsedBall != ITEM_NONE && !CheckBagHasItem(gSaveBlock2Ptr->lastUsedBall, 1)) + if (gSaveBlock2Ptr->lastUsedBall != 0 && !CheckBagHasItem(gSaveBlock2Ptr->lastUsedBall, 1)) { // we're out of the last used ball, so just set it to the first ball in the bag // we have to compact the bag first bc it is typically only compacted when you open it From 4ca6d76160b01738d9fcd326643a89828a045b61 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sun, 25 Jul 2021 14:55:52 -0600 Subject: [PATCH 015/193] add bug bite --- asm/macros/battle_script.inc | 5 ++++ data/battle_scripts_1.s | 5 ++++ include/battle.h | 1 + include/battle_util.h | 1 + include/constants/battle_script_commands.h | 2 ++ src/battle_script_commands.c | 31 ++++++++++++++++++++-- src/battle_util.c | 5 ++++ 7 files changed, 48 insertions(+), 2 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 9fa3fe0c3..953180d91 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1768,6 +1768,11 @@ .macro tryactivategrimneigh, battler:req various \battler, VARIOUS_TRY_ACTIVATE_GRIM_NEIGH .endm + + .macro consumeberry battler:req, restoreItem=FALSE + various \battler, VARIOUS_CONSUME_BERRY + .byte \restoreItem + .endm @ helpful macros .macro setstatchanger stat:req, stages:req, down:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 522ffb701..d48076e48 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -508,6 +508,11 @@ BattleScript_MoveEffectIncinerate:: BattleScript_MoveEffectBugBite:: printstring STRINGID_BUGBITE waitmessage B_WAIT_TIME_LONG + orword gHitMarker, HITMARKER_NO_ANIMATIONS + setbyte sBERRY_OVERRIDE, TRUE @ override the requirements for eating berries + consumeberry BS_ATTACKER, TRUE @ consume the berry, then restore the item from changedItems + bicword gHitMarker, HITMARKER_NO_ANIMATIONS + setbyte sBERRY_OVERRIDE, FALSE return BattleScript_EffectCoreEnforcer: diff --git a/include/battle.h b/include/battle.h index b51a3d71b..e82253747 100644 --- a/include/battle.h +++ b/include/battle.h @@ -659,6 +659,7 @@ struct BattleScripting u8 illusionNickHack; // To properly display nick in STRINGID_ENEMYABOUTTOSWITCHPKMN. bool8 fixedPopup; // force ability popup to stick until manually called back u16 abilityPopupOverwrite; + u8 overrideBerryRequirements; }; // rom_80A5C6C diff --git a/include/battle_util.h b/include/battle_util.h index e10305e56..bea6af848 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -31,6 +31,7 @@ #define ITEMEFFECT_KINGSROCK_SHELLBELL 0x4 #define ITEMEFFECT_TARGET 0x5 #define ITEMEFFECT_ORBS 0x6 +#define ITEMEFFECT_BATTLER_MOVE_END 0x7 // move end effects for just the battler, not whole field #define WEATHER_HAS_EFFECT ((!IsAbilityOnField(ABILITY_CLOUD_NINE) && !IsAbilityOnField(ABILITY_AIR_LOCK))) diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index faaf8f17e..881bb82e0 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -37,6 +37,7 @@ #define sILLUSION_NICK_HACK gBattleScripting + 0x32 #define sFIXED_ABILITY_POPUP gBattleScripting + 0x33 #define sABILITY_OVERWRITE gBattleScripting + 0x34 +#define sBERRY_OVERRIDE gBattleScripting + 0x36 #define cMULTISTRING_CHOOSER gBattleCommunication + 5 #define cMISS_TYPE gBattleCommunication + 6 @@ -173,6 +174,7 @@ #define VARIOUS_DESTROY_ABILITY_POPUP 102 #define VARIOUS_TOTEM_BOOST 103 #define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 104 +#define VARIOUS_CONSUME_BERRY 105 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index de7105a27..067d0b62e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3284,16 +3284,22 @@ void SetMoveEffect(bool32 primary, u32 certain) } break; case MOVE_EFFECT_BUG_BITE: - if ((gBattleMons[gEffectBattler].item >= FIRST_BERRY_INDEX && gBattleMons[gEffectBattler].item <= LAST_BERRY_INDEX) + if (ItemId_GetPocket(gBattleMons[gEffectBattler].item) == POCKET_BERRIES && GetBattlerAbility(gEffectBattler) != ABILITY_STICKY_HOLD) { + // target loses their berry gLastUsedItem = gBattleMons[gEffectBattler].item; gBattleMons[gEffectBattler].item = 0; CheckSetUnburden(gEffectBattler); - gActiveBattler = gEffectBattler; + BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gEffectBattler].item); MarkBattlerForControllerExec(gActiveBattler); + + // attacker temporarily gains their item + gBattleStruct->changedItems[gBattlerAttacker] = gBattleMons[gBattlerAttacker].item; + gBattleMons[gBattlerAttacker].item = gLastUsedItem; + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectBugBite; } @@ -8422,6 +8428,27 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; // exit if loop failed (failsafe) } return; + case VARIOUS_CONSUME_BERRY: + if (ItemId_GetHoldEffect(gBattleMons[gActiveBattler].item) == HOLD_EFFECT_NONE) + { + gBattlescriptCurrInstr += 4; + return; + } + + gBattleScripting.battler = gEffectBattler = gBattlerTarget = gActiveBattler; // cover all berry effect battlerId cases. e.g. ChangeStatBuffs uses target ID + // do move end berry effects for just a single battler, instead of looping through all battlers + if (ItemBattleEffects(ITEMEFFECT_BATTLER_MOVE_END, gActiveBattler, FALSE)) + return; + + if (gBattlescriptCurrInstr[3]) + { + gBattleMons[gActiveBattler].item = gBattleStruct->changedItems[gActiveBattler]; + gBattleStruct->changedItems[gActiveBattler] = ITEM_NONE; + gBattleResources->flags->flags[gActiveBattler] &= ~(RESOURCE_FLAG_UNBURDEN); + } + + gBattlescriptCurrInstr += 4; + return; } gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index 7deebd25e..6c9e14187 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5385,6 +5385,8 @@ bool32 HasEnoughHpToEatBerry(u32 battlerId, u32 hpFraction, u32 itemId) if (gBattleMons[battlerId].hp == 0) return FALSE; + if (gBattleScripting.overrideBerryRequirements) + return TRUE; // Unnerve prevents consumption of opponents' berries. if (isBerry && IsUnnerveAbilityOnOpposingSide(battlerId)) return FALSE; @@ -6095,11 +6097,14 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } } break; + case ITEMEFFECT_BATTLER_MOVE_END: + goto DO_ITEMEFFECT_MOVE_END; // this hurts a bit to do, but is an easy solution case ITEMEFFECT_MOVE_END: for (battlerId = 0; battlerId < gBattlersCount; battlerId++) { gLastUsedItem = gBattleMons[battlerId].item; battlerHoldEffect = GetBattlerHoldEffect(battlerId, TRUE); + DO_ITEMEFFECT_MOVE_END: switch (battlerHoldEffect) { case HOLD_EFFECT_MICLE_BERRY: From ab529b4e8934afa152ef54ad0189e8a6df7c06d6 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 27 Jul 2021 10:31:48 -0600 Subject: [PATCH 016/193] add stuff cheeks --- data/battle_scripts_1.s | 28 +++++++++++++++++++++++++ include/battle_scripts.h | 1 + include/constants/battle_move_effects.h | 1 + include/constants/battle_string_ids.h | 3 ++- src/battle_ai_main.c | 12 ++++------- src/battle_message.c | 2 ++ src/battle_util.c | 17 +++++++++++++++ src/data/battle_moves.h | 2 +- 8 files changed, 56 insertions(+), 10 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index d48076e48..37ae9b730 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -368,6 +368,30 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSleepHit .4byte BattleScript_EffectAttackerDefenseDownHit .4byte BattleScript_EffectBodyPress + .4byte BattleScript_EffectStuffCheeks + +BattleScript_EffectStuffCheeks:: + attackcanceler + attackstring + ppreduce + jumpifnotberry BS_ATTACKER, BattleScript_ButItFailed + attackanimation + waitanimation +BattleScript_StuffCheeksEatBerry: + setbyte sBERRY_OVERRIDE, TRUE + orword gHitMarker, HITMARKER_NO_ANIMATIONS + consumeberry BS_ATTACKER + bicword gHitMarker, HITMARKER_NO_ANIMATIONS + setbyte sBERRY_OVERRIDE, FALSE + setstatchanger STAT_DEF, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_StuffCheeksEnd + setgraphicalstatchangevalues + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StuffCheeksEnd @ cant raise def + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printfromtable gStatUpStringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_StuffCheeksEnd: + goto BattleScript_MoveEnd BattleScript_EffectAttackerDefenseDownHit: setmoveeffect MOVE_EFFECT_DEF_MINUS_1 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN @@ -5985,6 +6009,10 @@ BattleScript_SelectingNotAllowedMoveGravity:: printselectionstring STRINGID_GRAVITYPREVENTSUSAGE endselectionscript +BattleScript_SelectingNotAllowedStuffCheeks:: + printselectionstring STRINGID_STUFFCHEEKSCANTSELECT + endselectionscript + BattleScript_SelectingNotAllowedBelch:: printselectionstring STRINGID_BELCHCANTSELECT endselectionscript diff --git a/include/battle_scripts.h b/include/battle_scripts.h index f0712fc43..0b81fc675 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -295,6 +295,7 @@ extern const u8 BattleScript_ProteanActivates[]; extern const u8 BattleScript_DazzlingProtected[]; extern const u8 BattleScript_MoveUsedPsychicTerrainPrevents[]; extern const u8 BattleScript_MoveUsedPowder[]; +extern const u8 BattleScript_SelectingNotAllowedStuffCheeks[]; extern const u8 BattleScript_SelectingNotAllowedBelch[]; extern const u8 BattleScript_SelectingNotAllowedBelchInPalace[]; extern const u8 BattleScript_PsychicSurgeActivates[]; diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index cbab68b66..2e54e9ef3 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -352,6 +352,7 @@ #define EFFECT_SLEEP_HIT 346 #define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 347 #define EFFECT_BODY_PRESS 348 +#define EFFECT_STUFF_CHEEKS 349 #define NUM_BATTLE_MOVE_EFFECTS 350 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index cda885694..e2b97d443 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -570,8 +570,9 @@ #define STRINGID_MICLEBERRYACTIVATES 566 #define STRINGID_PKMNSHOOKOFFTHETAUNT 567 #define STRINGID_PKMNGOTOVERITSINFATUATION 568 +#define STRINGID_STUFFCHEEKSCANTSELECT 569 -#define BATTLESTRINGS_COUNT 569 +#define BATTLESTRINGS_COUNT 570 // The below IDs are all indexes into battle message tables, // used to determine which of a set of messages to print. diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 81d97fcab..da978b427 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -792,21 +792,17 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) if (!BattlerStatCanRise(battlerAtk, AI_DATA->atkAbility, STAT_ATK) || !HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL)) score -= 10; break; - case EFFECT_DEFENSE_UP_2: - if (move == MOVE_STUFF_CHEEKS && ItemId_GetPocket(gBattleMons[battlerAtk].item) != POCKET_BERRIES) - score -= 10; + case EFFECT_STUFF_CHEEKS: + if (ItemId_GetPocket(gBattleMons[battlerAtk].item) != POCKET_BERRIES) + return 0; // cannot even select //fallthrough case EFFECT_DEFENSE_UP: + case EFFECT_DEFENSE_UP_2: case EFFECT_DEFENSE_UP_3: case EFFECT_DEFENSE_CURL: if (!BattlerStatCanRise(battlerAtk, AI_DATA->atkAbility, STAT_DEF)) score -= 10; break; - case EFFECT_SPEED_UP: - case EFFECT_SPEED_UP_2: - if (!BattlerStatCanRise(battlerAtk, AI_DATA->atkAbility, STAT_SPEED)) - score -= 10; - break; case EFFECT_SPECIAL_ATTACK_UP: case EFFECT_SPECIAL_ATTACK_UP_2: case EFFECT_SPECIAL_ATTACK_UP_3: diff --git a/src/battle_message.c b/src/battle_message.c index c4f043e15..439f88e29 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -696,9 +696,11 @@ static const u8 sText_CanActFaster[] = _("{B_ATK_NAME_WITH_PREFIX} can act faste static const u8 sText_MicleBerryActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} boosted the accuracy of its\nnext move using {B_LAST_ITEM}!"); static const u8 sText_PkmnShookOffTheTaunt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} shook off\nthe taunt!"); static const u8 sText_PkmnGotOverItsInfatuation[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} got over\nits infatuation!"); +static const u8 sText_StuffCheeksCantSelect[] = _("Stuff Cheeks cannot be\nselected without a Berry!\p"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_STUFFCHEEKSCANTSELECT - 12] = sText_StuffCheeksCantSelect, [STRINGID_PKMNGOTOVERITSINFATUATION - 12] = sText_PkmnGotOverItsInfatuation, [STRINGID_PKMNSHOOKOFFTHETAUNT - 12] = sText_PkmnShookOffTheTaunt, [STRINGID_MICLEBERRYACTIVATES - 12] = sText_MicleBerryActivates, diff --git a/src/battle_util.c b/src/battle_util.c index 6c9e14187..99217ce6f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1708,6 +1708,21 @@ u8 TrySetCantSelectMoveBattleScript(void) limitations++; } } + + if (move == MOVE_STUFF_CHEEKS && ItemId_GetPocket(gBattleMons[gActiveBattler].item) != POCKET_BERRIES) + { + gCurrentMove = move; + if (gBattleTypeFlags & BATTLE_TYPE_PALACE) + { + gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedBelchInPalace; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + } + else + { + gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedStuffCheeks; + limitations++; + } + } gPotentialItemEffectBattler = gActiveBattler; if (HOLD_EFFECT_CHOICE(holdEffect) && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != move) @@ -1791,6 +1806,8 @@ u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check) unusableMoves |= gBitTable[i]; else if (gDisableStructs[battlerId].throatChopTimer && gBattleMoves[gBattleMons[battlerId].moves[i]].flags & FLAG_SOUND) unusableMoves |= gBitTable[i]; + else if (gBattleMons[battlerId].moves[i] == MOVE_STUFF_CHEEKS && ItemId_GetPocket(gBattleMons[gActiveBattler].item) != POCKET_BERRIES) + unusableMoves |= gBitTable[i]; } return unusableMoves; } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 9fc79581f..416c5b850 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -10771,7 +10771,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_STUFF_CHEEKS] = { - .effect = EFFECT_DEFENSE_UP_2, + .effect = EFFECT_STUFF_CHEEKS, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, From d3446123461ee5ccfdf803934189244b351b459f Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 12 Aug 2021 14:49:17 -0600 Subject: [PATCH 017/193] fix last used ball window in wild doubles --- src/battle_interface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_interface.c b/src/battle_interface.c index 1564881e4..28d6bc97c 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -3183,7 +3183,7 @@ static const struct SpriteSheet sSpriteSheet_LastUsedBallWindow = #define LAST_USED_BALL_X_F 15 #define LAST_USED_BALL_X_0 -15 -#define LAST_USED_BALL_Y 68 +#define LAST_USED_BALL_Y ((IsDoubleBattle()) ? 78 : 68) #define LAST_BALL_WIN_X_F (LAST_USED_BALL_X_F - 1) #define LAST_BALL_WIN_X_0 (LAST_USED_BALL_X_0 - 0) From 9e4f33d09eefca193668718d84411105257f412d Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 26 Aug 2021 16:14:05 -0300 Subject: [PATCH 018/193] Implemented Desolate Land, Primordial Sea and Delta Stream --- asm/macros/battle_script.inc | 4 + data/battle_scripts_1.s | 85 ++ include/battle_scripts.h | 7 + include/constants/battle.h | 35 +- include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 1130 ++++++++++---------- src/battle_message.c | 24 + src/battle_script_commands.c | 44 + src/battle_util.c | 54 +- 9 files changed, 807 insertions(+), 577 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 9fa3fe0c3..78938293e 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1769,6 +1769,10 @@ various \battler, VARIOUS_TRY_ACTIVATE_GRIM_NEIGH .endm + .macro trytoclearprimalweather + various BS_ATTACKER, VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index eef725903..63c300a74 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3664,6 +3664,9 @@ BattleScript_EffectSandstorm:: attackcanceler attackstring ppreduce + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessened + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRain + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOn setsandstorm goto BattleScript_MoveWeatherChange @@ -3866,6 +3869,9 @@ BattleScript_EffectRainDance:: attackcanceler attackstring ppreduce + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessened + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRain + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOn setrain BattleScript_MoveWeatherChange:: attackanimation @@ -3879,9 +3885,30 @@ BattleScript_EffectSunnyDay:: attackcanceler attackstring ppreduce + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessened + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRain + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOn setsunny goto BattleScript_MoveWeatherChange +BattleScript_ExtremelyHarshSunlightWasNotLessened: + pause B_WAIT_TIME_SHORT + printstring STRINGID_EXTREMELYHARSHSUNLIGHTWASNOTLESSENED + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd + +BattleScript_NoReliefFromHeavyRain: + pause B_WAIT_TIME_SHORT + printstring STRINGID_NORELIEFROMHEAVYRAIN + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd + +BattleScript_MysteriousAirCurrentBlowsOn: + pause B_WAIT_TIME_SHORT + printstring STRINGID_MYSTERIOUSAIRCURRENTBLOWSON + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd + BattleScript_EffectDefenseUpHit:: setmoveeffect MOVE_EFFECT_DEF_PLUS_1 | MOVE_EFFECT_AFFECTS_USER goto BattleScript_EffectHit @@ -4239,6 +4266,9 @@ BattleScript_EffectHail:: attackcanceler attackstring ppreduce + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessened + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRain + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOn sethail goto BattleScript_MoveWeatherChange @@ -5240,6 +5270,9 @@ BattleScript_DoSwitchOut:: getswitchedmondata BS_ATTACKER switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER + trytoclearprimalweather + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 printstring STRINGID_SWITCHINMON hidepartystatussummary BS_ATTACKER switchinanim BS_ATTACKER, FALSE @@ -6860,6 +6893,58 @@ BattleScript_DroughtActivates:: call BattleScript_WeatherFormChanges end3 +BattleScript_DesolateLandActivates:: + pause B_WAIT_TIME_SHORT + call BattleScript_AbilityPopUp + printstring STRINGID_EXTREMELYHARSHSUNLIGHT + waitstate + playanimation BS_BATTLER_0, B_ANIM_SUN_CONTINUES, NULL + call BattleScript_WeatherFormChanges + end3 + +BattleScript_DesolateLandEvaporatesWaterTypeMoves:: + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + pause B_WAIT_TIME_SHORT + ppreduce + printstring STRINGID_MOVEEVAPORATEDINTHEHARSHSUNLIGHT + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd + +BattleScript_PrimordialSeaActivates:: + pause B_WAIT_TIME_SHORT + call BattleScript_AbilityPopUp + printstring STRINGID_HEAVYRAIN + waitstate + playanimation BS_BATTLER_0, B_ANIM_SUN_CONTINUES, NULL + call BattleScript_WeatherFormChanges + end3 + +BattleScript_PrimordialSeaFizzlesOutFireTypeMoves:: + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + pause B_WAIT_TIME_SHORT + ppreduce + printstring STRINGID_MOVEFIZZLEDOUTINTHEHEAVYRAIN + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd + +BattleScript_DeltaStreamActivates:: + pause B_WAIT_TIME_SHORT + call BattleScript_AbilityPopUp + printstring STRINGID_MYSTERIOUSAIRCURRENT + waitmessage B_WAIT_TIME_LONG + end3 + +BattleScript_AttackWeakenedByStrongWinds:: + pause B_WAIT_TIME_SHORT + call BattleScript_AbilityPopUp + printstring STRINGID_ATTACKWEAKENEDBSTRONGWINDS + waitmessage B_WAIT_TIME_LONG + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 + goto BattleScript_HitFromAtkAnimation + BattleScript_SnowWarningActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp diff --git a/include/battle_scripts.h b/include/battle_scripts.h index f0712fc43..f3470776a 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -369,5 +369,12 @@ extern const u8 BattleScript_JabocaRowapBerryActivates[]; extern const u8 BattleScript_NotAffectedAbilityPopUp[]; extern const u8 BattleScript_BattlerShookOffTaunt[]; extern const u8 BattleScript_BattlerGotOverItsInfatuation[]; +extern const u8 BattleScript_DesolateLandActivates[]; +extern const u8 BattleScript_DesolateLandEvaporatesWaterTypeMoves[]; +extern const u8 BattleScript_PrimordialSeaActivates[]; +extern const u8 BattleScript_PrimordialSeaFizzlesOutFireTypeMoves[]; +extern const u8 BattleScript_DeltaStreamActivates[]; +extern const u8 BattleScript_MysteriousAirCurrentBlowsOn[]; +extern const u8 BattleScript_AttackWeakenedByStrongWinds[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle.h b/include/constants/battle.h index b158076bd..cb3e2c7be 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -256,24 +256,31 @@ #define WEATHER_RAIN_TEMPORARY (1 << 0) #define WEATHER_RAIN_DOWNPOUR (1 << 1) // unused #define WEATHER_RAIN_PERMANENT (1 << 2) -#define WEATHER_RAIN_ANY (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_DOWNPOUR | WEATHER_RAIN_PERMANENT) -#define WEATHER_SANDSTORM_TEMPORARY (1 << 3) -#define WEATHER_SANDSTORM_PERMANENT (1 << 4) +#define WEATHER_RAIN_PRIMAL (1 << 3) +#define WEATHER_RAIN_ANY (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_DOWNPOUR | WEATHER_RAIN_PERMANENT | WEATHER_RAIN_PRIMAL) +#define WEATHER_SANDSTORM_TEMPORARY (1 << 4) +#define WEATHER_SANDSTORM_PERMANENT (1 << 5) #define WEATHER_SANDSTORM_ANY (WEATHER_SANDSTORM_TEMPORARY | WEATHER_SANDSTORM_PERMANENT) -#define WEATHER_SUN_TEMPORARY (1 << 5) -#define WEATHER_SUN_PERMANENT (1 << 6) -#define WEATHER_SUN_ANY (WEATHER_SUN_TEMPORARY | WEATHER_SUN_PERMANENT) -#define WEATHER_HAIL_TEMPORARY (1 << 7) -#define WEATHER_HAIL_PERMANENT (1 << 8) +#define WEATHER_SUN_TEMPORARY (1 << 6) +#define WEATHER_SUN_PERMANENT (1 << 7) +#define WEATHER_SUN_PRIMAL (1 << 8) +#define WEATHER_SUN_ANY (WEATHER_SUN_TEMPORARY | WEATHER_SUN_PERMANENT | WEATHER_SUN_PRIMAL) +#define WEATHER_HAIL_TEMPORARY (1 << 9) +#define WEATHER_HAIL_PERMANENT (1 << 10) #define WEATHER_HAIL_ANY (WEATHER_HAIL_TEMPORARY | WEATHER_HAIL_PERMANENT) -#define WEATHER_ANY (WEATHER_RAIN_ANY | WEATHER_SANDSTORM_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY) +#define WEATHER_STRONG_WINDS (1 << 11) +#define WEATHER_ANY (WEATHER_RAIN_ANY | WEATHER_SANDSTORM_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY | WEATHER_STRONG_WINDS) +#define WEATHER_PRIMAL_ANY (WEATHER_RAIN_PRIMAL | WEATHER_SUN_PRIMAL | WEATHER_STRONG_WINDS) // Battle Weather as enum -#define ENUM_WEATHER_NONE 0 -#define ENUM_WEATHER_RAIN 1 -#define ENUM_WEATHER_SUN 2 -#define ENUM_WEATHER_SANDSTORM 3 -#define ENUM_WEATHER_HAIL 4 +#define ENUM_WEATHER_NONE 0 +#define ENUM_WEATHER_RAIN 1 +#define ENUM_WEATHER_SUN 2 +#define ENUM_WEATHER_SANDSTORM 3 +#define ENUM_WEATHER_HAIL 4 +#define ENUM_WEATHER_SUN_PRIMAL 5 +#define ENUM_WEATHER_RAIN_PRIMAL 6 +#define ENUM_WEATHER_STRONG_WINDS 7 // Move Effects #define MOVE_EFFECT_SLEEP 0x1 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index faaf8f17e..5b94cb145 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -173,6 +173,7 @@ #define VARIOUS_DESTROY_ABILITY_POPUP 102 #define VARIOUS_TOTEM_BOOST 103 #define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 104 +#define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 105 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index cda885694..04abb280b 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -12,566 +12,578 @@ #define STRINGID_TRAINERSLIDE 6 // todo: make some of those names less vague: attacker/target vs pkmn, etc. -#define STRINGID_TRAINER1LOSETEXT 12 -#define STRINGID_PKMNGAINEDEXP 13 -#define STRINGID_PKMNGREWTOLV 14 -#define STRINGID_PKMNLEARNEDMOVE 15 -#define STRINGID_TRYTOLEARNMOVE1 16 -#define STRINGID_TRYTOLEARNMOVE2 17 -#define STRINGID_TRYTOLEARNMOVE3 18 -#define STRINGID_PKMNFORGOTMOVE 19 -#define STRINGID_STOPLEARNINGMOVE 20 -#define STRINGID_DIDNOTLEARNMOVE 21 -#define STRINGID_PKMNLEARNEDMOVE2 22 -#define STRINGID_ATTACKMISSED 23 -#define STRINGID_PKMNPROTECTEDITSELF 24 -#define STRINGID_STATSWONTINCREASE2 25 -#define STRINGID_AVOIDEDDAMAGE 26 -#define STRINGID_ITDOESNTAFFECT 27 -#define STRINGID_ATTACKERFAINTED 28 -#define STRINGID_TARGETFAINTED 29 -#define STRINGID_PLAYERGOTMONEY 30 -#define STRINGID_PLAYERWHITEOUT 31 -#define STRINGID_PLAYERWHITEOUT2 32 -#define STRINGID_PREVENTSESCAPE 33 -#define STRINGID_HITXTIMES 34 -#define STRINGID_PKMNFELLASLEEP 35 -#define STRINGID_PKMNMADESLEEP 36 -#define STRINGID_PKMNALREADYASLEEP 37 -#define STRINGID_PKMNALREADYASLEEP2 38 -#define STRINGID_PKMNWASNTAFFECTED 39 -#define STRINGID_PKMNWASPOISONED 40 -#define STRINGID_PKMNPOISONEDBY 41 -#define STRINGID_PKMNHURTBYPOISON 42 -#define STRINGID_PKMNALREADYPOISONED 43 -#define STRINGID_PKMNBADLYPOISONED 44 -#define STRINGID_PKMNENERGYDRAINED 45 -#define STRINGID_PKMNWASBURNED 46 -#define STRINGID_PKMNBURNEDBY 47 -#define STRINGID_PKMNHURTBYBURN 48 -#define STRINGID_PKMNWASFROZEN 49 -#define STRINGID_PKMNFROZENBY 50 -#define STRINGID_PKMNISFROZEN 51 -#define STRINGID_PKMNWASDEFROSTED 52 -#define STRINGID_PKMNWASDEFROSTED2 53 -#define STRINGID_PKMNWASDEFROSTEDBY 54 -#define STRINGID_PKMNWASPARALYZED 55 -#define STRINGID_PKMNWASPARALYZEDBY 56 -#define STRINGID_PKMNISPARALYZED 57 -#define STRINGID_PKMNISALREADYPARALYZED 58 -#define STRINGID_PKMNHEALEDPARALYSIS 59 -#define STRINGID_PKMNDREAMEATEN 60 -#define STRINGID_STATSWONTINCREASE 61 -#define STRINGID_STATSWONTDECREASE 62 -#define STRINGID_TEAMSTOPPEDWORKING 63 -#define STRINGID_FOESTOPPEDWORKING 64 -#define STRINGID_PKMNISCONFUSED 65 -#define STRINGID_PKMNHEALEDCONFUSION 66 -#define STRINGID_PKMNWASCONFUSED 67 -#define STRINGID_PKMNALREADYCONFUSED 68 -#define STRINGID_PKMNFELLINLOVE 69 -#define STRINGID_PKMNINLOVE 70 -#define STRINGID_PKMNIMMOBILIZEDBYLOVE 71 -#define STRINGID_PKMNBLOWNAWAY 72 -#define STRINGID_PKMNCHANGEDTYPE 73 -#define STRINGID_PKMNFLINCHED 74 -#define STRINGID_PKMNREGAINEDHEALTH 75 -#define STRINGID_PKMNHPFULL 76 -#define STRINGID_PKMNRAISEDSPDEF 77 -#define STRINGID_PKMNRAISEDDEF 78 -#define STRINGID_PKMNCOVEREDBYVEIL 79 -#define STRINGID_PKMNUSEDSAFEGUARD 80 -#define STRINGID_PKMNSAFEGUARDEXPIRED 81 -#define STRINGID_PKMNWENTTOSLEEP 82 -#define STRINGID_PKMNSLEPTHEALTHY 83 -#define STRINGID_PKMNWHIPPEDWHIRLWIND 84 -#define STRINGID_PKMNTOOKSUNLIGHT 85 -#define STRINGID_PKMNLOWEREDHEAD 86 -#define STRINGID_PKMNISGLOWING 87 -#define STRINGID_PKMNFLEWHIGH 88 -#define STRINGID_PKMNDUGHOLE 89 -#define STRINGID_PKMNSQUEEZEDBYBIND 90 -#define STRINGID_PKMNTRAPPEDINVORTEX 91 -#define STRINGID_PKMNWRAPPEDBY 92 -#define STRINGID_PKMNCLAMPED 93 -#define STRINGID_PKMNHURTBY 94 -#define STRINGID_PKMNFREEDFROM 95 -#define STRINGID_PKMNCRASHED 96 -#define STRINGID_PKMNSHROUDEDINMIST 97 -#define STRINGID_PKMNPROTECTEDBYMIST 98 -#define STRINGID_PKMNGETTINGPUMPED 99 -#define STRINGID_PKMNHITWITHRECOIL 100 -#define STRINGID_PKMNPROTECTEDITSELF2 101 -#define STRINGID_PKMNBUFFETEDBYSANDSTORM 102 -#define STRINGID_PKMNPELTEDBYHAIL 103 -#define STRINGID_PKMNSEEDED 104 -#define STRINGID_PKMNEVADEDATTACK 105 -#define STRINGID_PKMNSAPPEDBYLEECHSEED 106 -#define STRINGID_PKMNFASTASLEEP 107 -#define STRINGID_PKMNWOKEUP 108 -#define STRINGID_PKMNUPROARKEPTAWAKE 109 -#define STRINGID_PKMNWOKEUPINUPROAR 110 -#define STRINGID_PKMNCAUSEDUPROAR 111 -#define STRINGID_PKMNMAKINGUPROAR 112 -#define STRINGID_PKMNCALMEDDOWN 113 -#define STRINGID_PKMNCANTSLEEPINUPROAR 114 -#define STRINGID_PKMNSTOCKPILED 115 -#define STRINGID_PKMNCANTSTOCKPILE 116 -#define STRINGID_PKMNCANTSLEEPINUPROAR2 117 -#define STRINGID_UPROARKEPTPKMNAWAKE 118 -#define STRINGID_PKMNSTAYEDAWAKEUSING 119 -#define STRINGID_PKMNSTORINGENERGY 120 -#define STRINGID_PKMNUNLEASHEDENERGY 121 -#define STRINGID_PKMNFATIGUECONFUSION 122 -#define STRINGID_PLAYERPICKEDUPMONEY 123 -#define STRINGID_PKMNUNAFFECTED 124 -#define STRINGID_PKMNTRANSFORMEDINTO 125 -#define STRINGID_PKMNMADESUBSTITUTE 126 -#define STRINGID_PKMNHASSUBSTITUTE 127 -#define STRINGID_SUBSTITUTEDAMAGED 128 -#define STRINGID_PKMNSUBSTITUTEFADED 129 -#define STRINGID_PKMNMUSTRECHARGE 130 -#define STRINGID_PKMNRAGEBUILDING 131 -#define STRINGID_PKMNMOVEWASDISABLED 132 -#define STRINGID_PKMNMOVEISDISABLED 133 -#define STRINGID_PKMNMOVEDISABLEDNOMORE 134 -#define STRINGID_PKMNGOTENCORE 135 -#define STRINGID_PKMNENCOREENDED 136 -#define STRINGID_PKMNTOOKAIM 137 -#define STRINGID_PKMNSKETCHEDMOVE 138 -#define STRINGID_PKMNTRYINGTOTAKEFOE 139 -#define STRINGID_PKMNTOOKFOE 140 -#define STRINGID_PKMNREDUCEDPP 141 -#define STRINGID_PKMNSTOLEITEM 142 -#define STRINGID_TARGETCANTESCAPENOW 143 -#define STRINGID_PKMNFELLINTONIGHTMARE 144 -#define STRINGID_PKMNLOCKEDINNIGHTMARE 145 -#define STRINGID_PKMNLAIDCURSE 146 -#define STRINGID_PKMNAFFLICTEDBYCURSE 147 -#define STRINGID_SPIKESSCATTERED 148 -#define STRINGID_PKMNHURTBYSPIKES 149 -#define STRINGID_PKMNIDENTIFIED 150 -#define STRINGID_PKMNPERISHCOUNTFELL 151 -#define STRINGID_PKMNBRACEDITSELF 152 -#define STRINGID_PKMNENDUREDHIT 153 -#define STRINGID_MAGNITUDESTRENGTH 154 -#define STRINGID_PKMNCUTHPMAXEDATTACK 155 -#define STRINGID_PKMNCOPIEDSTATCHANGES 156 -#define STRINGID_PKMNGOTFREE 157 -#define STRINGID_PKMNSHEDLEECHSEED 158 -#define STRINGID_PKMNBLEWAWAYSPIKES 159 -#define STRINGID_PKMNFLEDFROMBATTLE 160 -#define STRINGID_PKMNFORESAWATTACK 161 -#define STRINGID_PKMNTOOKATTACK 162 -#define STRINGID_PKMNATTACK 163 -#define STRINGID_PKMNCENTERATTENTION 164 -#define STRINGID_PKMNCHARGINGPOWER 165 -#define STRINGID_NATUREPOWERTURNEDINTO 166 -#define STRINGID_PKMNSTATUSNORMAL 167 -#define STRINGID_PKMNHASNOMOVESLEFT 168 -#define STRINGID_PKMNSUBJECTEDTOTORMENT 169 -#define STRINGID_PKMNCANTUSEMOVETORMENT 170 -#define STRINGID_PKMNTIGHTENINGFOCUS 171 -#define STRINGID_PKMNFELLFORTAUNT 172 -#define STRINGID_PKMNCANTUSEMOVETAUNT 173 -#define STRINGID_PKMNREADYTOHELP 174 -#define STRINGID_PKMNSWITCHEDITEMS 175 -#define STRINGID_PKMNCOPIEDFOE 176 -#define STRINGID_PKMNMADEWISH 177 -#define STRINGID_PKMNWISHCAMETRUE 178 -#define STRINGID_PKMNPLANTEDROOTS 179 -#define STRINGID_PKMNABSORBEDNUTRIENTS 180 -#define STRINGID_PKMNANCHOREDITSELF 181 -#define STRINGID_PKMNWASMADEDROWSY 182 -#define STRINGID_PKMNKNOCKEDOFF 183 -#define STRINGID_PKMNSWAPPEDABILITIES 184 -#define STRINGID_PKMNSEALEDOPPONENTMOVE 185 -#define STRINGID_PKMNCANTUSEMOVESEALED 186 -#define STRINGID_PKMNWANTSGRUDGE 187 -#define STRINGID_PKMNLOSTPPGRUDGE 188 -#define STRINGID_PKMNSHROUDEDITSELF 189 -#define STRINGID_PKMNMOVEBOUNCED 190 -#define STRINGID_PKMNWAITSFORTARGET 191 -#define STRINGID_PKMNSNATCHEDMOVE 192 -#define STRINGID_PKMNMADEITRAIN 193 -#define STRINGID_PKMNRAISEDSPEED 194 -#define STRINGID_PKMNPROTECTEDBY 195 -#define STRINGID_PKMNPREVENTSUSAGE 196 -#define STRINGID_PKMNRESTOREDHPUSING 197 -#define STRINGID_PKMNCHANGEDTYPEWITH 198 -#define STRINGID_PKMNPREVENTSPARALYSISWITH 199 -#define STRINGID_PKMNPREVENTSROMANCEWITH 200 -#define STRINGID_PKMNPREVENTSPOISONINGWITH 201 -#define STRINGID_PKMNPREVENTSCONFUSIONWITH 202 -#define STRINGID_PKMNRAISEDFIREPOWERWITH 203 -#define STRINGID_PKMNANCHORSITSELFWITH 204 -#define STRINGID_PKMNCUTSATTACKWITH 205 -#define STRINGID_PKMNPREVENTSSTATLOSSWITH 206 -#define STRINGID_PKMNHURTSWITH 207 -#define STRINGID_PKMNTRACED 208 -#define STRINGID_STATSHARPLY 209 -#define STRINGID_STATROSE 210 -#define STRINGID_STATHARSHLY 211 -#define STRINGID_STATFELL 212 -#define STRINGID_ATTACKERSSTATROSE 213 -#define STRINGID_DEFENDERSSTATROSE 214 -#define STRINGID_ATTACKERSSTATFELL 215 -#define STRINGID_DEFENDERSSTATFELL 216 -#define STRINGID_CRITICALHIT 217 -#define STRINGID_ONEHITKO 218 -#define STRINGID_123POOF 219 -#define STRINGID_ANDELLIPSIS 220 -#define STRINGID_NOTVERYEFFECTIVE 221 -#define STRINGID_SUPEREFFECTIVE 222 -#define STRINGID_GOTAWAYSAFELY 223 -#define STRINGID_WILDPKMNFLED 224 -#define STRINGID_NORUNNINGFROMTRAINERS 225 -#define STRINGID_CANTESCAPE 226 -#define STRINGID_DONTLEAVEBIRCH 227 -#define STRINGID_BUTNOTHINGHAPPENED 228 -#define STRINGID_BUTITFAILED 229 -#define STRINGID_ITHURTCONFUSION 230 -#define STRINGID_MIRRORMOVEFAILED 231 -#define STRINGID_STARTEDTORAIN 232 -#define STRINGID_DOWNPOURSTARTED 233 -#define STRINGID_RAINCONTINUES 234 -#define STRINGID_DOWNPOURCONTINUES 235 -#define STRINGID_RAINSTOPPED 236 -#define STRINGID_SANDSTORMBREWED 237 -#define STRINGID_SANDSTORMRAGES 238 -#define STRINGID_SANDSTORMSUBSIDED 239 -#define STRINGID_SUNLIGHTGOTBRIGHT 240 -#define STRINGID_SUNLIGHTSTRONG 241 -#define STRINGID_SUNLIGHTFADED 242 -#define STRINGID_STARTEDHAIL 243 -#define STRINGID_HAILCONTINUES 244 -#define STRINGID_HAILSTOPPED 245 -#define STRINGID_FAILEDTOSPITUP 246 -#define STRINGID_FAILEDTOSWALLOW 247 -#define STRINGID_WINDBECAMEHEATWAVE 248 -#define STRINGID_STATCHANGESGONE 249 -#define STRINGID_COINSSCATTERED 250 -#define STRINGID_TOOWEAKFORSUBSTITUTE 251 -#define STRINGID_SHAREDPAIN 252 -#define STRINGID_BELLCHIMED 253 -#define STRINGID_FAINTINTHREE 254 -#define STRINGID_NOPPLEFT 255 -#define STRINGID_BUTNOPPLEFT 256 -#define STRINGID_PLAYERUSEDITEM 257 -#define STRINGID_WALLYUSEDITEM 258 -#define STRINGID_TRAINERBLOCKEDBALL 259 -#define STRINGID_DONTBEATHIEF 260 -#define STRINGID_ITDODGEDBALL 261 -#define STRINGID_YOUMISSEDPKMN 262 -#define STRINGID_PKMNBROKEFREE 263 -#define STRINGID_ITAPPEAREDCAUGHT 264 -#define STRINGID_AARGHALMOSTHADIT 265 -#define STRINGID_SHOOTSOCLOSE 266 -#define STRINGID_GOTCHAPKMNCAUGHT 267 -#define STRINGID_GOTCHAPKMNCAUGHT2 268 -#define STRINGID_GIVENICKNAMECAPTURED 269 -#define STRINGID_PKMNSENTTOPC 270 -#define STRINGID_PKMNDATAADDEDTODEX 271 -#define STRINGID_ITISRAINING 272 -#define STRINGID_SANDSTORMISRAGING 273 -#define STRINGID_CANTESCAPE2 274 -#define STRINGID_PKMNIGNORESASLEEP 275 -#define STRINGID_PKMNIGNOREDORDERS 276 -#define STRINGID_PKMNBEGANTONAP 277 -#define STRINGID_PKMNLOAFING 278 -#define STRINGID_PKMNWONTOBEY 279 -#define STRINGID_PKMNTURNEDAWAY 280 -#define STRINGID_PKMNPRETENDNOTNOTICE 281 -#define STRINGID_ENEMYABOUTTOSWITCHPKMN 282 -#define STRINGID_CREPTCLOSER 283 -#define STRINGID_CANTGETCLOSER 284 -#define STRINGID_PKMNWATCHINGCAREFULLY 285 -#define STRINGID_PKMNCURIOUSABOUTX 286 -#define STRINGID_PKMNENTHRALLEDBYX 287 -#define STRINGID_PKMNIGNOREDX 288 -#define STRINGID_THREWPOKEBLOCKATPKMN 289 -#define STRINGID_OUTOFSAFARIBALLS 290 -#define STRINGID_PKMNSITEMCUREDPARALYSIS 291 -#define STRINGID_PKMNSITEMCUREDPOISON 292 -#define STRINGID_PKMNSITEMHEALEDBURN 293 -#define STRINGID_PKMNSITEMDEFROSTEDIT 294 -#define STRINGID_PKMNSITEMWOKEIT 295 -#define STRINGID_PKMNSITEMSNAPPEDOUT 296 -#define STRINGID_PKMNSITEMCUREDPROBLEM 297 -#define STRINGID_PKMNSITEMRESTOREDHEALTH 298 -#define STRINGID_PKMNSITEMRESTOREDPP 299 -#define STRINGID_PKMNSITEMRESTOREDSTATUS 300 -#define STRINGID_PKMNSITEMRESTOREDHPALITTLE 301 -#define STRINGID_ITEMALLOWSONLYYMOVE 302 -#define STRINGID_PKMNHUNGONWITHX 303 -#define STRINGID_EMPTYSTRING3 304 -#define STRINGID_PKMNSXPREVENTSBURNS 305 -#define STRINGID_PKMNSXBLOCKSY 306 -#define STRINGID_PKMNSXRESTOREDHPALITTLE2 307 -#define STRINGID_PKMNSXWHIPPEDUPSANDSTORM 308 -#define STRINGID_PKMNSXPREVENTSYLOSS 309 -#define STRINGID_PKMNSXINFATUATEDY 310 -#define STRINGID_PKMNSXMADEYINEFFECTIVE 311 -#define STRINGID_PKMNSXCUREDYPROBLEM 312 -#define STRINGID_ITSUCKEDLIQUIDOOZE 313 -#define STRINGID_PKMNTRANSFORMED 314 -#define STRINGID_ELECTRICITYWEAKENED 315 -#define STRINGID_FIREWEAKENED 316 -#define STRINGID_PKMNHIDUNDERWATER 317 -#define STRINGID_PKMNSPRANGUP 318 -#define STRINGID_HMMOVESCANTBEFORGOTTEN 319 -#define STRINGID_XFOUNDONEY 320 -#define STRINGID_PLAYERDEFEATEDTRAINER1 321 -#define STRINGID_SOOTHINGAROMA 322 -#define STRINGID_ITEMSCANTBEUSEDNOW 323 -#define STRINGID_FORXCOMMAYZ 324 -#define STRINGID_USINGITEMSTATOFPKMNROSE 325 -#define STRINGID_PKMNUSEDXTOGETPUMPED 326 -#define STRINGID_PKMNSXMADEYUSELESS 327 -#define STRINGID_PKMNTRAPPEDBYSANDTOMB 328 -#define STRINGID_EMPTYSTRING4 329 -#define STRINGID_ABOOSTED 330 -#define STRINGID_PKMNSXINTENSIFIEDSUN 331 -#define STRINGID_PKMNMAKESGROUNDMISS 332 -#define STRINGID_YOUTHROWABALLNOWRIGHT 333 -#define STRINGID_PKMNSXTOOKATTACK 334 -#define STRINGID_PKMNCHOSEXASDESTINY 335 -#define STRINGID_PKMNLOSTFOCUS 336 -#define STRINGID_USENEXTPKMN 337 -#define STRINGID_PKMNFLEDUSINGITS 338 -#define STRINGID_PKMNFLEDUSING 339 -#define STRINGID_PKMNWASDRAGGEDOUT 340 -#define STRINGID_PREVENTEDFROMWORKING 341 -#define STRINGID_PKMNSITEMNORMALIZEDSTATUS 342 -#define STRINGID_TRAINER1USEDITEM 343 -#define STRINGID_BOXISFULL 344 -#define STRINGID_PKMNAVOIDEDATTACK 345 -#define STRINGID_PKMNSXMADEITINEFFECTIVE 346 -#define STRINGID_PKMNSXPREVENTSFLINCHING 347 -#define STRINGID_PKMNALREADYHASBURN 348 -#define STRINGID_STATSWONTDECREASE2 349 -#define STRINGID_PKMNSXBLOCKSY2 350 -#define STRINGID_PKMNSXWOREOFF 351 -#define STRINGID_PKMNRAISEDDEFALITTLE 352 -#define STRINGID_PKMNRAISEDSPDEFALITTLE 353 -#define STRINGID_THEWALLSHATTERED 354 -#define STRINGID_PKMNSXPREVENTSYSZ 355 -#define STRINGID_PKMNSXCUREDITSYPROBLEM 356 -#define STRINGID_ATTACKERCANTESCAPE 357 -#define STRINGID_PKMNOBTAINEDX 358 -#define STRINGID_PKMNOBTAINEDX2 359 -#define STRINGID_PKMNOBTAINEDXYOBTAINEDZ 360 -#define STRINGID_BUTNOEFFECT 361 -#define STRINGID_PKMNSXHADNOEFFECTONY 362 -#define STRINGID_TWOENEMIESDEFEATED 363 -#define STRINGID_TRAINER2LOSETEXT 364 -#define STRINGID_PKMNINCAPABLEOFPOWER 365 -#define STRINGID_GLINTAPPEARSINEYE 366 -#define STRINGID_PKMNGETTINGINTOPOSITION 367 -#define STRINGID_PKMNBEGANGROWLINGDEEPLY 368 -#define STRINGID_PKMNEAGERFORMORE 369 -#define STRINGID_DEFEATEDOPPONENTBYREFEREE 370 -#define STRINGID_LOSTTOOPPONENTBYREFEREE 371 -#define STRINGID_TIEDOPPONENTBYREFEREE 372 -#define STRINGID_QUESTIONFORFEITMATCH 373 -#define STRINGID_FORFEITEDMATCH 374 -#define STRINGID_PKMNTRANSFERREDSOMEONESPC 375 -#define STRINGID_PKMNTRANSFERREDLANETTESPC 376 -#define STRINGID_PKMNBOXSOMEONESPCFULL 377 -#define STRINGID_PKMNBOXLANETTESPCFULL 378 -#define STRINGID_TRAINER1WINTEXT 379 -#define STRINGID_TRAINER2WINTEXT 380 +#define STRINGID_TRAINER1LOSETEXT 12 +#define STRINGID_PKMNGAINEDEXP 13 +#define STRINGID_PKMNGREWTOLV 14 +#define STRINGID_PKMNLEARNEDMOVE 15 +#define STRINGID_TRYTOLEARNMOVE1 16 +#define STRINGID_TRYTOLEARNMOVE2 17 +#define STRINGID_TRYTOLEARNMOVE3 18 +#define STRINGID_PKMNFORGOTMOVE 19 +#define STRINGID_STOPLEARNINGMOVE 20 +#define STRINGID_DIDNOTLEARNMOVE 21 +#define STRINGID_PKMNLEARNEDMOVE2 22 +#define STRINGID_ATTACKMISSED 23 +#define STRINGID_PKMNPROTECTEDITSELF 24 +#define STRINGID_STATSWONTINCREASE2 25 +#define STRINGID_AVOIDEDDAMAGE 26 +#define STRINGID_ITDOESNTAFFECT 27 +#define STRINGID_ATTACKERFAINTED 28 +#define STRINGID_TARGETFAINTED 29 +#define STRINGID_PLAYERGOTMONEY 30 +#define STRINGID_PLAYERWHITEOUT 31 +#define STRINGID_PLAYERWHITEOUT2 32 +#define STRINGID_PREVENTSESCAPE 33 +#define STRINGID_HITXTIMES 34 +#define STRINGID_PKMNFELLASLEEP 35 +#define STRINGID_PKMNMADESLEEP 36 +#define STRINGID_PKMNALREADYASLEEP 37 +#define STRINGID_PKMNALREADYASLEEP2 38 +#define STRINGID_PKMNWASNTAFFECTED 39 +#define STRINGID_PKMNWASPOISONED 40 +#define STRINGID_PKMNPOISONEDBY 41 +#define STRINGID_PKMNHURTBYPOISON 42 +#define STRINGID_PKMNALREADYPOISONED 43 +#define STRINGID_PKMNBADLYPOISONED 44 +#define STRINGID_PKMNENERGYDRAINED 45 +#define STRINGID_PKMNWASBURNED 46 +#define STRINGID_PKMNBURNEDBY 47 +#define STRINGID_PKMNHURTBYBURN 48 +#define STRINGID_PKMNWASFROZEN 49 +#define STRINGID_PKMNFROZENBY 50 +#define STRINGID_PKMNISFROZEN 51 +#define STRINGID_PKMNWASDEFROSTED 52 +#define STRINGID_PKMNWASDEFROSTED2 53 +#define STRINGID_PKMNWASDEFROSTEDBY 54 +#define STRINGID_PKMNWASPARALYZED 55 +#define STRINGID_PKMNWASPARALYZEDBY 56 +#define STRINGID_PKMNISPARALYZED 57 +#define STRINGID_PKMNISALREADYPARALYZED 58 +#define STRINGID_PKMNHEALEDPARALYSIS 59 +#define STRINGID_PKMNDREAMEATEN 60 +#define STRINGID_STATSWONTINCREASE 61 +#define STRINGID_STATSWONTDECREASE 62 +#define STRINGID_TEAMSTOPPEDWORKING 63 +#define STRINGID_FOESTOPPEDWORKING 64 +#define STRINGID_PKMNISCONFUSED 65 +#define STRINGID_PKMNHEALEDCONFUSION 66 +#define STRINGID_PKMNWASCONFUSED 67 +#define STRINGID_PKMNALREADYCONFUSED 68 +#define STRINGID_PKMNFELLINLOVE 69 +#define STRINGID_PKMNINLOVE 70 +#define STRINGID_PKMNIMMOBILIZEDBYLOVE 71 +#define STRINGID_PKMNBLOWNAWAY 72 +#define STRINGID_PKMNCHANGEDTYPE 73 +#define STRINGID_PKMNFLINCHED 74 +#define STRINGID_PKMNREGAINEDHEALTH 75 +#define STRINGID_PKMNHPFULL 76 +#define STRINGID_PKMNRAISEDSPDEF 77 +#define STRINGID_PKMNRAISEDDEF 78 +#define STRINGID_PKMNCOVEREDBYVEIL 79 +#define STRINGID_PKMNUSEDSAFEGUARD 80 +#define STRINGID_PKMNSAFEGUARDEXPIRED 81 +#define STRINGID_PKMNWENTTOSLEEP 82 +#define STRINGID_PKMNSLEPTHEALTHY 83 +#define STRINGID_PKMNWHIPPEDWHIRLWIND 84 +#define STRINGID_PKMNTOOKSUNLIGHT 85 +#define STRINGID_PKMNLOWEREDHEAD 86 +#define STRINGID_PKMNISGLOWING 87 +#define STRINGID_PKMNFLEWHIGH 88 +#define STRINGID_PKMNDUGHOLE 89 +#define STRINGID_PKMNSQUEEZEDBYBIND 90 +#define STRINGID_PKMNTRAPPEDINVORTEX 91 +#define STRINGID_PKMNWRAPPEDBY 92 +#define STRINGID_PKMNCLAMPED 93 +#define STRINGID_PKMNHURTBY 94 +#define STRINGID_PKMNFREEDFROM 95 +#define STRINGID_PKMNCRASHED 96 +#define STRINGID_PKMNSHROUDEDINMIST 97 +#define STRINGID_PKMNPROTECTEDBYMIST 98 +#define STRINGID_PKMNGETTINGPUMPED 99 +#define STRINGID_PKMNHITWITHRECOIL 100 +#define STRINGID_PKMNPROTECTEDITSELF2 101 +#define STRINGID_PKMNBUFFETEDBYSANDSTORM 102 +#define STRINGID_PKMNPELTEDBYHAIL 103 +#define STRINGID_PKMNSEEDED 104 +#define STRINGID_PKMNEVADEDATTACK 105 +#define STRINGID_PKMNSAPPEDBYLEECHSEED 106 +#define STRINGID_PKMNFASTASLEEP 107 +#define STRINGID_PKMNWOKEUP 108 +#define STRINGID_PKMNUPROARKEPTAWAKE 109 +#define STRINGID_PKMNWOKEUPINUPROAR 110 +#define STRINGID_PKMNCAUSEDUPROAR 111 +#define STRINGID_PKMNMAKINGUPROAR 112 +#define STRINGID_PKMNCALMEDDOWN 113 +#define STRINGID_PKMNCANTSLEEPINUPROAR 114 +#define STRINGID_PKMNSTOCKPILED 115 +#define STRINGID_PKMNCANTSTOCKPILE 116 +#define STRINGID_PKMNCANTSLEEPINUPROAR2 117 +#define STRINGID_UPROARKEPTPKMNAWAKE 118 +#define STRINGID_PKMNSTAYEDAWAKEUSING 119 +#define STRINGID_PKMNSTORINGENERGY 120 +#define STRINGID_PKMNUNLEASHEDENERGY 121 +#define STRINGID_PKMNFATIGUECONFUSION 122 +#define STRINGID_PLAYERPICKEDUPMONEY 123 +#define STRINGID_PKMNUNAFFECTED 124 +#define STRINGID_PKMNTRANSFORMEDINTO 125 +#define STRINGID_PKMNMADESUBSTITUTE 126 +#define STRINGID_PKMNHASSUBSTITUTE 127 +#define STRINGID_SUBSTITUTEDAMAGED 128 +#define STRINGID_PKMNSUBSTITUTEFADED 129 +#define STRINGID_PKMNMUSTRECHARGE 130 +#define STRINGID_PKMNRAGEBUILDING 131 +#define STRINGID_PKMNMOVEWASDISABLED 132 +#define STRINGID_PKMNMOVEISDISABLED 133 +#define STRINGID_PKMNMOVEDISABLEDNOMORE 134 +#define STRINGID_PKMNGOTENCORE 135 +#define STRINGID_PKMNENCOREENDED 136 +#define STRINGID_PKMNTOOKAIM 137 +#define STRINGID_PKMNSKETCHEDMOVE 138 +#define STRINGID_PKMNTRYINGTOTAKEFOE 139 +#define STRINGID_PKMNTOOKFOE 140 +#define STRINGID_PKMNREDUCEDPP 141 +#define STRINGID_PKMNSTOLEITEM 142 +#define STRINGID_TARGETCANTESCAPENOW 143 +#define STRINGID_PKMNFELLINTONIGHTMARE 144 +#define STRINGID_PKMNLOCKEDINNIGHTMARE 145 +#define STRINGID_PKMNLAIDCURSE 146 +#define STRINGID_PKMNAFFLICTEDBYCURSE 147 +#define STRINGID_SPIKESSCATTERED 148 +#define STRINGID_PKMNHURTBYSPIKES 149 +#define STRINGID_PKMNIDENTIFIED 150 +#define STRINGID_PKMNPERISHCOUNTFELL 151 +#define STRINGID_PKMNBRACEDITSELF 152 +#define STRINGID_PKMNENDUREDHIT 153 +#define STRINGID_MAGNITUDESTRENGTH 154 +#define STRINGID_PKMNCUTHPMAXEDATTACK 155 +#define STRINGID_PKMNCOPIEDSTATCHANGES 156 +#define STRINGID_PKMNGOTFREE 157 +#define STRINGID_PKMNSHEDLEECHSEED 158 +#define STRINGID_PKMNBLEWAWAYSPIKES 159 +#define STRINGID_PKMNFLEDFROMBATTLE 160 +#define STRINGID_PKMNFORESAWATTACK 161 +#define STRINGID_PKMNTOOKATTACK 162 +#define STRINGID_PKMNATTACK 163 +#define STRINGID_PKMNCENTERATTENTION 164 +#define STRINGID_PKMNCHARGINGPOWER 165 +#define STRINGID_NATUREPOWERTURNEDINTO 166 +#define STRINGID_PKMNSTATUSNORMAL 167 +#define STRINGID_PKMNHASNOMOVESLEFT 168 +#define STRINGID_PKMNSUBJECTEDTOTORMENT 169 +#define STRINGID_PKMNCANTUSEMOVETORMENT 170 +#define STRINGID_PKMNTIGHTENINGFOCUS 171 +#define STRINGID_PKMNFELLFORTAUNT 172 +#define STRINGID_PKMNCANTUSEMOVETAUNT 173 +#define STRINGID_PKMNREADYTOHELP 174 +#define STRINGID_PKMNSWITCHEDITEMS 175 +#define STRINGID_PKMNCOPIEDFOE 176 +#define STRINGID_PKMNMADEWISH 177 +#define STRINGID_PKMNWISHCAMETRUE 178 +#define STRINGID_PKMNPLANTEDROOTS 179 +#define STRINGID_PKMNABSORBEDNUTRIENTS 180 +#define STRINGID_PKMNANCHOREDITSELF 181 +#define STRINGID_PKMNWASMADEDROWSY 182 +#define STRINGID_PKMNKNOCKEDOFF 183 +#define STRINGID_PKMNSWAPPEDABILITIES 184 +#define STRINGID_PKMNSEALEDOPPONENTMOVE 185 +#define STRINGID_PKMNCANTUSEMOVESEALED 186 +#define STRINGID_PKMNWANTSGRUDGE 187 +#define STRINGID_PKMNLOSTPPGRUDGE 188 +#define STRINGID_PKMNSHROUDEDITSELF 189 +#define STRINGID_PKMNMOVEBOUNCED 190 +#define STRINGID_PKMNWAITSFORTARGET 191 +#define STRINGID_PKMNSNATCHEDMOVE 192 +#define STRINGID_PKMNMADEITRAIN 193 +#define STRINGID_PKMNRAISEDSPEED 194 +#define STRINGID_PKMNPROTECTEDBY 195 +#define STRINGID_PKMNPREVENTSUSAGE 196 +#define STRINGID_PKMNRESTOREDHPUSING 197 +#define STRINGID_PKMNCHANGEDTYPEWITH 198 +#define STRINGID_PKMNPREVENTSPARALYSISWITH 199 +#define STRINGID_PKMNPREVENTSROMANCEWITH 200 +#define STRINGID_PKMNPREVENTSPOISONINGWITH 201 +#define STRINGID_PKMNPREVENTSCONFUSIONWITH 202 +#define STRINGID_PKMNRAISEDFIREPOWERWITH 203 +#define STRINGID_PKMNANCHORSITSELFWITH 204 +#define STRINGID_PKMNCUTSATTACKWITH 205 +#define STRINGID_PKMNPREVENTSSTATLOSSWITH 206 +#define STRINGID_PKMNHURTSWITH 207 +#define STRINGID_PKMNTRACED 208 +#define STRINGID_STATSHARPLY 209 +#define STRINGID_STATROSE 210 +#define STRINGID_STATHARSHLY 211 +#define STRINGID_STATFELL 212 +#define STRINGID_ATTACKERSSTATROSE 213 +#define STRINGID_DEFENDERSSTATROSE 214 +#define STRINGID_ATTACKERSSTATFELL 215 +#define STRINGID_DEFENDERSSTATFELL 216 +#define STRINGID_CRITICALHIT 217 +#define STRINGID_ONEHITKO 218 +#define STRINGID_123POOF 219 +#define STRINGID_ANDELLIPSIS 220 +#define STRINGID_NOTVERYEFFECTIVE 221 +#define STRINGID_SUPEREFFECTIVE 222 +#define STRINGID_GOTAWAYSAFELY 223 +#define STRINGID_WILDPKMNFLED 224 +#define STRINGID_NORUNNINGFROMTRAINERS 225 +#define STRINGID_CANTESCAPE 226 +#define STRINGID_DONTLEAVEBIRCH 227 +#define STRINGID_BUTNOTHINGHAPPENED 228 +#define STRINGID_BUTITFAILED 229 +#define STRINGID_ITHURTCONFUSION 230 +#define STRINGID_MIRRORMOVEFAILED 231 +#define STRINGID_STARTEDTORAIN 232 +#define STRINGID_DOWNPOURSTARTED 233 +#define STRINGID_RAINCONTINUES 234 +#define STRINGID_DOWNPOURCONTINUES 235 +#define STRINGID_RAINSTOPPED 236 +#define STRINGID_SANDSTORMBREWED 237 +#define STRINGID_SANDSTORMRAGES 238 +#define STRINGID_SANDSTORMSUBSIDED 239 +#define STRINGID_SUNLIGHTGOTBRIGHT 240 +#define STRINGID_SUNLIGHTSTRONG 241 +#define STRINGID_SUNLIGHTFADED 242 +#define STRINGID_STARTEDHAIL 243 +#define STRINGID_HAILCONTINUES 244 +#define STRINGID_HAILSTOPPED 245 +#define STRINGID_FAILEDTOSPITUP 246 +#define STRINGID_FAILEDTOSWALLOW 247 +#define STRINGID_WINDBECAMEHEATWAVE 248 +#define STRINGID_STATCHANGESGONE 249 +#define STRINGID_COINSSCATTERED 250 +#define STRINGID_TOOWEAKFORSUBSTITUTE 251 +#define STRINGID_SHAREDPAIN 252 +#define STRINGID_BELLCHIMED 253 +#define STRINGID_FAINTINTHREE 254 +#define STRINGID_NOPPLEFT 255 +#define STRINGID_BUTNOPPLEFT 256 +#define STRINGID_PLAYERUSEDITEM 257 +#define STRINGID_WALLYUSEDITEM 258 +#define STRINGID_TRAINERBLOCKEDBALL 259 +#define STRINGID_DONTBEATHIEF 260 +#define STRINGID_ITDODGEDBALL 261 +#define STRINGID_YOUMISSEDPKMN 262 +#define STRINGID_PKMNBROKEFREE 263 +#define STRINGID_ITAPPEAREDCAUGHT 264 +#define STRINGID_AARGHALMOSTHADIT 265 +#define STRINGID_SHOOTSOCLOSE 266 +#define STRINGID_GOTCHAPKMNCAUGHT 267 +#define STRINGID_GOTCHAPKMNCAUGHT2 268 +#define STRINGID_GIVENICKNAMECAPTURED 269 +#define STRINGID_PKMNSENTTOPC 270 +#define STRINGID_PKMNDATAADDEDTODEX 271 +#define STRINGID_ITISRAINING 272 +#define STRINGID_SANDSTORMISRAGING 273 +#define STRINGID_CANTESCAPE2 274 +#define STRINGID_PKMNIGNORESASLEEP 275 +#define STRINGID_PKMNIGNOREDORDERS 276 +#define STRINGID_PKMNBEGANTONAP 277 +#define STRINGID_PKMNLOAFING 278 +#define STRINGID_PKMNWONTOBEY 279 +#define STRINGID_PKMNTURNEDAWAY 280 +#define STRINGID_PKMNPRETENDNOTNOTICE 281 +#define STRINGID_ENEMYABOUTTOSWITCHPKMN 282 +#define STRINGID_CREPTCLOSER 283 +#define STRINGID_CANTGETCLOSER 284 +#define STRINGID_PKMNWATCHINGCAREFULLY 285 +#define STRINGID_PKMNCURIOUSABOUTX 286 +#define STRINGID_PKMNENTHRALLEDBYX 287 +#define STRINGID_PKMNIGNOREDX 288 +#define STRINGID_THREWPOKEBLOCKATPKMN 289 +#define STRINGID_OUTOFSAFARIBALLS 290 +#define STRINGID_PKMNSITEMCUREDPARALYSIS 291 +#define STRINGID_PKMNSITEMCUREDPOISON 292 +#define STRINGID_PKMNSITEMHEALEDBURN 293 +#define STRINGID_PKMNSITEMDEFROSTEDIT 294 +#define STRINGID_PKMNSITEMWOKEIT 295 +#define STRINGID_PKMNSITEMSNAPPEDOUT 296 +#define STRINGID_PKMNSITEMCUREDPROBLEM 297 +#define STRINGID_PKMNSITEMRESTOREDHEALTH 298 +#define STRINGID_PKMNSITEMRESTOREDPP 299 +#define STRINGID_PKMNSITEMRESTOREDSTATUS 300 +#define STRINGID_PKMNSITEMRESTOREDHPALITTLE 301 +#define STRINGID_ITEMALLOWSONLYYMOVE 302 +#define STRINGID_PKMNHUNGONWITHX 303 +#define STRINGID_EMPTYSTRING3 304 +#define STRINGID_PKMNSXPREVENTSBURNS 305 +#define STRINGID_PKMNSXBLOCKSY 306 +#define STRINGID_PKMNSXRESTOREDHPALITTLE2 307 +#define STRINGID_PKMNSXWHIPPEDUPSANDSTORM 308 +#define STRINGID_PKMNSXPREVENTSYLOSS 309 +#define STRINGID_PKMNSXINFATUATEDY 310 +#define STRINGID_PKMNSXMADEYINEFFECTIVE 311 +#define STRINGID_PKMNSXCUREDYPROBLEM 312 +#define STRINGID_ITSUCKEDLIQUIDOOZE 313 +#define STRINGID_PKMNTRANSFORMED 314 +#define STRINGID_ELECTRICITYWEAKENED 315 +#define STRINGID_FIREWEAKENED 316 +#define STRINGID_PKMNHIDUNDERWATER 317 +#define STRINGID_PKMNSPRANGUP 318 +#define STRINGID_HMMOVESCANTBEFORGOTTEN 319 +#define STRINGID_XFOUNDONEY 320 +#define STRINGID_PLAYERDEFEATEDTRAINER1 321 +#define STRINGID_SOOTHINGAROMA 322 +#define STRINGID_ITEMSCANTBEUSEDNOW 323 +#define STRINGID_FORXCOMMAYZ 324 +#define STRINGID_USINGITEMSTATOFPKMNROSE 325 +#define STRINGID_PKMNUSEDXTOGETPUMPED 326 +#define STRINGID_PKMNSXMADEYUSELESS 327 +#define STRINGID_PKMNTRAPPEDBYSANDTOMB 328 +#define STRINGID_EMPTYSTRING4 329 +#define STRINGID_ABOOSTED 330 +#define STRINGID_PKMNSXINTENSIFIEDSUN 331 +#define STRINGID_PKMNMAKESGROUNDMISS 332 +#define STRINGID_YOUTHROWABALLNOWRIGHT 333 +#define STRINGID_PKMNSXTOOKATTACK 334 +#define STRINGID_PKMNCHOSEXASDESTINY 335 +#define STRINGID_PKMNLOSTFOCUS 336 +#define STRINGID_USENEXTPKMN 337 +#define STRINGID_PKMNFLEDUSINGITS 338 +#define STRINGID_PKMNFLEDUSING 339 +#define STRINGID_PKMNWASDRAGGEDOUT 340 +#define STRINGID_PREVENTEDFROMWORKING 341 +#define STRINGID_PKMNSITEMNORMALIZEDSTATUS 342 +#define STRINGID_TRAINER1USEDITEM 343 +#define STRINGID_BOXISFULL 344 +#define STRINGID_PKMNAVOIDEDATTACK 345 +#define STRINGID_PKMNSXMADEITINEFFECTIVE 346 +#define STRINGID_PKMNSXPREVENTSFLINCHING 347 +#define STRINGID_PKMNALREADYHASBURN 348 +#define STRINGID_STATSWONTDECREASE2 349 +#define STRINGID_PKMNSXBLOCKSY2 350 +#define STRINGID_PKMNSXWOREOFF 351 +#define STRINGID_PKMNRAISEDDEFALITTLE 352 +#define STRINGID_PKMNRAISEDSPDEFALITTLE 353 +#define STRINGID_THEWALLSHATTERED 354 +#define STRINGID_PKMNSXPREVENTSYSZ 355 +#define STRINGID_PKMNSXCUREDITSYPROBLEM 356 +#define STRINGID_ATTACKERCANTESCAPE 357 +#define STRINGID_PKMNOBTAINEDX 358 +#define STRINGID_PKMNOBTAINEDX2 359 +#define STRINGID_PKMNOBTAINEDXYOBTAINEDZ 360 +#define STRINGID_BUTNOEFFECT 361 +#define STRINGID_PKMNSXHADNOEFFECTONY 362 +#define STRINGID_TWOENEMIESDEFEATED 363 +#define STRINGID_TRAINER2LOSETEXT 364 +#define STRINGID_PKMNINCAPABLEOFPOWER 365 +#define STRINGID_GLINTAPPEARSINEYE 366 +#define STRINGID_PKMNGETTINGINTOPOSITION 367 +#define STRINGID_PKMNBEGANGROWLINGDEEPLY 368 +#define STRINGID_PKMNEAGERFORMORE 369 +#define STRINGID_DEFEATEDOPPONENTBYREFEREE 370 +#define STRINGID_LOSTTOOPPONENTBYREFEREE 371 +#define STRINGID_TIEDOPPONENTBYREFEREE 372 +#define STRINGID_QUESTIONFORFEITMATCH 373 +#define STRINGID_FORFEITEDMATCH 374 +#define STRINGID_PKMNTRANSFERREDSOMEONESPC 375 +#define STRINGID_PKMNTRANSFERREDLANETTESPC 376 +#define STRINGID_PKMNBOXSOMEONESPCFULL 377 +#define STRINGID_PKMNBOXLANETTESPCFULL 378 +#define STRINGID_TRAINER1WINTEXT 379 +#define STRINGID_TRAINER2WINTEXT 380 + +#define STRINGID_ENDUREDSTURDY 381 +#define STRINGID_POWERHERB 382 +#define STRINGID_HURTBYITEM 383 +#define STRINGID_PSNBYITEM 384 +#define STRINGID_BRNBYITEM 385 +#define STRINGID_DEFABILITYIN 386 +#define STRINGID_GRAVITYINTENSIFIED 387 +#define STRINGID_TARGETIDENTIFIED 388 +#define STRINGID_TARGETWOKEUP 389 +#define STRINGID_PKMNSTOLEANDATEITEM 390 +#define STRINGID_TAILWINDBLEW 391 +#define STRINGID_PKMNWENTBACK 392 +#define STRINGID_PKMNCANTUSEITEMSANYMORE 393 +#define STRINGID_PKMNFLUNG 394 +#define STRINGID_PKMNPREVENTEDFROMHEALING 395 +#define STRINGID_PKMNSWITCHEDATKANDDEF 396 +#define STRINGID_PKMNSABILITYSUPPRESSED 397 +#define STRINGID_SHIELDEDFROMCRITICALHITS 398 +#define STRINGID_SWITCHEDATKANDSPATK 399 +#define STRINGID_SWITCHEDDEFANDSPDEF 400 +#define STRINGID_PKMNACQUIREDABILITY 401 +#define STRINGID_POISONSPIKESSCATTERED 402 +#define STRINGID_PKMNSWITCHEDSTATCHANGES 403 +#define STRINGID_PKMNSURROUNDEDWITHVEILOFWATER 404 +#define STRINGID_PKMNLEVITATEDONELECTROMAGNETISM 405 +#define STRINGID_PKMNTWISTEDDIMENSIONS 406 +#define STRINGID_POINTEDSTONESFLOAT 407 +#define STRINGID_CLOAKEDINMYSTICALMOONLIGHT 408 +#define STRINGID_TRAPPERBYSWIRLINGMAGMA 409 +#define STRINGID_VANISHEDINSTANTLY 410 +#define STRINGID_PROTECTEDTEAM 411 +#define STRINGID_SHAREDITSGUARD 412 +#define STRINGID_SHAREDITSPOWER 413 +#define STRINGID_SWAPSDEFANDSPDEFOFALLPOKEMON 414 +#define STRINGID_BECAMENIMBLE 415 +#define STRINGID_HURLEDINTOTHEAIR 416 +#define STRINGID_HELDITEMSLOSEEFFECTS 417 +#define STRINGID_FELLSTRAIGHTDOWN 418 +#define STRINGID_TRANSFORMEDINTOWATERTYPE 419 +#define STRINGID_PKMNACQUIREDSIMPLE 420 +#define STRINGID_EMPTYSTRING5 421 +#define STRINGID_KINDOFFER 422 +#define STRINGID_RESETSTARGETSSTATLEVELS 423 +#define STRINGID_EMPTYSTRING6 424 +#define STRINGID_ALLYSWITCHPOSITION 425 +#define STRINGID_RESTORETARGETSHEALTH 426 +#define STRINGID_TOOKPJMNINTOTHESKY 427 +#define STRINGID_FREEDFROMSKYDROP 428 +#define STRINGID_POSTPONETARGETMOVE 429 +#define STRINGID_REFLECTTARGETSTYPE 430 +#define STRINGID_TRANSFERHELDITEM 431 +#define STRINGID_EMBARGOENDS 432 +#define STRINGID_ELECTROMAGNETISM 433 +#define STRINGID_BUFFERENDS 434 +#define STRINGID_TELEKINESISENDS 435 +#define STRINGID_TAILWINDENDS 436 +#define STRINGID_LUCKYCHANTENDS 437 +#define STRINGID_TRICKROOMENDS 438 +#define STRINGID_WONDERROOMENDS 439 +#define STRINGID_MAGICROOMENDS 440 +#define STRINGID_MUDSPORTENDS 441 +#define STRINGID_WATERSPORTENDS 442 +#define STRINGID_GRAVITYENDS 443 +#define STRINGID_AQUARINGHEAL 444 +#define STRINGID_AURORAVEILENDS 445 +#define STRINGID_ELECTRICTERRAINENDS 446 +#define STRINGID_MISTYTERRAINENDS 447 +#define STRINGID_PSYCHICTERRAINENDS 448 +#define STRINGID_GRASSYTERRAINENDS 449 +#define STRINGID_TARGETABILITYSTATRAISE 450 +#define STRINGID_TARGETSSTATWASMAXEDOUT 451 +#define STRINGID_ATTACKERABILITYSTATRAISE 452 +#define STRINGID_POISONHEALHPUP 453 +#define STRINGID_BADDREAMSDMG 454 +#define STRINGID_MOLDBREAKERENTERS 455 +#define STRINGID_TERAVOLTENTERS 456 +#define STRINGID_TURBOBLAZEENTERS 457 +#define STRINGID_SLOWSTARTENTERS 458 +#define STRINGID_SLOWSTARTEND 459 +#define STRINGID_SOLARPOWERHPDROP 460 +#define STRINGID_AFTERMATHDMG 461 +#define STRINGID_ANTICIPATIONACTIVATES 462 +#define STRINGID_FOREWARNACTIVATES 463 +#define STRINGID_ICEBODYHPGAIN 464 +#define STRINGID_SNOWWARNINGHAIL 465 +#define STRINGID_FRISKACTIVATES 466 +#define STRINGID_UNNERVEENTERS 467 +#define STRINGID_HARVESTBERRY 468 +#define STRINGID_LASTABILITYRAISEDSTAT 469 +#define STRINGID_MAGICBOUNCEACTIVATES 470 +#define STRINGID_PROTEANTYPECHANGE 471 +#define STRINGID_SYMBIOSISITEMPASS 472 +#define STRINGID_STEALTHROCKDMG 473 +#define STRINGID_TOXICSPIKESABSORBED 474 +#define STRINGID_TOXICSPIKESPOISONED 475 +#define STRINGID_STICKYWEBSWITCHIN 476 +#define STRINGID_HEALINGWISHCAMETRUE 477 +#define STRINGID_HEALINGWISHHEALED 478 +#define STRINGID_LUNARDANCECAMETRUE 479 +#define STRINGID_CUSEDBODYDISABLED 480 +#define STRINGID_ATTACKERACQUIREDABILITY 481 +#define STRINGID_TARGETABILITYSTATLOWER 482 +#define STRINGID_TARGETSTATWONTGOHIGHER 483 +#define STRINGID_PKMNMOVEBOUNCEDABILITY 484 +#define STRINGID_IMPOSTERTRANSFORM 485 +#define STRINGID_ASSAULTVESTDOESNTALLOW 486 +#define STRINGID_GRAVITYPREVENTSUSAGE 487 +#define STRINGID_HEALBLOCKPREVENTSUSAGE 488 +#define STRINGID_NOTDONEYET 489 +#define STRINGID_STICKYWEBUSED 490 +#define STRINGID_QUASHSUCCESS 491 +#define STRINGID_PKMNBLEWAWAYTOXICSPIKES 492 +#define STRINGID_PKMNBLEWAWAYSTICKYWEB 493 +#define STRINGID_PKMNBLEWAWAYSTEALTHROCK 494 +#define STRINGID_IONDELUGEON 495 +#define STRINGID_TOPSYTURVYSWITCHEDSTATS 496 +#define STRINGID_TERRAINBECOMESMISTY 497 +#define STRINGID_TERRAINBECOMESGRASSY 498 +#define STRINGID_TERRAINBECOMESELECTRIC 499 +#define STRINGID_TERRAINBECOMESPSYCHIC 500 +#define STRINGID_TARGETELECTRIFIED 501 +#define STRINGID_MEGAEVOREACTING 502 +#define STRINGID_MEGAEVOEVOLVED 503 +#define STRINGID_DRASTICALLY 504 +#define STRINGID_SEVERELY 505 +#define STRINGID_INFESTATION 506 +#define STRINGID_NOEFFECTONTARGET 507 +#define STRINGID_BURSTINGFLAMESHIT 508 +#define STRINGID_BESTOWITEMGIVING 509 +#define STRINGID_THIRDTYPEADDED 510 +#define STRINGID_FELLFORFEINT 511 +#define STRINGID_POKEMONCANNOTUSEMOVE 512 +#define STRINGID_COVEREDINPOWDER 513 +#define STRINGID_POWDEREXPLODES 514 +#define STRINGID_BELCHCANTSELECT 515 +#define STRINGID_SPECTRALTHIEFSTEAL 516 +#define STRINGID_GRAVITYGROUNDING 517 +#define STRINGID_MISTYTERRAINPREVENTS 518 +#define STRINGID_GRASSYTERRAINHEALS 519 +#define STRINGID_ELECTRICTERRAINPREVENTS 520 +#define STRINGID_PSYCHICTERRAINPREVENTS 521 +#define STRINGID_SAFETYGOOGLESPROTECTED 522 +#define STRINGID_FLOWERVEILPROTECTED 523 +#define STRINGID_SWEETVEILPROTECTED 524 +#define STRINGID_AROMAVEILPROTECTED 525 +#define STRINGID_CELEBRATEMESSAGE 526 +#define STRINGID_USEDINSTRUCTEDMOVE 527 +#define STRINGID_THROATCHOPENDS 528 +#define STRINGID_PKMNCANTUSEMOVETHROATCHOP 529 +#define STRINGID_LASERFOCUS 530 +#define STRINGID_GEMACTIVATES 531 +#define STRINGID_BERRYDMGREDUCES 532 +#define STRINGID_TARGETATEITEM 533 +#define STRINGID_AIRBALLOONFLOAT 534 +#define STRINGID_AIRBALLOONPOP 535 +#define STRINGID_INCINERATEBURN 536 +#define STRINGID_BUGBITE 537 +#define STRINGID_ILLUSIONWOREOFF 538 +#define STRINGID_ATTACKERCUREDTARGETSTATUS 539 +#define STRINGID_ATTACKERLOSTFIRETYPE 540 +#define STRINGID_HEALERCURE 541 +#define STRINGID_SCRIPTINGABILITYSTATRAISE 542 +#define STRINGID_RECEIVERABILITYTAKEOVER 543 +#define STRINGID_PKNMABSORBINGPOWER 544 +#define STRINGID_NOONEWILLBEABLETORUNAWAY 545 +#define STRINGID_DESTINYKNOTACTIVATES 546 +#define STRINGID_CLOAKEDINAFREEZINGLIGHT 547 +#define STRINGID_STATWASNOTLOWERED 548 +#define STRINGID_FERVENTWISHREACHED 549 +#define STRINGID_AIRLOCKACTIVATES 550 +#define STRINGID_PRESSUREENTERS 551 +#define STRINGID_DARKAURAENTERS 552 +#define STRINGID_FAIRYAURAENTERS 553 +#define STRINGID_AURABREAKENTERS 554 +#define STRINGID_COMATOSEENTERS 555 +#define STRINGID_SCREENCLEANERENTERS 556 +#define STRINGID_FETCHEDPOKEBALL 557 +#define STRINGID_BATTLERABILITYRAISEDSTAT 558 +#define STRINGID_ASANDSTORMKICKEDUP 559 +#define STRINGID_PKMNSWILLPERISHIN3TURNS 560 +#define STRINGID_ABILITYRAISEDSTATDRASTICALLY 561 +#define STRINGID_AURAFLAREDTOLIFE 562 +#define STRINGID_ASONEENTERS 563 +#define STRINGID_CURIOUSMEDICINEENTERS 564 +#define STRINGID_CANACTFASTERTHANKSTO 565 +#define STRINGID_MICLEBERRYACTIVATES 566 +#define STRINGID_PKMNSHOOKOFFTHETAUNT 567 +#define STRINGID_PKMNGOTOVERITSINFATUATION 568 +#define STRINGID_EXTREMELYHARSHSUNLIGHT 569 +#define STRINGID_EXTREMESUNLIGHTFADED 570 +#define STRINGID_MOVEEVAPORATEDINTHEHARSHSUNLIGHT 571 +#define STRINGID_EXTREMELYHARSHSUNLIGHTWASNOTLESSENED 572 +#define STRINGID_HEAVYRAIN 573 +#define STRINGID_HEAVYRAINLIFTED 574 +#define STRINGID_MOVEFIZZLEDOUTINTHEHEAVYRAIN 575 +#define STRINGID_NORELIEFROMHEAVYRAIN 576 +#define STRINGID_MYSTERIOUSAIRCURRENT 577 +#define STRINGID_STRONGWINDSDISSIPATED 578 +#define STRINGID_MYSTERIOUSAIRCURRENTBLOWSON 579 +#define STRINGID_ATTACKWEAKENEDBSTRONGWINDS 580 -#define STRINGID_ENDUREDSTURDY 381 -#define STRINGID_POWERHERB 382 -#define STRINGID_HURTBYITEM 383 -#define STRINGID_PSNBYITEM 384 -#define STRINGID_BRNBYITEM 385 -#define STRINGID_DEFABILITYIN 386 -#define STRINGID_GRAVITYINTENSIFIED 387 -#define STRINGID_TARGETIDENTIFIED 388 -#define STRINGID_TARGETWOKEUP 389 -#define STRINGID_PKMNSTOLEANDATEITEM 390 -#define STRINGID_TAILWINDBLEW 391 -#define STRINGID_PKMNWENTBACK 392 -#define STRINGID_PKMNCANTUSEITEMSANYMORE 393 -#define STRINGID_PKMNFLUNG 394 -#define STRINGID_PKMNPREVENTEDFROMHEALING 395 -#define STRINGID_PKMNSWITCHEDATKANDDEF 396 -#define STRINGID_PKMNSABILITYSUPPRESSED 397 -#define STRINGID_SHIELDEDFROMCRITICALHITS 398 -#define STRINGID_SWITCHEDATKANDSPATK 399 -#define STRINGID_SWITCHEDDEFANDSPDEF 400 -#define STRINGID_PKMNACQUIREDABILITY 401 -#define STRINGID_POISONSPIKESSCATTERED 402 -#define STRINGID_PKMNSWITCHEDSTATCHANGES 403 -#define STRINGID_PKMNSURROUNDEDWITHVEILOFWATER 404 -#define STRINGID_PKMNLEVITATEDONELECTROMAGNETISM 405 -#define STRINGID_PKMNTWISTEDDIMENSIONS 406 -#define STRINGID_POINTEDSTONESFLOAT 407 -#define STRINGID_CLOAKEDINMYSTICALMOONLIGHT 408 -#define STRINGID_TRAPPERBYSWIRLINGMAGMA 409 -#define STRINGID_VANISHEDINSTANTLY 410 -#define STRINGID_PROTECTEDTEAM 411 -#define STRINGID_SHAREDITSGUARD 412 -#define STRINGID_SHAREDITSPOWER 413 -#define STRINGID_SWAPSDEFANDSPDEFOFALLPOKEMON 414 -#define STRINGID_BECAMENIMBLE 415 -#define STRINGID_HURLEDINTOTHEAIR 416 -#define STRINGID_HELDITEMSLOSEEFFECTS 417 -#define STRINGID_FELLSTRAIGHTDOWN 418 -#define STRINGID_TRANSFORMEDINTOWATERTYPE 419 -#define STRINGID_PKMNACQUIREDSIMPLE 420 -#define STRINGID_EMPTYSTRING5 421 -#define STRINGID_KINDOFFER 422 -#define STRINGID_RESETSTARGETSSTATLEVELS 423 -#define STRINGID_EMPTYSTRING6 424 -#define STRINGID_ALLYSWITCHPOSITION 425 -#define STRINGID_RESTORETARGETSHEALTH 426 -#define STRINGID_TOOKPJMNINTOTHESKY 427 -#define STRINGID_FREEDFROMSKYDROP 428 -#define STRINGID_POSTPONETARGETMOVE 429 -#define STRINGID_REFLECTTARGETSTYPE 430 -#define STRINGID_TRANSFERHELDITEM 431 -#define STRINGID_EMBARGOENDS 432 -#define STRINGID_ELECTROMAGNETISM 433 -#define STRINGID_BUFFERENDS 434 -#define STRINGID_TELEKINESISENDS 435 -#define STRINGID_TAILWINDENDS 436 -#define STRINGID_LUCKYCHANTENDS 437 -#define STRINGID_TRICKROOMENDS 438 -#define STRINGID_WONDERROOMENDS 439 -#define STRINGID_MAGICROOMENDS 440 -#define STRINGID_MUDSPORTENDS 441 -#define STRINGID_WATERSPORTENDS 442 -#define STRINGID_GRAVITYENDS 443 -#define STRINGID_AQUARINGHEAL 444 -#define STRINGID_AURORAVEILENDS 445 -#define STRINGID_ELECTRICTERRAINENDS 446 -#define STRINGID_MISTYTERRAINENDS 447 -#define STRINGID_PSYCHICTERRAINENDS 448 -#define STRINGID_GRASSYTERRAINENDS 449 -#define STRINGID_TARGETABILITYSTATRAISE 450 -#define STRINGID_TARGETSSTATWASMAXEDOUT 451 -#define STRINGID_ATTACKERABILITYSTATRAISE 452 -#define STRINGID_POISONHEALHPUP 453 -#define STRINGID_BADDREAMSDMG 454 -#define STRINGID_MOLDBREAKERENTERS 455 -#define STRINGID_TERAVOLTENTERS 456 -#define STRINGID_TURBOBLAZEENTERS 457 -#define STRINGID_SLOWSTARTENTERS 458 -#define STRINGID_SLOWSTARTEND 459 -#define STRINGID_SOLARPOWERHPDROP 460 -#define STRINGID_AFTERMATHDMG 461 -#define STRINGID_ANTICIPATIONACTIVATES 462 -#define STRINGID_FOREWARNACTIVATES 463 -#define STRINGID_ICEBODYHPGAIN 464 -#define STRINGID_SNOWWARNINGHAIL 465 -#define STRINGID_FRISKACTIVATES 466 -#define STRINGID_UNNERVEENTERS 467 -#define STRINGID_HARVESTBERRY 468 -#define STRINGID_LASTABILITYRAISEDSTAT 469 -#define STRINGID_MAGICBOUNCEACTIVATES 470 -#define STRINGID_PROTEANTYPECHANGE 471 -#define STRINGID_SYMBIOSISITEMPASS 472 -#define STRINGID_STEALTHROCKDMG 473 -#define STRINGID_TOXICSPIKESABSORBED 474 -#define STRINGID_TOXICSPIKESPOISONED 475 -#define STRINGID_STICKYWEBSWITCHIN 476 -#define STRINGID_HEALINGWISHCAMETRUE 477 -#define STRINGID_HEALINGWISHHEALED 478 -#define STRINGID_LUNARDANCECAMETRUE 479 -#define STRINGID_CUSEDBODYDISABLED 480 -#define STRINGID_ATTACKERACQUIREDABILITY 481 -#define STRINGID_TARGETABILITYSTATLOWER 482 -#define STRINGID_TARGETSTATWONTGOHIGHER 483 -#define STRINGID_PKMNMOVEBOUNCEDABILITY 484 -#define STRINGID_IMPOSTERTRANSFORM 485 -#define STRINGID_ASSAULTVESTDOESNTALLOW 486 -#define STRINGID_GRAVITYPREVENTSUSAGE 487 -#define STRINGID_HEALBLOCKPREVENTSUSAGE 488 -#define STRINGID_NOTDONEYET 489 -#define STRINGID_STICKYWEBUSED 490 -#define STRINGID_QUASHSUCCESS 491 -#define STRINGID_PKMNBLEWAWAYTOXICSPIKES 492 -#define STRINGID_PKMNBLEWAWAYSTICKYWEB 493 -#define STRINGID_PKMNBLEWAWAYSTEALTHROCK 494 -#define STRINGID_IONDELUGEON 495 -#define STRINGID_TOPSYTURVYSWITCHEDSTATS 496 -#define STRINGID_TERRAINBECOMESMISTY 497 -#define STRINGID_TERRAINBECOMESGRASSY 498 -#define STRINGID_TERRAINBECOMESELECTRIC 499 -#define STRINGID_TERRAINBECOMESPSYCHIC 500 -#define STRINGID_TARGETELECTRIFIED 501 -#define STRINGID_MEGAEVOREACTING 502 -#define STRINGID_MEGAEVOEVOLVED 503 -#define STRINGID_DRASTICALLY 504 -#define STRINGID_SEVERELY 505 -#define STRINGID_INFESTATION 506 -#define STRINGID_NOEFFECTONTARGET 507 -#define STRINGID_BURSTINGFLAMESHIT 508 -#define STRINGID_BESTOWITEMGIVING 509 -#define STRINGID_THIRDTYPEADDED 510 -#define STRINGID_FELLFORFEINT 511 -#define STRINGID_POKEMONCANNOTUSEMOVE 512 -#define STRINGID_COVEREDINPOWDER 513 -#define STRINGID_POWDEREXPLODES 514 -#define STRINGID_BELCHCANTSELECT 515 -#define STRINGID_SPECTRALTHIEFSTEAL 516 -#define STRINGID_GRAVITYGROUNDING 517 -#define STRINGID_MISTYTERRAINPREVENTS 518 -#define STRINGID_GRASSYTERRAINHEALS 519 -#define STRINGID_ELECTRICTERRAINPREVENTS 520 -#define STRINGID_PSYCHICTERRAINPREVENTS 521 -#define STRINGID_SAFETYGOOGLESPROTECTED 522 -#define STRINGID_FLOWERVEILPROTECTED 523 -#define STRINGID_SWEETVEILPROTECTED 524 -#define STRINGID_AROMAVEILPROTECTED 525 -#define STRINGID_CELEBRATEMESSAGE 526 -#define STRINGID_USEDINSTRUCTEDMOVE 527 -#define STRINGID_THROATCHOPENDS 528 -#define STRINGID_PKMNCANTUSEMOVETHROATCHOP 529 -#define STRINGID_LASERFOCUS 530 -#define STRINGID_GEMACTIVATES 531 -#define STRINGID_BERRYDMGREDUCES 532 -#define STRINGID_TARGETATEITEM 533 -#define STRINGID_AIRBALLOONFLOAT 534 -#define STRINGID_AIRBALLOONPOP 535 -#define STRINGID_INCINERATEBURN 536 -#define STRINGID_BUGBITE 537 -#define STRINGID_ILLUSIONWOREOFF 538 -#define STRINGID_ATTACKERCUREDTARGETSTATUS 539 -#define STRINGID_ATTACKERLOSTFIRETYPE 540 -#define STRINGID_HEALERCURE 541 -#define STRINGID_SCRIPTINGABILITYSTATRAISE 542 -#define STRINGID_RECEIVERABILITYTAKEOVER 543 -#define STRINGID_PKNMABSORBINGPOWER 544 -#define STRINGID_NOONEWILLBEABLETORUNAWAY 545 -#define STRINGID_DESTINYKNOTACTIVATES 546 -#define STRINGID_CLOAKEDINAFREEZINGLIGHT 547 -#define STRINGID_STATWASNOTLOWERED 548 -#define STRINGID_FERVENTWISHREACHED 549 -#define STRINGID_AIRLOCKACTIVATES 550 -#define STRINGID_PRESSUREENTERS 551 -#define STRINGID_DARKAURAENTERS 552 -#define STRINGID_FAIRYAURAENTERS 553 -#define STRINGID_AURABREAKENTERS 554 -#define STRINGID_COMATOSEENTERS 555 -#define STRINGID_SCREENCLEANERENTERS 556 -#define STRINGID_FETCHEDPOKEBALL 557 -#define STRINGID_BATTLERABILITYRAISEDSTAT 558 -#define STRINGID_ASANDSTORMKICKEDUP 559 -#define STRINGID_PKMNSWILLPERISHIN3TURNS 560 -#define STRINGID_ABILITYRAISEDSTATDRASTICALLY 561 -#define STRINGID_AURAFLAREDTOLIFE 562 -#define STRINGID_ASONEENTERS 563 -#define STRINGID_CURIOUSMEDICINEENTERS 564 -#define STRINGID_CANACTFASTERTHANKSTO 565 -#define STRINGID_MICLEBERRYACTIVATES 566 -#define STRINGID_PKMNSHOOKOFFTHETAUNT 567 -#define STRINGID_PKMNGOTOVERITSINFATUATION 568 - -#define BATTLESTRINGS_COUNT 569 +#define BATTLESTRINGS_COUNT 581 // The below IDs are all indexes into battle message tables, // used to determine which of a set of messages to print. diff --git a/src/battle_message.c b/src/battle_message.c index 8a00cbf2b..fdc1d8a1e 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -696,9 +696,33 @@ static const u8 sText_CanActFaster[] = _("{B_ATK_NAME_WITH_PREFIX} can act faste static const u8 sText_MicleBerryActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} boosted the accuracy of its\nnext move using {B_LAST_ITEM}!"); static const u8 sText_PkmnShookOffTheTaunt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} shook off\nthe taunt!"); static const u8 sText_PkmnGotOverItsInfatuation[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} got over\nits infatuation!"); +static const u8 sText_ExtremelyHarshSunlight[] = _("The sunlight turned\nextremely harsh!"); +static const u8 sText_ExtremeSunlightFaded[] = _("The extreme sunlight faded.{PAUSE 64}"); +static const u8 sText_MoveEvaporatedInTheHarshSunlight[] = _("The Water-type attack evaporated\nin the harsh sunlight!"); +static const u8 sText_ExtremelyHarshSunlightWasNotLessened[] = _("The extremely harsh sunlight\nwas not lessened at all!"); +static const u8 sText_HeavyRain[] = _("A heavy rain began to fall!"); +static const u8 sText_HeavyRainLifted[] = _("The heavy rain has lifted!{PAUSE 64}"); +static const u8 sText_MoveFizzledOutInTheHeavyRain[] = _("The Fire-type attack fizzled out\nin the heavy rain!"); +static const u8 sText_NoReliefFromHeavyRain[] = _("There is no relief from\nthis heavy rain!"); +static const u8 sText_MysteriousAirCurrent[] = _("A mysterious air current is\nprotecting Flying-type Pokémon!"); +static const u8 sText_StrongWindsDissipated[] = _("The mysterious strong winds\nhave dissipated!{PAUSE 64}"); +static const u8 sText_MysteriousAirCurrentBlowsOn[] = _("The mysterious air current\nblows on regardless!"); +static const u8 sText_AttackWeakenedByStrongWinds[] = _("The mysterious strong winds\nweakened the attack!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_ATTACKWEAKENEDBSTRONGWINDS - 12] = sText_AttackWeakenedByStrongWinds, + [STRINGID_MYSTERIOUSAIRCURRENTBLOWSON - 12] = sText_MysteriousAirCurrentBlowsOn, + [STRINGID_STRONGWINDSDISSIPATED - 12] = sText_StrongWindsDissipated, + [STRINGID_MYSTERIOUSAIRCURRENT - 12] = sText_MysteriousAirCurrent, + [STRINGID_NORELIEFROMHEAVYRAIN - 12] = sText_NoReliefFromHeavyRain, + [STRINGID_MOVEFIZZLEDOUTINTHEHEAVYRAIN - 12] = sText_MoveFizzledOutInTheHeavyRain, + [STRINGID_HEAVYRAINLIFTED - 12] = sText_HeavyRainLifted, + [STRINGID_HEAVYRAIN - 12] = sText_HeavyRain, + [STRINGID_EXTREMELYHARSHSUNLIGHTWASNOTLESSENED - 12] = sText_ExtremelyHarshSunlightWasNotLessened, + [STRINGID_MOVEEVAPORATEDINTHEHARSHSUNLIGHT - 12] = sText_MoveEvaporatedInTheHarshSunlight, + [STRINGID_EXTREMESUNLIGHTFADED - 12] = sText_ExtremeSunlightFaded, + [STRINGID_EXTREMELYHARSHSUNLIGHT - 12] = sText_ExtremelyHarshSunlight, [STRINGID_PKMNGOTOVERITSINFATUATION - 12] = sText_PkmnGotOverItsInfatuation, [STRINGID_PKMNSHOOKOFFTHETAUNT - 12] = sText_PkmnShookOffTheTaunt, [STRINGID_MICLEBERRYACTIVATES - 12] = sText_MicleBerryActivates, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 21bc7945b..85cd16066 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1323,6 +1323,30 @@ static void Cmd_attackcanceler(void) { s32 i, moveType; + GET_MOVE_TYPE(gCurrentMove, moveType); + if (moveType == TYPE_FIRE + && (gBattleWeather & WEATHER_RAIN_PRIMAL) + && !IsAbilityOnField(ABILITY_AIR_LOCK) + && !IsAbilityOnField(ABILITY_CLOUD_NINE) + && gBattleMoves[gCurrentMove].power >= 1) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_PrimordialSeaFizzlesOutFireTypeMoves; + return; + } + + GET_MOVE_TYPE(gCurrentMove, moveType); + if (moveType == TYPE_WATER + && (gBattleWeather & WEATHER_SUN_PRIMAL) + && !IsAbilityOnField(ABILITY_AIR_LOCK) + && !IsAbilityOnField(ABILITY_CLOUD_NINE) + && gBattleMoves[gCurrentMove].power >= 1) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_DesolateLandEvaporatesWaterTypeMoves; + return; + } + if (gBattleOutcome != 0) { gCurrentActionFuncId = B_ACTION_FINISHED; @@ -8422,6 +8446,26 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; // exit if loop failed (failsafe) } return; + case VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER: + if (gBattleWeather & WEATHER_SUN_PRIMAL) + { + gBattleWeather &= ~WEATHER_SUN_PRIMAL; + PrepareStringBattle(STRINGID_EXTREMESUNLIGHTFADED, gActiveBattler); + gBattleCommunication[MSG_DISPLAY] = 1; + } + else if (gBattleWeather & WEATHER_RAIN_PRIMAL) + { + gBattleWeather &= ~WEATHER_RAIN_PRIMAL; + PrepareStringBattle(STRINGID_HEAVYRAINLIFTED, gActiveBattler); + gBattleCommunication[MSG_DISPLAY] = 1; + } + else if (gBattleWeather & WEATHER_STRONG_WINDS) + { + gBattleWeather &= ~WEATHER_STRONG_WINDS; + PrepareStringBattle(STRINGID_STRONGWINDSDISSIPATED, gActiveBattler); + gBattleCommunication[MSG_DISPLAY] = 1; + } + break; } gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index b85ad9fab..a231f14cd 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2098,9 +2098,10 @@ u8 DoFieldEndTurnEffects(void) } break; case ENDTURN_RAIN: - if (gBattleWeather & WEATHER_RAIN_ANY) + if (gBattleWeather & WEATHER_RAIN_ANY || gBattleWeather & WEATHER_RAIN_PRIMAL) { - if (!(gBattleWeather & WEATHER_RAIN_PERMANENT)) + if (!(gBattleWeather & WEATHER_RAIN_PERMANENT) + && !(gBattleWeather & WEATHER_RAIN_PRIMAL)) { if (--gWishFutureKnock.weatherDuration == 0) { @@ -2148,9 +2149,11 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_SUN: - if (gBattleWeather & WEATHER_SUN_ANY) + if (gBattleWeather & WEATHER_SUN_ANY || gBattleWeather & WEATHER_SUN_PRIMAL) { - if (!(gBattleWeather & WEATHER_SUN_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) + if (!(gBattleWeather & WEATHER_SUN_PERMANENT) + && !(gBattleWeather & WEATHER_SUN_PRIMAL) + && --gWishFutureKnock.weatherDuration == 0) { gBattleWeather &= ~WEATHER_SUN_TEMPORARY; gBattlescriptCurrInstr = BattleScript_SunlightFaded; @@ -3643,9 +3646,12 @@ u8 TryWeatherFormChange(u8 battler) static const u16 sWeatherFlagsInfo[][3] = { [ENUM_WEATHER_RAIN] = {WEATHER_RAIN_TEMPORARY, WEATHER_RAIN_PERMANENT, HOLD_EFFECT_DAMP_ROCK}, + [ENUM_WEATHER_RAIN_PRIMAL] = {WEATHER_RAIN_PRIMAL, WEATHER_RAIN_PRIMAL, HOLD_EFFECT_DAMP_ROCK}, [ENUM_WEATHER_SUN] = {WEATHER_SUN_TEMPORARY, WEATHER_SUN_PERMANENT, HOLD_EFFECT_HEAT_ROCK}, + [ENUM_WEATHER_SUN_PRIMAL] = {WEATHER_SUN_PRIMAL, WEATHER_SUN_PRIMAL, HOLD_EFFECT_HEAT_ROCK}, [ENUM_WEATHER_SANDSTORM] = {WEATHER_SANDSTORM_TEMPORARY, WEATHER_SANDSTORM_PERMANENT, HOLD_EFFECT_SMOOTH_ROCK}, [ENUM_WEATHER_HAIL] = {WEATHER_HAIL_TEMPORARY, WEATHER_HAIL_PERMANENT, HOLD_EFFECT_ICY_ROCK}, + [ENUM_WEATHER_STRONG_WINDS] = {WEATHER_STRONG_WINDS, WEATHER_STRONG_WINDS, HOLD_EFFECT_NONE}, }; bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility) @@ -3656,6 +3662,13 @@ bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility) gBattleWeather = (sWeatherFlagsInfo[weatherEnumId][0] | sWeatherFlagsInfo[weatherEnumId][1]); return TRUE; } + else if (gBattleWeather & WEATHER_PRIMAL_ANY + && GetBattlerAbility(battler) != ABILITY_DESOLATE_LAND + && GetBattlerAbility(battler) != ABILITY_PRIMORDIAL_SEA + && GetBattlerAbility(battler) != ABILITY_DELTA_STREAM) + { + return FALSE; + } else if (!(gBattleWeather & (sWeatherFlagsInfo[weatherEnumId][0] | sWeatherFlagsInfo[weatherEnumId][1]))) { gBattleWeather = (sWeatherFlagsInfo[weatherEnumId][0]); @@ -4233,6 +4246,27 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move effect++; } break; + case ABILITY_DESOLATE_LAND: + if (TryChangeBattleWeather(battler, ENUM_WEATHER_SUN_PRIMAL, TRUE)) + { + BattleScriptPushCursorAndCallback(BattleScript_DesolateLandActivates); + effect++; + } + break; + case ABILITY_PRIMORDIAL_SEA: + if (TryChangeBattleWeather(battler, ENUM_WEATHER_RAIN_PRIMAL, TRUE)) + { + BattleScriptPushCursorAndCallback(BattleScript_PrimordialSeaActivates); + effect++; + } + break; + case ABILITY_DELTA_STREAM: + if (TryChangeBattleWeather(battler, ENUM_WEATHER_STRONG_WINDS, TRUE)) + { + BattleScriptPushCursorAndCallback(BattleScript_DeltaStreamActivates); + effect++; + } + break; } break; case ABILITYEFFECT_ENDTURN: // 1 @@ -8105,6 +8139,18 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat modifier = UQ_4_12(1.0); } + // WEATHER_STRONG_WINDS weakens super effective moves against flying type mons + if (gBattleWeather & WEATHER_STRONG_WINDS + && modifier == UQ_4_12(2.0) + && (IS_BATTLER_OF_TYPE(battlerDef, TYPE_FLYING)) + && !IsAbilityOnField(ABILITY_AIR_LOCK) + && !IsAbilityOnField(ABILITY_CLOUD_NINE)) + { + modifier = UQ_4_12(1.0); + gBattlescriptCurrInstr = BattleScript_AttackWeakenedByStrongWinds; + gBattlescriptCurrInstr++; + } + if (GetBattlerAbility(battlerDef) == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0) && gBattleMoves[move].power) { modifier = UQ_4_12(0.0); From 216d8f0608af0b44f472437c1a6ee095955af1b4 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 27 Aug 2021 18:28:34 -0300 Subject: [PATCH 019/193] Solved game freezing issue My approach with BattleScript_AttackWeakenedByStrongWinds was incorrect and thus caused the game to freeze when Battle Scene is enabled, so I resorted to printing the string directly, which I don't like because there is no pauses between `attackstring` and `STRINGID_ATTACKWEAKENEDBSTRONGWINDS`. --- data/battle_scripts_1.s | 9 --------- include/battle_scripts.h | 1 - src/battle_util.c | 2 +- 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 63c300a74..f46bffcf3 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6936,15 +6936,6 @@ BattleScript_DeltaStreamActivates:: waitmessage B_WAIT_TIME_LONG end3 -BattleScript_AttackWeakenedByStrongWinds:: - pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp - printstring STRINGID_ATTACKWEAKENEDBSTRONGWINDS - waitmessage B_WAIT_TIME_LONG - printstring STRINGID_EMPTYSTRING3 - waitmessage 1 - goto BattleScript_HitFromAtkAnimation - BattleScript_SnowWarningActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp diff --git a/include/battle_scripts.h b/include/battle_scripts.h index f3470776a..28118b21c 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -375,6 +375,5 @@ extern const u8 BattleScript_PrimordialSeaActivates[]; extern const u8 BattleScript_PrimordialSeaFizzlesOutFireTypeMoves[]; extern const u8 BattleScript_DeltaStreamActivates[]; extern const u8 BattleScript_MysteriousAirCurrentBlowsOn[]; -extern const u8 BattleScript_AttackWeakenedByStrongWinds[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/src/battle_util.c b/src/battle_util.c index a231f14cd..e258daac5 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8147,7 +8147,7 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat && !IsAbilityOnField(ABILITY_CLOUD_NINE)) { modifier = UQ_4_12(1.0); - gBattlescriptCurrInstr = BattleScript_AttackWeakenedByStrongWinds; + PrepareStringBattle(STRINGID_ATTACKWEAKENEDBSTRONGWINDS, battlerDef); gBattlescriptCurrInstr++; } From c0c6821f6299e3a143291ff5977d9f397c41919b Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 30 Aug 2021 19:48:59 -0300 Subject: [PATCH 020/193] Made AI_CheckBadMove take the primal weathers into account Credits to Syreldar. Also took the chance and removed trailing spaces from the file. --- src/battle_ai_main.c | 278 +++++++++++++++++++++++++------------------ 1 file changed, 163 insertions(+), 115 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 07f5e68fc..f6ed7335d 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -249,7 +249,7 @@ static u8 ChooseMoveOrAction_Singles(void) RecordLastUsedMoveByTarget(); GetAiLogicData(sBattler_AI, gBattlerTarget); - + while (flags != 0) { if (flags & 1) @@ -364,10 +364,10 @@ static u8 ChooseMoveOrAction_Doubles(void) BattleAI_SetupAIData(gBattleStruct->palaceFlags >> 4); else BattleAI_SetupAIData(0xF); - + gBattlerTarget = i; GetAiLogicData(sBattler_AI, gBattlerTarget); - + if ((i & BIT_SIDE) != (sBattler_AI & BIT_SIDE)) RecordLastUsedMoveByTarget(); @@ -510,19 +510,21 @@ static void BattleAI_DoAIProcessing(void) static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) { // move data + s32 moveType; u8 atkPriority = GetMovePriority(battlerAtk, move); u16 moveEffect = gBattleMoves[move].effect; - u8 moveType = gBattleMoves[move].type; u8 moveTarget = gBattleMoves[move].target; u16 accuracy = AI_GetMoveAccuracy(battlerAtk, battlerDef, AI_DATA->atkAbility, AI_DATA->defAbility, AI_DATA->atkHoldEffect, AI_DATA->defHoldEffect, move); u8 effectiveness = AI_GetMoveEffectiveness(move, battlerAtk, battlerDef); bool32 isDoubleBattle = IsValidDoubleBattle(battlerAtk); u32 i; u16 predictedMove = gLastMoves[battlerDef]; // TODO better move prediction - + if (IsTargetingPartner(battlerAtk, battlerDef)) return score; - + + GET_MOVE_TYPE(move, move); + // check non-user target if (!(gBattleMoves[move].target & MOVE_TARGET_USER)) { @@ -532,7 +534,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) { RETURN_SCORE_MINUS(20); } - + // check ground immunities if (moveType == TYPE_GROUND && !IsBattlerGrounded(battlerDef) @@ -544,11 +546,11 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) { RETURN_SCORE_MINUS(20); } - + // check off screen if (IsSemiInvulnerable(battlerDef, move) && moveEffect != EFFECT_SEMI_INVULNERABLE && GetWhoStrikesFirst(battlerAtk, battlerDef, TRUE) != 1) RETURN_SCORE_MINUS(20); // if target off screen and we go first, don't use move - + // check if negates type switch (effectiveness) { @@ -559,7 +561,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) RETURN_SCORE_MINUS(10); break; } - + // target ability checks if (!DoesBattlerIgnoreAbilityChecks(AI_DATA->atkAbility, move)) { @@ -674,7 +676,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) RETURN_SCORE_MINUS(10); break; } // def ability checks - + // target partner ability checks & not attacking partner if (isDoubleBattle) { @@ -712,35 +714,35 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) } } // def partner ability checks } // ignore def ability check - + // gen7+ dark type mons immune to priority->elevated moves from prankster #if B_PRANKSTER >= GEN_7 if (AI_DATA->atkAbility == ABILITY_PRANKSTER && IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK) && IS_MOVE_STATUS(move) && !(moveTarget & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_USER))) RETURN_SCORE_MINUS(10); #endif - + // terrain & effect checks if (AI_IsTerrainAffected(battlerDef, STATUS_FIELD_ELECTRIC_TERRAIN)) { if (moveEffect == EFFECT_SLEEP || moveEffect == EFFECT_YAWN) RETURN_SCORE_MINUS(20); } - + if (AI_IsTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN)) { if (IsNonVolatileStatusMoveEffect(moveEffect) || IsConfusionMoveEffect(moveEffect)) RETURN_SCORE_MINUS(20); } - + if (AI_IsTerrainAffected(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN) && atkPriority > 0) { RETURN_SCORE_MINUS(20); } } // end check MOVE_TARGET_USER - + // the following checks apply to any target (including user) - + // throat chop check if (gDisableStructs[battlerAtk].throatChopTimer && TestMoveFlags(move, FLAG_SOUND)) return 0; // Can't even select move at all @@ -748,8 +750,35 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) if (gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK && IsHealBlockPreventingMove(battlerAtk, move)) return 0; // Can't even select heal blocked move // primal weather check - //TODO - + if (WEATHER_HAS_EFFECT) + { + if (gBattleWeather & WEATHER_PRIMAL_ANY) + { + switch (move) + { + case MOVE_SUNNY_DAY: + case MOVE_RAIN_DANCE: + case MOVE_HAIL: + case MOVE_SANDSTORM: + RETURN_SCORE_MINUS(30); + } + } + + if (!IS_MOVE_STATUS(move)) + { + if (gBattleWeather & WEATHER_SUN_PRIMAL) + { + if (moveType == TYPE_WATER) + RETURN_SCORE_MINUS(30); + } + else if (gBattleWeather & WEATHER_RAIN_PRIMAL) + { + if (moveType == TYPE_FIRE) + RETURN_SCORE_MINUS(30); + } + } + } + // check move effects switch (moveEffect) { @@ -763,7 +792,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) case EFFECT_EXPLOSION: if (!(AI_THINKING_STRUCT->aiFlags & AI_FLAG_WILL_SUICIDE)) score -= 2; - + if (effectiveness == AI_EFFECTIVENESS_x0) { score -= 10; @@ -813,7 +842,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) if (!BattlerStatCanRise(battlerAtk, AI_DATA->atkAbility, STAT_SPATK) || !HasMoveWithSplit(battlerAtk, SPLIT_SPECIAL)) score -= 10; break; - case EFFECT_SPECIAL_DEFENSE_UP: + case EFFECT_SPECIAL_DEFENSE_UP: case EFFECT_SPECIAL_DEFENSE_UP_2: if (!BattlerStatCanRise(battlerAtk, AI_DATA->atkAbility, STAT_SPDEF)) score -= 10; @@ -1121,7 +1150,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) case EFFECT_LOW_KICK: // AI_CBM_HighRiskForDamage if (AI_DATA->defAbility == ABILITY_WONDER_GUARD && effectiveness < AI_EFFECTIVENESS_x2) - score -= 10; + score -= 10; break; case EFFECT_COUNTER: case EFFECT_MIRROR_COAT: @@ -1131,7 +1160,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) || DoesSubstituteBlockMove(battlerAtk, AI_DATA->battlerDefPartner, predictedMove)) score -= 10; break; - + case EFFECT_ROAR: if (CountUsablePartyMons(battlerDef) == 0) score -= 10; @@ -1279,7 +1308,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) case EFFECT_SPIKES: if (gSideTimers[GetBattlerSide(battlerDef)].spikesAmount >= 3) score -= 10; - else if (PartnerMoveIsSameNoTarget(AI_DATA->battlerAtkPartner, move, AI_DATA->partnerMove) + else if (PartnerMoveIsSameNoTarget(AI_DATA->battlerAtkPartner, move, AI_DATA->partnerMove) && gSideTimers[GetBattlerSide(battlerDef)].spikesAmount == 2) score -= 10; // only one mon needs to set up the last layer of Spikes break; @@ -1457,7 +1486,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) score -= 10; break; } - + if (B_MENTAL_HERB >= GEN_5 && AI_DATA->defHoldEffect == HOLD_EFFECT_CURE_ATTRACT) score -= 6; break; @@ -1687,7 +1716,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) if (gBattleMons[battlerAtk].hp > (gBattleMons[battlerAtk].hp + gBattleMons[battlerDef].hp) / 2) score -= 10; break; - + case EFFECT_CONVERSION_2: //TODO break; @@ -1747,7 +1776,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) } break; } // move check - + if (decreased) break; if (IsBattlerIncapacitated(battlerDef, AI_DATA->defAbility)) @@ -1789,7 +1818,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) IncreaseAllyProtectionViability(&viability, 0xFF); }*/ } - break; + break; case EFFECT_MIRACLE_EYE: if (gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED) score -= 10; @@ -1837,7 +1866,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) || ((AI_DATA->defAbility == ABILITY_CONTRARY) && !IsTargetingPartner(battlerAtk, battlerDef))) // don't want to raise target stats unless its your partner score -= 10; break; - + case EFFECT_PSYCH_UP: // haze stats check { for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) @@ -2001,7 +2030,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) u32 atkNegativeStages = CountNegativeStatStages(battlerAtk); u32 defPositiveStages = CountPositiveStatStages(battlerDef); u32 defNegativeStages = CountNegativeStatStages(battlerDef); - + if (atkPositiveStages >= defPositiveStages && atkNegativeStages <= defNegativeStages) score -= 10; break; @@ -2399,21 +2428,21 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) score -= 10; break;*/ } // move effect checks - + if (score < 0) score = 0; - + return score; } static s16 AI_TryToFaint(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) -{ +{ if (IsTargetingPartner(battlerAtk, battlerDef)) return score; - + if (gBattleMoves[move].power == 0) return score; // can't make anything faint with no power - + if (CanAttackerFaintTarget(battlerAtk, battlerDef, AI_THINKING_STRUCT->movesetIndex, 0) && gBattleMoves[move].effect != EFFECT_EXPLOSION) { // this move can faint the target @@ -2427,24 +2456,43 @@ static s16 AI_TryToFaint(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) // this move isn't expected to faint the target if (TestMoveFlags(move, FLAG_HIGH_CRIT)) score += 2; // crit makes it more likely to make them faint - + if (GetMoveDamageResult(move) == MOVE_POWER_OTHER) score--; - + switch (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef)) { case AI_EFFECTIVENESS_x4: - score += 4; + if (WEATHER_HAS_EFFECT + && gBattleWeather & WEATHER_STRONG_WINDS + && IS_BATTLER_OF_TYPE(battlerDef, TYPE_FLYING)) + { + if (AI_RandLessThan(176)) //Consider it supereffective instead of hypereffective. + score += 2; + else + score++; + } + else + score += 4; break; case AI_EFFECTIVENESS_x2: - if (AI_RandLessThan(176)) - score += 2; + if (WEATHER_HAS_EFFECT + && gBattleWeather & WEATHER_STRONG_WINDS + && IS_BATTLER_OF_TYPE(battlerDef, TYPE_FLYING)) + { + break; // Don't increase score, consider it neutral. + } else - score++; + { + if (AI_RandLessThan(176)) + score += 2; + else + score++; + } break; } } - + //AI_TryToFaint_CheckIfDanger if (!IsAiFaster(AI_CHECK_FASTER) && CanTargetFaintAi(battlerDef, battlerAtk)) { // AI_TryToFaint_Danger @@ -2453,7 +2501,7 @@ static s16 AI_TryToFaint(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) else score++; } - + return score; } @@ -2472,7 +2520,7 @@ static s16 AI_DoubleBattle(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) bool32 attackerHasBadAbility = (GetAbilityRating(AI_DATA->atkAbility) < 0); bool32 partnerHasBadAbility = (GetAbilityRating(atkPartnerAbility) < 0); u16 predictedMove = gLastMoves[battlerDef]; //for now - + // check what effect partner is using if (AI_DATA->partnerMove != 0) { @@ -2506,8 +2554,8 @@ static s16 AI_DoubleBattle(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) break; } } // check partner move effect - - + + // consider our move effect relative to partner state switch (effect) { @@ -2528,8 +2576,8 @@ static s16 AI_DoubleBattle(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) } break; } // our effect relative to partner - - + + // consider global move effects switch (effect) { @@ -2559,8 +2607,8 @@ static s16 AI_DoubleBattle(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) } break; } // global move effect check - - + + // check specific target if (IsTargetingPartner(battlerAtk, battlerDef)) { @@ -2667,11 +2715,11 @@ static s16 AI_DoubleBattle(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) { RETURN_SCORE_PLUS(1); } - break; + break; } } // ability checks } // move power check - + // attacker move effects specifically targeting partner if (!partnerProtecting) { @@ -2784,12 +2832,12 @@ static s16 AI_DoubleBattle(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) break; } // attacker move effects } // check partner protecting - + score -= 30; // otherwise, don't target partner } else // checking opponent { - // these checks mostly handled in AI_CheckBadMove and AI_CheckViability + // these checks mostly handled in AI_CheckBadMove and AI_CheckViability switch (effect) { case EFFECT_SKILL_SWAP: @@ -2812,10 +2860,10 @@ static s16 AI_DoubleBattle(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) score -= 3; break; } - + // lightning rod, flash fire against enemy handled in AI_CheckBadMove } - + return score; } @@ -2831,11 +2879,11 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) u32 i; u8 atkHpPercent = GetHealthPercentage(battlerAtk); u8 defHpPercent = GetHealthPercentage(battlerDef); - + // Targeting partner, check benefits of doing that instead if (IsTargetingPartner(battlerAtk, battlerDef)) return score; - + // check always hits if (!IS_MOVE_STATUS(move) && gBattleMoves[move].accuracy == 0) { @@ -2844,22 +2892,22 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) if (AI_RandLessThan(100) && (gBattleMons[battlerDef].statStages[STAT_EVASION] >= 8 || gBattleMons[battlerAtk].statStages[STAT_ACC] <= 4)) score++; } - + // check high crit if (TestMoveFlags(move, FLAG_HIGH_CRIT) && effectiveness >= AI_EFFECTIVENESS_x2 && AI_RandLessThan(128)) score++; - + // check already dead if (!IsBattlerIncapacitated(battlerDef, AI_DATA->defAbility) && CanTargetFaintAi(battlerAtk, battlerDef) && GetWhoStrikesFirst(battlerAtk, battlerDef, TRUE) == 1) // opponent should go first { - if (atkPriority > 0) + if (atkPriority > 0) score++; else score--; } - + // check damage if (gBattleMoves[move].power != 0 && GetMoveDamageResult(move) == MOVE_POWER_WEAK) score--; @@ -2867,11 +2915,11 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) // check status move preference if (AI_THINKING_STRUCT->aiFlags & AI_FLAG_PREFER_STATUS_MOVES && IS_MOVE_STATUS(move) && effectiveness != AI_EFFECTIVENESS_x0) score++; - + // check thawing moves if ((gBattleMons[battlerAtk].status1 & STATUS1_FREEZE) && TestMoveFlags(move, FLAG_THAW_USER)) score += (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) ? 20 : 10; - + // check burn if (gBattleMons[battlerAtk].status1 & STATUS1_BURN) { @@ -2890,7 +2938,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) break; } } - + // ability checks switch (AI_DATA->atkAbility) { @@ -2917,12 +2965,12 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) break; } break; - } // ability checks - + } // ability checks + // move effect checks switch (moveEffect) { - + case EFFECT_HIT: break; case EFFECT_SLEEP: @@ -2964,7 +3012,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) break; } } - + if (!AI_RandLessThan(100)) { score--; @@ -3010,7 +3058,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) break; } } - + if (!AI_RandLessThan(100)) { score--; @@ -3033,7 +3081,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) score -= 2; else if (atkHpPercent <= 70) score -= 2; - else + else score++; break; case EFFECT_EVASION_UP: @@ -3163,7 +3211,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) case EFFECT_ATTACK_SPATK_UP: // work up if (GetHealthPercentage(battlerAtk) <= 40 || AI_DATA->atkAbility == ABILITY_CONTRARY) break; - + if (HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL)) IncreaseStatUpScore(battlerAtk, battlerDef, STAT_ATK, &score); else if (HasMoveWithSplit(battlerAtk, SPLIT_SPECIAL)) @@ -3215,7 +3263,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) default: break; } - + if (ShouldRecover(battlerAtk, battlerDef, move, healPercent)) score += 2; } @@ -3443,7 +3491,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) if (newHp > healthBenchmark && ShouldAbsorb(battlerAtk, battlerDef, move, AI_THINKING_STRUCT->simulatedDmg[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex])) score += 2; } - break; + break; case EFFECT_SLEEP_TALK: case EFFECT_SNORE: if (!IsWakeupTurn(battlerAtk) && gBattleMons[battlerAtk].status1 & STATUS1_SLEEP) @@ -3478,13 +3526,13 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) case EFFECT_THIEF: { bool32 canSteal = FALSE; - + #if defined B_TRAINERS_KNOCK_OFF_ITEMS && B_TRAINERS_KNOCK_OFF_ITEMS == TRUE canSteal = TRUE; #endif if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER || GetBattlerSide(battlerAtk) == B_SIDE_PLAYER) canSteal = TRUE; - + if (canSteal && AI_DATA->atkItem == ITEM_NONE && AI_DATA->defItem != ITEM_NONE && CanBattlerGetOrLoseItem(battlerDef, AI_DATA->defItem) @@ -3628,8 +3676,8 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) if (AI_DATA->defAbility == ABILITY_MAGIC_BOUNCE || CountUsablePartyMons(battlerDef) == 0) break; if (gDisableStructs[battlerAtk].isFirstTurn) - score += 2; - //TODO - track entire opponent party data to determine hazard effectiveness + score += 2; + //TODO - track entire opponent party data to determine hazard effectiveness break; case EFFECT_FORESIGHT: if (AI_DATA->atkAbility == ABILITY_SCRAPPY) @@ -3658,7 +3706,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) if (HasMoveEffect(battlerDef, EFFECT_MORNING_SUN) || HasMoveEffect(battlerDef, EFFECT_SYNTHESIS) || HasMoveEffect(battlerDef, EFFECT_MOONLIGHT)) - score += 2; + score += 2; } break; case EFFECT_HAIL: @@ -3667,7 +3715,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) if ((HasMoveEffect(battlerAtk, EFFECT_AURORA_VEIL) || HasMoveEffect(AI_DATA->battlerAtkPartner, EFFECT_AURORA_VEIL)) && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) score += 3; - + score++; if (AI_DATA->atkHoldEffect == HOLD_EFFECT_ICY_ROCK) score++; @@ -3726,7 +3774,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) case EFFECT_SPECTRAL_THIEF: // Want to copy positive stat changes for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) - { + { if (gBattleMons[battlerDef].statStages[i] > gBattleMons[battlerAtk].statStages[i]) { switch (i) @@ -3785,7 +3833,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) if (HasMoveEffect(battlerAtk, EFFECT_SWALLOW) || HasMoveEffect(battlerAtk, EFFECT_SPIT_UP)) score += 2; - + IncreaseStatUpScore(battlerAtk, battlerDef, STAT_DEF, &score); IncreaseStatUpScore(battlerAtk, battlerDef, STAT_SPDEF, &score); break; @@ -3802,20 +3850,20 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) || HasMoveEffect(battlerAtk, EFFECT_PSYCH_UP) || HasMoveEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) score++; - + if (AI_DATA->defAbility == ABILITY_CONTRARY) score += 2; - + IncreaseConfusionScore(battlerAtk, battlerDef, move, &score); break; case EFFECT_FLATTER: if (HasMoveEffect(battlerAtk, EFFECT_PSYCH_UP) || HasMoveEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) score += 2; - + if (AI_DATA->defAbility == ABILITY_CONTRARY) score += 2; - + IncreaseConfusionScore(battlerAtk, battlerDef, move, &score); break; case EFFECT_FURY_CUTTER: @@ -3856,7 +3904,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) score += 3; break; } - + switch (move) { case MOVE_DEFOG: @@ -3872,7 +3920,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) && GetWhoStrikesFirst(battlerAtk, AI_DATA->battlerAtkPartner, TRUE) == 1) // Partner going first break; // Don't use Defog if partner is going to set up hazards } - + // check defog lowering evasion if (ShouldLowerEvasion(battlerAtk, battlerDef, AI_DATA->defAbility)) { @@ -3912,7 +3960,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) case EFFECT_CHARGE: if (HasDamagingMoveOfType(battlerAtk, TYPE_ELECTRIC)) score += 2; - + IncreaseStatUpScore(battlerAtk, battlerDef, STAT_SPDEF, &score); break; case EFFECT_TAUNT: @@ -4081,7 +4129,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) { if (AI_DATA->defAbility != AI_DATA->atkAbility && !(gStatuses3[battlerDef] & STATUS3_GASTRO_ACID)) score += 2; - } + } break; case EFFECT_IMPRISON: if (predictedMove != MOVE_NONE && HasMove(battlerAtk, predictedMove)) @@ -4152,7 +4200,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) case EFFECT_SHELL_SMASH: if (AI_DATA->atkHoldEffect == HOLD_EFFECT_POWER_HERB) score += 3; - + IncreaseStatUpScore(battlerAtk, battlerDef, STAT_SPEED, &score); IncreaseStatUpScore(battlerAtk, battlerDef, STAT_SPATK, &score); IncreaseStatUpScore(battlerAtk, battlerDef, STAT_ATK, &score); @@ -4256,7 +4304,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) if (gStatuses3[battlerAtk] & STATUS3_YAWN && IsBattlerGrounded(battlerAtk)) score += 10; //fallthrough - case EFFECT_GRASSY_TERRAIN: + case EFFECT_GRASSY_TERRAIN: case EFFECT_PSYCHIC_TERRAIN: score += 2; if (AI_DATA->atkHoldEffect == HOLD_EFFECT_TERRAIN_EXTENDER) @@ -4529,7 +4577,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) //case EFFECT_SKY_DROP //break; } // move effect checks - + return score; } @@ -4539,15 +4587,15 @@ static s16 AI_SetupFirstTurn(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) if (IsTargetingPartner(battlerAtk, battlerDef) || gBattleResults.battleTurnCounter != 0) return score; - - if (AI_THINKING_STRUCT->aiFlags & AI_FLAG_SMART_SWITCHING + + if (AI_THINKING_STRUCT->aiFlags & AI_FLAG_SMART_SWITCHING && GetWhoStrikesFirst(battlerAtk, battlerDef, TRUE) == 1 && CanTargetFaintAi(battlerDef, battlerAtk) && GetMovePriority(battlerAtk, move) == 0) { RETURN_SCORE_MINUS(20); // No point in setting up if you will faint. Should just switch if possible.. } - + // check effects to prioritize first turn switch (gBattleMoves[move].effect) { @@ -4636,7 +4684,7 @@ static s16 AI_SetupFirstTurn(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) default: break; } - + return score; } @@ -4645,10 +4693,10 @@ static s16 AI_Risky(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) { if (IsTargetingPartner(battlerAtk, battlerDef)) return score; - + if (TestMoveFlags(move, FLAG_HIGH_CRIT)) score += 2; - + switch (gBattleMoves[move].effect) { case EFFECT_SLEEP: @@ -4675,7 +4723,7 @@ static s16 AI_Risky(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) default: break; } - + return score; } @@ -4684,10 +4732,10 @@ static s16 AI_PreferStrongestMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 sc { if (IsTargetingPartner(battlerAtk, battlerDef)) return score; - + if (GetMoveDamageResult(move) == MOVE_POWER_BEST) score += 2; - + return score; } @@ -4695,14 +4743,14 @@ static s16 AI_PreferStrongestMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 sc static s16 AI_PreferBatonPass(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) { u32 i; - + if (IsTargetingPartner(battlerAtk, battlerDef) || CountUsablePartyMons(battlerAtk) == 0 || GetMoveDamageResult(move) != MOVE_POWER_OTHER || !HasMoveEffect(battlerAtk, EFFECT_BATON_PASS) || IsBattlerTrapped(battlerAtk, TRUE)) return score; - + if (IsStatRaisingEffect(gBattleMoves[move].effect)) { if (gBattleResults.battleTurnCounter == 0) @@ -4710,9 +4758,9 @@ static s16 AI_PreferBatonPass(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) else if (GetHealthPercentage(battlerAtk) < 60) score -= 10; else - score++; + score++; } - + // other specific checks switch (gBattleMoves[move].effect) { @@ -4738,12 +4786,12 @@ static s16 AI_PreferBatonPass(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) if (gStatuses3[battlerAtk] & (STATUS3_ROOTED | STATUS3_AQUA_RING)) score += 2; if (gStatuses3[battlerAtk] & STATUS3_LEECHSEED) - score -= 3; + score -= 3; break; default: break; } - + return score; } @@ -4751,7 +4799,7 @@ static s16 AI_HPAware(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) { u16 effect = gBattleMoves[move].effect; u8 moveType = gBattleMoves[move].type; - + if (IsTargetingPartner(battlerAtk, battlerDef)) { if ((effect == EFFECT_HEAL_PULSE || effect == EFFECT_HIT_ENEMY_HEAL_ALLY) @@ -4761,7 +4809,7 @@ static s16 AI_HPAware(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) if (CanTargetFaintAi(FOE(battlerAtk), AI_DATA->battlerAtkPartner) || (CanTargetFaintAi(BATTLE_PARTNER(FOE(battlerAtk)), AI_DATA->battlerAtkPartner))) score--; - + if (GetHealthPercentage(battlerDef) <= 50) score++; } @@ -4800,7 +4848,7 @@ static s16 AI_HPAware(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) // med hp if (IsStatRaisingEffect(effect) || IsStatLoweringEffect(effect)) score -= 2; - + switch (effect) { case EFFECT_EXPLOSION: @@ -4823,7 +4871,7 @@ static s16 AI_HPAware(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) // low hp if (IsStatRaisingEffect(effect) || IsStatLoweringEffect(effect)) score -= 2; - + // check other discouraged low hp effects switch (effect) { @@ -4856,7 +4904,7 @@ static s16 AI_HPAware(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) } } } - + // consider target HP if (CanAttackerFaintTarget(battlerAtk, battlerDef, AI_THINKING_STRUCT->movesetIndex, 0)) { @@ -4928,7 +4976,7 @@ static s16 AI_HPAware(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) score -= 2; // don't use status moves if target is at low health } } - + return score; } @@ -4947,7 +4995,7 @@ static s16 AI_Roaming(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) { if (IsBattlerTrapped(battlerAtk, FALSE)) return score; - + AI_Flee(); return score; } From e39dc493fc8767621796d41e569917053bd0812c Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 30 Aug 2021 20:33:21 -0300 Subject: [PATCH 021/193] A couple of improvements, courtesy of Syreldar -Optimized the checks for `WEATHER_RAIN_PRIMAL` and `WEATHER_SUN_PRIMAL` in `Cmd_attackcanceler`. -Moved the dmg calculation effect of `WEATHER_STRONG_WINDS` to the `CalcFinalDmg` function. --- src/battle_script_commands.c | 13 +++++-------- src/battle_util.c | 18 ++++++------------ 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 85cd16066..2df8edc91 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1324,23 +1324,21 @@ static void Cmd_attackcanceler(void) s32 i, moveType; GET_MOVE_TYPE(gCurrentMove, moveType); + if (moveType == TYPE_FIRE && (gBattleWeather & WEATHER_RAIN_PRIMAL) - && !IsAbilityOnField(ABILITY_AIR_LOCK) - && !IsAbilityOnField(ABILITY_CLOUD_NINE) - && gBattleMoves[gCurrentMove].power >= 1) + && WEATHER_HAS_EFFECT + && gBattleMoves[gCurrentMove].power) { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_PrimordialSeaFizzlesOutFireTypeMoves; return; } - GET_MOVE_TYPE(gCurrentMove, moveType); if (moveType == TYPE_WATER && (gBattleWeather & WEATHER_SUN_PRIMAL) - && !IsAbilityOnField(ABILITY_AIR_LOCK) - && !IsAbilityOnField(ABILITY_CLOUD_NINE) - && gBattleMoves[gCurrentMove].power >= 1) + && WEATHER_HAS_EFFECT + && gBattleMoves[gCurrentMove].power) { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_DesolateLandEvaporatesWaterTypeMoves; @@ -1366,7 +1364,6 @@ static void Cmd_attackcanceler(void) return; // Check Protean activation. - GET_MOVE_TYPE(gCurrentMove, moveType); if ((GetBattlerAbility(gBattlerAttacker) == ABILITY_PROTEAN || GetBattlerAbility(gBattlerAttacker) == ABILITY_LIBERO) && (gBattleMons[gBattlerAttacker].type1 != moveType || gBattleMons[gBattlerAttacker].type2 != moveType || (gBattleMons[gBattlerAttacker].type3 != moveType && gBattleMons[gBattlerAttacker].type3 != TYPE_MYSTERY)) diff --git a/src/battle_util.c b/src/battle_util.c index e258daac5..96cbfbc87 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7898,6 +7898,12 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move else if (moveType == TYPE_WATER) dmg = ApplyModifier(UQ_4_12(0.5), dmg); } + else if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_STRONG_WINDS) + { + if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_FLYING) + && typeEffectivenessModifier >= UQ_4_12(2.0)) + dmg = ApplyModifier(UQ_4_12(0.5), dmg); + } // check stab if (IS_BATTLER_OF_TYPE(battlerAtk, moveType) && move != MOVE_STRUGGLE) @@ -8139,18 +8145,6 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat modifier = UQ_4_12(1.0); } - // WEATHER_STRONG_WINDS weakens super effective moves against flying type mons - if (gBattleWeather & WEATHER_STRONG_WINDS - && modifier == UQ_4_12(2.0) - && (IS_BATTLER_OF_TYPE(battlerDef, TYPE_FLYING)) - && !IsAbilityOnField(ABILITY_AIR_LOCK) - && !IsAbilityOnField(ABILITY_CLOUD_NINE)) - { - modifier = UQ_4_12(1.0); - PrepareStringBattle(STRINGID_ATTACKWEAKENEDBSTRONGWINDS, battlerDef); - gBattlescriptCurrInstr++; - } - if (GetBattlerAbility(battlerDef) == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0) && gBattleMoves[move].power) { modifier = UQ_4_12(0.0); From 0a3805492577ca978e19cec9222c79debbe78620 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 30 Aug 2021 21:21:07 -0300 Subject: [PATCH 022/193] Print `STRINGID_ATTACKWEAKENEDBSTRONGWINDS` properly --- data/battle_scripts_1.s | 7 +++++++ include/battle_scripts.h | 1 + src/battle_util.c | 8 ++++++++ 3 files changed, 16 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index f46bffcf3..ecfddf762 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6936,6 +6936,13 @@ BattleScript_DeltaStreamActivates:: waitmessage B_WAIT_TIME_LONG end3 +BattleScript_AttackWeakenedByStrongWinds:: + pause B_WAIT_TIME_SHORT + call BattleScript_AbilityPopUp + printstring STRINGID_ATTACKWEAKENEDBSTRONGWINDS + waitmessage B_WAIT_TIME_LONG + end3 + BattleScript_SnowWarningActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 28118b21c..f3470776a 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -375,5 +375,6 @@ extern const u8 BattleScript_PrimordialSeaActivates[]; extern const u8 BattleScript_PrimordialSeaFizzlesOutFireTypeMoves[]; extern const u8 BattleScript_DeltaStreamActivates[]; extern const u8 BattleScript_MysteriousAirCurrentBlowsOn[]; +extern const u8 BattleScript_AttackWeakenedByStrongWinds[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/src/battle_util.c b/src/battle_util.c index 96cbfbc87..0f89def27 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -484,6 +484,14 @@ void HandleAction_UseMove(void) for (i = 0; i < MAX_BATTLERS_COUNT; i++) gBattleStruct->hpBefore[i] = gBattleMons[i].hp; + GET_MOVE_TYPE(gCurrentMove, moveType); + if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_STRONG_WINDS) + { + if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_FLYING) + && CalcTypeEffectivenessMultiplier(gCurrentMove, moveType, gBattlerAttacker, gBattlerTarget, FALSE) >= UQ_4_12(2.0)) + BattleScriptPushCursorAndCallback(BattleScript_AttackWeakenedByStrongWinds); + } + gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } From d0fd883ec71fdefa62e510dc17ac1f3fd580e079 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 30 Aug 2021 21:49:45 -0300 Subject: [PATCH 023/193] Small comment tweak --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 0f89def27..ad4753119 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7891,7 +7891,7 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move && gBattleMoves[move].effect != EFFECT_FACADE && abilityAtk != ABILITY_GUTS) dmg = ApplyModifier(UQ_4_12(0.5), dmg); - // check sunny/rain weather + // check weather if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_RAIN_ANY) { if (moveType == TYPE_FIRE) From 97ce02464b247ce6961062d8154f6e19f4e2b17a Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 30 Aug 2021 22:09:33 -0300 Subject: [PATCH 024/193] Removed small redundancy --- src/battle_util.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index ad4753119..ba651877e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2106,7 +2106,7 @@ u8 DoFieldEndTurnEffects(void) } break; case ENDTURN_RAIN: - if (gBattleWeather & WEATHER_RAIN_ANY || gBattleWeather & WEATHER_RAIN_PRIMAL) + if (gBattleWeather & WEATHER_RAIN_ANY) { if (!(gBattleWeather & WEATHER_RAIN_PERMANENT) && !(gBattleWeather & WEATHER_RAIN_PRIMAL)) @@ -2157,7 +2157,7 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_SUN: - if (gBattleWeather & WEATHER_SUN_ANY || gBattleWeather & WEATHER_SUN_PRIMAL) + if (gBattleWeather & WEATHER_SUN_ANY) { if (!(gBattleWeather & WEATHER_SUN_PERMANENT) && !(gBattleWeather & WEATHER_SUN_PRIMAL) From 69b7910f470b5077d6dbdc7d2d9af99da3290d25 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 30 Aug 2021 23:52:52 -0300 Subject: [PATCH 025/193] Gave an entrance animation to Delta Stream --- data/battle_anim_scripts.s | 25 +++++ data/battle_scripts_1.s | 3 +- .../backgrounds/windstorm_brew.png | Bin 0 -> 1100 bytes include/constants/battle_anim.h | 1 + include/graphics.h | 4 + src/battle_anim_flying.c | 100 +++++++++++++++++- src/graphics.c | 5 +- 7 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 graphics/battle_anims/backgrounds/windstorm_brew.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 33182e878..11fb01724 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -822,6 +822,7 @@ gBattleAnims_General:: .4byte General_SlideOffScreen @ B_ANIM_SLIDE_OFFSCREEN .4byte General_RestoreBg @ B_ANIM_RESTORE_BG .4byte General_TotemFlare @ B_ANIM_TOTEM_FLARE + .4byte General_StrongWinds @ B_ANIM_STRONG_WINDS .align 2 gBattleAnims_Special:: @@ -24397,6 +24398,30 @@ General_TotemFlare:: clearmonbg ANIM_ATTACKER end +General_StrongWinds:: + loadspritegfx ANIM_TAG_FLYING_DIRT + playsewithpan SE_M_GUST, 0 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FLYING_DIRT, 0, 12, 12, RGB(20, 20, 20) + waitforvisualfinish + createvisualtask AnimTask_LoadWindstormBackground, 5, FALSE + delay 16 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 10, 2304, 96, 0 + delay 10 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 90, 2048, 96, 0 + delay 10 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 50, 2560, 96, 0 + delay 10 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 20, 2304, 96, 0 + delay 10 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 70, 1984, 96, 0 + delay 10 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0, 2816, 96, 0 + delay 10 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 60, 2560, 96, 0 + waitforvisualfinish + stopsound + end + RainbowEndureEffect: launchtemplate gBlueEndureEnergySpriteTemplate 0x2 0x4 0x0 0xffe8 0x1a 0x2 delay 0x3 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index ecfddf762..45d654cd6 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6933,7 +6933,8 @@ BattleScript_DeltaStreamActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printstring STRINGID_MYSTERIOUSAIRCURRENT - waitmessage B_WAIT_TIME_LONG + waitstate + playanimation BS_ATTACKER, B_ANIM_STRONG_WINDS, NULL end3 BattleScript_AttackWeakenedByStrongWinds:: diff --git a/graphics/battle_anims/backgrounds/windstorm_brew.png b/graphics/battle_anims/backgrounds/windstorm_brew.png new file mode 100644 index 0000000000000000000000000000000000000000..c36e720cfe8a114139595802c7642a920f67a831 GIT binary patch literal 1100 zcmV-S1he~zP){FYyfYAzTU@aYmx`yA^CJV9g%a^ocNnri4!k6 z51jd*$ay_C)>gCVPg+Mz7RXJh~d#xWFU#c}uf28t;dEleLl`{U{nOB_fRe9TOA zHei#`aO-4>7G&?otBv-n5&1NyvIh#XhvbW^}Yh`}6PyOT`MMsiqIHgt1ZmF)d=A$s7Hw0aM-kUP=7aAR-- zRgmyC6*cQqL;H*xFo;8?u^I(`mZ^cpLW-RHQIZzI+Y30TNrH%*oRiD?Hxo#538%0F6ZX8S{JnW_{AD_7zq_s9g*%`%-HOV4!{^+x z`oBs|&!)p!$_e0Qm+-x?c$sBMc%F~3Jrmu$>eESd@sZivrf{6{$z@y5^k1pETUYE- z>`{`jxTAergLOu?|5$A5)uAHPSV6*UzWMMe^5wQ7u>98G`(pil$x)JIM5+AF8Nx8P zKZr-p$&_PtHchHl2@0&s23$n!TIWY zjZTBlZ8Y6H=*_g1C^<3HPxA3R^6D*VDFW=f7jjD3L&g@*@Pu!J@`Um=o__$VNqB*f SRB7S>00005L{ literal 0 HcmV?d00001 diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index c04bc14f7..4cfcafcd3 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -523,6 +523,7 @@ #define B_ANIM_SLIDE_OFFSCREEN 26 // for Emergency Exit #define B_ANIM_RESTORE_BG 27 // for Terrain Endings #define B_ANIM_TOTEM_FLARE 28 // Totem boosts aura flare +#define B_ANIM_STRONG_WINDS 29 // special animations table (gBattleAnims_Special) #define B_ANIM_LVL_UP 0 diff --git a/include/graphics.h b/include/graphics.h index dc020c401..6139e90cf 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4697,6 +4697,7 @@ extern const u32 gBattleAnimSpritePal_MagnifyingGlass[]; extern const u32 gBattleAnimSpritePal_BrownOrb[]; extern const u32 gBattleAnimSpritePal_MetalSoundWaves[]; extern const u32 gBattleAnimSpritePal_FlyingDirt[]; +extern const u32 gBattleAnimSpritePal_Windstorm[]; extern const u32 gBattleAnimSpritePal_IcicleSpear[]; extern const u32 gBattleAnimSpritePal_Hail[]; extern const u32 gBattleAnimSpritePal_GlowyRedOrb[]; @@ -5199,6 +5200,9 @@ extern const u16 gSlotMachineReelTimePikachu_Pal[]; extern const u32 gBattleAnimBgTilemap_Sandstorm[]; extern const u32 gBattleAnimBgImage_Sandstorm[]; +extern const u32 gBattleAnimBgTilemap_Windstorm[]; +extern const u32 gBattleAnimBgImage_Windstorm[]; + // Pokedex Area Screen extern const u32 gPokedexAreaScreenAreaUnknown_Gfx[]; extern const u16 gPokedexAreaScreenAreaUnknown_Pal[]; diff --git a/src/battle_anim_flying.c b/src/battle_anim_flying.c index 2b93206ca..cce21c84e 100644 --- a/src/battle_anim_flying.c +++ b/src/battle_anim_flying.c @@ -5,6 +5,8 @@ #include "constants/battle_anim.h" #include "constants/rgb.h" #include "random.h" +#include "gpu_regs.h" +#include "graphics.h" extern const struct SpriteTemplate gFlashingHitSplatSpriteTemplate; @@ -30,7 +32,7 @@ static void AnimUnusedFlashingLight_Step(struct Sprite *); static void AnimSkyAttackBird(struct Sprite *); static void AnimSkyAttackBird_Step(struct Sprite *); static void AnimTask_AnimateGustTornadoPalette_Step(u8); - +static void AnimTask_LoadWindstormBackground_Step(u8 taskId); const struct SpriteTemplate gEllipticalGustSpriteTemplate = { @@ -1231,3 +1233,99 @@ static void AnimTask_SetAttackerVisibility(u8 taskId) } DestroyAnimVisualTask(taskId); } + +void AnimTask_LoadWindstormBackground(u8 taskId) +{ + int var0; + struct BattleAnimBgData animBg; + + var0 = 0; + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); + SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0); + + if (!IsContest()) + SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); + + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); + SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); + + GetBattleAnimBg1Data(&animBg); + AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnimBgImage_Windstorm, animBg.tilesOffset); + AnimLoadCompressedBgTilemapHandleContest(&animBg, gBattleAnimBgTilemap_Windstorm, 0); + LoadCompressedPalette(gBattleAnimSpritePal_Windstorm, animBg.paletteId * 16, 32); + + if (gBattleAnimArgs[0] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + var0 = 1; + + gTasks[taskId].data[0] = var0; + gTasks[taskId].func = AnimTask_LoadWindstormBackground_Step; +} + +static void AnimTask_LoadWindstormBackground_Step(u8 taskId) +{ + struct BattleAnimBgData animBg; + + if (gTasks[taskId].data[0] == 0) + gBattle_BG1_X += -6; + else + gBattle_BG1_X += 6; + + gBattle_BG1_Y += -1; + + switch (gTasks[taskId].data[12]) + { + case 0: + if (++gTasks[taskId].data[10] == 4) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11]++; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); + if (gTasks[taskId].data[11] == 7) + { + gTasks[taskId].data[12]++; + gTasks[taskId].data[11] = 0; + } + } + break; + case 1: + if (++gTasks[taskId].data[11] == 101) + { + gTasks[taskId].data[11] = 7; + gTasks[taskId].data[12]++; + } + break; + case 2: + if (++gTasks[taskId].data[10] == 4) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11]--; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); + if (gTasks[taskId].data[11] == 0) + { + gTasks[taskId].data[12]++; + gTasks[taskId].data[11] = 0; + } + } + break; + case 3: + GetBattleAnimBg1Data(&animBg); + ClearBattleAnimBg(animBg.bgId); + gTasks[taskId].data[12]++; + break; + case 4: + if (!IsContest()) + SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); + + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); + DestroyAnimVisualTask(taskId); + break; + } +} diff --git a/src/graphics.c b/src/graphics.c index 4c648a479..247231d55 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1312,11 +1312,14 @@ const u32 gUnknown_08D85A1C[] = INCBIN_U32("graphics/battle_frontier/battle_tile #include "data/graphics/intro_scene.h" const u32 gBattleAnimSpriteGfx_FlyingDirt[] = INCBIN_U32("graphics/battle_anims/sprites/flying_dirt.4bpp.lz"); +const u32 gBattleAnimSpritePal_FlyingDirt[] = INCBIN_U32("graphics/battle_anims/sprites/flying_dirt.gbapal.lz"); const u32 gBattleAnimBgTilemap_Sandstorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/sandstorm_brew.bin.lz"); const u32 gBattleAnimBgImage_Sandstorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/sandstorm_brew.4bpp.lz"); -const u32 gBattleAnimSpritePal_FlyingDirt[] = INCBIN_U32("graphics/battle_anims/sprites/flying_dirt.gbapal.lz"); +const u32 gBattleAnimBgTilemap_Windstorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/sandstorm_brew.bin.lz"); +const u32 gBattleAnimBgImage_Windstorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/windstorm_brew.4bpp.lz"); +const u32 gBattleAnimSpritePal_Windstorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/windstorm_brew.gbapal.lz"); const u32 gBattleAnimSpriteGfx_MetalSoundWaves[] = INCBIN_U32("graphics/battle_anims/sprites/metal_sound_waves.4bpp.lz"); const u32 gBattleAnimSpritePal_MetalSoundWaves[] = INCBIN_U32("graphics/battle_anims/sprites/metal_sound_waves.gbapal.lz"); From e4fb9c4593c8f37700005376b55c6e14c7a3a63d Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 31 Aug 2021 12:51:03 -0400 Subject: [PATCH 026/193] fix throwing ball in wild doubles --- src/battle_main.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/battle_main.c b/src/battle_main.c index c728ae266..9e08fbbbc 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4055,6 +4055,7 @@ static void HandleTurnActionSelectionState(void) gBattleCommunication[gActiveBattler]++; break; case B_ACTION_THROW_BALL: + gBattleStruct->throwingPokeBall = TRUE; gBattleCommunication[gActiveBattler]++; break; case B_ACTION_SAFARI_POKEBLOCK: @@ -4170,6 +4171,13 @@ static void HandleTurnActionSelectionState(void) if (gBattleCommunication[ACTIONS_CONFIRMED_COUNT] == gBattlersCount) { sub_818603C(1); + + if (WILD_DOUBLE_BATTLE && gBattleStruct->throwingPokeBall) { + // if we choose to throw a ball with our second mon, skip the action of the first + // (if we have chosen throw ball with first, second's is already skipped) + gChosenActionByBattler[B_POSITION_PLAYER_LEFT] = B_ACTION_NOTHING_FAINTED; + } + gBattleMainFunc = SetActionsAndBattlersTurnOrder; if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) From 88476e0ac27c7fe44450a3f27feebc588ea95090 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 31 Aug 2021 12:59:20 -0400 Subject: [PATCH 027/193] remove 2nd case in CanThrowBall --- src/item_use.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/item_use.c b/src/item_use.c index ad7a46499..5a5cd6a52 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -943,11 +943,14 @@ u32 CanThrowBall(void) { return 1; // There are two present pokemon. } - else if (gBattlerInMenuId == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT) + /*else if (gBattlerInMenuId == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT) && IsBattlerAlive(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) { + /* * this is removed. instead, selecting a ball to throw with the second mon just clears the action of your first mon. + * see the end of HandleTurnActionSelectionState in battle_main.c + */ return 2; // Attempting to throw a ball with the second pokemon while both are alive. - } + }*/ else if (IsPlayerPartyAndPokemonStorageFull() == TRUE) { return 3; // No room for mon From d2bcc2ad5b550ba1d403749d756f6440b3acb169 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 1 Sep 2021 00:14:02 -0300 Subject: [PATCH 028/193] Added configs for modern post-battle stat calcs --- include/constants/battle_config.h | 2 ++ src/battle_script_commands.c | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index bf31c77b3..2b83b766f 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -93,6 +93,8 @@ #define B_RECOIL_IF_MISS_DMG GEN_7 // In Gen5+, Jump Kick and High Jump Kick will always do half of the user's max HP when missing. #define B_PSYWAVE_DMG GEN_7 // Psywave's damage formula. See Cmd_psywavedamageeffect. #define B_BADGE_BOOST GEN_7 // In Gen4+, Gym Badges no longer boost a Pokémon's stats. +#define B_MAX_LEVEL_EV_GAINS GEN_7 // In Gen5+, Lv100 Pokémon can obtain Effort Values normally. +#define B_RECALCULATE_STATS GEN_7 // In Gen5+, the stats of the Pokémon who participate in battle are recalculated at the end of each battle. // Move data settings #define B_UPDATED_MOVE_DATA GEN_8 // Updates move data in gBattleMoves, including Power, Accuracy, PP, stat changes, targets, chances of secondary effects, etc. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 21bc7945b..eaceb8545 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3783,6 +3783,9 @@ static void Cmd_getexp(void) *(&gBattleStruct->sentInPokes) >>= 1; gBattleScripting.getexpState = 5; gBattleMoveDamage = 0; // used for exp + #if B_MAX_LEVEL_EV_GAINS >= GEN_5 + MonGainEVs(&gPlayerParty[gBattleStruct->expGetterMonId], gBattleMons[gBattlerFainted].species); + #endif } else { @@ -3958,6 +3961,12 @@ static void Cmd_getexp(void) case 6: // increment instruction if (gBattleControllerExecFlags == 0) { + #if B_RECALCULATE_STATS >= GEN_5 + // Recalculate the stats of every party member before the end + for (i = 0; i < PARTY_SIZE; i++) + CalculateMonStats(&gPlayerParty[i]); + #endif + // not sure why gf clears the item and ability here gBattleMons[gBattlerFainted].item = 0; gBattleMons[gBattlerFainted].ability = 0; From 9990bda7a4e4610390ab92ff0eff90f2a0c7a174 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 1 Sep 2021 02:54:44 -0300 Subject: [PATCH 029/193] Fixed `if` statement for stat recalculation Thanks to Syreldar. --- src/battle_script_commands.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index eaceb8545..a3edf689a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3964,7 +3964,14 @@ static void Cmd_getexp(void) #if B_RECALCULATE_STATS >= GEN_5 // Recalculate the stats of every party member before the end for (i = 0; i < PARTY_SIZE; i++) - CalculateMonStats(&gPlayerParty[i]); + { + if (GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0 + && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) != SPECIES_NONE + && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) + { + CalculateMonStats(&gPlayerParty[i]); + } + } #endif // not sure why gf clears the item and ability here From 39a254f80d240243f6e3a0568d0ae98f3ba0d5a5 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 1 Sep 2021 07:45:41 -0400 Subject: [PATCH 030/193] fix sprite pos changes --- src/battle_interface.c | 24 ++++++++++++------------ src/item_use.c | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/battle_interface.c b/src/battle_interface.c index e17036faa..5f3eecaac 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -3218,8 +3218,8 @@ void TryAddLastUsedBallItemSprites(void) if (gBattleStruct->ballSpriteIds[0] == MAX_SPRITES) { gBattleStruct->ballSpriteIds[0] = AddItemIconSprite(102, 102, gSaveBlock2Ptr->lastUsedBall); - gSprites[gBattleStruct->ballSpriteIds[0]].pos1.x = LAST_USED_BALL_X_0; - gSprites[gBattleStruct->ballSpriteIds[0]].pos1.y = LAST_USED_BALL_Y; + gSprites[gBattleStruct->ballSpriteIds[0]].x = LAST_USED_BALL_X_0; + gSprites[gBattleStruct->ballSpriteIds[0]].y = LAST_USED_BALL_Y; gSprites[gBattleStruct->ballSpriteIds[0]].sHide = FALSE; // restore gSprites[gBattleStruct->ballSpriteIds[0]].callback = SpriteCB_LastUsedBall; } @@ -3258,16 +3258,16 @@ static void SpriteCB_LastUsedBallWin(struct Sprite *sprite) { if (sprite->sHide) { - if (sprite->pos1.x != LAST_BALL_WIN_X_0) - sprite->pos1.x--; + if (sprite->x != LAST_BALL_WIN_X_0) + sprite->x--; - if (sprite->pos1.x == LAST_BALL_WIN_X_0) + if (sprite->x == LAST_BALL_WIN_X_0) DestroyLastUsedBallWinGfx(sprite); } else { - if (sprite->pos1.x != LAST_BALL_WIN_X_F) - sprite->pos1.x++; + if (sprite->x != LAST_BALL_WIN_X_F) + sprite->x++; } } @@ -3275,16 +3275,16 @@ static void SpriteCB_LastUsedBall(struct Sprite *sprite) { if (sprite->sHide) { - if (sprite->pos1.x != LAST_USED_BALL_X_0) - sprite->pos1.x--; + if (sprite->x != LAST_USED_BALL_X_0) + sprite->x--; - if (sprite->pos1.x == LAST_USED_BALL_X_0) + if (sprite->x == LAST_USED_BALL_X_0) DestroyLastUsedBallGfx(sprite); } else { - if (sprite->pos1.x != LAST_USED_BALL_X_F) - sprite->pos1.x++; + if (sprite->x != LAST_USED_BALL_X_F) + sprite->x++; } } diff --git a/src/item_use.c b/src/item_use.c index d0aa82b85..63854a1ac 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -966,7 +966,7 @@ void ItemUseInBattle_PokeBall(u8 taskId) break; case 1: // There are two present pokemon. if (!InBattlePyramid()) - DisplayItemMessage(taskId, 1, sText_CantThrowPokeBall_TwoMons, BagMenu_InitListsMenu); + DisplayItemMessage(taskId, 1, sText_CantThrowPokeBall_TwoMons, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, sText_CantThrowPokeBall_TwoMons, Task_CloseBattlePyramidBagMessage); break; From 46fb92c4da8de0f7166a48c77a8a74fb3ee0351a Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 1 Sep 2021 17:40:12 -0300 Subject: [PATCH 031/193] Optimized checks --- src/battle_script_commands.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a3edf689a..1a2d90ac2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3965,9 +3965,8 @@ static void Cmd_getexp(void) // Recalculate the stats of every party member before the end for (i = 0; i < PARTY_SIZE; i++) { - if (GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0 - && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) != SPECIES_NONE - && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) != SPECIES_NONE + && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) != SPECIES_EGG) { CalculateMonStats(&gPlayerParty[i]); } From 3113e4fa125b1e3d63f6453dec9c36c932f2b1a7 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 6 Sep 2021 07:40:21 -0300 Subject: [PATCH 032/193] Moved stat recalculation to `HandleEndTurn_FinishBattle` --- src/battle_main.c | 11 +++++++++++ src/battle_script_commands.c | 12 ------------ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index 282b85035..728d33d4e 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4880,6 +4880,17 @@ static void HandleEndTurn_FinishBattle(void) UndoMegaEvolution(i); UndoFormChange(i, B_SIDE_PLAYER, FALSE); } + #if B_RECALCULATE_STATS >= GEN_5 + // Recalculate the stats of every party member before the end + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) != SPECIES_NONE + && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) != SPECIES_EGG) + { + CalculateMonStats(&gPlayerParty[i]); + } + } + #endif gBattleMainFunc = FreeResetData_ReturnToOvOrDoEvolutions; gCB2_AfterEvolution = BattleMainCB2; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1a2d90ac2..2d64f7795 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3961,18 +3961,6 @@ static void Cmd_getexp(void) case 6: // increment instruction if (gBattleControllerExecFlags == 0) { - #if B_RECALCULATE_STATS >= GEN_5 - // Recalculate the stats of every party member before the end - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) != SPECIES_NONE - && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) != SPECIES_EGG) - { - CalculateMonStats(&gPlayerParty[i]); - } - } - #endif - // not sure why gf clears the item and ability here gBattleMons[gBattlerFainted].item = 0; gBattleMons[gBattlerFainted].ability = 0; From 9c94eb6140a0752d5bef391c3679c68af14d5404 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 16 Sep 2021 10:24:32 -0400 Subject: [PATCH 033/193] but it failed check for rototiller --- asm/macros/battle_script.inc | 10 +++++ data/battle_scripts_1.s | 40 +++++++++++-------- include/battle.h | 1 + include/constants/battle_script_commands.h | 2 + src/battle_script_commands.c | 45 ++++++++++++++++++++++ 5 files changed, 83 insertions(+), 15 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 662bfbf2f..a2d940737 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1776,6 +1776,16 @@ .macro pickpocketsteal various 0, VARIOUS_PICKPOCKET .endm + + .macro getrototillertargets ptr:req + various BS_ATTACKER, VARIOUS_GET_ROTOTILLER_TARGETS + .4byte \ptr + .endm + + .macro jumpifnotrototilleraffected battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED + .4byte \ptr + .endm @ helpful macros .macro setstatchanger stat:req, stages:req, down:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 2d6db5a28..177c657ce 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -814,27 +814,28 @@ BattleScript_FlowerShieldMoveTargetEnd: moveendto MOVEEND_NEXT_TARGET jumpifnexttargetvalid BattleScript_FlowerShieldLoop end + +BattleScript_RototillerRet:: + + return BattleScript_EffectRototiller: attackcanceler attackstring ppreduce - selectfirstvalidtarget -BattleScript_RototillerLoop: - movevaluescleanup - jumpifnotgrounded BS_TARGET, BattleScript_RototillerNoEffect - jumpiftype BS_TARGET, TYPE_GRASS, BattleScript_RototillerLoop2 -BattleScript_RototillerNoEffect: - pause B_WAIT_TIME_SHORT - printstring STRINGID_NOEFFECTONTARGET - waitmessage B_WAIT_TIME_LONG - goto BattleScript_RototillerMoveTargetEnd -BattleScript_RototillerLoop2: - jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_RototillerDoMoveAnim - jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, MAX_STAT_STAGE, BattleScript_RototillerCantRaiseMultipleStats -BattleScript_RototillerDoMoveAnim:: + getrototillertargets BattleScript_ButItFailed + @ at least one battler is affected attackanimation waitanimation + savetarget + setbyte gBattlerTarget, 0 +BattleScript_RototillerLoop: + movevaluescleanup + jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_RototillerCheckAffected + jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, MAX_STAT_STAGE, BattleScript_RototillerCantRaiseMultipleStats +BattleScript_RototillerCheckAffected: + jumpifnotrototilleraffected BS_TARGET, BattleScript_RototillerNoEffect +BattleScript_RototillerAffected: setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, 0 setstatchanger STAT_ATK, 1, FALSE @@ -850,13 +851,22 @@ BattleScript_RototillerTrySpAtk:: waitmessage B_WAIT_TIME_LONG BattleScript_RototillerMoveTargetEnd: moveendto MOVEEND_NEXT_TARGET - jumpifnexttargetvalid BattleScript_RototillerLoop + addbyte gBattlerTarget, 1 + jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_RototillerLoop end + BattleScript_RototillerCantRaiseMultipleStats: + copybyte gBattlerAttacker, gBattlerTarget printstring STRINGID_STATSWONTINCREASE2 waitmessage B_WAIT_TIME_LONG goto BattleScript_RototillerMoveTargetEnd +BattleScript_RototillerNoEffect: + pause B_WAIT_TIME_SHORT + printstring STRINGID_NOEFFECTONTARGET + waitmessage B_WAIT_TIME_LONG + goto BattleScript_RototillerMoveTargetEnd + BattleScript_EffectBestow: attackcanceler accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON diff --git a/include/battle.h b/include/battle.h index 3fbefe55b..576884d81 100644 --- a/include/battle.h +++ b/include/battle.h @@ -169,6 +169,7 @@ struct SpecialStatus u8 instructedChosenTarget:3; u8 berryReduced:1; u8 gemBoost:1; + u8 rototillerAffected:1; // to be affected by rototiller u8 gemParam; u8 damagedMons:4; // Mons that have been damaged directly by using a move, includes substitute. u8 dancerUsedMove:1; diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 7e7bb6ca9..6c5e3872a 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -174,6 +174,8 @@ #define VARIOUS_TOTEM_BOOST 103 #define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 104 #define VARIOUS_MOVEEND_ITEM_EFFECTS 105 +#define VARIOUS_GET_ROTOTILLER_TARGETS 106 +#define VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED 107 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 05702aec6..a719db550 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7246,6 +7246,21 @@ static u32 GetHighestStatId(u32 battlerId) return highestId; } +static bool32 IsRototillerAffected(u32 battlerId) +{ + if (!IsBattlerAlive(battlerId)) + return FALSE; + if (!IsBattlerGrounded(battlerId)) + return FALSE; // Only grounded battlers affected + if (!IS_BATTLER_OF_TYPE(battlerId, TYPE_GRASS)) + return FALSE; // Only grass types affected + if (gStatuses3[battlerId] & STATUS3_SEMI_INVULNERABLE) + return FALSE; // Rototiller doesn't affected semi-invulnerable battlers + //if (!CompareStat(battlerId, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN) && !CompareStat(battlerId, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)) + //return FALSE; // Battler unaffected if atk and spatk are maxed + return TRUE; +} + static void Cmd_various(void) { struct Pokemon *mon; @@ -8498,6 +8513,36 @@ static void Cmd_various(void) if (ItemBattleEffects(1, gActiveBattler, FALSE)) return; break; + case VARIOUS_GET_ROTOTILLER_TARGETS: + // Gets the battlers to be affected by rototiller. If there are none, print 'But it failed!' + { + u32 count = 0; + for (i = 0; i < gBattlersCount; i++) + { + if (IsRototillerAffected(i)) + { + gSpecialStatuses[i].rototillerAffected = 1; + count++; + } + } + + if (count == 0) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); // Rototiller fails + else + gBattlescriptCurrInstr += 7; + } + return; + case VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED: + if (gSpecialStatuses[gActiveBattler].rototillerAffected) + { + gSpecialStatuses[gActiveBattler].rototillerAffected = 0; + gBattlescriptCurrInstr += 7; + } + else + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); // Unaffected by rototiller - print STRINGID_NOEFFECTONTARGET + } + return; } gBattlescriptCurrInstr += 3; From aac7ae359518c3610fb02f91b05b244172208944 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 16 Sep 2021 10:45:33 -0400 Subject: [PATCH 034/193] add MOVE_TARGET_ALL_BATTLERS --- include/constants/battle.h | 2 + src/battle_controller_player.c | 84 ++++++++++++++++++++++++++++------ src/data/battle_moves.h | 4 +- 3 files changed, 74 insertions(+), 16 deletions(-) diff --git a/include/constants/battle.h b/include/constants/battle.h index 73d5c3deb..53e933944 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -379,4 +379,6 @@ #define MOVE_TARGET_OPPONENTS_FIELD 0x40 #define MOVE_TARGET_ALLY 0x80 +#define MOVE_TARGET_ALL_BATTLERS (MOVE_TARGET_BOTH | MOVE_TARGET_OPPONENTS_FIELD) + #endif // GUARD_CONSTANTS_BATTLE_H diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 841e30327..70a8f51e9 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -485,6 +485,19 @@ static void HandleInputChooseTarget(void) } } +static void HideAllTargets(void) +{ + s32 i; + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (IsBattlerAlive(i) && gBattleSpritesDataPtr->healthBoxesData[i].healthboxIsBouncing) + { + gSprites[gBattlerSpriteIds[i]].callback = SpriteCb_HideAsMoveTarget; + EndBounceEffect(i, BOUNCE_HEALTHBOX); + } + } +} + static void HideShownTargets(void) { s32 i; @@ -498,6 +511,34 @@ static void HideShownTargets(void) } } +static void HandleInputShowEntireFieldTargets(void) +{ + if (JOY_HELD(DPAD_ANY) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A) + gPlayerDpadHoldFrames++; + else + gPlayerDpadHoldFrames = 0; + + if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + HideAllTargets(); + if (gBattleStruct->mega.playerSelect) + BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8)); + else + BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + HideMegaTriggerSprite(); + PlayerBufferExecCompleted(); + } + else if (gMain.newKeys & B_BUTTON || gPlayerDpadHoldFrames > 59) + { + PlaySE(SE_SELECT); + HideAllTargets(); + gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove; + DoBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX, 7, 1); + DoBounceEffect(gActiveBattler, BOUNCE_MON, 7, 1); + } +} + static void HandleInputShowTargets(void) { if (JOY_HELD(DPAD_ANY) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A) @@ -589,27 +630,39 @@ static void HandleInputChooseMove(void) } // Show all available targets for multi-target moves - if (B_SHOW_TARGETS && moveTarget & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY)) + if (B_SHOW_TARGETS) { - TryShowAsTarget(gMultiUsePlayerCursor); - TryShowAsTarget(BATTLE_PARTNER(gMultiUsePlayerCursor)); - if (moveTarget & MOVE_TARGET_FOES_AND_ALLY) - TryShowAsTarget(BATTLE_PARTNER(gActiveBattler)); - canSelectTarget = 2; + if ((moveTarget & MOVE_TARGET_ALL_BATTLERS) == MOVE_TARGET_ALL_BATTLERS) + { + u32 i = 0; + for (i = 0; i < gBattlersCount; i++) + TryShowAsTarget(i); + + canSelectTarget = 3; + } + else if (moveTarget & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY)) + { + TryShowAsTarget(gMultiUsePlayerCursor); + TryShowAsTarget(BATTLE_PARTNER(gMultiUsePlayerCursor)); + if (moveTarget & MOVE_TARGET_FOES_AND_ALLY) + TryShowAsTarget(BATTLE_PARTNER(gActiveBattler)); + canSelectTarget = 2; + } } } - - if (canSelectTarget == 0) + + switch (canSelectTarget) { + case 0: + default: if (gBattleStruct->mega.playerSelect) BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8)); else BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); HideMegaTriggerSprite(); PlayerBufferExecCompleted(); - } - else if (canSelectTarget == 1) - { + break; + case 1: gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseTarget; if (moveTarget & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED)) @@ -620,10 +673,13 @@ static void HandleInputChooseMove(void) gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCb_ShowAsMoveTarget; - } - else - { + break; + case 2: gBattlerControllerFuncs[gActiveBattler] = HandleInputShowTargets; + break; + case 3: // Entire field + gBattlerControllerFuncs[gActiveBattler] = HandleInputShowEntireFieldTargets; + break; } } else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 657341b5e..a63aca114 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -8838,7 +8838,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = 0, .split = SPLIT_STATUS, @@ -9083,7 +9083,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER | MOVE_TARGET_FOES_AND_ALLY, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = 0, .split = SPLIT_STATUS, From 380e1e470c2c25683b22e567cc65489faaf3c2ae Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Wed, 22 Sep 2021 23:29:00 -0300 Subject: [PATCH 035/193] Applied use of TRUE and FALSE for flags. --- src/battle_main.c | 60 +++++++++---------- src/battle_script_commands.c | 112 +++++++++++++++++------------------ src/battle_util.c | 112 +++++++++++++++++------------------ 3 files changed, 142 insertions(+), 142 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index 72d05a0fd..1b4ad5f74 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3067,31 +3067,31 @@ void FaintClearSetData(void) memset(&gDisableStructs[gActiveBattler], 0, sizeof(struct DisableStruct)); - gProtectStructs[gActiveBattler].protected = 0; - gProtectStructs[gActiveBattler].spikyShielded = 0; - gProtectStructs[gActiveBattler].kingsShielded = 0; - gProtectStructs[gActiveBattler].banefulBunkered = 0; - gProtectStructs[gActiveBattler].endured = 0; - gProtectStructs[gActiveBattler].noValidMoves = 0; - gProtectStructs[gActiveBattler].helpingHand = 0; - gProtectStructs[gActiveBattler].bounceMove = 0; - gProtectStructs[gActiveBattler].stealMove = 0; - gProtectStructs[gActiveBattler].prlzImmobility = 0; - gProtectStructs[gActiveBattler].confusionSelfDmg = 0; - gProtectStructs[gActiveBattler].targetAffected = 0; - gProtectStructs[gActiveBattler].chargingTurn = 0; + gProtectStructs[gActiveBattler].protected = FALSE; + gProtectStructs[gActiveBattler].spikyShielded = FALSE; + gProtectStructs[gActiveBattler].kingsShielded = FALSE; + gProtectStructs[gActiveBattler].banefulBunkered = FALSE; + gProtectStructs[gActiveBattler].endured = FALSE; + gProtectStructs[gActiveBattler].noValidMoves = FALSE; + gProtectStructs[gActiveBattler].helpingHand = FALSE; + gProtectStructs[gActiveBattler].bounceMove = FALSE; + gProtectStructs[gActiveBattler].stealMove = FALSE; + gProtectStructs[gActiveBattler].prlzImmobility = FALSE; + gProtectStructs[gActiveBattler].confusionSelfDmg = FALSE; + gProtectStructs[gActiveBattler].targetAffected = FALSE; + gProtectStructs[gActiveBattler].chargingTurn = FALSE; gProtectStructs[gActiveBattler].fleeFlag = 0; - gProtectStructs[gActiveBattler].usedImprisonedMove = 0; - gProtectStructs[gActiveBattler].loveImmobility = 0; - gProtectStructs[gActiveBattler].usedDisabledMove = 0; - gProtectStructs[gActiveBattler].usedTauntedMove = 0; - gProtectStructs[gActiveBattler].flag2Unknown = 0; - gProtectStructs[gActiveBattler].flinchImmobility = 0; - gProtectStructs[gActiveBattler].notFirstStrike = 0; - gProtectStructs[gActiveBattler].usedHealBlockedMove = 0; - gProtectStructs[gActiveBattler].usesBouncedMove = 0; - gProtectStructs[gActiveBattler].usedGravityPreventedMove = 0; - gProtectStructs[gActiveBattler].usedThroatChopPreventedMove = 0; + gProtectStructs[gActiveBattler].usedImprisonedMove = FALSE; + gProtectStructs[gActiveBattler].loveImmobility = FALSE; + gProtectStructs[gActiveBattler].usedDisabledMove = FALSE; + gProtectStructs[gActiveBattler].usedTauntedMove = FALSE; + gProtectStructs[gActiveBattler].flag2Unknown = FALSE; + gProtectStructs[gActiveBattler].flinchImmobility = FALSE; + gProtectStructs[gActiveBattler].notFirstStrike = FALSE; + gProtectStructs[gActiveBattler].usedHealBlockedMove = FALSE; + gProtectStructs[gActiveBattler].usesBouncedMove = FALSE; + gProtectStructs[gActiveBattler].usedGravityPreventedMove = FALSE; + gProtectStructs[gActiveBattler].usedThroatChopPreventedMove = FALSE; gDisableStructs[gActiveBattler].isFirstTurn = 2; @@ -4541,10 +4541,10 @@ static void TurnValuesCleanUp(bool8 var0) { if (var0) { - gProtectStructs[gActiveBattler].protected = 0; - gProtectStructs[gActiveBattler].spikyShielded = 0; - gProtectStructs[gActiveBattler].kingsShielded = 0; - gProtectStructs[gActiveBattler].banefulBunkered = 0; + gProtectStructs[gActiveBattler].protected = FALSE; + gProtectStructs[gActiveBattler].spikyShielded = FALSE; + gProtectStructs[gActiveBattler].kingsShielded = FALSE; + gProtectStructs[gActiveBattler].banefulBunkered = FALSE; } else { @@ -5032,7 +5032,7 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) gBattleStruct->dynamicMoveType = 0; gBattleStruct->ateBoost[battlerAtk] = 0; - gSpecialStatuses[battlerAtk].gemBoost = 0; + gSpecialStatuses[battlerAtk].gemBoost = FALSE; if (gBattleMoves[move].effect == EFFECT_WEATHER_BALL) { @@ -5126,7 +5126,7 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) && moveType == ItemId_GetSecondaryId(gBattleMons[battlerAtk].item)) { gSpecialStatuses[battlerAtk].gemParam = GetBattlerHoldEffectParam(battlerAtk); - gSpecialStatuses[battlerAtk].gemBoost = 1; + gSpecialStatuses[battlerAtk].gemBoost = TRUE; } } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 5840e8805..9a107fac0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1402,8 +1402,8 @@ static void Cmd_attackcanceler(void) && !gProtectStructs[gBattlerAttacker].usesBouncedMove) { PressurePPLose(gBattlerAttacker, gBattlerTarget, MOVE_MAGIC_COAT); - gProtectStructs[gBattlerTarget].bounceMove = 0; - gProtectStructs[gBattlerTarget].usesBouncedMove = 1; + gProtectStructs[gBattlerTarget].bounceMove = FALSE; + gProtectStructs[gBattlerTarget].usesBouncedMove = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = 0; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MagicCoatBounce; @@ -1414,7 +1414,7 @@ static void Cmd_attackcanceler(void) && !gProtectStructs[gBattlerAttacker].usesBouncedMove) { RecordAbilityBattle(gBattlerTarget, ABILITY_MAGIC_BOUNCE); - gProtectStructs[gBattlerTarget].usesBouncedMove = 1; + gProtectStructs[gBattlerTarget].usesBouncedMove = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = 1; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MagicCoatBounce; @@ -1426,7 +1426,7 @@ static void Cmd_attackcanceler(void) if ((gProtectStructs[gBattlerByTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED) { PressurePPLose(gBattlerAttacker, gBattlerByTurnOrder[i], MOVE_SNATCH); - gProtectStructs[gBattlerByTurnOrder[i]].stealMove = 0; + gProtectStructs[gBattlerByTurnOrder[i]].stealMove = FALSE; gBattleScripting.battler = gBattlerByTurnOrder[i]; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SnatchedMove; @@ -1436,7 +1436,7 @@ static void Cmd_attackcanceler(void) if (gSpecialStatuses[gBattlerTarget].lightningRodRedirected) { - gSpecialStatuses[gBattlerTarget].lightningRodRedirected = 0; + gSpecialStatuses[gBattlerTarget].lightningRodRedirected = FALSE; gLastUsedAbility = ABILITY_LIGHTNING_ROD; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_TookAttack; @@ -1444,7 +1444,7 @@ static void Cmd_attackcanceler(void) } else if (gSpecialStatuses[gBattlerTarget].stormDrainRedirected) { - gSpecialStatuses[gBattlerTarget].stormDrainRedirected = 0; + gSpecialStatuses[gBattlerTarget].stormDrainRedirected = FALSE; gLastUsedAbility = ABILITY_STORM_DRAIN; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_TookAttack; @@ -1456,7 +1456,7 @@ static void Cmd_attackcanceler(void) && gBattleMoves[gCurrentMove].effect != EFFECT_SUCKER_PUNCH) { if (gBattleMoves[gCurrentMove].flags & FLAG_MAKES_CONTACT) - gProtectStructs[gBattlerAttacker].touchedProtectLike = 1; + gProtectStructs[gBattlerAttacker].touchedProtectLike = TRUE; CancelMultiTurnMoves(gBattlerAttacker); gMoveResultFlags |= MOVE_RESULT_MISSED; gLastLandedMoves[gBattlerTarget] = 0; @@ -1745,7 +1745,7 @@ static void Cmd_ppreduce(void) if (!(gHitMarker & (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING)) && gBattleMons[gBattlerAttacker].pp[gCurrMovePos]) { - gProtectStructs[gBattlerAttacker].notFirstStrike = 1; + gProtectStructs[gBattlerAttacker].notFirstStrike = TRUE; // For item Metronome, echoed voice if (gCurrentMove == gLastResultingMoves[gBattlerAttacker] && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) @@ -1888,17 +1888,17 @@ static void Cmd_adjustdamage(void) if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param) { RecordItemEffectBattle(gBattlerTarget, holdEffect); - gSpecialStatuses[gBattlerTarget].focusBanded = 1; + gSpecialStatuses[gBattlerTarget].focusBanded = TRUE; } else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && BATTLER_MAX_HP(gBattlerTarget)) { RecordItemEffectBattle(gBattlerTarget, holdEffect); - gSpecialStatuses[gBattlerTarget].focusSashed = 1; + gSpecialStatuses[gBattlerTarget].focusSashed = TRUE; } else if (GetBattlerAbility(gBattlerTarget) == ABILITY_STURDY && BATTLER_MAX_HP(gBattlerTarget)) { RecordAbilityBattle(gBattlerTarget, ABILITY_STURDY); - gSpecialStatuses[gBattlerTarget].sturdied = 1; + gSpecialStatuses[gBattlerTarget].sturdied = TRUE; } if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE @@ -1961,7 +1961,7 @@ static void Cmd_multihitresultmessage(void) if (gMoveResultFlags & MOVE_RESULT_STURDIED) { gMoveResultFlags &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_HUNG_ON); - gSpecialStatuses[gBattlerTarget].sturdied = 0; // Delete this line to make Sturdy last for the duration of the whole move turn. + gSpecialStatuses[gBattlerTarget].sturdied = FALSE; // Delete this line to make Sturdy last for the duration of the whole move turn. BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SturdiedMsg; return; @@ -1971,8 +1971,8 @@ static void Cmd_multihitresultmessage(void) gLastUsedItem = gBattleMons[gBattlerTarget].item; gPotentialItemEffectBattler = gBattlerTarget; gMoveResultFlags &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_HUNG_ON); - gSpecialStatuses[gBattlerTarget].focusBanded = 0; // Delete this line to make Focus Band last for the duration of the whole move turn. - gSpecialStatuses[gBattlerTarget].focusSashed = 0; // Delete this line to make Focus Sash last for the duration of the whole move turn. + gSpecialStatuses[gBattlerTarget].focusBanded = FALSE; // Delete this line to make Focus Band last for the duration of the whole move turn. + gSpecialStatuses[gBattlerTarget].focusSashed = FALSE; // Delete this line to make Focus Sash last for the duration of the whole move turn. BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_HangedOnMsg; return; @@ -1984,7 +1984,7 @@ static void Cmd_multihitresultmessage(void) if (gSpecialStatuses[gBattlerTarget].berryReduced && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { - gSpecialStatuses[gBattlerTarget].berryReduced = 0; + gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_PrintBerryReduceString; } @@ -2336,7 +2336,7 @@ static void Cmd_resultmessage(void) else if (gMoveResultFlags & MOVE_RESULT_STURDIED) { gMoveResultFlags &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - gSpecialStatuses[gBattlerTarget].sturdied = 0; + gSpecialStatuses[gBattlerTarget].sturdied = FALSE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SturdiedMsg; return; @@ -2378,7 +2378,7 @@ static void Cmd_resultmessage(void) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { gLastUsedItem = gBattleMons[gBattlerTarget].item; - gSpecialStatuses[gBattlerTarget].berryReduced = 0; + gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_PrintBerryReduceString; } @@ -2888,7 +2888,7 @@ void SetMoveEffect(bool32 primary, u32 certain) case MOVE_EFFECT_CHARGING: gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; gLockedMoves[gEffectBattler] = gCurrentMove; - gProtectStructs[gEffectBattler].chargingTurn = 1; + gProtectStructs[gEffectBattler].chargingTurn = TRUE; gBattlescriptCurrInstr++; break; case MOVE_EFFECT_WRAP: @@ -3212,14 +3212,14 @@ void SetMoveEffect(bool32 primary, u32 certain) || gProtectStructs[gBattlerTarget].kingsShielded || gProtectStructs[gBattlerTarget].banefulBunkered) { - gProtectStructs[gBattlerTarget].protected = 0; + gProtectStructs[gBattlerTarget].protected = FALSE; gSideStatuses[GetBattlerSide(gBattlerTarget)] &= ~(SIDE_STATUS_WIDE_GUARD); gSideStatuses[GetBattlerSide(gBattlerTarget)] &= ~(SIDE_STATUS_QUICK_GUARD); gSideStatuses[GetBattlerSide(gBattlerTarget)] &= ~(SIDE_STATUS_CRAFTY_SHIELD); gSideStatuses[GetBattlerSide(gBattlerTarget)] &= ~(SIDE_STATUS_MAT_BLOCK); - gProtectStructs[gBattlerTarget].spikyShielded = 0; - gProtectStructs[gBattlerTarget].kingsShielded = 0; - gProtectStructs[gBattlerTarget].banefulBunkered = 0; + gProtectStructs[gBattlerTarget].spikyShielded = FALSE; + gProtectStructs[gBattlerTarget].kingsShielded = FALSE; + gProtectStructs[gBattlerTarget].banefulBunkered = FALSE; if (gCurrentMove == MOVE_FEINT) { BattleScriptPush(gBattlescriptCurrInstr + 1); @@ -4753,7 +4753,7 @@ static void Cmd_moveend(void) { if (gProtectStructs[gBattlerTarget].spikyShielded && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { - gProtectStructs[gBattlerAttacker].touchedProtectLike = 0; + gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -4764,7 +4764,7 @@ static void Cmd_moveend(void) } else if (gProtectStructs[gBattlerTarget].kingsShielded) { - gProtectStructs[gBattlerAttacker].touchedProtectLike = 0; + gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; i = gBattlerAttacker; gBattlerAttacker = gBattlerTarget; gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable @@ -4775,7 +4775,7 @@ static void Cmd_moveend(void) } else if (gProtectStructs[gBattlerTarget].banefulBunkered) { - gProtectStructs[gBattlerAttacker].touchedProtectLike = 0; + gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; gBattleScripting.moveEffect = MOVE_EFFECT_POISON | MOVE_EFFECT_AFFECTS_USER; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_BANEFUL_BUNKER); BattleScriptPushCursor(); @@ -4924,7 +4924,7 @@ static void Cmd_moveend(void) BtlController_EmitSpriteInvisibility(0, FALSE); MarkBattlerForControllerExec(gActiveBattler); gStatuses3[gBattlerAttacker] &= ~(STATUS3_SEMI_INVULNERABLE); - gSpecialStatuses[gBattlerAttacker].restoredBattlerSprite = 1; + gSpecialStatuses[gBattlerAttacker].restoredBattlerSprite = TRUE; gBattleScripting.moveendState++; return; } @@ -5030,7 +5030,7 @@ static void Cmd_moveend(void) // Set a flag if move hits either target (for throat spray that can't check damage) if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - gProtectStructs[gBattlerAttacker].targetAffected = 1; + gProtectStructs[gBattlerAttacker].targetAffected = TRUE; if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gBattleTypeFlags & BATTLE_TYPE_DOUBLE @@ -5227,7 +5227,7 @@ static void Cmd_moveend(void) { gBattleScripting.savedBattler = gBattlerTarget | 0x4; gBattleScripting.savedBattler |= (gBattlerAttacker << 4); - gSpecialStatuses[gBattlerAttacker].dancerUsedMove = 1; + gSpecialStatuses[gBattlerAttacker].dancerUsedMove = TRUE; } for (battler = 0; battler < MAX_BATTLERS_COUNT; battler++) { @@ -5275,13 +5275,13 @@ static void Cmd_moveend(void) *(gBattleStruct->moveTarget + gBattlerAttacker) = gSpecialStatuses[gBattlerAttacker].instructedChosenTarget & 0x3; if (gSpecialStatuses[gBattlerAttacker].dancerOriginalTarget) *(gBattleStruct->moveTarget + gBattlerAttacker) = gSpecialStatuses[gBattlerAttacker].dancerOriginalTarget & 0x3; - gProtectStructs[gBattlerAttacker].usesBouncedMove = 0; - gProtectStructs[gBattlerAttacker].targetAffected = 0; + gProtectStructs[gBattlerAttacker].usesBouncedMove = FALSE; + gProtectStructs[gBattlerAttacker].targetAffected = FALSE; gBattleStruct->ateBoost[gBattlerAttacker] = 0; gStatuses3[gBattlerAttacker] &= ~(STATUS3_ME_FIRST); - gSpecialStatuses[gBattlerAttacker].gemBoost = 0; + gSpecialStatuses[gBattlerAttacker].gemBoost = FALSE; gSpecialStatuses[gBattlerAttacker].damagedMons = 0; - gSpecialStatuses[gBattlerTarget].berryReduced = 0; + gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; gBattleScripting.moveEffect = 0; gBattleScripting.moveendState++; break; @@ -7538,9 +7538,9 @@ static void Cmd_various(void) gBattleCommunication[0] = FALSE; break; case VARIOUS_RESET_INTIMIDATE_TRACE_BITS: - gSpecialStatuses[gActiveBattler].intimidatedMon = 0; - gSpecialStatuses[gActiveBattler].traced = 0; - gSpecialStatuses[gActiveBattler].switchInAbilityDone = 0; + gSpecialStatuses[gActiveBattler].intimidatedMon = FALSE; + gSpecialStatuses[gActiveBattler].traced = FALSE; + gSpecialStatuses[gActiveBattler].switchInAbilityDone = FALSE; break; case VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP: if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId || gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId) @@ -8615,27 +8615,27 @@ static void Cmd_setprotectlike(void) { if (gBattleMoves[gCurrentMove].effect == EFFECT_ENDURE) { - gProtectStructs[gBattlerAttacker].endured = 1; + gProtectStructs[gBattlerAttacker].endured = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BRACED_ITSELF; } else if (gCurrentMove == MOVE_DETECT || gCurrentMove == MOVE_PROTECT) { - gProtectStructs[gBattlerAttacker].protected = 1; + gProtectStructs[gBattlerAttacker].protected = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_ITSELF; } else if (gCurrentMove == MOVE_SPIKY_SHIELD) { - gProtectStructs[gBattlerAttacker].spikyShielded = 1; + gProtectStructs[gBattlerAttacker].spikyShielded = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_ITSELF; } else if (gCurrentMove == MOVE_KINGS_SHIELD) { - gProtectStructs[gBattlerAttacker].kingsShielded = 1; + gProtectStructs[gBattlerAttacker].kingsShielded = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_ITSELF; } else if (gCurrentMove == MOVE_BANEFUL_BUNKER) { - gProtectStructs[gBattlerAttacker].banefulBunkered = 1; + gProtectStructs[gBattlerAttacker].banefulBunkered = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_ITSELF; } @@ -8800,7 +8800,7 @@ static void Cmd_trymirrormove(void) } else { - gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1; + gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = TRUE; gBattlescriptCurrInstr++; } } @@ -9168,7 +9168,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr BattleScriptPush(BS_ptr); gBattleScripting.battler = gActiveBattler; gBattlescriptCurrInstr = BattleScript_MistProtected; - gSpecialStatuses[gActiveBattler].statLowered = 1; + gSpecialStatuses[gActiveBattler].statLowered = TRUE; } } return STAT_CHANGE_DIDNT_WORK; @@ -9198,7 +9198,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss; gLastUsedAbility = GetBattlerAbility(gActiveBattler); RecordAbilityBattle(gActiveBattler, gLastUsedAbility); - gSpecialStatuses[gActiveBattler].statLowered = 1; + gSpecialStatuses[gActiveBattler].statLowered = TRUE; } } return STAT_CHANGE_DIDNT_WORK; @@ -9218,7 +9218,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr gBattlerAbility = index - 1; gBattlescriptCurrInstr = BattleScript_FlowerVeilProtectsRet; gLastUsedAbility = ABILITY_FLOWER_VEIL; - gSpecialStatuses[gActiveBattler].statLowered = 1; + gSpecialStatuses[gActiveBattler].statLowered = TRUE; } } return STAT_CHANGE_DIDNT_WORK; @@ -9293,7 +9293,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr else { // Check eject pack. disableEjectPack set for edge cases (e.g. attacking weak armor'd eject pack holder with u-turn) - if (gProtectStructs[gActiveBattler].disableEjectPack == 0) + if (!gProtectStructs[gActiveBattler].disableEjectPack) gSpecialStatuses[gActiveBattler].statFell = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == gActiveBattler); // B_MSG_ATTACKER_STAT_FELL or B_MSG_DEFENDER_STAT_FELL } @@ -9787,12 +9787,12 @@ static void Cmd_tryKO(void) if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < GetBattlerHoldEffectParam(gBattlerTarget)) { - gSpecialStatuses[gBattlerTarget].focusBanded = 1; + gSpecialStatuses[gBattlerTarget].focusBanded = TRUE; RecordItemEffectBattle(gBattlerTarget, holdEffect); } else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && BATTLER_MAX_HP(gBattlerTarget)) { - gSpecialStatuses[gBattlerTarget].focusSashed = 1; + gSpecialStatuses[gBattlerTarget].focusSashed = TRUE; RecordItemEffectBattle(gBattlerTarget, holdEffect); } @@ -10206,7 +10206,7 @@ static void Cmd_counterdamagecalculator(void) } else { - gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1; + gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = TRUE; gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } @@ -10231,7 +10231,7 @@ static void Cmd_mirrorcoatdamagecalculator(void) // a copy of atkA1 with the phy } else { - gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1; + gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = TRUE; gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } @@ -10720,7 +10720,7 @@ static void Cmd_trysetspikes(void) if (gSideTimers[targetSide].spikesAmount == 3) { - gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1; + gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = TRUE; gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else @@ -11407,7 +11407,7 @@ static void Cmd_trysethelpinghand(void) && !gProtectStructs[gBattlerAttacker].helpingHand && !gProtectStructs[gBattlerTarget].helpingHand) { - gProtectStructs[gBattlerTarget].helpingHand = 1; + gProtectStructs[gBattlerTarget].helpingHand = TRUE; gBattlescriptCurrInstr += 5; } else @@ -11827,28 +11827,28 @@ static void Cmd_assistattackselect(void) static void Cmd_trysetmagiccoat(void) { gBattlerTarget = gBattlerAttacker; - gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1; + gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = TRUE; if (gCurrentTurnActionNumber == gBattlersCount - 1) // moves last turn { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { - gProtectStructs[gBattlerAttacker].bounceMove = 1; + gProtectStructs[gBattlerAttacker].bounceMove = TRUE; gBattlescriptCurrInstr += 5; } } static void Cmd_trysetsnatch(void) // snatch { - gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1; + gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = TRUE; if (gCurrentTurnActionNumber == gBattlersCount - 1) // moves last turn { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { - gProtectStructs[gBattlerAttacker].stealMove = 1; + gProtectStructs[gBattlerAttacker].stealMove = TRUE; gBattlescriptCurrInstr += 5; } } @@ -12835,7 +12835,7 @@ static void Cmd_metalburstdamagecalculator(void) } else { - gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1; + gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = TRUE; gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } diff --git a/src/battle_util.c b/src/battle_util.c index f0adfebb9..b012f7d49 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -255,7 +255,7 @@ void HandleAction_UseMove(void) // choose move if (gProtectStructs[gBattlerAttacker].noValidMoves) { - gProtectStructs[gBattlerAttacker].noValidMoves = 0; + gProtectStructs[gBattlerAttacker].noValidMoves = FALSE; gCurrentMove = gChosenMove = MOVE_STRUGGLE; gHitMarker |= HITMARKER_NO_PPDEDUCT; *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(MOVE_STRUGGLE, 0); @@ -386,9 +386,9 @@ void HandleAction_UseMove(void) gActiveBattler = gBattlerByTurnOrder[var]; RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); if (gBattleMons[gActiveBattler].ability == ABILITY_LIGHTNING_ROD) - gSpecialStatuses[gActiveBattler].lightningRodRedirected = 1; + gSpecialStatuses[gActiveBattler].lightningRodRedirected = TRUE; else if (gBattleMons[gActiveBattler].ability == ABILITY_STORM_DRAIN) - gSpecialStatuses[gActiveBattler].stormDrainRedirected = 1; + gSpecialStatuses[gActiveBattler].stormDrainRedirected = TRUE; gBattlerTarget = gActiveBattler; } } @@ -1594,7 +1594,7 @@ u8 TrySetCantSelectMoveBattleScript(void) if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingDisabledMoveInPalace; - gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE; } else { @@ -1609,7 +1609,7 @@ u8 TrySetCantSelectMoveBattleScript(void) if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingTormentedMoveInPalace; - gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE; } else { @@ -1624,7 +1624,7 @@ u8 TrySetCantSelectMoveBattleScript(void) if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveTauntInPalace; - gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE; } else { @@ -1639,7 +1639,7 @@ u8 TrySetCantSelectMoveBattleScript(void) if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveThroatChopInPalace; - gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE; } else { @@ -1654,7 +1654,7 @@ u8 TrySetCantSelectMoveBattleScript(void) if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingImprisonedMoveInPalace; - gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE; } else { @@ -1669,7 +1669,7 @@ u8 TrySetCantSelectMoveBattleScript(void) if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveGravityInPalace; - gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE; } else { @@ -1684,7 +1684,7 @@ u8 TrySetCantSelectMoveBattleScript(void) if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveHealBlockInPalace; - gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE; } else { @@ -1699,7 +1699,7 @@ u8 TrySetCantSelectMoveBattleScript(void) if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedBelchInPalace; - gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE; } else { @@ -1715,7 +1715,7 @@ u8 TrySetCantSelectMoveBattleScript(void) gLastUsedItem = gBattleMons[gActiveBattler].item; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE; } else { @@ -1729,7 +1729,7 @@ u8 TrySetCantSelectMoveBattleScript(void) gLastUsedItem = gBattleMons[gActiveBattler].item; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE; } else { @@ -1742,7 +1742,7 @@ u8 TrySetCantSelectMoveBattleScript(void) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE; } else { @@ -1801,12 +1801,12 @@ bool8 AreAllMovesUnusable(void) if (unusable == 0xF) // All moves are unusable. { - gProtectStructs[gActiveBattler].noValidMoves = 1; + gProtectStructs[gActiveBattler].noValidMoves = TRUE; gSelectionBattleScripts[gActiveBattler] = BattleScript_NoMovesLeft; } else { - gProtectStructs[gActiveBattler].noValidMoves = 0; + gProtectStructs[gActiveBattler].noValidMoves = FALSE; } return (unusable == 0xF); @@ -3194,7 +3194,7 @@ u8 AtkCanceller_UnableToUseMove(void) case CANCELLER_FLINCH: // flinch if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FLINCHED) { - gProtectStructs[gBattlerAttacker].flinchImmobility = 1; + gProtectStructs[gBattlerAttacker].flinchImmobility = TRUE; CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; @@ -3205,7 +3205,7 @@ u8 AtkCanceller_UnableToUseMove(void) case CANCELLER_DISABLED: // disabled move if (gDisableStructs[gBattlerAttacker].disabledMove == gCurrentMove && gDisableStructs[gBattlerAttacker].disabledMove != 0) { - gProtectStructs[gBattlerAttacker].usedDisabledMove = 1; + gProtectStructs[gBattlerAttacker].usedDisabledMove = TRUE; gBattleScripting.battler = gBattlerAttacker; CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedIsDisabled; @@ -3217,7 +3217,7 @@ u8 AtkCanceller_UnableToUseMove(void) case CANCELLER_HEAL_BLOCKED: if (gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK && IsHealBlockPreventingMove(gBattlerAttacker, gCurrentMove)) { - gProtectStructs[gBattlerAttacker].usedHealBlockedMove = 1; + gProtectStructs[gBattlerAttacker].usedHealBlockedMove = TRUE; gBattleScripting.battler = gBattlerAttacker; CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedHealBlockPrevents; @@ -3229,7 +3229,7 @@ u8 AtkCanceller_UnableToUseMove(void) case CANCELLER_GRAVITY: if (gFieldStatuses & STATUS_FIELD_GRAVITY && IsGravityPreventingMove(gCurrentMove)) { - gProtectStructs[gBattlerAttacker].usedGravityPreventedMove = 1; + gProtectStructs[gBattlerAttacker].usedGravityPreventedMove = TRUE; gBattleScripting.battler = gBattlerAttacker; CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedGravityPrevents; @@ -3241,7 +3241,7 @@ u8 AtkCanceller_UnableToUseMove(void) case CANCELLER_TAUNTED: // taunt if (gDisableStructs[gBattlerAttacker].tauntTimer && gBattleMoves[gCurrentMove].power == 0) { - gProtectStructs[gBattlerAttacker].usedTauntedMove = 1; + gProtectStructs[gBattlerAttacker].usedTauntedMove = TRUE; CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedIsTaunted; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; @@ -3252,7 +3252,7 @@ u8 AtkCanceller_UnableToUseMove(void) case CANCELLER_IMPRISONED: // imprisoned if (GetImprisonedMovesCount(gBattlerAttacker, gCurrentMove)) { - gProtectStructs[gBattlerAttacker].usedImprisonedMove = 1; + gProtectStructs[gBattlerAttacker].usedImprisonedMove = TRUE; CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedIsImprisoned; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; @@ -3271,7 +3271,7 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleCommunication[MULTISTRING_CHOOSER] = TRUE; gBattlerTarget = gBattlerAttacker; gBattleMoveDamage = CalculateMoveDamage(MOVE_NONE, gBattlerAttacker, gBattlerAttacker, TYPE_MYSTERY, 40, FALSE, FALSE, TRUE); - gProtectStructs[gBattlerAttacker].confusionSelfDmg = 1; + gProtectStructs[gBattlerAttacker].confusionSelfDmg = TRUE; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; } else @@ -3293,7 +3293,7 @@ u8 AtkCanceller_UnableToUseMove(void) case CANCELLER_PARALYSED: // paralysis if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && (Random() % 4) == 0) { - gProtectStructs[gBattlerAttacker].prlzImmobility = 1; + gProtectStructs[gBattlerAttacker].prlzImmobility = TRUE; // This is removed in Emerald for some reason //CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed; @@ -3314,7 +3314,7 @@ u8 AtkCanceller_UnableToUseMove(void) { BattleScriptPush(BattleScript_MoveUsedIsInLoveCantAttack); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gProtectStructs[gBattlerAttacker].loveImmobility = 1; + gProtectStructs[gBattlerAttacker].loveImmobility = TRUE; CancelMultiTurnMoves(gBattlerAttacker); } gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; @@ -3393,7 +3393,7 @@ u8 AtkCanceller_UnableToUseMove(void) GET_MOVE_TYPE(gCurrentMove, moveType); if (moveType == TYPE_FIRE) { - gProtectStructs[gBattlerAttacker].powderSelfDmg = 1; + gProtectStructs[gBattlerAttacker].powderSelfDmg = TRUE; gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; effect = 1; @@ -3404,7 +3404,7 @@ u8 AtkCanceller_UnableToUseMove(void) case CANCELLER_THROAT_CHOP: if (gDisableStructs[gBattlerAttacker].throatChopTimer && gBattleMoves[gCurrentMove].flags & FLAG_SOUND) { - gProtectStructs[gBattlerAttacker].usedThroatChopPreventedMove = 1; + gProtectStructs[gBattlerAttacker].usedThroatChopPreventedMove = TRUE; CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedIsThroatChopPrevented; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; @@ -3926,7 +3926,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!gSpecialStatuses[battler].switchInAbilityDone) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_MOLDBREAKER; - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); effect++; } @@ -3935,7 +3935,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!gSpecialStatuses[battler].switchInAbilityDone) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_TERAVOLT; - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); effect++; } @@ -3944,7 +3944,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!gSpecialStatuses[battler].switchInAbilityDone) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_TURBOBLAZE; - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); effect++; } @@ -3954,7 +3954,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move { gDisableStructs[battler].slowStartTimer = 5; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_SLOWSTART; - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); effect++; } @@ -3963,7 +3963,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!gSpecialStatuses[battler].switchInAbilityDone) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_UNNERVE; - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); effect++; } @@ -3973,7 +3973,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!gSpecialStatuses[battler].switchInAbilityDone) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_ASONE; - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_ActivateAsOne); effect++; } @@ -3985,7 +3985,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move u32 i; gEffectBattler = BATTLE_PARTNER(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_CURIOUS_MEDICINE; - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); effect++; } @@ -4015,7 +4015,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (effect) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_ANTICIPATION; - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); } } @@ -4023,7 +4023,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move case ABILITY_FRISK: if (!gSpecialStatuses[battler].switchInAbilityDone) { - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_FriskActivates); // Try activate effect++; } @@ -4033,7 +4033,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move { ForewarnChooseMove(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_FOREWARN; - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); effect++; } @@ -4063,7 +4063,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move else statId = STAT_SPATK; - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; if (CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) { @@ -4080,7 +4080,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!gSpecialStatuses[battler].switchInAbilityDone) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_PRESSURE; - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); effect++; } @@ -4089,7 +4089,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!gSpecialStatuses[battler].switchInAbilityDone) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_DARKAURA; - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); effect++; } @@ -4098,7 +4098,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!gSpecialStatuses[battler].switchInAbilityDone) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_FAIRYAURA; - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); effect++; } @@ -4107,7 +4107,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!gSpecialStatuses[battler].switchInAbilityDone) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_AURABREAK; - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); effect++; } @@ -4116,7 +4116,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!gSpecialStatuses[battler].switchInAbilityDone) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_COMATOSE; - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); effect++; } @@ -4125,7 +4125,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!gSpecialStatuses[battler].switchInAbilityDone && TryRemoveScreens(battler)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_SCREENCLEANER; - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); effect++; } @@ -4190,7 +4190,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!(gSpecialStatuses[battler].intimidatedMon)) { gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_INTIMIDATED; - gSpecialStatuses[battler].intimidatedMon = 1; + gSpecialStatuses[battler].intimidatedMon = TRUE; } break; case ABILITY_FORECAST: @@ -4206,14 +4206,14 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!(gSpecialStatuses[battler].traced)) { gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_TRACED; - gSpecialStatuses[battler].traced = 1; + gSpecialStatuses[battler].traced = TRUE; } break; case ABILITY_CLOUD_NINE: case ABILITY_AIR_LOCK: if (!gSpecialStatuses[battler].switchInAbilityDone) { - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_AnnounceAirLockCloudNine); effect++; } @@ -4231,7 +4231,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move case ABILITY_INTREPID_SWORD: if (!gSpecialStatuses[battler].switchInAbilityDone) { - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; SET_STATCHANGER(STAT_ATK, 1, FALSE); BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); effect++; @@ -4240,7 +4240,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move case ABILITY_DAUNTLESS_SHIELD: if (!gSpecialStatuses[battler].switchInAbilityDone) { - gSpecialStatuses[battler].switchInAbilityDone = 1; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; SET_STATCHANGER(STAT_DEF, 1, FALSE); BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); effect++; @@ -4659,7 +4659,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move || CompareStat(battler, STAT_DEF, MIN_STAT_STAGE, CMP_GREATER_THAN))) // Don't activate if defense cannot be lowered { if (gBattleMoves[gCurrentMove].effect == EFFECT_HIT_ESCAPE && CanBattlerSwitch(gBattlerAttacker)) - gProtectStructs[battler].disableEjectPack = 1; // Set flag for target + gProtectStructs[battler].disableEjectPack = TRUE; // Set flag for target BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_WeakArmorActivates; @@ -5015,7 +5015,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move && gBattlerAttacker != battler) { // Set bit and save Dancer mon's original target - gSpecialStatuses[battler].dancerUsedMove = 1; + gSpecialStatuses[battler].dancerUsedMove = TRUE; gSpecialStatuses[battler].dancerOriginalTarget = *(gBattleStruct->moveTarget + battler) | 0x4; gBattleStruct->atkCancellerTracker = 0; gBattlerAttacker = gBattlerAbility = battler; @@ -6016,7 +6016,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) if (effect) { - gSpecialStatuses[battlerId].switchInItemDone = 1; + gSpecialStatuses[battlerId].switchInItemDone = TRUE; gActiveBattler = gBattlerAttacker = gPotentialItemEffectBattler = gBattleScripting.battler = battlerId; switch (effect) { @@ -6852,7 +6852,7 @@ u8 GetMoveTarget(u16 move, u8 setTarget) { targetBattler ^= BIT_FLANK; RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); - gSpecialStatuses[targetBattler].lightningRodRedirected = 1; + gSpecialStatuses[targetBattler].lightningRodRedirected = TRUE; } else if (gBattleMoves[move].type == TYPE_WATER && IsAbilityOnOpposingSide(gBattlerAttacker, ABILITY_STORM_DRAIN) @@ -6860,7 +6860,7 @@ u8 GetMoveTarget(u16 move, u8 setTarget) { targetBattler ^= BIT_FLANK; RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); - gSpecialStatuses[targetBattler].stormDrainRedirected = 1; + gSpecialStatuses[targetBattler].stormDrainRedirected = TRUE; } } break; @@ -7387,7 +7387,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) basePower *= 2; break; case EFFECT_ASSURANCE: - if (gProtectStructs[battlerDef].physicalDmg != 0 || gProtectStructs[battlerDef].specialDmg != 0 || gProtectStructs[battlerDef].confusionSelfDmg != 0) + if (gProtectStructs[battlerDef].physicalDmg != 0 || gProtectStructs[battlerDef].specialDmg != 0 || gProtectStructs[battlerDef].confusionSelfDmg) basePower *= 2; break; case EFFECT_TRUMP_CARD: @@ -8236,7 +8236,7 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move else MulModifier(&finalModifier, UQ_4_12(0.5)); if (updateFlags) - gSpecialStatuses[battlerDef].berryReduced = 1; + gSpecialStatuses[battlerDef].berryReduced = TRUE; } break; } From 075c0299a13fa1b012614eadefebd9f991f83e74 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Wed, 22 Sep 2021 23:29:26 -0300 Subject: [PATCH 036/193] Better names for Micle and Custap flags --- include/battle.h | 4 ++-- src/battle_main.c | 12 ++++++------ src/battle_script_commands.c | 4 ++-- src/battle_util.c | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/include/battle.h b/include/battle.h index 36646c9fe..200b1112d 100644 --- a/include/battle.h +++ b/include/battle.h @@ -142,8 +142,8 @@ struct ProtectStruct u32 usedGravityPreventedMove:1; u32 powderSelfDmg:1; u32 usedThroatChopPreventedMove:1; - u32 micle:1; - u32 custap:1; // also quick claw + u32 usedMicleBerry:1; + u32 usedCustapBerry:1; // also quick claw u32 touchedProtectLike:1; u32 disableEjectPack:1; u32 physicalDmg; diff --git a/src/battle_main.c b/src/battle_main.c index 1b4ad5f74..cc9fff1d3 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4360,7 +4360,7 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) || (!IsAbilityOnOpposingSide(battler1, ABILITY_UNNERVE) && holdEffectBattler1 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler1, 4, gBattleMons[battler1].item))) - gProtectStructs[battler1].custap = TRUE; + gProtectStructs[battler1].usedCustapBerry = TRUE; speedBattler2 = GetBattlerTotalSpeedStat(battler2); holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); @@ -4368,7 +4368,7 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) || (!IsAbilityOnOpposingSide(battler2, ABILITY_UNNERVE) && holdEffectBattler2 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler2, 4, gBattleMons[battler2].item))) - gProtectStructs[battler2].custap = TRUE; + gProtectStructs[battler2].usedCustapBerry = TRUE; if (!ignoreChosenMoves) { @@ -4384,9 +4384,9 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) // LAGGING TAIL - always last // STALL - always last - if (gProtectStructs[battler1].custap && !gProtectStructs[battler2].custap) + if (gProtectStructs[battler1].usedCustapBerry && !gProtectStructs[battler2].usedCustapBerry) strikesFirst = 0; - else if (gProtectStructs[battler2].custap && !gProtectStructs[battler1].custap) + else if (gProtectStructs[battler2].usedCustapBerry && !gProtectStructs[battler1].usedCustapBerry) strikesFirst = 1; else if (holdEffectBattler1 == HOLD_EFFECT_LAGGING_TAIL && holdEffectBattler2 != HOLD_EFFECT_LAGGING_TAIL) strikesFirst = 1; @@ -4639,12 +4639,12 @@ static void CheckQuickClaw_CustapBerryActivation(void) gBattleStruct->quickClawBattlerId++; if (gChosenActionByBattler[gActiveBattler] == B_ACTION_USE_MOVE && gChosenMoveByBattler[gActiveBattler] != MOVE_FOCUS_PUNCH // quick claw message doesn't need to activate here - && gProtectStructs[gActiveBattler].custap + && gProtectStructs[gActiveBattler].usedCustapBerry && !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) && !(gDisableStructs[gBattlerAttacker].truantCounter) && !(gProtectStructs[gActiveBattler].noValidMoves)) { - gProtectStructs[gActiveBattler].custap = FALSE; + gProtectStructs[gActiveBattler].usedCustapBerry = FALSE; gLastUsedItem = gBattleMons[gActiveBattler].item; if (GetBattlerHoldEffect(gActiveBattler, FALSE) == HOLD_EFFECT_CUSTAP_BERRY) { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9a107fac0..b03da17c3 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1638,9 +1638,9 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move) else if (atkHoldEffect == HOLD_EFFECT_ZOOM_LENS && GetBattlerTurnOrderNum(battlerAtk) > GetBattlerTurnOrderNum(battlerDef)); calc = (calc * (100 + atkParam)) / 100; - if (gProtectStructs[battlerAtk].micle) + if (gProtectStructs[battlerAtk].usedMicleBerry) { - gProtectStructs[battlerAtk].micle = FALSE; + gProtectStructs[battlerAtk].usedMicleBerry = FALSE; if (atkAbility == ABILITY_RIPEN) calc = (calc * 140) / 100; // ripen gives 40% acc boost else diff --git a/src/battle_util.c b/src/battle_util.c index b012f7d49..c9ecfd3d8 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5616,7 +5616,7 @@ static u8 TrySetMicleBerry(u32 battlerId, u32 itemId, bool32 end2) { if (HasEnoughHpToEatBerry(battlerId, 4, itemId)) { - gProtectStructs[battlerId].micle = TRUE; // battler's next attack has increased accuracy + gProtectStructs[battlerId].usedMicleBerry = TRUE; // battler's next attack has increased accuracy if (end2) { From 3f34fec42fb3aa55173e207c384e3b40f1e46591 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 23 Sep 2021 12:03:01 -0400 Subject: [PATCH 037/193] change last ball graphic based on config. replace saveblock field with ewram field --- .../battle_interface/last_used_ball_l.png | Bin 0 -> 214 bytes ...ast_used_ball.png => last_used_ball_r.png} | Bin include/battle.h | 1 + src/battle_interface.c | 36 ++++++++++++++---- src/battle_main.c | 1 + src/battle_script_commands.c | 2 +- src/battle_util.c | 2 +- 7 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 graphics/battle_interface/last_used_ball_l.png rename graphics/battle_interface/{last_used_ball.png => last_used_ball_r.png} (100%) diff --git a/graphics/battle_interface/last_used_ball_l.png b/graphics/battle_interface/last_used_ball_l.png new file mode 100644 index 0000000000000000000000000000000000000000..90fcef37398ed2b8bef3c2cc0649bc4ad9a8fac1 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ipSH_Le)y2(0UQw2Yj+z{f zK*sa;Uw{7n50nRj?BZfCCy?fA*Uq){^Z*&j&Z>)mRHCPgV~EDY^unv_P&x8 zS#yg)?8er2d6p7uYPU)$efU;Y`Lk$&!&Tdk1N(LxH11ySDHySpEAoNZk!hg?jk{ML zNYHg+U~^;L!1<<%`?2$5R*B*OhF;5_9Y;HAOBfhR1(d!8PtREbw2Z;i)z4*}Q$iB} D1m#Ns literal 0 HcmV?d00001 diff --git a/graphics/battle_interface/last_used_ball.png b/graphics/battle_interface/last_used_ball_r.png similarity index 100% rename from graphics/battle_interface/last_used_ball.png rename to graphics/battle_interface/last_used_ball_r.png diff --git a/include/battle.h b/include/battle.h index 54693a33b..0becc4dd4 100644 --- a/include/battle.h +++ b/include/battle.h @@ -890,5 +890,6 @@ extern u8 gNumberOfMovesToChoose; extern u8 gBattleControllerData[MAX_BATTLERS_COUNT]; extern bool8 gHasFetchedBall; extern u8 gLastUsedBall; +extern u16 gLastThrownBall; #endif // GUARD_BATTLE_H diff --git a/src/battle_interface.c b/src/battle_interface.c index 5f3eecaac..4a3d1eaec 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -30,6 +30,7 @@ #include "item_icon.h" #include "item_use.h" #include "item.h" +#include "constants/items.h" enum { // Corresponds to gHealthboxElementsGfxTable (and the tables after it) in graphics.c @@ -3175,7 +3176,11 @@ static const struct SpriteTemplate sSpriteTemplate_LastUsedBallWindow = .callback = SpriteCB_LastUsedBallWin }; -static const u8 sLastUsedBallWindowGfx[] = INCBIN_U8("graphics/battle_interface/last_used_ball.4bpp"); +#if B_LAST_USED_BALL_BUTTON == R_BUTTON + static const u8 sLastUsedBallWindowGfx[] = INCBIN_U8("graphics/battle_interface/last_used_ball_r.4bpp"); +#else + static const u8 sLastUsedBallWindowGfx[] = INCBIN_U8("graphics/battle_interface/last_used_ball_r.4bpp"); +#endif static const struct SpriteSheet sSpriteSheet_LastUsedBallWindow = { sLastUsedBallWindowGfx, sizeof(sLastUsedBallWindowGfx), LAST_BALL_WINDOW_TAG @@ -3193,31 +3198,39 @@ static const struct SpriteSheet sSpriteSheet_LastUsedBallWindow = bool32 CanThrowLastUsedBall(void) { - return (!(CanThrowBall() != 0 - || (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - || !CheckBagHasItem(gSaveBlock2Ptr->lastUsedBall, 1))); + #if B_LAST_USED_BALL == FALSE + return FALSE; + #else + return (!(CanThrowBall() != 0 + || (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + || !CheckBagHasItem(gLastThrownBall, 1))); + #endif } void TryAddLastUsedBallItemSprites(void) { - if (gSaveBlock2Ptr->lastUsedBall != 0 && !CheckBagHasItem(gSaveBlock2Ptr->lastUsedBall, 1)) + #if B_LAST_USED_BALL == TRUE + if (gLastThrownBall == 0) + gLastThrownBall = ITEM_POKE_BALL; + + if (gLastThrownBall != 0 && !CheckBagHasItem(gLastThrownBall, 1)) { // we're out of the last used ball, so just set it to the first ball in the bag // we have to compact the bag first bc it is typically only compacted when you open it CompactItemsInBagPocket(&gBagPockets[BALLS_POCKET]); - gSaveBlock2Ptr->lastUsedBall = gBagPockets[BALLS_POCKET].itemSlots[0].itemId; + gLastThrownBall = gBagPockets[BALLS_POCKET].itemSlots[0].itemId; } if (CanThrowBall() != 0 || (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - || !CheckBagHasItem(gSaveBlock2Ptr->lastUsedBall, 1)) + || !CheckBagHasItem(gLastThrownBall, 1)) return; // ball if (gBattleStruct->ballSpriteIds[0] == MAX_SPRITES) { - gBattleStruct->ballSpriteIds[0] = AddItemIconSprite(102, 102, gSaveBlock2Ptr->lastUsedBall); + gBattleStruct->ballSpriteIds[0] = AddItemIconSprite(102, 102, gLastThrownBall); gSprites[gBattleStruct->ballSpriteIds[0]].x = LAST_USED_BALL_X_0; gSprites[gBattleStruct->ballSpriteIds[0]].y = LAST_USED_BALL_Y; gSprites[gBattleStruct->ballSpriteIds[0]].sHide = FALSE; // restore @@ -3236,6 +3249,7 @@ void TryAddLastUsedBallItemSprites(void) LAST_USED_WIN_Y, 5); gSprites[gBattleStruct->ballSpriteIds[0]].sHide = FALSE; // restore } + #endif } static void DestroyLastUsedBallWinGfx(struct Sprite *sprite) @@ -3290,6 +3304,7 @@ static void SpriteCB_LastUsedBall(struct Sprite *sprite) static void TryHideOrRestoreLastUsedBall(u8 caseId) { + #if B_LAST_USED_BALL == TRUE if (gBattleStruct->ballSpriteIds[0] == MAX_SPRITES) return; @@ -3308,18 +3323,23 @@ static void TryHideOrRestoreLastUsedBall(u8 caseId) gSprites[gBattleStruct->ballSpriteIds[1]].sHide = FALSE; // restore break; } + #endif } void TryHideLastUsedBall(void) { + #if B_LAST_USED_BALL == TRUE TryHideOrRestoreLastUsedBall(0); + #endif } void TryRestoreLastUsedBall(void) { + #if B_LAST_USED_BALL == TRUE if (gBattleStruct->ballSpriteIds[0] != MAX_SPRITES) TryHideOrRestoreLastUsedBall(1); else TryAddLastUsedBallItemSprites(); + #endif } diff --git a/src/battle_main.c b/src/battle_main.c index b1cc8bbc4..b8b013635 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -230,6 +230,7 @@ EWRAM_DATA u16 gPartnerSpriteId = 0; EWRAM_DATA struct TotemBoost gTotemBoosts[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA bool8 gHasFetchedBall = FALSE; EWRAM_DATA u8 gLastUsedBall = 0; +EWRAM_DATA u16 gLastThrownBall = 0; // IWRAM common vars void (*gPreBattleCallback1)(void); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index cd64a2497..313f47878 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12021,7 +12021,7 @@ static void Cmd_handleballthrow(void) u32 odds; u8 catchRate; - gSaveBlock2Ptr->lastUsedBall = gLastUsedItem; + gLastThrownBall = gLastUsedItem; if (gLastUsedItem == ITEM_SAFARI_BALL) catchRate = gBattleStruct->safariCatchFactor * 1275 / 100; else diff --git a/src/battle_util.c b/src/battle_util.c index 04070bf7e..f482d40dd 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -759,7 +759,7 @@ void HandleAction_ThrowBall(void) gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - gLastUsedItem = gSaveBlock2Ptr->lastUsedBall; + gLastUsedItem = gLastThrownBall; RemoveBagItem(gLastUsedItem, 1); gBattlescriptCurrInstr = BattleScript_BallThrow; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; From 768598b1545b361a3a5f3e312a2d66c2d510f1a3 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 23 Sep 2021 12:22:36 -0400 Subject: [PATCH 038/193] fix bad merge --- include/battle_util.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/battle_util.h b/include/battle_util.h index d01ca3411..15b238b17 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -48,7 +48,6 @@ struct TypePower extern const struct TypePower gNaturalGiftTable[]; void HandleAction_ThrowBall(void); -bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide); bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move); void HandleAction_UseMove(void); void HandleAction_Switch(void); From 3925c07c1a2e7c6b3803e66f49f4af316fe26aec Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 23 Sep 2021 13:20:32 -0400 Subject: [PATCH 039/193] fix l graphic --- src/battle_interface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_interface.c b/src/battle_interface.c index 4a3d1eaec..63a05860d 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -3179,7 +3179,7 @@ static const struct SpriteTemplate sSpriteTemplate_LastUsedBallWindow = #if B_LAST_USED_BALL_BUTTON == R_BUTTON static const u8 sLastUsedBallWindowGfx[] = INCBIN_U8("graphics/battle_interface/last_used_ball_r.4bpp"); #else - static const u8 sLastUsedBallWindowGfx[] = INCBIN_U8("graphics/battle_interface/last_used_ball_r.4bpp"); + static const u8 sLastUsedBallWindowGfx[] = INCBIN_U8("graphics/battle_interface/last_used_ball_l.4bpp"); #endif static const struct SpriteSheet sSpriteSheet_LastUsedBallWindow = { From 728756052160a844db62cd746b39666a42215b7e Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Fri, 1 Oct 2021 18:28:51 -0300 Subject: [PATCH 040/193] Fixed confuse berries affecting the wrong battler. --- data/battle_scripts_1.s | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index f1f5995ff..2ce0adf68 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8041,22 +8041,22 @@ BattleScript_BerryConfuseHealEnd2_Anim: end2 BattleScript_BerryConfuseHealRet:: - jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_BerryConfuseHealRet_AbilityPopup + jumpifability BS_ATTACKER, ABILITY_RIPEN, BattleScript_BerryConfuseHealRet_AbilityPopup goto BattleScript_BerryConfuseHealRet_Anim BattleScript_BerryConfuseHealRet_AbilityPopup: call BattleScript_AbilityPopUp BattleScript_BerryConfuseHealRet_Anim: - playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, NULL + playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER printstring STRINGID_FORXCOMMAYZ waitmessage B_WAIT_TIME_LONG setmoveeffect MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER seteffectprimary - removeitem BS_SCRIPTING + removeitem BS_ATTACKER return BattleScript_BerryStatRaiseEnd2:: From 64a45d8f4851e0d56af1cfcec1c6023f48871f27 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 3 Oct 2021 07:21:47 -0300 Subject: [PATCH 041/193] =?UTF-8?q?Tweaked=20trytoclearprimalweather=20Mad?= =?UTF-8?q?e=20it=20so=20it=20won't=20actually=20try=20to=20clear=20a=20pr?= =?UTF-8?q?imal=20weather=20if=20a=20Pok=C3=A9mon=20with=20Desolate=20Land?= =?UTF-8?q?,=20Primordial=20Sea=20or=20Delta=20Stream=20is=20present=20on?= =?UTF-8?q?=20the=20field.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/battle_script_commands.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6b1e4e77a..90979264a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8762,19 +8762,30 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; return; case VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER: - if (gBattleWeather & WEATHER_SUN_PRIMAL) + { + bool8 shouldNotClear = FALSE; + + for (i = 0; i < gBattlersCount; i++) + { + if (((GetBattlerAbility(i) == ABILITY_DESOLATE_LAND && gBattleWeather & WEATHER_SUN_PRIMAL) + || (GetBattlerAbility(i) == ABILITY_PRIMORDIAL_SEA && gBattleWeather & WEATHER_RAIN_PRIMAL) + || (GetBattlerAbility(i) == ABILITY_DELTA_STREAM && gBattleWeather & WEATHER_STRONG_WINDS)) + && IsBattlerAlive(i)) + shouldNotClear = TRUE; + } + if (gBattleWeather & WEATHER_SUN_PRIMAL && !shouldNotClear) { gBattleWeather &= ~WEATHER_SUN_PRIMAL; PrepareStringBattle(STRINGID_EXTREMESUNLIGHTFADED, gActiveBattler); gBattleCommunication[MSG_DISPLAY] = 1; } - else if (gBattleWeather & WEATHER_RAIN_PRIMAL) + else if (gBattleWeather & WEATHER_RAIN_PRIMAL && !shouldNotClear) { gBattleWeather &= ~WEATHER_RAIN_PRIMAL; PrepareStringBattle(STRINGID_HEAVYRAINLIFTED, gActiveBattler); gBattleCommunication[MSG_DISPLAY] = 1; } - else if (gBattleWeather & WEATHER_STRONG_WINDS) + else if (gBattleWeather & WEATHER_STRONG_WINDS && !shouldNotClear) { gBattleWeather &= ~WEATHER_STRONG_WINDS; PrepareStringBattle(STRINGID_STRONGWINDSDISSIPATED, gActiveBattler); @@ -8782,6 +8793,7 @@ static void Cmd_various(void) } break; } + } gBattlescriptCurrInstr += 3; } From dcefb523f828619a923ea7c8403be2ffecb05bf1 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 4 Oct 2021 06:43:43 -0300 Subject: [PATCH 042/193] Tweaks and fixes -Fixed the Flying-type checks of WEATHER_STRONG_WINDS. -Fixed the order of actions involving the printing of STRINGID_ATTACKWEAKENEDBSTRONGWINDS. --- data/battle_scripts_1.s | 2 +- src/battle_script_commands.c | 20 ++++++++++++++++++++ src/battle_util.c | 16 ++++++---------- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 39fb01cdd..083db5f07 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7293,7 +7293,7 @@ BattleScript_AttackWeakenedByStrongWinds:: call BattleScript_AbilityPopUp printstring STRINGID_ATTACKWEAKENEDBSTRONGWINDS waitmessage B_WAIT_TIME_LONG - end3 + return BattleScript_SnowWarningActivates:: pause B_WAIT_TIME_SHORT diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 90979264a..1fd7daea5 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1914,6 +1914,9 @@ static void Cmd_typecalc(void) static void Cmd_adjustdamage(void) { u8 holdEffect, param; + u32 moveType; + + GET_MOVE_TYPE(gCurrentMove, moveType); if (DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) goto END; @@ -1991,6 +1994,23 @@ END: gBattlescriptCurrInstr = BattleScript_GemActivates; gLastUsedItem = gBattleMons[gBattlerAttacker].item; } + + // WEATHER_STRONG_WINDS prints a string when it's about to reduce the power + // of a move that is Super Effective against a Flying-type Pokémon. + if (gBattleWeather & WEATHER_STRONG_WINDS) + { + if ((gBattleMons[gBattlerTarget].type1 == TYPE_FLYING + && GetTypeModifier(moveType, gBattleMons[gBattlerTarget].type1) >= UQ_4_12(2.0)) + || (gBattleMons[gBattlerTarget].type2 == TYPE_FLYING + && GetTypeModifier(moveType, gBattleMons[gBattlerTarget].type2) >= UQ_4_12(2.0)) + || (gBattleMons[gBattlerTarget].type3 == TYPE_FLYING + && GetTypeModifier(moveType, gBattleMons[gBattlerTarget].type3) >= UQ_4_12(2.0))) + { + gBattlerAbility = gBattlerTarget; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AttackWeakenedByStrongWinds; + } + } } static void Cmd_multihitresultmessage(void) diff --git a/src/battle_util.c b/src/battle_util.c index 2e7f3e18d..8873d7ae3 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -486,14 +486,6 @@ void HandleAction_UseMove(void) for (i = 0; i < MAX_BATTLERS_COUNT; i++) gBattleStruct->hpBefore[i] = gBattleMons[i].hp; - GET_MOVE_TYPE(gCurrentMove, moveType); - if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_STRONG_WINDS) - { - if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_FLYING) - && CalcTypeEffectivenessMultiplier(gCurrentMove, moveType, gBattlerAttacker, gBattlerTarget, FALSE) >= UQ_4_12(2.0)) - BattleScriptPushCursorAndCallback(BattleScript_AttackWeakenedByStrongWinds); - } - gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } @@ -8300,8 +8292,12 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move } else if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_STRONG_WINDS) { - if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_FLYING) - && typeEffectivenessModifier >= UQ_4_12(2.0)) + if ((gBattleMons[battlerDef].type1 == TYPE_FLYING + && GetTypeModifier(moveType, gBattleMons[battlerDef].type1) >= UQ_4_12(2.0)) + || (gBattleMons[battlerDef].type2 == TYPE_FLYING + && GetTypeModifier(moveType, gBattleMons[battlerDef].type2) >= UQ_4_12(2.0)) + || (gBattleMons[battlerDef].type3 == TYPE_FLYING + && GetTypeModifier(moveType, gBattleMons[battlerDef].type3) >= UQ_4_12(2.0))) dmg = ApplyModifier(UQ_4_12(0.5), dmg); } From dc451167d13d42bca8b402335c08e8ab171e163b Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 6 Oct 2021 05:09:47 -0300 Subject: [PATCH 043/193] More fixes -Removed ability popup when Strong Winds weakens a SE Flying-type move -Went back to the way I handled the dmg calculation for that originally -Made sure to try to clear the primal weathers in a couple of other battle scripts -Allowed Drought, Drizzle, Sand Stream and Snow Warning to activate but fail if WEATHER_STRONG_WINDS is in effect. --- data/battle_scripts_1.s | 21 +++++++++++++++++++-- src/battle_util.c | 22 ++++++++++++---------- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 083db5f07..8aa2b32ba 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4135,6 +4135,12 @@ BattleScript_MysteriousAirCurrentBlowsOn: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd +BattleScript_MysteriousAirCurrentBlowsOnEnd3: + pause B_WAIT_TIME_SHORT + printstring STRINGID_MYSTERIOUSAIRCURRENTBLOWSON + waitmessage B_WAIT_TIME_LONG + end3 + BattleScript_EffectDefenseUpHit:: setmoveeffect MOVE_EFFECT_DEF_PLUS_1 | MOVE_EFFECT_AFFECTS_USER goto BattleScript_EffectHit @@ -5255,6 +5261,9 @@ BattleScript_FaintedMonTryChooseAnother: getswitchedmondata BS_ATTACKER switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER + trytoclearprimalweather + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 printstring STRINGID_SWITCHINMON hidepartystatussummary BS_ATTACKER switchinanim BS_ATTACKER, 0 @@ -5265,6 +5274,9 @@ BattleScript_FaintedMonChooseAnother: getswitchedmondata BS_FAINTED switchindataupdate BS_FAINTED hpthresholds BS_FAINTED + trytoclearprimalweather + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 printstring STRINGID_SWITCHINMON hidepartystatussummary BS_FAINTED switchinanim BS_FAINTED, FALSE @@ -5297,6 +5309,9 @@ BattleScript_HandleFaintedMonLoop:: getswitchedmondata BS_FAINTED switchindataupdate BS_FAINTED hpthresholds BS_FAINTED + trytoclearprimalweather + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 printstring STRINGID_SWITCHINMON hidepartystatussummary BS_FAINTED switchinanim BS_FAINTED, FALSE @@ -6974,6 +6989,7 @@ BattleScript_ItemSteal:: BattleScript_DrizzleActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnEnd3 printstring STRINGID_PKMNMADEITRAIN waitstate playanimation BS_BATTLER_0, B_ANIM_RAIN_CONTINUES, NULL @@ -7132,6 +7148,7 @@ BattleScript_HealerActivates:: BattleScript_SandstreamActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnEnd3 printstring STRINGID_PKMNSXWHIPPEDUPSANDSTORM waitstate playanimation BS_BATTLER_0, B_ANIM_SANDSTORM_CONTINUES, NULL @@ -7238,6 +7255,7 @@ BattleScript_IntimidatePrevented: BattleScript_DroughtActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnEnd3 printstring STRINGID_PKMNSXINTENSIFIEDSUN waitstate playanimation BS_BATTLER_0, B_ANIM_SUN_CONTINUES, NULL @@ -7289,8 +7307,6 @@ BattleScript_DeltaStreamActivates:: end3 BattleScript_AttackWeakenedByStrongWinds:: - pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp printstring STRINGID_ATTACKWEAKENEDBSTRONGWINDS waitmessage B_WAIT_TIME_LONG return @@ -7298,6 +7314,7 @@ BattleScript_AttackWeakenedByStrongWinds:: BattleScript_SnowWarningActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnEnd3 printstring STRINGID_SNOWWARNINGHAIL waitstate playanimation BS_BATTLER_0, B_ANIM_HAIL_CONTINUES, NULL diff --git a/src/battle_util.c b/src/battle_util.c index 8873d7ae3..17b04ebf8 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8290,16 +8290,6 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move else if (moveType == TYPE_WATER) dmg = ApplyModifier(UQ_4_12(0.5), dmg); } - else if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_STRONG_WINDS) - { - if ((gBattleMons[battlerDef].type1 == TYPE_FLYING - && GetTypeModifier(moveType, gBattleMons[battlerDef].type1) >= UQ_4_12(2.0)) - || (gBattleMons[battlerDef].type2 == TYPE_FLYING - && GetTypeModifier(moveType, gBattleMons[battlerDef].type2) >= UQ_4_12(2.0)) - || (gBattleMons[battlerDef].type3 == TYPE_FLYING - && GetTypeModifier(moveType, gBattleMons[battlerDef].type3) >= UQ_4_12(2.0))) - dmg = ApplyModifier(UQ_4_12(0.5), dmg); - } // check stab if (IS_BATTLER_OF_TYPE(battlerAtk, moveType) && move != MOVE_STRUGGLE) @@ -8541,6 +8531,18 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat modifier = UQ_4_12(1.0); } + // WEATHER_STRONG_WINDS weakens Super Effective moves against Flying-type Pokémon + if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_STRONG_WINDS) + { + if ((gBattleMons[battlerDef].type1 == TYPE_FLYING + && GetTypeModifier(moveType, gBattleMons[battlerDef].type1) >= UQ_4_12(2.0)) + || (gBattleMons[battlerDef].type2 == TYPE_FLYING + && GetTypeModifier(moveType, gBattleMons[battlerDef].type2) >= UQ_4_12(2.0)) + || (gBattleMons[battlerDef].type3 == TYPE_FLYING + && GetTypeModifier(moveType, gBattleMons[battlerDef].type3) >= UQ_4_12(2.0))) + modifier = UQ_4_12(1.0); + } + if (((GetBattlerAbility(battlerDef) == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0)) || (GetBattlerAbility(battlerDef) == ABILITY_TELEPATHY && battlerDef == BATTLE_PARTNER(battlerAtk))) && gBattleMoves[move].power) From b93c746a495c8a7fe4bb01e16f4227fe6a7af3a1 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 6 Oct 2021 06:04:56 -0300 Subject: [PATCH 044/193] Reverted comment after the previous commit --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 17b04ebf8..d783edab2 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8275,7 +8275,7 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move && gBattleMoves[move].effect != EFFECT_FACADE && abilityAtk != ABILITY_GUTS) dmg = ApplyModifier(UQ_4_12(0.5), dmg); - // check weather + // check sunny/rain weather if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_RAIN_ANY) { if (moveType == TYPE_FIRE) From 0f2cc99f45d46f9c5780bbf265b023e4dcc1832c Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 6 Oct 2021 06:32:06 -0300 Subject: [PATCH 045/193] WEATHER_STRONG_WINDS modifier fix MulByTypeEffectiveness was the right answer all along. I also added a short pause to BattleScript_AttackWeakenedByStrongWinds before STRINGID_ATTACKWEAKENEDBSTRONGWINDS is printed. --- data/battle_scripts_1.s | 1 + src/battle_util.c | 19 +++++++------------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 8aa2b32ba..e3a395e18 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7307,6 +7307,7 @@ BattleScript_DeltaStreamActivates:: end3 BattleScript_AttackWeakenedByStrongWinds:: + pause B_WAIT_TIME_SHORT printstring STRINGID_ATTACKWEAKENEDBSTRONGWINDS waitmessage B_WAIT_TIME_LONG return diff --git a/src/battle_util.c b/src/battle_util.c index d783edab2..4e57d3425 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8476,6 +8476,13 @@ static void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, u8 batt if (gProtectStructs[battlerDef].kingsShielded && gBattleMoves[move].effect != EFFECT_FEINT) mod = UQ_4_12(1.0); + // WEATHER_STRONG_WINDS weakens Super Effective moves against Flying-type Pokémon + if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_STRONG_WINDS) + { + if (defType == TYPE_FLYING && mod >= UQ_4_12(2.0)) + mod = UQ_4_12(1.0); + } + MulModifier(modifier, mod); } @@ -8531,18 +8538,6 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat modifier = UQ_4_12(1.0); } - // WEATHER_STRONG_WINDS weakens Super Effective moves against Flying-type Pokémon - if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_STRONG_WINDS) - { - if ((gBattleMons[battlerDef].type1 == TYPE_FLYING - && GetTypeModifier(moveType, gBattleMons[battlerDef].type1) >= UQ_4_12(2.0)) - || (gBattleMons[battlerDef].type2 == TYPE_FLYING - && GetTypeModifier(moveType, gBattleMons[battlerDef].type2) >= UQ_4_12(2.0)) - || (gBattleMons[battlerDef].type3 == TYPE_FLYING - && GetTypeModifier(moveType, gBattleMons[battlerDef].type3) >= UQ_4_12(2.0))) - modifier = UQ_4_12(1.0); - } - if (((GetBattlerAbility(battlerDef) == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0)) || (GetBattlerAbility(battlerDef) == ABILITY_TELEPATHY && battlerDef == BATTLE_PARTNER(battlerAtk))) && gBattleMoves[move].power) From a646c3311b15c3c7bf5fe45dd6e94c41c3f8bc41 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 6 Oct 2021 07:59:43 -0300 Subject: [PATCH 046/193] Another set of fixes The ability pop up is supposed to show as weather changing abilities try but fail to activate. --- data/battle_scripts_1.s | 41 +++++++++++++++++++++++++++++++++++++++++ src/battle_util.c | 3 ++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e3a395e18..ed34b9461 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4123,12 +4123,36 @@ BattleScript_ExtremelyHarshSunlightWasNotLessened: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd +BattleScript_ExtremelyHarshSunlightWasNotLessenedEnd3: + pause B_WAIT_TIME_SHORT + printstring STRINGID_EXTREMELYHARSHSUNLIGHTWASNOTLESSENED + waitmessage B_WAIT_TIME_LONG + end3 + +BattleScript_ExtremelyHarshSunlightWasNotLessenedRet: + pause B_WAIT_TIME_SHORT + printstring STRINGID_EXTREMELYHARSHSUNLIGHTWASNOTLESSENED + waitmessage B_WAIT_TIME_LONG + return + BattleScript_NoReliefFromHeavyRain: pause B_WAIT_TIME_SHORT printstring STRINGID_NORELIEFROMHEAVYRAIN waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd +BattleScript_NoReliefFromHeavyRainEnd3: + pause B_WAIT_TIME_SHORT + printstring STRINGID_NORELIEFROMHEAVYRAIN + waitmessage B_WAIT_TIME_LONG + end3 + +BattleScript_NoReliefFromHeavyRainRet: + pause B_WAIT_TIME_SHORT + printstring STRINGID_NORELIEFROMHEAVYRAIN + waitmessage B_WAIT_TIME_LONG + return + BattleScript_MysteriousAirCurrentBlowsOn: pause B_WAIT_TIME_SHORT printstring STRINGID_MYSTERIOUSAIRCURRENTBLOWSON @@ -4141,6 +4165,12 @@ BattleScript_MysteriousAirCurrentBlowsOnEnd3: waitmessage B_WAIT_TIME_LONG end3 +BattleScript_MysteriousAirCurrentBlowsOnRet: + pause B_WAIT_TIME_SHORT + printstring STRINGID_MYSTERIOUSAIRCURRENTBLOWSON + waitmessage B_WAIT_TIME_LONG + return + BattleScript_EffectDefenseUpHit:: setmoveeffect MOVE_EFFECT_DEF_PLUS_1 | MOVE_EFFECT_AFFECTS_USER goto BattleScript_EffectHit @@ -6989,6 +7019,8 @@ BattleScript_ItemSteal:: BattleScript_DrizzleActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessenedEnd3 + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRainEnd3 jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnEnd3 printstring STRINGID_PKMNMADEITRAIN waitstate @@ -7148,6 +7180,8 @@ BattleScript_HealerActivates:: BattleScript_SandstreamActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessenedEnd3 + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRainEnd3 jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnEnd3 printstring STRINGID_PKMNSXWHIPPEDUPSANDSTORM waitstate @@ -7158,6 +7192,9 @@ BattleScript_SandstreamActivates:: BattleScript_SandSpitActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessenedRet + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRainRet + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnRet printstring STRINGID_ASANDSTORMKICKEDUP waitstate playanimation BS_BATTLER_0, B_ANIM_SANDSTORM_CONTINUES, NULL @@ -7255,6 +7292,8 @@ BattleScript_IntimidatePrevented: BattleScript_DroughtActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessenedEnd3 + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRainEnd3 jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnEnd3 printstring STRINGID_PKMNSXINTENSIFIEDSUN waitstate @@ -7315,6 +7354,8 @@ BattleScript_AttackWeakenedByStrongWinds:: BattleScript_SnowWarningActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessenedEnd3 + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRainEnd3 jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnEnd3 printstring STRINGID_SNOWWARNINGHAIL waitstate diff --git a/src/battle_util.c b/src/battle_util.c index 4e57d3425..59c936b6b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3694,7 +3694,8 @@ bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility) && GetBattlerAbility(battler) != ABILITY_PRIMORDIAL_SEA && GetBattlerAbility(battler) != ABILITY_DELTA_STREAM) { - return FALSE; + weatherEnumId = 0; + return TRUE; } else if (!(gBattleWeather & (sWeatherFlagsInfo[weatherEnumId][0] | sWeatherFlagsInfo[weatherEnumId][1]))) { From fe5a0a7f04bc287f542aec665f498d7b333dafde Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 6 Oct 2021 08:29:53 -0300 Subject: [PATCH 047/193] Oopsie --- data/battle_scripts_1.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index ed34b9461..4948fd470 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7324,7 +7324,7 @@ BattleScript_PrimordialSeaActivates:: call BattleScript_AbilityPopUp printstring STRINGID_HEAVYRAIN waitstate - playanimation BS_BATTLER_0, B_ANIM_SUN_CONTINUES, NULL + playanimation BS_BATTLER_0, B_ANIM_RAIN_CONTINUES, NULL call BattleScript_WeatherFormChanges end3 From b520fe5d89e173217cf7d535129e59068f3f4aed Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 6 Oct 2021 08:38:19 -0300 Subject: [PATCH 048/193] Tweaked Strong Winds' animation --- data/battle_anim_scripts.s | 15 +-------------- .../backgrounds/windstorm_brew.png | Bin 1100 -> 1067 bytes 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 948fe221a..4063885e0 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -24419,20 +24419,7 @@ General_StrongWinds:: createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FLYING_DIRT, 0, 12, 12, RGB(20, 20, 20) waitforvisualfinish createvisualtask AnimTask_LoadWindstormBackground, 5, FALSE - delay 16 - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 10, 2304, 96, 0 - delay 10 - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 90, 2048, 96, 0 - delay 10 - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 50, 2560, 96, 0 - delay 10 - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 20, 2304, 96, 0 - delay 10 - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 70, 1984, 96, 0 - delay 10 - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0, 2816, 96, 0 - delay 10 - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 60, 2560, 96, 0 + delay 32 waitforvisualfinish stopsound end diff --git a/graphics/battle_anims/backgrounds/windstorm_brew.png b/graphics/battle_anims/backgrounds/windstorm_brew.png index c36e720cfe8a114139595802c7642a920f67a831..2a28952662266dc252e5a0b850e41ed187241047 100644 GIT binary patch delta 84 zcmX@Zv6^Fo%EUZl&Av1J)my3xmL^9wg*z8Hnnzpg5!#c+z`(#>;_2(k{*;T2ThY?W oQ}o$H6IBl80#6sm5Rc;<&*d=-bl5)Y1FB>2boFyt=akR{0037Uc>n+a delta 115 zcmZ3@afV}piU50wr>`sfQx171Ex|1uBDxbBRD~EgN(%hk-F;k)8Gyj6K~sLBqM7ck zs|Sv3TefY*ym^y)n`^4l65=+uZb}C#U`+CMcVXyYmGxj?U@q` Date: Wed, 6 Oct 2021 09:10:56 -0300 Subject: [PATCH 049/193] Fixed infinite loop --- data/battle_scripts_1.s | 29 ++++++++++++++--------------- include/battle_scripts.h | 2 ++ src/battle_util.c | 36 +++++++++++++++++++++++++++++++++--- 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4948fd470..5803a0220 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4171,6 +4171,20 @@ BattleScript_MysteriousAirCurrentBlowsOnRet: waitmessage B_WAIT_TIME_LONG return +BattleScript_BlockedByPrimalWeatherEnd3:: + call BattleScript_AbilityPopUp + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessenedEnd3 + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRainEnd3 + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnEnd3 + end3 + +BattleScript_BlockedByPrimalWeatherRet:: + call BattleScript_AbilityPopUp + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessenedRet + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRainRet + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnRet + return + BattleScript_EffectDefenseUpHit:: setmoveeffect MOVE_EFFECT_DEF_PLUS_1 | MOVE_EFFECT_AFFECTS_USER goto BattleScript_EffectHit @@ -7019,9 +7033,6 @@ BattleScript_ItemSteal:: BattleScript_DrizzleActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessenedEnd3 - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRainEnd3 - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnEnd3 printstring STRINGID_PKMNMADEITRAIN waitstate playanimation BS_BATTLER_0, B_ANIM_RAIN_CONTINUES, NULL @@ -7180,9 +7191,6 @@ BattleScript_HealerActivates:: BattleScript_SandstreamActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessenedEnd3 - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRainEnd3 - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnEnd3 printstring STRINGID_PKMNSXWHIPPEDUPSANDSTORM waitstate playanimation BS_BATTLER_0, B_ANIM_SANDSTORM_CONTINUES, NULL @@ -7192,9 +7200,6 @@ BattleScript_SandstreamActivates:: BattleScript_SandSpitActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessenedRet - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRainRet - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnRet printstring STRINGID_ASANDSTORMKICKEDUP waitstate playanimation BS_BATTLER_0, B_ANIM_SANDSTORM_CONTINUES, NULL @@ -7292,9 +7297,6 @@ BattleScript_IntimidatePrevented: BattleScript_DroughtActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessenedEnd3 - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRainEnd3 - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnEnd3 printstring STRINGID_PKMNSXINTENSIFIEDSUN waitstate playanimation BS_BATTLER_0, B_ANIM_SUN_CONTINUES, NULL @@ -7354,9 +7356,6 @@ BattleScript_AttackWeakenedByStrongWinds:: BattleScript_SnowWarningActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessenedEnd3 - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRainEnd3 - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnEnd3 printstring STRINGID_SNOWWARNINGHAIL waitstate playanimation BS_BATTLER_0, B_ANIM_HAIL_CONTINUES, NULL diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 1f22cedd5..cd4600543 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -396,5 +396,7 @@ extern const u8 BattleScript_PrimordialSeaFizzlesOutFireTypeMoves[]; extern const u8 BattleScript_DeltaStreamActivates[]; extern const u8 BattleScript_MysteriousAirCurrentBlowsOn[]; extern const u8 BattleScript_AttackWeakenedByStrongWinds[]; +extern const u8 BattleScript_BlockedByPrimalWeatherEnd3[]; +extern const u8 BattleScript_BlockedByPrimalWeatherRet[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/src/battle_util.c b/src/battle_util.c index 59c936b6b..282a6ff74 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3694,8 +3694,7 @@ bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility) && GetBattlerAbility(battler) != ABILITY_PRIMORDIAL_SEA && GetBattlerAbility(battler) != ABILITY_DELTA_STREAM) { - weatherEnumId = 0; - return TRUE; + return FALSE; } else if (!(gBattleWeather & (sWeatherFlagsInfo[weatherEnumId][0] | sWeatherFlagsInfo[weatherEnumId][1]))) { @@ -4167,6 +4166,12 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); effect++; } + else if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_PRIMAL_ANY && !gSpecialStatuses[battler].switchInAbilityDone) + { + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_BlockedByPrimalWeatherEnd3); + effect++; + } break; case ABILITY_SAND_STREAM: if (TryChangeBattleWeather(battler, ENUM_WEATHER_SANDSTORM, TRUE)) @@ -4174,6 +4179,12 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates); effect++; } + else if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_PRIMAL_ANY && !gSpecialStatuses[battler].switchInAbilityDone) + { + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_BlockedByPrimalWeatherEnd3); + effect++; + } break; case ABILITY_DROUGHT: if (TryChangeBattleWeather(battler, ENUM_WEATHER_SUN, TRUE)) @@ -4181,6 +4192,12 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates); effect++; } + else if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_PRIMAL_ANY && !gSpecialStatuses[battler].switchInAbilityDone) + { + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_BlockedByPrimalWeatherEnd3); + effect++; + } break; case ABILITY_SNOW_WARNING: if (TryChangeBattleWeather(battler, ENUM_WEATHER_HAIL, TRUE)) @@ -4188,6 +4205,12 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move BattleScriptPushCursorAndCallback(BattleScript_SnowWarningActivates); effect++; } + else if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_PRIMAL_ANY && !gSpecialStatuses[battler].switchInAbilityDone) + { + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_BlockedByPrimalWeatherEnd3); + effect++; + } break; case ABILITY_ELECTRIC_SURGE: if (TryChangeBattleTerrain(battler, STATUS_FIELD_ELECTRIC_TERRAIN, &gFieldTimers.electricTerrainTimer)) @@ -4989,13 +5012,20 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED && !(WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SANDSTORM_ANY) - && TryChangeBattleWeather(battler, ENUM_WEATHER_SANDSTORM, TRUE)) + && TryChangeBattleWeather(battler, ENUM_WEATHER_SANDSTORM, TRUE) + && !(WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_PRIMAL_ANY)) { gBattleScripting.battler = gActiveBattler = battler; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SandSpitActivates; effect++; } + else if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_PRIMAL_ANY) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BlockedByPrimalWeatherRet; + effect++; + } break; case ABILITY_PERISH_BODY: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) From 1ad8448532c33f0962e1bfe8c6838ccc22b23686 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 6 Oct 2021 13:54:33 -0400 Subject: [PATCH 050/193] remove saveblock field --- include/global.h | 3 +-- src/new_game.c | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/include/global.h b/include/global.h index a0aa45d3d..53a6175a2 100644 --- a/include/global.h +++ b/include/global.h @@ -485,8 +485,7 @@ struct SaveBlock2 u16 optionsBattleSceneOff:1; // whether battle animations are disabled u16 regionMapZoom:1; // whether the map is zoomed in /*0x18*/ struct Pokedex pokedex; - /*0x90*/ u16 lastUsedBall; - /*0x92*/ u8 filler_90[0x6]; + /*0x90*/ u8 filler_90[0x8]; /*0x98*/ struct Time localTimeOffset; /*0xA0*/ struct Time lastBerryTreeUpdate; /*0xA8*/ u32 gcnLinkFlags; // Read by Pokemon Colosseum/XD diff --git a/src/new_game.c b/src/new_game.c index c1dd85e90..e0453c9ad 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -205,7 +205,6 @@ void NewGameInitData(void) WipeTrainerNameRecords(); ResetTrainerHillResults(); ResetContestLinkResults(); - gSaveBlock2Ptr->lastUsedBall = ITEM_POKE_BALL; } static void ResetMiniGamesRecords(void) From 3d24fd5f3094a20cf1325607148323e397a6f00c Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 6 Oct 2021 13:56:04 -0400 Subject: [PATCH 051/193] last ball defaults to first bag pocket item --- src/battle_interface.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/battle_interface.c b/src/battle_interface.c index c1f76c6ce..b3bb981c7 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -3206,10 +3206,8 @@ bool32 CanThrowLastUsedBall(void) void TryAddLastUsedBallItemSprites(void) { #if B_LAST_USED_BALL == TRUE - if (gLastThrownBall == 0) - gLastThrownBall = ITEM_POKE_BALL; - - if (gLastThrownBall != 0 && !CheckBagHasItem(gLastThrownBall, 1)) + if ((gLastThrownBall == 0 + || (gLastThrownBall != 0 && !CheckBagHasItem(gLastThrownBall, 1))) { // we're out of the last used ball, so just set it to the first ball in the bag // we have to compact the bag first bc it is typically only compacted when you open it From 33d19d4e348a5bdf0009ebe488e61a78684ca00a Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 6 Oct 2021 14:19:15 -0400 Subject: [PATCH 052/193] syntax fix --- src/battle_interface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_interface.c b/src/battle_interface.c index b3bb981c7..0e33455ac 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -3206,7 +3206,7 @@ bool32 CanThrowLastUsedBall(void) void TryAddLastUsedBallItemSprites(void) { #if B_LAST_USED_BALL == TRUE - if ((gLastThrownBall == 0 + if (gLastThrownBall == 0 || (gLastThrownBall != 0 && !CheckBagHasItem(gLastThrownBall, 1))) { // we're out of the last used ball, so just set it to the first ball in the bag From 11f4f0f08e42a2d6b9c0ba56b9938e755601ea7e Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 6 Oct 2021 14:41:48 -0400 Subject: [PATCH 053/193] update move data to those that target all battlers --- src/data/battle_moves.h | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index a63aca114..98b30951e 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -1789,7 +1789,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 30, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, .split = SPLIT_STATUS, @@ -3100,7 +3100,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = FLAG_SOUND, .split = SPLIT_STATUS, @@ -3204,7 +3204,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = 0, .split = SPLIT_STATUS, @@ -3804,7 +3804,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = 0, .split = SPLIT_STATUS, @@ -3818,7 +3818,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = 0, .split = SPLIT_STATUS, @@ -4125,7 +4125,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, .split = SPLIT_STATUS, @@ -4768,7 +4768,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = 0, .split = SPLIT_STATUS, @@ -5504,7 +5504,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = 0, .split = SPLIT_STATUS, @@ -5661,7 +5661,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = 0, .split = SPLIT_STATUS, @@ -6875,7 +6875,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = -7, .flags = FLAG_MIRROR_MOVE_AFFECTED, .split = SPLIT_STATUS, @@ -7478,7 +7478,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .flags = FLAG_MIRROR_MOVE_AFFECTED, .split = SPLIT_STATUS, }, @@ -7570,7 +7570,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .flags = FLAG_MIRROR_MOVE_AFFECTED, .split = SPLIT_STATUS, }, @@ -8932,7 +8932,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 25, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 1, .flags = 0, .split = SPLIT_STATUS, @@ -9097,7 +9097,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = 0, .split = SPLIT_STATUS, @@ -9111,7 +9111,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = 0, .split = SPLIT_STATUS, @@ -9195,7 +9195,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = FLAG_MIRROR_MOVE_AFFECTED, .split = SPLIT_STATUS, @@ -9445,7 +9445,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = 0, .split = SPLIT_STATUS, @@ -9965,7 +9965,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = 0, .split = SPLIT_STATUS, @@ -10848,7 +10848,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = 0, .split = SPLIT_STATUS, @@ -10904,7 +10904,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .flags = FLAG_MIRROR_MOVE_AFFECTED, .split = SPLIT_STATUS, From 5f5df066d618a6383dc2858460d5e2076f18d7a5 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 6 Oct 2021 15:18:42 -0400 Subject: [PATCH 054/193] fix perish song + soundproof --- data/battle_scripts_1.s | 1 + src/battle_util.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0615e1239..0939b5b18 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3878,6 +3878,7 @@ BattleScript_PerishSongLoopIncrement:: goto BattleScript_MoveEnd BattleScript_PerishSongBlocked:: + copybyte sBATTLER, gBattlerTarget printstring STRINGID_PKMNSXBLOCKSY2 waitmessage B_WAIT_TIME_LONG goto BattleScript_PerishSongLoopIncrement diff --git a/src/battle_util.c b/src/battle_util.c index a709aaf9e..cd5997f1f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4458,7 +4458,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move } break; case ABILITYEFFECT_MOVES_BLOCK: // 2 - if ((gLastUsedAbility == ABILITY_SOUNDPROOF && gBattleMoves[move].flags & FLAG_SOUND) + if ((gLastUsedAbility == ABILITY_SOUNDPROOF && gBattleMoves[move].flags & FLAG_SOUND && gCurrentMove != MOVE_PERISH_SONG) || (gLastUsedAbility == ABILITY_BULLETPROOF && gBattleMoves[move].flags & FLAG_BALLISTIC)) { if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) From 1afc43a0e8259ad1b1f025f544cfec1884c68fdb Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 6 Oct 2021 15:30:44 -0400 Subject: [PATCH 055/193] fix DoesSubstituteBlockMove calls --- src/battle_script_commands.c | 6 +++--- src/battle_util.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 12f7763e3..35c5fee1a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5139,7 +5139,7 @@ static void Cmd_moveend(void) // Attacker is the damage-dealer, battler is mon to be switched out if (IsBattlerAlive(battler) && GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_EJECT_BUTTON - && !DoesSubstituteBlockMove(gCurrentMove, gBattlerAttacker, battler) + && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && (gSpecialStatuses[battler].physicalDmg != 0 || gSpecialStatuses[battler].specialDmg != 0) && CountUsablePartyMons(battler) > 0) // Has mon to switch into { @@ -5173,7 +5173,7 @@ static void Cmd_moveend(void) // Attacker is the one to be switched out, battler is one with red card if (battler != gBattlerAttacker && IsBattlerAlive(battler) - && !DoesSubstituteBlockMove(gCurrentMove, gBattlerAttacker, battler) + && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_RED_CARD && (gSpecialStatuses[battler].physicalDmg != 0 || gSpecialStatuses[battler].specialDmg != 0) && CanBattlerSwitch(gBattlerAttacker)) @@ -5240,7 +5240,7 @@ static void Cmd_moveend(void) if (battler != gBattlerAttacker // Cannot pickpocket yourself && GetBattlerAbility(battler) == ABILITY_PICKPOCKET // Target must have pickpocket ability && BATTLER_DAMAGED(battler) // Target needs to have been damaged - && !DoesSubstituteBlockMove(gCurrentMove, gBattlerAttacker, battler) // Subsitute unaffected + && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) // Subsitute unaffected && IsBattlerAlive(battler) // Battler must be alive to pickpocket && gBattleMons[battler].item == ITEM_NONE // Pickpocketer can't have an item already && CanStealItem(battler, gBattlerAttacker, gBattleMons[gBattlerAttacker].item)) // Cannot steal plates, mega stones, etc diff --git a/src/battle_util.c b/src/battle_util.c index a709aaf9e..31e5e14fc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6810,7 +6810,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) if (TARGET_TURN_DAMAGED && (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) && IsMoveMakingContact(gCurrentMove, gBattlerAttacker) - && !DoesSubstituteBlockMove(gCurrentMove, gBattlerAttacker, battlerId) + && !DoesSubstituteBlockMove(gBattlerAttacker, battlerId, gCurrentMove) && IsBattlerAlive(gBattlerAttacker) && CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) && gBattleMons[gBattlerAttacker].item == ITEM_NONE) From 7548e74013197b6e22f816c5080c5e1b1766d0ea Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 7 Oct 2021 00:41:33 -0300 Subject: [PATCH 056/193] Forgot to clear the primal weathers in some places --- data/battle_scripts_1.s | 18 ++++++++++++++++++ src/battle_script_commands.c | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 5803a0220..4e11922ff 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -737,6 +737,9 @@ BattleScript_EffectPartingShotSwitch: getswitchedmondata BS_ATTACKER switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER + trytoclearprimalweather + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 printstring STRINGID_SWITCHINMON switchinanim BS_ATTACKER, TRUE waitstate @@ -1789,6 +1792,9 @@ BattleScript_EffectHealingWish: getswitchedmondata BS_ATTACKER switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER + trytoclearprimalweather + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 printstring STRINGID_SWITCHINMON switchinanim BS_ATTACKER, TRUE waitstate @@ -2148,6 +2154,9 @@ BattleScript_EffectHitEscape: getswitchedmondata BS_ATTACKER switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER + trytoclearprimalweather + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 printstring STRINGID_SWITCHINMON switchinanim BS_ATTACKER, TRUE waitstate @@ -4026,6 +4035,9 @@ BattleScript_EffectBatonPass:: getswitchedmondata BS_ATTACKER switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER + trytoclearprimalweather + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 printstring STRINGID_SWITCHINMON switchinanim BS_ATTACKER, TRUE waitstate @@ -5862,6 +5874,9 @@ BattleScript_RoarSuccessSwitch:: call BattleScript_RoarSuccessRet getswitchedmondata BS_TARGET switchindataupdate BS_TARGET + trytoclearprimalweather + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 switchinanim BS_TARGET, FALSE waitstate printstring STRINGID_PKMNWASDRAGGEDOUT @@ -8535,6 +8550,9 @@ BattleScript_EjectButtonActivates:: getswitchedmondata BS_SCRIPTING switchindataupdate BS_SCRIPTING hpthresholds BS_SCRIPTING + trytoclearprimalweather + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 printstring 0x3 switchinanim BS_SCRIPTING 0x1 waitstate diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1fd7daea5..8f059df28 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8775,7 +8775,7 @@ static void Cmd_various(void) } gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; // remove the terrain break; - case VARIOUS_JUMP_IF_PRANKSTER_BLOCKED: + case VARIOUS_JUMP_IF_PRANKSTER_BLOCKED: if (BlocksPrankster(gCurrentMove, gBattlerAttacker, gActiveBattler)) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); else From 359da5313e0c472e65afc5533e82d54e53b3365b Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 7 Oct 2021 00:56:13 -0300 Subject: [PATCH 057/193] Handled some edge cases Gastro Acid, Worry Seed, Simple Beam, Core Enforcer and Transform --- data/battle_scripts_1.s | 15 +++++++++++++++ src/battle_script_commands.c | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4e11922ff..32f741f65 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -645,6 +645,9 @@ BattleScript_MoveEffectCoreEnforcer:: setgastroacid BattleScript_CoreEnforcerRet printstring STRINGID_PKMNSABILITYSUPPRESSED waitmessage B_WAIT_TIME_LONG + trytoclearprimalweather + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 BattleScript_CoreEnforcerRet: return @@ -1744,6 +1747,9 @@ BattleScript_EffectSimpleBeam: waitanimation printstring STRINGID_PKMNACQUIREDSIMPLE waitmessage B_WAIT_TIME_LONG + trytoclearprimalweather + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 goto BattleScript_MoveEnd BattleScript_EffectSuckerPunch: @@ -1832,6 +1838,9 @@ BattleScript_EffectWorrySeed: waitanimation printstring STRINGID_PKMNACQUIREDABILITY waitmessage B_WAIT_TIME_LONG + trytoclearprimalweather + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 goto BattleScript_MoveEnd BattleScript_EffectPowerSplit: @@ -1960,6 +1969,9 @@ BattleScript_EffectGastroAcid: waitanimation printstring STRINGID_PKMNSABILITYSUPPRESSED waitmessage B_WAIT_TIME_LONG + trytoclearprimalweather + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 goto BattleScript_MoveEnd BattleScript_EffectToxicSpikes: @@ -3095,6 +3107,9 @@ BattleScript_EffectTransform:: attackcanceler attackstring ppreduce + trytoclearprimalweather + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 transformdataexecution attackanimation waitanimation diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 8f059df28..a372582da 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8790,7 +8790,8 @@ static void Cmd_various(void) if (((GetBattlerAbility(i) == ABILITY_DESOLATE_LAND && gBattleWeather & WEATHER_SUN_PRIMAL) || (GetBattlerAbility(i) == ABILITY_PRIMORDIAL_SEA && gBattleWeather & WEATHER_RAIN_PRIMAL) || (GetBattlerAbility(i) == ABILITY_DELTA_STREAM && gBattleWeather & WEATHER_STRONG_WINDS)) - && IsBattlerAlive(i)) + && IsBattlerAlive(i) + && !(gStatuses3[i] & STATUS3_GASTRO_ACID)) shouldNotClear = TRUE; } if (gBattleWeather & WEATHER_SUN_PRIMAL && !shouldNotClear) From db0d9f62358f8dfd44ff4bd5e5042c5f451a9762 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Fri, 8 Oct 2021 08:22:49 -0400 Subject: [PATCH 058/193] sound moves targeting user not blocked by own soundproof --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index cd5997f1f..81389effd 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4458,7 +4458,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move } break; case ABILITYEFFECT_MOVES_BLOCK: // 2 - if ((gLastUsedAbility == ABILITY_SOUNDPROOF && gBattleMoves[move].flags & FLAG_SOUND && gCurrentMove != MOVE_PERISH_SONG) + if ((gLastUsedAbility == ABILITY_SOUNDPROOF && gBattleMoves[move].flags & FLAG_SOUND && !(gBattleMoves[move].target & MOVE_TARGET_USER)) || (gLastUsedAbility == ABILITY_BULLETPROOF && gBattleMoves[move].flags & FLAG_BALLISTIC)) { if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) From 274e964d9144a9b2c64710d8a4b0150e06899fde Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 9 Oct 2021 15:05:01 +1300 Subject: [PATCH 059/193] Fix Safety Googles Fix typo and update gLastUsedItem before calling the safety goggles battle script. --- data/battle_scripts_1.s | 2 +- include/constants/battle_string_ids.h | 2 +- include/constants/hold_effects.h | 2 +- src/battle_ai_util.c | 10 +++++----- src/battle_debug.c | 4 ++-- src/battle_message.c | 4 ++-- src/battle_script_commands.c | 4 ++-- src/battle_util.c | 7 ++++--- 8 files changed, 18 insertions(+), 17 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 67f7762ac..38538747b 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6797,7 +6797,7 @@ BattleScript_PowderMoveNoEffect:: pause B_WAIT_TIME_SHORT jumpiftype BS_TARGET, TYPE_GRASS, BattleScript_PowderMoveNoEffectPrint jumpifability BS_TARGET, ABILITY_OVERCOAT, BattleScript_PowderMoveNoEffectOvercoat - printstring STRINGID_SAFETYGOOGLESPROTECTED + printstring STRINGID_SAFETYGOGGLESPROTECTED goto BattleScript_PowderMoveNoEffectWaitMsg BattleScript_PowderMoveNoEffectOvercoat: call BattleScript_AbilityPopUp diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index b74c9cd14..e8fe7e359 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -523,7 +523,7 @@ #define STRINGID_GRASSYTERRAINHEALS 519 #define STRINGID_ELECTRICTERRAINPREVENTS 520 #define STRINGID_PSYCHICTERRAINPREVENTS 521 -#define STRINGID_SAFETYGOOGLESPROTECTED 522 +#define STRINGID_SAFETYGOGGLESPROTECTED 522 #define STRINGID_FLOWERVEILPROTECTED 523 #define STRINGID_SWEETVEILPROTECTED 524 #define STRINGID_AROMAVEILPROTECTED 525 diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 3dc4a1389..d7d74d3e1 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -130,7 +130,7 @@ // Gen6 hold effects #define HOLD_EFFECT_FAIRY_POWER 139 #define HOLD_EFFECT_MEGA_STONE 140 -#define HOLD_EFFECT_SAFETY_GOOGLES 141 +#define HOLD_EFFECT_SAFETY_GOGGLES 141 #define HOLD_EFFECT_LUMINOUS_MOSS 142 #define HOLD_EFFECT_SNOWBALL 143 #define HOLD_EFFECT_WEAKNESS_POLICY 144 diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 95d979e94..fef6e6c6f 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -643,7 +643,7 @@ bool32 IsAffectedByPowder(u8 battler, u16 ability, u16 holdEffect) { if ((B_POWDER_GRASS >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) || ability == ABILITY_OVERCOAT - || holdEffect == HOLD_EFFECT_SAFETY_GOOGLES) + || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES) return FALSE; return TRUE; } @@ -1448,7 +1448,7 @@ bool32 ShouldSetSandstorm(u8 battler, u16 ability, u16 holdEffect) || ability == ABILITY_SAND_FORCE || ability == ABILITY_OVERCOAT || ability == ABILITY_MAGIC_GUARD - || holdEffect == HOLD_EFFECT_SAFETY_GOOGLES + || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES || IS_BATTLER_OF_TYPE(battler, TYPE_ROCK) || IS_BATTLER_OF_TYPE(battler, TYPE_STEEL) || IS_BATTLER_OF_TYPE(battler, TYPE_GROUND) @@ -1473,7 +1473,7 @@ bool32 ShouldSetHail(u8 battler, u16 ability, u16 holdEffect) || ability == ABILITY_SLUSH_RUSH || ability == ABILITY_MAGIC_GUARD || ability == ABILITY_OVERCOAT - || holdEffect == HOLD_EFFECT_SAFETY_GOOGLES + || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) || HasMove(battler, MOVE_BLIZZARD) || HasMoveEffect(battler, EFFECT_AURORA_VEIL) @@ -2273,7 +2273,7 @@ static u32 GetWeatherDamage(u8 battlerId) { if (BattlerAffectedBySandstorm(battlerId, ability) && !(gStatuses3[battlerId] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - && holdEffect != HOLD_EFFECT_SAFETY_GOOGLES) + && holdEffect != HOLD_EFFECT_SAFETY_GOGGLES) { damage = gBattleMons[battlerId].maxHP / 16; if (damage == 0) @@ -2284,7 +2284,7 @@ static u32 GetWeatherDamage(u8 battlerId) { if (BattlerAffectedByHail(battlerId, ability) && !(gStatuses3[battlerId] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - && holdEffect != HOLD_EFFECT_SAFETY_GOOGLES) + && holdEffect != HOLD_EFFECT_SAFETY_GOGGLES) { damage = gBattleMons[battlerId].maxHP / 16; if (damage == 0) diff --git a/src/battle_debug.c b/src/battle_debug.c index b9cfcdc03..ce5aa4a97 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1951,7 +1951,7 @@ static const u8 sText_HoldEffectAbsorbBulb[] = _("Absorb Bulb"); static const u8 sText_HoldEffectCellBattery[] = _("Cell Battery"); static const u8 sText_HoldEffectFairyPower[] = _("Fairy Power"); static const u8 sText_HoldEffectMegaStone[] = _("Mega Stone"); -static const u8 sText_HoldEffectSafetyGoogles[] = _("Safety Googles"); +static const u8 sText_HoldEffectSafetyGoggles[] = _("Safety Goggles"); static const u8 sText_HoldEffectLuminousMoss[] = _("Luminous Moss"); static const u8 sText_HoldEffectSnowball[] = _("Snowball"); static const u8 sText_HoldEffectWeaknessPolicy[] = _("Weakness Policy"); @@ -2091,7 +2091,7 @@ static const u8 *const sHoldEffectNames[] = [HOLD_EFFECT_CELL_BATTERY] = sText_HoldEffectCellBattery, [HOLD_EFFECT_FAIRY_POWER] = sText_HoldEffectFairyPower, [HOLD_EFFECT_MEGA_STONE] = sText_HoldEffectMegaStone, - [HOLD_EFFECT_SAFETY_GOOGLES] = sText_HoldEffectSafetyGoogles, + [HOLD_EFFECT_SAFETY_GOGGLES] = sText_HoldEffectSafetyGoggles, [HOLD_EFFECT_LUMINOUS_MOSS] = sText_HoldEffectLuminousMoss, [HOLD_EFFECT_SNOWBALL] = sText_HoldEffectSnowball, [HOLD_EFFECT_WEAKNESS_POLICY] = sText_HoldEffectWeaknessPolicy, diff --git a/src/battle_message.c b/src/battle_message.c index f8df8f4b8..69463ce69 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -653,7 +653,7 @@ static const u8 sText_MistyTerrainPreventsStatus[] = _("{B_DEF_NAME_WITH_PREFIX} static const u8 sText_GrassyTerrainHeals[] = _("{B_ATK_NAME_WITH_PREFIX} is healed\nby the grassy terrain!"); static const u8 sText_ElectricTerrainPreventsSleep[] = _("{B_DEF_NAME_WITH_PREFIX} surrounds itself\nwith electrified terrain!"); static const u8 sText_PsychicTerrainPreventsPriority[] = _("{B_DEF_NAME_WITH_PREFIX} surrounds itself\nwith psychic terrain!"); -static const u8 sText_SafetyGooglesProtected[] = _("{B_DEF_NAME_WITH_PREFIX} is not affected\nthanks to its {B_LAST_ITEM}!"); +static const u8 sText_SafetyGogglesProtected[] = _("{B_DEF_NAME_WITH_PREFIX} is not affected\nthanks to its {B_LAST_ITEM}!"); static const u8 sText_FlowerVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} surrounded itself\nwith a veil of petals!"); static const u8 sText_SweetVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} surrounded itself\nwith a veil of sweetness!"); static const u8 sText_AromaVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} is protected\nby an aromatic veil!"); @@ -780,7 +780,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_AROMAVEILPROTECTED - 12] = sText_AromaVeilProtected, [STRINGID_SWEETVEILPROTECTED - 12] = sText_SweetVeilProtected, [STRINGID_FLOWERVEILPROTECTED - 12] = sText_FlowerVeilProtected, - [STRINGID_SAFETYGOOGLESPROTECTED - 12] = sText_SafetyGooglesProtected, + [STRINGID_SAFETYGOGGLESPROTECTED - 12] = sText_SafetyGogglesProtected, [STRINGID_SPECTRALTHIEFSTEAL - 12] = sText_SpectralThiefSteal, [STRINGID_BELCHCANTSELECT - 12] = sText_BelchCantUse, [STRINGID_TRAINER1LOSETEXT - 12] = sText_Trainer1LoseText, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 3b627a020..5e5d19750 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10129,7 +10129,7 @@ static void Cmd_weatherdamage(void) && ability != ABILITY_SAND_RUSH && ability != ABILITY_OVERCOAT && !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOOGLES) + && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; if (gBattleMoveDamage == 0) @@ -10154,7 +10154,7 @@ static void Cmd_weatherdamage(void) && ability != ABILITY_OVERCOAT && ability != ABILITY_ICE_BODY && !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOOGLES) + && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; if (gBattleMoveDamage == 0) diff --git a/src/battle_util.c b/src/battle_util.c index 01ee1a691..34855ecd3 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3386,9 +3386,10 @@ u8 AtkCanceller_UnableToUseMove(void) gBattlerAbility = gBattlerTarget; effect = 1; } - else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_SAFETY_GOOGLES) + else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_SAFETY_GOGGLES) { - RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_SAFETY_GOOGLES); + RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_SAFETY_GOGGLES); + gLastUsedItem = gBattleMons[gBattlerTarget].item; effect = 1; } @@ -4882,7 +4883,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move case ABILITY_EFFECT_SPORE: if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GRASS) && GetBattlerAbility(gBattlerAttacker) != ABILITY_OVERCOAT - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOOGLES) + && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES) { i = Random() % 3; if (i == 0) From 91a68cd5dbcadf8123d9f7da7cbf5ed6cf505475 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 25 Aug 2021 03:35:21 -0300 Subject: [PATCH 060/193] Implemented Primal Reversion --- asm/macros/battle_script.inc | 10 ++ data/battle_anim_scripts.s | 93 +++++++++++++++-- data/battle_scripts_1.s | 30 ++++++ .../battle_anims/sprites/alpha_symbol.png | Bin 0 -> 263 bytes .../battle_anims/sprites/omega_symbol.png | Bin 0 -> 349 bytes .../battle_anims/sprites/primal_particles.png | Bin 0 -> 510 bytes graphics/battle_interface/alpha_indicator.png | Bin 0 -> 266 bytes graphics/battle_interface/omega_indicator.png | Bin 0 -> 271 bytes include/battle.h | 4 + include/battle_interface.h | 10 +- include/battle_scripts.h | 1 + include/constants/battle_anim.h | 4 + include/constants/battle_script_commands.h | 2 + include/constants/battle_string_ids.h | 3 +- include/constants/pokemon.h | 54 ++++++---- include/graphics.h | 6 ++ src/battle_anim.c | 6 ++ src/battle_anim_effects_3.c | 55 ++++++++++ src/battle_anim_new.c | 10 ++ src/battle_interface.c | 95 ++++++++++++++++-- src/battle_main.c | 12 +++ src/battle_message.c | 2 + src/battle_script_commands.c | 70 ++++++++++++- src/battle_util.c | 28 +++++- src/graphics.c | 9 ++ 25 files changed, 455 insertions(+), 49 deletions(-) create mode 100644 graphics/battle_anims/sprites/alpha_symbol.png create mode 100644 graphics/battle_anims/sprites/omega_symbol.png create mode 100644 graphics/battle_anims/sprites/primal_particles.png create mode 100644 graphics/battle_interface/alpha_indicator.png create mode 100644 graphics/battle_interface/omega_indicator.png diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 4d8fe0365..3f0b52340 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1543,6 +1543,11 @@ .byte \case .endm + .macro handleprimalreversion battler:req, case:req + various \battler, VARIOUS_HANDLE_PRIMAL_REVERSION + .byte \case + .endm + .macro handleformchange battler:req, case:req various \battler, VARIOUS_HANDLE_FORM_CHANGE .byte \case @@ -1825,6 +1830,11 @@ various BS_ATTACKER, VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER .endm + .macro jumpifcantreverttoprimal ptr:req + various BS_ATTACKER, VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 4063885e0..808049d21 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -4,6 +4,7 @@ #include "constants/songs.h" #include "constants/moves.h" #include "constants/pokemon.h" +#include "constants/items.h" .include "asm/macros.inc" .include "asm/macros/battle_anim_script.inc" .include "constants/constants.inc" @@ -824,6 +825,7 @@ gBattleAnims_General:: .4byte General_TotemFlare @ B_ANIM_TOTEM_FLARE .4byte General_GulpMissile @ B_ANIM_GULP_MISSILE .4byte General_StrongWinds @ B_ANIM_STRONG_WINDS + .4byte General_PrimalReversion @ B_ANIM_PRIMAL_REVERSION .align 2 gBattleAnims_Special:: @@ -24399,6 +24401,17 @@ General_TotemFlare:: clearmonbg ANIM_ATTACKER end +RainbowEndureEffect: + launchtemplate gBlueEndureEnergySpriteTemplate 0x2 0x4 0x0 0xffe8 0x1a 0x2 + delay 0x3 + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0xe 0x1c 0x1 @Red Buff + delay 0x3 + launchtemplate gGreenEndureEnergySpriteTemplate 0x2 0x4 0x0 0xfffb 0xa 0x2 + delay 0x3 + launchtemplate gYellowEndureEnergySpriteTemplate 0x2 0x4 0x0 0x1c 0x1a 0x3 + delay 0x3 + return + General_GulpMissile: @ Tackle anim (placeholder) loadspritegfx ANIM_TAG_IMPACT monbg ANIM_ATTACKER @@ -24424,15 +24437,77 @@ General_StrongWinds:: stopsound end -RainbowEndureEffect: - launchtemplate gBlueEndureEnergySpriteTemplate 0x2 0x4 0x0 0xffe8 0x1a 0x2 - delay 0x3 - launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0xe 0x1c 0x1 @Red Buff - delay 0x3 - launchtemplate gGreenEndureEnergySpriteTemplate 0x2 0x4 0x0 0xfffb 0xa 0x2 - delay 0x3 - launchtemplate gYellowEndureEnergySpriteTemplate 0x2 0x4 0x0 0x1c 0x1a 0x3 - delay 0x3 +General_PrimalReversion:: + launchtask AnimTask_PrimalReversion 0x5 0x0 + jumpargeq 0x0, ITEM_RED_ORB, General_PrimalReversion_Omega + jumpargeq 0x1, ITEM_BLUE_ORB, General_PrimalReversion_Alpha +General_PrimalReversion_Alpha: + loadspritegfx ANIM_TAG_ALPHA_STONE + loadspritegfx ANIM_TAG_PRIMAL_PARTICLES + loadspritegfx ANIM_TAG_ALPHA_SYMBOL + monbg ANIM_ATTACKER + setalpha 12, 8 + loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 13, 3 + createvisualtask AnimTask_BlendColorCycle, 2, 2, 0, 6, 0, 11, RGB(31, 31, 11) + call PrimalReversionParticles + call PrimalReversionParticles + call PrimalReversionParticles + waitforvisualfinish + playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER + createsprite gAlphaStoneSpriteTemplate, ANIM_ATTACKER, 41, 0, 0, 0, 0 + delay 20 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA + waitforvisualfinish + createvisualtask AnimTask_TransformMon, 2, 0, 1 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA + createvisualtask AnimTask_HorizontalShake, 5, 1, 5, 14 + waitforvisualfinish + createsprite gAlphaSymbolSpriteTemplate ANIM_ATTACKER, 2 + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + blendoff + end +General_PrimalReversion_Omega: + loadspritegfx ANIM_TAG_OMEGA_STONE + loadspritegfx ANIM_TAG_PRIMAL_PARTICLES + loadspritegfx ANIM_TAG_OMEGA_SYMBOL + monbg ANIM_ATTACKER + setalpha 12, 8 + loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 13, 3 + createvisualtask AnimTask_BlendColorCycle, 2, 2, 0, 6, 0, 11, RGB(31, 31, 11) + call PrimalReversionParticles + call PrimalReversionParticles + call PrimalReversionParticles + waitforvisualfinish + playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER + createsprite gOmegaStoneSpriteTemplate, ANIM_ATTACKER, 41, 0, 0, 0, 0 + delay 20 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA + waitforvisualfinish + createvisualtask AnimTask_TransformMon, 2, 0, 1 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA + createvisualtask AnimTask_HorizontalShake, 5, 1, 5, 14 + waitforvisualfinish + createsprite gOmegaSymbolSpriteTemplate ANIM_ATTACKER, 2 + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + blendoff + end +PrimalReversionParticles: + createsprite gPrimalParticlesSpriteTemplate, ANIM_ATTACKER, 2, 40, -10, 13 + delay 3 + createsprite gPrimalParticlesSpriteTemplate, ANIM_ATTACKER, 2, -35, -10, 13 + delay 3 + createsprite gPrimalParticlesSpriteTemplate, ANIM_ATTACKER, 2, 15, -40, 13 + delay 3 + createsprite gPrimalParticlesSpriteTemplate, ANIM_ATTACKER, 2, -10, -32, 13 + delay 3 + createsprite gPrimalParticlesSpriteTemplate, ANIM_ATTACKER, 2, 25, -20, 13 + delay 3 + createsprite gPrimalParticlesSpriteTemplate, ANIM_ATTACKER, 2, -40, -20, 13 + delay 3 + createsprite gPrimalParticlesSpriteTemplate, ANIM_ATTACKER, 2, 5, -40, 13 + delay 3 return SnatchMoveTrySwapFromSubstitute: diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 67f7762ac..4ec6423ed 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5599,6 +5599,9 @@ BattleScript_DoSwitchOut:: hidepartystatussummary BS_ATTACKER switchinanim BS_ATTACKER, FALSE waitstate + jumpifcantreverttoprimal BattleScript_DoSwitchOut2 + call BattleScript_PrimalReversionRet +BattleScript_DoSwitchOut2: switchineffects BS_ATTACKER moveendcase MOVEEND_STATUS_IMMUNITY_ABILITIES moveendcase MOVEEND_MIRROR_MOVE @@ -6625,6 +6628,33 @@ BattleScript_WishMegaEvolution:: switchinabilities BS_ATTACKER end2 +BattleScript_PrimalReversion:: + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 + setbyte gIsCriticalHit, 0 + handleprimalreversion BS_ATTACKER, 0 + handleprimalreversion BS_ATTACKER, 1 + playanimation BS_ATTACKER, B_ANIM_PRIMAL_REVERSION, NULL + waitanimation + handleprimalreversion BS_ATTACKER, 2 + printstring STRINGID_PKMNREVERTEDTOPRIMAL + waitmessage B_WAIT_TIME_LONG + switchinabilities BS_ATTACKER + end2 + +BattleScript_PrimalReversionRet:: + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 + setbyte gIsCriticalHit, 0 + handleprimalreversion BS_ATTACKER, 0 + handleprimalreversion BS_ATTACKER, 1 + playanimation BS_ATTACKER, B_ANIM_PRIMAL_REVERSION, NULL + waitanimation + handleprimalreversion BS_ATTACKER, 2 + printstring STRINGID_PKMNREVERTEDTOPRIMAL + waitmessage B_WAIT_TIME_LONG + return + BattleScript_AttackerFormChange:: pause 5 copybyte gBattlerAbility, gBattlerAttacker diff --git a/graphics/battle_anims/sprites/alpha_symbol.png b/graphics/battle_anims/sprites/alpha_symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..34ff13de351a1ecb8ec9ac7ab941022c081b048f GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*NOux4*dAh@Z*QVfgcPF zKY+sc0dIi-6Hvt@PZ!4!jfr!EPV*i$;5eR}0;weg6yIB90M#%idAqy(U&{XJD3H_W z>EaktF=uVSUC9FmEGf)64ZKPJ?`nmE6?A^fM&P zv1oJ1E|*Eh%NKb|@Eo|uBa`oiD?Oh7bk7N#DzUX9=4T?v^`5SNF6*2UngH8O BZ8`t| literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/primal_particles.png b/graphics/battle_anims/sprites/primal_particles.png new file mode 100644 index 0000000000000000000000000000000000000000..6fdf09d96e0d606f5253e5ed18da3c272120e6ce GIT binary patch literal 510 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIi1;V5)EKCOG0EHAg;|it=M#{_S>O>_%)r2R1cVu< zYV%101=&kHeO=k_v+;>Y%TBb>0$R^-!qdeuMB;MkSzAA6Ljjftm4S70^!7P!X%c?J zx+ueSZqwV#8y5LIH!JaLcR5@*^ZAE0>`j^9Cfg`8ALfgA)2R6Tu2V|CBd6-7XF6I< zXE=;s`@AUD;Xm-|NOoDo&iNZcoH&Dx!^FC;kotR)G0UiF^6U!J>Hw}q4M{;9{;^}p4Yc+{(W|*rs(G7+07lj71mug zd;WDF7kn9csjh*UuAxbYp@o%^xs{P6 VL_^=Zwnsn>44$rjF6*2UngE>NybAyT literal 0 HcmV?d00001 diff --git a/graphics/battle_interface/alpha_indicator.png b/graphics/battle_interface/alpha_indicator.png new file mode 100644 index 0000000000000000000000000000000000000000..0e302576b6aced8d385e93eee3a2919ea2e4d1c3 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF|4}nTJN(%hkfilKGHiK7#raX{hNq6*h zWMJ6X&;2Kn705RT@CkAK&%mHie?!1~&W;BkI(9q&3gZVW>MkqO6D zAV<&B#WAE}PIAHmF@cb#3q8l0_!8PSb#D}yk*JZ;aV$X0q-{l-QCO2kT0j#A14Dl= V^X1G4%?}`pJYD@<);T3K0RZ%8M?wGq literal 0 HcmV?d00001 diff --git a/graphics/battle_interface/omega_indicator.png b/graphics/battle_interface/omega_indicator.png new file mode 100644 index 0000000000000000000000000000000000000000..c56d51c151e6c578e4a8935a7cf6bd4efaceb009 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@n0>&h7cbET5**_fx za*RD)978JRBquBo69{U%(4*zVme4k_TfyaohrlU=5D_6Z<2fR&AqRNGl9Smx%#xE0 ZSQ$DpnC~sh`gIy)nWw9t%Q~loCIEHMMaKXD literal 0 HcmV?d00001 diff --git a/include/battle.h b/include/battle.h index 3aa78f50c..765313311 100644 --- a/include/battle.h +++ b/include/battle.h @@ -461,10 +461,14 @@ struct MegaEvolutionData bool8 alreadyEvolved[4]; // Array id is used for mon position. u16 evolvedSpecies[MAX_BATTLERS_COUNT]; u16 playerEvolvedSpecies; + u8 primalRevertedPartyIds[2]; // As flags using gBitTable; + u16 primalRevertedSpecies[MAX_BATTLERS_COUNT]; + u16 playerPrimalRevertedSpecies; u8 battlerId; bool8 playerSelect; u8 triggerSpriteId; bool8 isWishMegaEvo; + bool8 isPrimalReversion; }; struct Illusion diff --git a/include/battle_interface.h b/include/battle_interface.h index 0bcadaaac..bd0a4f2dd 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -39,16 +39,20 @@ enum #define TAG_STATUS_SUMMARY_BAR_TILE 0xD70C #define TAG_STATUS_SUMMARY_BALLS_TILE 0xD714 -#define TAG_MEGA_TRIGGER_TILE 0xD777 +#define TAG_MEGA_TRIGGER_TILE 0xD777 #define TAG_MEGA_INDICATOR_TILE 0xD778 +#define TAG_ALPHA_INDICATOR_TILE 0xD779 +#define TAG_OMEGA_INDICATOR_TILE 0xD77A #define TAG_HEALTHBOX_PAL 0xD6FF #define TAG_HEALTHBAR_PAL 0xD704 #define TAG_STATUS_SUMMARY_BAR_PAL 0xD710 #define TAG_STATUS_SUMMARY_BALLS_PAL 0xD712 -#define TAG_MEGA_TRIGGER_PAL 0xD777 -#define TAG_MEGA_INDICATOR_PAL 0xD778 +#define TAG_MEGA_TRIGGER_PAL 0xD777 +#define TAG_MEGA_INDICATOR_PAL 0xD778 +#define TAG_ALPHA_INDICATOR_PAL 0xD779 +#define TAG_OMEGA_INDICATOR_PAL 0xD77A enum { diff --git a/include/battle_scripts.h b/include/battle_scripts.h index cd4600543..1604d70d5 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -398,5 +398,6 @@ extern const u8 BattleScript_MysteriousAirCurrentBlowsOn[]; extern const u8 BattleScript_AttackWeakenedByStrongWinds[]; extern const u8 BattleScript_BlockedByPrimalWeatherEnd3[]; extern const u8 BattleScript_BlockedByPrimalWeatherRet[]; +extern const u8 BattleScript_PrimalReversion[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 72f4fcd66..7fd515bdf 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -391,6 +391,9 @@ #define ANIM_TAG_DREEPY (ANIM_SPRITES_START + 379) #define ANIM_TAG_ICE_ROCK_SINGLE (ANIM_SPRITES_START + 380) #define ANIM_TAG_STONE_PILLAR_MULTI (ANIM_SPRITES_START + 381) +#define ANIM_TAG_ALPHA_SYMBOL (ANIM_SPRITES_START + 382) +#define ANIM_TAG_OMEGA_SYMBOL (ANIM_SPRITES_START + 383) +#define ANIM_TAG_PRIMAL_PARTICLES (ANIM_SPRITES_START + 384) // battlers #define ANIM_ATTACKER 0 @@ -525,6 +528,7 @@ #define B_ANIM_TOTEM_FLARE 28 // Totem boosts aura flare #define B_ANIM_GULP_MISSILE 29 #define B_ANIM_STRONG_WINDS 30 +#define B_ANIM_PRIMAL_REVERSION 31 // special animations table (gBattleAnims_Special) #define B_ANIM_LVL_UP 0 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index d61eabbf8..c78c550fa 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -185,6 +185,8 @@ #define VARIOUS_REMOVE_TERRAIN 113 #define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 114 #define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 115 +#define VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL 116 +#define VARIOUS_HANDLE_PRIMAL_REVERSION 117 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index b74c9cd14..7b4e6e536 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -592,8 +592,9 @@ #define STRINGID_STRONGWINDSDISSIPATED 588 #define STRINGID_MYSTERIOUSAIRCURRENTBLOWSON 589 #define STRINGID_ATTACKWEAKENEDBSTRONGWINDS 590 +#define STRINGID_PKMNREVERTEDTOPRIMAL 591 -#define BATTLESTRINGS_COUNT 591 +#define BATTLESTRINGS_COUNT 592 // The below IDs are all indexes into battle message tables, // used to determine which of a set of messages to print. diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 742824335..bb176e464 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -336,25 +336,43 @@ #define F_SUMMARY_SCREEN_FLIP_SPRITE 0x80 // Evolution types -#define EVO_MEGA_EVOLUTION 0xffff // Not an actual evolution, used to temporarily mega evolve in battle. -#define EVO_MOVE_MEGA_EVOLUTION 0xfffe // Mega Evolution that checks for a move instead of held item. -#define EVO_FRIENDSHIP 1 // Pokémon levels up with friendship ≥ 220 -#define EVO_FRIENDSHIP_DAY 2 // Pokémon levels up during the day with friendship ≥ 220 -#define EVO_FRIENDSHIP_NIGHT 3 // Pokémon levels up at night with friendship ≥ 220 -#define EVO_LEVEL 4 // Pokémon reaches the specified level -#define EVO_TRADE 5 // Pokémon is traded -#define EVO_TRADE_ITEM 6 // Pokémon is traded while it's holding the specified item -#define EVO_ITEM 7 // specified item is used on Pokémon -#define EVO_LEVEL_ATK_GT_DEF 8 // Pokémon reaches the specified level with attack > defense -#define EVO_LEVEL_ATK_EQ_DEF 9 // Pokémon reaches the specified level with attack = defense -#define EVO_LEVEL_ATK_LT_DEF 10 // Pokémon reaches the specified level with attack < defense -#define EVO_LEVEL_SILCOON 11 // Pokémon reaches the specified level with a Silcoon personality value -#define EVO_LEVEL_CASCOON 12 // Pokémon reaches the specified level with a Cascoon personality value -#define EVO_LEVEL_NINJASK 13 // Pokémon reaches the specified level (special value for Ninjask) -#define EVO_LEVEL_SHEDINJA 14 // Pokémon reaches the specified level (special value for Shedinja) -#define EVO_BEAUTY 15 // Pokémon levels up with beauty ≥ specified value +#define EVO_MEGA_EVOLUTION 0xffff // Not an actual evolution, used to temporarily mega evolve in battle. +#define EVO_MOVE_MEGA_EVOLUTION 0xfffe // Mega Evolution that checks for a move instead of held item. +#define EVO_PRIMAL_REVERSION 0xfffd // Not an actual evolution, used to undergo primal reversion in battle. +#define EVO_FRIENDSHIP 1 // Pokémon levels up with friendship ≥ 220 +#define EVO_FRIENDSHIP_DAY 2 // Pokémon levels up during the day with friendship ≥ 220 +#define EVO_FRIENDSHIP_NIGHT 3 // Pokémon levels up at night with friendship ≥ 220 +#define EVO_LEVEL 4 // Pokémon reaches the specified level +#define EVO_TRADE 5 // Pokémon is traded +#define EVO_TRADE_ITEM 6 // Pokémon is traded while it's holding the specified item +#define EVO_ITEM 7 // specified item is used on Pokémon +#define EVO_LEVEL_ATK_GT_DEF 8 // Pokémon reaches the specified level with attack > defense +#define EVO_LEVEL_ATK_EQ_DEF 9 // Pokémon reaches the specified level with attack = defense +#define EVO_LEVEL_ATK_LT_DEF 10 // Pokémon reaches the specified level with attack < defense +#define EVO_LEVEL_SILCOON 11 // Pokémon reaches the specified level with a Silcoon personality value +#define EVO_LEVEL_CASCOON 12 // Pokémon reaches the specified level with a Cascoon personality value +#define EVO_LEVEL_NINJASK 13 // Pokémon reaches the specified level (special value for Ninjask) +#define EVO_LEVEL_SHEDINJA 14 // Pokémon reaches the specified level (special value for Shedinja) +#define EVO_BEAUTY 15 // Pokémon levels up with beauty ≥ specified value +#define EVO_LEVEL_FEMALE 16 // Pokémon reaches the specified level, is female +#define EVO_LEVEL_MALE 17 // Pokémon reaches the specified level, is male +#define EVO_LEVEL_NIGHT 18 // Pokémon reaches the specified level, is night +#define EVO_LEVEL_DAY 19 // Pokémon reaches the specified level, is day +#define EVO_LEVEL_DUSK 20 // Pokémon reaches the specified level, is dusk (5-6 P.M) +#define EVO_ITEM_HOLD_DAY 21 // Pokémon levels up, holds specified item at day +#define EVO_ITEM_HOLD_NIGHT 22 // Pokémon levels up, holds specified item at night +#define EVO_MOVE 23 // Pokémon levels up, knows specified move +#define EVO_MOVE_TYPE 24 // Pokémon levels up, knows move with specified type +#define EVO_MAPSEC 25 // Pokémon levels up on specified mapsec +#define EVO_ITEM_MALE 26 // specified item is used on a male Pokémon +#define EVO_ITEM_FEMALE 27 // specified item is used on a female Pokémon +#define EVO_LEVEL_RAIN 28 // Pokémon reaches the specified level while it's raining +#define EVO_SPECIFIC_MON_IN_PARTY 29 // Pokémon levels up with a specified Pokémon in party +#define EVO_LEVEL_DARK_TYPE_MON_IN_PARTY 30 // Pokémon reaches the specified level with a Dark Type Pokémon in party +#define EVO_TRADE_SPECIFIC_MON 31 // Pokémon is traded for a specified Pokémon +#define EVO_SPECIFIC_MAP 32 // Pokémon levels up on specified map -#define EVOS_PER_MON 5 +#define EVOS_PER_MON 10 // Evolution 'modes,' for GetEvolutionTargetSpecies #define EVO_MODE_NORMAL 0 diff --git a/include/graphics.h b/include/graphics.h index 6139e90cf..5c2150f4a 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4749,6 +4749,8 @@ extern const u32 gBattleAnimSpriteGfx_MegaStone[]; extern const u32 gBattleAnimSpritePal_MegaStone[]; extern const u32 gBattleAnimSpriteGfx_MegaParticles[]; extern const u32 gBattleAnimSpritePal_MegaParticles[]; +extern const u32 gBattleAnimSpriteGfx_PrimalParticles[]; +extern const u32 gBattleAnimSpritePal_PrimalParticles[]; extern const u32 gBattleAnimSpriteGfx_MegaSymbol[]; extern const u32 gBattleAnimSpritePal_MegaSymbol[]; extern const u32 gBattleAnimSpriteGfx_FlashCannonBall[]; @@ -4765,6 +4767,8 @@ extern const u32 gBattleAnimSpriteGfx_AcupressureFinger[]; extern const u32 gBattleAnimSpritePal_AcupressureFinger[]; extern const u32 gBattleAnimSpriteGfx_AlphaStone[]; extern const u32 gBattleAnimSpritePal_AlphaStone[]; +extern const u32 gBattleAnimSpriteGfx_AlphaSymbol[]; +extern const u32 gBattleAnimSpritePal_AlphaSymbol[]; extern const u32 gBattleAnimSpriteGfx_Anchor[]; extern const u32 gBattleAnimSpriteGfx_Apple[]; extern const u32 gBattleAnimSpritePal_Apple[]; @@ -4867,6 +4871,8 @@ extern const u32 gBattleAnimSpriteGfx_Obstruct[]; extern const u32 gBattleAnimSpritePal_Obstruct[]; extern const u32 gBattleAnimSpriteGfx_OmegaStone[]; extern const u32 gBattleAnimSpritePal_OmegaStone[]; +extern const u32 gBattleAnimSpriteGfx_OmegaSymbol[]; +extern const u32 gBattleAnimSpritePal_OmegaSymbol[]; extern const u32 gBattleAnimSpriteGfx_PinkDiamond[]; extern const u32 gBattleAnimSpritePal_PinkDiamond[]; extern const u32 gBattleAnimSpriteGfx_PoisonColumn[]; diff --git a/src/battle_anim.c b/src/battle_anim.c index d1a69bcde..551979e70 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1564,6 +1564,9 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_DreepyMissile, 0x200, ANIM_TAG_DREEPY}, {gBattleAnimSpriteGfx_IceRock, 0x1800, ANIM_TAG_ICE_ROCK_SINGLE}, {gBattleAnimSpriteGfx_StonePillar, 0x1800, ANIM_TAG_STONE_PILLAR_MULTI}, + {gBattleAnimSpriteGfx_AlphaSymbol, 0x0200, ANIM_TAG_ALPHA_SYMBOL}, + {gBattleAnimSpriteGfx_OmegaSymbol, 0x0200, ANIM_TAG_OMEGA_SYMBOL}, + {gBattleAnimSpriteGfx_PrimalParticles, 0x0180, ANIM_TAG_PRIMAL_PARTICLES}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = @@ -2011,6 +2014,9 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_DreepyMissile, ANIM_TAG_DREEPY}, {gBattleAnimSpritePal_IceRock, ANIM_TAG_ICE_ROCK_SINGLE}, {gBattleAnimSpritePal_StonePillar, ANIM_TAG_STONE_PILLAR_MULTI}, + {gBattleAnimSpritePal_AlphaSymbol, ANIM_TAG_ALPHA_SYMBOL}, + {gBattleAnimSpritePal_OmegaSymbol, ANIM_TAG_OMEGA_SYMBOL}, + {gBattleAnimSpritePal_PrimalParticles, ANIM_TAG_PRIMAL_PARTICLES}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index 78b02168e..11e350535 100755 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -1219,6 +1219,61 @@ const struct SpriteTemplate gMegaSymbolSpriteTemplate = .callback = AnimGhostStatusSprite, }; +const struct SpriteTemplate gAlphaStoneSpriteTemplate = +{ + .tileTag = ANIM_TAG_ALPHA_STONE, + .paletteTag = ANIM_TAG_ALPHA_STONE, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_LusterPurgeCircle, + .callback = AnimSpriteOnMonPos, +}; + +const struct SpriteTemplate gOmegaStoneSpriteTemplate = +{ + .tileTag = ANIM_TAG_OMEGA_STONE, + .paletteTag = ANIM_TAG_OMEGA_STONE, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_LusterPurgeCircle, + .callback = AnimSpriteOnMonPos, +}; + +const struct SpriteTemplate gPrimalParticlesSpriteTemplate = +{ + .tileTag = ANIM_TAG_PRIMAL_PARTICLES, + .paletteTag = ANIM_TAG_PRIMAL_PARTICLES, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gPowerAbsorptionOrbAffineAnimTable, + .callback = AnimPowerAbsorptionOrb, +}; + +const struct SpriteTemplate gAlphaSymbolSpriteTemplate = +{ + .tileTag = ANIM_TAG_ALPHA_SYMBOL, + .paletteTag = ANIM_TAG_ALPHA_SYMBOL, + .oam = &gOamData_AffineOff_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimGhostStatusSprite, +}; + +const struct SpriteTemplate gOmegaSymbolSpriteTemplate = +{ + .tileTag = ANIM_TAG_OMEGA_SYMBOL, + .paletteTag = ANIM_TAG_OMEGA_SYMBOL, + .oam = &gOamData_AffineOff_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimGhostStatusSprite, +}; + void AnimBlackSmoke(struct Sprite *sprite) { sprite->x += gBattleAnimArgs[0]; diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 0c452c236..367f6ddeb 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -15,6 +15,7 @@ #include "battle_controllers.h" #include "constants/moves.h" #include "constants/hold_effects.h" +#include "constants/items.h" //// function declarations static void SpriteCB_SpriteToCentreOfSide(struct Sprite* sprite); @@ -5020,3 +5021,12 @@ void AnimTask_TechnoBlast(u8 taskId) gBattleAnimArgs[0] = 0; DestroyAnimVisualTask(taskId); } + +void AnimTask_PrimalReversion(u8 taskId) +{ + if (ItemId_GetId(gBattleMons[gBattleAnimAttacker].item) == ITEM_RED_ORB) + gBattleAnimArgs[0] = ItemId_GetId(gBattleMons[gBattleAnimAttacker].item); + else + gBattleAnimArgs[0] = 0; + DestroyAnimVisualTask(taskId); +} diff --git a/src/battle_interface.c b/src/battle_interface.c index 26d6fb27f..e909ea22a 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -665,6 +665,28 @@ static const struct SpritePalette sSpritePalette_MegaIndicator = sMegaIndicatorPal, TAG_MEGA_INDICATOR_PAL }; +static const u8 sAlphaIndicatorGfx[] = INCBIN_U8("graphics/battle_interface/alpha_indicator.4bpp"); +static const u16 sAlphaIndicatorPal[] = INCBIN_U16("graphics/battle_interface/alpha_indicator.gbapal"); +static const u8 sOmegaIndicatorGfx[] = INCBIN_U8("graphics/battle_interface/omega_indicator.4bpp"); +static const u16 sOmegaIndicatorPal[] = INCBIN_U16("graphics/battle_interface/omega_indicator.gbapal"); + +static const struct SpriteSheet sSpriteSheet_AlphaIndicator = +{ + sAlphaIndicatorGfx, sizeof(sAlphaIndicatorGfx), TAG_ALPHA_INDICATOR_TILE +}; +static const struct SpritePalette sSpritePalette_AlphaIndicator = +{ + sAlphaIndicatorPal, TAG_ALPHA_INDICATOR_PAL +}; +static const struct SpriteSheet sSpriteSheet_OmegaIndicator = +{ + sOmegaIndicatorGfx, sizeof(sOmegaIndicatorGfx), TAG_OMEGA_INDICATOR_TILE +}; +static const struct SpritePalette sSpritePalette_OmegaIndicator = +{ + sOmegaIndicatorPal, TAG_OMEGA_INDICATOR_PAL +}; + static const struct OamData sOamData_MegaIndicator = { .y = 0, @@ -693,6 +715,28 @@ static const struct SpriteTemplate sSpriteTemplate_MegaIndicator = .callback = SpriteCb_MegaIndicator, }; +static const struct SpriteTemplate sSpriteTemplate_AlphaIndicator = +{ + .tileTag = TAG_ALPHA_INDICATOR_TILE, + .paletteTag = TAG_ALPHA_INDICATOR_PAL, + .oam = &sOamData_MegaIndicator, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCb_MegaIndicator, +}; + +static const struct SpriteTemplate sSpriteTemplate_OmegaIndicator = +{ + .tileTag = TAG_OMEGA_INDICATOR_TILE, + .paletteTag = TAG_OMEGA_INDICATOR_PAL, + .oam = &sOamData_MegaIndicator, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCb_MegaIndicator, +}; + // code @@ -805,8 +849,9 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) healthBarSpritePtr->hBar_Data6 = data6; healthBarSpritePtr->invisible = TRUE; - // Create mega indicator sprite if is a mega evolved mon. - if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]) + // Create mega indicator sprite if is a mega evolved or a primal reverted mon. + if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]] + || gBattleStruct->mega.primalRevertedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]) { megaIndicatorSpriteId = CreateMegaIndicatorSprite(battlerId, 0); gSprites[megaIndicatorSpriteId].invisible = TRUE; @@ -910,7 +955,8 @@ void SetHealthboxSpriteVisible(u8 healthboxSpriteId) gSprites[healthboxSpriteId].invisible = FALSE; gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId].invisible = FALSE; gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = FALSE; - if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]) + if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]] + || gBattleStruct->mega.primalRevertedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]) { u8 spriteId = GetMegaIndicatorSpriteId(healthboxSpriteId); if (spriteId != 0xFF) @@ -1033,8 +1079,9 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) u8 *objVram; u8 battler = gSprites[healthboxSpriteId].hMain_Battler; - // Don't print Lv char if mon is mega evolved. - if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battler)] & gBitTable[gBattlerPartyIndexes[battler]]) + // Don't print Lv char if mon is mega evolved or primal reverted. + if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battler)] & gBitTable[gBattlerPartyIndexes[battler]] + || gBattleStruct->mega.primalRevertedPartyIds[GetBattlerSide(battler)] & gBitTable[gBattlerPartyIndexes[battler]]) { objVram = ConvertIntToDecimalStringN(text, lvl, STR_CONV_MODE_LEFT_ALIGN, 3); xPos = 5 * (3 - (objVram - (text + 2))) - 1; @@ -1506,12 +1553,28 @@ u32 CreateMegaIndicatorSprite(u32 battlerId, u32 which) u32 spriteId, position; s16 x, y; - LoadSpritePalette(&sSpritePalette_MegaIndicator); - LoadSpriteSheet(&sSpriteSheet_MegaIndicator); + if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]) + { + LoadSpritePalette(&sSpritePalette_MegaIndicator); + LoadSpriteSheet(&sSpriteSheet_MegaIndicator); + } + else if (gBattleStruct->mega.primalRevertedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]) + { + if (GET_BASE_SPECIES_ID(gBattleMons[battlerId].species) == SPECIES_GROUDON) + { + LoadSpritePalette(&sSpritePalette_OmegaIndicator); + LoadSpriteSheet(&sSpriteSheet_OmegaIndicator); + } + else if (GET_BASE_SPECIES_ID(gBattleMons[battlerId].species) == SPECIES_KYOGRE) + { + LoadSpritePalette(&sSpritePalette_AlphaIndicator); + LoadSpriteSheet(&sSpriteSheet_AlphaIndicator); + } + } position = GetBattlerPosition(battlerId); GetBattlerHealthboxCoords(battlerId, &x, &y); - + x += sIndicatorPositions[position][0]; y += sIndicatorPositions[position][1]; @@ -1519,10 +1582,20 @@ u32 CreateMegaIndicatorSprite(u32 battlerId, u32 which) x -= 4; else if (gBattleMons[battlerId].level < 10) x += 5; - - spriteId = CreateSpriteAtEnd(&sSpriteTemplate_MegaIndicator, x, y, 0); - gSprites[gSprites[gHealthboxSpriteIds[battlerId]].oam.affineParam].hOther_IndicatorSpriteId = spriteId; + if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]) + { + spriteId = CreateSpriteAtEnd(&sSpriteTemplate_MegaIndicator, x, y, 0); + } + else if (gBattleStruct->mega.primalRevertedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]) + { + if (GET_BASE_SPECIES_ID(gBattleMons[battlerId].species) == SPECIES_GROUDON) + spriteId = CreateSpriteAtEnd(&sSpriteTemplate_OmegaIndicator, x, y, 0); + else if (GET_BASE_SPECIES_ID(gBattleMons[battlerId].species) == SPECIES_KYOGRE) + spriteId = CreateSpriteAtEnd(&sSpriteTemplate_AlphaIndicator, x, y, 0); + } + + gSprites[gSprites[gHealthboxSpriteIds[battlerId]].oam.affineParam].hOther_IndicatorSpriteId = spriteId; gSprites[spriteId].tBattler = battlerId; return spriteId; } diff --git a/src/battle_main.c b/src/battle_main.c index 62662d1e4..da080316e 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3512,6 +3512,18 @@ static void TryDoEventsBeforeFirstTurn(void) } memset(gTotemBoosts, 0, sizeof(gTotemBoosts)); // erase all totem boosts just to be safe + // Primal Reversion + for (i = 0; i < gBattlersCount; i++) + { + if (CanMegaEvolve(i) + && GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_PRIMAL_ORB) + { + gBattlerAttacker = i; + BattleScriptExecute(BattleScript_PrimalReversion); + return; + } + } + // Check all switch in abilities happening from the fastest mon to slowest. while (gBattleStruct->switchInAbilitiesCounter < gBattlersCount) { diff --git a/src/battle_message.c b/src/battle_message.c index f8df8f4b8..8ae103a66 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -718,9 +718,11 @@ static const u8 sText_MysteriousAirCurrent[] = _("A mysterious air current is\np static const u8 sText_StrongWindsDissipated[] = _("The mysterious strong winds\nhave dissipated!{PAUSE 64}"); static const u8 sText_MysteriousAirCurrentBlowsOn[] = _("The mysterious air current\nblows on regardless!"); static const u8 sText_AttackWeakenedByStrongWinds[] = _("The mysterious strong winds\nweakened the attack!"); +static const u8 sText_PkmnRevertedToPrimal[] = _("{B_ATK_NAME_WITH_PREFIX}'s Primal Reversion!\nIt reverted to its primal form!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_PKMNREVERTEDTOPRIMAL - 12] = sText_PkmnRevertedToPrimal, [STRINGID_ATTACKWEAKENEDBSTRONGWINDS - 12] = sText_AttackWeakenedByStrongWinds, [STRINGID_MYSTERIOUSAIRCURRENTBLOWSON - 12] = sText_MysteriousAirCurrentBlowsOn, [STRINGID_STRONGWINDSDISSIPATED - 12] = sText_StrongWindsDissipated, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 3b627a020..1fbf2369a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -56,6 +56,7 @@ #include "constants/party_menu.h" extern struct MusicPlayerInfo gMPlayInfo_BGM; +extern struct Evolution gEvolutionTable[][EVOS_PER_MON]; extern const u8* const gBattleScriptsForMoveEffects[]; @@ -4545,7 +4546,12 @@ static void Cmd_playanimation(void) || gBattlescriptCurrInstr[2] == B_ANIM_MEGA_EVOLUTION || gBattlescriptCurrInstr[2] == B_ANIM_ILLUSION_OFF || gBattlescriptCurrInstr[2] == B_ANIM_FORM_CHANGE - || gBattlescriptCurrInstr[2] == B_ANIM_SUBSTITUTE_FADE) + || gBattlescriptCurrInstr[2] == B_ANIM_SUBSTITUTE_FADE + || gBattlescriptCurrInstr[2] == B_ANIM_RAIN_CONTINUES + || gBattlescriptCurrInstr[2] == B_ANIM_SUN_CONTINUES + || gBattlescriptCurrInstr[2] == B_ANIM_SANDSTORM_CONTINUES + || gBattlescriptCurrInstr[2] == B_ANIM_HAIL_CONTINUES + || gBattlescriptCurrInstr[2] == B_ANIM_PRIMAL_REVERSION) { BtlController_EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); @@ -4591,7 +4597,11 @@ static void Cmd_playanimation2(void) // animation Id is stored in the first poin || *animationIdPtr == B_ANIM_MEGA_EVOLUTION || *animationIdPtr == B_ANIM_ILLUSION_OFF || *animationIdPtr == B_ANIM_FORM_CHANGE - || *animationIdPtr == B_ANIM_SUBSTITUTE_FADE) + || *animationIdPtr == B_ANIM_SUBSTITUTE_FADE + || *animationIdPtr == B_ANIM_RAIN_CONTINUES + || *animationIdPtr == B_ANIM_SUN_CONTINUES + || *animationIdPtr == B_ANIM_SANDSTORM_CONTINUES + || *animationIdPtr == B_ANIM_PRIMAL_REVERSION) { BtlController_EmitBattleAnimation(0, *animationIdPtr, *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); @@ -8179,6 +8189,47 @@ static void Cmd_various(void) } gBattlescriptCurrInstr += 4; return; + case VARIOUS_HANDLE_PRIMAL_REVERSION: + if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) + mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]; + else + mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]; + + // Change species. + if (gBattlescriptCurrInstr[3] == 0) + { + u16 primalSpecies; + gBattleStruct->mega.primalRevertedSpecies[gActiveBattler] = gBattleMons[gActiveBattler].species; + if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT + || (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT && !(gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER)))) + { + gBattleStruct->mega.playerPrimalRevertedSpecies = gBattleStruct->mega.primalRevertedSpecies[gActiveBattler]; + } + // Checks Primal Reversion + primalSpecies = GetMegaEvolutionSpecies(gBattleStruct->mega.primalRevertedSpecies[gActiveBattler], gBattleMons[gActiveBattler].item); + + gBattleMons[gActiveBattler].species = primalSpecies; + PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gActiveBattler].species); + + BtlController_EmitSetMonData(0, REQUEST_SPECIES_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]], 2, &gBattleMons[gActiveBattler].species); + MarkBattlerForControllerExec(gActiveBattler); + } + // Change stats. + else if (gBattlescriptCurrInstr[3] == 1) + { + RecalcBattlerStats(gActiveBattler, mon); + gBattleStruct->mega.primalRevertedPartyIds[GetBattlerSide(gActiveBattler)] |= gBitTable[gBattlerPartyIndexes[gActiveBattler]]; + } + // Update healthbox and elevation. + else + { + UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], mon, HEALTHBOX_ALL); + CreateMegaIndicatorSprite(gActiveBattler, 0); + if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) + SetBattlerShadowSpriteCallback(gActiveBattler, gBattleMons[gActiveBattler].species); + } + gBattlescriptCurrInstr += 4; + return; case VARIOUS_HANDLE_FORM_CHANGE: if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]; @@ -8822,6 +8873,21 @@ static void Cmd_various(void) } break; } + case VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL: + { + bool8 canDoPrimalReversion = FALSE; + + for (i = 0; i < EVOS_PER_MON; i++) + { + if (gEvolutionTable[gBattleMons[gActiveBattler].species][i].method == EVO_PRIMAL_REVERSION + && gEvolutionTable[gBattleMons[gActiveBattler].species][i].param == gBattleMons[gActiveBattler].item) + canDoPrimalReversion = TRUE; + } + if (!canDoPrimalReversion) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + } } gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index 01ee1a691..991692006 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8154,7 +8154,8 @@ static bool32 CanEvolve(u32 species) { if (gEvolutionTable[species][i].method && gEvolutionTable[species][i].method != EVO_MEGA_EVOLUTION - && gEvolutionTable[species][i].method != EVO_MOVE_MEGA_EVOLUTION) + && gEvolutionTable[species][i].method != EVO_MOVE_MEGA_EVOLUTION + && gEvolutionTable[species][i].method != EVO_PRIMAL_REVERSION) return TRUE; } return FALSE; @@ -8708,9 +8709,10 @@ u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId) for (i = 0; i < EVOS_PER_MON; i++) { - if (gEvolutionTable[preEvoSpecies][i].method == EVO_MEGA_EVOLUTION - && gEvolutionTable[preEvoSpecies][i].param == heldItemId) - return gEvolutionTable[preEvoSpecies][i].targetSpecies; + if ((gEvolutionTable[preEvoSpecies][i].method == EVO_MEGA_EVOLUTION + || gEvolutionTable[preEvoSpecies][i].method == EVO_PRIMAL_REVERSION) + && gEvolutionTable[preEvoSpecies][i].param == heldItemId) + return gEvolutionTable[preEvoSpecies][i].targetSpecies; } return SPECIES_NONE; } @@ -8775,12 +8777,20 @@ bool32 CanMegaEvolve(u8 battlerId) else holdEffect = ItemId_GetHoldEffect(itemId); - // Can Mega Evolve via Item. + // Can Mega Evolve via Mega Stone. if (holdEffect == HOLD_EFFECT_MEGA_STONE) { gBattleStruct->mega.isWishMegaEvo = FALSE; return TRUE; } + + // Can undergo Primal Reversion. + if (holdEffect == HOLD_EFFECT_PRIMAL_ORB) + { + gBattleStruct->mega.isWishMegaEvo = FALSE; + gBattleStruct->mega.isPrimalReversion = TRUE; + return TRUE; + } } // Check if there is an entry in the evolution table for Wish Mega Evolution. @@ -8796,12 +8806,20 @@ bool32 CanMegaEvolve(u8 battlerId) void UndoMegaEvolution(u32 monId) { + u16 baseSpecies = GET_BASE_SPECIES_ID(GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES)); + if (gBattleStruct->mega.evolvedPartyIds[B_SIDE_PLAYER] & gBitTable[monId]) { gBattleStruct->mega.evolvedPartyIds[B_SIDE_PLAYER] &= ~(gBitTable[monId]); SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleStruct->mega.playerEvolvedSpecies); CalculateMonStats(&gPlayerParty[monId]); } + else if (gBattleStruct->mega.primalRevertedPartyIds[B_SIDE_PLAYER] & gBitTable[monId]) + { + gBattleStruct->mega.primalRevertedPartyIds[B_SIDE_PLAYER] &= ~(gBitTable[monId]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &baseSpecies); + CalculateMonStats(&gPlayerParty[monId]); + } // While not exactly a mega evolution, Zygarde follows the same rules. else if (GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL) == SPECIES_ZYGARDE_COMPLETE) { diff --git a/src/graphics.c b/src/graphics.c index 247231d55..4cbc4b334 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -41,6 +41,15 @@ const u32 gBattleAnimSpritePal_MegaParticles[] = INCBIN_U32("graphics/battle_ani const u32 gBattleAnimSpriteGfx_MegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/mega_symbol.4bpp.lz"); const u32 gBattleAnimSpritePal_MegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/mega_symbol.gbapal.lz"); +const u32 gBattleAnimSpriteGfx_AlphaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/alpha_symbol.4bpp.lz"); +const u32 gBattleAnimSpritePal_AlphaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/alpha_symbol.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_OmegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/omega_symbol.4bpp.lz"); +const u32 gBattleAnimSpritePal_OmegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/omega_symbol.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_PrimalParticles[] = INCBIN_U32("graphics/battle_anims/sprites/primal_particles.4bpp.lz"); +const u32 gBattleAnimSpritePal_PrimalParticles[] = INCBIN_U32("graphics/battle_anims/sprites/primal_particles.gbapal.lz"); + const u32 gBattleAnimSpriteGfx_FlashCannonBall[] = INCBIN_U32("graphics/battle_anims/sprites/flash_cannon_ball.4bpp.lz"); const u32 gBattleAnimSpritePal_FlashCannonBall[] = INCBIN_U32("graphics/battle_anims/sprites/flash_cannon_ball.gbapal.lz"); From 2120545649004d618397d9f39b884b391dffcfad Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 9 Oct 2021 01:07:27 -0300 Subject: [PATCH 061/193] Oopsie --- src/battle_script_commands.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1fbf2369a..dcd9c8999 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4547,10 +4547,6 @@ static void Cmd_playanimation(void) || gBattlescriptCurrInstr[2] == B_ANIM_ILLUSION_OFF || gBattlescriptCurrInstr[2] == B_ANIM_FORM_CHANGE || gBattlescriptCurrInstr[2] == B_ANIM_SUBSTITUTE_FADE - || gBattlescriptCurrInstr[2] == B_ANIM_RAIN_CONTINUES - || gBattlescriptCurrInstr[2] == B_ANIM_SUN_CONTINUES - || gBattlescriptCurrInstr[2] == B_ANIM_SANDSTORM_CONTINUES - || gBattlescriptCurrInstr[2] == B_ANIM_HAIL_CONTINUES || gBattlescriptCurrInstr[2] == B_ANIM_PRIMAL_REVERSION) { BtlController_EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr); @@ -4598,9 +4594,6 @@ static void Cmd_playanimation2(void) // animation Id is stored in the first poin || *animationIdPtr == B_ANIM_ILLUSION_OFF || *animationIdPtr == B_ANIM_FORM_CHANGE || *animationIdPtr == B_ANIM_SUBSTITUTE_FADE - || *animationIdPtr == B_ANIM_RAIN_CONTINUES - || *animationIdPtr == B_ANIM_SUN_CONTINUES - || *animationIdPtr == B_ANIM_SANDSTORM_CONTINUES || *animationIdPtr == B_ANIM_PRIMAL_REVERSION) { BtlController_EmitBattleAnimation(0, *animationIdPtr, *argumentPtr); From 903c4cbf68d1c73cca1ab076177e54c7a3bc73ea Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sat, 9 Oct 2021 23:52:37 -0300 Subject: [PATCH 062/193] Config for Blizzard + Hail --- include/constants/battle_config.h | 1 + src/battle_script_commands.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index bcf4491f9..2c005f50a 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -123,6 +123,7 @@ #define B_CRASH_IF_TARGET_IMMUNE GEN_7 // In Gen4+, The user of Jump Kick or High Jump Kick will "keep going and crash" if it attacks a target that is immune to the move. #define B_TAILWIND_TIMER GEN_7 // In Gen5+, Tailwind lasts 4 turns instead of 3. #define B_MEMENTO_FAIL GEN_7 // In Gen4+, Memento fails if there is no target or if the target is protected or behind substitute. But not if Atk/Sp. Atk are at -6. +#define B_BLIZZARD_HAIL GEN_7 // In Gen4+, Blizzard bypasses accuracy checks if it's hailing. // Ability settings #define B_ABILITY_WEATHER GEN_7 // In Gen6+, ability-induced weather lasts 5 turns. Before, it lasted until the battle ended or until it was changed by a move or a different weather-affecting ability. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9d6dbb89b..fa167bf66 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1597,7 +1597,7 @@ static bool32 AccuracyCalcHelper(u16 move) if ((WEATHER_HAS_EFFECT && (((gBattleWeather & WEATHER_RAIN_ANY) && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE)) - || (((gBattleWeather & WEATHER_HAIL_ANY) && move == MOVE_BLIZZARD)))) + || ((B_BLIZZARD_HAIL >= GEN_4 && (gBattleWeather & WEATHER_HAIL_ANY) && move == MOVE_BLIZZARD)))) || (gBattleMoves[move].effect == EFFECT_VITAL_THROW) || (gBattleMoves[move].accuracy == 0) || ((B_MINIMIZE_DMG_ACC >= GEN_6) && (gStatuses3[gBattlerTarget] & STATUS3_MINIMIZED) && (gBattleMoves[move].flags & FLAG_DMG_MINIMIZE))) From 4572e62669a2a461b98dd660b2dd80a8ddca78da Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sat, 9 Oct 2021 23:56:07 -0300 Subject: [PATCH 063/193] Gen 5 Scald effect --- src/data/battle_moves.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 1aa8c4dfd..3f4b8eefc 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -7944,7 +7944,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_SCALD] = { - .effect = EFFECT_SCALD, + #if B_UPDATED_MOVE_DATA >= GEN_6 + .effect = EFFECT_SCALD, + #else + .effect = EFFECT_BURN_HIT, + #endif .power = 80, .type = TYPE_WATER, .accuracy = 100, From 3add4d6a17f261a1223d7b2ce765f583bf8d753b Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sun, 10 Oct 2021 00:46:59 -0300 Subject: [PATCH 064/193] Added some status3 options to debug menu --- src/battle_debug.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/battle_debug.c b/src/battle_debug.c index b9cfcdc03..657dc6061 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -207,6 +207,8 @@ static const u8 sText_GastroAcid[] = _("Gastro Acid"); static const u8 sText_SmackDown[] = _("Smacked Down"); static const u8 sText_MiracleEye[] = _("Miracle Eye"); static const u8 sText_AquaRing[] = _("Aqua Ring"); +static const u8 sText_LaserFocus[] = _("Laser Focused"); +static const u8 sText_Electrified[] = _("Electrified"); static const u8 sText_AuroraVeil[] = _("Aurora Veil"); static const u8 sText_LuckyChant[] = _("Lucky Chant"); static const u8 sText_Tailwind[] = _("Tailwind"); @@ -295,6 +297,9 @@ static const struct BitfieldInfo sStatus3Bitfield[] = // Magnet Rise 1, 26, // Heal Block 1, 27, {/*Aqua Ring*/ 1, 28}, + {/*Laser Focus*/ 1, 29}, + {/*Electrified*/ 1, 30}, + // Power Trick 1, 31, }; static const struct BitfieldInfo sAIBitfield[] = @@ -408,6 +413,8 @@ static const struct ListMenuItem sStatus3ListItems[] = {sText_SmackDown, 8}, {sText_MiracleEye, 9}, {sText_AquaRing, 10}, + {sText_LaserFocus, 11}, + {sText_Electrified, 12}, }; static const struct ListMenuItem sSideStatusListItems[] = From cf6e3873b48bbf3d9c1ed3cd611ca6cf47e04ec2 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sun, 10 Oct 2021 01:13:23 -0300 Subject: [PATCH 065/193] Moved Electrified to Status4. --- include/battle.h | 1 + include/constants/battle.h | 5 +++-- src/battle_debug.c | 27 ++++++++++++++++++++++++--- src/battle_main.c | 3 ++- src/battle_script_commands.c | 2 +- src/battle_util.c | 2 +- 6 files changed, 32 insertions(+), 8 deletions(-) diff --git a/include/battle.h b/include/battle.h index 826a0929e..6bca8d394 100644 --- a/include/battle.h +++ b/include/battle.h @@ -857,6 +857,7 @@ extern u8 gUnusedFirstBattleVar2; extern u32 gSideStatuses[2]; extern struct SideTimer gSideTimers[2]; extern u32 gStatuses3[MAX_BATTLERS_COUNT]; +extern u32 gStatuses4[MAX_BATTLERS_COUNT]; extern struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT]; extern u16 gPauseCounterBattle; extern u16 gPaydayMoney; diff --git a/include/constants/battle.h b/include/constants/battle.h index a59ea2f1a..abaddde96 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -169,10 +169,11 @@ #define STATUS3_HEAL_BLOCK (1 << 27) #define STATUS3_AQUA_RING (1 << 28) #define STATUS3_LASER_FOCUS (1 << 29) -#define STATUS3_ELECTRIFIED (1 << 30) -#define STATUS3_POWER_TRICK (1 << 31) +#define STATUS3_POWER_TRICK (1 << 30) #define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER | STATUS3_PHANTOM_FORCE) +#define STATUS4_ELECTRIFIED (1 << 0) + #define HITMARKER_x10 (1 << 4) #define HITMARKER_x20 (1 << 5) #define HITMARKER_DESTINYBOND (1 << 6) diff --git a/src/battle_debug.c b/src/battle_debug.c index 657dc6061..25ca9e92d 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -97,6 +97,7 @@ enum LIST_ITEM_STATUS1, LIST_ITEM_STATUS2, LIST_ITEM_STATUS3, + LIST_ITEM_STATUS4, LIST_ITEM_SIDE_STATUS, LIST_ITEM_AI, LIST_ITEM_AI_MOVES_PTS, @@ -164,6 +165,7 @@ static const u8 sText_StatStages[] = _("Stat Stages"); static const u8 sText_Status1[] = _("Status1"); static const u8 sText_Status2[] = _("Status2"); static const u8 sText_Status3[] = _("Status3"); +static const u8 sText_Status4[] = _("Status4"); static const u8 sText_HeldItem[] = _("Held Item"); static const u8 sText_SideStatus[] = _("Side Status"); static const u8 sText_MaxHp[] = _("HP Max"); @@ -298,8 +300,12 @@ static const struct BitfieldInfo sStatus3Bitfield[] = // Heal Block 1, 27, {/*Aqua Ring*/ 1, 28}, {/*Laser Focus*/ 1, 29}, - {/*Electrified*/ 1, 30}, - // Power Trick 1, 31, + // Power Trick 1, 30, +}; + +static const struct BitfieldInfo sStatus4Bitfield[] = +{ + {/*Electrified*/ 1, 0,} }; static const struct BitfieldInfo sAIBitfield[] = @@ -329,6 +335,7 @@ static const struct ListMenuItem sMainListItems[] = {sText_Status1, LIST_ITEM_STATUS1}, {sText_Status2, LIST_ITEM_STATUS2}, {sText_Status3, LIST_ITEM_STATUS3}, + {sText_Status4, LIST_ITEM_STATUS4}, {sText_SideStatus, LIST_ITEM_SIDE_STATUS}, {sText_AI, LIST_ITEM_AI}, {sText_AIMovePts, LIST_ITEM_AI_MOVES_PTS}, @@ -414,7 +421,11 @@ static const struct ListMenuItem sStatus3ListItems[] = {sText_MiracleEye, 9}, {sText_AquaRing, 10}, {sText_LaserFocus, 11}, - {sText_Electrified, 12}, +}; + +static const struct ListMenuItem sStatus4ListItems[] = +{ + {sText_Electrified, 0}, }; static const struct ListMenuItem sSideStatusListItems[] = @@ -1183,6 +1194,11 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) itemsCount = ARRAY_COUNT(sStatus3ListItems); data->bitfield = sStatus3Bitfield; break; + case LIST_ITEM_STATUS4: + listTemplate.items = sStatus4ListItems; + itemsCount = ARRAY_COUNT(sStatus4ListItems); + data->bitfield = sStatus4Bitfield; + break; case LIST_ITEM_AI: listTemplate.items = sAIListItems; itemsCount = ARRAY_COUNT(sAIListItems); @@ -1741,6 +1757,11 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.currValue = GetBitfieldValue(gStatuses3[data->battlerId], data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); data->modifyArrows.typeOfVal = VAL_BITFIELD_32; goto CASE_ITEM_STATUS; + case LIST_ITEM_STATUS4: + data->modifyArrows.modifiedValPtr = &gStatuses4[data->battlerId]; + data->modifyArrows.currValue = GetBitfieldValue(gStatuses4[data->battlerId], data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); + data->modifyArrows.typeOfVal = VAL_BITFIELD_32; + goto CASE_ITEM_STATUS; case LIST_ITEM_AI: data->modifyArrows.modifiedValPtr = &gBattleResources->ai->aiFlags; data->modifyArrows.currValue = GetBitfieldValue(gBattleResources->ai->aiFlags, data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); diff --git a/src/battle_main.c b/src/battle_main.c index 055ec9bbe..2c1597718 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -190,6 +190,7 @@ EWRAM_DATA u8 gUnusedFirstBattleVar2 = 0; // Never read EWRAM_DATA u32 gSideStatuses[2] = {0}; EWRAM_DATA struct SideTimer gSideTimers[2] = {0}; EWRAM_DATA u32 gStatuses3[MAX_BATTLERS_COUNT] = {0}; +EWRAM_DATA u32 gStatuses4[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gPauseCounterBattle = 0; EWRAM_DATA u16 gPaydayMoney = 0; @@ -5118,7 +5119,7 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) attackerAbility = GetBattlerAbility(battlerAtk); GET_MOVE_TYPE(move, moveType); if ((gFieldStatuses & STATUS_FIELD_ION_DELUGE && moveType == TYPE_NORMAL) - || gStatuses3[battlerAtk] & STATUS3_ELECTRIFIED) + || gStatuses4[battlerAtk] & STATUS4_ELECTRIFIED) { gBattleStruct->dynamicMoveType = 0x80 | TYPE_ELECTRIC; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9d6dbb89b..8eeea603e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8089,7 +8089,7 @@ static void Cmd_various(void) } else { - gStatuses3[gBattlerTarget] |= STATUS3_ELECTRIFIED; + gStatuses4[gBattlerTarget] |= STATUS4_ELECTRIFIED; gBattlescriptCurrInstr += 7; } return; diff --git a/src/battle_util.c b/src/battle_util.c index 8195e2f32..36effb2db 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2838,7 +2838,7 @@ u8 DoBattlerEndTurnEffects(void) gBattleStruct->turnEffectsTracker++; break; case ENDTURN_ELECTRIFY: - gStatuses3[gActiveBattler] &= ~(STATUS3_ELECTRIFIED); + gStatuses4[gActiveBattler] &= ~(STATUS4_ELECTRIFIED); gBattleStruct->turnEffectsTracker++; case ENDTURN_POWDER: gBattleMons[gActiveBattler].status2 &= ~(STATUS2_POWDER); From 01f563cb5e11c3ba3f38a6084fd9abadd1413f5e Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sun, 10 Oct 2021 08:46:31 -0300 Subject: [PATCH 066/193] Fix infinite loop --- data/battle_scripts_1.s | 22 +++++++++++----------- src/battle_util.c | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 2ce0adf68..883b90200 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8022,41 +8022,41 @@ BattleScript_HangedOnMsgRet: return BattleScript_BerryConfuseHealEnd2:: - jumpifability BS_ATTACKER, ABILITY_RIPEN, BattleScript_BerryConfuseHealEnd2_AbilityPopup + jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_BerryConfuseHealEnd2_AbilityPopup goto BattleScript_BerryConfuseHealEnd2_Anim BattleScript_BerryConfuseHealEnd2_AbilityPopup: call BattleScript_AbilityPopUp BattleScript_BerryConfuseHealEnd2_Anim: - playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL + playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, NULL printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_SCRIPTING + datahpupdate BS_SCRIPTING printstring STRINGID_FORXCOMMAYZ waitmessage B_WAIT_TIME_LONG setmoveeffect MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER seteffectprimary - removeitem BS_ATTACKER + removeitem BS_SCRIPTING end2 BattleScript_BerryConfuseHealRet:: - jumpifability BS_ATTACKER, ABILITY_RIPEN, BattleScript_BerryConfuseHealRet_AbilityPopup + jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_BerryConfuseHealRet_AbilityPopup goto BattleScript_BerryConfuseHealRet_Anim BattleScript_BerryConfuseHealRet_AbilityPopup: call BattleScript_AbilityPopUp BattleScript_BerryConfuseHealRet_Anim: - playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL + playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, NULL printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_SCRIPTING + datahpupdate BS_SCRIPTING printstring STRINGID_FORXCOMMAYZ waitmessage B_WAIT_TIME_LONG - setmoveeffect MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER + setmoveeffect MOVE_EFFECT_CONFUSION | MOVE_EFFECT_CERTAIN seteffectprimary - removeitem BS_ATTACKER + removeitem BS_TARGET return BattleScript_BerryStatRaiseEnd2:: diff --git a/src/battle_util.c b/src/battle_util.c index 20e5d91d1..b3fb71cf6 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5574,7 +5574,7 @@ static u8 HealConfuseBerry(u32 battlerId, u32 itemId, u8 flavorId, bool32 end2) gBattleMoveDamage *= 2; gBattlerAbility = battlerId; } - + gBattleScripting.battler = battlerId; if (end2) { if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, flavorId) < 0) From c3f8b77d8259be1190e49f55ba5532c5c72de041 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sun, 10 Oct 2021 20:26:38 -0300 Subject: [PATCH 067/193] Setting for pre-Gen6 Hidden Power Damage. --- include/constants/battle_config.h | 1 + src/battle_util.c | 16 ++++++++++++++++ src/data/battle_moves.h | 2 +- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index bcf4491f9..bce49719e 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -123,6 +123,7 @@ #define B_CRASH_IF_TARGET_IMMUNE GEN_7 // In Gen4+, The user of Jump Kick or High Jump Kick will "keep going and crash" if it attacks a target that is immune to the move. #define B_TAILWIND_TIMER GEN_7 // In Gen5+, Tailwind lasts 4 turns instead of 3. #define B_MEMENTO_FAIL GEN_7 // In Gen4+, Memento fails if there is no target or if the target is protected or behind substitute. But not if Atk/Sp. Atk are at -6. +#define B_HIDDEN_POWER_DMG GEN_7 // In Gen6+, Hidden Power's base power was set to always be 60. Before, it was determined by the mon's IVs. // Ability settings #define B_ABILITY_WEATHER GEN_7 // In Gen6+, ability-induced weather lasts 5 turns. Before, it lasted until the battle ended or until it was changed by a move or a different weather-affecting ability. diff --git a/src/battle_util.c b/src/battle_util.c index 263d7f96d..88a5cc203 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7658,6 +7658,22 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) basePower *= 2; #endif break; + case EFFECT_HIDDEN_POWER: + { + #if B_HIDDEN_POWER_DMG < GEN_6 + u8 powerBits; + + powerBits = ((gBattleMons[gBattlerAttacker].hpIV & 2) >> 1) + | ((gBattleMons[gBattlerAttacker].attackIV & 2) << 0) + | ((gBattleMons[gBattlerAttacker].defenseIV & 2) << 1) + | ((gBattleMons[gBattlerAttacker].speedIV & 2) << 2) + | ((gBattleMons[gBattlerAttacker].spAttackIV & 2) << 3) + | ((gBattleMons[gBattlerAttacker].spDefenseIV & 2) << 4); + + basePower = (40 * powerBits) / 63 + 30; + #endif + break; + } } // move-specific base power changes diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 1aa8c4dfd..8d2188958 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -3753,7 +3753,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_HIDDEN_POWER] = { - #if B_UPDATED_MOVE_DATA >= GEN_6 + #if B_HIDDEN_POWER_DMG >= GEN_6 .power = 60, #else .power = 1, From fcada4fcad924a905560a726beb49733c3278382 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sun, 10 Oct 2021 19:54:17 -0400 Subject: [PATCH 068/193] handle rototiller + prankster --- data/battle_scripts_1.s | 4 ---- include/battle_util.h | 2 +- src/battle_script_commands.c | 19 ++++++++++--------- src/battle_util.c | 25 +++++++++++++++---------- 4 files changed, 26 insertions(+), 24 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3d9c66bd6..9ed0d1fcc 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -942,10 +942,6 @@ BattleScript_FlowerShieldMoveTargetEnd: jumpifnexttargetvalid BattleScript_FlowerShieldLoop end -BattleScript_RototillerRet:: - - return - BattleScript_EffectRototiller: attackcanceler attackstring diff --git a/include/battle_util.h b/include/battle_util.h index 612a2e6d9..43f66db6b 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -152,7 +152,7 @@ bool32 CompareStat(u8 battlerId, u8 statId, u8 cmpTo, u8 cmpKind); bool32 TryRoomService(u8 battlerId); void BufferStatChange(u8 battlerId, u8 statId, u8 stringId); void DoBurmyFormChange(u32 monId); -bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef); +bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef, bool32 checkTarget); // ability checks bool32 IsRolePlayBannedAbilityAtk(u16 ability); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 339e5bd99..e70b990eb 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1416,7 +1416,7 @@ static void Cmd_attackcanceler(void) gProtectStructs[gBattlerTarget].bounceMove = 0; gProtectStructs[gBattlerTarget].usesBouncedMove = 1; gBattleCommunication[MULTISTRING_CHOOSER] = 0; - if (BlocksPrankster(gCurrentMove, gBattlerTarget, gBattlerAttacker)) + if (BlocksPrankster(gCurrentMove, gBattlerTarget, gBattlerAttacker, TRUE)) { // Opponent used a prankster'd magic coat -> reflected status move should fail against a dark-type attacker gBattlerTarget = gBattlerAttacker; @@ -7345,8 +7345,8 @@ static bool32 IsRototillerAffected(u32 battlerId) return FALSE; // Only grass types affected if (gStatuses3[battlerId] & STATUS3_SEMI_INVULNERABLE) return FALSE; // Rototiller doesn't affected semi-invulnerable battlers - //if (!CompareStat(battlerId, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN) && !CompareStat(battlerId, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)) - //return FALSE; // Battler unaffected if atk and spatk are maxed + if (BlocksPrankster(MOVE_ROTOTILLER, gBattlerAttacker, battlerId, FALSE)) + return FALSE; return TRUE; } @@ -8757,21 +8757,22 @@ static void Cmd_various(void) } gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; // remove the terrain break; - case VARIOUS_JUMP_IF_PRANKSTER_BLOCKED: - if (BlocksPrankster(gCurrentMove, gBattlerAttacker, gActiveBattler)) + case VARIOUS_JUMP_IF_PRANKSTER_BLOCKED: + if (BlocksPrankster(gCurrentMove, gBattlerAttacker, gActiveBattler, TRUE)) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); else gBattlescriptCurrInstr += 7; return; - case VARIOUS_GET_ROTOTILLER_TARGETS: + case VARIOUS_GET_ROTOTILLER_TARGETS: // Gets the battlers to be affected by rototiller. If there are none, print 'But it failed!' { u32 count = 0; for (i = 0; i < gBattlersCount; i++) { + gSpecialStatuses[i].rototillerAffected = FALSE; if (IsRototillerAffected(i)) { - gSpecialStatuses[i].rototillerAffected = 1; + gSpecialStatuses[i].rototillerAffected = TRUE; count++; } } @@ -8785,7 +8786,7 @@ static void Cmd_various(void) case VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED: if (gSpecialStatuses[gActiveBattler].rototillerAffected) { - gSpecialStatuses[gActiveBattler].rototillerAffected = 0; + gSpecialStatuses[gActiveBattler].rototillerAffected = FALSE; gBattlescriptCurrInstr += 7; } else @@ -10954,7 +10955,7 @@ static void Cmd_trysetperishsong(void) { if (gStatuses3[i] & STATUS3_PERISH_SONG || GetBattlerAbility(i) == ABILITY_SOUNDPROOF - || BlocksPrankster(gCurrentMove, gBattlerAttacker, i)) + || BlocksPrankster(gCurrentMove, gBattlerAttacker, i, TRUE)) { notAffectedCount++; } diff --git a/src/battle_util.c b/src/battle_util.c index a709aaf9e..40a100796 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3421,7 +3421,7 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleStruct->atkCancellerTracker++; break; case CANCELLER_PRANKSTER: - if (BlocksPrankster(gCurrentMove, gBattlerAttacker, gBattlerTarget) + if (BlocksPrankster(gCurrentMove, gBattlerAttacker, gBattlerTarget, TRUE) && !(IS_MOVE_STATUS(gCurrentMove) && GetBattlerAbility(gBattlerTarget) == ABILITY_MAGIC_BOUNCE)) { if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE) || !(gBattleMoves[gCurrentMove].target & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) @@ -9344,16 +9344,21 @@ void DoBurmyFormChange(u32 monId) } } -bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef) +bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef, bool32 checkTarget) { #if B_PRANKSTER_DARK_TYPES >= GEN_7 - if (gProtectStructs[battlerPrankster].pranksterElevated - && GetBattlerSide(battlerPrankster) != GetBattlerSide(battlerDef) - && !(gBattleMoves[gCurrentMove].target & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_DEPENDS)) // Don't block hazards, assist-type moves - && IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK) // Only Dark-types can block Prankster'd - && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)) - return TRUE; - else - #endif + if (!gProtectStructs[battlerPrankster].pranksterElevated) return FALSE; + if (GetBattlerSide(battlerPrankster) == GetBattlerSide(battlerDef)) + return FALSE; + if (checkTarget && (gBattleMoves[move].target & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_DEPENDS))) + return FALSE; + if (!IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK)) + return FALSE; + if (gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE) + return FALSE; + + return TRUE; + #endif + return FALSE; } From 6c550cd7490183b25caa294109da057de7824a8f Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 11 Oct 2021 03:16:59 -0300 Subject: [PATCH 069/193] Implemented Retaliate's effect --- include/battle.h | 1 + src/battle_main.c | 3 +++ src/battle_script_commands.c | 1 + src/battle_util.c | 6 +++++- 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/battle.h b/include/battle.h index 826a0929e..aaecb9ea1 100644 --- a/include/battle.h +++ b/include/battle.h @@ -908,5 +908,6 @@ extern u8 gBattleControllerData[MAX_BATTLERS_COUNT]; extern bool8 gHasFetchedBall; extern u8 gLastUsedBall; extern u16 gLastThrownBall; +extern bool8 gCanRetaliate; #endif // GUARD_BATTLE_H diff --git a/src/battle_main.c b/src/battle_main.c index 055ec9bbe..7d4ae76dd 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -231,6 +231,7 @@ EWRAM_DATA struct TotemBoost gTotemBoosts[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA bool8 gHasFetchedBall = FALSE; EWRAM_DATA u8 gLastUsedBall = 0; EWRAM_DATA u16 gLastThrownBall = 0; +EWRAM_DATA bool8 gCanRetaliate = FALSE; // IWRAM common vars void (*gPreBattleCallback1)(void); @@ -2876,6 +2877,8 @@ static void BattleStartClearSetData(void) gHasFetchedBall = FALSE; gLastUsedBall = 0; + gCanRetaliate = FALSE; + gBattlerAttacker = 0; gBattlerTarget = 0; gBattleWeather = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2c017b2df..b3ac59863 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3499,6 +3499,7 @@ static void Cmd_tryfaintmon(void) if (gBattleResults.playerFaintCounter < 0xFF) gBattleResults.playerFaintCounter++; AdjustFriendshipOnBattleFaint(gActiveBattler); + gCanRetaliate = TRUE; } else { diff --git a/src/battle_util.c b/src/battle_util.c index 0bca1c0e7..d588d5b08 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7933,7 +7933,11 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe MulModifier(&modifier, UQ_4_12(2.0)); break; case EFFECT_RETALIATE: - // todo + if (gCanRetaliate) + { + MulModifier(&modifier, UQ_4_12(2.0)); + gCanRetaliate = FALSE; + } break; case EFFECT_SOLARBEAM: if (WEATHER_HAS_EFFECT && gBattleWeather & (WEATHER_HAIL_ANY | WEATHER_SANDSTORM_ANY | WEATHER_RAIN_ANY)) From 791a899eed1a4e34eed30ff80b531a96248f5008 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Mon, 11 Oct 2021 21:29:08 -0400 Subject: [PATCH 070/193] fix sand spit + primal weather --- src/battle_util.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 68e787698..7b0c85078 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5028,20 +5028,21 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED - && !(WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SANDSTORM_ANY) - && TryChangeBattleWeather(battler, ENUM_WEATHER_SANDSTORM, TRUE) - && !(WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_PRIMAL_ANY)) + && !(WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SANDSTORM_ANY)) { - gBattleScripting.battler = gActiveBattler = battler; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SandSpitActivates; - effect++; - } - else if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_PRIMAL_ANY) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BlockedByPrimalWeatherRet; - effect++; + if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_PRIMAL_ANY) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BlockedByPrimalWeatherRet; + effect++; + } + else if (TryChangeBattleWeather(battler, ENUM_WEATHER_SANDSTORM, TRUE)) + { + gBattleScripting.battler = gActiveBattler = battler; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_SandSpitActivates; + effect++; + } } break; case ABILITY_PERISH_BODY: From 11626d5043e94f9e82c458eb60ff49f19476e6bd Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 12 Oct 2021 07:53:28 -0400 Subject: [PATCH 071/193] fix memento fail condition --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2c017b2df..5d483aa3e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -11520,7 +11520,7 @@ static void Cmd_jumpifattackandspecialattackcannotfall(void) // memento && gBattleMons[gBattlerTarget].statStages[STAT_SPATK] == MIN_STAT_STAGE && gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) #else - if (gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED + if (gBattleCommunication[MISS_TYPE] == B_MSG_PROTECTED || gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE || IsBattlerProtected(gBattlerTarget, gCurrentMove) || DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) From bbd09fdcf7ad721542fd3d4b7eca93de0f9a8b14 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 12 Oct 2021 10:32:51 -0400 Subject: [PATCH 072/193] add wandering spirit --- asm/macros/battle_script.inc | 8 +++++ data/battle_scripts_1.s | 26 +++++++++++++++++ include/battle_interface.h | 1 + include/battle_scripts.h | 1 + include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 3 +- src/battle_interface.c | 14 +++++++-- src/battle_message.c | 2 ++ src/battle_script_commands.c | 3 ++ src/battle_util.c | 34 ++++++++++++++++++++++ 10 files changed, 90 insertions(+), 3 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 4d8fe0365..651c59624 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1580,6 +1580,10 @@ .macro showabilitypopup battler:req various \battler, VARIOUS_ABILITY_POPUP .endm + + .macro updateabilitypopup battler:req + various \battler, VARIOUS_UPDATE_ABILITY_POPUP + .endm .macro defogclear battler:req, clear:req, ptr:req various \battler, VARIOUS_DEFOG @@ -1825,6 +1829,10 @@ various BS_ATTACKER, VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER .endm + .macro swapabilities + various BS_ATTACKER, VARIOUS_SWAP_ABILITIES + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e1fb47930..f52493c49 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7676,6 +7676,32 @@ BattleScript_MummyActivates:: waitmessage B_WAIT_TIME_LONG return +BattleScript_WanderingSpiritActivates:: +.if B_ABILITY_POP_UP == TRUE + setbyte sFIXED_ABILITY_POPUP, TRUE + sethword sABILITY_OVERWRITE, ABILITY_WANDERING_SPIRIT + showabilitypopup BS_TARGET + pause 60 + sethword sABILITY_OVERWRITE, 0 + updateabilitypopup BS_TARGET + pause 20 + destroyabilitypopup + pause 40 + + setbyte sFIXED_ABILITY_POPUP, TRUE + copyhword sABILITY_OVERWRITE, gLastUsedAbility + showabilitypopup BS_ATTACKER + pause 60 + sethword sABILITY_OVERWRITE, 0 + updateabilitypopup BS_ATTACKER + pause 20 + destroyabilitypopup + pause 40 +.endif + printstring STRINGID_SWAPPEDABILITIES + waitmessage B_WAIT_TIME_LONG + return + BattleScript_TargetsStatWasMaxedOut:: call BattleScript_AbilityPopUp statbuffchange STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL diff --git a/include/battle_interface.h b/include/battle_interface.h index c852b776a..69bac05f3 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -97,5 +97,6 @@ bool32 CanThrowLastUsedBall(void); void TryHideLastUsedBall(void); void TryRestoreLastUsedBall(void); void TryAddLastUsedBallItemSprites(void); +void UpdateAbilityPopup(u8 battlerId); #endif // GUARD_BATTLE_INTERFACE_H diff --git a/include/battle_scripts.h b/include/battle_scripts.h index cd4600543..d7e8dd3b8 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -398,5 +398,6 @@ extern const u8 BattleScript_MysteriousAirCurrentBlowsOn[]; extern const u8 BattleScript_AttackWeakenedByStrongWinds[]; extern const u8 BattleScript_BlockedByPrimalWeatherEnd3[]; extern const u8 BattleScript_BlockedByPrimalWeatherRet[]; +extern const u8 BattleScript_WanderingSpiritActivates[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index d61eabbf8..5f5c1d0a2 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -185,6 +185,7 @@ #define VARIOUS_REMOVE_TERRAIN 113 #define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 114 #define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 115 +#define VARIOUS_UPDATE_ABILITY_POPUP 116 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index e8fe7e359..bc8023035 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -592,8 +592,9 @@ #define STRINGID_STRONGWINDSDISSIPATED 588 #define STRINGID_MYSTERIOUSAIRCURRENTBLOWSON 589 #define STRINGID_ATTACKWEAKENEDBSTRONGWINDS 590 +#define STRINGID_SWAPPEDABILITIES 591 -#define BATTLESTRINGS_COUNT 591 +#define BATTLESTRINGS_COUNT 592 // The below IDs are all indexes into battle message tables, // used to determine which of a set of messages to print. diff --git a/src/battle_interface.c b/src/battle_interface.c index 0e33455ac..35db3293e 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -3065,8 +3065,8 @@ void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle) gSprites[spriteId2].tRightToLeft = FALSE; } - gBattleStruct->abilityPopUpSpriteIds[gBattleAnimAttacker][0] = spriteId1; - gBattleStruct->abilityPopUpSpriteIds[gBattleAnimAttacker][1] = spriteId2; + gBattleStruct->abilityPopUpSpriteIds[battlerId][0] = spriteId1; + gBattleStruct->abilityPopUpSpriteIds[battlerId][1] = spriteId2; taskId = CreateTask(Task_FreeAbilityPopUpGfx, 5); gTasks[taskId].tSpriteId1 = spriteId1; @@ -3084,6 +3084,16 @@ void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle) RestoreOverwrittenPixels((void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32)); } +void UpdateAbilityPopup(u8 battlerId) +{ + u8 spriteId1 = gBattleStruct->abilityPopUpSpriteIds[battlerId][0]; + u8 spriteId2 = gBattleStruct->abilityPopUpSpriteIds[battlerId][1]; + u16 ability = (gBattleScripting.abilityPopupOverwrite != 0) ? gBattleScripting.abilityPopupOverwrite : gBattleMons[battlerId].ability; + + PrintAbilityOnAbilityPopUp(ability, spriteId1, spriteId2); + RestoreOverwrittenPixels((void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32)); +} + #define FRAMES_TO_WAIT 48 static void SpriteCb_AbilityPopUp(struct Sprite *sprite) diff --git a/src/battle_message.c b/src/battle_message.c index 69463ce69..15ae916c1 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -718,9 +718,11 @@ static const u8 sText_MysteriousAirCurrent[] = _("A mysterious air current is\np static const u8 sText_StrongWindsDissipated[] = _("The mysterious strong winds\nhave dissipated!{PAUSE 64}"); static const u8 sText_MysteriousAirCurrentBlowsOn[] = _("The mysterious air current\nblows on regardless!"); static const u8 sText_AttackWeakenedByStrongWinds[] = _("The mysterious strong winds\nweakened the attack!"); +static const u8 sText_SwappedAbilities[] = _("{B_DEF_NAME_WITH_PREFIX} swapped Abilities\nwith its target!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_SWAPPEDABILITIES - 12] = sText_SwappedAbilities, [STRINGID_ATTACKWEAKENEDBSTRONGWINDS - 12] = sText_AttackWeakenedByStrongWinds, [STRINGID_MYSTERIOUSAIRCURRENTBLOWSON - 12] = sText_MysteriousAirCurrentBlowsOn, [STRINGID_STRONGWINDSDISSIPATED - 12] = sText_StrongWindsDissipated, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2c017b2df..4d767efc0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8317,6 +8317,9 @@ static void Cmd_various(void) case VARIOUS_ABILITY_POPUP: CreateAbilityPopUp(gActiveBattler, gBattleMons[gActiveBattler].ability, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0); break; + case VARIOUS_UPDATE_ABILITY_POPUP: + UpdateAbilityPopup(gActiveBattler); + break; case VARIOUS_DEFOG: if (T1_READ_8(gBattlescriptCurrInstr + 3)) // Clear { diff --git a/src/battle_util.c b/src/battle_util.c index 68e787698..bd655a5a1 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4803,6 +4803,40 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move } } break; + case ABILITY_WANDERING_SPIRIT: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && IsBattlerAlive(gBattlerAttacker) + && TARGET_TURN_DAMAGED + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) + { + switch (gBattleMons[gBattlerAttacker].ability) + { + case ABILITY_DISGUISE: + case ABILITY_FLOWER_GIFT: + case ABILITY_GULP_MISSILE: + case ABILITY_ICE_FACE: + case ABILITY_ILLUSION: + case ABILITY_IMPOSTER: + case ABILITY_RECEIVER: + case ABILITY_RKS_SYSTEM: + case ABILITY_SCHOOLING: + case ABILITY_STANCE_CHANGE: + case ABILITY_WONDER_GUARD: + case ABILITY_ZEN_MODE: + break; + default: + gLastUsedAbility = gBattleMons[gBattlerAttacker].ability; + + gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability; + gBattleMons[gBattlerTarget].ability = gLastUsedAbility; + + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_WanderingSpiritActivates; + effect++; + break; + } + } + break; case ABILITY_ANGER_POINT: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gIsCriticalHit From 25a4da71fe003a1f068f5d87c4cc12d59097420e Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 12 Oct 2021 10:37:59 -0400 Subject: [PATCH 073/193] remove unused macro --- asm/macros/battle_script.inc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 651c59624..2c629d51b 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1828,11 +1828,7 @@ .macro trytoclearprimalweather various BS_ATTACKER, VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER .endm - - .macro swapabilities - various BS_ATTACKER, VARIOUS_SWAP_ABILITIES - .endm - + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 From c0f3b7c3b4ef754ed190e8af169876f6512f4e65 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 12 Oct 2021 11:58:37 -0400 Subject: [PATCH 074/193] record abilities from wandering spirit --- src/battle_util.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index bd655a5a1..9e3c5ff8b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4826,10 +4826,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move break; default: gLastUsedAbility = gBattleMons[gBattlerAttacker].ability; - gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability; gBattleMons[gBattlerTarget].ability = gLastUsedAbility; - + RecordAbilityBattle(gBattlerAttacker, gBattleMons[gBattlerAttacker].ability); + RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_WanderingSpiritActivates; effect++; From 996301d5d33072407fe9143811d27eb31e07e201 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 12 Oct 2021 18:04:34 -0400 Subject: [PATCH 075/193] add mirror armor --- asm/macros/battle_script.inc | 4 ++ data/battle_scripts_1.s | 36 +++++++++++++++ include/battle_scripts.h | 2 + include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 51 +++++++++++++++++----- src/battle_util.c | 7 +-- 6 files changed, 86 insertions(+), 15 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 4d8fe0365..f00e580f0 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1824,6 +1824,10 @@ .macro trytoclearprimalweather various BS_ATTACKER, VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER .endm + + .macro getrandommirrorarmortarget + various BS_TARGET, VARIOUS_GET_RANDOM_MIRROR_ARMOR_TARGET + .endm @ helpful macros .macro setstatchanger stat:req, stages:req, down:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e1fb47930..5979f4c67 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2645,6 +2645,33 @@ BattleScript_StatDownPrintString:: BattleScript_StatDownEnd:: goto BattleScript_MoveEnd +BattleScript_MirrorArmorReflect:: + pause B_WAIT_TIME_SHORT + call BattleScript_AbilityPopUp + jumpifsubstituteblocks BattleScript_AbilityNoSpecificStatLoss +BattleScript_MirrorArmorReflectStatLoss: + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_NOT_PROTECT_AFFECTED, BattleScript_MirrorArmorReflectWontFall + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_MirrorArmorReflectAnim + goto BattleScript_MirrorArmorReflectWontFall +BattleScript_MirrorArmorReflectAnim: + setgraphicalstatchangevalues + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 +BattleScript_MirrorArmorReflectPrintString: + printfromtable gStatDownStringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_MirrorArmorReflectEnd: + return + +BattleScript_MirrorArmorReflectWontFall: + copybyte gBattlerTarget, gBattlerAttacker @ STRINGID_STATSWONTDECREASE uses target + goto BattleScript_MirrorArmorReflectPrintString + +BattleScript_MirrorArmorReflectStickyWeb: + call BattleScript_AbilityPopUp + getrandommirrorarmortarget + jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_AbilityNoSpecificStatLossPrint + goto BattleScript_MirrorArmorReflectStatLoss + BattleScript_StatDown:: playanimation BS_EFFECT_BATTLER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatDownStringIds @@ -6099,6 +6126,7 @@ BattleScript_StickyWebOnSwitchIn:: copybyte gBattlerTarget, sBATTLER printstring STRINGID_STICKYWEBSWITCHIN waitmessage B_WAIT_TIME_LONG + jumpifability BS_TARGET, ABILITY_MIRROR_ARMOR, BattleScript_MirrorArmorReflectStickyWeb statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_StickyWebOnSwitchInEnd jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_StickyWebOnSwitchInStatAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_StickyWebOnSwitchInEnd @@ -7639,6 +7667,7 @@ BattleScript_GrassyTerrainHealEnd: BattleScript_AbilityNoSpecificStatLoss:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp +BattleScript_AbilityNoSpecificStatLossPrint: printstring STRINGID_PKMNSXPREVENTSYLOSS waitmessage B_WAIT_TIME_LONG setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY @@ -7885,6 +7914,13 @@ BattleScript_CuteCharmActivates:: call BattleScript_TryDestinyKnotTarget return +BattleScript_GooeyActivates:: + waitstate + call BattleScript_AbilityPopUp + swapattackerwithtarget @ for defiant, mirror armor + seteffectsecondary + return + BattleScript_AbilityStatusEffect:: waitstate call BattleScript_AbilityPopUp diff --git a/include/battle_scripts.h b/include/battle_scripts.h index cd4600543..4e5568c75 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -398,5 +398,7 @@ extern const u8 BattleScript_MysteriousAirCurrentBlowsOn[]; extern const u8 BattleScript_AttackWeakenedByStrongWinds[]; extern const u8 BattleScript_BlockedByPrimalWeatherEnd3[]; extern const u8 BattleScript_BlockedByPrimalWeatherRet[]; +extern const u8 BattleScript_MirrorArmorReflect[]; +extern const u8 BattleScript_GooeyActivates[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index d61eabbf8..bbf5714e9 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -185,6 +185,7 @@ #define VARIOUS_REMOVE_TERRAIN 113 #define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 114 #define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 115 +#define VARIOUS_GET_RANDOM_MIRROR_ARMOR_TARGET 116 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2c017b2df..9c0b4ec37 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2582,6 +2582,8 @@ void SetMoveEffect(bool32 primary, u32 certain) { s32 i, byTwo, affectsUser = 0; bool32 statusChanged = FALSE; + bool32 mirrorArmorReflected = (GetBattlerAbility(gBattlerTarget) == ABILITY_MIRROR_ARMOR); + u32 flags; switch (gBattleScripting.moveEffect) // Set move effects which happen later on { @@ -3012,11 +3014,18 @@ void SetMoveEffect(bool32 primary, u32 certain) case MOVE_EFFECT_SP_DEF_MINUS_1: case MOVE_EFFECT_ACC_MINUS_1: case MOVE_EFFECT_EVS_MINUS_1: - if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE, - gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_1 + 1, - affectsUser, 0)) + flags = affectsUser | certain; + if (mirrorArmorReflected && !affectsUser) { - gBattlescriptCurrInstr++; + flags |= STAT_BUFF_ALLOW_PTR; + } + + if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE, + gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_1 + 1, + flags, gBattlescriptCurrInstr + 1)) + { + if (!mirrorArmorReflected) + gBattlescriptCurrInstr++; } else { @@ -8822,6 +8831,25 @@ static void Cmd_various(void) } break; } + case VARIOUS_GET_RANDOM_MIRROR_ARMOR_TARGET: + i = BATTLE_OPPOSITE(gActiveBattler); + gBattlerAttacker = gBattlerTarget; + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + if (IsBattlerAlive(i) + && !(gBattleMons[i].status2 & STATUS2_SUBSTITUTE)) + gBattlerAttacker = i; + else if (IsBattlerAlive(BATTLE_PARTNER(i)) + && !(gBattleMons[BATTLE_PARTNER(i)].status2 & STATUS2_SUBSTITUTE)) + gBattlerAttacker = BATTLE_PARTNER(i); + } + else + { + if (IsBattlerAlive(i) && !(gBattleMons[i].status2 & STATUS2_SUBSTITUTE)) + gBattlerAttacker = i; + } + SET_STATCHANGER(STAT_SPEED, 1, TRUE); + break; } gBattlescriptCurrInstr += 3; @@ -9355,8 +9383,9 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr bool32 certain = FALSE; bool32 notProtectAffected = FALSE; u32 index; + bool32 affectsUser = flags & MOVE_EFFECT_AFFECTS_USER; - if (flags & MOVE_EFFECT_AFFECTS_USER) + if (affectsUser) gActiveBattler = gBattlerAttacker; else gActiveBattler = gBattlerTarget; @@ -9457,8 +9486,9 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr } return STAT_CHANGE_DIDNT_WORK; } - else if (GetBattlerAbility(gActiveBattler) == ABILITY_KEEN_EYE - && !certain && statId == STAT_ACC) + else if (!certain + && ((GetBattlerAbility(gActiveBattler) == ABILITY_KEEN_EYE && statId == STAT_ACC) + || (GetBattlerAbility(gActiveBattler) == ABILITY_HYPER_CUTTER && statId == STAT_ATK))) { if (flags == STAT_BUFF_ALLOW_PTR) { @@ -9471,17 +9501,14 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr } return STAT_CHANGE_DIDNT_WORK; } - else if (GetBattlerAbility(gActiveBattler) == ABILITY_HYPER_CUTTER - && !certain && statId == STAT_ATK) + else if (GetBattlerAbility(gActiveBattler) == ABILITY_MIRROR_ARMOR && !affectsUser && gBattlerAttacker != gBattlerTarget && gActiveBattler == gBattlerTarget) { if (flags == STAT_BUFF_ALLOW_PTR) { BattleScriptPush(BS_ptr); gBattleScripting.battler = gActiveBattler; gBattlerAbility = gActiveBattler; - gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; - gLastUsedAbility = GetBattlerAbility(gActiveBattler); - RecordAbilityBattle(gActiveBattler, gLastUsedAbility); + gBattlescriptCurrInstr = BattleScript_MirrorArmorReflect; } return STAT_CHANGE_DIDNT_WORK; } diff --git a/src/battle_util.c b/src/battle_util.c index 68e787698..37cc17644 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4835,15 +4835,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move case ABILITY_TANGLING_HAIR: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerAttacker].hp != 0 - && CompareStat(gBattlerAttacker, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN) + && (CompareStat(gBattlerAttacker, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN) || GetBattlerAbility(gBattlerAttacker) == ABILITY_MIRROR_ARMOR) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED && IsMoveMakingContact(move, gBattlerAttacker)) { - gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_SPD_MINUS_1; + SET_STATCHANGER(STAT_SPEED, 1, TRUE); + gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; + gBattlescriptCurrInstr = BattleScript_GooeyActivates; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; effect++; } From f9272a89fa3fade69f26a37462cc2fe93e9abc15 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 12 Oct 2021 21:09:27 -0400 Subject: [PATCH 076/193] add mirror armor check to two-stage stat decrease effects --- src/battle_script_commands.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9c0b4ec37..253f87c1c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3016,9 +3016,7 @@ void SetMoveEffect(bool32 primary, u32 certain) case MOVE_EFFECT_EVS_MINUS_1: flags = affectsUser | certain; if (mirrorArmorReflected && !affectsUser) - { flags |= STAT_BUFF_ALLOW_PTR; - } if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE, gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_1 + 1, @@ -3063,11 +3061,15 @@ void SetMoveEffect(bool32 primary, u32 certain) case MOVE_EFFECT_SP_DEF_MINUS_2: case MOVE_EFFECT_ACC_MINUS_2: case MOVE_EFFECT_EVS_MINUS_2: + flags = affectsUser | certain; + if (mirrorArmorReflected && !affectsUser) + flags |= STAT_BUFF_ALLOW_PTR; if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE, gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_2 + 1, - affectsUser, 0)) + flags, gBattlescriptCurrInstr + 1)) { - gBattlescriptCurrInstr++; + if (!mirrorArmorReflected) + gBattlescriptCurrInstr++; } else { From 3248bd796aae7c25eed0314f4d84dccc4c6eed2b Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 12 Oct 2021 21:49:18 -0400 Subject: [PATCH 077/193] add quick draw --- data/battle_scripts_1.s | 8 ++++++ include/battle.h | 1 + include/battle_scripts.h | 1 + src/battle_main.c | 58 +++++++++++++++++++++++++++++----------- src/battle_message.c | 2 +- 5 files changed, 54 insertions(+), 16 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e1fb47930..eac3fc58c 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8461,6 +8461,14 @@ BattleScript_QuickClawActivation:: waitmessage B_WAIT_TIME_LONG end2 +BattleScript_QuickDrawActivation:: + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 + call BattleScript_AbilityPopUp + printstring STRINGID_CANACTFASTERTHANKSTO + waitmessage B_WAIT_TIME_LONG + end2 + BattleScript_CustapBerryActivation:: printstring STRINGID_EMPTYSTRING3 waitmessage 1 diff --git a/include/battle.h b/include/battle.h index 826a0929e..6c4cf290c 100644 --- a/include/battle.h +++ b/include/battle.h @@ -151,6 +151,7 @@ struct ProtectStruct u32 disableEjectPack:1; u32 statFell:1; u32 pranksterElevated:1; + u32 quickDraw:1; u32 physicalDmg; u32 specialDmg; u8 physicalBattlerId; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index cd4600543..b5ac64972 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -365,6 +365,7 @@ extern const u8 BattleScript_PerishBodyActivates[]; extern const u8 BattleScript_ActivateAsOne[]; extern const u8 BattleScript_RaiseStatOnFaintingTarget[]; extern const u8 BattleScript_QuickClawActivation[]; +extern const u8 BattleScript_QuickDrawActivation[]; extern const u8 BattleScript_CustapBerryActivation[]; extern const u8 BattleScript_MicleBerryActivateEnd2[]; extern const u8 BattleScript_MicleBerryActivateRet[]; diff --git a/src/battle_main.c b/src/battle_main.c index 055ec9bbe..ee3f57e35 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4379,20 +4379,32 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) u32 holdEffectBattler1 = 0, holdEffectBattler2 = 0; s8 priority1 = 0, priority2 = 0; + // Battler 1 speedBattler1 = GetBattlerTotalSpeedStat(battler1); holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); - if ((holdEffectBattler1 == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler1)) / 100) + // Quick Draw + if (!ignoreChosenMoves && GetBattlerAbility(battler1) == ABILITY_QUICK_DRAW && !IS_MOVE_STATUS(gChosenMoveByBattler[battler1]) && Random() % 100 < 30) + gProtectStructs[battler1].quickDraw = TRUE; + // Quick Claw and Custap Berry + if (!gProtectStructs[battler1].quickDraw + && ((holdEffectBattler1 == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler1)) / 100) || (!IsAbilityOnOpposingSide(battler1, ABILITY_UNNERVE) && holdEffectBattler1 == HOLD_EFFECT_CUSTAP_BERRY - && HasEnoughHpToEatBerry(battler1, 4, gBattleMons[battler1].item))) + && HasEnoughHpToEatBerry(battler1, 4, gBattleMons[battler1].item)))) gProtectStructs[battler1].custap = TRUE; + // Battler 2 speedBattler2 = GetBattlerTotalSpeedStat(battler2); holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); - if ((holdEffectBattler2 == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler2)) / 100) + // Quick Draw + if (!ignoreChosenMoves && GetBattlerAbility(battler2) == ABILITY_QUICK_DRAW && !IS_MOVE_STATUS(gChosenMoveByBattler[battler2]) && Random() % 100 < 30) + gProtectStructs[battler2].quickDraw = TRUE; + // Quick Claw and Custap Berry + if (!gProtectStructs[battler2].quickDraw + && ((holdEffectBattler2 == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler2)) / 100) || (!IsAbilityOnOpposingSide(battler2, ABILITY_UNNERVE) && holdEffectBattler2 == HOLD_EFFECT_CUSTAP_BERRY - && HasEnoughHpToEatBerry(battler2, 4, gBattleMons[battler2].item))) + && HasEnoughHpToEatBerry(battler2, 4, gBattleMons[battler2].item)))) gProtectStructs[battler2].custap = TRUE; if (!ignoreChosenMoves) @@ -4408,8 +4420,12 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) // QUICK CLAW / CUSTAP - always first // LAGGING TAIL - always last // STALL - always last - - if (gProtectStructs[battler1].custap && !gProtectStructs[battler2].custap) + + if (gProtectStructs[battler1].quickDraw && !gProtectStructs[battler2].quickDraw) + strikesFirst = 0; + else if (!gProtectStructs[battler1].quickDraw && gProtectStructs[battler2].quickDraw) + strikesFirst = 1; + else if (gProtectStructs[battler1].custap && !gProtectStructs[battler2].custap) strikesFirst = 0; else if (gProtectStructs[battler2].custap && !gProtectStructs[battler1].custap) strikesFirst = 1; @@ -4670,22 +4686,34 @@ static void CheckQuickClaw_CustapBerryActivation(void) gBattleStruct->quickClawBattlerId++; if (gChosenActionByBattler[gActiveBattler] == B_ACTION_USE_MOVE && gChosenMoveByBattler[gActiveBattler] != MOVE_FOCUS_PUNCH // quick claw message doesn't need to activate here - && gProtectStructs[gActiveBattler].custap + && (gProtectStructs[gActiveBattler].custap || gProtectStructs[gActiveBattler].quickDraw) && !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) && !(gDisableStructs[gBattlerAttacker].truantCounter) && !(gProtectStructs[gActiveBattler].noValidMoves)) { - gProtectStructs[gActiveBattler].custap = FALSE; - gLastUsedItem = gBattleMons[gActiveBattler].item; - if (GetBattlerHoldEffect(gActiveBattler, FALSE) == HOLD_EFFECT_CUSTAP_BERRY) + if (gProtectStructs[gActiveBattler].custap) { - // don't record berry since its gone now - BattleScriptExecute(BattleScript_CustapBerryActivation); + gProtectStructs[gActiveBattler].custap = FALSE; + gLastUsedItem = gBattleMons[gActiveBattler].item; + PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); + if (GetBattlerHoldEffect(gActiveBattler, FALSE) == HOLD_EFFECT_CUSTAP_BERRY) + { + // don't record berry since its gone now + BattleScriptExecute(BattleScript_CustapBerryActivation); + } + else + { + RecordItemEffectBattle(gActiveBattler, GetBattlerHoldEffect(gActiveBattler, FALSE)); + BattleScriptExecute(BattleScript_QuickClawActivation); + } } - else + else if (gProtectStructs[gActiveBattler].quickDraw) { - RecordItemEffectBattle(gActiveBattler, GetBattlerHoldEffect(gActiveBattler, FALSE)); - BattleScriptExecute(BattleScript_QuickClawActivation); + gProtectStructs[gActiveBattler].quickDraw = FALSE; + gLastUsedAbility = gBattleMons[gActiveBattler].ability; + PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); + RecordAbilityBattle(gActiveBattler, gLastUsedAbility); + BattleScriptExecute(BattleScript_QuickDrawActivation); } return; } diff --git a/src/battle_message.c b/src/battle_message.c index 69463ce69..4bc6330b2 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -692,7 +692,7 @@ static const u8 sText_PkmnsWillPerishIn3Turns[] = _("Both Pokémon will perish\n static const u8 sText_AbilityRaisedStatDrastically[] = _("{B_DEF_ABILITY} raised {B_DEF_NAME_WITH_PREFIX}'s\n{B_BUFF1} drastically!"); static const u8 sText_AsOneEnters[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} has two Abilities!"); static const u8 sText_CuriousMedicineEnters[] = _("{B_EFF_NAME_WITH_PREFIX}'s\nstat changes were reset!"); -static const u8 sText_CanActFaster[] = _("{B_ATK_NAME_WITH_PREFIX} can act faster,\nthanks to {B_LAST_ITEM}!"); +static const u8 sText_CanActFaster[] = _("{B_ATK_NAME_WITH_PREFIX} can act faster,\nthanks to {B_BUFF1}!"); static const u8 sText_MicleBerryActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} boosted the accuracy of its\nnext move using {B_LAST_ITEM}!"); static const u8 sText_PkmnShookOffTheTaunt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} shook off\nthe taunt!"); static const u8 sText_PkmnGotOverItsInfatuation[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} got over\nits infatuation!"); From b447d582cd6f929acc7aaeba3eb313dfe7df3891 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 13 Oct 2021 09:04:03 -0400 Subject: [PATCH 078/193] fix terrain timer decrementing and bg changing with anims disabled --- src/battle_script_commands.c | 31 ++++++++++++++++--------------- src/battle_util.c | 6 +++--- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2c017b2df..6852dee1e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4527,12 +4527,13 @@ static void Cmd_endselectionscript(void) static void Cmd_playanimation(void) { const u16* argumentPtr; + u8 animId = gBattlescriptCurrInstr[2]; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); argumentPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3); #if B_TERRAIN_BG_CHANGE == FALSE - if (gBattlescriptCurrInstr[2] == B_ANIM_RESTORE_BG) + if (animId == B_ANIM_RESTORE_BG) { // workaround for .if not working gBattlescriptCurrInstr += 7; @@ -4540,28 +4541,28 @@ static void Cmd_playanimation(void) } #endif - if (gBattlescriptCurrInstr[2] == B_ANIM_STATS_CHANGE - || gBattlescriptCurrInstr[2] == B_ANIM_SNATCH_MOVE - || gBattlescriptCurrInstr[2] == B_ANIM_MEGA_EVOLUTION - || gBattlescriptCurrInstr[2] == B_ANIM_ILLUSION_OFF - || gBattlescriptCurrInstr[2] == B_ANIM_FORM_CHANGE - || gBattlescriptCurrInstr[2] == B_ANIM_SUBSTITUTE_FADE) + if (animId == B_ANIM_STATS_CHANGE + || animId == B_ANIM_SNATCH_MOVE + || animId == B_ANIM_MEGA_EVOLUTION + || animId == B_ANIM_ILLUSION_OFF + || animId == B_ANIM_FORM_CHANGE + || animId == B_ANIM_SUBSTITUTE_FADE) { - BtlController_EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr); + BtlController_EmitBattleAnimation(0, animId, *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 7; } - else if (gHitMarker & HITMARKER_NO_ANIMATIONS) + else if (gHitMarker & HITMARKER_NO_ANIMATIONS && animId != B_ANIM_RESTORE_BG) { BattleScriptPush(gBattlescriptCurrInstr + 7); gBattlescriptCurrInstr = BattleScript_Pausex20; } - else if (gBattlescriptCurrInstr[2] == B_ANIM_RAIN_CONTINUES - || gBattlescriptCurrInstr[2] == B_ANIM_SUN_CONTINUES - || gBattlescriptCurrInstr[2] == B_ANIM_SANDSTORM_CONTINUES - || gBattlescriptCurrInstr[2] == B_ANIM_HAIL_CONTINUES) + else if (animId == B_ANIM_RAIN_CONTINUES + || animId == B_ANIM_SUN_CONTINUES + || animId == B_ANIM_SANDSTORM_CONTINUES + || animId == B_ANIM_HAIL_CONTINUES) { - BtlController_EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr); + BtlController_EmitBattleAnimation(0, animId, *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 7; } @@ -4571,7 +4572,7 @@ static void Cmd_playanimation(void) } else { - BtlController_EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr); + BtlController_EmitBattleAnimation(0, animId, *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 7; } diff --git a/src/battle_util.c b/src/battle_util.c index 68e787698..68e52f49d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2234,7 +2234,7 @@ u8 DoFieldEndTurnEffects(void) break; case ENDTURN_ELECTRIC_TERRAIN: if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN - && ((!gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.electricTerrainTimer == 0)) + && (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.electricTerrainTimer == 0)) { gFieldStatuses &= ~(STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_TERRAIN_PERMANENT); BattleScriptExecute(BattleScript_ElectricTerrainEnds); @@ -2244,7 +2244,7 @@ u8 DoFieldEndTurnEffects(void) break; case ENDTURN_MISTY_TERRAIN: if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN - && ((!gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.mistyTerrainTimer == 0)) + && (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.mistyTerrainTimer == 0)) { gFieldStatuses &= ~(STATUS_FIELD_MISTY_TERRAIN); BattleScriptExecute(BattleScript_MistyTerrainEnds); @@ -2266,7 +2266,7 @@ u8 DoFieldEndTurnEffects(void) break; case ENDTURN_PSYCHIC_TERRAIN: if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN - && ((!gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.psychicTerrainTimer == 0)) + && (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.psychicTerrainTimer == 0)) { gFieldStatuses &= ~(STATUS_FIELD_PSYCHIC_TERRAIN); BattleScriptExecute(BattleScript_PsychicTerrainEnds); From 5108d173fc2970dc3fed4514d173eb6e5a693c2b Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 13 Oct 2021 10:11:02 -0400 Subject: [PATCH 079/193] fix protect struct fields being set during ai calcs --- src/battle_ai_main.c | 6 +++++- src/battle_main.c | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 2ab6e287e..188b30cee 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -209,7 +209,11 @@ u8 BattleAI_ChooseMoveOrAction(void) ret = ChooseMoveOrAction_Singles(); else ret = ChooseMoveOrAction_Doubles(); - + + // Clear protect structures, some flags may be set during AI calcs + // e.g. pranksterElevated from GetMovePriority + memset(&gProtectStructs[gActiveBattler], 0, sizeof(struct ProtectStruct)); + gCurrentMove = savedCurrentMove; return ret; } diff --git a/src/battle_main.c b/src/battle_main.c index 055ec9bbe..a304defee 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3097,6 +3097,7 @@ void FaintClearSetData(void) gProtectStructs[gActiveBattler].usedThroatChopPreventedMove = 0; gProtectStructs[gActiveBattler].statRaised = 0; gProtectStructs[gActiveBattler].statFell = 0; + gProtectStructs[gActiveBattler].pranksterElevated = 0; gDisableStructs[gActiveBattler].isFirstTurn = 2; From 7f2efb66190eb7351d8fae56b5e436d5d419dcb2 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 13 Oct 2021 18:39:24 -0400 Subject: [PATCH 080/193] format fixes, fix healing berries from printing message at full hp --- data/battle_scripts_1.s | 8 ++++---- src/battle_util.c | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e842ddc39..cda99c54d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -380,7 +380,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_SNIPE_SHOT .4byte BattleScript_EffectTripleHit @ EFFECT_TRIPLE_HIT .4byte BattleScript_EffectRecoilHP25 @ EFFECT_RECOIL_HP_25 - .4byte BattleScript_EffectStuffCheeks @ EFFECT_STUFF_CHEEKS + .4byte BattleScript_EffectStuffCheeks @ EFFECT_STUFF_CHEEKS BattleScript_EffectStuffCheeks:: attackcanceler @@ -398,7 +398,7 @@ BattleScript_StuffCheeksEatBerry: setstatchanger STAT_DEF, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_StuffCheeksEnd setgraphicalstatchangevalues - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StuffCheeksEnd @ cant raise def + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StuffCheeksEnd @ cant raise def playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -661,8 +661,8 @@ BattleScript_MoveEffectBugBite:: printstring STRINGID_BUGBITE waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_NO_ANIMATIONS - setbyte sBERRY_OVERRIDE, TRUE @ override the requirements for eating berries - consumeberry BS_ATTACKER, TRUE @ consume the berry, then restore the item from changedItems + setbyte sBERRY_OVERRIDE, TRUE @ override the requirements for eating berries + consumeberry BS_ATTACKER, TRUE @ consume the berry, then restore the item from changedItems bicword gHitMarker, HITMARKER_NO_ANIMATIONS setbyte sBERRY_OVERRIDE, FALSE return diff --git a/src/battle_util.c b/src/battle_util.c index 6ecc755f6..88350b7c4 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5862,7 +5862,8 @@ u8 TryHandleSeed(u8 battler, u32 terrainFlag, u8 statId, u16 itemId, bool32 exec static u8 ItemHealHp(u32 battlerId, u32 itemId, bool32 end2, bool32 percentHeal) { - if (HasEnoughHpToEatBerry(battlerId, 2, itemId)) + if (HasEnoughHpToEatBerry(battlerId, 2, itemId) + && !(gBattleScripting.overrideBerryRequirements && gBattleMons[battlerId].hp == gBattleMons[battlerId].maxHP)) { if (percentHeal) gBattleMoveDamage = (gBattleMons[battlerId].maxHP * GetBattlerHoldEffectParam(battlerId) / 100) * -1; From e12c7c07acefaae2d8324cf173e413404a39041a Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 13 Oct 2021 21:01:47 -0400 Subject: [PATCH 081/193] New move tilemap bins are easier to edit --- .../battle_anims/backgrounds/dark_void.bin | Bin 1236 -> 2048 bytes .../backgrounds/new/aeroblast_map.bin | Bin 804 -> 896 bytes .../backgrounds/new/blackhole_eclipse.bin | Bin 892 -> 896 bytes .../backgrounds/new/bloom_doom.bin | Bin 564 -> 896 bytes .../backgrounds/new/bolt_strike.bin | Bin 780 -> 896 bytes .../backgrounds/new/clangorous_soulblaze.bin | Bin 700 -> 2048 bytes .../backgrounds/new/dark_void.bin | Bin 1236 -> 2048 bytes .../backgrounds/new/electric_terrain.bin | Bin 2020 -> 4096 bytes .../battle_anims/backgrounds/new/fire1.bin | Bin 684 -> 896 bytes .../backgrounds/new/focus_blast.bin | Bin 952 -> 896 bytes .../backgrounds/new/giga_impact_opponent.bin | Bin 704 -> 896 bytes .../backgrounds/new/giga_impact_player.bin | Bin 744 -> 896 bytes .../backgrounds/new/grassy_terrain.bin | Bin 2244 -> 4096 bytes .../backgrounds/new/high_speed.bin | Bin 496 -> 896 bytes .../backgrounds/new/hydro_cannon.bin | Bin 880 -> 4096 bytes .../backgrounds/new/hydro_pump.bin | Bin 224 -> 896 bytes .../backgrounds/new/inferno_overdrive.bin | Bin 556 -> 896 bytes .../backgrounds/new/leaf_storm.bin | Bin 924 -> 896 bytes .../backgrounds/new/malicious_moonsault.bin | Bin 544 -> 896 bytes .../backgrounds/new/max_lightning.bin | Bin 744 -> 896 bytes .../backgrounds/new/misty_terrain.bin | Bin 2180 -> 4096 bytes .../backgrounds/new/neverending_nightmare.bin | Bin 744 -> 896 bytes .../backgrounds/new/nightmare.bin | Bin 756 -> 896 bytes .../backgrounds/new/psychic_terrain.bin | Bin 1904 -> 4096 bytes .../backgrounds/new/rock_wrecker.bin | Bin 676 -> 896 bytes .../backgrounds/new/shattered_psyche.bin | Bin 808 -> 896 bytes .../battle_anims/backgrounds/new/sky_day.bin | Bin 1052 -> 896 bytes .../backgrounds/new/snuggle_forever.bin | Bin 988 -> 896 bytes .../new/soulstealing_7star_strike.bin | Bin 968 -> 896 bytes .../backgrounds/new/spacial_rend_opponent.bin | Bin 1000 -> 896 bytes .../backgrounds/new/spacial_rend_player.bin | Bin 996 -> 896 bytes .../backgrounds/new/trick_room.bin | Bin 844 -> 896 bytes .../backgrounds/new/twinkle_tackle.bin | Bin 784 -> 896 bytes .../backgrounds/new/water_pulse.bin | Bin 600 -> 896 bytes .../backgrounds/new/waterfall.bin | Bin 2128 -> 2048 bytes .../backgrounds/new/zmove_activate.bin | Bin 520 -> 896 bytes .../backgrounds/new/zmove_mountain.bin | Bin 760 -> 896 bytes .../backgrounds/spacial_rend_opponent.bin | Bin 1000 -> 896 bytes .../backgrounds/spacial_rend_player.bin | Bin 996 -> 896 bytes 39 files changed, 0 insertions(+), 0 deletions(-) diff --git a/graphics/battle_anims/backgrounds/dark_void.bin b/graphics/battle_anims/backgrounds/dark_void.bin index 922b72bc74d7f5c773331b1af537d54c2e939038..97b879f01ba8ebc08c92d30497c894a1a7b186c8 100644 GIT binary patch literal 2048 zcmeH`W0Rg)6h-HaZF8-pgO1IPZM$RJwr!_l+qP|IY}=lBlA3=pUAJznefB-)!?{&E zL<~a2Bo?uWLtNq!p9CZ%5s3poNpO>rjO3&sC8Q3JlqG_4l&1m}sYGR}P?c&_rv^2t zMQ!R(mwMEv0S#$HW17&EW;CY-Eont-+7L-w+R>g4bfgoV=|We!(VZUjq!+#ELtpyQ zp8*VH5Q7=QP=+y_5sYLMqZz|k#xb4=Ok@(1nZi`2F`XIAWEQiT!(8Sup9L&r5sO*E zQkJot6|7_xQNhoISj`&NvMx{|*0X_)Y+^H8*c#N^*#64j!A^Fun?3AhANx7LK@M@4 zBOK)z$2q}CPH~zuoaG$nxxhs(ahWSz$y!A)*)n>*a)9`|{`Lmu&%Cp_gD&w0V? zyuq8i#oN5YyS&Hye87i%#K(NXr+miee8HD|#n*hpw|vL<{J@X=#LxV~ul&aE{K236 z#ozqHYle(rOk)|_IL0-e@l9Yt6Pef~CN-JKO<_t?nc6g_HJ$0rU`8{U*(_!iHJjND zGlx0NWp2aGV_x%_-vSo2kcBN`QHxpJ5|%VXDN9=>V2HATddZh3!g7|kLQq$^Beaj3%_?g&RZ%F&K-tm7Q-1SdMl$xd;q z)12-MXFAK-&T+2uobLh`y2!;YajDB(?h04B$|zU6#JKX6m zce}^E?sLBfJm?`0d&Hw2^SCEG=_yZp#3~?@CWcYb6c+pE<_KH`%=5=p)(_7y5 ij(5H1eINMHM?Ut6PkrWdUj%c}`H#+jbpHRZ`TrM_mOTvs literal 1236 zcmb`DQ*a�EG8%o2G73rS7+FiquMtziyh^wr$(CZQHhOoNf1v=K6Sd&o{d-JM+!# z?1m|k6d)b};-dtFkdRQ6h{PlzDQS|CToEahDJ2RcoK&PHK^oGMP6Z+eOHT$xXCxEK zOct_|4S~r{4irgFa*-S5A&R`@L-{E{K?P#29(hYT|2R-S9deeu#^h5m_z(59}!3<$2!_aU>Fp^PdG-DXcI5eIKOk@(8%oL_F z4NYeTGns{EGl#j%L-Sd{LKdOLEMY0j2rOp>D_IrD@cQJ{tYIy|b%B@w>)C)dvWd-X zq3YH^t8Hv2Vh7sEE_SmA?PVYPIe-pwh{GH~M>)oEPN0*V;xuQ_St#dB$^Ipf`Avw|E=9!@Io4`{)BcMs-jiR)m_6itr*vGtZO@1M=^C>&-EQ_Kx{)da$^UZs9jSxb8`ng_)6>wZ>$5AZ+_vIcvIhkBSb+#@{FqpZ;$ zKhm)_x!GK_9XX`-qSFn04GIeA1^Ja@uEn zwo>kMfr@G!b>0_z(YoZzzT&IaHDC7)-?VP|w(t0^bd-nn#)T*@>76<6rwQk z6rregi&30}6jg$fl%h0cC~Np~l&1m}HCc(uRH3TgrW)0$K~3$|qPE&P)YbFrQJ)6- z){sUtrU^|A-%Rt(X`$Jcw4ya_XiGcV(}9lK>!kV4#787=(1otVhjyboJ?Qz*_oBCE z`_NatHT~$%00uIM!3;^Uxp~G=hB2HGjARs}4L^pljAOj|2~0HnBqpn$!c?X){Xd_; z3}!Nm+00?C;pZ`*1uRs*h{Y^1pC7uEWxD@zR?xweym|6-rS?{-U(FiB=VUGGSg(Eq z8`-3OGh5ioHnvmLwBx_?cd|?Gw3|KbWuM{qb3n~O^>!TMFh@AbF^+SBlbqr-XHrZ! z%Q+G`&jl`WiOYt!jt>prIES(cnxM9CdRheWw;GppQG?xW=B zK(0uoShF2+)RwC|Ay;yio3`Z-c)#9GG)^3YB_<9VDMC@=@gc=1P68#6l9Zw}4xV3< z6G@^Bl1y33Q65PlC9MJ#@l~QSj$4JQ7N7*gttJGiP7P`bAyTPD?WpvKCyhGP73xu+ z2BZrOX+&e1_-INq+~&0K(UMk@9p(YS#Uq2(LK`w^OS{Q3|3TW*A!<4bo#;##9)hk! zvgk&4=pnfe)01BCh~z&?ZypQKM-KL-pM?9v0ErA_5RXTt(_n`11W$$-N^F=EJjK&d zDR_ow8P0RU2%cvoqe8r3{4dJH(PVmQSvg}EOJ>N7V>}a>IMDS^BHM&tA|kHXM9Ec3Uq=8^qnnri_TanGe`v3bx{W z$TlnCBR)nxVLPAFE|~dQUTgxxznI>|d_pU9ZSDzNs;+`h1PtX!tQl*rZR!99RiJGKkG+FbU=1#b*mecYoDOy1*Y9-C6 z?73C6s@idur;-uSY8q6jt~Io#hE!6ume$rZb?RtcG4-^*N&`*ThT2G_u{P1BdJk%x B*LVN` diff --git a/graphics/battle_anims/backgrounds/new/blackhole_eclipse.bin b/graphics/battle_anims/backgrounds/new/blackhole_eclipse.bin index 27457c9a1651b819f7523b850c7d82f049f802ba..54c73addcf4edf828bf0826820bd8a5f61b947db 100644 GIT binary patch literal 896 zcmZ9~Wl$DC6op~26$AwZ1(o+$fP#sFqJpAg2cdupDi#*l-QC^Y-QC^Y-QC@}ANoU` zJ9BqtXP$e{?5q`uNkUSRk(?ByBo(Q##)dT5Vn2%L{pFYG$4kCG@>z0Xi6;2 zXif{Wvn8#FBc9f@p)KubPX{{E$!zXS7rN4o?)0E1z35FJ`qIzj>(2lNGRSB@1~Y`A z3}ZMW7|AF`GlsE@V>}a>$Ry(@Gli*4V>&aK$t-3whq=sSzR?R<$RZZAgrzKFxzUzd z!Ae%Knl-Fto$>40z(zK)nJsK(8{65zPIei;+xUg-VK4jG&jAi5_(L4#2uC@_aZYfO zQ=H}uXF11tE^yJfOI+rPIjzTLQ|TN zh>~bd3tFO9v?dvlX+sKaQ9Ig`N*a+4bfi;Nn2s{&Ocydy7G3E^chrNP^rAP)rVlyv zC7Me=<%YzFwO zlu|}e&PA+ay$%K!a|s*Rs2$2-6PI!sx|}PxlB>|wRB#Q~qU*Sx8@Q3!O$u-37H&ni zv6(I0jw-o>JGqPK-Q1%S_p%k;$2PWeKZy_UpmL+ZLp&@VVF!=$80=KIi^q9FJjqi$ z%`;**dw7=T(x?iu_A1=U^Wp_w)td7JuEAI4vM7lHFS?=OYXSu7~ z&E4I@J>_2R?QHi+agMV4I#*#rp^`KDIdsfPdG1e`86T!a3nBwN(1TPo*c#%Y&i62@ zz{5SlBb_+PqqQNSqR?aHu^#6lkFP2VGxH~Sq9<9CJ;hU9Y)$iY&+trZmS=m8=Q=iz X^7&ri5^JFsd9jx`vee7GoPB2iycXQs diff --git a/graphics/battle_anims/backgrounds/new/bloom_doom.bin b/graphics/battle_anims/backgrounds/new/bloom_doom.bin index 3d27e562722661103aa46eb75c10c7e79aa9e6a6..9ea250a3406697b9016ffbcfeb24a4239fc64e8d 100644 GIT binary patch literal 896 zcmc)FRdbX<5QX6i1Wj=Fhp@Q2ySux)ySux)ySqzpcmG9vfn|47l>+Xl_oC1A^yxDb zC+@$IPWm*nyx{-0}n}uY3Xd6$mJ(kirr|MHCG( zizyy>e^DZ$es}&{Dfy3%BuSyPca;)SS{Y@PQ(grXRZ>|MRaH}64K>wLTOD=PQ(prO zHPSdpZKCPV+DvmTwA4y#Z35bA7o1XPuY-;{>8y*cx`pYkhn{-rt&hI?=^soEFwh`_ z4KdU(!;LV~D5H%r);Qx$FwrEFO)=Fp)5Du)m}!>T=9p`q`4(7ck;Rr+YMJF$SZS5j z)>vzu^)}dOlg+l+YMbqL*lCyD_SkEm{SG+jki(8R>X_qBIO&wr&N%Cw^DemPlFP2R z>YD2TH{5i~ZFk&tPjZC&9(d@H$DVlVnde@3>6O>PA7gprt#{ssdr^N>eMmJQ>rK%g ZeTupN9LbORlYQ|uW+wH9Z@$Oe{Q$aEw|oEq literal 564 zcmYMtXM0O=0LJ0x-yE7~tEY%nwW%XhmwK4`Bm`1vpzPF!G*T#N8b^JuDR7M!XyW=^Q>gMZ(*6~8ep3;k z8O>=STGEQvv=MD-M|(PmAnA0Zljuwry3$Q_Cxae@y!51({`4m75Feored!lRe+Dp6 zW>Ap9O0rERLr@k&$z~Y#a7IK-4kOVhMl*)7SmVfLyh0PuL?$trDQGHDrZFAOU?#Je zjpi_ydCW%(SjZw4V=W<%rID;VgaqUJGr!c(5{9KE1|m%PHfrjj?j)i0;SyyHC|`1m{G i&kN^eeyT{1g+G(~#mV{VhE?{B@0D&wr054fozlNxSdwS} diff --git a/graphics/battle_anims/backgrounds/new/bolt_strike.bin b/graphics/battle_anims/backgrounds/new/bolt_strike.bin index 7a42421cfe5d80048db9e21a752d08d0c2f72e86..32f51b6fe04f6622fa11ef209a5411354fc50e17 100644 GIT binary patch literal 896 zcmZY6Wl$7Q6o%nNKtNOwF(`RISP&2lFc7i3yT!)t?(XjH!tU00k*T zVTw?cVic!@nKn?8Qk13)WhqB_Do~M1RHh15sYZ2b5JgRDQJXr{r5^RobTkcO?+s}b z+Z)q_rZl5DEr>F<oy7p2^K;LEI*P z{vw8jEMhTBSZbkLvW(@dU?r|!^2OlmLt z{ z=t(bfMQ{4hmypOKpMG2<`ZIuwxkOw_0RtHXmqp6Nx z%;QNa#8W)Ye4Y`{@*L0eLbx*YA}_Ikh*-!X7PF*0uzV@Ys^XXPvUr78d5zb@m1QNY zU?p#eH+hSmGV9x9LP;f(uZtg zJ39#OWLKp6BR)pE`GimTjQl-CEB5j^Uo0A=FWJXed`-+Ze9Lzu%f3fHu%83`h<@TA zhxi%&!eNeZl;AOrN2*WoEBcL-oZ>V(!&%PpJ37xF{K;SFZ~oz5E};LYMh;j}j&_V= zEm6ZY9cRTm!L?l5s^hw@=b%;JiB56@tDzgYv6HPPZt7-kZnbbrw=!07s<2yIDNc2o z)2%kna9g*t+Pi~0I@9XpEO&MntE;;?+ua?=aS!)&FO?|Qz1_!st&oeU$UyoZ4lk3d6*^52r-RGHk zH=Xn{$S9M{vdAi%>>^S~4mstLTb_Wt^2x7&f(j|DNSH!V#S{-Hp=3bFO-w1JQAXJ? zg$U(DD*sPE)T*GON-Bpfgl4RwYLc@Pz9ULC)zwh*zl{VZ=~FGW)loOqeyCPYeGS4E z8fv7mCYr|4EYUp8wa`+lFn()owAD^~9dy)5XI*p+=%#x>4?Xn?3cZsR`sk~l{stIm zkimwC79Ba%u)t5sa3hQ~%IMg_7-Nky-UJg(GT9VU1E$3?-3&9$GTR(;%`-o~w7^1( z0)Me3mRe?ctQ9iG-rsCXFvC{cY!B>Zb_Cu|yX>~dUi<8K zz`=k+4vTTbQO6v2!pYdeDW?PbjI+);?}Cdix$KIouDR}pn{J7Ty6uj;?z!)QhaP$C ziKm`#bMv|RM2bU1Q4fRqh>Zr=abS1SkVaZ*B@q%vW5S8Rj1<*` zrZhvE6GaPJVztr%-Q75VJ`EK`7B@|i?A(b2}?ySL&?*X1irB4ednk6XSA2PtNX|ZC zKL}z#tGphr#Q_S7iXzH$9a`{LAb~zE^|e=$~CTYL%7K;%DFAv z;VxzI_k{aA;31EM$2_5er@}Ly^Ma6rN?xjhSG*S9P{mu`3Gey9M?MMFeC7*ZYk!vh g`9mGGb^6!-OZfF~#d6k|>RUM9`JrR93K=550f)Za#Q*>R diff --git a/graphics/battle_anims/backgrounds/new/dark_void.bin b/graphics/battle_anims/backgrounds/new/dark_void.bin index 922b72bc74d7f5c773331b1af537d54c2e939038..97b879f01ba8ebc08c92d30497c894a1a7b186c8 100644 GIT binary patch literal 2048 zcmeH`W0Rg)6h-HaZF8-pgO1IPZM$RJwr!_l+qP|IY}=lBlA3=pUAJznefB-)!?{&E zL<~a2Bo?uWLtNq!p9CZ%5s3poNpO>rjO3&sC8Q3JlqG_4l&1m}sYGR}P?c&_rv^2t zMQ!R(mwMEv0S#$HW17&EW;CY-Eont-+7L-w+R>g4bfgoV=|We!(VZUjq!+#ELtpyQ zp8*VH5Q7=QP=+y_5sYLMqZz|k#xb4=Ok@(1nZi`2F`XIAWEQiT!(8Sup9L&r5sO*E zQkJot6|7_xQNhoISj`&NvMx{|*0X_)Y+^H8*c#N^*#64j!A^Fun?3AhANx7LK@M@4 zBOK)z$2q}CPH~zuoaG$nxxhs(ahWSz$y!A)*)n>*a)9`|{`Lmu&%Cp_gD&w0V? zyuq8i#oN5YyS&Hye87i%#K(NXr+miee8HD|#n*hpw|vL<{J@X=#LxV~ul&aE{K236 z#ozqHYle(rOk)|_IL0-e@l9Yt6Pef~CN-JKO<_t?nc6g_HJ$0rU`8{U*(_!iHJjND zGlx0NWp2aGV_x%_-vSo2kcBN`QHxpJ5|%VXDN9=>V2HATddZh3!g7|kLQq$^Beaj3%_?g&RZ%F&K-tm7Q-1SdMl$xd;q z)12-MXFAK-&T+2uobLh`y2!;YajDB(?h04B$|zU6#JKX6m zce}^E?sLBfJm?`0d&Hw2^SCEG=_yZp#3~?@CWcYb6c+pE<_KH`%=5=p)(_7y5 ij(5H1eINMHM?Ut6PkrWdUj%c}`H#+jbpHRZ`TrM_mOTvs literal 1236 zcmb`DQ*a�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 diff --git a/graphics/battle_anims/backgrounds/new/focus_blast.bin b/graphics/battle_anims/backgrounds/new/focus_blast.bin index 42bed6c96f9587588b049a0372527027aecfc6fa..98e3e8e16b63fe73c0fb8cc7adc2cc1630bd3359 100644 GIT binary patch literal 896 zcmXYo1#}Q(7)7OPBomp*LRPX7L3VPGlU(E`Pf#Rz$w&Th7oZ@8C`=KGQjFr1 z0Hh?PLPk-V=)h7YP+7`Ro(fc?5|yb!RjN^)8q}l~wZov8qknNG^PnnX-0Ee z5JN02X+>+=5Jy|u(Vh-;q!XQqrwd)_Mt6G9lV0?u4}IxJe+Dp+K@4UHLm9?!Mlh05 zjAjgDNnjk~nZQIQF_|e$Wg63&!AugF#cbvmXSEO(fD_KP{ zt69TZ*0G)qY-AIg*}_(~@i33@D37t79qeQmkMjgi@)S?=47=IGvpmQ1yue=e@ggs= zp937^5HIrzucqj=)P6ms-$=dQ4E+{|Il@tn1%8`%LLN`a6M;^0iqo9oUEbq;KHx0p z_>hnIm{0hW&p6KoJ`ehWi(KMMzT#`X;d00;T;&?qxxu%5$M^h@+CTCWH@U^n{KBvN z7IZt%9e(Ez{^T$I<{$2IkAL}(|GCdYrZKJQOm7A=n#s&&F{{~(FuOU-X)be{$4K*< z&-@m!poJ`K5sO;P;+7D#q@|3qw9$d0En`{BS>6g(w33yrVpXeI-5S=kmbI;8UF%uj z1~#;jjcsC6o7vnJ#u#f$TiMz+#@W_(wzorYM>~b=Y`k6UYB#&v!=CoCw|(quKl=v_ zaG--6>=1`K%;Ao3q@x_|7{{96ILAA|iB58|Q=IBFr#r)$COXU6&T+2uobLh`y2!;Y fajDB(?h2D!=_-@MYIRs82CZ?e>s;@K@VC(i6Oa3q literal 952 zcmV~$1z?Q}0EXf3cg}Gf!_L_Bct31R4Z}?Sx|x{n?#`*{?!1@V!R_wuC#|B*`=?DyT#{$qXthwF*^HHL6pCnkbW6)CQua z4s{i)M_LxyN-_17Py=#kNF&skCNw1%HKRE#$Rpa4RP2t*&=>WiKLZ$u3K_&;hM=JoF^u781S1*6Xf%egjAJ~Sz(gi78BJj- z)0mECFq2u#Mst|UJm#YXEMyUj(Gr%jjOAzrD=B6bTFn~PvJRE7o(*gy*u-YGuvL-5 zZHjLvWd}RaE_Snry=Wi%Ilw`5h{GJ=C_2VPT+DHFf=jrR%h2Uq!IfNvuI3u9@A zbzIL4=tgehW^O^ZavQgE2fCBHxSM+@x|iU-Fn&L&4}=-vgUWn}hk1mwM|n&+kMo3b z3!fzRlnS2a8T2gA@jNe}7dg!tUP3SP3a|1SdYw0TleY-pR&bVcyo285J>KU7!VeYu zh>!UMeadHi&KD%V1UBjyBOxJR43)^*E z*U@^;a<&rLR(&^cjvHEy+}KUr)XH@;H+Ksw&n?}`t*v~wae>=f?cClS+|laf(4F1I z>gsOp?jBZ8_i}IdanRTO+}{HfNe*Sfk)ukcD2TdTa&-vLEZQHhO+qP}nwrwZ9JzKM>UqAKgP4~RM=k~2O zaKafE469sm!yOMi@xmJ)eDT8{8vz8WZ;LI@>h6cLNq#33&6h))7NO9*Ne5|NlB zBqbTi2_pq5NkwYXkd}0$CxdmPK}Ir>nJi=_8`%jb2RX?_Zt{?qeB`G95foHih{6=1 zD8(pF3C)+J6s0LcS^Zaz@>HNAm8eV=s#1;W)SxD{6kA($1a+uOJ?hhdhMH(ZW17&E zW;CY-Ev-zgXiXd1(vJ3Y&}1ZSR!2I~nJ$(#`t7>XjqdcIC%x#cUaAj$>1S~!-Jbyr zWDtWL@Ix5NForWi)ksD$nlW~?=`ogZjCa6CCo!17L?$uWAwPwwDqW;{8q=A$VHwL=!Ae$X-D=jbmUXOW0~_^Z6Pww>R<^O79qeQmyX_qI zu$O)8*Xn;0oBIPCWRIIB+1{f9SQ&U1l_T;eiUxXLxI zbAy}Q;x>1<%RR;4*Zcz>@<{K(!yfa5r#$01FL=o-Uh{^xO8JiWeBdLW_{Gwgm;)&tJ+KT`q%7qqPX(kRK~y3b zsZ0n}upxFrsY)33YGMedIuU3!s7WnqlOT1dOFimiZ$MH*8qpYOLQ|U29BDyITG1Nc zHnbI6I|&Oz+T)-D9Wi&JGpSwZigcqpJ?M$K7ri^U^r0`(k4XA60LMUrA`OEW%#c8a zjlmULn;0T7jAJ|#uupW_n8ajaU75mE(WWuogBipnMg_*s z#6O-{PTLC8Z02|{mwC<*t@eBz3$zsP)P*c!v9N@tEMvLO3Rbep;=Wo~!&=s{9yTPV zZ)6jjUD?7`i**~@g&pi<7YVT2626DM>=X8LfP);;Im{7`CfSY|NF<5l&IHQ@?F1(| z#c4g>enuaBmUEoPe1VIh<1TR-zhtiHaVgH=m{V7UYh33BH-%f=<_>p-d)(&%4|N{# zm?wJj(-=$YGoJIpk{%?5U-F9Ayb<2=j`w`f`N$`ndfI2<3#okNoA8|<{3K217r*%v zU`>a=hTwmQ(nRUXpp42SDwA?it{H-x%B|Y(r7*{=_GC;JsHSICb2VxQ;1T)NBJs~_f!7LN`MMf_P+niAQh}aRHzEmeC*sYmdXDE+`ibE literal 744 zcmV~$2SAi%9KhlKdme(w`0hY4wD`T^NWByk2jca8C*U5Krm4Aiu5zZPcaQ_zdk@^A z=Eyw?%Ds1~IMdt%Q#323=P`VRBwS$=RR}*jNq!Ps7=OY7NGU?eK+#1B!V0E>jSxan z1`eEri88_|CZ6I%U@yT3L`u_=SfyzBAs-Qi0b070CYqEo^eHRua+JsMF%>W?Qb|(9 z#V1sz3P~|CC6=nps)jv|>eOIaO^jN^OIB?X@YInAH=knS6&n#Q3lFL;i6oIMr;K{k z=RyM-Vl<+$+-yQqtY&h*IVrS2S+37$Nh^7i6Jr_$pVOK)$QQJw9qlo`q=V#kq!W(L zbWu@V>88p?cBh9&#rpTOyuF~eO6;UVNkqX?)LE#tGw@Ksp%#Ok|Q?KA9=$I%_J^ly^Ea3?{oA-kHoo zW;2Jm%)^>5?lcy#5Lv`xmar82GBR1NZm&RAvWhs@YSbFmvW_g3Z>`ta8`#JX$R;+k zg{{bsY-2k+ulN5_aKLSvg0sEILa~MI43yC zDd99{ILoYm?|K&g4Wtu)C z<2?n4R))6e=xA-%exeI&e;uHU*ma;Ts+|QvT7q>NAv#q1&bm)vXoq%&=rA3QnWw_c F{{glD(u@EA diff --git a/graphics/battle_anims/backgrounds/new/grassy_terrain.bin b/graphics/battle_anims/backgrounds/new/grassy_terrain.bin index be2421aaf18efd07a9667f6774effb4c68e6f46a..e955c23199355ec8e14ae9287f1d5b0d0df94635 100644 GIT binary patch literal 4096 zcmeH}WpofZ9K@k$ad(-4`Qyc1i@RHKDDLj=UWyfWcXxMpcXxL`F7$ezj_>z@zIn;Z zCi!J|XZK|i5*`SJ&b93@Z^rBE7WP!{D-9u-g#l~5T~P!-is9X_amny7`^sDrwwhx%v$Uo=D` zG)5CNMKd%<3$#Qlv_>1WMLV=d2XsUybVe6+MK^Ru5A;MY^hO`_ML+b%01U(+48{-) z#V`!V2#mxijD{b^z#n5V4&yNa6A^$(n2afyifNdR8JLM#n2kA@i+Pxj1z3nhSd1lD zie*@i6Ld=%YEaY2*Hr_U?_%W7>50=!ZAEO8G#Xl6p4`; zg;5!e(HVm=8H=$QhjAH?@tJ@LnTUy3GB}?HkRW!-tC4HT>nH@0yxRllR3rJ9vEl-oa*LI<8;p8 zOxHKdm4Eo@oK1hn2iTk-ey$q}pr3hQ9_PFE0{U?w7X|W*xr9lSSc#Mn2^3%P6jvUI zqu7e2n2O=r(G^Wm6-AL1Nf8x6o(ivU2&*s(tx#IZkjk%o%Bwuetz62f9Llb2%Bn2N ztW3(N3`#FArBhm^QEH`9N~MrVO0Hz0prop+I;yQ&s;L_CQFT>QRaH@CRZ>M&PzbBvIahEcS8+Aha4pwyJvVS8H}RxS=(vvQsE+8c4(Xr{Xg~I8 zul8uScIkuOyBy!lE!@g&+|C``$z9ydJ>1KE+|L6%$Y*-0Cwi<$dZ-7wuY02lJOhj^I2UPpM8$9Oz2;ZE=*Pw_O*(8EGn2>a>&hrjeg-}Oyj^#z~xNgtKM z%+B&$U{0Us1zzMOUgi~Ew`N?HjkZpEyqbqSpRi}7J+>tr2+ zt~*$J$KT>@-r-%|<9$BhLq6hTKH*b7<8$Y8L-XY*8|laqHr$5UP#a={ZIBJ*3%+zN ryyELXU*7O7-|;;^@FPFD{?CDT`@*mM7M%aV=bvB){$L0G@BIH8EQrX# literal 2244 zcmchX<#W|{7sSu+LP*eDG&sAkUlIsz!9p(X1b26LcXxMpFYd0zrLMSJC2g@nTbe%4 ztNsI>o!K*U=FGl1J0HLK%{=&!01071NQ7X7z!D<~k|G%_IZ_}Legsllwp2)sH1MZI zI*SZLdRPWzL?&d0WkFVC17JjUjWj51W9An1so&DVU0Bm=2qPnV5yyusN8Ed6*AdfQ49u z#jqtg5~pCNaRz7cG3*@9;{q^ppq8@LI(h1j|X@NdxXb$f~T-&c#aqN0p5@J2|pw5u4ljCSNw*T zuvd7EH+T#C9q;fSf587I{_=%>h=06!^f3VwGJOye#d#JQ%n%B(N(N;Du^D#dQ z7z?rx3$sWFi?Wz`Q7mpO!ICV+(#B|(VGIMtvMk5)tYECjO03K(#;UBw>a1a`$y$tM z?GV;sU0YR;_2a`Eupt|<@o4j!uqm6dxv>RXvK3n!+psO$vAwYaJF*iyhp-E~2E1CHoX^8Va#CiYLf3et=Am9rgHG@9Pq<hB~wx*ktJ4$ zf{{oTq=ZVKt?}hk8AYqKtdvTsgo?|eR7^!xL{?aZR8R$E`IS$3l}8q-+{&d0S-5h_ zNwOTuE()@2YN-}#E^DTyYNE!nMrx=AsxPajx~ikvvRKtpP1TT9S2a~t6!qIRq3*J7>Z&g4EbF9>>Y(Jqt&uix}}@C5r4yN+|C`eo!rIU+(X;TecaCjw1d2^Yq~1CqRYCZi?RzkuXBp0 z)mfd!50qE4)X|)@)+$nPw*s9(N6OW&+=p1IiBYWJ(oSxQ$5jR*&{vF z1KpS1(_P)sZTXY9#K9L5^8)Q6+vdH*%k*F2)$qt`yiWUspYk*MTtd&8`{2v;m+Vjd zq4#>Hc!Isv8@-m7(>eD!zX;!CU-Bz{&2MPm@;iRd8?>9e#oJ8hEUio9QoB^nQaZm2 zbtzm(awc<)qbj)a=E}LUF5qI!m2uIov@2z?8xY8zu+ zEmzakFjw7Gb5&gxbCq2sSJ4eTjr>u!2DtvNUm(=q*Y&YccX*d}kN5e24{4A1m{0hW z-ZMVu3;y7B^4ht!obINDG_k2}iks{vIh*JvxbbcrQ~t=Gyr7>M7je>l;jjFSFB$ZT muldHy@-|{x@b7%b_iz5kqW=O&|Ki}A5C7=x|HnU0v%dkz!kLo* diff --git a/graphics/battle_anims/backgrounds/new/high_speed.bin b/graphics/battle_anims/backgrounds/new/high_speed.bin index 52f7a9c51adec65bb3246326a8062aa05e32fca7..ca049478cca1889c44ad706ffadbc7110464f9c0 100644 GIT binary patch literal 896 zcmbu!1yht!6b9f~#THw{e$-FJ784sgQL(!*utmkfM6nYPyTzZ${dQMmoMm)o=b3xn z_nwoG$Vwa8X)7g1j&}d4y$(9+q_Zx%rsX!b)FxN!y6LV*cyad3sF&VBAAK{(OWxvp zte^aU=x>051{oX-F%-iLH$r5jQAR5;##rNwH^D@cOjc-$sVz)1-3&8>BD2gk$6WKw zw?MIlX^Skj#8S&F54oawAKzD6Wp#41Mv1l7g;`>Ka+WH!!A6^Gw#C-aTC>e|JM8?+ zE-Ab1Nw?pdOu1LeKKmVTF#Hasl{u^|*^fBtm~zLRaMCHKopIJV70xSgb*-HST-hp+_MfdlK@gXK_Z)z3?(CiGn{~sa2=mYYpn7 dH)^8>Z@p6&z4yUKpM3VkSKoa1!%vNVX#$JCrpf>S literal 496 zcmXAm*HRQ=6ok*&b(|en+yNIsSK(6!1S6Oe@?%cGnzN2sF|CSX0>*%1023f)#P|?i z=$m-$)jWbbWp#B`cUAXASGz%6>Xc9;WSv;3eQW1zw4N>;Ht#v0bL zPVDu+{Svo)0~^^ywQi=7CYr@cHb}$tmG9Eu7)3aE|j_ASYbp5|?QeTD&V@NRM|&~`e6P6BRoN4U#9y7KhyOYsA`d6?i4kHvmMPq)~;JaujF8D-CT@&6%{ vR8y7Hm-Nw(4DgCU20VF9pEt-GPHz>hRB za+1x4WV2uRk~8Pz%srFm-kEo1?pznHSz0Lb2xC4A2q%I_q70ic9nC@(v6v;q5R2Q8 zRQ&0A4{kB z6IpC#iw#!xkj+-Mv7H_4B*!Kz^Sj6;kNhA=W&Q;L>ZJVb`z>U5&~ekm9`>>?C_YE* z=Ku#OqS!X?79|{_lrqZkO1tm7A}i}KM>xtcj#KgfDdI%Q?<-fs0%sUFaFD?axPwI_kMh1C4~5 zva%mv{t8W8#%{+Hdgk&OE)?-niG;3lmBv)cH#xXm5z(#Aa#wfyHG$G=ZI9dyz~ zw=LF14-e?&A&+>>6I-l@r#$01FX-bX{dg>uR_E>&uXxP>Zy01qdV{TZNo9L@%RAol zfscHW)*d)3*Q3LHW`t43s1?f2sh-Vx(R|@6<9y>gKYZ#eGfEy)>d~K4J^G8^Oz6(r iO#Nu=#VeBe!=zM?PBA@81wA*n-ihic;3(iI5W-*d{ZKLh literal 880 zcmc(dSx-|z0EK5Lcqz4|f~aVb4=PsWqD94m6fcXoi@5JnSH!h$sJOI<3%FI>cX2^P zO^lDm7ypRKRsX;cHAaoWd!O_lka?M$e94(P=Xixz1SLuaT}e0)$)qp{4J{QXX-bN8 z6^eV^E(YVqBS^=~5Hd^^QbuKMCPT>*3}ZMW$S!51Dpp1$HVU60htcGMhdlCCk&>0~ z{em$RFqVLWag1kz3Md(m#0t?VVxnLYL5i7dD!-*`QYGxDKk~Bk{=w?DJNV( zh00dae%*||z!&?5+n`cqS%|IX>s3?}t+6RnmgzH*waj8Rb5xE6bfskIbD4*n&jJ=w zm-Nn5c}hmLMbxv{!4j6Ttopn1TWrv^oE5AjWfiMg(^f2$?6(d7KLa3`@>@@Py|Y4J zoBU=S>%(mL@hRd|A+Ngu5n&^n*ovfV=yNvd2K@tPfio$O*a zd&2B3_-K8}XwHtJ?PEU&EJT`yILINIIgIZJM^%B9U91IhjN_c(B+;0iTU?9Nia13Z zr#VCPtX)+{<2l+99h~O^7x7&pv#-fofvZjzmq~DiPDWqln%36WZAJg~y5I&kxy9`; zcjO=2y(MuMagX~v;31_A`cEt8mc%2v1dn;bQ=Wb9ZB&K75?OSoC7yfe;f2k#27IaX d@-i*)ir4+Wt8jnq{8!filx3S+Q?iyR{sJutMDG9q diff --git a/graphics/battle_anims/backgrounds/new/hydro_pump.bin b/graphics/battle_anims/backgrounds/new/hydro_pump.bin index 0f7e6a5d913d4051a8fc58c1029c3ff3092c61f2..917b5c6c966b2c7a2e4851293923ffa014bc4307 100644 GIT binary patch literal 896 zcmbuww++BR5Wq0JbI!5T0NQ^(?{EeSCekk%IRz!rD{2~AqIdKRj6|Q9Sy+j_v2$<| r{o>}~CHm{*?Pc`S!`;p3tBbRf(MJb+JEONY)>cL@EzHe~p8V$nFkx2# literal 224 zcmXw!xe!Pb}y6d5* zUV7`JuYUR)V4y)lKiCjM4Kv&bBaJfJ7-Nky-UJg(68g!em};8oW|(P~+2)vQp7~NN zuu$k1S!{_^OD(h93M-{qWwkZdT4%k`Z?MrOn{BbxHrws6(=NO1vDZHPh5mqp4ms?I zqmDW5gp*D=?ToX|IWP1VTy)80S6p??bvN8}%WZeubwDyS%O zR8rZ?qKc|sk&>q%l}=Ujs_Nl2uX{s{P*W|n)d_XgQ(uEzxe06NP4SjS-qu(&@s6gN ziRM~psg<18+9a&4cSAevbyfaY;zPZBq_^m!uYUTA0R|dm zu*@Nb%1hX=@Uc$}HzIs$q|b~Bqm41v=NZNsZ$iRiqDdzELQFB$G+&CZOgFCuj}}{EX*$U*v)l^tla*FkEq=DfTITa7o9%Yk8FtxikG)}^{SG*o>rlcDJ0gB{)NhW7<4!o~ckzcmopM^vndDYF zb=JA?m%p8NAzXCHWmm#g*Iaia%T50z?3TFgj=S!O`yTk$L-C(S9(yA5sb`)iOvL{k Clbi4W diff --git a/graphics/battle_anims/backgrounds/new/leaf_storm.bin b/graphics/battle_anims/backgrounds/new/leaf_storm.bin index 02a43683a67dcfbd4f907d696bd64d30a05bcf67..81fa3d3beb21f7374caa0163c6fd92789210fb75 100644 GIT binary patch literal 896 zcmYky1$2-F6oz48FuJ?n7dE=P8#ZEecXxMpBaMOqN+_wM(%1n?Dq(<<%4maB;b$sm z=R5bF@7(9cAub`rBR-)dAR&oJOcIikjO3&sC8hL}7|hlwuU81SKg&>E~XCvXrAd6{tuhDpQ53RHHgIs7Wnq z6G0?(s7pQS6Ga0e!y3|v#x$X6;LT`G3tG~O*0iB5?PyO2I?{>GbfGKV=uQuM(u>}K z_n|NS=+6KKGKj$pVJO2G&Im>_iqVW=EaMo@1ST?x$xLA?)0oZ-W-^P}%waAsGLQKz zU?GcG%o3LJ5-+oi<-EeHyvFOSU?p$xCaYM@8rJd_Z?lf|Y+xgs*vvb;%NDk>jqU7U zC-3n-yV%Vh_Og%t9N-`y@F5@ZF`w`$pYb_g@FjJ9qnZ2AYJTgH@n-zp7yf0ee7#L`#Zpa4sx(V9O^KKJHnBUao~_d!HG_C TvQwPuG^abmna*;ybDZl_wrT!$ literal 924 zcmWO41w)kw0EOZ65sJxG!Pf6R0%D6D7?@zAf*sg}iVAjIuw&D8cXv;hx->Rj>N<3t z#!@%ke15|diN;C+F~kyw;weXY5>N#yQi;l_3ROuYf~rxS8YH1)YEp~Z#MPlL^`hzZ zQ3Dzh0y2$AAr+<3m~@(;rZl5DEl^8Z(V7g@hPJe$J&_J{EC@T%8Fis6nRG+l=|NAj zP%nDZhrXyE{mCW=4PYRH7>tH6l$_LI1i1`n1S1tHk9e^ zD$~$(W-yakL}oKb;aujSLgur8g{X){EM^HRri7&|L(5sgN>-uOtYIzdP?S>2SdTWa zkxgtyTiD7rwxbDlf`*?|$c?G@7YrM{W zA_q8F5FX+U^d^Tn!dvKV-r-%|L+^8xV|;)<}dr>iDw9Y<9Ghx&#V;v#owIe9QucUInM?3 z-^B=lW2{)mIo{<=d1r(PuHcGtC0BM8SH+16Bd+G^at$Xr*)`=_uI)OmE7x;Zs}HXYiGEP+sf_S-W}Xg?&Qwy;;wS0yScl2#JH!k z+)H6^xsUt0pZg~`+c^rd(+0=`J;;MSL>}s4&h>D4ghx8h`SK`__85y&C@+Yp6OYh?K$#X&vT*Y%L}~FMP4K?_7WGnL|*D;UhWn0O0V*2uaVb! Zoue+5%e>wjyiwld&EDdz@-}a`{s$53-NXO@ diff --git a/graphics/battle_anims/backgrounds/new/malicious_moonsault.bin b/graphics/battle_anims/backgrounds/new/malicious_moonsault.bin index 37874dd0bfe49071e27547deb84976adcb9b6a3f..03bdeabc7f25c1b93996e63783c1fb1f42fe58d2 100644 GIT binary patch literal 896 zcmbW!W0Rv%5QgE(+BUCbvo>aJ+qP}nwr$(C@vk;{CzIKl+0BQou2X&b^mBLjsSXLH zupDxx$i~TBa?2yHeDW)xph5~OqNrj4S6qp}msCn=Wt3G;c@Z+%{1{!Llu_l^ome6KWS?8BfgrsS%MG&QT$mo-m_;=h=t7Nsmt6FQL zt#;b$prcMY>!Pb}y6d5*UV7`JuYUR)V4y(;8)B$oh8tm|Q7Nl4+8AR~YO+o>&Uh0{ zG|6OBOf}7PGt4y0Y;(-bR%@R57FcMJ#g71LsxP_W1Nw2^4UZhP#t&wd9SbSO~8Hxthvj-5CWb|iRD|HDzo9CyM= zr<``iS?3aV-USz3a@iGEU32{p>V}(cx$Ta-?j?x~GP}R;frlP>?1`tId7iWvUV7!V eH{N>Zy$?Pn?32&F`0AVQe)#EElF6k1_x2mV$hNrv literal 544 zcmWmCX;(~f9KiA4zcJNVGSndJcW#rVEL|D9y4EC7wq(5_WF1R(`ZJd7QX=bQ-y-`? z*?Zs|FQIe1f&0u;;|+Wte9qUaU1BO66^e_&<@j{O-3B+Y#0l|uXiGbxJsn7(qk)(7 zPIM+SQAol^7rF}FNTxeIgr4-GH+^CNKZaFgNFap(sq_{4(VqdN3F!=E5QBvwWMDEh zflP*3;ZX3mB5WrH8P14|V(tFpC`T1|Ml#CrMcgu)F^pv#l0`Nayeg;2^$ zR6Y^7!Tsn*RkoD*s}&jsp)i(KL| zSG1+Ba*YV}!gX$NlUs0G|GmRq?g{sKz(X2ZZ8NHt_lU#cSaW lZ+XXi;R7G}L{l`|%xAvvRrtnte(*Dk79ISrAAO=+{s92=kXrx% diff --git a/graphics/battle_anims/backgrounds/new/max_lightning.bin b/graphics/battle_anims/backgrounds/new/max_lightning.bin index 43511aa7249cd273fa4affd23208c11ec2f72fda..af4c39c1c0bc0ea0260ddccddc8ca26d7dbe7069 100644 GIT binary patch literal 896 zcmb7+Wl)q+7=>MG=>_b5u3o#lySux)3%gtF0J{ql3`DWP#%@rtP_et#)^~B4K}LT# zXU=&~-0w4BgDr+XU?<5Qhj^V4N1SlR1y_u?#arAl;ejV!Bqj+-Nk(!~kdjoSCJkvx zM|wb!fsANDCNh(StYjlQImk&aa+8O=V9W$hFJ4Zxx*4{ac_qIqmSGFen-exBN@eL(J}w| zhp~)fJQJA6B)LAq$-*hZslsWJe3;G*W-^P}%)u8w<}#1@EWl6u>V+&~F-us=GM2M~ zm8@d5U=3?U{U!Ocj`eI{Bb(Sv0D){_E8EykpbpSM>>!9>c8cyIL^Oom0*eb4?qRR! zKK64!aF9^KIK*L&aFj3|s*iD8aDs47a*ETO;VkDkFF9QF0vE0B5|_EcRU(Mwnk?73 zL8Ok*QABZ*TioW3xVyq=(Ra*cJCK4Ir3jk_`_ L57|u0Q+cUhGC~MW literal 744 zcmWN<34GRb0LSs~Z_oaF_U!4|^WPq`&1j$B{F70ZBT~wCB`~7_uLIzNNlbW32=jdIB45c1HW97a#_5m*X1oVX{`izDcbj--&II2!e#FUL@X z`f)7BaXdPK{+!53XaFZOkU{7a1~Y_HQJi9iG7Ob)8mDsxI+NjyU?dvFXwKqnRLVJ= z%NTSXV>zF3=mIWeJQtyhnZPAniZ0`FCUOP3lB>9yN$47`dg07jy?d|bUsWUyEdxr||Y{_dXEi6mK5~kD4P}yB!?&cmjej-0%e1GY^%w!g` z)0o3t1ko&lw2gHLsL?u;X5fAeSi$#@J=`CTYSjM9~#&YpE zPf*R11+0*Hil-H<@fE4z8CFs&o~4de)Qbk5<9S{Xt7-7+y*1)R*07eBD&)LOqr#26 z(kA1E)++Z^nv|csj`eJi*@&8H;Wb`IZ}289UbE-E#oIFP(2CyWJ>KU7oDcbkj}>i| z<8GoY9{Pk&(Py;N!Diy0EB_0=WV5FZZwp)a3TG={^Nm8CiWGOr`IhhaUZ&O!cVT{z z`H^j6J3q05pWzn;cCw3KA)&x;>}HQI=Xdt9k8WSlKlqcs*k7ycZpHq8fWK4uhkq52 uHL^)IV3VzrYEx`5Zc=S%mcnT^YArwXt6h$!< zM+uZfDU?PTltno=MtM{~MN~p%R6$i#Lv_?ZP1Hhd)InX;Lwz(rLo`BTG(l4|Lvyr1 zOSD33v_V_6Lwj^UM|47G1fmPNq8qxS2YR9xdZQ155RAT#2}D2i#{dk(APmM348<@E z#|VtXD2(>_F&K++7>@~iF zz)GybYOKLptiyV2z(#DsW^BP$Y{Pc!z)tMKZtTHc?8AOn;Q$We5Dw#rd-mZdj^Q{? z;3Q7rG|u2G&fz>R;36*JGOpk%t~p%C4cx>n+{PW;#Xa1|13bhx_!i&cd;IVPe#B4s z8ISN7Pw*7a@Z4MH3%tZDyv7^6#XG#mFZdO|;rIW`rQT>3K}<1+yhG7%Fq36nAzlQRWV5+qYGHAQ0@re!*& zX9i|;TqXuEv#XtjSzVir*_nemnTxsU^C%DVG9UA^01L7Z3$uvpQuiso#= zmTbk=Y{Rx}$M)>Nj;_y_=)}$pWEXa2w-9}I_HgLQUhK_23}P6BBGiFU2fkJZ{9JPS z5X`=eihl0$p}%(@z+evKAP(jb`n&w~$51A~Fb;R@2*-`&DE^}#&3+aYV>s4Rj{8?X z-l_dDgcH09f9oeYcA^Dyl2a#FG9^_KB~~IOR073UJozK8;wZLaDW+m5y1WyC*G5rf zMN&jXkRQS;oWiQ03MjwwDX;P4uMkXmWQaLpR zrBn(uP<_=?UDZ)-)lyB>Ky_79RaH@CRZ>M&Po~sS+x#Vk)X4Dy%~4 zt6&AGk9w<@da8%ItDCy2ivrPEozzhs)L!k>R&CT;t<+L2)LhNfR87=ajnq&xHAB-i zO;a^RlQl^bH9_MwPGdF3)d<9BjnYVs&~OdYPz}*w4bngjP=EFF_#N7=ZQ80W+N@35 zs0~`Lby}-6TCG)DsTEqTWm>8wTC7D{s0Esjd77&^PCZ+*a7CAONs~E+Q#p;(IfFAf zi?cb0b2-mTCtt!H(P16ZK^<`F{o1F!+N0gtrJZ`LN1D$CT*yUS%q3jPWn9h`T**aR z#noKHwS1@ty03e>t2?@_Te_(mx~^*uSM^aJw2te!fg8Dro4JKsxsBVogFCs4yBQF$ zhwt@HZ}kSR^-3@G!dv%qJ=0S?QDRGEd%2JMd4LCbh=+NEM|sSh0FLtnPx2I_SY(T2 z5gEaJe)?H>3uj?1jD6N8S1GsUvYeK~vRgLCXSFP@&1?b8WGR@@GFW;`XK5{snaNUH zDx<+tIxe{-v!s^9s##U5VwJ6uRkR9L-pYBSl(jNe+DchTE5YJc%!<0NMXazDvVvB? z@>@R3YkAD)Y#VEBt*oWBu;%W)nWqj!Q#V2rJIyoh1aa2o`Z=Bt$?rg1;6+~IWnS@i zC&>C(Z|h|}&6n%lL-bd9jn{dDH+hSr1G9tj8v@Huc0cX^NZL-zJ-{qKdYJJf+t M2f}#S|9|HHU&mRtwEzGB literal 2180 zcmcJPRdm(o7R2{IIY|x_IUzt20%Qi}gCM~jLQZfC?jGEOOOOP2cXxMptvga2YS-$e zExo-`O6j@}yxiBWS!?#Jd6Jw!u_%Bz6oeH*VZ;Ln(o%|`C3CO71j;i(E~kUY3POC=mYDEe&~+@uz?ta!59J?ieX5{aM%cp z#3+o0jlo!q!+7{6AOjOEHXSwzlQ9LEuq;f)G)#xhz)Z}-Yy{?DF5>55K5PLNVi6X@ zmS8ECVL5CCR$>)aBd`W*t=l@Rhi$+{Y{F*P7Hq{fY=`Z@PVB;N*dFY~KJ14bz(E|s zVb~EI#W5U*oxn+)!fDtUoW(huN8kc3TFNC{M)(z6#WhO}c&{2>!|QkhZyMgh+js}> z8s5YE_y8XouHy!7;ui3cdAD%~cMbP&9}n=*@Cc9bF+MSTiqG&l{sR20=B#wg}xKIS(@GlsD&V2ooy7GhyzJVCOE zu_#5yV#eZ3Ur$5GEUi2%7%Q?8E3-Y2E9(S&g{aj z?8dy^*~2#W#Qk&x(`-a9_GTYiU-n~v4xl%XgE*K&>}u8%ZzzW`ox}Yc!I8n_Q5>CR z-WZPMIF66t1ipBw_lKVU@4WOsrFiyo|467W=y@5O$n2P8pQvt=AVic|X%4f=}DCAM3DWKfSrJOO!p@c|;Ws~0&p>T!CX9!h@Jk>JQ zR1H;EHB(hpQDs#!Ra6C)M>$hjl~JNfn@XvqN+`ipT*c%hzlx%WCGiD?6tBYQqRysH z>ZlHCZ)&HuYJ=9MR%)phYHmtZGc{F{EL-1Ljnq&LO!ZYybydfdqM(vh+mxh<%FqPU zc#YFojWLbZD2>zz({QC@n1-5$Xs`xpplN{mtDpLs`lz>hDb3VVJ=9&@OkK5FtF+Rz zLd&&GOHE6(Sc|kUL<=-u^Q>;VVXo$Awq}`TYKEq3nrW)Cl&L9xP1YpDpVCRw2_4rl z9W@=%VI9&z(*f<*KJ7K_(QfV1PSXx;*EVf6ZP8|J(#8;M(0Z-2t!qtda8oyQ-L#a; zxST7DE4hlRxyHDb>$sj9t`vJ56LC#fbwz>8x@1WgbwPGs=X6$QWT*9|zR*V6CT`{y zZl!JGcJAO#+Ai+q7VV+!bAA^R;ldf_Vh8)og}M;uIrF>c`pw%}#Z@*}$yIa} zT=_W`U(S^^SH>k8OS{4>;SyYNSInGqaz$N{5Jv|WZ*hgp6?Ac~fNN#0rEB4u zyHs<{TvOM?HO@lcMy{c2;Od*J=jyVKOMwg8#AH|7C7G+`YPuS(y3bW}Rb6aae`oz% zU)RU=cCC6@?lf#qM^Bp^*2BHccl;^u`qu~E9AM!eH@Mgk9o8ZQ~ac-02OM$285dk}!(GJ#PrUF(j}N~1;ZFd81QARKAcPWz zfp8*-R5C5;NKXb$W+aMCWF`w)$wqc^kds{GCJ%YFQGm^ubwvR(}0FFqA^WqN;7qSa+=eE zmb9WZZD^})wxc~A=tw6z(}k{dqdPt5NiTZShraZqKLgA@mVpdnFhdy1Fx783BN)jj z^?o#C7|S@uGl7XrVlq=yrZSD`%rN_z%)&?+$uH7~sdvh!5uI3wrC5oz z*odvziM=?8qr~H+l(V>qYbrV#H*psa@f0t$MCn$nEstZiXub4yy$ z8k^9DwzQ*tva~L0bf6=hFgnwPu5=?sy3>Q6^g?>mhrYxh{pimC1|owP%n*iR9>#D+ z*uqC5c48UDXe?tGD+%Kmk7WWAC210qkts}N8q+amFq2u#7Q>jsT;?&~Hc}R_kT@10 zivr@P7T}32W(iAKhQyP=auSghtYj6dku|Jk9qWnQV0dq2lPzg8#um1+jqPH{4tBDO z-N+vHvXA}90S+oJ;)_DWn>a TTY~*HKm*k)j|Mry(}2i-F5t-B diff --git a/graphics/battle_anims/backgrounds/new/nightmare.bin b/graphics/battle_anims/backgrounds/new/nightmare.bin index c4b8b45a7c22538e8b445fdbc73ac41ada5fa8e6..11e1bb939b77c7965123d23d1e066263c447d688 100644 GIT binary patch literal 896 zcmX|-1CSm;5QTHrf409qGj?*ZbFppPwr$(CZQHhOb9S@Y>Z+Ok-g`YWHC9+-gDrO0 zMAdnz}2~iYE7~y~rp(v6lqKP4vI7RU! zkVq2Aq*e64(vhAFWF!-rm6nC9WFtE{bU!D#$W01)$V)!*Q-FdLqOduuol%6M6r(sL zD5)rwQk15Qn$f(nl%qTqs7NI$E3QISs!^R9)T9=*siRNSr5^QZpilgN)xW(Vjc800 zn$nEsrr&~=w4ya_NKMjmZE0tE7TVK+j&!24u63a+-RMpaGtrY?^rjDe=|_J<9l$`- zAH-mWFqC1YGTiL6+w2&@NJgn{G-K2{mT`<{0x5BtJCR9DW(rf8#&pG6&0r?8j9%l} z%waC`n9l+hvWUejVJXXu#Bx@!l2xo`jjpU^9qZY^M)QPCY-S5v*~WHuu#;WvW)FJ} ze;@lfz(EdiSXYj4lw%y{grbw2;S|U zJKW_S_j$lW9+}z4JmD$Ncy1~$RQHlsyygvWdB=OjANa^8KJ$gIeB(Pm_-W>U@tZ#e zr4cK!78|h@^~+)}4&o?I;;cw37qN(|xQV-Xh^MZ3>8rQ+h_CAW#9sm=P=X{_QHX>} en1l-=ddfnCL`sxION_)yoWx6lBubJb>+WB&5yRO4 literal 756 zcmWN|cR-W{7{KB8`|iMF$sH$45PmPn2IV44D?AP>M-WhshA0QpP9v=>JNuxare#@L zY19>B!+}(^j6jQqMO3sk$!;XXy$`BkFVT2Pwq!>mNLy5*o zgt&;o%`g&Ti6g1d7EgkZ$Z(QKw!|}n6jJ#=D{10QXQYrpCRt=#Ql3LDdE`4NV3g$@ zO`+i76pA?2l7=yy#_5cOaRkobOwJOD8IP9|!AB_*I2+Ef0+F1{L}3z>nZkLNw3kuN z`BZdEk+ZXsDlWjdkf}^#y7b8mF5+S?K`vz`)y$$~Hl7;%)KXIyoK`q6hk7m(F6Roa zVs?iG|p2<`x$DJ+~qO7IPaGu11=C z6L04Zf0f+HT`XZKmCO8fcL$G!upHM4?lGG0Wu?&~_i;a~cmRsCU2PAtnl-{hJj^4k zZSu9Q<58L$+aD7iC&&{#DYUSjRyLSC#nU|F>wi|*$R;+k1=`Y#t+ex;gXej{KiI*G z!b`l&E4(Uf<25>Y-9Z=KrS9$Q5Z>TTdU(r9^S#YGyvt5_&#ZW#UOuplF@1c{c&O}=9v`)dQ=3kNvJAr1#?R~|7tj`9OP z3di_~pE+)sJ%jwhuly$b&I$hDPX~YTcWu`{{0sk;_KF&6+SR6ZHR?4~bci}MOvAe+ z${iM=ks77OP>oinx^VkqNObEkjTMi?X}l(AqB@6bl6aGKgc>QDs;HKDB~8=U;B+5hn5kc3VLN2Is%PH_HD-UY63 zgL{I92RyB`9Wo%}zxYh>Lgqx%EXay%79u-xASZGGpq0;U@yui06b!uK17G+dFZ_`Y z0SH8X1R)q9D1d?}gu*C-q9}&qD1nkFh0-X4vIs>vgdrReh(virAsR7=MFmtuB~(Tg zR7EvZM-9|OE!0LG)I~kiM*}oOBQ!=6G(|HsM+>w>E3`%%v_(6#M+bC7Cv-*^bVWCG zM-TKwFZ4zq^hH1P#{dk(APmM348<@E#|VtXD2&D!jKw&NM;s<#A|_!nreG?jVLE1D zCT3wa=3p-7VLldM;lH#9i?IYtu?)+x0xPi!tFZ=a5s!6Pj}6#}P1uaj@HxJ)+$5(j z@fEgUE4E=fc3>xVVK??*FZNkH_TvB!;t&qwYkY%m@g2U$5BSldpYSt&!LRrYzvB-a z!BHH;ah$+OoWg0G!C9Qcd0fCnT*75s!Bt$tb=<&B+`?_#!ClhTim{Fa4O8{>;Y!1~NZ`7|akBU_lmQVHROg7E4COS%M{5ilteG zWf{tH3}ZMW7|HUCVl-oz3MooSASHoMHG#w(8p{v+w*ueyZ$(yO;?3mGALC<9@=Wqm zd!^O;mu>aoH>FncOya4toUD9hIx1Zf4~HatW_c-7lF45_8I{4xSD~jo5_osH$yF|i z_WhMte)5%%ykR8kO&$x8+v-3;xs+2ml-)APrmV`6h>ul_q7|j`id2Nc6{d0uRauo$ zX_Zn*l~8dNQ&AOBVHHwA6;OzR6{P$MRDklSz1pd*+NiZ!sij(|xtgh|ny9fFsUaGu zzUry2>ZrDAsitbEx~i$Fs;IImsiG=qyvAv)s#`o}vjH2jzxt`K z`lz>hsi%6VySk~Xx~Q`{siQh*nU<;%8?yLOsx9isPVCGs?8jpTCa7A z$6Bq?YOK;qtLNDuWu_jONqbw{^#OE+~x*L6)-bw!tTNf&iN=XFkJbw;OkN+)$f z$8}7ZOh%Kzcp4AmZrqHkaWT%u$)q=qCY^CG_9m^dGqxs;No{OQD)UZn^+vDtN-y<7 z&-F|NOo$0KK_8tGJqLxR&uL X{h#vxlajzEoIv8%{8)egU;Y0l8x2FS literal 1904 zcmchW*LN0V8pP*I0)!q2z0QPr2|a`sdOipNLg>Bs4$?bff>Ym2}wwaa9$*i@#i85^;nFN;w+J$8jI|2 zo}IWqvm{HgbU`$;49mvS&c&BwLU|^!!uT~6*(Eu;su(M=^5yh|Dy+(C`Ddy#sRnD} zR4vwKqz>znRP;>$6kMzqy=n%cK2zC%4T(l<%qDC~G-Dc@Go5I`mTbk=L>p$XE!z?8 z*?}F|iRjEsM%jhv$}DzcHqo6u*poR#FXpm0`w)HEkNr7-7|1~!%pt^34&!i+AVzW& zM{^7@mg6{{6NrhN#L1jOOyx9A=L}*dXK^-fAm(r`=W#xapxsF)R4J_bBViPxW3%3&6xScz=li0=G+{3-Z9o)w| zc^9L1Uyj_v{k)erz=J%*!^9CD(+f|H+s5 zFYsl)!i&5FzRK75I^O`_=dl~)o}K^2v( zN>F80QB_rgs;h=-s#ct8tB&eMBZQ4yCJwTB;S) zT5Xh}wp6=VMD5i<=%`NWtV|)QF6yc*p_{VRT|I=J%26+Y*JF|Y*8eAX@pSy|yj)$( z>#dBu@_p1-h3OX}vCMgyZF55`EfyJGwuFo4IOAG^FD1u0mbUgnq^!$CGyADj1DD*N zRm5sFS50x1%L6LAQZ%oBqLN*4{F(|*N_2Ub%U|8tjo^lE;8fQy#b8JG)x#qx`O)(- zUDtIIUE8(rQcc&OtLLB3buZ_@J>A3Ioeg($mbif=m%U%WDq&($oHFUGq=oZ}y-KN{MR_mbk+MpNwe4L;2vwj90&co+? z)=&Ek{FI;c6Mh{2&foeQe+_@-FCFt2@aO)_pZXK{V}IlieHH$|@B2N!3%}zlzU;T* zxBRBx@aynve$|(J5v~#{he{zCp<<{Il0tcea-nP}6G|hL3ME5gD1lHs6blI<9w9D7 z0>X9p7ys;^{3HB>ulaiy!YxCKkRF;Nq=jaoX=sAbI5Y|ki=Yjup?)Y(0klz@v{_r$ zMsl}mTZt>%wFBCzUD~ZZP_4l!ip^#h#-&c3`r6ptt<3J6m{?#JwqSR67Z{*mf*ljPyPXNvXCMB& zzHaC2{JuQb{dnO`DpD&xq`^x`OFGhv40>lIlLx-?HDM;R!E7;+g{))~*~vjpa*>-n z|%@B zwz7@wZg#L!>|(cW4}00iehv^pq&UbSH-|Yw6ww?N#|YC>#1QM^I43yCDNY;C5Jx;` z#W~K43+leeCFL@~T8Q-uSCwl7X%4QFpxnU0O>XIKbBDX!!>;{vp9ehTkt~mSBA)V$ z=e*!0uawuk@#rn@crQK>pe6f=lTX5F`7Fy9l6~bH-$`_l#1G{szxeIu5B}PJe*vVk B6bJwS literal 676 zcmWNLWpI=S7zW=b9B@G4?!${NM}Pna4aKc|L4yZ(IINUX+@<9R7Tn!}ySqbihvG$w zy9DcR@^5E$c4qzI6ebZt3OvY@l2iz#CbO3`rnIgv9kD+oiS$-113vJF}C}S#1Im#Oqs7NI$hfTjw1(z73D%Ge?4XA0VMJ%^D zX%bRX^EC_5+?*D)G_^8X(}uRR3y0L64ut5KTz8@~UFhoNSGtAt8{HFJ{Z0?lAM}i% z7rp5dQr~0dM5`bD8GsFB5Q7g0 z(KLz4#7uEDm1#_Om2w6%nPr-7j?G~%^O%nou#iP8cI7N#sc9LBVZ|&b(+XCyDpAgA z)|l3^&Xuia0~^_dXER&aYTAaoJyAQ@$u9i6*<;$vgkVCn_OU;#100Ot5QjMu($NTx zah$(RC!#oMIz_tEoJqbvOaI`2sB>^0U7%<1qL)itMpsCtt6X#S57)&FZqg+fC*9&U zcerbg|6lHz?(+aWyylJRb!6;YbKc?Cdp>yi YNK#mz_#BVE@Re_g`rl8fU>{-j9a=N1jsO4v diff --git a/graphics/battle_anims/backgrounds/new/shattered_psyche.bin b/graphics/battle_anims/backgrounds/new/shattered_psyche.bin index 225d8e95f306009a6aab40fd1a56d2f9e74400f8..233f54c10477c49c18eb12233c141defcf7094ce 100644 GIT binary patch literal 896 zcmYk)Wl&X76oz3hA}J}Yz`H>Dn%Es+cPln_Cw6ytcPn;xcXxMpcf0O^VVrN~{5WSn z-(GvqF=0h&tVx575nJrA*Ery)NsANCxZsK#?xe#5PrUHP2VeX&=`oQ3e*y>u!;7Kq z2{OE;!;xSz5<)0pgcCs|QJBd@X7yRrXC)iii6#d*$whARXhUA|k>9WdC`cg+t1m)P zicy>xVktpMN>N%HOq8K4CTvrkZ9nH_p(4mb9WZZD>n7+UwpO=%~IEol|@lJ%gF9B+!lS^q?ob=uIE>ed$Mk z1~8C8I^ST1FjTE2!x*08V;I3mMlqT(I)f!+8OL}gFp)`2W(rf8#&m7)V}{z9%wjfk zm`kiV=>+qb&jJ=|7O|KmEM*zX^&VG{$VyhRT07UMUduZ5>)F6YHtEcp*uu@f`);vkNa zRuc8bEO8P~wVpVOi@1uLxJw-A#6vujJG{gXZwbLie8o@FO9t_mcmfO`D2Nz7NP=~Z ZB^lL+NT}`ne$VV#5*0pi3H@uvXN5o*^Aq>Y$I3@y{V5FEL6ctkpDNYGW;vi9! zBAU`j3}q-wEKWJ%#KdEe@>HNAm1qTNN@^qtxSg|PO z^CoZcHetPahdz?umyCYm_Gdt*J5UP6&maaf1Q|*W?=lSMJ%*c%_sPYC7{N$J8DIEl z@)#q-95WWiW#$I?fbkwaWC9aSx?|)cCNY^Q$W%UN8q@L4;1gzQk546EK4TWM`5gNT zGW;opUoyvLF7w39=PO|WU-J#$hD_7%SjhJ*N@B5@^@CZkgry;Qu#DxbVC8s|vx?Q~ zT_f(=5biwIF*s?xO+FjU*g9-XW|N67Fh@3!7(+*krSNc6sL(g z!&$4-Km2QD#h&AQsF8E&0vCl#T;>W_g=<{r1~-LU+~y8bj0Kl->w%5+KZQHhO+qP}nwr$(Cy~_&{kU#_`2tf%(a6%B0P=qE7VF^cg zA`p>CL?#MRiAHo{5R+KMCJu3lM|?mMkdQ@0trU*qTMsZ3|l2VkW3}q=tc`8tmN>ru_RjEdGYEY9} z)TRz~sYiVp(2zznrU^}HMsr%wl2){)4Q**hdpgjOPIRUVUFk-5deDELd)dc+4seh|9Oei|ImU5LaFSD; z<_u>!$9XPrkxN|W3Rk(tb#8EzTioUjce%%X9`KMyJmv{cdB$^I@RC=&<_&Lo$9q2T zkxzW)3t#!hcYg4bU;O3|e+ghf0~y#L1~r($4Pi(_8QL(0HJss%U_>Js*(gRen$eA6 zOk)|_IL0-e@kLEwLKB(TBqlYP$xUHOQ<>T{rZt`E&0t0|nb|C6HJjPZVNP?I+dSqq zpZP6dK?_;fA{Mon#Vuh;OIg}7mbIMatzbnfS=lO9wVKtfVNGjU+d9^@p7m{DLmS!H zCN{O1&23>zTiMz+wzZw@?O;bc+1W03wVU1TVNZM6+dlTSpZy)+KnFS4Ar5tz!yVyB zM>*Otj&+>lo!~?#IoT;rb(+(i;Y?>a+d0m4p7UMcLKnH%CI1IYUFLFExYAXwc8zOY Z=Xy7|(M@i4i(B31c6YebUG8>|{{R5J02=@R literal 1052 zcmWmBg<}o~0LI~WrY1i*?e}Un-Q8_^Y}oK&820Iynr^1MnU3kcbLF~RcZa*<%Jm)Y z`4^r*TDTNO7Q)GjvXPw}7L6l?5aZDVCNhc1XbMxA#&k4;RAw>@&1MdBNkj9P&jJ>rMJ#3sOVKixvx1dq z6{}f8I$Fy**0TX^WD}d&g0`}a?d(81*~M=55Vn_n?B{^ObdU@VaTp!pD91RCPH>V_ zoJN_P;VkFSc`k5~OXxCJxXLwjof|yH!UMeadHi&KKxQzT#`XLEmzR@Aw}5z+LX~Bl?M- z`GsH6eSYJ2{y=~77k~2)`j`KB@Tgs3&f;)qwX!+8b2z6J;atw`JXT)kbAAV`0xsx6 zE^HNXQAfI%Roo?9(xt4@F5|Msvdg)=D_9j>$(3Ejs_JTvaY1Kp&GsD6b(%HL^S!_etwmn!C0=SR^K!57N^6x@dyUhrwO;4--e7I?CU5o@ zYpb_;yLVVSz0143$J*!Z1k6R~v(x-gd%JdnZ^*QUjFZiM_ xS(kmqSAEU8?i-c@=zpo9xKLzB_mgiYXC|d5DJ2*aj82RS>P~z_;;n>?*oPEd4TAsx diff --git a/graphics/battle_anims/backgrounds/new/snuggle_forever.bin b/graphics/battle_anims/backgrounds/new/snuggle_forever.bin index a4bcc4440d2d31ceb954cbd82d167f0607304af4..3abd4431783972300e5c4d0ca3c7a872b26b0aee 100644 GIT binary patch literal 896 zcmW-X1#lDw6a|6c5C|3=cHsg64tIBVcXxMpcXyYdElve(k-DNS(n4LJg0#3@GCT9$ zpT93Y2?!%0iAYQml9G(%q#z~Xq#`vDp$-qEAuZ`hPX;2%NT$#yGg;zXSRgCe$W9J& z0+Nf|1c(Smk%zoQ6CKP)ehP$akb)GVFhz(85u_-^VmnZr5|pGAr71&M%2A#QRHPD> zsX|q%QJospq!zWQLtW}op9VCf5shg=WOP%S(VP~vq!q1cLtEO>o(^=R6P@WoSGv)i z9`vLaz3D?=`q7^O3}g_48NyJ8F`N;MWE7(r!&t^Ko(W835|f$2RHiYV8O&rBvzfzO z<}sfIEMyUjS;A75v78mGWEHDf!&=s{o(*hd6Pww>R<;qtc6P9nUF>ELZ}4Uud*gB+ z`#Hct4snPD zLmu&%Cp_gD&w0U1UJ=juCNRu|CNi-}OlmTdo5GZao66Kin8viGGrbv%G^3f!Y!MEiZNMn=nAd3Ynco5iEodPNTg0Lkv$!QJX(>xv#Od)vpp z_OrhO9OxhiJH(+5bGRcM=_p4##<7lbyc3-0Bquw?sZMjcGo0xxXFJEa&U3yCT<9Vf ryTqj~bGa*A8Df>IUE^BUx!w(Kbd#Ii;#RlC+1N#l+udPIRP6m4$fWka literal 988 zcmV~$1z-&b0LS6~v+-t(H!(5e_vek_jp>dt-QC^YUDMs&F?AhWaKRndo#KM);7;C& z3%)Ou86^eCMikK~J2?mvgK`o}E^-ryBM*5ADX6$`Jo(6v3Q&*)3XxG*@kJ;~VpLd( z6eEe^s03h2qEdtjMUqiz%8)`zB)Tl+D6galN~Ho7Nh3X3fe4kT911F2g{oAex~M@- zYEfI%p)U2PFB;I0bQ+1qWYC1Bq8ZI;K}*q!*0iCmXh(YzQaXr^bfPm|L|3}eogShm zz35FJ(U*SoXMh;UAO91@2)!ciWHx=d%5UO#u5gt<#GhQ_Iyb~kZgHEx#NXWEF89QJ{^4K#6aVu7IUr|ql%t(p z&f%bAoKucv_)fe0hNvdXX2)OT5&}yj))4 zm0so5@*1!8IEc%wIYbEX1Yyw%&hUEblH-sRo$9`E%&?@#jql0we%LB||&R&pp6 F=^@Y~?;-#I diff --git a/graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.bin b/graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.bin index 44eb2f82d37873ec3d8612aa44f9cd175742750e..9bbee7ab43894b318dcfee60baefe1ca5cfdd132 100644 GIT binary patch literal 896 zcmZY5XLJq*0EJAD-q(n|#ol`p#NM&@2(dSbnb>;&@4cwnF4Bp>lHpYSQ4@j0hB%^A+}1z++NU-J#$a*p#{ z;3D7gJ(sx54*@^&6F+l>tNg;RT;n>w@jExT8E}i++~F>N@F#!qH~095fBBF9xzB@S z4|&96o{++nrZTl@OlvyRo53J6n#s&&F{|0kZVrPDF{ioAZK!$7Yd-TEW&sOYNYug> zv8crix40!NX(>xv#(MndfiV;?|n$@jgO>0@(I@YzG^=)878`;<zTiMz+wzZw@jkJRu?PQdl?P6EE+1(!Yw3of@V_*B(-)ILo&_T%tJH(+5bGRcM z=_p4##<7lbyfIF2qOneLvQwPuH17ren(ho|2G%TRJ13C2&U3yCj5FSafnMZdm$=kr jCYb1QSGdwuu6B)UUFUi?xY12+c8gox=5}|OWDHLM_?`P! literal 968 zcmWO31!I*30EW@`V|Tz9uuC^QFWsX%HoCjJyBS@hySp2cMhSyZP*709E-X^%HaUOc zgcBpAfFwi^LXjjT8Oc!;DTpQ|N=0g72%|KlB^~Ke1~QU~%qR<4$wqdRgPi07WO9>- zyeJ>}DL_F~h{6=1C@MyAVkv=2Qi{@)L1igNc`BfaRH8CfP*ti?oj4Rv4Qf&g)us-0 zsfX&*fQB?ejcGztnxW>jpe3zPYueD3cBnla=tw8jnJ#pt8|qFEdeRH^rVoAThx#*s zfeb=}8NyJ85e#PpBS|38C`L1ev1lCQnZQIeiOEbM5lv+p)0u&0GK<;FL35eMd={XE zEMhTB2rXq9%N49ZD_O;A)}XblV?7(tMmDjTEodv-*v<~LlU=;RtLQae=MCOOyV=8D z_M!b8;2?+4TfEI-j-aC);~m~b@9{pzIYHz}PVoW3hlq~I$0nP2#o-_Y+|<2pA8ZgPv;{GmX9a)-Oz zL-%>WLmr{WJmD$N2tDToe-ZqR{^4K#dzr7mNgUyj73ri-=HynCQ#jfwtyE6!7>BJi zPV00|Z)I>sXL4pMi?ceLvs*cw)47ag=XM_FwemT?3%Hsj^PzzyBVYV0O%>Sk7R zw{T0hvRb>1+q#|A-W}Z0ovhC8;;!yyb$1W5Lh3mcm diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.bin b/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.bin index e6227db9c9d8e449155452362f88ca325272b8be..44fab7fee209711e834a46e3c57c69bf169bee9e 100644 GIT binary patch literal 896 zcmW-dbyyZ=97QLnAYdT^_PO|b1@uD%6a!QQ6$9)pP>`?_0RwE;p_>b9vt743UFfEp zZn~KZW7DM_3v(O#+`sR0&b{UE!kh9`pdvo_QVBo&37|4ns7f`e6G#n$s7Wv(gc52Y z7HqW$vf2b%9qLk#`ZNGU7!5HTjR+@#NE*`w4^cEFnr6fhOB`_)YcbZGXlp@~c`Tlm zw4ya_NFb56w4*&qbRd}&I?{>Gq|$}1bfY_Iq?2xG)`On(qBp75hraZqf7yls3}g_4 z8NyJ8F`N-(kjY3!kwrG6$sw0K^2xV6%e5REL$+nvSjI7)2~1=XlbOO)rZJrYW>82G z#mr^OVs9AJ0QP%p*L?V?53iJjqimWf@QN49j_z z=XjnMSiwqGvC3B33R}$@UgRZ~+gjGKo(*hd6Pww>%e=y?yvFOi!JE9r+q}cOyvO@& zWgFYsZrg0DeZUTO@*yAH=YPy6>|!^c@)>*B%jbN-KKAn^UvYqge9bo;;xI=zT9zYr z*p6|WZ~2bz`GFIh`D zzlryF@een+$t`Ykhr9gCe>|Xa@{+g8tAZ-ZN4}~gKlv*_0nXp~xyq`ds;Z{y3RDdR zsiuMzqEOXRZPig-)l+>n5R$^wP$s8F3Ri?873m^exNEE?@+eAS?%w}R6|H89QLN(B zTrCu@mTINeYNG@ts;%0oy^_>H$x2a*OLiUANu8CdE=qJ=)lJ=%rgZgCPxVr7^-*8- zQ-2N6Kn>Dh4be~y({PPYhBB4uGTcawQkJqcS~<$qJ%c>uYmCNfoW^T{CTfxFwuX}0F5*cG`#SE2$}s{a90+wKkk literal 1000 zcmWO4heODD0LJ0BK~$(v*`Js1k5E#Ptz=X7UPYnoO&K|E@9hR|@4a#R+}?NG-h1D1 zd!Kv$h9_lvoD@SWam1qrG$esWs4}igIv^;Jn|_(1tCA=g&j-mQu=4Stt$T7>_0}k&$5%@spXtR2`g# zrZa(x9Q(^|iqJ->IIgQiN8Jx*k zoQ=-mT+ZWsbO9H#i;K|3T*9U7Mtj)H-moWVcesqpxdL6uu5cAsqieX9>$o1>z>VC* z&FB_x!y5cUV{3-|K?50df_4^#gLkD|vo$m2YLp5!T> z<{9)X&+$Ajpci?GmwAPlS2@ICUQ>(?heP3Y-av2i7H{(odYAWjpAXQ7e8k6mf(_lp`Fa=x8_+^dmpJV=I+jR&i`wp)cPLIbx%3Z`7UrTxwi}5$9?5~?(YE} zC=c>r7r9s-;t~(_P(>xtFc0?#d89{qU^H4DpE+*w|J|!S#?ouv?;2$HbmPUq+@J@?P34` diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_player.bin b/graphics/battle_anims/backgrounds/new/spacial_rend_player.bin index cae5112e003a1b2d5924c329d59bd2231481a186..7b479c88d672f56c52b5a2633d6b41aec8cdedca 100644 GIT binary patch literal 896 zcmW-eb$FKr0EAtS?sdEe_tCK)-LM`THEKPuTN=eyy3GY5pe3znO&i+Mj`nn*Bb|sNo&*v}BAFCY zNh6(*obEKII>pIOa-v0Nx?lpj(v9x)peMaTY;XF|mwsfBNfz1UkV_u<>mwC)*0Sj5gA}{m;&-Xmf^&HRk`CPzaF61IE<`ORDGA`!|u4D;I zLk*U(oE5BO6{}gpTGp}7YrV$nS>+9^@N#ct6Pww>R<7b|uHjm)<9cr3MsDI}ZsAt8 zaT~XD2Y0fa9qjOS-^JbB!@X?tecaCjJjg>l%p*L?V?53iJjqi$%`?Y0c$S^);yHG+ zhrR4$pZ9u?cl&vEd8c3CMPA}%_H%$&c$L?9oi})sw?gdOyu-V^$NPN1hkV4x9OMv( ze9)ipDWCBZ)$)t{&>CUh1tr>Z^XrP^Pk!tsLblFXY@HC&*WS4bVUh(qIkIPz}>? zjnGJq(rAs*SQV&HMJiSmB`Q^!$~8_EsyxnD1{J}0P0&P5(qvU>il%CsrfY_(Rij$f Osa_3gRFh_Emi_~I!0bK% literal 996 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 diff --git a/graphics/battle_anims/backgrounds/new/water_pulse.bin b/graphics/battle_anims/backgrounds/new/water_pulse.bin index 0982424c63433ea0fc13a7591f3f6d68f7ae4b97..f6cc14657fac5dbae19f34921823a3d2b08cdc1f 100644 GIT binary patch literal 896 zcmbWvV{aG$6h`69w*AbuZQHhO+qP|XHagq3%^$IL$+C7?vTivaZf^3P6Hd7QBz%w; zK}3;67DZIiL>EI$vBVZfT=B%0KthQmmPAs?B$q-;sic+$X{D211{r0NSr%DklU)uu z<&s+-dF7K|0Rb=6Z}0}VCO zSQAY((_9NJwbEJ}ZMD;02OV|NSr=V((_Ife_0n4(ef87d00Rv&*bqYvGu#LxjWXI8 zV~sQ31QSg%*%VVvGu;d`%`)2@bImi~0t+p&*b+-Ev)l?Rt+Lu0Ypt{11{-a%*%n)E z6A)&$+hM0&Vcv%<@3zNY`|Nk%pZ$XlIqZm|jtLARz;P#>bjoRGoOSMx#q%z>=#tB> zxcb8jc7wSV>I-z;4L3tIZn^D_yY9K~frr2Ce|AFNM;?3Psb`*h;iXqzd*f{w%wLsv YK~^yDeeltze{zE>pMCMwx4(Md0VT#JbN~PV literal 600 zcmWmB1y>Vb0EW@`V`4IxVhu$fY%EknW{cfow_7eD2ST~QHa7s zQbZI5q9`VcQ-YF|5~V3aG-X9O%2R=gB8Ey-rizHADsfa3@p!0C4N;R?)TWN8OFa^( zFB;I0Ml=>pXi77hix#w`6|F@Z5@}02(Vh-;q?71O7rN3-bf*VB=_PuTL?8N!e)MMm z1H~W)GlZdH7{eLCNHL1hjA5)8$9N`?EG9CE$xIPbnZ|Txh!nicWR{rC9Og1l%x3`$ zStJ&-grzJK%UQunR*BWDVJ+*#dN#0;O(K=eY+|;L%JfvkN z;5^8oP!4m%x~<7DN5wIYbApo|PT5Fne8HzVBhGS;^IQPGOd1!tBrX%+3Rgq8#&sL3 zup8(mx46w6BJOgJ_(aEjpVJ@210M3om+)9T;VI8}?%)M4Ne{$WBR{Wr%^UQVcf98V s`bY+!_)PK_8*NQe>Q}|N%r^($`N2;cWsTRD{)^xI;cvjY1OJfz13JB^$^ZZW diff --git a/graphics/battle_anims/backgrounds/new/waterfall.bin b/graphics/battle_anims/backgrounds/new/waterfall.bin index 0fbe00ac638522361e182ee6aa56cbdf876bec29..076beeff2fe1ba44277bad014102fbcc7c3180bc 100644 GIT binary patch literal 2048 zcmXw21(a1s6yxK%xG#`Ef-dgv?(XjH?(E|3&f@NFEmWZH?nUbEUOIf}nUmZkcix;g zb7mrlgpoAL$&ef=kP@koI`}k5i*!hj42TIXMi~QVLgv6(kQLdG9XXIQxCn9~ci=q8 zi&*4CeiQ&e6ht8iMqv~|Q4~XQlt3Ixq7+J_49cP$%A*1*q7o{j3aX+Ss-p&Kq84hS z4(g&F>Z1V~q7fRS37VoAnxh3;q7_=B4cej|+M@$Hq7yo!3%a5kx}yhrq8ECj5Bj1X z`eOhFVh{#n2!>)9hGPUqViZPW48~#{#$y5|ViG1}3Z`Njreg+XVism&4(4JW;*o&) zSb&9C6!y0mORyBnf?AFhfmdP`R$~p;Vjb3F12$q4HitZdE!c`}*dEp4112^#$p2jnH7SG{%ynq++5?;nDconbVb-aN$ z@fP03J9roG;eC975AhK`#x2~&9o)qy_!OVvb9{j>@fE(tH~1Fc;d}gmAMq1@#xM94 zzu|ZMfj{vV{>DG}7x$2a5hi6aCT9w!WGbd+8m47Bre_AmFe5WDGqW(953?~lBgny= z%*EWy!@P`TKIRWu0fJ;f7NY3jV_ldwOE^VSU2c;tj`8)$VP0;CTz-PY|a*J$yRL5Hf+mwY|jqt$WH9c zF6_!~?9LwS$zJTuKJ3eW?9Txl$Uz*;AsotK9L^CO$x$55F&xWr9M1`y$Vr^cDV)k_ zoX#1X$yuDuIh@ORjAsJpa{(7}5f^g_mvR}Ga|Ks&6<2c&*K!@#a|1VW6E|}Uw{jb| za|aW-le@T^d%`aE2JGX09tiay5AiUM@FpYn4`pKUtyWftP8imS}NMi?mP+G+zmd z*F4SD9L?4&&D0D{*ECJl6iwD7O$;;l1l%9HLrv5!?Nnk=JHm;^JnU@OHf`0GsN1Yf z+Ncd$uXS3hH6c6oaMpuW!Yhxi_Q0Lg2_4rl9Sw8hqw|jFuny^<4rssjX|G<<%X&#K z>IFTo=k%Iprr$8=rS^r#-uRbA0#UD8Ee(0QHHS)I{o{h;sloxasK z`dVMJeZl8_&S!nbr+q5qCj(CSxR3d$kNB_;`Cv#6c)$0B Hx;NlI69yLt literal 2128 zcmWN|Wk8k(8wKF=yntdMcI&y}+=_{c*h<*lVqswyb~grgcVTyTt=#6yO}Dvj*X`Qn z_g(+5Xhb3|U~~{-L>R-t2DfI~Qx!#Erq!I2!r(cl=41{3@;v64!uhxsL0(0o=$<+{`VJ z+{$g%VLNw3aVK|K@1Q|YefPp(=pN>9FCv0C?n^GUKbUoZ2f;%;%p*LSm&bVAR%Hbn zPJkzQil=!dnnkMB+8=O{?sm>o>*Cqq`Z=B_F7P5R@iK9RS9y)si5tAh$M`t$1fS$n zyhS|CXZS2{6VLH^zQ7lWmw1OS^A+MQ@9|Z>M!e4Ze1mTiZ}Dxu!*_}I_&z`2hr~zx zn4jM#>!eb zD~}?mU^KHB3y(FKBetvu6|IuRS!KkdidD60R^5Uc7H>7J7E;0k*0u!Zu4BoG=u+3} zS$&IWU=6Ji1~f(nnpjgyvSdq6L1wBov*v~t*3w#8YeO4rYwfJPp@Vg_PS)Ab#kyKI z>u%^_JuS_88G2hE>udcC>DJ!{*g(S|8*CXi#4yx`*>D?S7-^$yw2d*0wQ-hd;|&vR zqD`{NhAB4HrrC7E44Y}QY_?&J&9!+p->|?IT9z#`EVd=K)UplBY`Lwlm4;Qe+Sb@w z!#Z1U8*HOtlWn#ww$-rBw%ZQdY1n1EZI9(x#9rHH`-8*-L4)vvcE}C~DMt)P?U)_6 z6BcpOPTA?8+nFE@XYHJww+n`gcF8W=6^poP*X(+bc_WyF5-P4@Dyl+7R5+AgNYSAT z7F5E+0?My^k;*$6idPM&x~i$Fsz8+$r%I{_ zxujUdKqjh!%0uN;R%KK=J9N90O2*vju5M6Qbx~(^f;y^$+N&MZR&CT;t)P}_q2_7^ zr7A_qN`jiIi5jaB)KCpnU-h86O4MXcf+lK$#w!yVr?DEN(aI zf#yT=G*@#p8=9q=nxW|-P196O30t>6r`e``VY~KduX3trPuStzL6@jzr+0<4Q#-Uh z_U1NdtF~yfHifiN8?-*`-r1a6_ZMY7IHS`#l~*TqBJ5FC>_5k$V>+rMIt(4sK^@RN z=&oMT%en)-q!;yqo`;^(Z9S`Jpr>_9Pw7eM2|cdIbQ8Lv>$;|^&=pst1r+@Vi^tb-fpLzuSq2KkJeuaL~ z&-zJK;Z;0fWseJaC9mjZ!z2EmjUT@}}Md?HbQVr$*k;8+iRlujh4`V9DVpXO723VgCp@`*kHKHf8ZoR5W%@zFlYN5V(= za3AJF;X{1C@AJLz9N*)+eHVPE@9^!u4ZhX4_-5Y(-{>2By|06>^)v0#`pL|JQ`fWJb@qM- zdvMaE{r3+)kS<+~kl$)Xw`!@aPMGTc^>RJ+HPA3gwC-px<ZP|n`s$~@0R|dmupx#TX1EbX$~8(}WVC!^6jW0f znkr+1af%chZ-R*?nQV%wrllk$O%F*bF~iJ|l0?!hv&}KrJo7EE&?1X1vD7llBP*=5 z%4%z@jjgjjw!uc5Y_`SL$Tp=)6Wi^u(=NM%J@!V*?6Y6F0}h7#amZmu9CgfbC!BQ3 zX=j{u&UqJHbjf8`f~%2ht_L?#+fBFJcE?@!-1opkk39CoQ_np2!b`8b_QqT9ypMhG dF{MJKibU1+$!A|ezJ{hUOy7JD?+-s?zW_AAo!0;W literal 520 zcmYL^$5#^p7zckJn_y6*8?a*;B_g6I*ek3JtQfKPwPQ!@l?bT8f{48#V(-E3jX#Nt zXXQN(ygAHV$BjEGGTN<+e_h#Ge>>F>Op!SRoAaFjSwT|imQ-G-y`arWqdRU7ddkA| z!tITVMMy^(^r0{Pu>K5SAcJJeWH3V*iiQEh89^Y6C?kE#CN>JoQO0O;(HO>($2c^e zdP%KJV$RZYtB`jqbrMWEk zEGAn)uq?z%R>>)g#>8sYu$FaVJsa4_Cb5|W)I~F-}bW4xBVOt z2RX!HD&p7?DyfVf6~{Qv2~H+tr#OwB;jB2vc`i`ZCa1#UT%;P+P|GDQqbnq+<0`tw zb#73P-K2qAGNd4)rncSGw%ydW?cV%(lX>lQrgLWY?(V(k zn`??0=2&2+=(AHq4`Twfz zXio<^(uvM=A)W-f(v9x)_^%m9PkPatKJ+D#e)MMm0~y3%hA@<23}-}o#z;mnnlX%3 zjAOiF0u!0UWTr5cc>Oe{GlQATVm3+4VJ`ES&jJ>zghk3(Y{U|ls%aU^S;0zHv053a ztYIzdv~E2c*vKX}vxTjinM^X<*v<~cPIj@IJ?v#4`#E5+(=yWPK@Mr#!yMr#$2iUj zjgy?>G-o)=InHx|i(E3YFLQ;f+MGg){u|>;V$>M&jTJR9;v&>JmINP zg7F{z?4R+R7rf*ZuX)2;-YM%nANa^8KJ$gIeETcsJ3sho*!{vpOvOxLu2l=M6f4n* zwV1@FZf(R?>?8?$aS%swQe7&};-WfNaT9m(5Kr+EU8J}8h_CpGzXXVh1WJ$~BEb?O ZdI^;@KZ^I=*%ZQXHiIy0NmEYoV0a*Y5 literal 760 zcmWO4g?|)u9LM3$?{>HCw!vAd-T?(E}vJ0F-Vp zXhf+IN@IY95`uIcNUEUw7oOJ>2t`N^4-t3?`f!m%5sm!B5K9~?LQ&!gpahDMNO6=z z2}+WTH-%D^mMeqGQjYR~j8rO+hSI4>B`V`Gs6r-La^7qnpsM`UP<3ihlLt`_wWv)U zRF`_xrvWaPhiFJpPK{_x6PlujX~rWo$NMOc@p#ZZfm+a#RTxYuA)RkxGMjm>W=jcuk)RSI3&kML0d5M>KC0Ms0>{|PK(}!14UtXgh{m}ph zGKj$>zs`_w<_R~HH^iH~#oG)MA%-)8kzy318N*l)`HW+HUd;*O9VRk~$@y|qcvo&J z?}_*MfDf4_2Bb}A1|Nx!naM0>i#g0?9`j>Zz(U&l8)vRGH>+r4T3pP;y%R<_(*vKZi&1ef-DPS9s+u6a+VD1#(*YFMPcCnj1 z9`>@2{kQ|-Am8#G--{nO#9@AfpF+7m^9#R*m~ez6X}|G%Do2@djN@u}Lj1u=PVr|9 zr#T~cR%g$}ah?m|VPVHbaf!=Z;i?F8jqCgsa_Kj?$t`Y+JKW`O{uxn_^Dp7$RbwM;^j|h6TlLbSj-ZwxGc#^SV@ag wMzWCvSiuzKccR{%m4rY diff --git a/graphics/battle_anims/backgrounds/spacial_rend_opponent.bin b/graphics/battle_anims/backgrounds/spacial_rend_opponent.bin index e6227db9c9d8e449155452362f88ca325272b8be..44fab7fee209711e834a46e3c57c69bf169bee9e 100644 GIT binary patch literal 896 zcmW-dbyyZ=97QLnAYdT^_PO|b1@uD%6a!QQ6$9)pP>`?_0RwE;p_>b9vt743UFfEp zZn~KZW7DM_3v(O#+`sR0&b{UE!kh9`pdvo_QVBo&37|4ns7f`e6G#n$s7Wv(gc52Y z7HqW$vf2b%9qLk#`ZNGU7!5HTjR+@#NE*`w4^cEFnr6fhOB`_)YcbZGXlp@~c`Tlm zw4ya_NFb56w4*&qbRd}&I?{>Gq|$}1bfY_Iq?2xG)`On(qBp75hraZqf7yls3}g_4 z8NyJ8F`N-(kjY3!kwrG6$sw0K^2xV6%e5REL$+nvSjI7)2~1=XlbOO)rZJrYW>82G z#mr^OVs9AJ0QP%p*L?V?53iJjqimWf@QN49j_z z=XjnMSiwqGvC3B33R}$@UgRZ~+gjGKo(*hd6Pww>%e=y?yvFOi!JE9r+q}cOyvO@& zWgFYsZrg0DeZUTO@*yAH=YPy6>|!^c@)>*B%jbN-KKAn^UvYqge9bo;;xI=zT9zYr z*p6|WZ~2bz`GFIh`D zzlryF@een+$t`Ykhr9gCe>|Xa@{+g8tAZ-ZN4}~gKlv*_0nXp~xyq`ds;Z{y3RDdR zsiuMzqEOXRZPig-)l+>n5R$^wP$s8F3Ri?873m^exNEE?@+eAS?%w}R6|H89QLN(B zTrCu@mTINeYNG@ts;%0oy^_>H$x2a*OLiUANu8CdE=qJ=)lJ=%rgZgCPxVr7^-*8- zQ-2N6Kn>Dh4be~y({PPYhBB4uGTcawQkJqcS~<$qJ%c>uYmCNfoW^T{CTfxFwuX}0F5*cG`#SE2$}s{a90+wKkk literal 1000 zcmWO4heODD0LJ0BK~$(v*`Js1k5E#Ptz=X7UPYnoO&K|E@9hR|@4a#R+}?NG-h1D1 zd!Kv$h9_lvoD@SWam1qrG$esWs4}igIv^;Jn|_(1tCA=g&j-mQu=4Stt$T7>_0}k&$5%@spXtR2`g# zrZa(x9Q(^|iqJ->IIgQiN8Jx*k zoQ=-mT+ZWsbO9H#i;K|3T*9U7Mtj)H-moWVcesqpxdL6uu5cAsqieX9>$o1>z>VC* z&FB_x!y5cUV{3-|K?50df_4^#gLkD|vo$m2YLp5!T> z<{9)X&+$Ajpci?GmwAPlS2@ICUQ>(?heP3Y-av2i7H{(odYAWjpAXQ7e8k6mf(_lp`Fa=x8_+^dmpJV=I+jR&i`wp)cPLIbx%3Z`7UrTxwi}5$9?5~?(YE} zC=c>r7r9s-;t~(_P(>xtFc0?#d89{qU^H4DpE+*w|J|!S#?ouv?;2$HbmPUq+@J@?P34` diff --git a/graphics/battle_anims/backgrounds/spacial_rend_player.bin b/graphics/battle_anims/backgrounds/spacial_rend_player.bin index cae5112e003a1b2d5924c329d59bd2231481a186..7b479c88d672f56c52b5a2633d6b41aec8cdedca 100644 GIT binary patch literal 896 zcmW-eb$FKr0EAtS?sdEe_tCK)-LM`THEKPuTN=eyy3GY5pe3znO&i+Mj`nn*Bb|sNo&*v}BAFCY zNh6(*obEKII>pIOa-v0Nx?lpj(v9x)peMaTY;XF|mwsfBNfz1UkV_u<>mwC)*0Sj5gA}{m;&-Xmf^&HRk`CPzaF61IE<`ORDGA`!|u4D;I zLk*U(oE5BO6{}gpTGp}7YrV$nS>+9^@N#ct6Pww>R<7b|uHjm)<9cr3MsDI}ZsAt8 zaT~XD2Y0fa9qjOS-^JbB!@X?tecaCjJjg>l%p*L?V?53iJjqi$%`?Y0c$S^);yHG+ zhrR4$pZ9u?cl&vEd8c3CMPA}%_H%$&c$L?9oi})sw?gdOyu-V^$NPN1hkV4x9OMv( ze9)ipDWCBZ)$)t{&>CUh1tr>Z^XrP^Pk!tsLblFXY@HC&*WS4bVUh(qIkIPz}>? zjnGJq(rAs*SQV&HMJiSmB`Q^!$~8_EsyxnD1{J}0P0&P5(qvU>il%CsrfY_(Rij$f Osa_3gRFh_Emi_~I!0bK% literal 996 zcmWO41!ENi7>3bz$>>XO+v?$fOooC@X43W@LoYBP~)RB~+U_)TJJ(PXii~K#gcj6PluC zG^YjGD2JA`qBUwmTiO94+C|%F6KWl;qGjZSOnW*IC`m^;(V6rvbfudLyQ3cTq!+zW zA9CqS9?GYHe)J0!M1JH&-%xJ!iQds44PYRJ3_^n$LJ>pJForXNkt9YjT5F0aL8Xjg zEaT94CNLq!hsMR&7!#$Tk|>UeOhRQ$W(rf$G^R6ynIvX0Ticp52hF9Nc~qeJR8mDX zTEK#+j;c^)%#Vtg7b=g1EaEV9I7e_KN1>xRhGRJn9nT4z$VupA7PEw zRk1QwgqFv$SQ<-0i{lhda4R=uFPyY|bJ5T+ZYClwlX3wXEYp)}xEqz(zKq zO|daH#KmZRT*A6o8@iOsxST7{m0ZQuT!XIVIx}OJlkcZI2Ji? zJ9fph>KU7^dTSdG5gSd_Q$^X z1bxb9e9jl>OTOZ3zCqve9pCc<`jMabnP1Sa{KoJ6f&SzGfAKf^hkvQzAUedMI2bh{ zImM|?vkpYMGn{GFa+Yhmj#bz7T;C0x)zAqy+TO^G Date: Thu, 14 Oct 2021 16:18:11 +1300 Subject: [PATCH 082/193] Fix Battle Bond Battle Bond Greninja transforms only after a KO, and doesn't revert when switched out. --- asm/macros/battle_script.inc | 4 ++++ data/battle_scripts_1.s | 1 + include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 13 +++++++++++++ src/battle_util.c | 18 +++--------------- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 4d8fe0365..7ed108bde 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1825,6 +1825,10 @@ various BS_ATTACKER, VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER .endm + .macro tryactivatebattlebond battler:req + various \battler, VARIOUS_TRY_ACTIVATE_BATTLE_BOND + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e1fb47930..9ec90e3df 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5288,6 +5288,7 @@ BattleScript_FaintTarget:: tryactivatemoxie BS_ATTACKER @ and chilling neigh, as one ice rider tryactivatebeastboost BS_ATTACKER tryactivategrimneigh BS_ATTACKER @ and as one shadow rider + tryactivatebattlebond BS_ATTACKER trytrainerslidefirstdownmsg BS_TARGET return diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index d61eabbf8..29236c7b0 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -185,6 +185,7 @@ #define VARIOUS_REMOVE_TERRAIN 113 #define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 114 #define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 115 +#define VARIOUS_TRY_ACTIVATE_BATTLE_BOND 116 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2c017b2df..472487e09 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8822,6 +8822,19 @@ static void Cmd_various(void) } break; } + case VARIOUS_TRY_ACTIVATE_BATTLE_BOND: + if (gBattleMons[gBattlerAttacker].species == SPECIES_GRENINJA_BATTLE_BOND + && HasAttackerFaintedTarget() + && CalculateEnemyPartyCount() > 1) + { + PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].species); + gBattleStruct->changedSpecies[gBattlerPartyIndexes[gBattlerAttacker]] = gBattleMons[gBattlerAttacker].species; + gBattleMons[gBattlerAttacker].species = SPECIES_GRENINJA_ASH; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BattleBondActivatesOnMoveEndAttacker; + return; + } + break; } gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index 68e787698..e4b8f9cf3 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5147,18 +5147,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move effect++; } break; - case ABILITY_BATTLE_BOND: - if (gBattleMons[gBattlerAttacker].species == SPECIES_GRENINJA_BATTLE_BOND - && gBattleResults.opponentFaintCounter != 0 - && CalculateEnemyPartyCount() > 1) - { - PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].species); - gBattleStruct->changedSpecies[gBattlerPartyIndexes[gBattlerAttacker]] = gBattleMons[gBattlerAttacker].species; - gBattleMons[gBattlerAttacker].species = SPECIES_GRENINJA_ASH; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BattleBondActivatesOnMoveEndAttacker; - } - break; } break; case ABILITYEFFECT_MOVE_END_OTHER: // Abilities that activate on *another* battler's moveend: Dancer, Soul-Heart, Receiver, Symbiosis @@ -8846,6 +8834,7 @@ void UndoFormChange(u32 monId, u32 side, bool32 isSwitchingOut) static const u16 species[][2] = // changed form id, default form id { {SPECIES_MIMIKYU_BUSTED, SPECIES_MIMIKYU}, + {SPECIES_GRENINJA_ASH, SPECIES_GRENINJA_BATTLE_BOND}, {SPECIES_AEGISLASH_BLADE, SPECIES_AEGISLASH}, {SPECIES_DARMANITAN_ZEN_MODE, SPECIES_DARMANITAN}, {SPECIES_MINIOR, SPECIES_MINIOR_CORE_RED}, @@ -8858,11 +8847,10 @@ void UndoFormChange(u32 monId, u32 side, bool32 isSwitchingOut) {SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI}, {SPECIES_CRAMORANT_GORGING, SPECIES_CRAMORANT}, {SPECIES_CRAMORANT_GULPING, SPECIES_CRAMORANT}, - {SPECIES_GRENINJA_ASH, SPECIES_GRENINJA_BATTLE_BOND}, }; - if (isSwitchingOut) // Don't revert Mimikyu Busted when switching out - i = 1; + if (isSwitchingOut) // Don't revert Mimikyu Busted or Ash-Greninja when switching out + i = 2; else i = 0; From 85dd7ff63c40778538ece6d465f42a28a232b252 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Thu, 14 Oct 2021 16:40:18 +1300 Subject: [PATCH 083/193] Fix Storm Drain/Dive bug If Storm Drain is triggered by dive it should clear the attacker's semi-invulnerable status. --- data/battle_scripts_1.s | 1 + 1 file changed, 1 insertion(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 616fe21f1..c70bddcd4 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7525,6 +7525,7 @@ BattleScript_MoveStatDrain:: waitanimation printstring STRINGID_TARGETABILITYSTATRAISE waitmessage B_WAIT_TIME_LONG + clearsemiinvulnerablebit tryfaintmon BS_ATTACKER, FALSE, NULL goto BattleScript_MoveEnd From 85ce72a4d07cbf1f4339d03e2e774938046e98fc Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 14 Oct 2021 10:47:39 -0400 Subject: [PATCH 084/193] add shell smash anim --- data/battle_anim_scripts.s | 25 +++++++++++++++++++++++++ include/battle_anim.h | 2 ++ src/battle_anim_new.c | 34 ++++++++++++++++++++++++++++++++++ src/battle_anim_rock.c | 9 ++++----- 4 files changed, 65 insertions(+), 5 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 4063885e0..794cc2c0c 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -5374,6 +5374,31 @@ ScaldHitSplats: return Move_SHELL_SMASH: + loadspritegfx ANIM_TAG_SHELL_RIGHT + loadspritegfx ANIM_TAG_SHELL_LEFT + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_HANDS_AND_FEET + playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER + createsprite gShellSmashRightShellSpriteTemplate, ANIM_ATTACKER, 2, 0xffd7, 0x0, 0x2, 0x333, 0x0, 0xa + createsprite gShellSmashLeftShellSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0x0, 0x6, 0xfccd, 0x0, 0xa + delay 10 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 + createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x8, 0x1, 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, 1, 3, 0, 5, 1 + waitforvisualfinish + playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x18, 0xe, 0x2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x5, 0x0, 0xffec, 0x18, 0xe, 0x1 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x5, 0x14, 0xffe8, 0xe, 0x2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0xfffb, 0x0, 0xffec, 0xffe8, 0xe, 0x2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0x1e, 0x12, 0x8, 0x2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0xffee, 0x8, 0x2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xffe2, 0x12, 0x8, 0x2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xffe2, 0xffee, 0x8, 0x2 + createvisualtask AnimTask_ShakeMon, 2, 1, 0, 3, 7, 1 + waitforvisualfinish end Move_HEAL_PULSE: diff --git a/include/battle_anim.h b/include/battle_anim.h index 9bc51facb..ff388c714 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -442,6 +442,7 @@ extern const union AffineAnimCmd *const gAffineAnims_SpinningHandOrFoot[]; extern const union AnimCmd *const gAnims_RevengeBigScratch[]; // battle_anim_rock.c +extern const union AnimCmd *const gAnims_FlyingRock[]; extern const union AffineAnimCmd *const gAffineAnims_Whirlpool[]; extern const union AffineAnimCmd *const gAffineAnims_BasicRock[]; void AnimParticleInVortex(struct Sprite *sprite); @@ -449,6 +450,7 @@ void AnimFallingRock(struct Sprite *sprite); void AnimRaiseSprite(struct Sprite *sprite); void AnimFallingRock_Step(struct Sprite *sprite); void AnimFlyingSandCrescent(struct Sprite *sprite); +void AnimRockFragment(struct Sprite *); // battle_anim_dark.c void AnimClawSlash(struct Sprite *sprite); diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 0c452c236..55a617bab 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -93,6 +93,40 @@ const struct SpriteTemplate gPowerTrickSpriteTemplate = //// GEN 5 +//shell smash +const struct SpriteTemplate gShellSmashLeftShellSpriteTemplate = +{ + .tileTag = ANIM_TAG_SHELL_RIGHT, + .paletteTag = ANIM_TAG_SHELL_RIGHT, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_Bite, + .callback = AnimBite +}; + +const struct SpriteTemplate gShellSmashRightShellSpriteTemplate = +{ + .tileTag = ANIM_TAG_SHELL_LEFT, + .paletteTag = ANIM_TAG_SHELL_LEFT, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_Bite, + .callback = AnimBite +}; + +const struct SpriteTemplate gShellSmashPurpleRocksSpriteTemplate = +{ + .tileTag = ANIM_TAG_ROCKS, + .paletteTag = ANIM_TAG_SHELL_RIGHT, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_FlyingRock, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimRockFragment +}; + //wide guard const struct SpriteTemplate gWideGuardBlueConversionTemplate = { diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index da2d9b645..afbacc633 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -9,7 +9,6 @@ #include "constants/rgb.h" #include "constants/songs.h" -static void AnimRockFragment(struct Sprite *); static void AnimTask_Rollout_Step(u8 taskId); static void AnimRolloutParticle(struct Sprite *); static void AnimRockTomb(struct Sprite *); @@ -43,7 +42,7 @@ static const union AnimCmd sAnim_FlyingRock_2[] = ANIMCMD_END, }; -static const union AnimCmd *const sAnims_FlyingRock[] = +const union AnimCmd *const gAnims_FlyingRock[] = { sAnim_FlyingRock_0, sAnim_FlyingRock_1, @@ -55,7 +54,7 @@ const struct SpriteTemplate gFallingRockSpriteTemplate = .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_FlyingRock, + .anims = gAnims_FlyingRock, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFallingRock, @@ -66,7 +65,7 @@ const struct SpriteTemplate gRockFragmentSpriteTemplate = .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_FlyingRock, + .anims = gAnims_FlyingRock, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRockFragment, @@ -430,7 +429,7 @@ void AnimFallingRock_Step(struct Sprite *sprite) } // Animates the rock particles that are shown on the impact for Rock Blast / Rock Smash -static void AnimRockFragment(struct Sprite *sprite) +void AnimRockFragment(struct Sprite *sprite) { StartSpriteAnim(sprite, gBattleAnimArgs[5]); AnimateSprite(sprite); From 1f97198267a4af39788246db08f583df0fc85682 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 15 Oct 2021 05:02:14 -0300 Subject: [PATCH 085/193] Oops, I forgot to take the opponent's side into account --- include/battle.h | 3 ++- src/battle_main.c | 6 ++++-- src/battle_script_commands.c | 3 ++- src/battle_util.c | 7 +++++-- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/include/battle.h b/include/battle.h index aaecb9ea1..7958c40f5 100644 --- a/include/battle.h +++ b/include/battle.h @@ -908,6 +908,7 @@ extern u8 gBattleControllerData[MAX_BATTLERS_COUNT]; extern bool8 gHasFetchedBall; extern u8 gLastUsedBall; extern u16 gLastThrownBall; -extern bool8 gCanRetaliate; +extern bool8 gCanPlayerRetaliate; +extern bool8 gCanOpponentRetaliate; #endif // GUARD_BATTLE_H diff --git a/src/battle_main.c b/src/battle_main.c index 7d4ae76dd..ffb33da10 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -231,7 +231,8 @@ EWRAM_DATA struct TotemBoost gTotemBoosts[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA bool8 gHasFetchedBall = FALSE; EWRAM_DATA u8 gLastUsedBall = 0; EWRAM_DATA u16 gLastThrownBall = 0; -EWRAM_DATA bool8 gCanRetaliate = FALSE; +EWRAM_DATA bool8 gCanPlayerRetaliate = FALSE; +EWRAM_DATA bool8 gCanOpponentRetaliate = FALSE; // IWRAM common vars void (*gPreBattleCallback1)(void); @@ -2877,7 +2878,8 @@ static void BattleStartClearSetData(void) gHasFetchedBall = FALSE; gLastUsedBall = 0; - gCanRetaliate = FALSE; + gCanPlayerRetaliate = FALSE; + gCanOpponentRetaliate = FALSE; gBattlerAttacker = 0; gBattlerTarget = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b3ac59863..132a434cb 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3499,13 +3499,14 @@ static void Cmd_tryfaintmon(void) if (gBattleResults.playerFaintCounter < 0xFF) gBattleResults.playerFaintCounter++; AdjustFriendshipOnBattleFaint(gActiveBattler); - gCanRetaliate = TRUE; + gCanPlayerRetaliate = TRUE; } else { if (gBattleResults.opponentFaintCounter < 0xFF) gBattleResults.opponentFaintCounter++; gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES, NULL); + gCanOpponentRetaliate = TRUE; } if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBattlerAttacker].hp != 0) { diff --git a/src/battle_util.c b/src/battle_util.c index d588d5b08..689a846d6 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7933,10 +7933,13 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe MulModifier(&modifier, UQ_4_12(2.0)); break; case EFFECT_RETALIATE: - if (gCanRetaliate) + if (gCanPlayerRetaliate || gCanOpponentRetaliate) { MulModifier(&modifier, UQ_4_12(2.0)); - gCanRetaliate = FALSE; + if (gCanPlayerRetaliate) + gCanPlayerRetaliate = FALSE; + else if (gCanOpponentRetaliate) + gCanOpponentRetaliate = FALSE; } break; case EFFECT_SOLARBEAM: From 3a25bce185635b9887de6eb91a9803b8e9dbb1aa Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 15 Oct 2021 06:00:24 -0300 Subject: [PATCH 086/193] Turned Retaliate's effect into a side status --- include/battle.h | 2 -- include/constants/battle.h | 1 + src/battle_main.c | 5 ----- src/battle_script_commands.c | 4 ++-- src/battle_util.c | 8 +++----- 5 files changed, 6 insertions(+), 14 deletions(-) diff --git a/include/battle.h b/include/battle.h index 7958c40f5..826a0929e 100644 --- a/include/battle.h +++ b/include/battle.h @@ -908,7 +908,5 @@ extern u8 gBattleControllerData[MAX_BATTLERS_COUNT]; extern bool8 gHasFetchedBall; extern u8 gLastUsedBall; extern u16 gLastThrownBall; -extern bool8 gCanPlayerRetaliate; -extern bool8 gCanOpponentRetaliate; #endif // GUARD_BATTLE_H diff --git a/include/constants/battle.h b/include/constants/battle.h index a59ea2f1a..39994a049 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -220,6 +220,7 @@ #define SIDE_STATUS_WIDE_GUARD (1 << 19) #define SIDE_STATUS_CRAFTY_SHIELD (1 << 20) #define SIDE_STATUS_MAT_BLOCK (1 << 21) +#define SIDE_STATUS_RETALIATE (1 << 22) #define SIDE_STATUS_HAZARDS_ANY (SIDE_STATUS_SPIKES | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES | SIDE_STATUS_STEALTH_ROCK) #define SIDE_STATUS_SCREEN_ANY (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL) diff --git a/src/battle_main.c b/src/battle_main.c index ffb33da10..055ec9bbe 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -231,8 +231,6 @@ EWRAM_DATA struct TotemBoost gTotemBoosts[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA bool8 gHasFetchedBall = FALSE; EWRAM_DATA u8 gLastUsedBall = 0; EWRAM_DATA u16 gLastThrownBall = 0; -EWRAM_DATA bool8 gCanPlayerRetaliate = FALSE; -EWRAM_DATA bool8 gCanOpponentRetaliate = FALSE; // IWRAM common vars void (*gPreBattleCallback1)(void); @@ -2878,9 +2876,6 @@ static void BattleStartClearSetData(void) gHasFetchedBall = FALSE; gLastUsedBall = 0; - gCanPlayerRetaliate = FALSE; - gCanOpponentRetaliate = FALSE; - gBattlerAttacker = 0; gBattlerTarget = 0; gBattleWeather = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 132a434cb..b301047aa 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3499,14 +3499,14 @@ static void Cmd_tryfaintmon(void) if (gBattleResults.playerFaintCounter < 0xFF) gBattleResults.playerFaintCounter++; AdjustFriendshipOnBattleFaint(gActiveBattler); - gCanPlayerRetaliate = TRUE; + gSideStatuses[0] |= SIDE_STATUS_RETALIATE; } else { if (gBattleResults.opponentFaintCounter < 0xFF) gBattleResults.opponentFaintCounter++; gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES, NULL); - gCanOpponentRetaliate = TRUE; + gSideStatuses[1] |= SIDE_STATUS_RETALIATE; } if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBattlerAttacker].hp != 0) { diff --git a/src/battle_util.c b/src/battle_util.c index 689a846d6..e3bec3508 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7681,6 +7681,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe u16 basePower = CalcMoveBasePower(move, battlerAtk, battlerDef); u16 holdEffectModifier; u16 modifier = UQ_4_12(1.0); + u32 atkSide = GET_BATTLER_SIDE(battlerAtk); // attacker's abilities switch (GetBattlerAbility(battlerAtk)) @@ -7933,13 +7934,10 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe MulModifier(&modifier, UQ_4_12(2.0)); break; case EFFECT_RETALIATE: - if (gCanPlayerRetaliate || gCanOpponentRetaliate) + if (gSideStatuses[atkSide] & SIDE_STATUS_RETALIATE) { MulModifier(&modifier, UQ_4_12(2.0)); - if (gCanPlayerRetaliate) - gCanPlayerRetaliate = FALSE; - else if (gCanOpponentRetaliate) - gCanOpponentRetaliate = FALSE; + gSideStatuses[atkSide] &= ~SIDE_STATUS_RETALIATE; } break; case EFFECT_SOLARBEAM: From 2bf8022673a7754135097215bc16bebcf6aa0d3b Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 15 Oct 2021 07:09:27 -0300 Subject: [PATCH 087/193] Changed how SIDE_STATUS_RETALIATE is cleared --- src/battle_main.c | 1 + src/battle_util.c | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index 055ec9bbe..f3f86d58f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3583,6 +3583,7 @@ static void HandleEndTurn_ContinueBattle(void) gBattleMons[i].status2 &= ~(STATUS2_FLINCHED); if ((gBattleMons[i].status1 & STATUS1_SLEEP) && (gBattleMons[i].status2 & STATUS2_MULTIPLETURNS)) CancelMultiTurnMoves(i); + gSideStatuses[GET_BATTLER_SIDE(i)] &= ~SIDE_STATUS_RETALIATE; } gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsBattlerId = 0; diff --git a/src/battle_util.c b/src/battle_util.c index e3bec3508..3bf34afd5 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7935,10 +7935,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe break; case EFFECT_RETALIATE: if (gSideStatuses[atkSide] & SIDE_STATUS_RETALIATE) - { MulModifier(&modifier, UQ_4_12(2.0)); - gSideStatuses[atkSide] &= ~SIDE_STATUS_RETALIATE; - } break; case EFFECT_SOLARBEAM: if (WEATHER_HAS_EFFECT && gBattleWeather & (WEATHER_HAIL_ANY | WEATHER_SANDSTORM_ANY | WEATHER_RAIN_ANY)) From 883a2498364d1a8d40989ea5642b2ea24f81f38c Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Fri, 15 Oct 2021 09:20:32 -0400 Subject: [PATCH 088/193] config for catching semi-invulnerable mons --- include/constants/battle_config.h | 1 + src/item_use.c | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index bce49719e..eb9d9639e 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -178,6 +178,7 @@ #define B_POWDER_GRASS GEN_7 // In Gen6+, Grass-type Pokémon are immune to powder and spore moves. #define B_STEEL_RESISTANCES GEN_7 // In Gen6+, Steel-type Pokémon are no longer resistant to Dark-type and Ghost-type moves. #define B_THUNDERSTORM_TERRAIN TRUE // If TRUE, overworld Thunderstorm generates Rain and Electric Terrain as in Gen 8. +#define B_SEMI_INVULNERABLE_CATCH GEN_5 // In Gen5+, you cannot throw a ball against a Pokemon that is in a semi-invulnerable state (dig/fly/etc) // Animation Settings #define B_NEW_SWORD_PARTICLE FALSE // If set to TRUE, it updates Swords Dance's particle. diff --git a/src/item_use.c b/src/item_use.c index 63854a1ac..93604efef 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -947,11 +947,18 @@ u32 CanThrowBall(void) { return 2; // No room for mon } + #if B_SEMI_INVULNERABLE_CATCH >= GEN_5 + else if (gStatuses3[B_POSITION_OPPONENT_LEFT] & STATUS3_SEMI_INVULNERABLE) + { + return 3; // in semi-invulnerable state + } + #endif return 0; // usable } -static const u8 sText_CantThrowPokeBall_TwoMons[] = _("Cannot throw a ball!\nThere are two pokemon out there!\p"); +static const u8 sText_CantThrowPokeBall_TwoMons[] = _("Cannot throw a ball!\nThere are two Pokémon out there!\p"); +static const u8 sText_CantThrowPokeBall_SemiInvulnerable[] = _("Cannot throw a ball!\nThere's no Pokémon in sight!\p"); void ItemUseInBattle_PokeBall(u8 taskId) { switch (CanThrowBall()) @@ -976,6 +983,14 @@ void ItemUseInBattle_PokeBall(u8 taskId) else DisplayItemMessageInBattlePyramid(taskId, gText_BoxFull, Task_CloseBattlePyramidBagMessage); break; + #if B_SEMI_INVULNERABLE_CATCH >= GEN_5 + case 3: // Semi-Invulnerable + if (!InBattlePyramid()) + DisplayItemMessage(taskId, 1, sText_CantThrowPokeBall_SemiInvulnerable, CloseItemMessage); + else + DisplayItemMessageInBattlePyramid(taskId, sText_CantThrowPokeBall_SemiInvulnerable, Task_CloseBattlePyramidBagMessage); + break; + #endif } } From ef19c8c415b0f583bc686f131a58fba169c58fe6 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Fri, 15 Oct 2021 09:22:50 -0400 Subject: [PATCH 089/193] fix gen define --- include/constants/battle_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index eb9d9639e..62c8705e5 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -178,7 +178,7 @@ #define B_POWDER_GRASS GEN_7 // In Gen6+, Grass-type Pokémon are immune to powder and spore moves. #define B_STEEL_RESISTANCES GEN_7 // In Gen6+, Steel-type Pokémon are no longer resistant to Dark-type and Ghost-type moves. #define B_THUNDERSTORM_TERRAIN TRUE // If TRUE, overworld Thunderstorm generates Rain and Electric Terrain as in Gen 8. -#define B_SEMI_INVULNERABLE_CATCH GEN_5 // In Gen5+, you cannot throw a ball against a Pokemon that is in a semi-invulnerable state (dig/fly/etc) +#define B_SEMI_INVULNERABLE_CATCH GEN_4 // In Gen5+, you cannot throw a ball against a Pokemon that is in a semi-invulnerable state (dig/fly/etc) // Animation Settings #define B_NEW_SWORD_PARTICLE FALSE // If set to TRUE, it updates Swords Dance's particle. From c077091dbf917a17f469168c86a84c012a88d2ef Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Fri, 15 Oct 2021 14:57:26 -0400 Subject: [PATCH 090/193] small fixes, check GetCatchingBattler's semi-invulnerability --- include/constants/battle_config.h | 2 +- src/item_use.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 62c8705e5..fc9bc9f4e 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -178,7 +178,7 @@ #define B_POWDER_GRASS GEN_7 // In Gen6+, Grass-type Pokémon are immune to powder and spore moves. #define B_STEEL_RESISTANCES GEN_7 // In Gen6+, Steel-type Pokémon are no longer resistant to Dark-type and Ghost-type moves. #define B_THUNDERSTORM_TERRAIN TRUE // If TRUE, overworld Thunderstorm generates Rain and Electric Terrain as in Gen 8. -#define B_SEMI_INVULNERABLE_CATCH GEN_4 // In Gen5+, you cannot throw a ball against a Pokemon that is in a semi-invulnerable state (dig/fly/etc) +#define B_SEMI_INVULNERABLE_CATCH GEN_7 // In Gen4+, you cannot throw a ball against a Pokemon that is in a semi-invulnerable state (dig/fly/etc) // Animation Settings #define B_NEW_SWORD_PARTICLE FALSE // If set to TRUE, it updates Swords Dance's particle. diff --git a/src/item_use.c b/src/item_use.c index 93604efef..9a1fd2478 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -947,8 +947,8 @@ u32 CanThrowBall(void) { return 2; // No room for mon } - #if B_SEMI_INVULNERABLE_CATCH >= GEN_5 - else if (gStatuses3[B_POSITION_OPPONENT_LEFT] & STATUS3_SEMI_INVULNERABLE) + #if B_SEMI_INVULNERABLE_CATCH >= GEN_4 + else if (gStatuses3[GetCatchingBattler()] & STATUS3_SEMI_INVULNERABLE) { return 3; // in semi-invulnerable state } @@ -983,7 +983,7 @@ void ItemUseInBattle_PokeBall(u8 taskId) else DisplayItemMessageInBattlePyramid(taskId, gText_BoxFull, Task_CloseBattlePyramidBagMessage); break; - #if B_SEMI_INVULNERABLE_CATCH >= GEN_5 + #if B_SEMI_INVULNERABLE_CATCH >= GEN_4 case 3: // Semi-Invulnerable if (!InBattlePyramid()) DisplayItemMessage(taskId, 1, sText_CantThrowPokeBall_SemiInvulnerable, CloseItemMessage); From 1f176242aad724148a507c6adc40b72013ee5034 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Fri, 15 Oct 2021 16:06:50 -0400 Subject: [PATCH 091/193] add missing func definition --- include/battle_script_commands.h | 1 + src/battle_script_commands.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index dec1596f2..b55ac1391 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -37,6 +37,7 @@ bool32 TryResetBattlerStatChanges(u8 battler); bool32 CanCamouflage(u8 battlerId); u16 GetNaturePowerMove(void); void StealTargetItem(u8 battlerStealer, u8 battlerItem); +u8 GetCatchingBattler(void); extern void (* const gBattleScriptingCommandsTable[])(void); extern const u8 gBattlePalaceNatureToMoveGroupLikelihood[NUM_NATURES][4]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 29614e09b..2c0614ada 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12565,7 +12565,7 @@ static void Cmd_removelightscreenreflect(void) // brick break gBattlescriptCurrInstr++; } -static u8 GetCatchingBattler(void) +u8 GetCatchingBattler(void) { if (IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))) return GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); From b5293cc3e2b7c38364b9bc7b39ed7e4bc6cb2bec Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 16 Oct 2021 17:04:36 +1300 Subject: [PATCH 092/193] Fix multi target moves Only run CANCELLER_PRANKSTER when moving to the next target of a multi target move. If more cancellers are needed they can be added/moved after CANCELLER_PRANKSTER. --- include/battle_util.h | 27 +++++++++++++++++++++++++++ src/battle_script_commands.c | 2 +- src/battle_util.c | 27 --------------------------- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index 7d1b99f34..3f4f4bbc7 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -34,6 +34,33 @@ #define ITEMEFFECT_LIFEORB_SHELLBELL 0x7 #define ITEMEFFECT_BATTLER_MOVE_END 0x8 // move end effects for just the battler, not whole field +// Move cancellers. Note that anything from CANCELLER_PRANKSTER onwards is +// called on each target of a multi target move, so any new cancellers should +// probably be added before CANCELLER_PRANKSTER. +#define CANCELLER_FLAGS 0 +#define CANCELLER_ASLEEP 1 +#define CANCELLER_FROZEN 2 +#define CANCELLER_TRUANT 3 +#define CANCELLER_RECHARGE 4 +#define CANCELLER_FLINCH 5 +#define CANCELLER_DISABLED 6 +#define CANCELLER_GRAVITY 7 +#define CANCELLER_HEAL_BLOCKED 8 +#define CANCELLER_TAUNTED 9 +#define CANCELLER_IMPRISONED 10 +#define CANCELLER_CONFUSED 11 +#define CANCELLER_PARALYSED 12 +#define CANCELLER_IN_LOVE 13 +#define CANCELLER_BIDE 14 +#define CANCELLER_THAW 15 +#define CANCELLER_POWDER_MOVE 16 +#define CANCELLER_POWDER_STATUS 17 +#define CANCELLER_THROAT_CHOP 18 +#define CANCELLER_PRANKSTER 19 +#define CANCELLER_END 20 +#define CANCELLER_PSYCHIC_TERRAIN 21 +#define CANCELLER_END2 22 + #define WEATHER_HAS_EFFECT ((!IsAbilityOnField(ABILITY_CLOUD_NINE) && !IsAbilityOnField(ABILITY_AIR_LOCK))) #define IS_WHOLE_SIDE_ALIVE(battler)((IsBattlerAlive(battler) && IsBattlerAlive(BATTLE_PARTNER(battler)))) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 29614e09b..ea169f52d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5157,7 +5157,7 @@ static void Cmd_moveend(void) MoveValuesCleanUp(); gBattleScripting.moveEffect = gBattleScripting.savedMoveEffect; BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); - gBattleStruct->atkCancellerTracker = 0; // Run all cancellers on next target + gBattleStruct->atkCancellerTracker = CANCELLER_PRANKSTER; // Run Prankster canceller on next target, skip the earlier ones gBattlescriptCurrInstr = BattleScript_FlushMessageBox; return; } diff --git a/src/battle_util.c b/src/battle_util.c index 18a1bfb47..1177c316e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3102,33 +3102,6 @@ void TryClearRageAndFuryCutter(void) } } -enum -{ - CANCELLER_FLAGS, - CANCELLER_ASLEEP, - CANCELLER_FROZEN, - CANCELLER_TRUANT, - CANCELLER_RECHARGE, - CANCELLER_FLINCH, - CANCELLER_DISABLED, - CANCELLER_GRAVITY, - CANCELLER_HEAL_BLOCKED, - CANCELLER_TAUNTED, - CANCELLER_IMPRISONED, - CANCELLER_CONFUSED, - CANCELLER_PARALYSED, - CANCELLER_IN_LOVE, - CANCELLER_BIDE, - CANCELLER_THAW, - CANCELLER_POWDER_MOVE, - CANCELLER_POWDER_STATUS, - CANCELLER_THROAT_CHOP, - CANCELLER_PRANKSTER, - CANCELLER_END, - CANCELLER_PSYCHIC_TERRAIN, - CANCELLER_END2, -}; - u8 AtkCanceller_UnableToUseMove(void) { u8 effect = 0; From 791f4164a22f24d4fffa04e59424c0a6714ef0bf Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 16 Oct 2021 17:31:27 +1300 Subject: [PATCH 093/193] Fix PP being checked when HITMARKER_NO_PPDEDUCT is set This fixes multi target moves and seems like it should be done anyway, --- src/battle_script_commands.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ea169f52d..8bd082529 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1392,7 +1392,8 @@ static void Cmd_attackcanceler(void) return; if (AbilityBattleEffects(ABILITYEFFECT_MOVES_BLOCK, gBattlerTarget, 0, 0, 0)) return; - if (!gBattleMons[gBattlerAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE && !(gHitMarker & (HITMARKER_x800000 | HITMARKER_NO_ATTACKSTRING)) + if (!gBattleMons[gBattlerAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE + && !(gHitMarker & (HITMARKER_x800000 | HITMARKER_NO_ATTACKSTRING | HITMARKER_NO_PPDEDUCT)) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) { gBattlescriptCurrInstr = BattleScript_NoPPForMove; From 3b6ceb1dfafc3a0d7fb57e4f332a92395b0ad970 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 16 Oct 2021 05:41:50 -0300 Subject: [PATCH 094/193] Turned Retaliate into a side timer --- include/battle.h | 1 + include/constants/battle.h | 1 - src/battle_main.c | 1 - src/battle_script_commands.c | 4 ++-- src/battle_util.c | 9 ++++++++- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/include/battle.h b/include/battle.h index 826a0929e..49881bacf 100644 --- a/include/battle.h +++ b/include/battle.h @@ -210,6 +210,7 @@ struct SideTimer u8 tailwindBattlerId; u8 luckyChantTimer; u8 luckyChantBattlerId; + u8 retaliateTimer; }; struct FieldTimer diff --git a/include/constants/battle.h b/include/constants/battle.h index 39994a049..a59ea2f1a 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -220,7 +220,6 @@ #define SIDE_STATUS_WIDE_GUARD (1 << 19) #define SIDE_STATUS_CRAFTY_SHIELD (1 << 20) #define SIDE_STATUS_MAT_BLOCK (1 << 21) -#define SIDE_STATUS_RETALIATE (1 << 22) #define SIDE_STATUS_HAZARDS_ANY (SIDE_STATUS_SPIKES | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES | SIDE_STATUS_STEALTH_ROCK) #define SIDE_STATUS_SCREEN_ANY (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL) diff --git a/src/battle_main.c b/src/battle_main.c index f3f86d58f..055ec9bbe 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3583,7 +3583,6 @@ static void HandleEndTurn_ContinueBattle(void) gBattleMons[i].status2 &= ~(STATUS2_FLINCHED); if ((gBattleMons[i].status1 & STATUS1_SLEEP) && (gBattleMons[i].status2 & STATUS2_MULTIPLETURNS)) CancelMultiTurnMoves(i); - gSideStatuses[GET_BATTLER_SIDE(i)] &= ~SIDE_STATUS_RETALIATE; } gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsBattlerId = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b301047aa..8813f2029 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3499,14 +3499,14 @@ static void Cmd_tryfaintmon(void) if (gBattleResults.playerFaintCounter < 0xFF) gBattleResults.playerFaintCounter++; AdjustFriendshipOnBattleFaint(gActiveBattler); - gSideStatuses[0] |= SIDE_STATUS_RETALIATE; + gSideTimers[0].retaliateTimer = 2; } else { if (gBattleResults.opponentFaintCounter < 0xFF) gBattleResults.opponentFaintCounter++; gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES, NULL); - gSideStatuses[1] |= SIDE_STATUS_RETALIATE; + gSideTimers[1].retaliateTimer = 2; } if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBattlerAttacker].hp != 0) { diff --git a/src/battle_util.c b/src/battle_util.c index 3bf34afd5..6b43709da 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1881,6 +1881,7 @@ enum ENDTURN_PSYCHIC_TERRAIN, ENDTURN_ION_DELUGE, ENDTURN_FAIRY_LOCK, + ENDTURN_RETALIATE, ENDTURN_FIELD_COUNT, }; @@ -2312,6 +2313,12 @@ u8 DoFieldEndTurnEffects(void) } gBattleStruct->turnCountersTracker++; break; + case ENDTURN_RETALIATE: + gActiveBattler = gBattlerByTurnOrder[gBattleStruct->turnSideTracker]; + if (gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].retaliateTimer > 0) + gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].retaliateTimer--; + gBattleStruct->turnCountersTracker++; + break; case ENDTURN_FIELD_COUNT: effect++; break; @@ -7934,7 +7941,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe MulModifier(&modifier, UQ_4_12(2.0)); break; case EFFECT_RETALIATE: - if (gSideStatuses[atkSide] & SIDE_STATUS_RETALIATE) + if (gSideTimers[atkSide].retaliateTimer == 1) MulModifier(&modifier, UQ_4_12(2.0)); break; case EFFECT_SOLARBEAM: From c2e25272b0a74402803e62383877faa5a3018489 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 16 Oct 2021 07:02:26 -0300 Subject: [PATCH 095/193] Added Grav Apple's power boost --- src/battle_util.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index e01c89fca..2b72fc3bc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7702,6 +7702,10 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) if (gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH) basePower = 20; break; + case MOVE_GRAV_APPLE: + if (gFieldStatuses & STATUS_FIELD_GRAVITY) + basePower = 120; + break; } if (basePower == 0) From 611076c24def2e984c54fdd66824361184af846b Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sat, 16 Oct 2021 10:15:15 -0400 Subject: [PATCH 096/193] move prankster to ABILITYEFFECT_MOVES_BLOCK --- src/battle_script_commands.c | 1 - src/battle_util.c | 23 ++++++++++------------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index bfd4cc21a..818fd246e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6642,7 +6642,6 @@ static void Cmd_jumptocalledmove(void) else gChosenMove = gCurrentMove = gCalledMove; - gBattleStruct->atkCancellerTracker = 0; gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; } diff --git a/src/battle_util.c b/src/battle_util.c index e01c89fca..f3e1eb9aa 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3130,7 +3130,6 @@ enum CANCELLER_POWDER_MOVE, CANCELLER_POWDER_STATUS, CANCELLER_THROAT_CHOP, - CANCELLER_PRANKSTER, CANCELLER_END, CANCELLER_PSYCHIC_TERRAIN, CANCELLER_END2, @@ -3459,18 +3458,6 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case CANCELLER_PRANKSTER: - if (BlocksPrankster(gCurrentMove, gBattlerAttacker, gBattlerTarget, TRUE) - && !(IS_MOVE_STATUS(gCurrentMove) && GetBattlerAbility(gBattlerTarget) == ABILITY_MAGIC_BOUNCE)) - { - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE) || !(gBattleMoves[gCurrentMove].target & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) - CancelMultiTurnMoves(gBattlerAttacker); // Don't cancel moves that can hit two targets bc one target might not be protected - gBattleScripting.battler = gBattlerAbility = gBattlerTarget; - gBattlescriptCurrInstr = BattleScript_DarkTypePreventsPrankster; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; case CANCELLER_END: break; } @@ -4572,6 +4559,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move gBattlescriptCurrInstr = BattleScript_DazzlingProtected; effect = 1; } + else if (BlocksPrankster(move, gBattlerAttacker, gBattlerTarget, TRUE) + && !(IS_MOVE_STATUS(move) && GetBattlerAbility(gBattlerTarget) == ABILITY_MAGIC_BOUNCE)) + { + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE) || !(gBattleMoves[move].target & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) + CancelMultiTurnMoves(gBattlerAttacker); // Don't cancel moves that can hit two targets bc one target might not be protected + gBattleScripting.battler = gBattlerAbility = gBattlerTarget; + gBattlescriptCurrInstr = BattleScript_DarkTypePreventsPrankster; + effect = 1; + } + break; case ABILITYEFFECT_ABSORBING: // 3 if (move != MOVE_NONE) From b7dcbca8718f85b87ba0d53eb0e99c98a4eae6e0 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sat, 16 Oct 2021 11:25:20 -0400 Subject: [PATCH 097/193] remove atkCancelerTracker reset --- src/battle_script_commands.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 818fd246e..4321881bf 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5159,7 +5159,6 @@ static void Cmd_moveend(void) MoveValuesCleanUp(); gBattleScripting.moveEffect = gBattleScripting.savedMoveEffect; BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); - gBattleStruct->atkCancellerTracker = 0; // Run all cancellers on next target gBattlescriptCurrInstr = BattleScript_FlushMessageBox; return; } From 5509ceea0420afdb3628af207f28d7a7db3283d3 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sat, 16 Oct 2021 16:10:45 -0400 Subject: [PATCH 098/193] expand move target field --- include/battle.h | 2 +- include/battle_util.h | 2 +- include/constants/battle.h | 3 +-- src/battle_controller_player.c | 4 ++-- src/battle_util.c | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/include/battle.h b/include/battle.h index 22b60d6e4..26c6b3e40 100644 --- a/include/battle.h +++ b/include/battle.h @@ -491,7 +491,7 @@ struct BattleStruct u8 turnEffectsBattlerId; u8 turnCountersTracker; u16 wrappedMove[MAX_BATTLERS_COUNT]; - u8 moveTarget[MAX_BATTLERS_COUNT]; + u16 moveTarget[MAX_BATTLERS_COUNT]; u8 expGetterMonId; u8 wildVictorySong; u8 dynamicMoveType; diff --git a/include/battle_util.h b/include/battle_util.h index 7d1b99f34..ee7337ef2 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -109,7 +109,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn); void ClearFuryCutterDestinyBondGrudge(u8 battlerId); void HandleAction_RunBattleScript(void); u32 SetRandomTarget(u32 battlerId); -u8 GetMoveTarget(u16 move, u8 setTarget); +u32 GetMoveTarget(u16 move, u8 setTarget); u8 IsMonDisobedient(void); u32 GetBattlerHoldEffect(u8 battlerId, bool32 checkNegating); u32 GetBattlerHoldEffectParam(u8 battlerId); diff --git a/include/constants/battle.h b/include/constants/battle.h index 90294b4b4..c5d5601fa 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -386,7 +386,6 @@ #define MOVE_TARGET_FOES_AND_ALLY 0x20 #define MOVE_TARGET_OPPONENTS_FIELD 0x40 #define MOVE_TARGET_ALLY 0x80 - -#define MOVE_TARGET_ALL_BATTLERS (MOVE_TARGET_BOTH | MOVE_TARGET_OPPONENTS_FIELD) +#define MOVE_TARGET_ALL_BATTLERS 0x100 #endif // GUARD_CONSTANTS_BATTLE_H diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 877e44750..0d4cf51de 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -590,7 +590,7 @@ static void TryShowAsTarget(u32 battlerId) static void HandleInputChooseMove(void) { - u8 moveTarget; + u16 moveTarget; u32 canSelectTarget = 0; struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleResources->bufferA[gActiveBattler][4]); @@ -644,7 +644,7 @@ static void HandleInputChooseMove(void) // Show all available targets for multi-target moves if (B_SHOW_TARGETS) { - if ((moveTarget & MOVE_TARGET_ALL_BATTLERS) == MOVE_TARGET_ALL_BATTLERS) + if (moveTarget & MOVE_TARGET_ALL_BATTLERS) { u32 i = 0; for (i = 0; i < gBattlersCount; i++) diff --git a/src/battle_util.c b/src/battle_util.c index e01c89fca..cdacaf179 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7018,7 +7018,7 @@ u32 SetRandomTarget(u32 battlerId) return target; } -u8 GetMoveTarget(u16 move, u8 setTarget) +u32 GetMoveTarget(u16 move, u8 setTarget) { u8 targetBattler = 0; u32 i, moveTarget, side; From 964e7efba9f900db7ee3f51f3821165e81cd29ff Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sat, 16 Oct 2021 16:23:17 -0400 Subject: [PATCH 099/193] fix MOVE_TARGET_ALL_BATTLERS and other u8 vars --- include/constants/battle.h | 2 +- include/pokemon.h | 2 +- src/battle_ai_main.c | 4 ++-- src/battle_controller_player.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/constants/battle.h b/include/constants/battle.h index c5d5601fa..577b0ba60 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -386,6 +386,6 @@ #define MOVE_TARGET_FOES_AND_ALLY 0x20 #define MOVE_TARGET_OPPONENTS_FIELD 0x40 #define MOVE_TARGET_ALLY 0x80 -#define MOVE_TARGET_ALL_BATTLERS 0x100 +#define MOVE_TARGET_ALL_BATTLERS (0x100 | MOVE_TARGET_USER) #endif // GUARD_CONSTANTS_BATTLE_H diff --git a/include/pokemon.h b/include/pokemon.h index 1524e16f4..747830412 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -216,7 +216,7 @@ struct BattleMove u8 accuracy; u8 pp; u8 secondaryEffectChance; - u8 target; + u16 target; s8 priority; u32 flags; u8 split; diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index edfd76464..972dc0ed6 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -517,7 +517,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) u8 atkPriority = GetMovePriority(battlerAtk, move); u16 moveEffect = gBattleMoves[move].effect; s32 moveType; - u8 moveTarget = gBattleMoves[move].target; + u16 moveTarget = gBattleMoves[move].target; u16 accuracy = AI_GetMoveAccuracy(battlerAtk, battlerDef, AI_DATA->atkAbility, AI_DATA->defAbility, AI_DATA->atkHoldEffect, AI_DATA->defHoldEffect, move); u8 effectiveness = AI_GetMoveEffectiveness(move, battlerAtk, battlerDef); bool32 isDoubleBattle = IsValidDoubleBattle(battlerAtk); @@ -2514,7 +2514,7 @@ static s16 AI_DoubleBattle(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) // move data u8 moveType = gBattleMoves[move].type; u16 effect = gBattleMoves[move].effect; - u8 target = gBattleMoves[move].target; + u16 target = gBattleMoves[move].target; // ally data u8 battlerAtkPartner = AI_DATA->battlerAtkPartner; u16 atkPartnerAbility = AI_DATA->atkPartnerAbility; diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 0d4cf51de..e1cb2f54f 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -644,7 +644,7 @@ static void HandleInputChooseMove(void) // Show all available targets for multi-target moves if (B_SHOW_TARGETS) { - if (moveTarget & MOVE_TARGET_ALL_BATTLERS) + if ((moveTarget & MOVE_TARGET_ALL_BATTLERS) == MOVE_TARGET_ALL_BATTLERS) { u32 i = 0; for (i = 0; i < gBattlersCount; i++) From 59cfbe55c1d7669957714379b060f81c4e7b70db Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 17 Oct 2021 09:27:35 -0300 Subject: [PATCH 100/193] Gave Grav Apple a move effect of its own --- data/battle_scripts_1.s | 4 ++++ include/constants/battle_move_effects.h | 3 ++- src/battle_util.c | 8 ++++---- src/data/battle_moves.h | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e4fdb3038..7999091e0 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -381,6 +381,10 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectTripleHit @ EFFECT_TRIPLE_HIT .4byte BattleScript_EffectRecoilHP25 @ EFFECT_RECOIL_HP_25 .4byte BattleScript_EffectStuffCheeks @ EFFECT_STUFF_CHEEKS + .4byte BattleScript_EffectGravApple @ EFFECT_GRAV_APPLE + +BattleScript_EffectGravApple: + goto BattleScript_EffectAttackerDefenseDownHit BattleScript_EffectStuffCheeks:: attackcanceler diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 9a6efb847..20f6e110d 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -365,7 +365,8 @@ #define EFFECT_TRIPLE_HIT 359 #define EFFECT_RECOIL_HP_25 360 #define EFFECT_STUFF_CHEEKS 361 +#define EFFECT_GRAV_APPLE 362 -#define NUM_BATTLE_MOVE_EFFECTS 362 +#define NUM_BATTLE_MOVE_EFFECTS 363 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/battle_util.c b/src/battle_util.c index 2b72fc3bc..fb485c2e7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7693,6 +7693,10 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) #endif break; } + case EFFECT_GRAV_APPLE: + if (gFieldStatuses & STATUS_FIELD_GRAVITY) + MulModifier(&basePower, UQ_4_12(1.5)); + break; } // move-specific base power changes @@ -7702,10 +7706,6 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) if (gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH) basePower = 20; break; - case MOVE_GRAV_APPLE: - if (gFieldStatuses & STATUS_FIELD_GRAVITY) - basePower = 120; - break; } if (basePower == 0) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index a6b8d271c..2dcdbf5b2 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -11103,7 +11103,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_GRAV_APPLE] = { - .effect = EFFECT_DEFENSE_DOWN_HIT, + .effect = EFFECT_GRAV_APPLE, .power = 80, .type = TYPE_GRASS, .accuracy = 100, From d6304099ac822a081f259769144cf858c51cba74 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 17 Oct 2021 09:39:57 -0300 Subject: [PATCH 101/193] Review optimization Co-authored-by: Eduardo Quezada D'Ottone --- data/battle_scripts_1.s | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7999091e0..88832325a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -381,10 +381,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectTripleHit @ EFFECT_TRIPLE_HIT .4byte BattleScript_EffectRecoilHP25 @ EFFECT_RECOIL_HP_25 .4byte BattleScript_EffectStuffCheeks @ EFFECT_STUFF_CHEEKS - .4byte BattleScript_EffectGravApple @ EFFECT_GRAV_APPLE - -BattleScript_EffectGravApple: - goto BattleScript_EffectAttackerDefenseDownHit + .4byte BattleScript_EffectDefenseDownHit @ EFFECT_GRAV_APPLE BattleScript_EffectStuffCheeks:: attackcanceler From 5d0350cdbc86310e25ea53946b07819b98366ba2 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 17 Oct 2021 10:08:30 -0300 Subject: [PATCH 102/193] Set the right .effect to Dynamax Cannon --- src/data/battle_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 2dcdbf5b2..a34055200 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -10738,7 +10738,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_DYNAMAX_CANNON] = { - .effect = EFFECT_HIT, + .effect = EFFECT_DYNAMAX_DOUBLE_DMG, .power = 100, .type = TYPE_DRAGON, .accuracy = 100, From dcea8e45ed0bb72f67ef2f78513450dfb6133d70 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 17 Oct 2021 10:51:22 -0300 Subject: [PATCH 103/193] Fixed jumpifspecies --- asm/macros/battle_script.inc | 2 +- src/battle_script_commands.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 9d624195b..fd20478d2 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1771,7 +1771,7 @@ .macro jumpifspecies battler:req, species:req, ptr:req various \battler, VARIOUS_JUMP_IF_SPECIES - .byte \species + .2byte \species .4byte \ptr .endm diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2a4b2e347..7b5e782c2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8427,10 +8427,10 @@ static void Cmd_various(void) } return; case VARIOUS_JUMP_IF_SPECIES: - if (gBattleMons[gBattlerAttacker].species == gBattlescriptCurrInstr[3]) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 4); + if (gBattleMons[gActiveBattler].species == T1_READ_16(gBattlescriptCurrInstr + 3)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5); else - gBattlescriptCurrInstr += 8; + gBattlescriptCurrInstr += 9; return; } From e7ad7319e3bb3469dba8bce076d85c42912d1dc6 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 17 Oct 2021 11:54:27 -0300 Subject: [PATCH 104/193] Updated Glare --- data/battle_scripts_1.s | 4 ++++ include/constants/battle_config.h | 1 + 2 files changed, 5 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 88832325a..9806cf939 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3229,7 +3229,11 @@ BattleScript_EffectParalyze: jumpifleafguard BattleScript_LeafGuardProtects jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed +.if B_GLARE_GHOST >= GEN_4 + jumpifmove MOVE_GLARE, BattleScript_BattleScript_EffectParalyzeNoTypeCalc +.endif typecalc +BattleScript_BattleScript_EffectParalyzeNoTypeCalc: jumpifmovehadnoeffect BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_PARALYSIS, BattleScript_AlreadyParalyzed tryparalyzetype BS_ATTACKER, BS_TARGET, BattleScript_NotAffected diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index fc9bc9f4e..3aa9faea3 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -124,6 +124,7 @@ #define B_TAILWIND_TIMER GEN_7 // In Gen5+, Tailwind lasts 4 turns instead of 3. #define B_MEMENTO_FAIL GEN_7 // In Gen4+, Memento fails if there is no target or if the target is protected or behind substitute. But not if Atk/Sp. Atk are at -6. #define B_HIDDEN_POWER_DMG GEN_7 // In Gen6+, Hidden Power's base power was set to always be 60. Before, it was determined by the mon's IVs. +#define B_GLARE_GHOST GEN_7 // In Gen4+, Glare can hit Ghost-type Pokémon normally. // Ability settings #define B_ABILITY_WEATHER GEN_7 // In Gen6+, ability-induced weather lasts 5 turns. Before, it lasted until the battle ended or until it was changed by a move or a different weather-affecting ability. From 25255475a78c29f563ddbe0a78ea26c13f053a49 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 18 Oct 2021 10:05:19 -0300 Subject: [PATCH 105/193] AI will now take Grav Apple's new effect in consideration --- src/battle_ai_main.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index edfd76464..324ca4934 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3363,6 +3363,10 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) case EFFECT_PARALYZE: IncreaseParalyzeScore(battlerAtk, battlerDef, move, &score); break; + case EFFECT_GRAV_APPLE: + if (gFieldStatuses & STATUS_FIELD_GRAVITY) + score += 2; + // fall through case EFFECT_ATTACK_DOWN_HIT: case EFFECT_DEFENSE_DOWN_HIT: case EFFECT_SPECIAL_ATTACK_DOWN_HIT: From 3c6101d957fb5feabc253a6e0a302461ed647a38 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Mon, 18 Oct 2021 21:55:16 -0300 Subject: [PATCH 106/193] Clear gStatuses4 data --- src/battle_main.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/battle_main.c b/src/battle_main.c index 2c1597718..d18f71fe0 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2850,6 +2850,7 @@ static void BattleStartClearSetData(void) for (i = 0; i < MAX_BATTLERS_COUNT; i++) { gStatuses3[i] = 0; + gStatuses4[i] = 0; gDisableStructs[i].isFirstTurn = 2; gLastMoves[i] = 0; gLastLandedMoves[i] = 0; @@ -2981,6 +2982,8 @@ void SwitchInClearSetData(void) gBattleMons[gActiveBattler].status2 = 0; gStatuses3[gActiveBattler] = 0; } + + gStatuses4[gActiveBattler] = 0; for (i = 0; i < gBattlersCount; i++) { @@ -3054,6 +3057,7 @@ void FaintClearSetData(void) gBattleMons[gActiveBattler].status2 = 0; gStatuses3[gActiveBattler] = 0; + gStatuses4[gActiveBattler] = 0; for (i = 0; i < gBattlersCount; i++) { From 910fdfa94a97eefb49fd2aefa2a39dcf553e7e00 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Tue, 19 Oct 2021 16:25:01 +1300 Subject: [PATCH 107/193] Revert "Fix multi target moves" This reverts commit b5293cc3e2b7c38364b9bc7b39ed7e4bc6cb2bec. --- include/battle_util.h | 27 --------------------------- src/battle_script_commands.c | 2 +- src/battle_util.c | 27 +++++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index 3f4f4bbc7..7d1b99f34 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -34,33 +34,6 @@ #define ITEMEFFECT_LIFEORB_SHELLBELL 0x7 #define ITEMEFFECT_BATTLER_MOVE_END 0x8 // move end effects for just the battler, not whole field -// Move cancellers. Note that anything from CANCELLER_PRANKSTER onwards is -// called on each target of a multi target move, so any new cancellers should -// probably be added before CANCELLER_PRANKSTER. -#define CANCELLER_FLAGS 0 -#define CANCELLER_ASLEEP 1 -#define CANCELLER_FROZEN 2 -#define CANCELLER_TRUANT 3 -#define CANCELLER_RECHARGE 4 -#define CANCELLER_FLINCH 5 -#define CANCELLER_DISABLED 6 -#define CANCELLER_GRAVITY 7 -#define CANCELLER_HEAL_BLOCKED 8 -#define CANCELLER_TAUNTED 9 -#define CANCELLER_IMPRISONED 10 -#define CANCELLER_CONFUSED 11 -#define CANCELLER_PARALYSED 12 -#define CANCELLER_IN_LOVE 13 -#define CANCELLER_BIDE 14 -#define CANCELLER_THAW 15 -#define CANCELLER_POWDER_MOVE 16 -#define CANCELLER_POWDER_STATUS 17 -#define CANCELLER_THROAT_CHOP 18 -#define CANCELLER_PRANKSTER 19 -#define CANCELLER_END 20 -#define CANCELLER_PSYCHIC_TERRAIN 21 -#define CANCELLER_END2 22 - #define WEATHER_HAS_EFFECT ((!IsAbilityOnField(ABILITY_CLOUD_NINE) && !IsAbilityOnField(ABILITY_AIR_LOCK))) #define IS_WHOLE_SIDE_ALIVE(battler)((IsBattlerAlive(battler) && IsBattlerAlive(BATTLE_PARTNER(battler)))) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 8bd082529..32a87b53e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5158,7 +5158,7 @@ static void Cmd_moveend(void) MoveValuesCleanUp(); gBattleScripting.moveEffect = gBattleScripting.savedMoveEffect; BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); - gBattleStruct->atkCancellerTracker = CANCELLER_PRANKSTER; // Run Prankster canceller on next target, skip the earlier ones + gBattleStruct->atkCancellerTracker = 0; // Run all cancellers on next target gBattlescriptCurrInstr = BattleScript_FlushMessageBox; return; } diff --git a/src/battle_util.c b/src/battle_util.c index 1177c316e..18a1bfb47 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3102,6 +3102,33 @@ void TryClearRageAndFuryCutter(void) } } +enum +{ + CANCELLER_FLAGS, + CANCELLER_ASLEEP, + CANCELLER_FROZEN, + CANCELLER_TRUANT, + CANCELLER_RECHARGE, + CANCELLER_FLINCH, + CANCELLER_DISABLED, + CANCELLER_GRAVITY, + CANCELLER_HEAL_BLOCKED, + CANCELLER_TAUNTED, + CANCELLER_IMPRISONED, + CANCELLER_CONFUSED, + CANCELLER_PARALYSED, + CANCELLER_IN_LOVE, + CANCELLER_BIDE, + CANCELLER_THAW, + CANCELLER_POWDER_MOVE, + CANCELLER_POWDER_STATUS, + CANCELLER_THROAT_CHOP, + CANCELLER_PRANKSTER, + CANCELLER_END, + CANCELLER_PSYCHIC_TERRAIN, + CANCELLER_END2, +}; + u8 AtkCanceller_UnableToUseMove(void) { u8 effect = 0; From 2dea4f6782b78978ed3bd1f070fb8e64c8c95dc7 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 19 Oct 2021 07:23:02 -0300 Subject: [PATCH 108/193] Forgot to port over a return for jumpifcantreverttoprimal --- src/battle_script_commands.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index dcd9c8999..b5698b51b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8880,6 +8880,7 @@ static void Cmd_various(void) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); else gBattlescriptCurrInstr += 7; + return; } } From da70accc3e0ee78ec11db20b24e58c697bf08a3b Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 19 Oct 2021 08:02:36 -0300 Subject: [PATCH 109/193] Oopsie --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 82a6bba63..399c5469a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8953,7 +8953,6 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 4; return; - } case VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL: { bool8 canDoPrimalReversion = FALSE; @@ -8970,6 +8969,7 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; return; } + } gBattlescriptCurrInstr += 3; } From 150dd7c6339d6bb8e14ebb2792e49efd0d9c64b4 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Tue, 19 Oct 2021 22:39:07 +1100 Subject: [PATCH 110/193] Add damage information to the debug menus --- include/battle.h | 1 + src/battle_ai_main.c | 8 ++++++-- src/battle_debug.c | 8 +++++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/include/battle.h b/include/battle.h index 26c6b3e40..2ceced61c 100644 --- a/include/battle.h +++ b/include/battle.h @@ -596,6 +596,7 @@ struct BattleStruct bool8 spriteIgnore0Hp; struct Illusion illusion[MAX_BATTLERS_COUNT]; s8 aiFinalScore[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // AI, target, moves to make debugging easier + s32 aiSimulatedDamage[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // attacker, target, move to make debugging easier u8 soulheartBattlerId; u8 friskedBattler; // Frisk needs to identify 2 battlers in double battles. bool8 friskedAbility; // If identifies two mons, show the ability pop-up only once. diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index c5ed7d9a3..ecea5b2ca 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -266,8 +266,10 @@ static u8 ChooseMoveOrAction_Singles(void) AI_THINKING_STRUCT->movesetIndex = 0; } - for (i = 0; i < MAX_MON_MOVES; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { gBattleStruct->aiFinalScore[sBattler_AI][gBattlerTarget][i] = AI_THINKING_STRUCT->score[i]; + gBattleStruct->aiSimulatedDamage[sBattler_AI][gBattlerTarget][i] = AI_THINKING_STRUCT->simulatedDmg[sBattler_AI][gBattlerTarget][i]; + } // Check special AI actions. if (AI_THINKING_STRUCT->aiAction & AI_ACTION_FLEE) @@ -432,8 +434,10 @@ static u8 ChooseMoveOrAction_Doubles(void) } } - for (j = 0; j < MAX_MON_MOVES; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { gBattleStruct->aiFinalScore[sBattler_AI][gBattlerTarget][j] = AI_THINKING_STRUCT->score[j]; + gBattleStruct->aiSimulatedDamage[sBattler_AI][gBattlerTarget][i] = AI_THINKING_STRUCT->simulatedDmg[sBattler_AI][gBattlerTarget][i]; + } } } diff --git a/src/battle_debug.c b/src/battle_debug.c index ce5aa4a97..ff8920753 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -713,6 +713,12 @@ static void PutMovesPointsText(struct BattleDebugMenu *data) gBattleStruct->aiFinalScore[data->aiBattlerId][gSprites[data->aiIconSpriteIds[j]].data[0]][i], STR_CONV_MODE_RIGHT_ALIGN, 3); AddTextPrinterParameterized(data->aiMovesWindowId, 1, text, 83 + count * 54, i * 15, 0, NULL); + + ConvertIntToDecimalStringN(text, + gBattleStruct->aiSimulatedDamage[data->aiBattlerId][gSprites[data->aiIconSpriteIds[j]].data[0]][i], + STR_CONV_MODE_RIGHT_ALIGN, 3); + AddTextPrinterParameterized(data->aiMovesWindowId, 1, text, 110 + count * 54, i * 15, 0, NULL); + count++; } } @@ -780,7 +786,7 @@ static void Task_ShowAiPoints(u8 taskId) break; // Put text case 1: - winTemplate = CreateWindowTemplate(1, 0, 4, 27, 14, 15, 0x200); + winTemplate = CreateWindowTemplate(1, 0, 4, 30, 14, 15, 0x200); data->aiMovesWindowId = AddWindow(&winTemplate); PutWindowTilemap(data->aiMovesWindowId); PutMovesPointsText(data); From 055c1c47b7410d8d92085c4578dd60ab66ffd788 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Tue, 19 Oct 2021 23:00:04 +1100 Subject: [PATCH 111/193] Fix double battles damage scoring --- src/battle_ai_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index ecea5b2ca..b830507a1 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -436,7 +436,7 @@ static u8 ChooseMoveOrAction_Doubles(void) for (j = 0; j < MAX_MON_MOVES; j++) { gBattleStruct->aiFinalScore[sBattler_AI][gBattlerTarget][j] = AI_THINKING_STRUCT->score[j]; - gBattleStruct->aiSimulatedDamage[sBattler_AI][gBattlerTarget][i] = AI_THINKING_STRUCT->simulatedDmg[sBattler_AI][gBattlerTarget][i]; + gBattleStruct->aiSimulatedDamage[sBattler_AI][gBattlerTarget][j] = AI_THINKING_STRUCT->simulatedDmg[sBattler_AI][gBattlerTarget][j]; } } } From 4673ff30e47f3a08a3f7ad2418c36aad9a508014 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Tue, 19 Oct 2021 23:00:40 +1100 Subject: [PATCH 112/193] Allow the AI to see damage against it's partner --- src/battle_ai_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index b830507a1..a2d97f785 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -177,10 +177,10 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves) } sBattler_AI = gActiveBattler; - // Simulate dmg for all AI moves against all opposing targets + // Simulate dmg for all AI moves against all other targets for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) { - if (GET_BATTLER_SIDE2(sBattler_AI) == GET_BATTLER_SIDE2(gBattlerTarget)) + if (sBattler_AI == gBattlerTarget) continue; for (i = 0; i < MAX_MON_MOVES; i++) { From 6a16813ce8ca3887d02b329c869cd3f20c139431 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Tue, 19 Oct 2021 23:01:07 +1100 Subject: [PATCH 113/193] Rename menu option to be more appropriate to changed info --- src/battle_debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_debug.c b/src/battle_debug.c index ff8920753..ef78f13fd 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -228,7 +228,7 @@ static const u8 sText_InDoubles[] = _("In Doubles"); static const u8 sText_HpAware[] = _("HP aware"); static const u8 sText_Unknown[] = _("Unknown"); static const u8 sText_InLove[] = _("In Love"); -static const u8 sText_AIMovePts[] = _("AI Move Pts"); +static const u8 sText_AIMovePts[] = _("AI Pts/Dmg"); static const u8 sText_AiKnowledge[] = _("AI Info"); static const u8 sText_EffectOverride[] = _("Effect Override"); From a6315ffc75b2bd841817e16e139d21f63d05b146 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 17 Oct 2021 12:27:17 -0300 Subject: [PATCH 114/193] Implemented Plasma Fists --- asm/macros/battle_script.inc | 4 ++++ data/battle_scripts_1.s | 27 ++++++++++++++++++++++ include/constants/battle.h | 1 + include/constants/battle_move_effects.h | 3 ++- include/constants/battle_script_commands.h | 1 + src/battle_main.c | 4 ++++ src/battle_script_commands.c | 4 ++++ src/battle_util.c | 6 +++++ src/data/battle_moves.h | 2 +- 9 files changed, 50 insertions(+), 2 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 9a5c1d8ed..cceb83ac7 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1844,6 +1844,10 @@ various \battler, VARIOUS_TRY_ACTIVATE_BATTLE_BOND .endm + .macro applyplasmafists + various BS_ATTACKER, VARIOUS_APPLY_PLASMA_FISTS + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3d7dde94d..4d28d1394 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -389,6 +389,33 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectSappySeed @ EFFECT_SAPPY_SEED .4byte BattleScript_EffectFreezyFrost @ EFFECT_FREEZY_FROST .4byte BattleScript_EffectSparklySwirl @ EFFECT_SPARKLY_SWIRL + .4byte BattleScript_EffectPlasmaFists @ EFFECT_PLASMA_FISTS + +BattleScript_EffectPlasmaFists: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + critcalc + damagecalc + adjustdamage + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage B_WAIT_TIME_LONG + resultmessage + waitmessage B_WAIT_TIME_LONG + seteffectwithchance + tryfaintmon BS_TARGET, FALSE, NULL + applyplasmafists + printstring STRINGID_IONDELUGEON + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd BattleScript_EffectSparklySwirl: attackcanceler diff --git a/include/constants/battle.h b/include/constants/battle.h index 0682d3503..260e6153c 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -173,6 +173,7 @@ #define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER | STATUS3_PHANTOM_FORCE) #define STATUS4_ELECTRIFIED (1 << 0) +#define STATUS4_PLASMA_FISTS (1 << 1) #define HITMARKER_x10 (1 << 4) #define HITMARKER_x20 (1 << 5) diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 383e37559..f405c32c6 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -373,7 +373,8 @@ #define EFFECT_SAPPY_SEED 367 #define EFFECT_FREEZY_FROST 368 #define EFFECT_SPARKLY_SWIRL 369 +#define EFFECT_PLASMA_FISTS 370 -#define NUM_BATTLE_MOVE_EFFECTS 370 +#define NUM_BATTLE_MOVE_EFFECTS 371 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 829664e75..7590cfffb 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -190,6 +190,7 @@ #define VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED 117 #define VARIOUS_TRY_ACTIVATE_BATTLE_BOND 118 #define VARIOUS_CONSUME_BERRY 119 +#define VARIOUS_APPLY_PLASMA_FISTS 120 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_main.c b/src/battle_main.c index ec0ee5300..3a42d61f1 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5156,6 +5156,10 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) { gBattleStruct->dynamicMoveType = 0x80 | TYPE_WATER; } + else if (gStatuses4[battlerAtk] & STATUS4_PLASMA_FISTS && moveType == TYPE_NORMAL) + { + gBattleStruct->dynamicMoveType = 0x80 | TYPE_ELECTRIC; + } // Check if a gem should activate. GET_MOVE_TYPE(move, moveType); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ee3b39bcd..268509781 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8910,6 +8910,10 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 4; return; + case VARIOUS_APPLY_PLASMA_FISTS: + for (i = 0; i < gBattlersCount; i++) + gStatuses4[i] |= STATUS4_PLASMA_FISTS; + break; } gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index ea8fb75d1..c5ee5220a 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2379,6 +2379,7 @@ enum ENDTURN_POWDER, ENDTURN_THROAT_CHOP, ENDTURN_SLOW_START, + ENDTURN_PLASMA_FISTS, ENDTURN_BATTLER_COUNT }; @@ -2885,6 +2886,11 @@ u8 DoBattlerEndTurnEffects(void) } gBattleStruct->turnEffectsTracker++; break; + case ENDTURN_PLASMA_FISTS: + for (i = 0; i < gBattlersCount; i++) + gStatuses4[i] &= ~(STATUS4_PLASMA_FISTS); + gBattleStruct->turnEffectsTracker++; + break; case ENDTURN_BATTLER_COUNT: // done gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsBattlerId++; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 911ae0df2..b7d5dcad9 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -10435,7 +10435,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_PLASMA_FISTS] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_PLASMA_FISTS, .power = 100, .type = TYPE_ELECTRIC, .accuracy = 100, From ebc86bb247d33d0457ecd88998d662b91af1547e Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 19 Oct 2021 09:38:27 -0400 Subject: [PATCH 115/193] update baton pass status3 bits --- src/battle_main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index ec0ee5300..faac3806c 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2960,9 +2960,11 @@ void SwitchInClearSetData(void) } } if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) - { + { gBattleMons[gActiveBattler].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED); - gStatuses3[gActiveBattler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED); + gStatuses3[gActiveBattler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED + | STATUS3_GASTRO_ACID | STATUS3_EMBARGO | STATUS3_TELEKINESIS | STATUS3_MAGNET_RISE | STATUS3_HEAL_BLOCK + | STATUS3_AQUA_RING | STATUS3_POWER_TRICK); for (i = 0; i < gBattlersCount; i++) { From fa8fa322591c54b9319d1a30ebb897456336ad44 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Tue, 19 Oct 2021 11:52:50 -0400 Subject: [PATCH 116/193] Update src/battle_main.c Co-authored-by: LOuroboros --- src/battle_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_main.c b/src/battle_main.c index faac3806c..271db092f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2960,7 +2960,7 @@ void SwitchInClearSetData(void) } } if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) - { + { gBattleMons[gActiveBattler].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED); gStatuses3[gActiveBattler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_GASTRO_ACID | STATUS3_EMBARGO | STATUS3_TELEKINESIS | STATUS3_MAGNET_RISE | STATUS3_HEAL_BLOCK From 34fe0c54be04d1ecb98e7573859ea69e7761f147 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 21 Oct 2021 08:50:04 -0300 Subject: [PATCH 117/193] Fixed Retaliate timer's value decrease I made an oopsie, basically. Thanks to Xavion#9504 for the fix. --- src/battle_util.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index ea8fb75d1..7215706c6 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2331,9 +2331,10 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_RETALIATE: - gActiveBattler = gBattlerByTurnOrder[gBattleStruct->turnSideTracker]; - if (gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].retaliateTimer > 0) - gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].retaliateTimer--; + if (gSideTimers[0].retaliateTimer > 0) + gSideTimers[0].retaliateTimer--; + if (gSideTimers[1].retaliateTimer > 0) + gSideTimers[1].retaliateTimer--; gBattleStruct->turnCountersTracker++; break; case ENDTURN_FIELD_COUNT: From dd82e051bd16ba8dfd5fabf6381c31ef66923180 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 22 Oct 2021 06:48:24 -0300 Subject: [PATCH 118/193] Fixed Rapid Spin raising Speed even when the move fails --- data/battle_scripts_1.s | 1 + 1 file changed, 1 insertion(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3d7dde94d..47a564077 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4258,6 +4258,7 @@ BattleScript_EffectRapidSpin:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce + jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd critcalc damagecalc adjustdamage From 24876ac5e32a3944eb5d5577ccfc4d02a734ba2a Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 22 Oct 2021 07:21:31 -0300 Subject: [PATCH 119/193] Small tweak for BattleScript_EffectRapidSpin --- data/battle_scripts_1.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 47a564077..215727100 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4288,8 +4288,8 @@ BattleScript_EffectRapidSpinEnd:: end .else setmoveeffect MOVE_EFFECT_RAPIDSPIN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN -.endif goto BattleScript_EffectHit +.endif BattleScript_EffectSonicboom:: attackcanceler From cf027176a8ee39fc97595d84ab69db64be51396e Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 22 Oct 2021 11:43:38 -0300 Subject: [PATCH 120/193] Made ENDTURN_RETALIATE use constants --- src/battle_util.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 7215706c6..46f9cd775 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2331,10 +2331,10 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_RETALIATE: - if (gSideTimers[0].retaliateTimer > 0) - gSideTimers[0].retaliateTimer--; - if (gSideTimers[1].retaliateTimer > 0) - gSideTimers[1].retaliateTimer--; + if (gSideTimers[B_SIDE_PLAYER].retaliateTimer > 0) + gSideTimers[B_SIDE_PLAYER].retaliateTimer--; + if (gSideTimers[B_SIDE_OPPONENT].retaliateTimer > 0) + gSideTimers[B_SIDE_OPPONENT].retaliateTimer--; gBattleStruct->turnCountersTracker++; break; case ENDTURN_FIELD_COUNT: From 4c90cbe625f926ac7551ba5c3236b48dd9f2c55c Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 22 Oct 2021 19:58:27 -0300 Subject: [PATCH 121/193] Repositioned the gMoveResultFlags check --- data/battle_scripts_1.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 215727100..0748e0a5b 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4258,7 +4258,6 @@ BattleScript_EffectRapidSpin:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd critcalc damagecalc adjustdamage @@ -4273,6 +4272,7 @@ BattleScript_EffectRapidSpin:: waitmessage B_WAIT_TIME_LONG resultmessage waitmessage B_WAIT_TIME_LONG + jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd setmoveeffect MOVE_EFFECT_RAPIDSPIN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN seteffectwithchance setstatchanger STAT_SPEED, 1, FALSE From 8bdcbb856d1b1208340657f19f48f51d142cebc1 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sat, 23 Oct 2021 11:41:31 -0300 Subject: [PATCH 122/193] Ghosts can now escape any wild battle --- src/battle_util.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index 33dd0f5de..733cf53f7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -621,6 +621,12 @@ bool8 TryRunFromBattle(u8 battler) gProtectStructs[battler].fleeFlag = 1; effect++; } + #if B_GHOSTS_ESCAPE >= GEN_6 + else if (IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) + { + effect++; + } + #endif else if (gBattleMons[battler].ability == ABILITY_RUN_AWAY) { if (InBattlePyramid()) From f4ff76c8ae08cb2fa5c1ba794f3eb7a9367cd4b8 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sat, 23 Oct 2021 11:42:33 -0300 Subject: [PATCH 123/193] MOVE_EFFECT_MEAN_LOOK now fails on ghost types. --- data/battle_scripts_1.s | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index bf65bb190..3dc41b982 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3977,6 +3977,9 @@ BattleScript_EffectMeanLook:: accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifstatus2 BS_TARGET, STATUS2_ESCAPE_PREVENTION, BattleScript_ButItFailed jumpifsubstituteblocks BattleScript_ButItFailed +.if B_GHOSTS_ESCAPE >= GEN_6 + jumpiftype BS_TARGET, TYPE_GHOST, BattleScript_ButItFailed +.endif attackanimation waitanimation setmoveeffect MOVE_EFFECT_PREVENT_ESCAPE From 0f95adf77a11c4130a08b743e38321b5f24ef6d9 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sat, 23 Oct 2021 11:56:56 -0300 Subject: [PATCH 124/193] Fixed AI check for Mean Look in case it's set to be GEN_5 or lower. --- src/battle_ai_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index a2d97f785..b8ed21e9d 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3335,7 +3335,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) case EFFECT_TRAP: case EFFECT_MEAN_LOOK: if (HasMoveEffect(battlerDef, EFFECT_RAPID_SPIN) - || IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST) + || (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST)) || gBattleMons[battlerDef].status2 & STATUS2_WRAPPED) { break; // in this case its a bad attacking move From 9a8b88bdb3573ea07c9b2f77196696e774285eac Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sat, 23 Oct 2021 11:59:57 -0300 Subject: [PATCH 125/193] Updated config description --- include/constants/battle_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 3aa9faea3..f368a12e3 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -130,7 +130,7 @@ #define B_ABILITY_WEATHER GEN_7 // In Gen6+, ability-induced weather lasts 5 turns. Before, it lasted until the battle ended or until it was changed by a move or a different weather-affecting ability. #define B_GALE_WINGS GEN_7 // In Gen7+ requires full HP to trigger. #define B_STANCE_CHANGE_FAIL GEN_7 // In Gen7+, Stance Change fails if the Pokémon is unable to use a move because of confusion, paralysis, etc. In Gen6, it doesn't. -#define B_GHOSTS_ESCAPE GEN_7 // In Gen6+, Ghost-type Pokémon can escape even when blocked by abilities such as Shadow Tag. +#define B_GHOSTS_ESCAPE GEN_7 // In Gen6+, Ghost-type Pokémon can escape even when trying to be blocked by abilities such as Shadow Tag or moves like Mean Look. They can also escape any Wild Battle. #define B_SHADOW_TAG_ESCAPE GEN_7 // In Gen4+, if both sides have a Pokémon with Shadow Tag, all battlers can escape. Before, neither side could escape this situation. #define B_MOODY_ACC_EVASION GEN_8 // In Gen8, Moody CANNOT raise Accuracy and Evasion anymore. #define B_FLASH_FIRE_FROZEN GEN_7 // In Gen5+, Flash Fire can trigger even when frozen, when it couldn't before. From 71ff66470053dcd1baebae57798734e8cf845c8a Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sat, 23 Oct 2021 20:11:02 -0300 Subject: [PATCH 126/193] Ordered config into new categories --- include/constants/battle_config.h | 36 ++++++++++++++++++------------- src/battle_interface.c | 2 +- src/battle_script_commands.c | 2 +- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 4cf4c0eb5..28dd06dcf 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -104,6 +104,20 @@ #define B_MAX_LEVEL_EV_GAINS GEN_7 // In Gen5+, Lv100 Pokémon can obtain Effort Values normally. #define B_RECALCULATE_STATS GEN_7 // In Gen5+, the stats of the Pokémon who participate in battle are recalculated at the end of each battle. +// Type settings +#define B_GHOSTS_ESCAPE GEN_7 // In Gen6+, Ghost-type Pokémon can escape even when blocked by abilities such as Shadow Tag. +#define B_PARALYZE_ELECTRIC GEN_7 // In Gen6+, Electric-type Pokémon can't be paralyzed. +#define B_POWDER_GRASS GEN_7 // In Gen6+, Grass-type Pokémon are immune to powder and spore moves. +#define B_STEEL_RESISTANCES GEN_7 // In Gen6+, Steel-type Pokémon are no longer resistant to Dark-type and Ghost-type moves. +#define B_PRANKSTER_DARK_TYPES GEN_7 // In Gen7+, Prankster-elevated status moves do not affect Dark type Pokémon. + +// Turn count settings +#define B_BINDING_TURNS GEN_7 // In Gen5+, binding moves last for 4-5 turns instead of 2-5 turns. (With Grip Claw, 7 and 5 turns respectively.) +#define B_UPROAR_TURNS GEN_7 // In Gen5+, Uproar lasts for 3 turns instead of 2-5 turns. +#define B_DISABLE_TURNS GEN_7 // Disable's turns. See Cmd_disablelastusedattack. +#define B_TAILWIND_TURNS GEN_7 // In Gen5+, Tailwind lasts 4 turns instead of 3. +#define B_SLEEP_TURNS GEN_7 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. + // Move data settings #define B_UPDATED_MOVE_DATA GEN_8 // Updates move data in gBattleMoves, including Power, Accuracy, PP, stat changes, targets, chances of secondary effects, etc. #define B_PHYSICAL_SPECIAL_SPLIT GEN_7 // In Gen3, the move's type determines if it will do physical or special damage. The split icon in the summary will reflect this. @@ -111,35 +125,31 @@ #define B_KINGS_SHIELD_LOWER_ATK GEN_7 // In Gen7+, it lowers Atk by 1 stage instead of 2 of oponents that hit it. #define B_SPEED_BUFFING_RAPID_SPIN GEN_8 // In Gen8, Rapid Spin raises the user's Speed by 1 stage. +// Move accuracy settings +#define B_TOXIC_NEVER_MISS GEN_7 // In Gen6+, if Toxic is used by a Poison-type Pokémon, it will never miss. +#define B_MINIMIZE_DMG_ACC GEN_7 // In Gen6+, moves that causes double damage to minimized Pokémon will also skip accuracy checks. +#define B_BLIZZARD_HAIL GEN_7 // In Gen4+, Blizzard bypasses accuracy checks if it's hailing. + // Other move settings #define B_SOUND_SUBSTITUTE GEN_7 // In Gen6+, sound moves bypass Substitute. -#define B_TOXIC_NEVER_MISS GEN_7 // In Gen6+, if Toxic is used by a Poison-type Pokémon, it will never miss. #define B_PAYBACK_SWITCH_BOOST GEN_7 // In Gen5+, if the opponent switches out, Payback's damage will no longer be doubled. -#define B_BINDING_TURNS GEN_7 // In Gen5+, binding moves last for 4-5 turns instead of 2-5 turns. (With Grip Claw, 7 and 5 turns respectively.) -#define B_UPROAR_TURNS GEN_7 // In Gen5+, Uproar lasts for 3 turns instead of 2-5 turns. -#define B_DISABLE_TURNS GEN_7 // Disable's turns. See Cmd_disablelastusedattack. #define B_INCINERATE_GEMS GEN_7 // In Gen6+, Incinerate can destroy Gems. -#define B_MINIMIZE_DMG_ACC GEN_7 // In Gen6+, moves that causes double damage to minimized Pokémon will also skip accuracy checks. #define B_PP_REDUCED_BY_SPITE GEN_7 // In Gen4+, Spite reduces the foe's last move's PP by 4, instead of 2 to 5. #define B_CAN_SPITE_FAIL GEN_7 // In Gen4+, Spite can no longer fail if the foe's last move only has 1 remaining PP. #define B_CRASH_IF_TARGET_IMMUNE GEN_7 // In Gen4+, The user of Jump Kick or High Jump Kick will "keep going and crash" if it attacks a target that is immune to the move. -#define B_TAILWIND_TIMER GEN_7 // In Gen5+, Tailwind lasts 4 turns instead of 3. #define B_MEMENTO_FAIL GEN_7 // In Gen4+, Memento fails if there is no target or if the target is protected or behind substitute. But not if Atk/Sp. Atk are at -6. #define B_HIDDEN_POWER_DMG GEN_7 // In Gen6+, Hidden Power's base power was set to always be 60. Before, it was determined by the mon's IVs. #define B_GLARE_GHOST GEN_7 // In Gen4+, Glare can hit Ghost-type Pokémon normally. -#define B_BLIZZARD_HAIL GEN_7 // In Gen4+, Blizzard bypasses accuracy checks if it's hailing. // Ability settings #define B_ABILITY_WEATHER GEN_7 // In Gen6+, ability-induced weather lasts 5 turns. Before, it lasted until the battle ended or until it was changed by a move or a different weather-affecting ability. #define B_GALE_WINGS GEN_7 // In Gen7+ requires full HP to trigger. #define B_STANCE_CHANGE_FAIL GEN_7 // In Gen7+, Stance Change fails if the Pokémon is unable to use a move because of confusion, paralysis, etc. In Gen6, it doesn't. -#define B_GHOSTS_ESCAPE GEN_7 // In Gen6+, Ghost-type Pokémon can escape even when blocked by abilities such as Shadow Tag. #define B_SHADOW_TAG_ESCAPE GEN_7 // In Gen4+, if both sides have a Pokémon with Shadow Tag, all battlers can escape. Before, neither side could escape this situation. #define B_MOODY_ACC_EVASION GEN_8 // In Gen8, Moody CANNOT raise Accuracy and Evasion anymore. #define B_FLASH_FIRE_FROZEN GEN_7 // In Gen5+, Flash Fire can trigger even when frozen, when it couldn't before. #define B_SYNCHRONIZE_NATURE GEN_8 // In Gen8, if the Pokémon with Synchronize is leading the party, it's 100% guaranteed that wild Pokémon will have the same ability, as opposed to 50% previously. #define B_UPDATED_INTIMIDATE GEN_8 // In Gen8, Intimidate doesn't work on opponents with the Inner Focus, Scrappy, Own Tempo or Oblivious abilities. -#define B_PRANKSTER_DARK_TYPES GEN_7 // In Gen7+, Prankster-elevated status moves do not affect Dark type Pokémon. // Item settings #define B_HP_BERRIES GEN_7 // In Gen4+, berries which restore hp activate immediately after HP drops to half. In Gen3, the effect occurs at the end of the turn. @@ -163,6 +173,8 @@ #define B_FAST_INTRO TRUE // If set to TRUE, battle intro texts print at the same time as animation of a Pokémon, as opposing to waiting for the animation to end. #define B_SHOW_TARGETS TRUE // If set to TRUE, all available targets, for moves hitting 2 or 3 Pokémon, will be shown before selecting a move. #define B_SHOW_SPLIT_ICON TRUE // If set to TRUE, it will show an icon in the summary showing the move's category split. +#define B_HIDE_HEALTHBOX_IN_ANIMS TRUE // If set to TRUE, hides healthboxes during move animations. +#define B_TERRAIN_BG_CHANGE TRUE // If set to TRUE, terrain moves permanently change the default battle background until the effect fades. // Critical Capture #define B_CRITICAL_CAPTURE TRUE // If set to TRUE, Critical Capture will be enabled. @@ -177,10 +189,6 @@ // Other #define B_DOUBLE_WILD_CHANCE 0 // % chance of encountering two Pokémon in a Wild Encounter. -#define B_SLEEP_TURNS GEN_7 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. -#define B_PARALYZE_ELECTRIC GEN_7 // In Gen6+, Electric-type Pokémon can't be paralyzed. -#define B_POWDER_GRASS GEN_7 // In Gen6+, Grass-type Pokémon are immune to powder and spore moves. -#define B_STEEL_RESISTANCES GEN_7 // In Gen6+, Steel-type Pokémon are no longer resistant to Dark-type and Ghost-type moves. #define B_THUNDERSTORM_TERRAIN TRUE // If TRUE, overworld Thunderstorm generates Rain and Electric Terrain as in Gen 8. #define B_SEMI_INVULNERABLE_CATCH GEN_7 // In Gen4+, you cannot throw a ball against a Pokemon that is in a semi-invulnerable state (dig/fly/etc) @@ -201,8 +209,6 @@ #define B_NEW_IMPACT_PALETTE FALSE // If set to TRUE, it updates the basic 'hit' palette. #define B_NEW_SURF_PARTICLE_PALETTE FALSE // If set to TRUE, it updates Surf's wave palette. -#define B_HIDE_HEALTHBOXES_DURING_ANIMS TRUE // If set to TRUE, hides healthboxes during move animations. -#define B_TERRAIN_BG_CHANGE TRUE // If set to TRUE, terrain moves permanently change the default battle background until the effect fades. #define B_ENABLE_DEBUG TRUE // If set to TRUE, enables a debug menu to use in battles by pressing the Select button. #endif // GUARD_CONSTANTS_BATTLE_CONFIG_H diff --git a/src/battle_interface.c b/src/battle_interface.c index 36353c1d8..1e9d9008c 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1040,7 +1040,7 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority, bool32 hideHPBoxes) if (indicatorSpriteId != 0xFF) gSprites[indicatorSpriteId].oam.priority = priority; - #if B_HIDE_HEALTHBOXES_DURING_ANIMS + #if B_HIDE_HEALTHBOX_IN_ANIMS if (hideHPBoxes && IsBattlerAlive(i)) TryToggleHealboxVisibility(priority, healthboxLeftSpriteId, healthboxRightSpriteId, healthbarSpriteId, indicatorSpriteId); #endif diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ac27d8c45..58c46d171 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10922,7 +10922,7 @@ static void Cmd_settailwind(void) { gSideStatuses[side] |= SIDE_STATUS_TAILWIND; gSideTimers[side].tailwindBattlerId = gBattlerAttacker; - gSideTimers[side].tailwindTimer = (B_TAILWIND_TIMER >= GEN_5) ? 4 : 3; + gSideTimers[side].tailwindTimer = (B_TAILWIND_TURNS >= GEN_5) ? 4 : 3; gBattlescriptCurrInstr += 5; } else From d64dc2bbe890f210d653fede84151bd37ca1bc98 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 24 Oct 2021 17:55:37 +1300 Subject: [PATCH 127/193] Sleep moves don't check target's type Dark types aren't immune to Hypnosis, Ghost types aren't immune to Yawn or Lovely Kiss, so this check isn't needed. --- src/battle_ai_util.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index fef6e6c6f..0c3bf717a 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2606,7 +2606,6 @@ bool32 AI_CanSleep(u8 battler, u16 ability) bool32 AI_CanPutToSleep(u8 battlerAtk, u8 battlerDef, u16 defAbility, u16 move, u16 partnerMove) { if (!AI_CanSleep(battlerDef, defAbility) - || AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0 || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || PartnerMoveEffectIsStatusSameTarget(BATTLE_PARTNER(battlerAtk), battlerDef, partnerMove)) // shouldn't try to sleep mon that partner is trying to make sleep return FALSE; From bbe2eccf62c210926739a324d4d001dd1e7bbcda Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 24 Oct 2021 17:57:06 +1300 Subject: [PATCH 128/193] Fix typo CanBeParayzed to CanBeParalyzed --- src/battle_ai_util.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 0c3bf717a..dc2be7fd5 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2653,7 +2653,7 @@ bool32 AI_CanPoison(u8 battlerAtk, u8 battlerDef, u16 defAbility, u16 move, u16 return TRUE; } -static bool32 CanBeParayzed(u8 battler, u16 ability) +static bool32 CanBeParalyzed(u8 battler, u16 ability) { if (ability == ABILITY_LIMBER || IS_BATTLER_OF_TYPE(battler, TYPE_ELECTRIC) @@ -2665,7 +2665,7 @@ static bool32 CanBeParayzed(u8 battler, u16 ability) bool32 AI_CanParalyze(u8 battlerAtk, u8 battlerDef, u16 defAbility, u16 move, u16 partnerMove) { - if (!CanBeParayzed(battlerDef, defAbility) + if (!CanBeParalyzed(battlerDef, defAbility) || AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0 || gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) From 4310868bee6d4ddb0f8a238ef1d003896a79b7d7 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 24 Oct 2021 18:49:17 +1300 Subject: [PATCH 129/193] AI handles multi-strike and fixed dmg moves Does not account for Parental Bond or Beat Up yet as those require some functions from #1676. --- include/battle_util.h | 5 ++- src/battle_ai_util.c | 90 +++++++++++++++++++++++++++++++++++++++---- src/battle_util.c | 26 +++++++++++++ 3 files changed, 113 insertions(+), 8 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index ee7337ef2..5ffc901c3 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -156,7 +156,7 @@ void BufferStatChange(u8 battlerId, u8 statId, u8 stringId); void DoBurmyFormChange(u32 monId); bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef, bool32 checkTarget); -// ability checks +// Ability checks bool32 IsRolePlayBannedAbilityAtk(u16 ability); bool32 IsRolePlayBannedAbility(u16 ability); bool32 IsSkillSwapBannedAbility(u16 ability); @@ -173,4 +173,7 @@ bool32 CanBeFrozen(u8 battlerId); bool32 CanBeConfused(u8 battlerId); bool32 IsBattlerTerrainAffected(u8 battlerId, u32 terrainFlag); +// Move checks +bool8 IsTwoStrikesMove(u16 move); + #endif // GUARD_BATTLE_UTIL_H diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index dc2be7fd5..cf9980ee4 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -733,20 +733,85 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) else dmg = (critDmg + normalDmg * (critChance - 1)) / critChance; - // handle dynamic move damage + // Handle dynamic move damage switch (gBattleMoves[move].effect) { case EFFECT_LEVEL_DAMAGE: case EFFECT_PSYWAVE: - //psywave's expected damage is equal to the user's level - dmg = gBattleMons[battlerAtk].level; + { + // Psywave's expected damage is equal to the user's level + if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) + dmg = 0; + else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) + dmg = 2 * gBattleMons[battlerAtk].level; + else + dmg = gBattleMons[battlerAtk].level; break; + } case EFFECT_DRAGON_RAGE: - dmg = 40; + { + if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) + dmg = 0; + else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) + dmg = 80; + else + dmg = 40; break; + } case EFFECT_SONICBOOM: - dmg = 20; + { + if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) + dmg = 0; + else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) + dmg = 40; + else + dmg = 20; break; + } + case EFFECT_MULTI_HIT: + { + if (AI_DATA->atkAbility == ABILITY_SKILL_LINK) + dmg *= 5; + else + dmg *= 3; // Average number of hits is three + break; + } + case EFFECT_TRIPLE_KICK: + { + if (AI_DATA->atkAbility == ABILITY_SKILL_LINK) + dmg *= 6; // Skill Link ensures the 2nd and 3rd hits will connect if the first does + else + dmg *= 5; // Triple Kick/Triple Axel's average power is almost 5x its base power + break; + } + case EFFECT_ENDEAVOR: + { + if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) + dmg = 0; + else + // If target has less HP than user, Endeavor does no damage + dmg = max(0, gBattleMons[battlerDef].hp - gBattleMons[battlerAtk].hp); + break; + } + case EFFECT_SUPER_FANG: + { + if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) + dmg = 0; + // Two hits of Super Fang halves HP twice, leaving target with 25% HP + else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) + dmg = gBattleMons[battlerDef].hp * 3 / 4; + else + dmg = gBattleMons[battlerDef].hp / 2; + break; + } + case EFFECT_FINAL_GAMBIT: + { + if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) + dmg = 0; + else + dmg = gBattleMons[battlerAtk].hp; + break; + } //case EFFECT_METAL_BURST: //case EFFECT_COUNTER: default: @@ -755,6 +820,17 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) break; } + // Handle other multi-strike moves + if (IsTwoStrikesMove(move)) + { + dmg *= 2; + } + else if (move == MOVE_SURGING_STRIKES + || (move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH)) + { + dmg *= 3; + } + RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); @@ -2653,7 +2729,7 @@ bool32 AI_CanPoison(u8 battlerAtk, u8 battlerDef, u16 defAbility, u16 move, u16 return TRUE; } -static bool32 CanBeParalyzed(u8 battler, u16 ability) +static bool32 AI_CanBeParalyzed(u8 battler, u16 ability) { if (ability == ABILITY_LIMBER || IS_BATTLER_OF_TYPE(battler, TYPE_ELECTRIC) @@ -2665,7 +2741,7 @@ static bool32 CanBeParalyzed(u8 battler, u16 ability) bool32 AI_CanParalyze(u8 battlerAtk, u8 battlerDef, u16 defAbility, u16 move, u16 partnerMove) { - if (!CanBeParalyzed(battlerDef, defAbility) + if (!AI_CanBeParalyzed(battlerDef, defAbility) || AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0 || gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) diff --git a/src/battle_util.c b/src/battle_util.c index 33dd0f5de..cc9e2fc16 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -217,6 +217,20 @@ static const u16 sEntrainmentTargetSimpleBeamBannedAbilities[] = ABILITY_GULP_MISSILE, }; +static const u16 sTwoStrikeMoves[] = +{ + MOVE_BONEMERANG, + MOVE_DOUBLE_HIT, + MOVE_DOUBLE_IRON_BASH, + MOVE_DOUBLE_KICK, + MOVE_DRAGON_DARTS, + MOVE_DUAL_CHOP, + MOVE_DUAL_WINGBEAT, + MOVE_GEAR_GRIND, + MOVE_TWINEEDLE, + 0xFFFF +}; + bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move) { u32 ability = GetBattlerAbility(battlerAtk); @@ -9509,3 +9523,15 @@ bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef, bool32 chec #endif return FALSE; } + +bool8 IsTwoStrikesMove(u16 move) +{ + u32 i; + + for (i = 0; i < ARRAY_COUNT(sTwoStrikeMoves); i++) + { + if (move == sTwoStrikeMoves[i]) + return TRUE; + } + return FALSE; +} From 8699db942b55674e48aeacdbd90fb2bb56d5acdd Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sun, 24 Oct 2021 20:03:21 -0300 Subject: [PATCH 130/193] More ordering --- include/constants/battle_config.h | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 28dd06dcf..80bf55920 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -88,22 +88,27 @@ // Calculation settings #define B_CRIT_CHANCE GEN_7 // Chances of a critical hit landing. See CalcCritChanceStage. #define B_CRIT_MULTIPLIER GEN_7 // In Gen6+, critical hits multiply damage by 1.5 instead of 2. +#define B_PARALYSIS_SPEED GEN_7 // In Gen7+, Speed is decreased by 50% instead of 75%. +#define B_TERRAIN_TYPE_BOOST GEN_8 // In Gen8, damage is boosted by 30% instead of 50%. +#define B_CONFUSION_SELF_DMG_CHANCE GEN_7 // In Gen7+, confusion has a 33.3% of self-damage, instead of 50%. +#define B_MULTI_HIT_CHANCE GEN_7 // In Gen5+, multi-hit moves have different %. See Cmd_setmultihitcounter for values. + +// Exp and stat settings #define B_EXP_CATCH GEN_7 // In Gen6+, Pokémon get experience from catching. #define B_TRAINER_EXP_MULTIPLIER GEN_7 // In Gen7+, trainer battles no longer give a 1.5 multiplier to EXP gain. #define B_SPLIT_EXP GEN_7 // In Gen6+, all participating mon get full experience. #define B_SCALED_EXP GEN_7 // In Gen5 and Gen7+, experience is weighted by level difference. -#define B_BURN_DAMAGE GEN_7 // In Gen7+, burn damage is 1/16th of max HP instead of 1/8th. -#define B_PARALYSIS_SPEED GEN_7 // In Gen7+, Speed is decreased by 50% instead of 75%. -#define B_TERRAIN_TYPE_BOOST GEN_8 // In Gen8, damage is boosted by 30% instead of 50%. -#define B_BINDING_DAMAGE GEN_7 // In Gen6+, binding damage is 1/8 of max HP instead of 1/16. (With Binding Band, 1/6 and 1/8 respectively.) -#define B_CONFUSION_SELF_DMG_CHANCE GEN_7 // In Gen7+, confusion has a 33.3% of self-damage, instead of 50%. -#define B_MULTI_HIT_CHANCE GEN_7 // In Gen5+, multi-hit moves have different %. See Cmd_setmultihitcounter for values. -#define B_RECOIL_IF_MISS_DMG GEN_7 // In Gen5+, Jump Kick and High Jump Kick will always do half of the user's max HP when missing. -#define B_PSYWAVE_DMG GEN_7 // Psywave's damage formula. See Cmd_psywavedamageeffect. #define B_BADGE_BOOST GEN_7 // In Gen4+, Gym Badges no longer boost a Pokémon's stats. #define B_MAX_LEVEL_EV_GAINS GEN_7 // In Gen5+, Lv100 Pokémon can obtain Effort Values normally. #define B_RECALCULATE_STATS GEN_7 // In Gen5+, the stats of the Pokémon who participate in battle are recalculated at the end of each battle. +// Damage settings +#define B_BURN_DAMAGE GEN_7 // In Gen7+, burn damage is 1/16th of max HP instead of 1/8th. +#define B_BINDING_DAMAGE GEN_7 // In Gen6+, binding damage is 1/8 of max HP instead of 1/16. (With Binding Band, 1/6 and 1/8 respectively.) +#define B_PSYWAVE_DMG GEN_7 // Psywave's damage formula. See Cmd_psywavedamageeffect. +#define B_PAYBACK_SWITCH_BOOST GEN_7 // In Gen5+, if the opponent switches out, Payback's damage will no longer be doubled. +#define B_HIDDEN_POWER_DMG GEN_7 // In Gen6+, Hidden Power's base power was set to always be 60. Before, it was determined by the mon's IVs. + // Type settings #define B_GHOSTS_ESCAPE GEN_7 // In Gen6+, Ghost-type Pokémon can escape even when blocked by abilities such as Shadow Tag. #define B_PARALYZE_ELECTRIC GEN_7 // In Gen6+, Electric-type Pokémon can't be paralyzed. @@ -124,6 +129,7 @@ #define B_FELL_STINGER_STAT_RAISE GEN_7 // In Gen7+, it raises Atk by 3 stages instead of 2 if it causes the target to faint. #define B_KINGS_SHIELD_LOWER_ATK GEN_7 // In Gen7+, it lowers Atk by 1 stage instead of 2 of oponents that hit it. #define B_SPEED_BUFFING_RAPID_SPIN GEN_8 // In Gen8, Rapid Spin raises the user's Speed by 1 stage. +#define B_RECOIL_IF_MISS_DMG GEN_7 // In Gen5+, Jump Kick and High Jump Kick will always do half of the user's max HP when missing. // Move accuracy settings #define B_TOXIC_NEVER_MISS GEN_7 // In Gen6+, if Toxic is used by a Poison-type Pokémon, it will never miss. @@ -132,13 +138,11 @@ // Other move settings #define B_SOUND_SUBSTITUTE GEN_7 // In Gen6+, sound moves bypass Substitute. -#define B_PAYBACK_SWITCH_BOOST GEN_7 // In Gen5+, if the opponent switches out, Payback's damage will no longer be doubled. #define B_INCINERATE_GEMS GEN_7 // In Gen6+, Incinerate can destroy Gems. #define B_PP_REDUCED_BY_SPITE GEN_7 // In Gen4+, Spite reduces the foe's last move's PP by 4, instead of 2 to 5. #define B_CAN_SPITE_FAIL GEN_7 // In Gen4+, Spite can no longer fail if the foe's last move only has 1 remaining PP. #define B_CRASH_IF_TARGET_IMMUNE GEN_7 // In Gen4+, The user of Jump Kick or High Jump Kick will "keep going and crash" if it attacks a target that is immune to the move. #define B_MEMENTO_FAIL GEN_7 // In Gen4+, Memento fails if there is no target or if the target is protected or behind substitute. But not if Atk/Sp. Atk are at -6. -#define B_HIDDEN_POWER_DMG GEN_7 // In Gen6+, Hidden Power's base power was set to always be 60. Before, it was determined by the mon's IVs. #define B_GLARE_GHOST GEN_7 // In Gen4+, Glare can hit Ghost-type Pokémon normally. // Ability settings @@ -156,6 +160,7 @@ #define B_BERRIES_INSTANT GEN_7 // In Gen4+, most berries activate on battle start/switch-in if applicable. In Gen3, they only activate either at the move end or turn end. #define B_X_ITEMS_BUFF GEN_7 // In Gen7+, the X Items raise a stat by 2 stages instead of 1. #define B_MENTAL_HERB GEN_5 // In Gen5+, the Mental Herb cures Infatuation, Taunt, Encore, Torment, Heal Block, and Disable +#define B_TRAINERS_KNOCK_OFF_ITEMS TRUE // If TRUE, trainers can steal/swap your items (non-berries are restored after battle). In vanilla games trainers cannot steal items. // Flag settings // To use the following features in scripting, replace the 0s with the flag ID you're assigning it to. @@ -180,9 +185,6 @@ #define B_CRITICAL_CAPTURE TRUE // If set to TRUE, Critical Capture will be enabled. #define B_CATCHING_CHARM_BOOST 20 // % boost in Critical Capture odds if player has the Catching Charm. -// Item Theft Settings -#define B_TRAINERS_KNOCK_OFF_ITEMS TRUE // If TRUE, trainers can steal/swap your items (non-berries are restored after battle). In vanilla games trainers cannot steal items. - // Last Used Ball #define B_LAST_USED_BALL TRUE // If TRUE, the "last used ball" feature from Gen 7 will be implemented #define B_LAST_USED_BALL_BUTTON R_BUTTON // If last used ball is implemented, this button (or button combo) will trigger throwing the last used ball. From 70aeaf288feb48ec2e6ef731f86ba7c8157b3cf9 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sun, 24 Oct 2021 20:07:22 -0300 Subject: [PATCH 131/193] Rough Skin damage config --- include/constants/battle_config.h | 1 + src/battle_util.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 80bf55920..0406d20a9 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -108,6 +108,7 @@ #define B_PSYWAVE_DMG GEN_7 // Psywave's damage formula. See Cmd_psywavedamageeffect. #define B_PAYBACK_SWITCH_BOOST GEN_7 // In Gen5+, if the opponent switches out, Payback's damage will no longer be doubled. #define B_HIDDEN_POWER_DMG GEN_7 // In Gen6+, Hidden Power's base power was set to always be 60. Before, it was determined by the mon's IVs. +#define B_ROUGH_SKIN_DMG GEN_7 // In Gen4+, Rough Skin contact damage is 1/8th of max HP instead of 1/16th. This will also affect Iron Barbs. // Type settings #define B_GHOSTS_ESCAPE GEN_7 // In Gen6+, Ghost-type Pokémon can escape even when blocked by abilities such as Shadow Tag. diff --git a/src/battle_util.c b/src/battle_util.c index 33dd0f5de..9515a1f32 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4884,7 +4884,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move && TARGET_TURN_DAMAGED && IsMoveMakingContact(move, gBattlerAttacker)) { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; + #if B_ROUGH_SKIN_DMG >= GEN_4 + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; + #else + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; + #endif if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); From 44625561e5b06a5d9111a6c1e215cfdb48437b74 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sun, 24 Oct 2021 20:21:54 -0300 Subject: [PATCH 132/193] Taunt turn config --- include/constants/battle_config.h | 1 + src/battle_script_commands.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 0406d20a9..02f873659 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -123,6 +123,7 @@ #define B_DISABLE_TURNS GEN_7 // Disable's turns. See Cmd_disablelastusedattack. #define B_TAILWIND_TURNS GEN_7 // In Gen5+, Tailwind lasts 4 turns instead of 3. #define B_SLEEP_TURNS GEN_7 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. +#define B_TAUNT_TURNS GEN_7 // In Gen5+, Taunt lasts 3 turns if the user acts before the target, or 4 turns if the target acted before the user. In Gen3, taunt lasts 2 turns and in Gen 4, 3-5 turns. // Move data settings #define B_UPDATED_MOVE_DATA GEN_8 // Updates move data in gBattleMoves, including Power, Accuracy, PP, stat changes, targets, chances of secondary effects, etc. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 58c46d171..9a3f0bf01 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -11778,9 +11778,15 @@ static void Cmd_settaunt(void) } else if (gDisableStructs[gBattlerTarget].tauntTimer == 0) { - u8 turns = 4; - if (GetBattlerTurnOrderNum(gBattlerTarget) > GetBattlerTurnOrderNum(gBattlerAttacker)) - turns--; // If the target hasn't yet moved this turn, Taunt lasts for only three turns (source: Bulbapedia) + #if B_TAUNT_TURNS >= GEN_5 + u8 turns = 4; + if (GetBattlerTurnOrderNum(gBattlerTarget) > GetBattlerTurnOrderNum(gBattlerAttacker)) + turns--; // If the target hasn't yet moved this turn, Taunt lasts for only three turns (source: Bulbapedia) + #elif B_TAUNT_TURNS == GEN_4 + u8 turns = (Random() & 2) + 3; + #else + u8 turns = 2; + #endif gDisableStructs[gBattlerTarget].tauntTimer = gDisableStructs[gBattlerTarget].tauntTimer2 = turns; gBattlescriptCurrInstr += 5; From 442376e75b5b45d4049795563ff2c926dcafc372 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 25 Oct 2021 16:36:17 -0300 Subject: [PATCH 133/193] Replaced jumpifbyte with jumpifhalfword in a few BattleScripts --- data/battle_scripts_1.s | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0748e0a5b..d1e03b305 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3168,7 +3168,7 @@ BattleScript_EffectRecoilIfMiss:: accuracycheck BattleScript_MoveMissedDoDamage, ACC_CURR_MOVE .if B_CRASH_IF_TARGET_IMMUNE >= GEN_4 typecalc - jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveMissedDoDamage + jumpifhalfword CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveMissedDoDamage .endif goto BattleScript_HitFromAtkString BattleScript_MoveMissedDoDamage:: @@ -3179,7 +3179,7 @@ BattleScript_MoveMissedDoDamage:: resultmessage waitmessage B_WAIT_TIME_LONG .if B_CRASH_IF_TARGET_IMMUNE < GEN_4 - jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd + jumpifhalfword CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd .endif printstring STRINGID_PKMNCRASHED waitmessage B_WAIT_TIME_LONG @@ -3925,7 +3925,7 @@ BattleScript_TripleKickPrintStrings:: resultmessage waitmessage B_WAIT_TIME_LONG jumpifbyte CMP_EQUAL, sMULTIHIT_STRING + 4, 0, BattleScript_TripleKickEnd - jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_TripleKickEnd + jumpifhalfword CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_TripleKickEnd copyarray gBattleTextBuff1, sMULTIHIT_STRING, 6 printstring STRINGID_HITXTIMES waitmessage B_WAIT_TIME_LONG @@ -4272,7 +4272,7 @@ BattleScript_EffectRapidSpin:: waitmessage B_WAIT_TIME_LONG resultmessage waitmessage B_WAIT_TIME_LONG - jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd + jumpifhalfword CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd setmoveeffect MOVE_EFFECT_RAPIDSPIN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN seteffectwithchance setstatchanger STAT_SPEED, 1, FALSE From 4faa0776415f31b371bc44311799d1b758a8585c Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Tue, 26 Oct 2021 13:41:08 +1300 Subject: [PATCH 134/193] Triple Kick, Super Fang tweaks Ignore accuracy for Triple Kick and assume all hits will connect. Super Fang always does at least 1 damage, so this should be accounted for. --- src/battle_ai_util.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index cf9980ee4..3535e800c 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -778,10 +778,7 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) } case EFFECT_TRIPLE_KICK: { - if (AI_DATA->atkAbility == ABILITY_SKILL_LINK) - dmg *= 6; // Skill Link ensures the 2nd and 3rd hits will connect if the first does - else - dmg *= 5; // Triple Kick/Triple Axel's average power is almost 5x its base power + dmg *= 6; break; } case EFFECT_ENDEAVOR: @@ -799,9 +796,9 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) dmg = 0; // Two hits of Super Fang halves HP twice, leaving target with 25% HP else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) - dmg = gBattleMons[battlerDef].hp * 3 / 4; + dmg = max(1, gBattleMons[battlerDef].hp * 3 / 4); else - dmg = gBattleMons[battlerDef].hp / 2; + dmg = max(1, gBattleMons[battlerDef].hp / 2); break; } case EFFECT_FINAL_GAMBIT: From d4eaa73292dcae415bf21648f2a313cdd71fa4ae Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Tue, 26 Oct 2021 20:45:59 -0300 Subject: [PATCH 135/193] Added check in IsRunningFromBattleImpossible. --- src/battle_main.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/battle_main.c b/src/battle_main.c index dddd3cc79..271e97731 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3705,6 +3705,10 @@ u8 IsRunningFromBattleImpossible(void) if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN) return 0; + #if B_GHOSTS_ESCAPE >= GEN_6 + if (IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_GHOST)) + return 0; + #endif if (gBattleTypeFlags & BATTLE_TYPE_LINK) return 0; if (GetBattlerAbility(gActiveBattler) == ABILITY_RUN_AWAY) From 28522f3ffb46350e9b12c884995d1402b670aec6 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 28 Oct 2021 10:39:52 -0300 Subject: [PATCH 136/193] Fixed Hyperspace Fury not breaking through protections Also repositioned VARIOUS_JUMP_IF_SPECIES. --- asm/macros/battle_script.inc | 5 ++ data/battle_scripts_1.s | 74 +++++++++++++++++++++- include/battle.h | 10 +++ include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 3 +- src/battle_message.c | 2 + src/battle_script_commands.c | 18 ++++-- 7 files changed, 105 insertions(+), 8 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 04f6e04dc..906eb1ede 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1864,6 +1864,11 @@ .4byte \ptr .endm + .macro jumpifprotected battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_PROTECTED + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3fcaf1024..b68363d5d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -394,7 +394,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHyperspaceFury @ EFFECT_HYPERSPACE_FURY BattleScript_EffectHyperspaceFury: - jumpifspecies BS_ATTACKER, SPECIES_HOOPA_UNBOUND, BattleScript_EffectAttackerDefenseDownHit + jumpifspecies BS_ATTACKER, SPECIES_HOOPA_UNBOUND, BattleScript_EffectHyperspaceFuryUnbound jumpifspecies BS_ATTACKER, SPECIES_HOOPA, BattleScript_ButHoopaCantUseIt printstring STRINGID_BUTPOKEMONCANTUSETHEMOVE waitmessage B_WAIT_TIME_LONG @@ -403,6 +403,78 @@ BattleScript_ButHoopaCantUseIt: printstring STRINGID_BUTHOOPACANTUSEIT waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd +BattleScript_EffectHyperspaceFuryUnbound: + attackcanceler + jumpifprotected BS_TARGET, BattleScript_HyperspaceFuryBrokeThroughProtection + argumenttomoveeffect + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + critcalc + damagecalc + adjustdamage + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage B_WAIT_TIME_LONG + resultmessage + waitmessage B_WAIT_TIME_LONG + seteffectwithchance + tryfaintmon BS_TARGET, FALSE, NULL + swapattackerwithtarget @ to make gStatDownStringIds down below print the right battler + setstatchanger STAT_DEF, 1, TRUE + statbuffchange STAT_BUFF_NOT_PROTECT_AFFECTED, BattleScript_HyperspaceFuryTargetDefenseCantGoLower + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printfromtable gStatDownStringIds + waitmessage B_WAIT_TIME_LONG + swapattackerwithtarget @ restore the battlers, just in case + goto BattleScript_MoveEnd + +BattleScript_HyperspaceFuryBrokeThroughProtection:: + argumenttomoveeffect + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + pause B_WAIT_TIME_LONG + printstring STRINGID_BROKETHROUGHPROTECTION + waitmessage B_WAIT_TIME_LONG + critcalc + damagecalc + adjustdamage + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage B_WAIT_TIME_LONG + resultmessage + waitmessage B_WAIT_TIME_LONG + seteffectwithchance + tryfaintmon BS_TARGET, FALSE, NULL + swapattackerwithtarget @ to make gStatDownStringIds down below print the right battler + setstatchanger STAT_DEF, 1, TRUE + statbuffchange STAT_BUFF_NOT_PROTECT_AFFECTED, BattleScript_HyperspaceFuryTargetDefenseCantGoLower + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printfromtable gStatDownStringIds + waitmessage B_WAIT_TIME_LONG + swapattackerwithtarget @ restore the battlers, just in case + goto BattleScript_MoveEnd + return + +BattleScript_HyperspaceFuryTargetDefenseCantGoLower: + printstring STRINGID_STATSWONTDECREASE + waitmessage B_WAIT_TIME_LONG + return BattleScript_EffectPlasmaFists: attackcanceler diff --git a/include/battle.h b/include/battle.h index c1ac57686..5077053e3 100644 --- a/include/battle.h +++ b/include/battle.h @@ -638,6 +638,16 @@ struct BattleStruct gBattleMons[battlerId].type3 = TYPE_MYSTERY; \ } +#define IS_BATTLER_PROTECTED(battlerId)(gProtectStructs[battlerId].protected \ + || gSideStatuses[GetBattlerSide(battlerId)] & SIDE_STATUS_WIDE_GUARD \ + || gSideStatuses[GetBattlerSide(battlerId)] & SIDE_STATUS_QUICK_GUARD \ + || gSideStatuses[GetBattlerSide(battlerId)] & SIDE_STATUS_CRAFTY_SHIELD \ + || gSideStatuses[GetBattlerSide(battlerId)] & SIDE_STATUS_MAT_BLOCK \ + || gProtectStructs[battlerId].spikyShielded \ + || gProtectStructs[battlerId].kingsShielded \ + || gProtectStructs[battlerId].banefulBunkered \ + || gProtectStructs[battlerId].obstructed) \ + #define GET_STAT_BUFF_ID(n)((n & 7)) // first three bits 0x1, 0x2, 0x4 #define GET_STAT_BUFF_VALUE_WITH_SIGN(n)((n & 0xF8)) #define GET_STAT_BUFF_VALUE(n)(((n >> 3) & 0xF)) // 0x8, 0x10, 0x20, 0x40 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index f00695276..abce5f9bf 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -194,6 +194,7 @@ #define VARIOUS_HANDLE_PRIMAL_REVERSION 121 #define VARIOUS_APPLY_PLASMA_FISTS 122 #define VARIOUS_JUMP_IF_SPECIES 123 +#define VARIOUS_JUMP_IF_PROTECTED 124 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 05bee80a8..1d461e2a0 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -596,8 +596,9 @@ #define STRINGID_PKMNREVERTEDTOPRIMAL 593 #define STRINGID_BUTPOKEMONCANTUSETHEMOVE 594 #define STRINGID_BUTHOOPACANTUSEIT 595 +#define STRINGID_BROKETHROUGHPROTECTION 596 -#define BATTLESTRINGS_COUNT 596 +#define BATTLESTRINGS_COUNT 597 // The below IDs are all indexes into battle message tables, // used to determine which of a set of messages to print. diff --git a/src/battle_message.c b/src/battle_message.c index bdc7f25fd..f26726a69 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -722,9 +722,11 @@ static const u8 sText_StuffCheeksCantSelect[] = _("Stuff Cheeks cannot be\nselec static const u8 sText_PkmnRevertedToPrimal[] = _("{B_ATK_NAME_WITH_PREFIX}'s Primal Reversion!\nIt reverted to its primal form!"); static const u8 sText_ButPokemonCantUseTheMove[] = _("But {B_ATK_NAME_WITH_PREFIX} can't\nuse the move!"); static const u8 sText_ButHoopaCantUseIt[] = _("But Hoopa can't use it\nthe way it is now!"); +static const u8 sText_BrokeThroughProtection[] = _("It broke through the\n{B_DEF_NAME_WITH_PREFIX}'s protection!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_BROKETHROUGHPROTECTION - 12] = sText_BrokeThroughProtection, [STRINGID_BUTPOKEMONCANTUSETHEMOVE - 12] = sText_ButPokemonCantUseTheMove, [STRINGID_BUTHOOPACANTUSEIT - 12] = sText_ButHoopaCantUseIt, [STRINGID_PKMNREVERTEDTOPRIMAL - 12] = sText_PkmnRevertedToPrimal, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 828e628aa..f99aec129 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8698,12 +8698,6 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; // exit if loop failed (failsafe) } return; - case VARIOUS_JUMP_IF_SPECIES: - if (gBattleMons[gActiveBattler].species == T1_READ_16(gBattlescriptCurrInstr + 3)) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5); - else - gBattlescriptCurrInstr += 9; - return; case VARIOUS_MOVEEND_ITEM_EFFECTS: if (ItemBattleEffects(1, gActiveBattler, FALSE)) return; @@ -8983,6 +8977,18 @@ static void Cmd_various(void) for (i = 0; i < gBattlersCount; i++) gStatuses4[i] |= STATUS4_PLASMA_FISTS; break; + case VARIOUS_JUMP_IF_SPECIES: + if (gBattleMons[gActiveBattler].species == T1_READ_16(gBattlescriptCurrInstr + 3)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5); + else + gBattlescriptCurrInstr += 9; + return; + case VARIOUS_JUMP_IF_PROTECTED: + if (IS_BATTLER_PROTECTED(gActiveBattler)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; } gBattlescriptCurrInstr += 3; From 2803b840e50fb47ea50256db6727859bd3084d42 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 28 Oct 2021 13:52:35 -0300 Subject: [PATCH 137/193] Updated Shadow Force's move data --- src/data/battle_moves.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 1079cd608..cdb3ba0d1 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -7415,6 +7415,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .split = SPLIT_PHYSICAL, + .argument = MOVE_EFFECT_FEINT, }, [MOVE_HONE_CLAWS] = From 82101d3581a736fcaf6b46c37c1678d102b2fdfe Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 28 Oct 2021 13:59:59 -0300 Subject: [PATCH 138/193] Optimizations --- asm/macros/battle_script.inc | 5 -- data/battle_scripts_1.s | 85 ++++------------------ include/battle_scripts.h | 1 + include/constants/battle_script_commands.h | 1 - src/battle_script_commands.c | 21 ++---- src/data/battle_moves.h | 1 - 6 files changed, 22 insertions(+), 92 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 906eb1ede..04f6e04dc 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1864,11 +1864,6 @@ .4byte \ptr .endm - .macro jumpifprotected battler:req, ptr:req - various \battler, VARIOUS_JUMP_IF_PROTECTED - .4byte \ptr - .endm - @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b68363d5d..e17fd8450 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -394,86 +394,31 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHyperspaceFury @ EFFECT_HYPERSPACE_FURY BattleScript_EffectHyperspaceFury: - jumpifspecies BS_ATTACKER, SPECIES_HOOPA_UNBOUND, BattleScript_EffectHyperspaceFuryUnbound - jumpifspecies BS_ATTACKER, SPECIES_HOOPA, BattleScript_ButHoopaCantUseIt + jumpifspecies BS_ATTACKER, SPECIES_TREECKO, BattleScript_EffectHyperspaceFuryUnbound + jumpifspecies BS_ATTACKER, SPECIES_MUDKIP, BattleScript_ButHoopaCantUseIt printstring STRINGID_BUTPOKEMONCANTUSETHEMOVE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd + +BattleScript_EffectHyperspaceFuryUnbound:: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + pause B_WAIT_TIME_LONG + ppreduce + setmoveeffect MOVE_EFFECT_FEINT + seteffectwithchance + setmoveeffect MOVE_EFFECT_DEF_MINUS_1 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN + goto BattleScript_HitFromCritCalc + BattleScript_ButHoopaCantUseIt: printstring STRINGID_BUTHOOPACANTUSEIT waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectHyperspaceFuryUnbound: - attackcanceler - jumpifprotected BS_TARGET, BattleScript_HyperspaceFuryBrokeThroughProtection - argumenttomoveeffect - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - seteffectwithchance - tryfaintmon BS_TARGET, FALSE, NULL - swapattackerwithtarget @ to make gStatDownStringIds down below print the right battler - setstatchanger STAT_DEF, 1, TRUE - statbuffchange STAT_BUFF_NOT_PROTECT_AFFECTED, BattleScript_HyperspaceFuryTargetDefenseCantGoLower - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - printfromtable gStatDownStringIds - waitmessage B_WAIT_TIME_LONG - swapattackerwithtarget @ restore the battlers, just in case - goto BattleScript_MoveEnd -BattleScript_HyperspaceFuryBrokeThroughProtection:: - argumenttomoveeffect - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - pause B_WAIT_TIME_LONG +BattleScript_HyperspaceFuryRemoveProtect:: printstring STRINGID_BROKETHROUGHPROTECTION waitmessage B_WAIT_TIME_LONG - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - seteffectwithchance - tryfaintmon BS_TARGET, FALSE, NULL - swapattackerwithtarget @ to make gStatDownStringIds down below print the right battler - setstatchanger STAT_DEF, 1, TRUE - statbuffchange STAT_BUFF_NOT_PROTECT_AFFECTED, BattleScript_HyperspaceFuryTargetDefenseCantGoLower - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - printfromtable gStatDownStringIds - waitmessage B_WAIT_TIME_LONG - swapattackerwithtarget @ restore the battlers, just in case - goto BattleScript_MoveEnd - return - -BattleScript_HyperspaceFuryTargetDefenseCantGoLower: - printstring STRINGID_STATSWONTDECREASE - waitmessage B_WAIT_TIME_LONG return BattleScript_EffectPlasmaFists: diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 1994aef50..ec95a4549 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -401,5 +401,6 @@ extern const u8 BattleScript_AttackWeakenedByStrongWinds[]; extern const u8 BattleScript_BlockedByPrimalWeatherEnd3[]; extern const u8 BattleScript_BlockedByPrimalWeatherRet[]; extern const u8 BattleScript_PrimalReversion[]; +extern const u8 BattleScript_HyperspaceFuryRemoveProtect[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index abce5f9bf..f00695276 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -194,7 +194,6 @@ #define VARIOUS_HANDLE_PRIMAL_REVERSION 121 #define VARIOUS_APPLY_PLASMA_FISTS 122 #define VARIOUS_JUMP_IF_SPECIES 123 -#define VARIOUS_JUMP_IF_PROTECTED 124 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f99aec129..e41f0982a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3278,15 +3278,7 @@ void SetMoveEffect(bool32 primary, u32 certain) } break; case MOVE_EFFECT_FEINT: - if (gProtectStructs[gBattlerTarget].protected - || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_WIDE_GUARD - || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_QUICK_GUARD - || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_CRAFTY_SHIELD - || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_MAT_BLOCK - || gProtectStructs[gBattlerTarget].spikyShielded - || gProtectStructs[gBattlerTarget].kingsShielded - || gProtectStructs[gBattlerTarget].banefulBunkered - || gProtectStructs[gBattlerTarget].obstructed) + if (IS_BATTLER_PROTECTED(gBattlerTarget)) { gProtectStructs[gBattlerTarget].protected = 0; gSideStatuses[GetBattlerSide(gBattlerTarget)] &= ~(SIDE_STATUS_WIDE_GUARD); @@ -3302,6 +3294,11 @@ void SetMoveEffect(bool32 primary, u32 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectFeint; } + else if (gCurrentMove == MOVE_HYPERSPACE_FURY) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_HyperspaceFuryRemoveProtect; + } } break; case MOVE_EFFECT_SPECTRAL_THIEF: @@ -8983,12 +8980,6 @@ static void Cmd_various(void) else gBattlescriptCurrInstr += 9; return; - case VARIOUS_JUMP_IF_PROTECTED: - if (IS_BATTLER_PROTECTED(gActiveBattler)) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); - else - gBattlescriptCurrInstr += 7; - return; } gBattlescriptCurrInstr += 3; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 41f577a5b..93d8fcda9 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -9701,7 +9701,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .priority = 0, .flags = FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_HIT_IN_SUBSTITUTE, .split = SPLIT_PHYSICAL, - .argument = MOVE_EFFECT_FEINT, }, [MOVE_SHORE_UP] = From e2e31f0b746631f6073d397734a936e38a56d54e Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 28 Oct 2021 16:53:00 -0400 Subject: [PATCH 139/193] skill swap config option for switchin abilities --- data/battle_scripts_1.s | 11 +++++++++++ include/constants/battle_config.h | 1 + 2 files changed, 12 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 5b1048e7b..009c3a882 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5200,8 +5200,19 @@ BattleScript_EffectSkillSwap: tryswapabilities BattleScript_ButItFailed attackanimation waitanimation +.if B_ABILITY_POP_UP == TRUE + copybyte gBattlerAbility, gBattlerTarget + call BattleScript_AbilityPopUp + pause 20 + copybyte gBattlerAbility, gBattlerAttacker + call BattleScript_AbilityPopUp +.endif printstring STRINGID_PKMNSWAPPEDABILITIES waitmessage B_WAIT_TIME_LONG +.if B_SKILL_SWAP >= GEN_4 + switchinabilities BS_ATTACKER + switchinabilities BS_TARGET +.endif goto BattleScript_MoveEnd BattleScript_EffectImprison:: diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 99ad7360a..41fee089d 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -148,6 +148,7 @@ #define B_CRASH_IF_TARGET_IMMUNE GEN_7 // In Gen4+, The user of Jump Kick or High Jump Kick will "keep going and crash" if it attacks a target that is immune to the move. #define B_MEMENTO_FAIL GEN_7 // In Gen4+, Memento fails if there is no target or if the target is protected or behind substitute. But not if Atk/Sp. Atk are at -6. #define B_GLARE_GHOST GEN_7 // In Gen4+, Glare can hit Ghost-type Pokémon normally. +#define B_SKILL_SWAP GEN_7 // In Gen4+, Skill Swap triggers switch-in abilities after use. // Ability settings #define B_ABILITY_WEATHER GEN_7 // In Gen6+, ability-induced weather lasts 5 turns. Before, it lasted until the battle ended or until it was changed by a move or a different weather-affecting ability. From 204748e01ac859094652370cf296866298de3db2 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 28 Oct 2021 17:52:52 -0400 Subject: [PATCH 140/193] fix recycle and harvest --- data/battle_scripts_1.s | 2 ++ include/battle.h | 2 +- include/battle_util.h | 1 + src/battle_ai_main.c | 8 ++++---- src/battle_main.c | 5 ++++- src/battle_script_commands.c | 8 ++++---- src/battle_util.c | 11 +++++++---- 7 files changed, 23 insertions(+), 14 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 5b1048e7b..70f2d5fb1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7490,9 +7490,11 @@ BattleScript_CheekPouchActivates:: BattleScript_HarvestActivates:: pause 5 + tryrecycleitem BattleScript_HarvestActivatesEnd call BattleScript_AbilityPopUp printstring STRINGID_HARVESTBERRY waitmessage B_WAIT_TIME_LONG +BattleScript_HarvestActivatesEnd: end3 BattleScript_SolarPowerActivates:: diff --git a/include/battle.h b/include/battle.h index 5077053e3..5e5aa2479 100644 --- a/include/battle.h +++ b/include/battle.h @@ -547,7 +547,7 @@ struct BattleStruct u16 synchronizeMoveEffect; bool8 anyMonHasTransformed; void (*savedCallback)(void); - u16 usedHeldItems[MAX_BATTLERS_COUNT]; + u16 usedHeldItems[PARTY_SIZE][2]; // For each party member and side. For harvest, recycle u16 chosenItem[MAX_BATTLERS_COUNT]; u8 AI_itemType[2]; u8 AI_itemFlags[2]; diff --git a/include/battle_util.h b/include/battle_util.h index ee7337ef2..d98c511e2 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -155,6 +155,7 @@ bool32 TryRoomService(u8 battlerId); void BufferStatChange(u8 battlerId, u8 statId, u8 stringId); void DoBurmyFormChange(u32 monId); bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef, bool32 checkTarget); +u16 GetUsedHeldItem(u8 battler); // ability checks bool32 IsRolePlayBannedAbilityAtk(u16 ability); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index b8ed21e9d..84fa7b634 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1530,7 +1530,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) score -= 10; break; case EFFECT_RECYCLE: - if (gBattleStruct->usedHeldItems[battlerAtk] == 0 || gBattleMons[battlerAtk].item != 0) + if (GetUsedHeldItem(battlerAtk) == 0 || gBattleMons[battlerAtk].item != 0) score -= 10; break; case EFFECT_IMPRISON: @@ -1951,7 +1951,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) score -= 10; break; case EFFECT_BELCH: - if (ItemId_GetPocket(gBattleStruct->usedHeldItems[battlerAtk]) != POCKET_BERRIES) + if (ItemId_GetPocket(GetUsedHeldItem(battlerAtk)) != POCKET_BERRIES) score -= 10; // attacker has not consumed a berry break; case EFFECT_YAWN: @@ -4097,9 +4097,9 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) score += 3; break; case EFFECT_RECYCLE: - if (gBattleStruct->usedHeldItems[battlerAtk] != ITEM_NONE) + if (GetUsedHeldItem(battlerAtk) != ITEM_NONE) score++; - if (IsRecycleEncouragedItem(gBattleStruct->usedHeldItems[battlerAtk])) + if (IsRecycleEncouragedItem(GetUsedHeldItem(battlerAtk))) score++; break; case EFFECT_BRICK_BREAK: diff --git a/src/battle_main.c b/src/battle_main.c index 271e97731..2cc3f5e2d 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2862,7 +2862,6 @@ static void BattleStartClearSetData(void) gBattleResources->flags->flags[i] = 0; gPalaceSelectionBattleScripts[i] = 0; gBattleStruct->lastTakenMove[i] = 0; - gBattleStruct->usedHeldItems[i] = 0; gBattleStruct->choicedMove[i] = 0; gBattleStruct->changedItems[i] = 0; gBattleStruct->lastTakenMoveFrom[i][0] = 0; @@ -2935,7 +2934,11 @@ static void BattleStartClearSetData(void) gBattleStruct->mega.triggerSpriteId = 0xFF; for (i = 0; i < PARTY_SIZE; i++) + { + gBattleStruct->usedHeldItems[i][0] = 0; + gBattleStruct->usedHeldItems[i][1] = 0; gBattleStruct->itemStolen[i].originalItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + } } void SwitchInClearSetData(void) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e41f0982a..ca0ceb749 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6796,10 +6796,10 @@ static void Cmd_removeitem(void) gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); itemId = gBattleMons[gActiveBattler].item; - // Popped Air Balloon cannot be restored by no means. + // Popped Air Balloon cannot be restored by any means. if (GetBattlerHoldEffect(gActiveBattler, TRUE) != HOLD_EFFECT_AIR_BALLOON) - gBattleStruct->usedHeldItems[gActiveBattler] = itemId; - + gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gActiveBattler]][GetBattlerSide(gActiveBattler)] = itemId; // Remember if switched out + gBattleMons[gActiveBattler].item = 0; CheckSetUnburden(gActiveBattler); @@ -12547,7 +12547,7 @@ static void Cmd_tryrecycleitem(void) u16 *usedHeldItem; gActiveBattler = gBattlerAttacker; - usedHeldItem = &gBattleStruct->usedHeldItems[gActiveBattler]; + usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gActiveBattler]][GetBattlerSide(gActiveBattler)]; if (*usedHeldItem != 0 && gBattleMons[gActiveBattler].item == 0) { gLastUsedItem = *usedHeldItem; diff --git a/src/battle_util.c b/src/battle_util.c index 275139f4f..ca280a722 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4373,11 +4373,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move case ABILITY_HARVEST: if (((WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) || Random() % 2 == 0) && gBattleMons[battler].item == ITEM_NONE - && gBattleStruct->changedItems[battler] == ITEM_NONE - && ItemId_GetPocket(gBattleStruct->usedHeldItems[battler]) == POCKET_BERRIES) + && gBattleStruct->changedItems[battler] == ITEM_NONE // Will not inherit an item + && ItemId_GetPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES) { - gLastUsedItem = gBattleStruct->changedItems[battler] = gBattleStruct->usedHeldItems[battler]; - gBattleStruct->usedHeldItems[battler] = ITEM_NONE; BattleScriptPushCursorAndCallback(BattleScript_HarvestActivates); effect++; } @@ -9519,3 +9517,8 @@ bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef, bool32 chec #endif return FALSE; } + +u16 GetUsedHeldItem(u8 battler) +{ + return gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)]; +} From 2502820e83900bc299ecd5eb62008b972470ef58 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Fri, 29 Oct 2021 09:03:14 -0400 Subject: [PATCH 141/193] document a couple hitmarkers. fix failing moves not updating hp from own healing effects --- data/battle_scripts_1.s | 64 ++++++++++++++++++------------------ include/constants/battle.h | 4 +-- src/battle_main.c | 4 +-- src/battle_script_commands.c | 16 ++++----- src/battle_util.c | 12 +++---- 5 files changed, 50 insertions(+), 50 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 009c3a882..8241a31a6 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5968,7 +5968,7 @@ BattleScript_DamagingWeatherHeal: printstring STRINGID_ICEBODYHPGAIN waitmessage B_WAIT_TIME_LONG BattleScript_DamagingWeatherHpChange: - orword gHitMarker, HITMARKER_x20 | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 | HITMARKER_GRUDGE + orword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER, FALSE, NULL @@ -5978,7 +5978,7 @@ BattleScript_DamagingWeatherLoopIncrement:: addbyte gBattleCommunication, 1 jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_DamagingWeatherLoop BattleScript_DamagingWeatherContinuesEnd:: - bicword gHitMarker, HITMARKER_x20 | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 | HITMARKER_GRUDGE + bicword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE end2 BattleScript_SandStormHailEnds:: @@ -6097,7 +6097,7 @@ BattleScript_SafeguardEnds:: BattleScript_LeechSeedTurnDrain:: playanimation BS_ATTACKER, B_ANIM_LEECH_SEED_DRAIN, sB_ANIM_ARG1 - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER copyword gBattleMoveDamage, gHpDealt @@ -6111,7 +6111,7 @@ BattleScript_LeechSeedTurnPrintLiquidOoze:: call BattleScript_AbilityPopUp setbyte cMULTISTRING_CHOOSER, B_MSG_LEECH_SEED_OOZE BattleScript_LeechSeedTurnPrintAndUpdateHp:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_TARGET datahpupdate BS_TARGET printfromtable gLeechSeedStringIds @@ -6292,14 +6292,14 @@ BattleScript_EncoredNoMore:: BattleScript_DestinyBondTakesLife:: printstring STRINGID_PKMNTOOKFOE waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER, FALSE, NULL return BattleScript_DmgHazardsOnAttacker:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER call BattleScript_PrintHurtByDmgHazards @@ -6314,7 +6314,7 @@ BattleScript_DmgHazardsOnAttackerFainted:: goto BattleScript_HandleFaintedMon BattleScript_DmgHazardsOnTarget:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_TARGET datahpupdate BS_TARGET call BattleScript_PrintHurtByDmgHazards @@ -6329,7 +6329,7 @@ BattleScript_DmgHazardsOnTargetFainted:: goto BattleScript_HandleFaintedMon BattleScript_DmgHazardsOnFaintedBattler:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_FAINTED datahpupdate BS_FAINTED call BattleScript_PrintHurtByDmgHazards @@ -6384,7 +6384,7 @@ BattleScript_StickyWebOnSwitchInEnd: BattleScript_PerishSongTakesLife:: printstring STRINGID_PKMNPERISHCOUNTFELL waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER, FALSE, NULL @@ -6394,14 +6394,14 @@ BattleScript_PerishBodyActivates:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSWILLPERISHIN3TURNS waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE return BattleScript_GulpMissileGorging:: call BattleScript_AbilityPopUp playanimation BS_ATTACKER, B_ANIM_GULP_MISSILE, NULL waitanimation - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE effectivenesssound hitanimation BS_ATTACKER waitstate @@ -6430,7 +6430,7 @@ BattleScript_GulpMissileGulping:: call BattleScript_AbilityPopUp playanimation BS_ATTACKER, B_ANIM_GULP_MISSILE, NULL waitanimation - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE effectivenesssound hitanimation BS_ATTACKER waitstate @@ -7009,7 +7009,7 @@ BattleScript_AnticipationActivates:: BattleScript_AftermathDmg:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_AFTERMATHDMG @@ -7042,7 +7042,7 @@ BattleScript_PoisonTurnDmg:: BattleScript_DoStatusTurnDmg:: statusanimation BS_ATTACKER BattleScript_DoTurnDmg: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER, FALSE, NULL @@ -7055,7 +7055,7 @@ BattleScript_PoisonHealActivates:: waitmessage B_WAIT_TIME_LONG recordability BS_ATTACKER statusanimation BS_ATTACKER - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER end2 @@ -7152,7 +7152,7 @@ BattleScript_DoSelfConfusionDmg:: effectivenesssound hitanimation BS_ATTACKER waitstate - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER resultmessage @@ -7173,7 +7173,7 @@ BattleScript_MoveUsedPowder:: effectivenesssound hitanimation BS_ATTACKER waitstate - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_POWDEREXPLODES @@ -7347,7 +7347,7 @@ BattleScript_MoveEffectRecoil:: jumpifmove MOVE_STRUGGLE, BattleScript_DoRecoil jumpifability BS_ATTACKER, ABILITY_ROCK_HEAD, BattleScript_RecoilEnd BattleScript_DoRecoil:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 | HITMARKER_IGNORE_DISGUISE + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_IGNORE_DISGUISE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_PKMNHITWITHRECOIL @@ -7507,7 +7507,7 @@ BattleScript_HarvestActivates:: end3 BattleScript_SolarPowerActivates:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE call BattleScript_AbilityPopUp healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER @@ -7753,7 +7753,7 @@ BattleScript_BadDreamsActivates:: BattleScript_BadDreamsLoop: trygetbaddreamstarget BattleScript_BadDreamsEnd dmg_1_8_targethp - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE printstring STRINGID_BADDREAMSDMG waitmessage B_WAIT_TIME_LONG jumpifability BS_TARGET, ABILITY_MAGIC_GUARD, BattleScript_BadDreamsIncrement @@ -7922,14 +7922,14 @@ BattleScript_GrassyTerrainLoop: printstring STRINGID_GRASSYTERRAINHEALS waitmessage B_WAIT_TIME_LONG BattleScript_GrassyTerrainHpChange: - orword gHitMarker, HITMARKER_x20 | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER BattleScript_GrassyTerrainLoopIncrement:: addbyte gBattleCommunication, 1 jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_GrassyTerrainLoop BattleScript_GrassyTerrainLoopEnd:: - bicword gHitMarker, HITMARKER_x20 | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + bicword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_TERRAIN_PERMANENT, BattleScript_GrassyTerrainHealEnd jumpifbyte CMP_EQUAL, gFieldTimers + 5, 0, BattleScript_GrassyTerrainEnds BattleScript_GrassyTerrainHealEnd: @@ -8125,7 +8125,7 @@ BattleScript_ImposterActivates:: end3 BattleScript_HurtAttacker: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_PKMNHURTSWITH @@ -8149,7 +8149,7 @@ BattleScript_RockyHelmetActivatesDmg: BattleScript_SpikyShieldEffect:: jumpifabsent BS_ATTACKER, BattleScript_SpikyShieldRet - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER @@ -8160,7 +8160,7 @@ BattleScript_SpikyShieldRet:: return BattleScript_KingsShieldEffect:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT seteffectsecondary setmoveeffect 0 @@ -8170,7 +8170,7 @@ BattleScript_KingsShieldEffect:: return BattleScript_BanefulBunkerEffect:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_x100000 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_PASSIVE_DAMAGE bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT seteffectsecondary setmoveeffect 0 @@ -8424,7 +8424,7 @@ BattleScript_ItemHealHP_RemoveItemRet_Anim: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, NULL printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE + orword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_SCRIPTING datahpupdate BS_SCRIPTING removeitem BS_SCRIPTING @@ -8439,7 +8439,7 @@ BattleScript_ItemHealHP_RemoveItemEnd2_Anim: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE + orword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER removeitem BS_ATTACKER @@ -8473,7 +8473,7 @@ BattleScript_AirBaloonMsgPop:: return BattleScript_ItemHurtRet:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 | HITMARKER_IGNORE_DISGUISE + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_IGNORE_DISGUISE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_HURTBYITEM @@ -8491,7 +8491,7 @@ BattleScript_ItemHealHP_Ret:: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL printstring STRINGID_PKMNSITEMRESTOREDHPALITTLE waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE + orword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER return @@ -8522,7 +8522,7 @@ BattleScript_BerryConfuseHealEnd2_Anim: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, NULL printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE + orword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_SCRIPTING datahpupdate BS_SCRIPTING printstring STRINGID_FORXCOMMAYZ @@ -8541,7 +8541,7 @@ BattleScript_BerryConfuseHealRet_Anim: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, NULL printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE + orword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_SCRIPTING datahpupdate BS_SCRIPTING printstring STRINGID_FORXCOMMAYZ diff --git a/include/constants/battle.h b/include/constants/battle.h index 260e6153c..918c3e7f0 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -176,7 +176,7 @@ #define STATUS4_PLASMA_FISTS (1 << 1) #define HITMARKER_x10 (1 << 4) -#define HITMARKER_x20 (1 << 5) +#define HITMARKER_SKIP_DMG_TRACK (1 << 5) #define HITMARKER_DESTINYBOND (1 << 6) #define HITMARKER_NO_ANIMATIONS (1 << 7) #define HITMARKER_IGNORE_SUBSTITUTE (1 << 8) @@ -190,7 +190,7 @@ #define HITMARKER_IGNORE_DISGUISE (1 << 16) // 3 free spots because of change in handling of UNDERGROUND/UNDERWATER/ON AIR #define HITMARKER_UNABLE_TO_USE_MOVE (1 << 19) -#define HITMARKER_x100000 (1 << 20) +#define HITMARKER_PASSIVE_DAMAGE (1 << 20) #define HITMARKER_x200000 (1 << 21) #define HITMARKER_x400000 (1 << 22) #define HITMARKER_x800000 (1 << 23) diff --git a/src/battle_main.c b/src/battle_main.c index 271e97731..704b73378 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3635,7 +3635,7 @@ void BattleTurnPassed(void) gHitMarker &= ~(HITMARKER_NO_ATTACKSTRING); gHitMarker &= ~(HITMARKER_UNABLE_TO_USE_MOVE); gHitMarker &= ~(HITMARKER_x400000); - gHitMarker &= ~(HITMARKER_x100000); + gHitMarker &= ~(HITMARKER_PASSIVE_DAMAGE); gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; gBattleScripting.moveendState = 0; @@ -4772,7 +4772,7 @@ static void RunTurnActionsFunctions(void) if (gCurrentTurnActionNumber >= gBattlersCount) // everyone did their actions, turn finished { - gHitMarker &= ~(HITMARKER_x100000); + gHitMarker &= ~(HITMARKER_PASSIVE_DAMAGE); gBattleMainFunc = sEndTurnFuncsTable[gBattleOutcome & 0x7F]; } else diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e41f0982a..6e5f0eb0c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2123,7 +2123,7 @@ static void Cmd_healthbarupdate(void) if (gBattleControllerExecFlags) return; - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) || (gHitMarker & HITMARKER_PASSIVE_DAMAGE)) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); @@ -2160,7 +2160,7 @@ static void Cmd_datahpupdate(void) else moveType = gBattleMoves[gCurrentMove].type; - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) || (gHitMarker & HITMARKER_PASSIVE_DAMAGE)) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); if (DoesSubstituteBlockMove(gBattlerAttacker, gActiveBattler, gCurrentMove) && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) @@ -2206,9 +2206,9 @@ static void Cmd_datahpupdate(void) } else // hp goes down { - if (gHitMarker & HITMARKER_x20) + if (gHitMarker & HITMARKER_SKIP_DMG_TRACK) { - gHitMarker &= ~(HITMARKER_x20); + gHitMarker &= ~(HITMARKER_SKIP_DMG_TRACK); } else { @@ -2230,10 +2230,10 @@ static void Cmd_datahpupdate(void) gBattleMons[gActiveBattler].hp = 0; } - if (!gSpecialStatuses[gActiveBattler].dmg && !(gHitMarker & HITMARKER_x100000)) + if (!gSpecialStatuses[gActiveBattler].dmg && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE)) gSpecialStatuses[gActiveBattler].dmg = gHpDealt; - if (IS_MOVE_PHYSICAL(gCurrentMove) && !(gHitMarker & HITMARKER_x100000) && gCurrentMove != MOVE_PAIN_SPLIT) + if (IS_MOVE_PHYSICAL(gCurrentMove) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE) && gCurrentMove != MOVE_PAIN_SPLIT) { gProtectStructs[gActiveBattler].physicalDmg = gHpDealt; gSpecialStatuses[gActiveBattler].physicalDmg = gHpDealt; @@ -2248,7 +2248,7 @@ static void Cmd_datahpupdate(void) gSpecialStatuses[gActiveBattler].physicalBattlerId = gBattlerTarget; } } - else if (!IS_MOVE_PHYSICAL(gCurrentMove) && !(gHitMarker & HITMARKER_x100000)) + else if (!IS_MOVE_PHYSICAL(gCurrentMove) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE)) { gProtectStructs[gActiveBattler].specialDmg = gHpDealt; gSpecialStatuses[gActiveBattler].specialDmg = gHpDealt; @@ -2264,7 +2264,7 @@ static void Cmd_datahpupdate(void) } } } - gHitMarker &= ~(HITMARKER_x100000); + gHitMarker &= ~(HITMARKER_PASSIVE_DAMAGE); BtlController_EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBattler].hp); MarkBattlerForControllerExec(gActiveBattler); } diff --git a/src/battle_util.c b/src/battle_util.c index 275139f4f..b0078777d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -864,7 +864,7 @@ void HandleAction_NothingIsFainted(void) gCurrentTurnActionNumber++; gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED - | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_x100000 + | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_PASSIVE_DAMAGE | HITMARKER_OBEYS | HITMARKER_x10 | HITMARKER_SYNCHRONISE_EFFECT | HITMARKER_CHARGING | HITMARKER_x4000000); } @@ -876,7 +876,7 @@ void HandleAction_ActionFinished(void) gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; SpecialStatusesClear(); gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED - | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_x100000 + | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_PASSIVE_DAMAGE | HITMARKER_OBEYS | HITMARKER_x10 | HITMARKER_SYNCHRONISE_EFFECT | HITMARKER_CHARGING | HITMARKER_x4000000 | HITMARKER_IGNORE_DISGUISE); @@ -2414,7 +2414,7 @@ u8 DoBattlerEndTurnEffects(void) { u32 ability, i, effect = 0; - gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); + gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); while (gBattleStruct->turnEffectsBattlerId < gBattlersCount && gBattleStruct->turnEffectsTracker <= ENDTURN_BATTLER_COUNT) { gActiveBattler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->turnEffectsBattlerId]; @@ -2908,13 +2908,13 @@ u8 DoBattlerEndTurnEffects(void) return effect; } - gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_x20); + gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); return 0; } bool8 HandleWishPerishSongOnTurnEnd(void) { - gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); + gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); switch (gBattleStruct->wishPerishSongState) { @@ -3011,7 +3011,7 @@ bool8 HandleWishPerishSongOnTurnEnd(void) break; } - gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_x20); + gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); return FALSE; } From 47bfeaeecd5bed4342227e257d8b52c510d011b6 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 30 Oct 2021 18:31:44 +1300 Subject: [PATCH 142/193] Implement Gorilla Tactics It's Choice Band but as an ability. --- data/battle_scripts_1.s | 4 ++++ include/battle_scripts.h | 1 + include/constants/battle_string_ids.h | 3 ++- src/battle_message.c | 2 ++ src/battle_script_commands.c | 2 +- src/battle_util.c | 21 +++++++++++++++++++++ 6 files changed, 31 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index dd6af61e5..072563e39 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8502,6 +8502,10 @@ BattleScript_SelectingNotAllowedMoveChoiceItem:: printselectionstring STRINGID_ITEMALLOWSONLYYMOVE endselectionscript +BattleScript_SelectingNotAllowedMoveGorillaTactics:: + printselectionstring STRINGID_ABILITYALLOWSONLYMOVE + endselectionscript + BattleScript_SelectingNotAllowedMoveAssaultVest:: printselectionstring STRINGID_ASSAULTVESTDOESNTALLOW endselectionscript diff --git a/include/battle_scripts.h b/include/battle_scripts.h index ec95a4549..0bc09156e 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -402,5 +402,6 @@ extern const u8 BattleScript_BlockedByPrimalWeatherEnd3[]; extern const u8 BattleScript_BlockedByPrimalWeatherRet[]; extern const u8 BattleScript_PrimalReversion[]; extern const u8 BattleScript_HyperspaceFuryRemoveProtect[]; +extern const u8 BattleScript_SelectingNotAllowedMoveGorillaTactics[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 1d461e2a0..638306971 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -597,8 +597,9 @@ #define STRINGID_BUTPOKEMONCANTUSETHEMOVE 594 #define STRINGID_BUTHOOPACANTUSEIT 595 #define STRINGID_BROKETHROUGHPROTECTION 596 +#define STRINGID_ABILITYALLOWSONLYMOVE 597 -#define BATTLESTRINGS_COUNT 597 +#define BATTLESTRINGS_COUNT 598 // The below IDs are all indexes into battle message tables, // used to determine which of a set of messages to print. diff --git a/src/battle_message.c b/src/battle_message.c index f26726a69..94a30ea5d 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -723,9 +723,11 @@ static const u8 sText_PkmnRevertedToPrimal[] = _("{B_ATK_NAME_WITH_PREFIX}'s Pri static const u8 sText_ButPokemonCantUseTheMove[] = _("But {B_ATK_NAME_WITH_PREFIX} can't\nuse the move!"); static const u8 sText_ButHoopaCantUseIt[] = _("But Hoopa can't use it\nthe way it is now!"); static const u8 sText_BrokeThroughProtection[] = _("It broke through the\n{B_DEF_NAME_WITH_PREFIX}'s protection!"); +static const u8 sText_AbilityAllowsOnlyMove[] = _("{B_ATK_ABILITY} allows the\nuse of only {B_CURRENT_MOVE}!\p"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_ABILITYALLOWSONLYMOVE - 12] = sText_AbilityAllowsOnlyMove, [STRINGID_BROKETHROUGHPROTECTION - 12] = sText_BrokeThroughProtection, [STRINGID_BUTPOKEMONCANTUSETHEMOVE - 12] = sText_ButPokemonCantUseTheMove, [STRINGID_BUTHOOPACANTUSEIT - 12] = sText_ButHoopaCantUseIt, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c5c922d8e..b2dcb3958 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4942,7 +4942,7 @@ static void Cmd_moveend(void) break; case MOVEEND_CHOICE_MOVE: // update choice band move if (gHitMarker & HITMARKER_OBEYS - && HOLD_EFFECT_CHOICE(holdEffectAtk) + && (HOLD_EFFECT_CHOICE(holdEffectAtk) || GetBattlerAbility(gBattlerAttacker)) && gChosenMove != MOVE_STRUGGLE && (*choicedMoveAtk == 0 || *choicedMoveAtk == 0xFFFF)) { diff --git a/src/battle_util.c b/src/battle_util.c index fe957e464..c7f6af960 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1776,6 +1776,21 @@ u8 TrySetCantSelectMoveBattleScript(void) limitations++; } } + if ((GetBattlerAbility(gActiveBattler) == ABILITY_GORILLA_TACTICS) && *choicedMove != 0 + && *choicedMove != 0xFFFF && *choicedMove != move) + { + gCurrentMove = *choicedMove; + gLastUsedItem = gBattleMons[gActiveBattler].item; + if (gBattleTypeFlags & BATTLE_TYPE_PALACE) + { + gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + } + else + { + gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveGorillaTactics; + limitations++; + } + } if (gBattleMons[gActiveBattler].pp[moveId] == 0) { @@ -1831,6 +1846,8 @@ u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check) unusableMoves |= gBitTable[i]; else if (gBattleMons[battlerId].moves[i] == MOVE_STUFF_CHEEKS && ItemId_GetPocket(gBattleMons[gActiveBattler].item) != POCKET_BERRIES) unusableMoves |= gBitTable[i]; + else if (GetBattlerAbility(battlerId) == ABILITY_GORILLA_TACTICS && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != gBattleMons[battlerId].moves[i]) + unusableMoves |= gBitTable[i]; } return unusableMoves; } @@ -7837,6 +7854,10 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe if (moveType == TYPE_DRAGON) MulModifier(&modifier, UQ_4_12(1.5)); break; + case ABILITY_GORILLA_TACTICS: + if (IS_MOVE_PHYSICAL(move)) + MulModifier(&modifier, UQ_4_12(1.5)); + break; } // field abilities From da30f023e8aac23fc19529300d4151df20b92aa6 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 30 Oct 2021 19:32:37 +1300 Subject: [PATCH 143/193] Revert "Ex fix move bg tilemaps" --- .../battle_anims/backgrounds/dark_void.bin | Bin 2048 -> 1236 bytes .../backgrounds/new/aeroblast_map.bin | Bin 896 -> 804 bytes .../backgrounds/new/blackhole_eclipse.bin | Bin 896 -> 892 bytes .../backgrounds/new/bloom_doom.bin | Bin 896 -> 564 bytes .../backgrounds/new/bolt_strike.bin | Bin 896 -> 780 bytes .../backgrounds/new/clangorous_soulblaze.bin | Bin 2048 -> 700 bytes .../backgrounds/new/dark_void.bin | Bin 2048 -> 1236 bytes .../backgrounds/new/electric_terrain.bin | Bin 4096 -> 2020 bytes .../battle_anims/backgrounds/new/fire1.bin | Bin 896 -> 684 bytes .../backgrounds/new/focus_blast.bin | Bin 896 -> 952 bytes .../backgrounds/new/giga_impact_opponent.bin | Bin 896 -> 704 bytes .../backgrounds/new/giga_impact_player.bin | Bin 896 -> 744 bytes .../backgrounds/new/grassy_terrain.bin | Bin 4096 -> 2244 bytes .../backgrounds/new/high_speed.bin | Bin 896 -> 496 bytes .../backgrounds/new/hydro_cannon.bin | Bin 4096 -> 880 bytes .../backgrounds/new/hydro_pump.bin | Bin 896 -> 224 bytes .../backgrounds/new/inferno_overdrive.bin | Bin 896 -> 556 bytes .../backgrounds/new/leaf_storm.bin | Bin 896 -> 924 bytes .../backgrounds/new/malicious_moonsault.bin | Bin 896 -> 544 bytes .../backgrounds/new/max_lightning.bin | Bin 896 -> 744 bytes .../backgrounds/new/misty_terrain.bin | Bin 4096 -> 2180 bytes .../backgrounds/new/neverending_nightmare.bin | Bin 896 -> 744 bytes .../backgrounds/new/nightmare.bin | Bin 896 -> 756 bytes .../backgrounds/new/psychic_terrain.bin | Bin 4096 -> 1904 bytes .../backgrounds/new/rock_wrecker.bin | Bin 896 -> 676 bytes .../backgrounds/new/shattered_psyche.bin | Bin 896 -> 808 bytes .../battle_anims/backgrounds/new/sky_day.bin | Bin 896 -> 1052 bytes .../backgrounds/new/snuggle_forever.bin | Bin 896 -> 988 bytes .../new/soulstealing_7star_strike.bin | Bin 896 -> 968 bytes .../backgrounds/new/spacial_rend_opponent.bin | Bin 896 -> 1000 bytes .../backgrounds/new/spacial_rend_player.bin | Bin 896 -> 996 bytes .../backgrounds/new/trick_room.bin | Bin 896 -> 844 bytes .../backgrounds/new/twinkle_tackle.bin | Bin 896 -> 784 bytes .../backgrounds/new/water_pulse.bin | Bin 896 -> 600 bytes .../backgrounds/new/waterfall.bin | Bin 2048 -> 2128 bytes .../backgrounds/new/zmove_activate.bin | Bin 896 -> 520 bytes .../backgrounds/new/zmove_mountain.bin | Bin 896 -> 760 bytes .../backgrounds/spacial_rend_opponent.bin | Bin 896 -> 1000 bytes .../backgrounds/spacial_rend_player.bin | Bin 896 -> 996 bytes 39 files changed, 0 insertions(+), 0 deletions(-) diff --git a/graphics/battle_anims/backgrounds/dark_void.bin b/graphics/battle_anims/backgrounds/dark_void.bin index 97b879f01ba8ebc08c92d30497c894a1a7b186c8..922b72bc74d7f5c773331b1af537d54c2e939038 100644 GIT binary patch literal 1236 zcmb`DQ*a�EG8%o2G73rS7+FiquMtziyh^wr$(CZQHhOoNf1v=K6Sd&o{d-JM+!# z?1m|k6d)b};-dtFkdRQ6h{PlzDQS|CToEahDJ2RcoK&PHK^oGMP6Z+eOHT$xXCxEK zOct_|4S~r{4irgFa*-S5A&R`@L-{E{K?P#29(hYT|2R-S9deeu#^h5m_z(59}!3<$2!_aU>Fp^PdG-DXcI5eIKOk@(8%oL_F z4NYeTGns{EGl#j%L-Sd{LKdOLEMY0j2rOp>D_IrD@cQJ{tYIy|b%B@w>)C)dvWd-X zq3YH^t8Hv2Vh7sEE_SmA?PVYPIe-pwh{GH~M>)oEPN0*V;xuQ_St#dB$^Ipf`Avw|E=9!@Io4`{)BcMs-jiR)m_6itr*vGtZO@1M=^C>&-EQ_Kx{)da$^UZs9jSxb8`ng_)6>wZ>$5AZ+_vIcvIhkBSb+#@{FqpZ;$ zKhm)_x!GK_9XX`-qSFn04GIeA1^Ja@uEn zwo>kMfr@G!b>0_z(YoZzzT&IaHDC7)-?VP|w(t0^bdrjO3&sC8Q3JlqG_4l&1m}sYGR}P?c&_rv^2t zMQ!R(mwMEv0S#$HW17&EW;CY-Eont-+7L-w+R>g4bfgoV=|We!(VZUjq!+#ELtpyQ zp8*VH5Q7=QP=+y_5sYLMqZz|k#xb4=Ok@(1nZi`2F`XIAWEQiT!(8Sup9L&r5sO*E zQkJot6|7_xQNhoISj`&NvMx{|*0X_)Y+^H8*c#N^*#64j!A^Fun?3AhANx7LK@M@4 zBOK)z$2q}CPH~zuoaG$nxxhs(ahWSz$y!A)*)n>*a)9`|{`Lmu&%Cp_gD&w0V? zyuq8i#oN5YyS&Hye87i%#K(NXr+miee8HD|#n*hpw|vL<{J@X=#LxV~ul&aE{K236 z#ozqHYle(rOk)|_IL0-e@l9Yt6Pef~CN-JKO<_t?nc6g_HJ$0rU`8{U*(_!iHJjND zGlx0NWp2aGV_x%_-vSo2kcBN`QHxpJ5|%VXDN9=>V2HATddZh3!g7|kLQq$^Beaj3%_?g&RZ%F&K-tm7Q-1SdMl$xd;q z)12-MXFAK-&T+2uobLh`y2!;YajDB(?h04B$|zU6#JKX6m zce}^E?sLBfJm?`0d&Hw2^SCEG=_yZp#3~?@CWcYb6c+pE<_KH`%=5=p)(_7y5 ij(5H1eINMHM?Ut6PkrWdUj%c}`H#+jbpHRZ`TrM_mOTvs diff --git a/graphics/battle_anims/backgrounds/new/aeroblast_map.bin b/graphics/battle_anims/backgrounds/new/aeroblast_map.bin index 369abe63ab8c68f368ae87be668cc5f0a81e363c..a7275a0747da421e5290f61115deb0f4fbc84aa9 100644 GIT binary patch literal 804 zcmWN~iJy#h9KiAK@7aeP*73})#X3LVF_>jt>prIES(cnxM9CdRheWw;GppQG?xW=B zK(0uoShF2+)RwC|Ay;yio3`Z-c)#9GG)^3YB_<9VDMC@=@gc=1P68#6l9Zw}4xV3< z6G@^Bl1y33Q65PlC9MJ#@l~QSj$4JQ7N7*gttJGiP7P`bAyTPD?WpvKCyhGP73xu+ z2BZrOX+&e1_-INq+~&0K(UMk@9p(YS#Uq2(LK`w^OS{Q3|3TW*A!<4bo#;##9)hk! zvgk&4=pnfe)01BCh~z&?ZypQKM-KL-pM?9v0ErA_5RXTt(_n`11W$$-N^F=EJjK&d zDR_ow8P0RU2%cvoqe8r3{4dJH(PVmQSvg}EOJ>N7V>}a>IMDS^BHM&tA|kHXM9Ec3Uq=8^qnnri_TanGe`v3bx{W z$TlnCBR)nxVLPAFE|~dQUTgxxznI>|d_pU9ZSDzNs;+`h1PtX!tQl*rZR!99RiJGKkG+FbU=1#b*mecYoDOy1*Y9-C6 z?73C6s@idur;-uSY8q6jt~Io#hE!6ume$rZb?RtcG4-^*N&`*ThT2G_u{P1BdJk%x B*LVN` literal 896 zcmZA0bx;;z5XW(85R?)SB)%&zB_V=hHwJchcXxMpcXxMpcPn;xcX#c30}kWtA2+x2 z`|PvN%$)_6T2@$NgDrO0<3MU0aUu-nn#)T*@>76<6rwQk z6rregi&30}6jg$fl%h0cC~Np~l&1m}HCc(uRH3TgrW)0$K~3$|qPE&P)YbFrQJ)6- z){sUtrU^|A-%Rt(X`$Jcw4ya_XiGcV(}9lK>!kV4#787=(1otVhjyboJ?Qz*_oBCE z`_NatHT~$%00uIM!3;^Uxp~G=hB2HGjARs}4L^pljAOj|2~0HnBqpn$!c?X){Xd_; z3}!Nm+00?C;pZ`*1uRs*h{Y^1pC7uEWxD@zR?xweym|6-rS?{-U(FiB=VUGGSg(Eq z8`-3OGh5ioHnvmLwBx_?cd|?Gw3|KbWuM{qb3n~O^>!TMFh@AbF^+SBlbqr-XHrZ! z%Q+G`&jl`WiOYt!zTLQ|TN zh>~bd3tFO9v?dvlX+sKaQ9Ig`N*a+4bfi;Nn2s{&Ocydy7G3E^chrNP^rAP)rVlyv zC7Me=<%YzFwO zlu|}e&PA+ay$%K!a|s*Rs2$2-6PI!sx|}PxlB>|wRB#Q~qU*Sx8@Q3!O$u-37H&ni zv6(I0jw-o>JGqPK-Q1%S_p%k;$2PWeKZy_UpmL+ZLp&@VVF!=$80=KIi^q9FJjqi$ z%`;**dw7=T(x?iu_A1=U^Wp_w)td7JuEAI4vM7lHFS?=OYXSu7~ z&E4I@J>_2R?QHi+agMV4I#*#rp^`KDIdsfPdG1e`86T!a3nBwN(1TPo*c#%Y&i62@ zz{5SlBb_+PqqQNSqR?aHu^#6lkFP2VGxH~Sq9<9CJ;hU9Y)$iY&+trZmS=m8=Q=iz X^7&ri5^JFsd9jx`vee7GoPB2iycXQs literal 896 zcmZ9~Wl$DC6op~26$AwZ1(o+$fP#sFqJpAg2cdupDi#*l-QC^Y-QC^Y-QC@}ANoU` zJ9BqtXP$e{?5q`uNkUSRk(?ByBo(Q##)dT5Vn2%L{pFYG$4kCG@>z0Xi6;2 zXif{Wvn8#FBc9f@p)KubPX{{E$!zXS7rN4o?)0E1z35FJ`qIzj>(2lNGRSB@1~Y`A z3}ZMW7|AF`GlsE@V>}a>$Ry(@Gli*4V>&aK$t-3whq=sSzR?R<$RZZAgrzKFxzUzd z!Ae%Knl-Fto$>40z(zK)nJsK(8{65zPIei;+xUg-VK4jG&jAi5_(L4#2uC@_aZYfO zQ=H}uXF11tE^yJfOI+rPIjwW%XhmwK4`Bm`1vpzPF!G*T#N8b^JuDR7M!XyW=^Q>gMZ(*6~8ep3;k z8O>=STGEQvv=MD-M|(PmAnA0Zljuwry3$Q_Cxae@y!51({`4m75Feored!lRe+Dp6 zW>Ap9O0rERLr@k&$z~Y#a7IK-4kOVhMl*)7SmVfLyh0PuL?$trDQGHDrZFAOU?#Je zjpi_ydCW%(SjZw4V=W<%rID;VgaqUJGr!c(5{9KE1|m%PHfrjj?j)i0;SyyHC|`1m{G i&kN^eeyT{1g+G(~#mV{VhE?{B@0D&wr054fozlNxSdwS} literal 896 zcmc)FRdbX<5QX6i1Wj=Fhp@Q2ySux)ySux)ySqzpcmG9vfn|47l>+Xl_oC1A^yxDb zC+@$IPWm*nyx{-0}n}uY3Xd6$mJ(kirr|MHCG( zizyy>e^DZ$es}&{Dfy3%BuSyPca;)SS{Y@PQ(grXRZ>|MRaH}64K>wLTOD=PQ(prO zHPSdpZKCPV+DvmTwA4y#Z35bA7o1XPuY-;{>8y*cx`pYkhn{-rt&hI?=^soEFwh`_ z4KdU(!;LV~D5H%r);Qx$FwrEFO)=Fp)5Du)m}!>T=9p`q`4(7ck;Rr+YMJF$SZS5j z)>vzu^)}dOlg+l+YMbqL*lCyD_SkEm{SG+jki(8R>X_qBIO&wr&N%Cw^DemPlFP2R z>YD2TH{5i~ZFk&tPjZC&9(d@H$DVlVnde@3>6O>PA7gprt#{ssdr^N>eMmJQ>rK%g ZeTupN9LbORlYQ|uW+wH9Z@$Oe{Q$aEw|oEq diff --git a/graphics/battle_anims/backgrounds/new/bolt_strike.bin b/graphics/battle_anims/backgrounds/new/bolt_strike.bin index 32f51b6fe04f6622fa11ef209a5411354fc50e17..7a42421cfe5d80048db9e21a752d08d0c2f72e86 100644 GIT binary patch literal 780 zcmV~$31AHb0LS6~+rc*1vpMGe{p~Q<%rV38Hc^erR7y!rOj6m3BDH$uTIisaZqMCC zhsY5&Dp#qfbW@bGoaxm1zF;_73J^s!F({TA)I=zbcoL|EYEy^0)I&k)lSmS3KtmeQ znB-)dD6KTmlxCtiEoezA0j4!6B9%1KX(KXdOFP<&4s;}wP9lrWbfIfF66!`a-N_L> z=t(bfMQ{4hmypOKpMG2<`ZIuwxkOw_0RtHXmqp6Nx z%;QNa#8W)Ye4Y`{@*L0eLbx*YA}_Ikh*-!X7PF*0uzV@Ys^XXPvUr78d5zb@m1QNY zU?p#eH+hSmGV9x9LP;f(uZtg zJ39#OWLKp6BR)pE`GimTjQl-CEB5j^Uo0A=FWJXed`-+Ze9Lzu%f3fHu%83`h<@TA zhxi%&!eNeZl;AOrN2*WoEBcL-oZ>V(!&%PpJ37xF{K;SFZ~oz5E};LYMh;j}j&_V= zEm6ZY9cRTm!L?l5s^hw@=b%;JiB56@tDzgYv6HPPZt7-kZnbbrw=!07s<2yIDNc2o z)2%kna9g*t+Pi~0I@9XpEO&MntE;;?+ua?=aS!)&FO?|Qz1_!st&oeU$UyoZ00k*T zVTw?cVic!@nKn?8Qk13)WhqB_Do~M1RHh15sYZ2b5JgRDQJXr{r5^RobTkcO?+s}b z+Z)q_rZl5DEr>F<oy7p2^K;LEI*P z{vw8jEMhTBSZbkLvW(@dU?r|!^2OlmLt z{#bMv|RM2bU1Q4fRqh>Zr=abS1SkVaZ*B@q%vW5S8Rj1<*` zrZhvE6GaPJVztr%-Q75VJ`EK`7B@|i?A(b2}?ySL&?*X1irB4ednk6XSA2PtNX|ZC zKL}z#tGphr#Q_S7iXzH$9a`{LAb~zE^|e=$~CTYL%7K;%DFAv z;VxzI_k{aA;31EM$2_5er@}Ly^Ma6rN?xjhSG*S9P{mu`3Gey9M?MMFeC7*ZYk!vh g`9mGGb^6!-OZfF~#d6k|>RUM9`JrR93K=550f)Za#Q*>R literal 2048 zcmeIy({mnS7(nr4lk3d6*^52r-RGHk zH=Xn{$S9M{vdAi%>>^S~4mstLTb_Wt^2x7&f(j|DNSH!V#S{-Hp=3bFO-w1JQAXJ? zg$U(DD*sPE)T*GON-Bpfgl4RwYLc@Pz9ULC)zwh*zl{VZ=~FGW)loOqeyCPYeGS4E z8fv7mCYr|4EYUp8wa`+lFn()owAD^~9dy)5XI*p+=%#x>4?Xn?3cZsR`sk~l{stIm zkimwC79Ba%u)t5sa3hQ~%IMg_7-Nky-UJg(GT9VU1E$3?-3&9$GTR(;%`-o~w7^1( z0)Me3mRe?ctQ9iG-rsCXFvC{cY!B>Zb_Cu|yX>~dUi<8K zz`=k+4vTTbQO6v2!pYdeDW?PbjI+);?}Cdix$KIouDR}pn{J7Ty6uj;?z!)QhaP$C ziKm`P#29(hYT|2R-S9deeu#^h5m_z(59}!3<$2!_aU>Fp^PdG-DXcI5eIKOk@(8%oL_F z4NYeTGns{EGl#j%L-Sd{LKdOLEMY0j2rOp>D_IrD@cQJ{tYIy|b%B@w>)C)dvWd-X zq3YH^t8Hv2Vh7sEE_SmA?PVYPIe-pwh{GH~M>)oEPN0*V;xuQ_St#dB$^Ipf`Avw|E=9!@Io4`{)BcMs-jiR)m_6itr*vGtZO@1M=^C>&-EQ_Kx{)da$^UZs9jSxb8`ng_)6>wZ>$5AZ+_vIcvIhkBSb+#@{FqpZ;$ zKhm)_x!GK_9XX`-qSFn04GIeA1^Ja@uEn zwo>kMfr@G!b>0_z(YoZzzT&IaHDC7)-?VP|w(t0^bdrjO3&sC8Q3JlqG_4l&1m}sYGR}P?c&_rv^2t zMQ!R(mwMEv0S#$HW17&EW;CY-Eont-+7L-w+R>g4bfgoV=|We!(VZUjq!+#ELtpyQ zp8*VH5Q7=QP=+y_5sYLMqZz|k#xb4=Ok@(1nZi`2F`XIAWEQiT!(8Sup9L&r5sO*E zQkJot6|7_xQNhoISj`&NvMx{|*0X_)Y+^H8*c#N^*#64j!A^Fun?3AhANx7LK@M@4 zBOK)z$2q}CPH~zuoaG$nxxhs(ahWSz$y!A)*)n>*a)9`|{`Lmu&%Cp_gD&w0V? zyuq8i#oN5YyS&Hye87i%#K(NXr+miee8HD|#n*hpw|vL<{J@X=#LxV~ul&aE{K236 z#ozqHYle(rOk)|_IL0-e@l9Yt6Pef~CN-JKO<_t?nc6g_HJ$0rU`8{U*(_!iHJjND zGlx0NWp2aGV_x%_-vSo2kcBN`QHxpJ5|%VXDN9=>V2HATddZh3!g7|kLQq$^Beaj3%_?g&RZ%F&K-tm7Q-1SdMl$xd;q z)12-MXFAK-&T+2uobLh`y2!;YajDB(?h04B$|zU6#JKX6m zce}^E?sLBfJm?`0d&Hw2^SCEG=_yZp#3~?@CWcYb6c+pE<_KH`%=5=p)(_7y5 ij(5H1eINMHM?Ut6PkrWdUj%c}`H#+jbpHRZ`TrM_mOTvs diff --git a/graphics/battle_anims/backgrounds/new/electric_terrain.bin b/graphics/battle_anims/backgrounds/new/electric_terrain.bin index 4404121c7c4c104963cd8f966eb82b914bd73fb0..2c3c757cd2cda17154c139ea993ef4d50c768846 100644 GIT binary patch literal 2020 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 literal 896 zcmZ9IRdbY45JW2k3vP=AIl#r;-5r8EK|^o|?iw6|TX1&`zPLkhcL?tK6KJNksIAo2 zOn0B2`#o#`2?&h$OGu)4Br!?ik$-QJ65xVJW=(RxJ_RXB<(E^FhP0&fBk9d&Ajo;h zXg(8}eSH?P5==I~>+IyfL(cyMa+%L9>LHJLM_yl_k6?W@|NrYi3fNsi3i()JikK^E zycoqPK}kv(D@_@rW&PflGg6)kK30)RRHh15jaQ>OHRNjg+FC|yTdHHbu1GyieM=3j zZ%88=%Y|r~&{Vq_&8=@iOQlxkTib4<+*Z@hQhPZM9q6bX;zH>}XS&c;shj%lgwca= zdfII-+r8EG(e$;{Pp&@$7$^;O5!!M#&xwfxXCSUbBDW1Uhe7kzVw0gA&-nb<_S-E w#&cfql2>YCT^z4@W9?hs@tzOny?o>opXI;sm2W=gC#|B*`=?DyT#{$qXthwF*^HHL6pCnkbW6)CQua z4s{i)M_LxyN-_17Py=#kNF&skCNw1%HKRE#$Rpa4RP2t*&=>WiKLZ$u3K_&;hM=JoF^u781S1*6Xf%egjAJ~Sz(gi78BJj- z)0mECFq2u#Mst|UJm#YXEMyUj(Gr%jjOAzrD=B6bTFn~PvJRE7o(*gy*u-YGuvL-5 zZHjLvWd}RaE_Snry=Wi%Ilw`5h{GJ=C_2VPT+DHFf=jrR%h2Uq!IfNvuI3u9@A zbzIL4=tgehW^O^ZavQgE2fCBHxSM+@x|iU-Fn&L&4}=-vgUWn}hk1mwM|n&+kMo3b z3!fzRlnS2a8T2gA@jNe}7dg!tUP3SP3a|1SdYw0TleY-pR&bVcyo285J>KU7!VeYu zh>!UMeadHi&KD%V1UBjyBOxJR43)^*E z*U@^;a<&rLR(&^cjvHEy+}KUr)XH@;H+Ksw&n?}`t*v~wae>=f?cClS+|laf(4F1I z>gsOp?jBZ8_i}IdanRTO+}{HfNe*Sfk)ukcD2TdTa&-Bomp*LRPX7L3VPGlU(E`Pf#Rz$w&Th7oZ@8C`=KGQjFr1 z0Hh?PLPk-V=)h7YP+7`Ro(fc?5|yb!RjN^)8q}l~wZov8qknNG^PnnX-0Ee z5JN02X+>+=5Jy|u(Vh-;q!XQqrwd)_Mt6G9lV0?u4}IxJe+Dp+K@4UHLm9?!Mlh05 zjAjgDNnjk~nZQIQF_|e$Wg63&!AugF#cbvmXSEO(fD_KP{ zt69TZ*0G)qY-AIg*}_(~@i33@D37t79qeQmkMjgi@)S?=47=IGvpmQ1yue=e@ggs= zp937^5HIrzucqj=)P6ms-$=dQ4E+{|Il@tn1%8`%LLN`a6M;^0iqo9oUEbq;KHx0p z_>hnIm{0hW&p6KoJ`ehWi(KMMzT#`X;d00;T;&?qxxu%5$M^h@+CTCWH@U^n{KBvN z7IZt%9e(Ez{^T$I<{$2IkAL}(|GCdYrZKJQOm7A=n#s&&F{{~(FuOU-X)be{$4K*< z&-@m!poJ`K5sO;P;+7D#q@|3qw9$d0En`{BS>6g(w33yrVpXeI-5S=kmbI;8UF%uj z1~#;jjcsC6o7vnJ#u#f$TiMz+#@W_(wzorYM>~b=Y`k6UYB#&v!=CoCw|(quKl=v_ zaG--6>=1`K%;Ao3q@x_|7{{96ILAA|iB58|Q=IBFr#r)$COXU6&T+2uobLh`y2!;Y fajDB(?h2D!=_-@MYIRs82CZ?e>s;@K@VC(i6Oa3q diff --git a/graphics/battle_anims/backgrounds/new/giga_impact_opponent.bin b/graphics/battle_anims/backgrounds/new/giga_impact_opponent.bin index a55ff2f56d9a53ef07152d362167283f90593bd6..8eb8e48cd2022588546d9c8335f35ea7b345dca6 100644 GIT binary patch literal 704 zcmWN|WmuD87=Y2|`?d*4I0O;Gwgm;)&tJ+KT`q%7qqPX(kRK~y3b zsZ0n}upxFrsY)33YGMedIuU3!s7WnqlOT1dOFimiZ$MH*8qpYOLQ|U29BDyITG1Nc zHnbI6I|&Oz+T)-D9Wi&JGpSwZigcqpJ?M$K7ri^U^r0`(k4XA60LMUrA`OEW%#c8a zjlmULn;0T7jAJ|#uupW_n8ajaU75mE(WWuogBipnMg_*s z#6O-{PTLC8Z02|{mwC<*t@eBz3$zsP)P*c!v9N@tEMvLO3Rbep;=Wo~!&=s{9yTPV zZ)6jjUD?7`i**~@g&pi<7YVT2626DM>=X8LfP);;Im{7`CfSY|NF<5l&IHQ@?F1(| z#c4g>enuaBmUEoPe1VIh<1TR-zhtiHaVgH=m{V7UYh33BH-%f=<_>p-d)(&%4|N{# zm?wJj(-=$YGoJIpk{%?5U-F9Ayb<2=j`w`f`N$`ndfI2<3#okNoA8|<{3K217r*%v zU`>a=hTwmQ(nRUXpp42SDwA?it{H-x%BvLEZQHhO+qP}nwrwZ9JzKM>UqAKgP4~RM=k~2O zaKafE469sm!yOMi@xmJ)eDT8{8vz8WZ;LI@>h6cLNq#33&6h))7NO9*Ne5|NlB zBqbTi2_pq5NkwYXkd}0$CxdmPK}Ir>nJi=_8`%jb2RX?_Zt{?qeB`G95foHih{6=1 zD8(pF3C)+J6s0LcS^Zaz@>HNAm8eV=s#1;W)SxD{6kA($1a+uOJ?hhdhMH(ZW17&E zW;CY-Ev-zgXiXd1(vJ3Y&}1ZSR!2I~nJ$(#`t7>XjqdcIC%x#cUaAj$>1S~!-Jbyr zWDtWL@Ix5NForWi)ksD$nlW~?=`ogZjCa6CCo!17L?$uWAwPwwDqW;{8q=A$VHwL=!Ae$X-D=jbmUXOW0~_^Z6Pww>R<^O79qeQmyX_qI zu$O)8*Xn;0oBIPCWRIIB+1{f9SQ&U1l_T;eiUxXLxI zbAy}Q;x>1<%RR;4*Zcz>@<{K(!yfa5r#$01FL=o-Uh{^xO8JiWeBdLW_{jSxan z1`eEri88_|CZ6I%U@yT3L`u_=SfyzBAs-Qi0b070CYqEo^eHRua+JsMF%>W?Qb|(9 z#V1sz3P~|CC6=nps)jv|>eOIaO^jN^OIB?X@YInAH=knS6&n#Q3lFL;i6oIMr;K{k z=RyM-Vl<+$+-yQqtY&h*IVrS2S+37$Nh^7i6Jr_$pVOK)$QQJw9qlo`q=V#kq!W(L zbWu@V>88p?cBh9&#rpTOyuF~eO6;UVNkqX?)LE#tGw@Ksp%#Ok|Q?KA9=$I%_J^ly^Ea3?{oA-kHoo zW;2Jm%)^>5?lcy#5Lv`xmar82GBR1NZm&RAvWhs@YSbFmvW_g3Z>`ta8`#JX$R;+k zg{{bsY-2k+ulN5_aKLSvg0sEILa~MI43yC zDd99{ILoYm?|K&g4Wtu)C z<2?n4R))6e=xA-%exeI&e;uHU*ma;Ts+|QvT7q>NAv#q1&bm)vXoq%&=rA3QnWw_c F{{glD(u@EA literal 896 zcmY+C1CU%n5I}SPY$g}qo8;n+FV@AjZQIty$;P&A+qP}ncKXlm)n#j{TGOw)r)yj= z|Y(r7*{=_GC;JsHSICb2VxQ;1T)NBJs~_f!7LN`MMf_P+niAQh}aRHzEmeC*sYmdXDE+`ibE diff --git a/graphics/battle_anims/backgrounds/new/grassy_terrain.bin b/graphics/battle_anims/backgrounds/new/grassy_terrain.bin index e955c23199355ec8e14ae9287f1d5b0d0df94635..be2421aaf18efd07a9667f6774effb4c68e6f46a 100644 GIT binary patch literal 2244 zcmchX<#W|{7sSu+LP*eDG&sAkUlIsz!9p(X1b26LcXxMpFYd0zrLMSJC2g@nTbe%4 ztNsI>o!K*U=FGl1J0HLK%{=&!01071NQ7X7z!D<~k|G%_IZ_}Legsllwp2)sH1MZI zI*SZLdRPWzL?&d0WkFVC17JjUjWj51W9An1so&DVU0Bm=2qPnV5yyusN8Ed6*AdfQ49u z#jqtg5~pCNaRz7cG3*@9;{q^ppq8@LI(h1j|X@NdxXb$f~T-&c#aqN0p5@J2|pw5u4ljCSNw*T zuvd7EH+T#C9q;fSf587I{_=%>h=06!^f3VwGJOye#d#JQ%n%B(N(N;Du^D#dQ z7z?rx3$sWFi?Wz`Q7mpO!ICV+(#B|(VGIMtvMk5)tYECjO03K(#;UBw>a1a`$y$tM z?GV;sU0YR;_2a`Eupt|<@o4j!uqm6dxv>RXvK3n!+psO$vAwYaJF*iyhp-E~2E1CHoX^8Va#CiYLf3et=Am9rgHG@9Pq<hB~wx*ktJ4$ zf{{oTq=ZVKt?}hk8AYqKtdvTsgo?|eR7^!xL{?aZR8R$E`IS$3l}8q-+{&d0S-5h_ zNwOTuE()@2YN-}#E^DTyYNE!nMrx=AsxPajx~ikvvRKtpP1TT9S2a~t6!qIRq3*J7>Z&g4EbF9>>Y(Jqt&uix}}@C5r4yN+|C`eo!rIU+(X;TecaCjw1d2^Yq~1CqRYCZi?RzkuXBp0 z)mfd!50qE4)X|)@)+$nPw*s9(N6OW&+=p1IiBYWJ(oSxQ$5jR*&{vF z1KpS1(_P)sZTXY9#K9L5^8)Q6+vdH*%k*F2)$qt`yiWUspYk*MTtd&8`{2v;m+Vjd zq4#>Hc!Isv8@-m7(>eD!zX;!CU-Bz{&2MPm@;iRd8?>9e#oJ8hEUio9QoB^nQaZm2 zbtzm(awc<)qbj)a=E}LUF5qI!m2uIov@2z?8xY8zu+ zEmzakFjw7Gb5&gxbCq2sSJ4eTjr>u!2DtvNUm(=q*Y&YccX*d}kN5e24{4A1m{0hW z-ZMVu3;y7B^4ht!obINDG_k2}iks{vIh*JvxbbcrQ~t=Gyr7>M7je>l;jjFSFB$ZT muldHy@-|{x@b7%b_iz5kqW=O&|Ki}A5C7=x|HnU0v%dkz!kLo* literal 4096 zcmeH}WpofZ9K@k$ad(-4`Qyc1i@RHKDDLj=UWyfWcXxMpcXxL`F7$ezj_>z@zIn;Z zCi!J|XZK|i5*`SJ&b93@Z^rBE7WP!{D-9u-g#l~5T~P!-is9X_amny7`^sDrwwhx%v$Uo=D` zG)5CNMKd%<3$#Qlv_>1WMLV=d2XsUybVe6+MK^Ru5A;MY^hO`_ML+b%01U(+48{-) z#V`!V2#mxijD{b^z#n5V4&yNa6A^$(n2afyifNdR8JLM#n2kA@i+Pxj1z3nhSd1lD zie*@i6Ld=%YEaY2*Hr_U?_%W7>50=!ZAEO8G#Xl6p4`; zg;5!e(HVm=8H=$QhjAH?@tJ@LnTUy3GB}?HkRW!-tC4HT>nH@0yxRllR3rJ9vEl-oa*LI<8;p8 zOxHKdm4Eo@oK1hn2iTk-ey$q}pr3hQ9_PFE0{U?w7X|W*xr9lSSc#Mn2^3%P6jvUI zqu7e2n2O=r(G^Wm6-AL1Nf8x6o(ivU2&*s(tx#IZkjk%o%Bwuetz62f9Llb2%Bn2N ztW3(N3`#FArBhm^QEH`9N~MrVO0Hz0prop+I;yQ&s;L_CQFT>QRaH@CRZ>M&PzbBvIahEcS8+Aha4pwyJvVS8H}RxS=(vvQsE+8c4(Xr{Xg~I8 zul8uScIkuOyBy!lE!@g&+|C``$z9ydJ>1KE+|L6%$Y*-0Cwi<$dZ-7wuY02lJOhj^I2UPpM8$9Oz2;ZE=*Pw_O*(8EGn2>a>&hrjeg-}Oyj^#z~xNgtKM z%+B&$U{0Us1zzMOUgi~Ew`N?HjkZpEyqbqSpRi}7J+>tr2+ zt~*$J$KT>@-r-%|<9$BhLq6hTKH*b7<8$Y8L-XY*8|laqHr$5UP#a={ZIBJ*3%+zN ryyELXU*7O7-|;;^@FPFD{?CDT`@*mM7M%aV=bvB){$L0G@BIH8EQrX# diff --git a/graphics/battle_anims/backgrounds/new/high_speed.bin b/graphics/battle_anims/backgrounds/new/high_speed.bin index ca049478cca1889c44ad706ffadbc7110464f9c0..52f7a9c51adec65bb3246326a8062aa05e32fca7 100644 GIT binary patch literal 496 zcmXAm*HRQ=6ok*&b(|en+yNIsSK(6!1S6Oe@?%cGnzN2sF|CSX0>*%1023f)#P|?i z=$m-$)jWbbWp#B`cUAXASGz%6>Xc9;WSv;3eQW1zw4N>;Ht#v0bL zPVDu+{Svo)0~^^ywQi=7CYr@cHb}$tmG9Eu7)3aE|j_ASYbp5|?QeTD&V@NRM|&~`e6P6BRoN4U#9y7KhyOYsA`d6?i4kHvmMPq)~;JaujF8D-CT@&6%{ vR8y7Hm-Nw(4DgCU20VF9pEt-G051{oX-F%-iLH$r5jQAR5;##rNwH^D@cOjc-$sVz)1-3&8>BD2gk$6WKw zw?MIlX^Skj#8S&F54oawAKzD6Wp#41Mv1l7g;`>Ka+WH!!A6^Gw#C-aTC>e|JM8?+ zE-Ab1Nw?pdOu1LeKKmVTF#Hasl{u^|*^fBtm~zLRaMCHKopIJV70xSgb*-HST-hp+_MfdlK@gXK_Z)z3?(CiGn{~sa2=mYYpn7 dH)^8>Z@p6&z4yUKpM3VkSKoa1!%vNVX#$JCrpf>S diff --git a/graphics/battle_anims/backgrounds/new/hydro_cannon.bin b/graphics/battle_anims/backgrounds/new/hydro_cannon.bin index dcfd45407609c01a85438a45a9c2f10f3280d67e..0d5168cd782d06959b63ca86b2c6bf4c53a4868c 100644 GIT binary patch literal 880 zcmc(dSx-|z0EK5Lcqz4|f~aVb4=PsWqD94m6fcXoi@5JnSH!h$sJOI<3%FI>cX2^P zO^lDm7ypRKRsX;cHAaoWd!O_lka?M$e94(P=Xixz1SLuaT}e0)$)qp{4J{QXX-bN8 z6^eV^E(YVqBS^=~5Hd^^QbuKMCPT>*3}ZMW$S!51Dpp1$HVU60htcGMhdlCCk&>0~ z{em$RFqVLWag1kz3Md(m#0t?VVxnLYL5i7dD!-*`QYGxDKk~Bk{=w?DJNV( zh00dae%*||z!&?5+n`cqS%|IX>s3?}t+6RnmgzH*waj8Rb5xE6bfskIbD4*n&jJ=w zm-Nn5c}hmLMbxv{!4j6Ttopn1TWrv^oE5AjWfiMg(^f2$?6(d7KLa3`@>@@Py|Y4J zoBU=S>%(mL@hRd|A+Ngu5n&^n*ovfV=yNvd2K@tPfio$O*a zd&2B3_-K8}XwHtJ?PEU&EJT`yILINIIgIZJM^%B9U91IhjN_c(B+;0iTU?9Nia13Z zr#VCPtX)+{<2l+99h~O^7x7&pv#-fofvZjzmq~DiPDWqln%36WZAJg~y5I&kxy9`; zcjO=2y(MuMagX~v;31_A`cEt8mc%2v1dn;bQ=Wb9ZB&K75?OSoC7yfe;f2k#27IaX d@-i*)ir4+Wt8jnq{8!filx3S+Q?iyR{sJutMDG9q literal 4096 zcmeH}XIIof6oy$uX%^T;1Svj(*ccVXhBP}Mur^SzfDHsuL9w7zv5P2z6#>PHz>hRB za+1x4WV2uRk~8Pz%srFm-kEo1?pznHSz0Lb2xC4A2q%I_q70ic9nC@(v6v;q5R2Q8 zRQ&0A4{kB z6IpC#iw#!xkj+-Mv7H_4B*!Kz^Sj6;kNhA=W&Q;L>ZJVb`z>U5&~ekm9`>>?C_YE* z=Ku#OqS!X?79|{_lrqZkO1tm7A}i}KM>xtcj#KgfDdI%Q?<-fs0%sUFaFD?axPwI_kMh1C4~5 zva%mv{t8W8#%{+Hdgk&OE)?-niG;3lmBv)cH#xXm5z(#Aa#wfyHG$G=ZI9dyz~ zw=LF14-e?&A&+>>6I-l@r#$01FX-bX{dg>uR_E>&uXxP>Zy01qdV{TZNo9L@%RAol zfscHW)*d)3*Q3LHW`t43s1?f2sh-Vx(R|@6<9y>gKYZ#eGfEy)>d~K4J^G8^Oz6(r iO#Nu=#VeBe!=zM?PBA@81wA*n-ihic;3(iI5W-*d{ZKLh diff --git a/graphics/battle_anims/backgrounds/new/hydro_pump.bin b/graphics/battle_anims/backgrounds/new/hydro_pump.bin index 917b5c6c966b2c7a2e4851293923ffa014bc4307..0f7e6a5d913d4051a8fc58c1029c3ff3092c61f2 100644 GIT binary patch literal 224 zcmXw!xe}~CHm{*?Pc`S!`;p3tBbRf(MJb+JEONY)>cL@EzHe~p8V$nFkx2# diff --git a/graphics/battle_anims/backgrounds/new/inferno_overdrive.bin b/graphics/battle_anims/backgrounds/new/inferno_overdrive.bin index 01cb5610350eb2f55db2aadcf9a6dcb3da67dec9..d9a955d592dcb2e694b917854a5065810ceee32a 100644 GIT binary patch literal 556 zcmWmB_n*%N9Ki86#~B^2tRwn9rLs9CvdJz&vezk+kr~Roj7rK3S=oC_MujhBuk2+0 z3HK-T`27BSyncCQ=VwF|Qdou}qNq&86c;6w^nxr=N@-wDyS%O zR8rZ?qKc|sk&>q%l}=Ujs_Nl2uX{s{P*W|n)d_XgQ(uEzxe06NP4SjS-qu(&@s6gN ziRM~psg<18+9a&4cSAevbyfaY;zPZBq_^m!uYUTA0R|dm zu*@Nb%1hX=@Uc$}HzIs$q|b~Bqm41v=NZNsZ$iRiqDdzELQFB$G+&CZOgFCuj}}{EX*$U*v)l^tla*FkEq=DfTITa7o9%Yk8FtxikG)}^{SG*o>rlcDJ0gB{)NhW7<4!o~ckzcmopM^vndDYF zb=JA?m%p8NAzXCHWmm#g*Iaia%T50z?3TFgj=S!O`yTk$L-C(S9(yA5sb`)iOvL{k Clbi4W literal 896 zcmajU(|QnK007W$wX9{=*_M`VtgW_e+qSv1v~1h9ZQEG&C_Tb|Zcl^^GK!Q*W?5vF zO?EltluK@TM2QG|Uisu#KtY8RRzy+76jwq?rIbeKqs53-Mp@;QS3#VLDygiBs;a3j z^flB}OKo-3RZo2lG}K6AO*GX^ywEq7AW;h~B}vvwYi+dEPJ116)Jf<&>!Pb}y6d5* zUV7`JuYUR)V4y)lKiCjM4Kv&bBaJfJ7-Nky-UJg(68g!em};8oW|(P~+2)vQp7~NN zuu$k1S!{_^OD(h93M-{qWwkZdT4%k`Z?MrOn{BbxHrws6(=NO1vDZHPh5mqp4ms?I zqmDW5gp*D=?ToX|IWP1VTy)80S6p??bvN8}%WZeubRj>N<3t z#!@%ke15|diN;C+F~kyw;weXY5>N#yQi;l_3ROuYf~rxS8YH1)YEp~Z#MPlL^`hzZ zQ3Dzh0y2$AAr+<3m~@(;rZl5DEl^8Z(V7g@hPJe$J&_J{EC@T%8Fis6nRG+l=|NAj zP%nDZhrXyE{mCW=4PYRH7>tH6l$_LI1i1`n1S1tHk9e^ zD$~$(W-yakL}oKb;aujSLgur8g{X){EM^HRri7&|L(5sgN>-uOtYIzdP?S>2SdTWa zkxgtyTiD7rwxbDlf`*?|$c?G@7YrM{W zA_q8F5FX+U^d^Tn!dvKV-r-%|L+^8xV|;)<}dr>iDw9Y<9Ghx&#V;v#owIe9QucUInM?3 z-^B=lW2{)mIo{<=d1r(PuHcGtC0BM8SH+16Bd+G^at$Xr*)`=_uI)OmE7x;Zs}HXYiGEP+sf_S-W}Xg?&Qwy;;wS0yScl2#JH!k z+)H6^xsUt0pZg~`+c^rd(+0=`J;;MSL>}s4&h>D4ghx8h`SK`__85y&C@+Yp6OYh?K$#X&vT*Y%L}~FMP4K?_7WGnL|*D;UhWn0O0V*2uaVb! Zoue+5%e>wjyiwld&EDdz@-}a`{s$53-NXO@ literal 896 zcmYky1$2-F6oz48FuJ?n7dE=P8#ZEecXxMpBaMOqN+_wM(%1n?Dq(<<%4maB;b$sm z=R5bF@7(9cAub`rBR-)dAR&oJOcIikjO3&sC8hL}7|hlwuU81SKg&>E~XCvXrAd6{tuhDpQ53RHHgIs7Wnq z6G0?(s7pQS6Ga0e!y3|v#x$X6;LT`G3tG~O*0iB5?PyO2I?{>GbfGKV=uQuM(u>}K z_n|NS=+6KKGKj$pVJO2G&Im>_iqVW=EaMo@1ST?x$xLA?)0oZ-W-^P}%waAsGLQKz zU?GcG%o3LJ5-+oi<-EeHyvFOSU?p$xCaYM@8rJd_Z?lf|Y+xgs*vvb;%NDk>jqU7U zC-3n-yV%Vh_Og%t9N-`y@F5@ZF`w`$pYb_g@FjJ9qnZ2AYJTgH@n-zp7yf0ee7#L`#Zpa4sx(V9O^KKJHnBUao~_d!HG_C TvQwPuG^abmna*;ybDZl_wrT!$ diff --git a/graphics/battle_anims/backgrounds/new/malicious_moonsault.bin b/graphics/battle_anims/backgrounds/new/malicious_moonsault.bin index 03bdeabc7f25c1b93996e63783c1fb1f42fe58d2..37874dd0bfe49071e27547deb84976adcb9b6a3f 100644 GIT binary patch literal 544 zcmWmCX;(~f9KiA4zcJNVGSndJcW#rVEL|D9y4EC7wq(5_WF1R(`ZJd7QX=bQ-y-`? z*?Zs|FQIe1f&0u;;|+Wte9qUaU1BO66^e_&<@j{O-3B+Y#0l|uXiGbxJsn7(qk)(7 zPIM+SQAol^7rF}FNTxeIgr4-GH+^CNKZaFgNFap(sq_{4(VqdN3F!=E5QBvwWMDEh zflP*3;ZX3mB5WrH8P14|V(tFpC`T1|Ml#CrMcgu)F^pv#l0`Nayeg;2^$ zR6Y^7!Tsn*RkoD*s}&jsp)i(KL| zSG1+Ba*YV}!gX$NlUs0G|GmRq?g{sKz(X2ZZ8NHt_lU#cSaW lZ+XXi;R7G}L{l`|%xAvvRrtnte(*Dk79ISrAAO=+{s92=kXrx% literal 896 zcmbW!W0Rv%5QgE(+BUCbvo>aJ+qP}nwr$(C@vk;{CzIKl+0BQou2X&b^mBLjsSXLH zupDxx$i~TBa?2yHeDW)xph5~OqNrj4S6qp}msCn=Wt3G;c@Z+%{1{!Llu_l^ome6KWS?8BfgrsS%MG&QT$mo-m_;=h=t7Nsmt6FQL zt#;b$prcMY>!Pb}y6d5*UV7`JuYUR)V4y(;8)B$oh8tm|Q7Nl4+8AR~YO+o>&Uh0{ zG|6OBOf}7PGt4y0Y;(-bR%@R57FcMJ#g71LsxP_W1Nw2^4UZhP#t&wd9SbSO~8Hxthvj-5CWb|iRD|HDzo9CyM= zr<``iS?3aV-USz3a@iGEU32{p>V}(cx$Ta-?j?x~GP}R;frlP>?1`tId7iWvUV7!V eH{N>Zy$?Pn?32&F`0AVQe)#EElF6k1_x2mV$hNrv diff --git a/graphics/battle_anims/backgrounds/new/max_lightning.bin b/graphics/battle_anims/backgrounds/new/max_lightning.bin index af4c39c1c0bc0ea0260ddccddc8ca26d7dbe7069..43511aa7249cd273fa4affd23208c11ec2f72fda 100644 GIT binary patch literal 744 zcmWN<34GRb0LSs~Z_oaF_U!4|^WPq`&1j$B{F70ZBT~wCB`~7_uLIzNNlbW32=jdIB45c1HW97a#_5m*X1oVX{`izDcbj--&II2!e#FUL@X z`f)7BaXdPK{+!53XaFZOkU{7a1~Y_HQJi9iG7Ob)8mDsxI+NjyU?dvFXwKqnRLVJ= z%NTSXV>zF3=mIWeJQtyhnZPAniZ0`FCUOP3lB>9yN$47`dg07jy?d|bUsWUyEdxr||Y{_dXEi6mK5~kD4P}yB!?&cmjej-0%e1GY^%w!g` z)0o3t1ko&lw2gHLsL?u;X5fAeSi$#@J=`CTYSjM9~#&YpE zPf*R11+0*Hil-H<@fE4z8CFs&o~4de)Qbk5<9S{Xt7-7+y*1)R*07eBD&)LOqr#26 z(kA1E)++Z^nv|csj`eJi*@&8H;Wb`IZ}289UbE-E#oIFP(2CyWJ>KU7oDcbkj}>i| z<8GoY9{Pk&(Py;N!Diy0EB_0=WV5FZZwp)a3TG={^Nm8CiWGOr`IhhaUZ&O!cVT{z z`H^j6J3q05pWzn;cCw3KA)&x;>}HQI=Xdt9k8WSlKlqcs*k7ycZpHq8fWK4uhkq52 uHL^)IV3VzrYEx`5Zc=S%mcnT^YMG=>_b5u3o#lySux)3%gtF0J{ql3`DWP#%@rtP_et#)^~B4K}LT# zXU=&~-0w4BgDr+XU?<5Qhj^V4N1SlR1y_u?#arAl;ejV!Bqj+-Nk(!~kdjoSCJkvx zM|wb!fsANDCNh(StYjlQImk&aa+8O=V9W$hFJ4Zxx*4{ac_qIqmSGFen-exBN@eL(J}w| zhp~)fJQJA6B)LAq$-*hZslsWJe3;G*W-^P}%)u8w<}#1@EWl6u>V+&~F-us=GM2M~ zm8@d5U=3?U{U!Ocj`eI{Bb(Sv0D){_E8EykpbpSM>>!9>c8cyIL^Oom0*eb4?qRR! zKK64!aF9^KIK*L&aFj3|s*iD8aDs47a*ETO;VkDkFF9QF0vE0B5|_EcRU(Mwnk?73 zL8Ok*QABZ*TioW3xVyq=(Ra*cJCK4Ir3jk_`_ L57|u0Q+cUhGC~MW diff --git a/graphics/battle_anims/backgrounds/new/misty_terrain.bin b/graphics/battle_anims/backgrounds/new/misty_terrain.bin index 26e3cfae3d9c9143977021d1a36cd2d36e23aea3..6276967546d3f3459fd0509cd33037dba178e1b7 100644 GIT binary patch literal 2180 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 M2f}#S|9|HHU&mRtwEzGB diff --git a/graphics/battle_anims/backgrounds/new/neverending_nightmare.bin b/graphics/battle_anims/backgrounds/new/neverending_nightmare.bin index 647896804cda780d923488d5816e2f666fd06f3c..e450f144151475420a9615aa3835806d3c934f27 100644 GIT binary patch literal 744 zcmWO4RX~#g6oAqDkBKNEnMCn$nEstZiXub4yy$ z8k^9DwzQ*tva~L0bf6=hFgnwPu5=?sy3>Q6^g?>mhrYxh{pimC1|owP%n*iR9>#D+ z*uqC5c48UDXe?tGD+%Kmk7WWAC210qkts}N8q+amFq2u#7Q>jsT;?&~Hc}R_kT@10 zivr@P7T}32W(iAKhQyP=auSghtYj6dku|Jk9qWnQV0dq2lPzg8#um1+jqPH{4tBDO z-N+vHvXA}90S+oJ;)_DWn>a TTY~*HKm*k)j|Mry(}2i-F5t-B literal 896 zcma*kRZtvJ5QX6^?#|-yH!Kh%?g?=r?(XjHO5EME#NCZJad&rjh`Z~}klhzjRO(dq zJWPN0o|@62`x^@^vBDY~Y_Y>02OM$285dk}!(GJ#PrUF(j}N~1;ZFd81QARKAcPWz zfp8*-R5C5;NKXb$W+aMCWF`w)$wqc^kds{GCJ%YFQGm^ubwvR(}0FFqA^WqN;7qSa+=eE zmb9WZZD^})wxc~A=tw6z(}k{dqdPt5NiTZShraZqKLgA@mVpdnFhdy1Fx783BN)jj z^?o#C7|S@uGl7XrVlq=yrZSD`%rN_z%)&?+$uH7~sdvh!5uI3wrC5oz z*odvziM=?8qr~H+l(V>qYbrV#H*psa@f0t$M-WhshA0QpP9v=>JNuxare#@L zY19>B!+}(^j6jQqMO3sk$!;XXy$`BkFVT2Pwq!>mNLy5*o zgt&;o%`g&Ti6g1d7EgkZ$Z(QKw!|}n6jJ#=D{10QXQYrpCRt=#Ql3LDdE`4NV3g$@ zO`+i76pA?2l7=yy#_5cOaRkobOwJOD8IP9|!AB_*I2+Ef0+F1{L}3z>nZkLNw3kuN z`BZdEk+ZXsDlWjdkf}^#y7b8mF5+S?K`vz`)y$$~Hl7;%)KXIyoK`q6hk7m(F6Roa zVs?iG|p2<`x$DJ+~qO7IPaGu11=C z6L04Zf0f+HT`XZKmCO8fcL$G!upHM4?lGG0Wu?&~_i;a~cmRsCU2PAtnl-{hJj^4k zZSu9Q<58L$+aD7iC&&{#DYUSjRyLSC#nU|F>wi|*$R;+k1=`Y#t+ex;gXej{KiI*G z!b`l&E4(Uf<25>Y-9Z=KrS9$Q5Z>TTdU(r9^S#YGyvt5_&#ZW#UOuplF@1c{c&O}=9v`)dQ=3kNvJAr1#?R~|7tj`9OP z3di_~pE+)sJ%jwhuly$b&I$hDPX~YTcWu`{{0sk;_KF&6+SR6ZHR?4~bci}MOvAe+ z${iM=ks77OP>oinx^VkqNObEkjTMi?X}l(AqB@6bl6aGKgc>QDs;HKDB~8Z+Ok-g`YWHC9+-gDrO0 zMAdnz}2~iYE7~y~rp(v6lqKP4vI7RU! zkVq2Aq*e64(vhAFWF!-rm6nC9WFtE{bU!D#$W01)$V)!*Q-FdLqOduuol%6M6r(sL zD5)rwQk15Qn$f(nl%qTqs7NI$E3QISs!^R9)T9=*siRNSr5^QZpilgN)xW(Vjc800 zn$nEsrr&~=w4ya_NKMjmZE0tE7TVK+j&!24u63a+-RMpaGtrY?^rjDe=|_J<9l$`- zAH-mWFqC1YGTiL6+w2&@NJgn{G-K2{mT`<{0x5BtJCR9DW(rf8#&pG6&0r?8j9%l} z%waC`n9l+hvWUejVJXXu#Bx@!l2xo`jjpU^9qZY^M)QPCY-S5v*~WHuu#;WvW)FJ} ze;@lfz(EdiSXYj4lw%y{grbw2;S|U zJKW_S_j$lW9+}z4JmD$Ncy1~$RQHlsyygvWdB=OjANa^8KJ$gIeB(Pm_-W>U@tZ#e zr4cK!78|h@^~+)}4&o?I;;cw37qN(|xQV-Xh^MZ3>8rQ+h_CAW#9sm=P=X{_QHX>} en1l-=ddfnCL`sxION_)yoWx6lBubJb>+WB&5yRO4 diff --git a/graphics/battle_anims/backgrounds/new/psychic_terrain.bin b/graphics/battle_anims/backgrounds/new/psychic_terrain.bin index 0ef28b6debc484d34812e071beccd9105151a70b..a661ab77aac267a72774a3e31d116c10cc79211b 100644 GIT binary patch literal 1904 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 X{h#vxlajzEoIv8%{8)egU;Y0l8x2FS diff --git a/graphics/battle_anims/backgrounds/new/rock_wrecker.bin b/graphics/battle_anims/backgrounds/new/rock_wrecker.bin index 8aaa57b01be4c25426a35dc0040bbdfd1fa205f2..58410f9bdc8ff4b9d25909161517b50400474230 100644 GIT binary patch literal 676 zcmWNLWpI=S7zW=b9B@G4?!${NM}Pna4aKc|L4yZ(IINUX+@<9R7Tn!}ySqbihvG$w zy9DcR@^5E$c4qzI6ebZt3OvY@l2iz#CbO3`rnIgv9kD+oiS$-113vJF}C}S#1Im#Oqs7NI$hfTjw1(z73D%Ge?4XA0VMJ%^D zX%bRX^EC_5+?*D)G_^8X(}uRR3y0L64ut5KTz8@~UFhoNSGtAt8{HFJ{Z0?lAM}i% z7rp5dQr~0dM5`bD8GsFB5Q7g0 z(KLz4#7uEDm1#_Om2w6%nPr-7j?G~%^O%nou#iP8cI7N#sc9LBVZ|&b(+XCyDpAgA z)|l3^&Xuia0~^_dXER&aYTAaoJyAQ@$u9i6*<;$vgkVCn_OU;#100Ot5QjMu($NTx zah$(RC!#oMIz_tEoJqbvOaI`2sB>^0U7%<1qL)itMpsCtt6X#S57)&FZqg+fC*9&U zcerbg|6lHz?(+aWyylJRb!6;YbKc?Cdp>yi YNK#mz_#BVE@Re_g`rl8fU>{-j9a=N1jsO4v literal 896 zcmZw6WmJ=K7>4l!ip^#h#-&c3`r6ptt<3J6m{?#JwqSR67Z{*mf*ljPyPXNvXCMB& zzHaC2{JuQb{dnO`DpD&xq`^x`OFGhv40>lIlLx-?HDM;R!E7;+g{))~*~vjpa*>-n z|%@B zwz7@wZg#L!>|(cW4}00iehv^pq&UbSH-|Yw6ww?N#|YC>#1QM^I43yCDNY;C5Jx;` z#W~K43+leeCFL@~T8Q-uSCwl7X%4QFpxnU0O>XIKbBDX!!>;{vp9ehTkt~mSBA)V$ z=e*!0uawuk@#rn@crQK>pe6f=lTX5F`7Fy9l6~bH-$`_l#1G{szxeIu5B}PJe*vVk B6bJwS diff --git a/graphics/battle_anims/backgrounds/new/shattered_psyche.bin b/graphics/battle_anims/backgrounds/new/shattered_psyche.bin index 233f54c10477c49c18eb12233c141defcf7094ce..225d8e95f306009a6aab40fd1a56d2f9e74400f8 100644 GIT binary patch literal 808 zcmWO4iDS-n9Ki9<_xJ4Ceslh2#%zxFXOA)S#2n>ne$VV#5*0pi3H@uvXN5o*^Aq>Y$I3@y{V5FEL6ctkpDNYGW;vi9! zBAU`j3}q-wEKWJ%#KdEe@>HNAm1qTNN@^qtxSg|PO z^CoZcHetPahdz?umyCYm_Gdt*J5UP6&maaf1Q|*W?=lSMJ%*c%_sPYC7{N$J8DIEl z@)#q-95WWiW#$I?fbkwaWC9aSx?|)cCNY^Q$W%UN8q@L4;1gzQk546EK4TWM`5gNT zGW;opUoyvLF7w39=PO|WU-J#$hD_7%SjhJ*N@B5@^@CZkgry;Qu#DxbVC8s|vx?Q~ zT_f(=5biwIF*s?xO+FjU*g9-XW|N67Fh@3!7(+*krSNc6sL(g z!&$4-Km2QD#h&AQsF8E&0vCl#T;>W_g=<{r1~-LU+~y8Dn%Es+cPln_Cw6ytcPn;xcXxMpcf0O^VVrN~{5WSn z-(GvqF=0h&tVx575nJrA*Ery)NsANCxZsK#?xe#5PrUHP2VeX&=`oQ3e*y>u!;7Kq z2{OE;!;xSz5<)0pgcCs|QJBd@X7yRrXC)iii6#d*$whARXhUA|k>9WdC`cg+t1m)P zicy>xVktpMN>N%HOq8K4CTvrkZ9nH_p(4mb9WZZD>n7+UwpO=%~IEol|@lJ%gF9B+!lS^q?ob=uIE>ed$Mk z1~8C8I^ST1FjTE2!x*08V;I3mMlqT(I)f!+8OL}gFp)`2W(rf8#&m7)V}{z9%wjfk zm`kiV=>+qb&jJ=|7O|KmEM*zX^&VG{$VyhRT07UMUduZ5>)F6YHtEcp*uu@f`);vkNa zRuc8bEO8P~wVpVOi@1uLxJw-A#6vujJG{gXZwbLie8o@FO9t_mcmfO`D2Nz7NP=~Z ZB^lL+NT}`7L6l?5aZDVCNhc1XbMxA#&k4;RAw>@&1MdBNkj9P&jJ>rMJ#3sOVKixvx1dq z6{}f8I$Fy**0TX^WD}d&g0`}a?d(81*~M=55Vn_n?B{^ObdU@VaTp!pD91RCPH>V_ zoJN_P;VkFSc`k5~OXxCJxXLwjof|yH!UMeadHi&KKxQzT#`XLEmzR@Aw}5z+LX~Bl?M- z`GsH6eSYJ2{y=~77k~2)`j`KB@Tgs3&f;)qwX!+8b2z6J;atw`JXT)kbAAV`0xsx6 zE^HNXQAfI%Roo?9(xt4@F5|Msvdg)=D_9j>$(3Ejs_JTvaY1Kp&GsD6b(%HL^S!_etwmn!C0=SR^K!57N^6x@dyUhrwO;4--e7I?CU5o@ zYpb_;yLVVSz0143$J*!Z1k6R~v(x-gd%JdnZ^*QUjFZiM_ xS(kmqSAEU8?i-c@=zpo9xKLzB_mgiYXC|d5DJ2*aj82RS>P~z_;;n>?*oPEd4TAsx literal 896 zcmWO10}>bj0Kl->w%5+KZQHhO+qP}nwr$(Cy~_&{kU#_`2tf%(a6%B0P=qE7VF^cg zA`p>CL?#MRiAHo{5R+KMCJu3lM|?mMkdQ@0trU*qTMsZ3|l2VkW3}q=tc`8tmN>ru_RjEdGYEY9} z)TRz~sYiVp(2zznrU^}HMsr%wl2){)4Q**hdpgjOPIRUVUFk-5deDELd)dc+4seh|9Oei|ImU5LaFSD; z<_u>!$9XPrkxN|W3Rk(tb#8EzTioUjce%%X9`KMyJmv{cdB$^I@RC=&<_&Lo$9q2T zkxzW)3t#!hcYg4bU;O3|e+ghf0~y#L1~r($4Pi(_8QL(0HJss%U_>Js*(gRen$eA6 zOk)|_IL0-e@kLEwLKB(TBqlYP$xUHOQ<>T{rZt`E&0t0|nb|C6HJjPZVNP?I+dSqq zpZP6dK?_;fA{Mon#Vuh;OIg}7mbIMatzbnfS=lO9wVKtfVNGjU+d9^@p7m{DLmS!H zCN{O1&23>zTiMz+wzZw@?O;bc+1W03wVU1TVNZM6+dlTSpZy)+KnFS4Ar5tz!yVyB zM>*Otj&+>lo!~?#IoT;rb(+(i;Y?>a+d0m4p7UMcLKnH%CI1IYUFLFExYAXwc8zOY Z=Xy7|(M@i4i(B31c6YebUG8>|{{R5J02=@R diff --git a/graphics/battle_anims/backgrounds/new/snuggle_forever.bin b/graphics/battle_anims/backgrounds/new/snuggle_forever.bin index 3abd4431783972300e5c4d0ca3c7a872b26b0aee..a4bcc4440d2d31ceb954cbd82d167f0607304af4 100644 GIT binary patch literal 988 zcmV~$1z-&b0LS6~v+-t(H!(5e_vek_jp>dt-QC^YUDMs&F?AhWaKRndo#KM);7;C& z3%)Ou86^eCMikK~J2?mvgK`o}E^-ryBM*5ADX6$`Jo(6v3Q&*)3XxG*@kJ;~VpLd( z6eEe^s03h2qEdtjMUqiz%8)`zB)Tl+D6galN~Ho7Nh3X3fe4kT911F2g{oAex~M@- zYEfI%p)U2PFB;I0bQ+1qWYC1Bq8ZI;K}*q!*0iCmXh(YzQaXr^bfPm|L|3}eogShm zz35FJ(U*SoXMh;UAO91@2)!ciWHx=d%5UO#u5gt<#GhQ_Iyb~kZgHEx#NXWEF89QJ{^4K#6aVu7IUr|ql%t(p z&f%bAoKucv_)fe0hNvdXX2)OT5&}yj))4 zm0so5@*1!8IEc%wIYbEX1Yyw%&hUEblH-sRo$9`E%&?@#jql0we%LB||&R&pp6 F=^@Y~?;-#I literal 896 zcmW-X1#lDw6a|6c5C|3=cHsg64tIBVcXxMpcXyYdElve(k-DNS(n4LJg0#3@GCT9$ zpT93Y2?!%0iAYQml9G(%q#z~Xq#`vDp$-qEAuZ`hPX;2%NT$#yGg;zXSRgCe$W9J& z0+Nf|1c(Smk%zoQ6CKP)ehP$akb)GVFhz(85u_-^VmnZr5|pGAr71&M%2A#QRHPD> zsX|q%QJospq!zWQLtW}op9VCf5shg=WOP%S(VP~vq!q1cLtEO>o(^=R6P@WoSGv)i z9`vLaz3D?=`q7^O3}g_48NyJ8F`N;MWE7(r!&t^Ko(W835|f$2RHiYV8O&rBvzfzO z<}sfIEMyUjS;A75v78mGWEHDf!&=s{o(*hd6Pww>R<;qtc6P9nUF>ELZ}4Uud*gB+ z`#Hct4snPD zLmu&%Cp_gD&w0U1UJ=juCNRu|CNi-}OlmTdo5GZao66Kin8viGGrbv%G^3f!Y!MEiZNMn=nAd3Ynco5iEodPNTg0Lkv$!QJX(>xv#Od)vpp z_OrhO9OxhiJH(+5bGRcM=_p4##<7lbyc3-0Bquw?sZMjcGo0xxXFJEa&U3yCT<9Vf ryTqj~bGa*A8Df>IUE^BUx!w(Kbd#Ii;#RlC+1N#l+udPIRP6m4$fWka diff --git a/graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.bin b/graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.bin index 9bbee7ab43894b318dcfee60baefe1ca5cfdd132..44eb2f82d37873ec3d8612aa44f9cd175742750e 100644 GIT binary patch literal 968 zcmWO31!I*30EW@`V|Tz9uuC^QFWsX%HoCjJyBS@hySp2cMhSyZP*709E-X^%HaUOc zgcBpAfFwi^LXjjT8Oc!;DTpQ|N=0g72%|KlB^~Ke1~QU~%qR<4$wqdRgPi07WO9>- zyeJ>}DL_F~h{6=1C@MyAVkv=2Qi{@)L1igNc`BfaRH8CfP*ti?oj4Rv4Qf&g)us-0 zsfX&*fQB?ejcGztnxW>jpe3zPYueD3cBnla=tw8jnJ#pt8|qFEdeRH^rVoAThx#*s zfeb=}8NyJ85e#PpBS|38C`L1ev1lCQnZQIeiOEbM5lv+p)0u&0GK<;FL35eMd={XE zEMhTB2rXq9%N49ZD_O;A)}XblV?7(tMmDjTEodv-*v<~LlU=;RtLQae=MCOOyV=8D z_M!b8;2?+4TfEI-j-aC);~m~b@9{pzIYHz}PVoW3hlq~I$0nP2#o-_Y+|<2pA8ZgPv;{GmX9a)-Oz zL-%>WLmr{WJmD$N2tDToe-ZqR{^4K#dzr7mNgUyj73ri-=HynCQ#jfwtyE6!7>BJi zPV00|Z)I>sXL4pMi?ceLvs*cw)47ag=XM_FwemT?3%Hsj^PzzyBVYV0O%>Sk7R zw{T0hvRb>1+q#|A-W}Z0ovhC8;;!yyb$1W5Lh3mcm literal 896 zcmZY5XLJq*0EJAD-q(n|#ol`p#NM&@2(dSbnb>;&@4cwnF4Bp>lHpYSQ4@j0hB%^A+}1z++NU-J#$a*p#{ z;3D7gJ(sx54*@^&6F+l>tNg;RT;n>w@jExT8E}i++~F>N@F#!qH~095fBBF9xzB@S z4|&96o{++nrZTl@OlvyRo53J6n#s&&F{|0kZVrPDF{ioAZK!$7Yd-TEW&sOYNYug> zv8crix40!NX(>xv#(MndfiV;?|n$@jgO>0@(I@YzG^=)878`;<zTiMz+wzZw@jkJRu?PQdl?P6EE+1(!Yw3of@V_*B(-)ILo&_T%tJH(+5bGRcM z=_p4##<7lbyfIF2qOneLvQwPuH17ren(ho|2G%TRJ13C2&U3yCj5FSafnMZdm$=kr jCYb1QSGdwuu6B)UUFUi?xY12+c8gox=5}|OWDHLM_?`P! diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.bin b/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.bin index 44fab7fee209711e834a46e3c57c69bf169bee9e..e6227db9c9d8e449155452362f88ca325272b8be 100644 GIT binary patch literal 1000 zcmWO4heODD0LJ0BK~$(v*`Js1k5E#Ptz=X7UPYnoO&K|E@9hR|@4a#R+}?NG-h1D1 zd!Kv$h9_lvoD@SWam1qrG$esWs4}igIv^;Jn|_(1tCA=g&j-mQu=4Stt$T7>_0}k&$5%@spXtR2`g# zrZa(x9Q(^|iqJ->IIgQiN8Jx*k zoQ=-mT+ZWsbO9H#i;K|3T*9U7Mtj)H-moWVcesqpxdL6uu5cAsqieX9>$o1>z>VC* z&FB_x!y5cUV{3-|K?50df_4^#gLkD|vo$m2YLp5!T> z<{9)X&+$Ajpci?GmwAPlS2@ICUQ>(?heP3Y-av2i7H{(odYAWjpAXQ7e8k6mf(_lp`Fa=x8_+^dmpJV=I+jR&i`wp)cPLIbx%3Z`7UrTxwi}5$9?5~?(YE} zC=c>r7r9s-;t~(_P(>xtFc0?#d89{qU^H4DpE+*w|J|!S#?ouv?;2$HbmPUq+@J@?P34` literal 896 zcmW-dbyyZ=97QLnAYdT^_PO|b1@uD%6a!QQ6$9)pP>`?_0RwE;p_>b9vt743UFfEp zZn~KZW7DM_3v(O#+`sR0&b{UE!kh9`pdvo_QVBo&37|4ns7f`e6G#n$s7Wv(gc52Y z7HqW$vf2b%9qLk#`ZNGU7!5HTjR+@#NE*`w4^cEFnr6fhOB`_)YcbZGXlp@~c`Tlm zw4ya_NFb56w4*&qbRd}&I?{>Gq|$}1bfY_Iq?2xG)`On(qBp75hraZqf7yls3}g_4 z8NyJ8F`N-(kjY3!kwrG6$sw0K^2xV6%e5REL$+nvSjI7)2~1=XlbOO)rZJrYW>82G z#mr^OVs9AJ0QP%p*L?V?53iJjqimWf@QN49j_z z=XjnMSiwqGvC3B33R}$@UgRZ~+gjGKo(*hd6Pww>%e=y?yvFOi!JE9r+q}cOyvO@& zWgFYsZrg0DeZUTO@*yAH=YPy6>|!^c@)>*B%jbN-KKAn^UvYqge9bo;;xI=zT9zYr z*p6|WZ~2bz`GFIh`D zzlryF@een+$t`Ykhr9gCe>|Xa@{+g8tAZ-ZN4}~gKlv*_0nXp~xyq`ds;Z{y3RDdR zsiuMzqEOXRZPig-)l+>n5R$^wP$s8F3Ri?873m^exNEE?@+eAS?%w}R6|H89QLN(B zTrCu@mTINeYNG@ts;%0oy^_>H$x2a*OLiUANu8CdE=qJ=)lJ=%rgZgCPxVr7^-*8- zQ-2N6Kn>Dh4be~y({PPYhBB4uGTcawQkJqcS~<$qJ%c>uYmCNfoW^T{CTfxFwuX}0F5*cG`#SE2$}s{a90+wKkk diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_player.bin b/graphics/battle_anims/backgrounds/new/spacial_rend_player.bin index 7b479c88d672f56c52b5a2633d6b41aec8cdedca..cae5112e003a1b2d5924c329d59bd2231481a186 100644 GIT binary patch literal 996 zcmWO41!ENi7>3bz$>>XO+v?$fOooC@X43W@LoYBP~)RB~+U_)TJJ(PXii~K#gcj6PluC zG^YjGD2JA`qBUwmTiO94+C|%F6KWl;qGjZSOnW*IC`m^;(V6rvbfudLyQ3cTq!+zW zA9CqS9?GYHe)J0!M1JH&-%xJ!iQds44PYRJ3_^n$LJ>pJForXNkt9YjT5F0aL8Xjg zEaT94CNLq!hsMR&7!#$Tk|>UeOhRQ$W(rf$G^R6ynIvX0Ticp52hF9Nc~qeJR8mDX zTEK#+j;c^)%#Vtg7b=g1EaEV9I7e_KN1>xRhGRJn9nT4z$VupA7PEw zRk1QwgqFv$SQ<-0i{lhda4R=uFPyY|bJ5T+ZYClwlX3wXEYp)}xEqz(zKq zO|daH#KmZRT*A6o8@iOsxST7{m0ZQuT!XIVIx}OJlkcZI2Ji? zJ9fph>KU7^dTSdG5gSd_Q$^X z1bxb9e9jl>OTOZ3zCqve9pCc<`jMabnP1Sa{KoJ6f&SzGfAKf^hkvQzAUedMI2bh{ zImM|?vkpYMGn{GFa+Yhmj#bz7T;C0x)zAqy+TO^GGY5pe3znO&i+Mj`nn*Bb|sNo&*v}BAFCY zNh6(*obEKII>pIOa-v0Nx?lpj(v9x)peMaTY;XF|mwsfBNfz1UkV_u<>mwC)*0Sj5gA}{m;&-Xmf^&HRk`CPzaF61IE<`ORDGA`!|u4D;I zLk*U(oE5BO6{}gpTGp}7YrV$nS>+9^@N#ct6Pww>R<7b|uHjm)<9cr3MsDI}ZsAt8 zaT~XD2Y0fa9qjOS-^JbB!@X?tecaCjJjg>l%p*L?V?53iJjqi$%`?Y0c$S^);yHG+ zhrR4$pZ9u?cl&vEd8c3CMPA}%_H%$&c$L?9oi})sw?gdOyu-V^$NPN1hkV4x9OMv( ze9)ipDWCBZ)$)t{&>CUh1tr>Z^XrP^Pk!tsLblFXY@HC&*WS4bVUh(qIkIPz}>? zjnGJq(rAs*SQV&HMJiSmB`Q^!$~8_EsyxnD1{J}0P0&P5(qvU>il%CsrfY_(Rij$f Osa_3gRFh_Emi_~I!0bK% diff --git a/graphics/battle_anims/backgrounds/new/trick_room.bin b/graphics/battle_anims/backgrounds/new/trick_room.bin index 46060d16872da113592443a101f7bdd0175e4848..197f57922a016298c3dc72a88ef4bdd23d6c7fb7 100644 GIT binary patch literal 844 zcmWlUXLwU(07l;=y-h+>zNGDKIw(0`dVvU6t)nX92#7Mpf{F}Lac_$o7qJQ!91LY6 zqAYRCt`?Q$9#wGRR-6b9h7+{>de4vZJm-1ixsVhfNQgYLj+}hLI9|_)Oq4cq3&@KR z^9q$}i=tkLh!-Pa$XC?y@?^4c)g~ySn0N`UoKljMxLz5iTy6!bq|&SKiYaPGiJUSo zZb~P~xUE~{xu}XrCgevm`^)VK`HtUEZz6sy6U&-tyJkI9=aUmCRF_(x-xs1!XLR`sJ)H6z4%{5%hb>ez%;6_G^o4A=g6=E4(UR<8|KPP4O0Q^A0T$-sL?xo7mi_g7^7Ai55Q0;e5o$Y~d5} zDWCB$a-tP!TS=mwt)jg3XM3BX8f)ie I6KQq(A2#90!T;g6Rzv*sxbkY9lW5ljenVJKnP zwQ$1|3nPdmQj5@ni6TT8uEl$(G`kk>L7JT;SR5wZ>M#qFV$#j}f4As1hwZOhb(8LP z_mtbsj%Yv;L#$Af6RZ7qv}o<$dyJ-VyL&3$lgY2-q`*N+Qjr>+G^8aR>B&GwGLe}q zWF;Hf$w5wXk()f^B_H`IKtT#om?9LV7{w_;NlH=yOIp#IHngQ3?dd>AI?r62tn zz(Co`AUT5>!cc}WoDqy<6r&l#SjI7)2~1=XlbOO)rZJrv%#@wXVm5P_D{UV0g$r27 zA{MiRr7UAPD_F@YR>&DV<%2_v0Lb54}00iehzSuLmcJ^ zM>)oEPH>V_oaPKJ&T>w8o(sZ@ToSstZ14(KxyE&FaFbiy<_=E%F87GjuW_FTVh?#F zbn1_JV&qeU&vFsuVelAcx~1E@jN5965qn9LZ70(Nu5@$0EmZJhPdD9pVJp zcp@j^p4`xBaSEp*mCWTd<{?$gr<&6-3#efswPNH9&SVj1VV%u6oGYW}VV}uEz)a|1VW6Q-S;xrJNBk=y9tb~>@|;LgVCySN*<`v{sUgLG%z*$=vI7e6u}#Uni2Vh zA%0~KWy3Z9KYQ6{Dy$KH<9AQrANWW4Q-}UyKaOvJzxl`1{p*<~qDDRHRT;)opGK%e zYLxaeMy;_LtsbvGMv2vg{958PUUUFk{hA<}sN*zA$BRzTFv&VGpef>{YRIIiKV35j iW-4w_RI@Z&1M22TX`<$8o?7ip(#hgXQ9EA?B>W!;y3VWs literal 896 zcmY+?V{jc&7=Ym>xoK?s{bJR&ZCj~rBXv`^scqY~ackRc>ZW$jZg1~2^Udt+p0m&U zWA|8Ki4_Jl)}+TqUA22#?6AiHN1SlR1y|f~$3x%K_6>OAg*QI<;-{Yc2_TRlf(ZeH zP{If&f=Hr>CWctzh$jOX$wX$dkd3nETGXZvb*V>v8qknNG^Pm&YMRoF=Cq(C zt!S;@ZbMtzrSa|QKu0>6);iOLu5_b2J?Kd0$E~s;LkxN|W3Rk(tb#8D|FWgdAo7>#s zE=JSbO{}&qz`8oEN-Qg;&bH<_&LoN2=KydCvz`_{b+dEBl47 zeAE4Re&{}hpZrq(xAN)4LM+8fQZb0Nq!$~p6(e?HFAidVb0EW@`V`4IxVhu$fY%EknW{cfow_7eD2ST~QHa7s zQbZI5q9`VcQ-YF|5~V3aG-X9O%2R=gB8Ey-rizHADsfa3@p!0C4N;R?)TWN8OFa^( zFB;I0Ml=>pXi77hix#w`6|F@Z5@}02(Vh-;q?71O7rN3-bf*VB=_PuTL?8N!e)MMm z1H~W)GlZdH7{eLCNHL1hjA5)8$9N`?EG9CE$xIPbnZ|Txh!nicWR{rC9Og1l%x3`$ zStJ&-grzJK%UQunR*BWDVJ+*#dN#0;O(K=eY+|;L%JfvkN z;5^8oP!4m%x~<7DN5wIYbApo|PT5Fne8HzVBhGS;^IQPGOd1!tBrX%+3Rgq8#&sL3 zup8(mx46w6BJOgJ_(aEjpVJ@210M3om+)9T;VI8}?%)M4Ne{$WBR{Wr%^UQVcf98V s`bY+!_)PK_8*NQe>Q}|N%r^($`N2;cWsTRD{)^xI;cvjY1OJfz13JB^$^ZZW literal 896 zcmbWvV{aG$6h`69w*AbuZQHhO+qP|XHagq3%^$IL$+C7?vTivaZf^3P6Hd7QBz%w; zK}3;67DZIiL>EI$vBVZfT=B%0KthQmmPAs?B$q-;sic+$X{D211{r0NSr%DklU)uu z<&s+-dF7K|0Rb=6Z}0}VCO zSQAY((_9NJwbEJ}ZMD;02OV|NSr=V((_Ife_0n4(ef87d00Rv&*bqYvGu#LxjWXI8 zV~sQ31QSg%*%VVvGu;d`%`)2@bImi~0t+p&*b+-Ev)l?Rt+Lu0Ypt{11{-a%*%n)E z6A)&$+hM0&Vcv%<@3zNY`|Nk%pZ$XlIqZm|jtLARz;P#>bjoRGoOSMx#q%z>=#tB> zxcb8jc7wSV>I-z;4L3tIZn^D_yY9K~frr2Ce|AFNM;?3Psb`*h;iXqzd*f{w%wLsv YK~^yDeeltze{zE>pMCMwx4(Md0VT#JbN~PV diff --git a/graphics/battle_anims/backgrounds/new/waterfall.bin b/graphics/battle_anims/backgrounds/new/waterfall.bin index 076beeff2fe1ba44277bad014102fbcc7c3180bc..0fbe00ac638522361e182ee6aa56cbdf876bec29 100644 GIT binary patch literal 2128 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 Hx;NlI69yLt diff --git a/graphics/battle_anims/backgrounds/new/zmove_activate.bin b/graphics/battle_anims/backgrounds/new/zmove_activate.bin index 45bca27ec42a025931df57a2b2f6d9f6995de56c..b089a822d3e50c5ffda895b665d2b2eecc041067 100644 GIT binary patch literal 520 zcmYL^$5#^p7zckJn_y6*8?a*;B_g6I*ek3JtQfKPwPQ!@l?bT8f{48#V(-E3jX#Nt zXXQN(ygAHV$BjEGGTN<+e_h#Ge>>F>Op!SRoAaFjSwT|imQ-G-y`arWqdRU7ddkA| z!tITVMMy^(^r0{Pu>K5SAcJJeWH3V*iiQEh89^Y6C?kE#CN>JoQO0O;(HO>($2c^e zdP%KJV$RZYtB`jqbrMWEk zEGAn)uq?z%R>>)g#>8sYu$FaVJsa4_Cb5|W)I~F-}bW4xBVOt z2RX!HD&p7?DyfVf6~{Qv2~H+tr#OwB;jB2vc`i`ZCa1#UT%;P+P|GDQqbnq+<0`tw zb#73P-K2qAGv0#`pL|JQ`fWJb@qM- zdvMaE{r3+)kS<+~kl$)Xw`!@aPMGTc^>RJ+HPA3gwC-px<ZP|n`s$~@0R|dmupx#TX1EbX$~8(}WVC!^6jW0f znkr+1af%chZ-R*?nQV%wrllk$O%F*bF~iJ|l0?!hv&}KrJo7EE&?1X1vD7llBP*=5 z%4%z@jjgjjw!uc5Y_`SL$Tp=)6Wi^u(=NM%J@!V*?6Y6F0}h7#amZmu9CgfbC!BQ3 zX=j{u&UqJHbjf8`f~%2ht_L?#+fBFJcE?@!-1opkk39CoQ_np2!b`8b_QqT9ypMhG dF{MJKibU1+$!A|ezJ{hUOy7JD?+-s?zW_AAo!0;W diff --git a/graphics/battle_anims/backgrounds/new/zmove_mountain.bin b/graphics/battle_anims/backgrounds/new/zmove_mountain.bin index 86ad39727be021279c7f1520b2ef376f464e3619..74f6bdbae5098967cea09a85266fde638285afcd 100644 GIT binary patch literal 760 zcmWO4g?|)u9LM3$?{>HCw!vAd-T?(E}vJ0F-Vp zXhf+IN@IY95`uIcNUEUw7oOJ>2t`N^4-t3?`f!m%5sm!B5K9~?LQ&!gpahDMNO6=z z2}+WTH-%D^mMeqGQjYR~j8rO+hSI4>B`V`Gs6r-La^7qnpsM`UP<3ihlLt`_wWv)U zRF`_xrvWaPhiFJpPK{_x6PlujX~rWo$NMOc@p#ZZfm+a#RTxYuA)RkxGMjm>W=jcuk)RSI3&kML0d5M>KC0Ms0>{|PK(}!14UtXgh{m}ph zGKj$>zs`_w<_R~HH^iH~#oG)MA%-)8kzy318N*l)`HW+HUd;*O9VRk~$@y|qcvo&J z?}_*MfDf4_2Bb}A1|Nx!naM0>i#g0?9`j>Zz(U&l8)vRGH>+r4T3pP;y%R<_(*vKZi&1ef-DPS9s+u6a+VD1#(*YFMPcCnj1 z9`>@2{kQ|-Am8#G--{nO#9@AfpF+7m^9#R*m~ez6X}|G%Do2@djN@u}Lj1u=PVr|9 zr#T~cR%g$}ah?m|VPVHbaf!=Z;i?F8jqCgsa_Kj?$t`Y+JKW`O{uxn_^Dp7$RbwM;^j|h6TlLbSj-ZwxGc#^SV@ag wMzWCvSiuzKccR{%m4rY literal 896 zcmaiu18|*D5Juw{+dP}RIH_&hOl`YO>Nd4)rncSGw%ydW?cV%(lX>lQrgLWY?(V(k zn`??0=2&2+=(AHq4`Twfz zXio<^(uvM=A)W-f(v9x)_^%m9PkPatKJ+D#e)MMm0~y3%hA@<23}-}o#z;mnnlX%3 zjAOiF0u!0UWTr5cc>Oe{GlQATVm3+4VJ`ES&jJ>zghk3(Y{U|ls%aU^S;0zHv053a ztYIzdv~E2c*vKX}vxTjinM^X<*v<~cPIj@IJ?v#4`#E5+(=yWPK@Mr#!yMr#$2iUj zjgy?>G-o)=InHx|i(E3YFLQ;f+MGg){u|>;V$>M&jTJR9;v&>JmINP zg7F{z?4R+R7rf*ZuX)2;-YM%nANa^8KJ$gIeETcsJ3sho*!{vpOvOxLu2l=M6f4n* zwV1@FZf(R?>?8?$aS%swQe7&};-WfNaT9m(5Kr+EU8J}8h_CpGzXXVh1WJ$~BEb?O ZdI^;@KZ^I=*%ZQXHiIy0NmEYoV0a*Y5 diff --git a/graphics/battle_anims/backgrounds/spacial_rend_opponent.bin b/graphics/battle_anims/backgrounds/spacial_rend_opponent.bin index 44fab7fee209711e834a46e3c57c69bf169bee9e..e6227db9c9d8e449155452362f88ca325272b8be 100644 GIT binary patch literal 1000 zcmWO4heODD0LJ0BK~$(v*`Js1k5E#Ptz=X7UPYnoO&K|E@9hR|@4a#R+}?NG-h1D1 zd!Kv$h9_lvoD@SWam1qrG$esWs4}igIv^;Jn|_(1tCA=g&j-mQu=4Stt$T7>_0}k&$5%@spXtR2`g# zrZa(x9Q(^|iqJ->IIgQiN8Jx*k zoQ=-mT+ZWsbO9H#i;K|3T*9U7Mtj)H-moWVcesqpxdL6uu5cAsqieX9>$o1>z>VC* z&FB_x!y5cUV{3-|K?50df_4^#gLkD|vo$m2YLp5!T> z<{9)X&+$Ajpci?GmwAPlS2@ICUQ>(?heP3Y-av2i7H{(odYAWjpAXQ7e8k6mf(_lp`Fa=x8_+^dmpJV=I+jR&i`wp)cPLIbx%3Z`7UrTxwi}5$9?5~?(YE} zC=c>r7r9s-;t~(_P(>xtFc0?#d89{qU^H4DpE+*w|J|!S#?ouv?;2$HbmPUq+@J@?P34` literal 896 zcmW-dbyyZ=97QLnAYdT^_PO|b1@uD%6a!QQ6$9)pP>`?_0RwE;p_>b9vt743UFfEp zZn~KZW7DM_3v(O#+`sR0&b{UE!kh9`pdvo_QVBo&37|4ns7f`e6G#n$s7Wv(gc52Y z7HqW$vf2b%9qLk#`ZNGU7!5HTjR+@#NE*`w4^cEFnr6fhOB`_)YcbZGXlp@~c`Tlm zw4ya_NFb56w4*&qbRd}&I?{>Gq|$}1bfY_Iq?2xG)`On(qBp75hraZqf7yls3}g_4 z8NyJ8F`N-(kjY3!kwrG6$sw0K^2xV6%e5REL$+nvSjI7)2~1=XlbOO)rZJrYW>82G z#mr^OVs9AJ0QP%p*L?V?53iJjqimWf@QN49j_z z=XjnMSiwqGvC3B33R}$@UgRZ~+gjGKo(*hd6Pww>%e=y?yvFOi!JE9r+q}cOyvO@& zWgFYsZrg0DeZUTO@*yAH=YPy6>|!^c@)>*B%jbN-KKAn^UvYqge9bo;;xI=zT9zYr z*p6|WZ~2bz`GFIh`D zzlryF@een+$t`Ykhr9gCe>|Xa@{+g8tAZ-ZN4}~gKlv*_0nXp~xyq`ds;Z{y3RDdR zsiuMzqEOXRZPig-)l+>n5R$^wP$s8F3Ri?873m^exNEE?@+eAS?%w}R6|H89QLN(B zTrCu@mTINeYNG@ts;%0oy^_>H$x2a*OLiUANu8CdE=qJ=)lJ=%rgZgCPxVr7^-*8- zQ-2N6Kn>Dh4be~y({PPYhBB4uGTcawQkJqcS~<$qJ%c>uYmCNfoW^T{CTfxFwuX}0F5*cG`#SE2$}s{a90+wKkk diff --git a/graphics/battle_anims/backgrounds/spacial_rend_player.bin b/graphics/battle_anims/backgrounds/spacial_rend_player.bin index 7b479c88d672f56c52b5a2633d6b41aec8cdedca..cae5112e003a1b2d5924c329d59bd2231481a186 100644 GIT binary patch literal 996 zcmWO41!ENi7>3bz$>>XO+v?$fOooC@X43W@LoYBP~)RB~+U_)TJJ(PXii~K#gcj6PluC zG^YjGD2JA`qBUwmTiO94+C|%F6KWl;qGjZSOnW*IC`m^;(V6rvbfudLyQ3cTq!+zW zA9CqS9?GYHe)J0!M1JH&-%xJ!iQds44PYRJ3_^n$LJ>pJForXNkt9YjT5F0aL8Xjg zEaT94CNLq!hsMR&7!#$Tk|>UeOhRQ$W(rf$G^R6ynIvX0Ticp52hF9Nc~qeJR8mDX zTEK#+j;c^)%#Vtg7b=g1EaEV9I7e_KN1>xRhGRJn9nT4z$VupA7PEw zRk1QwgqFv$SQ<-0i{lhda4R=uFPyY|bJ5T+ZYClwlX3wXEYp)}xEqz(zKq zO|daH#KmZRT*A6o8@iOsxST7{m0ZQuT!XIVIx}OJlkcZI2Ji? zJ9fph>KU7^dTSdG5gSd_Q$^X z1bxb9e9jl>OTOZ3zCqve9pCc<`jMabnP1Sa{KoJ6f&SzGfAKf^hkvQzAUedMI2bh{ zImM|?vkpYMGn{GFa+Yhmj#bz7T;C0x)zAqy+TO^GGY5pe3znO&i+Mj`nn*Bb|sNo&*v}BAFCY zNh6(*obEKII>pIOa-v0Nx?lpj(v9x)peMaTY;XF|mwsfBNfz1UkV_u<>mwC)*0Sj5gA}{m;&-Xmf^&HRk`CPzaF61IE<`ORDGA`!|u4D;I zLk*U(oE5BO6{}gpTGp}7YrV$nS>+9^@N#ct6Pww>R<7b|uHjm)<9cr3MsDI}ZsAt8 zaT~XD2Y0fa9qjOS-^JbB!@X?tecaCjJjg>l%p*L?V?53iJjqi$%`?Y0c$S^);yHG+ zhrR4$pZ9u?cl&vEd8c3CMPA}%_H%$&c$L?9oi})sw?gdOyu-V^$NPN1hkV4x9OMv( ze9)ipDWCBZ)$)t{&>CUh1tr>Z^XrP^Pk!tsLblFXY@HC&*WS4bVUh(qIkIPz}>? zjnGJq(rAs*SQV&HMJiSmB`Q^!$~8_EsyxnD1{J}0P0&P5(qvU>il%CsrfY_(Rij$f Osa_3gRFh_Emi_~I!0bK% From 52054e4bfefde6572fa19a74240a9187d4147b64 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 30 Oct 2021 21:12:18 +1300 Subject: [PATCH 144/193] Fix Corrosion, Poison Touch - CanBePoisoned now calls CanPoisonType instead of overriding it. Poison Touch now activates only if the attacker actually damaged the target. Partially implemented Pastel Veil. --- include/battle_util.h | 2 +- src/battle_ai_util.c | 2 +- src/battle_script_commands.c | 14 ++++---------- src/battle_util.c | 24 +++++++++++++----------- 4 files changed, 19 insertions(+), 23 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index d98c511e2..6caa939b9 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -167,7 +167,7 @@ bool32 IsEntrainmentBannedAbilityAttacker(u16 ability); bool32 IsEntrainmentTargetOrSimpleBeamBannedAbility(u16 ability); bool32 CanSleep(u8 battlerId); -bool32 CanBePoisoned(u8 battlerId); +bool32 CanBePoisoned(u8 gBattlerAttacker, u8 battlerTarget); bool32 CanBeBurned(u8 battlerId); bool32 CanBeParalyzed(u8 battlerId); bool32 CanBeFrozen(u8 battlerId); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index fef6e6c6f..9640df2b4 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2616,7 +2616,7 @@ bool32 AI_CanPutToSleep(u8 battlerAtk, u8 battlerDef, u16 defAbility, u16 move, bool32 AI_CanBePoisoned(u8 battler, u16 ability) { if (ability == ABILITY_IMMUNITY - || ability == ABILITY_PASTEL_VEIL + || IsAbilityOnSide(battler, ABILITY_PASTEL_VEIL) || gBattleMons[battler].status1 & STATUS1_ANY || IsAbilityStatusProtected(battler) || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c5c922d8e..49cc8540e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2682,9 +2682,7 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT; RESET_RETURN } - if (!CanPoisonType(gBattleScripting.battler, gEffectBattler)) - break; - if (!CanBePoisoned(gEffectBattler)) + if (!CanBePoisoned(gBattleScripting.battler, gEffectBattler)) break; statusChanged = TRUE; @@ -2809,11 +2807,8 @@ void SetMoveEffect(bool32 primary, u32 certain) } if (gBattleMons[gEffectBattler].status1) break; - if (CanPoisonType(gBattleScripting.battler, gEffectBattler)) + if (CanBePoisoned(gBattleScripting.battler, gEffectBattler)) { - if (!CanBePoisoned(gEffectBattler)) - break; - // It's redundant, because at this point we know the status1 value is 0. gBattleMons[gEffectBattler].status1 &= ~(STATUS1_TOXIC_POISON); gBattleMons[gEffectBattler].status1 &= ~(STATUS1_POISON); @@ -7257,9 +7252,8 @@ static void HandleTerrainMove(u32 moveEffect) bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget) { - return (GetBattlerAbility(battlerAttacker) == ABILITY_CORROSION - || !(IS_BATTLER_OF_TYPE(battlerTarget, TYPE_POISON) - || IS_BATTLER_OF_TYPE(battlerTarget, TYPE_STEEL))); + return ((GetBattlerAbility(battlerAttacker) == ABILITY_CORROSION && gBattleMoves[gCurrentMove].split == SPLIT_STATUS) + || !(IS_BATTLER_OF_TYPE(battlerTarget, TYPE_POISON) || IS_BATTLER_OF_TYPE(battlerTarget, TYPE_STEEL))); } bool32 CanParalyzeType(u8 battlerAttacker, u8 battlerTarget) diff --git a/src/battle_util.c b/src/battle_util.c index fe957e464..5dbe42227 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4961,7 +4961,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED - && CanBePoisoned(gBattlerAttacker) + && CanBePoisoned(gBattlerAttacker, gBattlerTarget) && IsMoveMakingContact(move, gBattlerAttacker) && (Random() % 3) == 0) { @@ -5148,8 +5148,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerTarget].hp != 0 && !gProtectStructs[gBattlerTarget].confusionSelfDmg - && CanBePoisoned(gBattlerTarget) + && CanBePoisoned(gBattlerAttacker, gBattlerTarget) && IsMoveMakingContact(move, gBattlerAttacker) + && TARGET_TURN_DAMAGED // Need to actually hit the target && (Random() % 3) == 0) { gBattleScripting.moveEffect = MOVE_EFFECT_POISON; @@ -5589,18 +5590,19 @@ bool32 CanSleep(u8 battlerId) return TRUE; } -bool32 CanBePoisoned(u8 battlerId) +bool32 CanBePoisoned(u8 battlerAttacker, u8 battlerTarget) { - u16 ability = GetBattlerAbility(battlerId); - if (IS_BATTLER_OF_TYPE(battlerId, TYPE_POISON) - || IS_BATTLER_OF_TYPE(battlerId, TYPE_STEEL) - || gSideStatuses[GetBattlerSide(battlerId)] & SIDE_STATUS_SAFEGUARD - || gBattleMons[battlerId].status1 & STATUS1_ANY + u16 ability = GetBattlerAbility(battlerTarget); + + if (!(CanPoisonType(battlerAttacker, battlerTarget)) + || gSideStatuses[GetBattlerSide(battlerTarget)] & SIDE_STATUS_SAFEGUARD + || gBattleMons[battlerTarget].status1 & STATUS1_ANY || ability == ABILITY_IMMUNITY || ability == ABILITY_COMATOSE - || gBattleMons[battlerId].status1 & STATUS1_ANY - || IsAbilityStatusProtected(battlerId) - || IsBattlerTerrainAffected(battlerId, STATUS_FIELD_MISTY_TERRAIN)) + || IsAbilityOnSide(battlerTarget, ABILITY_PASTEL_VEIL) + || gBattleMons[battlerTarget].status1 & STATUS1_ANY + || IsAbilityStatusProtected(battlerTarget) + || IsBattlerTerrainAffected(battlerTarget, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; } From 799852ea772fa605ee3bc82e1431484592829070 Mon Sep 17 00:00:00 2001 From: Blackforest92 Date: Sat, 30 Oct 2021 17:00:55 +0700 Subject: [PATCH 145/193] Introduce alternate Steel Beam --- data/battle_anim_scripts.s | 87 +++++++++++-------- .../backgrounds/new/steel_beam_bg.pal | 19 ++++ .../battle_anims/sprites/new/steel_beam.pal | 19 ++++ include/constants/battle_anim.h | 3 + include/graphics.h | 3 +- src/battle_anim.c | 4 + src/battle_anim_effects_1.c | 39 +++++++++ src/graphics.c | 2 + 8 files changed, 139 insertions(+), 37 deletions(-) create mode 100644 graphics/battle_anims/backgrounds/new/steel_beam_bg.pal create mode 100644 graphics/battle_anims/sprites/new/steel_beam.pal diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 994bc5cc1..ada08afc5 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -13940,47 +13940,62 @@ Move_ETERNA_BEAM:: goto Move_HYPER_BEAM Move_STEEL_BEAM:: + loadspritegfx ANIM_TAG_CLAW_SLASH + loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 + createvisualtask AnimTask_MetallicShine, 5, 0, 0, 0 + delay 48 loadspritegfx ANIM_TAG_ELECTRIC_ORBS loadspritegfx ANIM_TAG_GUST - loadspritegfx ANIM_TAG_SPIKES - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x0 0x10 0x6B59 @To gray launchtask AnimTask_ElectricChargingParticles 0x2 0x4 0x0 0x14 0x0 0x2 - playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x14 - loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 0x9, 15 - launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_ATTACKER 0x0 0x4 72 0x1 - call SteelBeamShards - call SteelBeamShards - launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_TARGET, -30, 0x0 TRUE 145 - call SteelBeamShards - call SteelBeamShards - call SteelBeamShards - call SteelBeamShards - call SteelBeamShards - call SteelBeamShards - call SteelBeamShards - call SteelBeamShards - call SteelBeamShards - call SteelBeamShards - call SteelBeamShards - call SteelBeamShards - call SteelBeamShards - call SteelBeamShards - call SteelBeamShards - call SteelBeamShards - waitforvisualfinish - launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_TARGET 0x0 0x6 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xE 0x0 0x6B59 @From gray + loadspritegfx ANIM_TAG_STEEL_BEAM + call SetSteelBeamBackground + panse_1B SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 + createvisualtask AnimTask_CreateSmallSteelBeamOrbs, 5 + createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 0 + delay 4 + createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 1 + delay 4 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 0, 10, RGB(24, 24, 48) + createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 2 + delay 4 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 65, 1 + createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 3 + delay 4 + createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 4 + delay 4 + createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 5 + delay 4 + createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 6 + delay 4 + call SteelBeam_Continuity + call SteelBeam_Continuity waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 10, 0, RGB(24, 24, 48) + call UnsetHighSpeedBg end -SteelBeamShards: - launchtemplate gSteelBeamSpikeShardTemplate 0x80, 0x5 0xf 0xf 0x14 0x0 0x0 - launchtemplate gSteelBeamSpikeShardTemplate 0x80, 0x5 0xf 0xf 0x14 0xa 0x5 - launchtemplate gSteelBeamSpikeShardTemplate 0x80, 0x5 0xf 0xf 0x14 0xfff6 0xfffb - delay 0x2 - launchtemplate gSteelBeamSpikeShardTemplate 0x80, 0x5 0xf 0xf 0x14 0x14 0xa - launchtemplate gSteelBeamSpikeShardTemplate 0x80, 0x5 0xf 0xf 0x14 0xffec 0xfff6 - delay 0x2 +SteelBeam_Continuity: + createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 0 + delay 4 + createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 1 + delay 4 + createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 2 + delay 4 + createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 3 + delay 4 + createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 4 + delay 4 + createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 5 + delay 4 + createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 6 + delay 4 + return +SetSteelBeamBackground: + createvisualtask AnimTask_GetAttackerSide, 2 + jumprettrue SetSteelBeamBgPlayer + fadetobg BG_STEEL_BEAM_OPPONENT + goto SetHighSpeedBgFade +SetSteelBeamBgPlayer: + fadetobg BG_STEEL_BEAM_PLAYER Move_EXPANDING_FORCE:: end @to do: diff --git a/graphics/battle_anims/backgrounds/new/steel_beam_bg.pal b/graphics/battle_anims/backgrounds/new/steel_beam_bg.pal new file mode 100644 index 000000000..428e564c2 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/steel_beam_bg.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +184 192 224 +168 176 208 +144 152 192 +112 120 168 +96 104 160 +88 96 144 +80 88 136 +72 80 120 +64 72 112 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/sprites/new/steel_beam.pal b/graphics/battle_anims/sprites/new/steel_beam.pal new file mode 100644 index 000000000..f9448fcdd --- /dev/null +++ b/graphics/battle_anims/sprites/new/steel_beam.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +112 120 208 +128 136 216 +144 152 224 +160 168 232 +176 184 240 +192 200 248 +208 216 248 +248 248 248 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +248 192 216 +248 248 168 +0 0 0 diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 7fd515bdf..e67e63e5e 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -394,6 +394,7 @@ #define ANIM_TAG_ALPHA_SYMBOL (ANIM_SPRITES_START + 382) #define ANIM_TAG_OMEGA_SYMBOL (ANIM_SPRITES_START + 383) #define ANIM_TAG_PRIMAL_PARTICLES (ANIM_SPRITES_START + 384) +#define ANIM_TAG_STEEL_BEAM (ANIM_SPRITES_START + 385) // battlers #define ANIM_ATTACKER 0 @@ -495,6 +496,8 @@ #define BG_HYPER_BEAM 75 #define BG_DYNAMAX_CANNON 76 #define BG_AURA_SPHERE 77 +#define BG_STEEL_BEAM_OPPONENT 78 +#define BG_STEEL_BEAM_PLAYER 79 // table ids for general animations (gBattleAnims_General) #define B_ANIM_CASTFORM_CHANGE 0 diff --git a/include/graphics.h b/include/graphics.h index 5c2150f4a..e99dc0979 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -5089,7 +5089,8 @@ extern const u32 gBattleAnimBgTilemap_ZMoveActivate[]; extern const u32 gBattleAnimBgImage_ZMoveMountain[]; extern const u32 gBattleAnimBgPalette_ZMoveMountain[]; extern const u32 gBattleAnimBgTilemap_ZMoveMountain[]; - +extern const u32 gBattleAnimSpritePal_SteelBeam[]; +extern const u32 gBattleAnimBgPalette_SteelBeam[]; extern const u32 gMetalShineGfx[]; extern const u32 gMetalShinePalette[]; diff --git a/src/battle_anim.c b/src/battle_anim.c index 551979e70..1a41a8d32 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1567,6 +1567,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_AlphaSymbol, 0x0200, ANIM_TAG_ALPHA_SYMBOL}, {gBattleAnimSpriteGfx_OmegaSymbol, 0x0200, ANIM_TAG_OMEGA_SYMBOL}, {gBattleAnimSpriteGfx_PrimalParticles, 0x0180, ANIM_TAG_PRIMAL_PARTICLES}, + {gBattleAnimSpriteGfx_Orbs, 0x0180, ANIM_TAG_STEEL_BEAM}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = @@ -2017,6 +2018,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_AlphaSymbol, ANIM_TAG_ALPHA_SYMBOL}, {gBattleAnimSpritePal_OmegaSymbol, ANIM_TAG_OMEGA_SYMBOL}, {gBattleAnimSpritePal_PrimalParticles, ANIM_TAG_PRIMAL_PARTICLES}, + {gBattleAnimSpritePal_SteelBeam, ANIM_TAG_STEEL_BEAM}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = @@ -2100,6 +2102,8 @@ const struct BattleAnimBackground gBattleAnimBackgroundTable[] = [BG_HYPER_BEAM] = {gBattleAnimBgImage_HydroCannon, gBattleAnimBgPalette_HyperBeam, gBattleAnimBgTilemap_HydroCannon}, [BG_DYNAMAX_CANNON] = {gBattleAnimBgImage_HydroCannon, gBattleAnimBgPalette_DynamaxCannon, gBattleAnimBgTilemap_HydroCannon}, [BG_AURA_SPHERE] = {gBattleAnimBgImage_FocusBlast, gBattleAnimBgPalette_AuraSphere, gBattleAnimBgTilemap_FocusBlast}, + [BG_STEEL_BEAM_OPPONENT] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_SteelBeam, gBattleAnimBgTilemap_HighspeedOpponent}, + [BG_STEEL_BEAM_PLAYER] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_SteelBeam, gBattleAnimBgTilemap_HighspeedPlayer}, }; static void (* const sScriptCmdTable[])(void) = diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 24b873ac7..3498346f2 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -6803,3 +6803,42 @@ void AnimTask_CompressTargetHorizontally(u8 taskId) PrepareAffineAnimInTaskData(task, spriteId, sCompressTargetHorizontallyAffineAnimCmds); task->func = AnimTask_CompressTargetStep; } + +const struct SpriteTemplate gSteelBeamBigOrbSpriteTemplate = +{ + .tileTag = ANIM_TAG_STEEL_BEAM, + .paletteTag = ANIM_TAG_STEEL_BEAM, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gSolarbeamBigOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSolarbeamBigOrb, +}; + +const struct SpriteTemplate gSteelBeamSmallOrbSpriteTemplate = +{ + .tileTag = ANIM_TAG_STEEL_BEAM, + .paletteTag = ANIM_TAG_STEEL_BEAM, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gSolarbeamSmallOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSolarbeamSmallOrb, +}; + +void AnimTask_CreateSmallSteelBeamOrbs(u8 taskId) +{ + if (--gTasks[taskId].data[0] == -1) + { + gTasks[taskId].data[1]++; + gTasks[taskId].data[0] = 6; + gBattleAnimArgs[0] = 15; + gBattleAnimArgs[1] = 0; + gBattleAnimArgs[2] = 80; + gBattleAnimArgs[3] = 0; + CreateSpriteAndAnimate(&gSteelBeamSmallOrbSpriteTemplate, 0, 0, GetBattlerSpriteSubpriority(gBattleAnimTarget) + 1); + } + + if (gTasks[taskId].data[1] == 15) + DestroyAnimVisualTask(taskId); +} diff --git a/src/graphics.c b/src/graphics.c index 4cbc4b334..2d0ff9a5c 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1591,6 +1591,8 @@ const u32 gBattleAnimBgImage_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims const u32 gBattleAnimBgPalette_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_mountain.gbapal.lz"); const u32 gBattleAnimBgTilemap_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_mountain.bin"); +const u32 gBattleAnimSpritePal_SteelBeam[] = INCBIN_U32("graphics/battle_anims/sprites/new/steel_beam.gbapal.lz"); +const u32 gBattleAnimBgPalette_SteelBeam[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/steel_beam_bg.gbapal.lz"); // misc const u32 gUnknown_E6BC04[] = INCBIN_U32("graphics/unknown/unknown_E6BC04.bin.lz"); From 3e364b4870603efca32bc9a1bd48475b0ae89a9b Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sat, 30 Oct 2021 09:16:33 -0400 Subject: [PATCH 146/193] switchin abilities activate after wandering spirit --- data/battle_scripts_1.s | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 146c05c23..1211f9da9 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8001,6 +8001,8 @@ BattleScript_WanderingSpiritActivates:: .endif printstring STRINGID_SWAPPEDABILITIES waitmessage B_WAIT_TIME_LONG + switchinabilities BS_ATTACKER + switchinabilities BS_TARGET return BattleScript_TargetsStatWasMaxedOut:: From a461823cbf557706e5a8767e2b4f3279532e7300 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sat, 30 Oct 2021 09:48:23 -0400 Subject: [PATCH 147/193] weather ball anim checks utility umbrella --- src/battle_anim_effects_3.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index 11e350535..6ec577388 100755 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -22,6 +22,7 @@ #include "constants/rgb.h" #include "constants/songs.h" #include "constants/weather.h" +#include "constants/hold_effects.h" extern const struct SpriteTemplate gThoughtBubbleSpriteTemplate; @@ -5526,10 +5527,12 @@ static void AnimRecycle_Step(struct Sprite *sprite) void AnimTask_GetWeather(u8 taskId) { + bool32 utilityUmbrellaAffected = GetBattlerHoldEffect(gBattleAnimAttacker, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA; + gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_NONE; - if (gWeatherMoveAnim & WEATHER_SUN_ANY) + if (gWeatherMoveAnim & WEATHER_SUN_ANY && !utilityUmbrellaAffected) gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_SUN; - else if (gWeatherMoveAnim & WEATHER_RAIN_ANY) + else if (gWeatherMoveAnim & WEATHER_RAIN_ANY && !utilityUmbrellaAffected) gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_RAIN; else if (gWeatherMoveAnim & WEATHER_SANDSTORM_ANY) gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_SANDSTORM; From de23b3b04d54caeda416e080f6fe372eda383244 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 13 Oct 2021 21:01:47 -0400 Subject: [PATCH 148/193] New move tilemap bins are easier to edit --- .../battle_anims/backgrounds/dark_void.bin | Bin 1236 -> 2048 bytes .../backgrounds/new/aeroblast_map.bin | Bin 804 -> 896 bytes .../backgrounds/new/blackhole_eclipse.bin | Bin 892 -> 896 bytes .../backgrounds/new/bloom_doom.bin | Bin 564 -> 896 bytes .../backgrounds/new/bolt_strike.bin | Bin 780 -> 896 bytes .../backgrounds/new/clangorous_soulblaze.bin | Bin 700 -> 2048 bytes .../backgrounds/new/dark_void.bin | Bin 1236 -> 2048 bytes .../backgrounds/new/electric_terrain.bin | Bin 2020 -> 4096 bytes .../battle_anims/backgrounds/new/fire1.bin | Bin 684 -> 896 bytes .../backgrounds/new/focus_blast.bin | Bin 952 -> 896 bytes .../backgrounds/new/giga_impact_opponent.bin | Bin 704 -> 896 bytes .../backgrounds/new/giga_impact_player.bin | Bin 744 -> 896 bytes .../backgrounds/new/grassy_terrain.bin | Bin 2244 -> 4096 bytes .../backgrounds/new/high_speed.bin | Bin 496 -> 896 bytes .../backgrounds/new/hydro_cannon.bin | Bin 880 -> 4096 bytes .../backgrounds/new/hydro_pump.bin | Bin 224 -> 896 bytes .../backgrounds/new/inferno_overdrive.bin | Bin 556 -> 896 bytes .../backgrounds/new/leaf_storm.bin | Bin 924 -> 896 bytes .../backgrounds/new/malicious_moonsault.bin | Bin 544 -> 896 bytes .../backgrounds/new/max_lightning.bin | Bin 744 -> 896 bytes .../backgrounds/new/misty_terrain.bin | Bin 2180 -> 4096 bytes .../backgrounds/new/neverending_nightmare.bin | Bin 744 -> 896 bytes .../backgrounds/new/nightmare.bin | Bin 756 -> 896 bytes .../backgrounds/new/psychic_terrain.bin | Bin 1904 -> 4096 bytes .../backgrounds/new/rock_wrecker.bin | Bin 676 -> 896 bytes .../backgrounds/new/shattered_psyche.bin | Bin 808 -> 896 bytes .../battle_anims/backgrounds/new/sky_day.bin | Bin 1052 -> 896 bytes .../backgrounds/new/snuggle_forever.bin | Bin 988 -> 896 bytes .../new/soulstealing_7star_strike.bin | Bin 968 -> 896 bytes .../backgrounds/new/spacial_rend_opponent.bin | Bin 1000 -> 896 bytes .../backgrounds/new/spacial_rend_player.bin | Bin 996 -> 896 bytes .../backgrounds/new/trick_room.bin | Bin 844 -> 896 bytes .../backgrounds/new/twinkle_tackle.bin | Bin 784 -> 896 bytes .../backgrounds/new/water_pulse.bin | Bin 600 -> 896 bytes .../backgrounds/new/waterfall.bin | Bin 2128 -> 2048 bytes .../backgrounds/new/zmove_activate.bin | Bin 520 -> 896 bytes .../backgrounds/new/zmove_mountain.bin | Bin 760 -> 896 bytes .../backgrounds/spacial_rend_opponent.bin | Bin 1000 -> 896 bytes .../backgrounds/spacial_rend_player.bin | Bin 996 -> 896 bytes 39 files changed, 0 insertions(+), 0 deletions(-) diff --git a/graphics/battle_anims/backgrounds/dark_void.bin b/graphics/battle_anims/backgrounds/dark_void.bin index 922b72bc74d7f5c773331b1af537d54c2e939038..97b879f01ba8ebc08c92d30497c894a1a7b186c8 100644 GIT binary patch literal 2048 zcmeH`W0Rg)6h-HaZF8-pgO1IPZM$RJwr!_l+qP|IY}=lBlA3=pUAJznefB-)!?{&E zL<~a2Bo?uWLtNq!p9CZ%5s3poNpO>rjO3&sC8Q3JlqG_4l&1m}sYGR}P?c&_rv^2t zMQ!R(mwMEv0S#$HW17&EW;CY-Eont-+7L-w+R>g4bfgoV=|We!(VZUjq!+#ELtpyQ zp8*VH5Q7=QP=+y_5sYLMqZz|k#xb4=Ok@(1nZi`2F`XIAWEQiT!(8Sup9L&r5sO*E zQkJot6|7_xQNhoISj`&NvMx{|*0X_)Y+^H8*c#N^*#64j!A^Fun?3AhANx7LK@M@4 zBOK)z$2q}CPH~zuoaG$nxxhs(ahWSz$y!A)*)n>*a)9`|{`Lmu&%Cp_gD&w0V? zyuq8i#oN5YyS&Hye87i%#K(NXr+miee8HD|#n*hpw|vL<{J@X=#LxV~ul&aE{K236 z#ozqHYle(rOk)|_IL0-e@l9Yt6Pef~CN-JKO<_t?nc6g_HJ$0rU`8{U*(_!iHJjND zGlx0NWp2aGV_x%_-vSo2kcBN`QHxpJ5|%VXDN9=>V2HATddZh3!g7|kLQq$^Beaj3%_?g&RZ%F&K-tm7Q-1SdMl$xd;q z)12-MXFAK-&T+2uobLh`y2!;YajDB(?h04B$|zU6#JKX6m zce}^E?sLBfJm?`0d&Hw2^SCEG=_yZp#3~?@CWcYb6c+pE<_KH`%=5=p)(_7y5 ij(5H1eINMHM?Ut6PkrWdUj%c}`H#+jbpHRZ`TrM_mOTvs literal 1236 zcmb`DQ*a�EG8%o2G73rS7+FiquMtziyh^wr$(CZQHhOoNf1v=K6Sd&o{d-JM+!# z?1m|k6d)b};-dtFkdRQ6h{PlzDQS|CToEahDJ2RcoK&PHK^oGMP6Z+eOHT$xXCxEK zOct_|4S~r{4irgFa*-S5A&R`@L-{E{K?P#29(hYT|2R-S9deeu#^h5m_z(59}!3<$2!_aU>Fp^PdG-DXcI5eIKOk@(8%oL_F z4NYeTGns{EGl#j%L-Sd{LKdOLEMY0j2rOp>D_IrD@cQJ{tYIy|b%B@w>)C)dvWd-X zq3YH^t8Hv2Vh7sEE_SmA?PVYPIe-pwh{GH~M>)oEPN0*V;xuQ_St#dB$^Ipf`Avw|E=9!@Io4`{)BcMs-jiR)m_6itr*vGtZO@1M=^C>&-EQ_Kx{)da$^UZs9jSxb8`ng_)6>wZ>$5AZ+_vIcvIhkBSb+#@{FqpZ;$ zKhm)_x!GK_9XX`-qSFn04GIeA1^Ja@uEn zwo>kMfr@G!b>0_z(YoZzzT&IaHDC7)-?VP|w(t0^bd-nn#)T*@>76<6rwQk z6rregi&30}6jg$fl%h0cC~Np~l&1m}HCc(uRH3TgrW)0$K~3$|qPE&P)YbFrQJ)6- z){sUtrU^|A-%Rt(X`$Jcw4ya_XiGcV(}9lK>!kV4#787=(1otVhjyboJ?Qz*_oBCE z`_NatHT~$%00uIM!3;^Uxp~G=hB2HGjARs}4L^pljAOj|2~0HnBqpn$!c?X){Xd_; z3}!Nm+00?C;pZ`*1uRs*h{Y^1pC7uEWxD@zR?xweym|6-rS?{-U(FiB=VUGGSg(Eq z8`-3OGh5ioHnvmLwBx_?cd|?Gw3|KbWuM{qb3n~O^>!TMFh@AbF^+SBlbqr-XHrZ! z%Q+G`&jl`WiOYt!jt>prIES(cnxM9CdRheWw;GppQG?xW=B zK(0uoShF2+)RwC|Ay;yio3`Z-c)#9GG)^3YB_<9VDMC@=@gc=1P68#6l9Zw}4xV3< z6G@^Bl1y33Q65PlC9MJ#@l~QSj$4JQ7N7*gttJGiP7P`bAyTPD?WpvKCyhGP73xu+ z2BZrOX+&e1_-INq+~&0K(UMk@9p(YS#Uq2(LK`w^OS{Q3|3TW*A!<4bo#;##9)hk! zvgk&4=pnfe)01BCh~z&?ZypQKM-KL-pM?9v0ErA_5RXTt(_n`11W$$-N^F=EJjK&d zDR_ow8P0RU2%cvoqe8r3{4dJH(PVmQSvg}EOJ>N7V>}a>IMDS^BHM&tA|kHXM9Ec3Uq=8^qnnri_TanGe`v3bx{W z$TlnCBR)nxVLPAFE|~dQUTgxxznI>|d_pU9ZSDzNs;+`h1PtX!tQl*rZR!99RiJGKkG+FbU=1#b*mecYoDOy1*Y9-C6 z?73C6s@idur;-uSY8q6jt~Io#hE!6ume$rZb?RtcG4-^*N&`*ThT2G_u{P1BdJk%x B*LVN` diff --git a/graphics/battle_anims/backgrounds/new/blackhole_eclipse.bin b/graphics/battle_anims/backgrounds/new/blackhole_eclipse.bin index 27457c9a1651b819f7523b850c7d82f049f802ba..54c73addcf4edf828bf0826820bd8a5f61b947db 100644 GIT binary patch literal 896 zcmZ9~Wl$DC6op~26$AwZ1(o+$fP#sFqJpAg2cdupDi#*l-QC^Y-QC^Y-QC@}ANoU` zJ9BqtXP$e{?5q`uNkUSRk(?ByBo(Q##)dT5Vn2%L{pFYG$4kCG@>z0Xi6;2 zXif{Wvn8#FBc9f@p)KubPX{{E$!zXS7rN4o?)0E1z35FJ`qIzj>(2lNGRSB@1~Y`A z3}ZMW7|AF`GlsE@V>}a>$Ry(@Gli*4V>&aK$t-3whq=sSzR?R<$RZZAgrzKFxzUzd z!Ae%Knl-Fto$>40z(zK)nJsK(8{65zPIei;+xUg-VK4jG&jAi5_(L4#2uC@_aZYfO zQ=H}uXF11tE^yJfOI+rPIjzTLQ|TN zh>~bd3tFO9v?dvlX+sKaQ9Ig`N*a+4bfi;Nn2s{&Ocydy7G3E^chrNP^rAP)rVlyv zC7Me=<%YzFwO zlu|}e&PA+ay$%K!a|s*Rs2$2-6PI!sx|}PxlB>|wRB#Q~qU*Sx8@Q3!O$u-37H&ni zv6(I0jw-o>JGqPK-Q1%S_p%k;$2PWeKZy_UpmL+ZLp&@VVF!=$80=KIi^q9FJjqi$ z%`;**dw7=T(x?iu_A1=U^Wp_w)td7JuEAI4vM7lHFS?=OYXSu7~ z&E4I@J>_2R?QHi+agMV4I#*#rp^`KDIdsfPdG1e`86T!a3nBwN(1TPo*c#%Y&i62@ zz{5SlBb_+PqqQNSqR?aHu^#6lkFP2VGxH~Sq9<9CJ;hU9Y)$iY&+trZmS=m8=Q=iz X^7&ri5^JFsd9jx`vee7GoPB2iycXQs diff --git a/graphics/battle_anims/backgrounds/new/bloom_doom.bin b/graphics/battle_anims/backgrounds/new/bloom_doom.bin index 3d27e562722661103aa46eb75c10c7e79aa9e6a6..9ea250a3406697b9016ffbcfeb24a4239fc64e8d 100644 GIT binary patch literal 896 zcmc)FRdbX<5QX6i1Wj=Fhp@Q2ySux)ySux)ySqzpcmG9vfn|47l>+Xl_oC1A^yxDb zC+@$IPWm*nyx{-0}n}uY3Xd6$mJ(kirr|MHCG( zizyy>e^DZ$es}&{Dfy3%BuSyPca;)SS{Y@PQ(grXRZ>|MRaH}64K>wLTOD=PQ(prO zHPSdpZKCPV+DvmTwA4y#Z35bA7o1XPuY-;{>8y*cx`pYkhn{-rt&hI?=^soEFwh`_ z4KdU(!;LV~D5H%r);Qx$FwrEFO)=Fp)5Du)m}!>T=9p`q`4(7ck;Rr+YMJF$SZS5j z)>vzu^)}dOlg+l+YMbqL*lCyD_SkEm{SG+jki(8R>X_qBIO&wr&N%Cw^DemPlFP2R z>YD2TH{5i~ZFk&tPjZC&9(d@H$DVlVnde@3>6O>PA7gprt#{ssdr^N>eMmJQ>rK%g ZeTupN9LbORlYQ|uW+wH9Z@$Oe{Q$aEw|oEq literal 564 zcmYMtXM0O=0LJ0x-yE7~tEY%nwW%XhmwK4`Bm`1vpzPF!G*T#N8b^JuDR7M!XyW=^Q>gMZ(*6~8ep3;k z8O>=STGEQvv=MD-M|(PmAnA0Zljuwry3$Q_Cxae@y!51({`4m75Feored!lRe+Dp6 zW>Ap9O0rERLr@k&$z~Y#a7IK-4kOVhMl*)7SmVfLyh0PuL?$trDQGHDrZFAOU?#Je zjpi_ydCW%(SjZw4V=W<%rID;VgaqUJGr!c(5{9KE1|m%PHfrjj?j)i0;SyyHC|`1m{G i&kN^eeyT{1g+G(~#mV{VhE?{B@0D&wr054fozlNxSdwS} diff --git a/graphics/battle_anims/backgrounds/new/bolt_strike.bin b/graphics/battle_anims/backgrounds/new/bolt_strike.bin index 7a42421cfe5d80048db9e21a752d08d0c2f72e86..32f51b6fe04f6622fa11ef209a5411354fc50e17 100644 GIT binary patch literal 896 zcmZY6Wl$7Q6o%nNKtNOwF(`RISP&2lFc7i3yT!)t?(XjH!tU00k*T zVTw?cVic!@nKn?8Qk13)WhqB_Do~M1RHh15sYZ2b5JgRDQJXr{r5^RobTkcO?+s}b z+Z)q_rZl5DEr>F<oy7p2^K;LEI*P z{vw8jEMhTBSZbkLvW(@dU?r|!^2OlmLt z{ z=t(bfMQ{4hmypOKpMG2<`ZIuwxkOw_0RtHXmqp6Nx z%;QNa#8W)Ye4Y`{@*L0eLbx*YA}_Ikh*-!X7PF*0uzV@Ys^XXPvUr78d5zb@m1QNY zU?p#eH+hSmGV9x9LP;f(uZtg zJ39#OWLKp6BR)pE`GimTjQl-CEB5j^Uo0A=FWJXed`-+Ze9Lzu%f3fHu%83`h<@TA zhxi%&!eNeZl;AOrN2*WoEBcL-oZ>V(!&%PpJ37xF{K;SFZ~oz5E};LYMh;j}j&_V= zEm6ZY9cRTm!L?l5s^hw@=b%;JiB56@tDzgYv6HPPZt7-kZnbbrw=!07s<2yIDNc2o z)2%kna9g*t+Pi~0I@9XpEO&MntE;;?+ua?=aS!)&FO?|Qz1_!st&oeU$UyoZ4lk3d6*^52r-RGHk zH=Xn{$S9M{vdAi%>>^S~4mstLTb_Wt^2x7&f(j|DNSH!V#S{-Hp=3bFO-w1JQAXJ? zg$U(DD*sPE)T*GON-Bpfgl4RwYLc@Pz9ULC)zwh*zl{VZ=~FGW)loOqeyCPYeGS4E z8fv7mCYr|4EYUp8wa`+lFn()owAD^~9dy)5XI*p+=%#x>4?Xn?3cZsR`sk~l{stIm zkimwC79Ba%u)t5sa3hQ~%IMg_7-Nky-UJg(GT9VU1E$3?-3&9$GTR(;%`-o~w7^1( z0)Me3mRe?ctQ9iG-rsCXFvC{cY!B>Zb_Cu|yX>~dUi<8K zz`=k+4vTTbQO6v2!pYdeDW?PbjI+);?}Cdix$KIouDR}pn{J7Ty6uj;?z!)QhaP$C ziKm`#bMv|RM2bU1Q4fRqh>Zr=abS1SkVaZ*B@q%vW5S8Rj1<*` zrZhvE6GaPJVztr%-Q75VJ`EK`7B@|i?A(b2}?ySL&?*X1irB4ednk6XSA2PtNX|ZC zKL}z#tGphr#Q_S7iXzH$9a`{LAb~zE^|e=$~CTYL%7K;%DFAv z;VxzI_k{aA;31EM$2_5er@}Ly^Ma6rN?xjhSG*S9P{mu`3Gey9M?MMFeC7*ZYk!vh g`9mGGb^6!-OZfF~#d6k|>RUM9`JrR93K=550f)Za#Q*>R diff --git a/graphics/battle_anims/backgrounds/new/dark_void.bin b/graphics/battle_anims/backgrounds/new/dark_void.bin index 922b72bc74d7f5c773331b1af537d54c2e939038..97b879f01ba8ebc08c92d30497c894a1a7b186c8 100644 GIT binary patch literal 2048 zcmeH`W0Rg)6h-HaZF8-pgO1IPZM$RJwr!_l+qP|IY}=lBlA3=pUAJznefB-)!?{&E zL<~a2Bo?uWLtNq!p9CZ%5s3poNpO>rjO3&sC8Q3JlqG_4l&1m}sYGR}P?c&_rv^2t zMQ!R(mwMEv0S#$HW17&EW;CY-Eont-+7L-w+R>g4bfgoV=|We!(VZUjq!+#ELtpyQ zp8*VH5Q7=QP=+y_5sYLMqZz|k#xb4=Ok@(1nZi`2F`XIAWEQiT!(8Sup9L&r5sO*E zQkJot6|7_xQNhoISj`&NvMx{|*0X_)Y+^H8*c#N^*#64j!A^Fun?3AhANx7LK@M@4 zBOK)z$2q}CPH~zuoaG$nxxhs(ahWSz$y!A)*)n>*a)9`|{`Lmu&%Cp_gD&w0V? zyuq8i#oN5YyS&Hye87i%#K(NXr+miee8HD|#n*hpw|vL<{J@X=#LxV~ul&aE{K236 z#ozqHYle(rOk)|_IL0-e@l9Yt6Pef~CN-JKO<_t?nc6g_HJ$0rU`8{U*(_!iHJjND zGlx0NWp2aGV_x%_-vSo2kcBN`QHxpJ5|%VXDN9=>V2HATddZh3!g7|kLQq$^Beaj3%_?g&RZ%F&K-tm7Q-1SdMl$xd;q z)12-MXFAK-&T+2uobLh`y2!;YajDB(?h04B$|zU6#JKX6m zce}^E?sLBfJm?`0d&Hw2^SCEG=_yZp#3~?@CWcYb6c+pE<_KH`%=5=p)(_7y5 ij(5H1eINMHM?Ut6PkrWdUj%c}`H#+jbpHRZ`TrM_mOTvs literal 1236 zcmb`DQ*a�EG8%o2G73rS7+FiquMtziyh^wr$(CZQHhOoNf1v=K6Sd&o{d-JM+!# z?1m|k6d)b};-dtFkdRQ6h{PlzDQS|CToEahDJ2RcoK&PHK^oGMP6Z+eOHT$xXCxEK zOct_|4S~r{4irgFa*-S5A&R`@L-{E{K?P#29(hYT|2R-S9deeu#^h5m_z(59}!3<$2!_aU>Fp^PdG-DXcI5eIKOk@(8%oL_F z4NYeTGns{EGl#j%L-Sd{LKdOLEMY0j2rOp>D_IrD@cQJ{tYIy|b%B@w>)C)dvWd-X zq3YH^t8Hv2Vh7sEE_SmA?PVYPIe-pwh{GH~M>)oEPN0*V;xuQ_St#dB$^Ipf`Avw|E=9!@Io4`{)BcMs-jiR)m_6itr*vGtZO@1M=^C>&-EQ_Kx{)da$^UZs9jSxb8`ng_)6>wZ>$5AZ+_vIcvIhkBSb+#@{FqpZ;$ zKhm)_x!GK_9XX`-qSFn04GIeA1^Ja@uEn zwo>kMfr@G!b>0_z(YoZzzT&IaHDC7)-?VP|w(t0^bdh6z?q@=ZjF3 zViYHl5|oT;rQ&pH5|fi+J!L3MxePa?-UcEmxjYpxfr?ZjnaWh5Dk)TpIaH?xHK|2y z>QI+@)TaRrX%zEmOcR>YjOMhUC9P;p8`{#2_H>{lo#;##y3&pA^q?ob=uIE`(vSWO zU?77S%n*h$jNy!6B%>J37{)S=@l0SMlbFmDrZSD`%wQ(7n9UsKGLQKzU?GcG%o3Ke zjODCgC97D?8rHIo^=x1xo7l`2wz7@w>|iIm*v%gHvXA{7;2?)M%n^=qjN_c(B&Rsd z8P0N!^IYH}m$-o&xrv*(gFN6;fdpQBf6BaV4sRN~)AfD@kQkR^^1G@~R*!sG=$nP{ZiWH8oOWHHp+z&D2~i)Kaa~T5Z%;?c!>$4(g~* z>Z~s68YjD@J9JkM^;9qQRv-0MKlRsu*yO3xXVgFq(qIkIPz{UN;pzMcjnpWO))-w! zrZP8>xq)Bn1`-&nYxz4)8S{6%($Y5v6Erd2HA#~-C4Qb7>;7N($?5#Gh)Ltq=mZM6 zpbI#^^Et2cIJZ-$$>p3*yF0tHIpa)OWA(I&v;12nfpRYEGO>D+6H`jZ9ZE%AC0)Xa zF79G3>LPK6!s&D)H*^Enr=IJ&j%&M?Yr2N3$M|YaaaC8LvXfoO6&-9>aCs-C$V3i< zJkSH&-~HUzecao<+|xbW-QC>PUEJB7=;#i#cRROr8@F~Vw{#1dyP2E1i5q*77kYu` zd!FZdj%Rz8XL^RGdzz%H*1TwYMZuehjwb0c59FJ zYM=J&fDY=A-u7F5({K27zvfr{ieL6ie$g-Zc|S+?kS!e65gpYr9oGq+)G3|TnP{3+ zoz*#g?XUc$ukwXI_h!w}N`?|4F%%EQ zLeWqp6b^+#!B8NiCTsqXPkBS0kUQiGIYW-nG^FNuh_jJBn{M0p^&)}HmeL)v>NjK<5-4uOY z^Uy4e(daNLj0_{v`QhoOROaSLsn1(CDIh3F5tJF7M^QmRR8YkC#g4uA@+$V;v4hxq?+v@g#F%2#G);AP zlifAFnzALmkeI~HZgyRA@*(*La^{>n_soZTzsyXG#aOV1AXEu>!6@)by%2;V3|>q) zs=`%61S}F!sE%mF#h`{iqo%(g78ZwEh(`kA5|Lzuwf*_Yh)GCG!T36;3x8^Pkq3aV zl(c%N55XK7pdr#=jnEiPkPd$aN}8e>GGSS0j%>7mwL~lAAQ%4DINt_&Xba0nJNV#- z6`(yjpd+jkI-?7^!V1w1-O&Tq6TQ$IePDgj5B)I!HV}g_7(-w~F$}{o0yYw(Fd6~a z7>q>`#=*v80w!V-Y%-=`DyG4vV+Lko7Hl@=U@qpt=3@bhu@JThi?IYtVau=_B`Afh zKp9qI6>K%uU@g|c)?))UViRmLwqPr^!M0-uc48N7H}+sJ_QCe!01o01>@betD9T~S za2zLa5_SrwaRz5$=Wq|s<6hW(xPbd{5%vHc#6x%(b_tK*GOoa`;!!+?$6-(4NnFEq z*i(2K&)`|ub9f#%@CSH*#Gmj2Ui`qbKjSa>D{jJG!pnFCufkr#>v#ii!rsE$cn9yo zZs9$=j}H*~A^wKHS9liv55qt45kAHzhEMSsKF1e^FYy(=Mup)Ue2d%o&hR~cz#aU{ z@FV_>|KKO!zvlf9cVR}4L9D`HV+cbT#&Ba*R$~MsgBZo?ylr{W#u(OMO~xAISc~yY zFeWmIwV7;8VI9_Gsu3jXvA$7sY`})bG&W*mHZi6%gH72C%(U)VY|dP>G5hjLgDhjRo++O1Kgft8~f;24e#V-XD%-p{!E3;jBO7vZO0?_aFq zLE~6lGM;-&Ca^4LSr{gAlHW~^;1o{vXH7#!h3`UzZ%V*7-I(di%=Zj66r*TWH$^E@ z5vtZ+iBVM*uACo3;}xQPvB5~q%?c_lPx6qex~fwKUy2gall=v?OU;+0L?tLbNVOEF zSbssy(!k)>%2ke98Ct4^ven#_rA#$b(^9O+P`a9^v7wRD)KCpfPEvi<3sOotRT++< zrXd=vK^kZpp#JKozNS9vtzPPB>Y?uHrb0tkbwOu!GIdl3wO4`3FCW?|-_%xlYNJJ_ zg(}tp%{R@{T+PvJ(=5%@3{5vp(^O5-WYZ)~)C7$;jZ+cEYK$qM(HfRN>IfrwN^EjUiSZrL#MO@5trn5Su(>i53sS`S`W2SN))e#*w9nwJ^&`YM9 zTEeAVRvH$voFy#f3S${paurt_*KjS@alP?|p4W4F*7S^?)>FD}x~3=fgdR6MrbqR$ zJ~D0KMsDI};}&k^Hf}fW;7;!1ZsQ*Av~PEnqJY% z2z4Rm4)7ok@v!j-kFuP{B6*xA!gj`ZCuyhngTB{yvfKDp->5?NwZ77q`a<@(KGUcA zM3p9}@9H@^gG+UFT^(mBF4@&~NzM{of{S;xoW;3VSJTyS;V~}SB_>yQQN~CY;i|c+ zo(p$juB}VBk=VwywuIsjb6t+PR<5OM!R&C?++|sIrfX)dsmpNbu8FzEu8~V~l@-#! zIoHqi4RU>4Z`Ui}>$%Ba*u$MZo1N%8Lp#fJyocxMzc+k-JD2Z@=#6z_T)>SElnfbF zzWzS*5*J+IyfL(cyMa+%L9>LHJLM_yl_k6?W@|NrYi3fNsi3i()JikK^E zycoqPK}kv(D@_@rW&PflGg6)kK30)RRHh15jaQ>OHRNjg+FC|yTdHHbu1GyieM=3j zZ%88=%Y|r~&{Vq_&8=@iOQlxkTib4<+*Z@hQhPZM9q6bX;zH>}XS&c;shj%lgwca= zdfII-+r8EG(e$;{Pp&@$7$^;O5!!M#&xwfxXCSUbBDW1Uhe7kzVw0gA&-nb<_S-E w#&cfql2>YCT^z4@W9?hs@tzOny?o>opXI;sm2W=g6RdtF>4tBhomZ2G!Z$xb%eWk*s*ijciS z_9ldLI*vaa=Xf3u!$p`R8ZJ4~L|};=b4g0Q@o_=AB6T<139ywmg33^qa)v{e#{*9) z7~xhkkri>%Ed*8~x-wO)%e^pFr5e?ZL~l$ruuyYUGT0SqwS>h&ZL&Ree5`qOs3sit zx<XdSLG<@_UJb-t-Z#J^Rv6#o6gEiW~z} z;y|^{A^r`L(mq%n9K!ElhI;r5J%nKlXM`^!r5Yu#hZ3eSnlX%3`Qr|$=i$na1=K89GCAi;HO#l9?2@k?d$GL{QsiDL!vuu^8MVl``AS<5<^yPgE6O4~pp8|A|o z^i3*vGh5gy*v58tuv3u4E_SnLmn_~Z|LkKw2L#EaaF9cS!yMr#$7*q0{oSOeYF;M< zCrRTJ>4xTWnhY{IBRI=B&XXm$K)jw!POLCr34K3lC{)*SUG4OlKJKpob hz(13ZeB!fH#C@TVuU2!W;2Ym5;)g-#Pk!-A{}0cV))xQ( diff --git a/graphics/battle_anims/backgrounds/new/focus_blast.bin b/graphics/battle_anims/backgrounds/new/focus_blast.bin index 42bed6c96f9587588b049a0372527027aecfc6fa..98e3e8e16b63fe73c0fb8cc7adc2cc1630bd3359 100644 GIT binary patch literal 896 zcmXYo1#}Q(7)7OPBomp*LRPX7L3VPGlU(E`Pf#Rz$w&Th7oZ@8C`=KGQjFr1 z0Hh?PLPk-V=)h7YP+7`Ro(fc?5|yb!RjN^)8q}l~wZov8qknNG^PnnX-0Ee z5JN02X+>+=5Jy|u(Vh-;q!XQqrwd)_Mt6G9lV0?u4}IxJe+Dp+K@4UHLm9?!Mlh05 zjAjgDNnjk~nZQIQF_|e$Wg63&!AugF#cbvmXSEO(fD_KP{ zt69TZ*0G)qY-AIg*}_(~@i33@D37t79qeQmkMjgi@)S?=47=IGvpmQ1yue=e@ggs= zp937^5HIrzucqj=)P6ms-$=dQ4E+{|Il@tn1%8`%LLN`a6M;^0iqo9oUEbq;KHx0p z_>hnIm{0hW&p6KoJ`ehWi(KMMzT#`X;d00;T;&?qxxu%5$M^h@+CTCWH@U^n{KBvN z7IZt%9e(Ez{^T$I<{$2IkAL}(|GCdYrZKJQOm7A=n#s&&F{{~(FuOU-X)be{$4K*< z&-@m!poJ`K5sO;P;+7D#q@|3qw9$d0En`{BS>6g(w33yrVpXeI-5S=kmbI;8UF%uj z1~#;jjcsC6o7vnJ#u#f$TiMz+#@W_(wzorYM>~b=Y`k6UYB#&v!=CoCw|(quKl=v_ zaG--6>=1`K%;Ao3q@x_|7{{96ILAA|iB58|Q=IBFr#r)$COXU6&T+2uobLh`y2!;Y fajDB(?h2D!=_-@MYIRs82CZ?e>s;@K@VC(i6Oa3q literal 952 zcmV~$1z?Q}0EXf3cg}Gf!_L_Bct31R4Z}?Sx|x{n?#`*{?!1@V!R_wuC#|B*`=?DyT#{$qXthwF*^HHL6pCnkbW6)CQua z4s{i)M_LxyN-_17Py=#kNF&skCNw1%HKRE#$Rpa4RP2t*&=>WiKLZ$u3K_&;hM=JoF^u781S1*6Xf%egjAJ~Sz(gi78BJj- z)0mECFq2u#Mst|UJm#YXEMyUj(Gr%jjOAzrD=B6bTFn~PvJRE7o(*gy*u-YGuvL-5 zZHjLvWd}RaE_Snry=Wi%Ilw`5h{GJ=C_2VPT+DHFf=jrR%h2Uq!IfNvuI3u9@A zbzIL4=tgehW^O^ZavQgE2fCBHxSM+@x|iU-Fn&L&4}=-vgUWn}hk1mwM|n&+kMo3b z3!fzRlnS2a8T2gA@jNe}7dg!tUP3SP3a|1SdYw0TleY-pR&bVcyo285J>KU7!VeYu zh>!UMeadHi&KD%V1UBjyBOxJR43)^*E z*U@^;a<&rLR(&^cjvHEy+}KUr)XH@;H+Ksw&n?}`t*v~wae>=f?cClS+|laf(4F1I z>gsOp?jBZ8_i}IdanRTO+}{HfNe*Sfk)ukcD2TdTa&-vLEZQHhO+qP}nwrwZ9JzKM>UqAKgP4~RM=k~2O zaKafE469sm!yOMi@xmJ)eDT8{8vz8WZ;LI@>h6cLNq#33&6h))7NO9*Ne5|NlB zBqbTi2_pq5NkwYXkd}0$CxdmPK}Ir>nJi=_8`%jb2RX?_Zt{?qeB`G95foHih{6=1 zD8(pF3C)+J6s0LcS^Zaz@>HNAm8eV=s#1;W)SxD{6kA($1a+uOJ?hhdhMH(ZW17&E zW;CY-Ev-zgXiXd1(vJ3Y&}1ZSR!2I~nJ$(#`t7>XjqdcIC%x#cUaAj$>1S~!-Jbyr zWDtWL@Ix5NForWi)ksD$nlW~?=`ogZjCa6CCo!17L?$uWAwPwwDqW;{8q=A$VHwL=!Ae$X-D=jbmUXOW0~_^Z6Pww>R<^O79qeQmyX_qI zu$O)8*Xn;0oBIPCWRIIB+1{f9SQ&U1l_T;eiUxXLxI zbAy}Q;x>1<%RR;4*Zcz>@<{K(!yfa5r#$01FL=o-Uh{^xO8JiWeBdLW_{Gwgm;)&tJ+KT`q%7qqPX(kRK~y3b zsZ0n}upxFrsY)33YGMedIuU3!s7WnqlOT1dOFimiZ$MH*8qpYOLQ|U29BDyITG1Nc zHnbI6I|&Oz+T)-D9Wi&JGpSwZigcqpJ?M$K7ri^U^r0`(k4XA60LMUrA`OEW%#c8a zjlmULn;0T7jAJ|#uupW_n8ajaU75mE(WWuogBipnMg_*s z#6O-{PTLC8Z02|{mwC<*t@eBz3$zsP)P*c!v9N@tEMvLO3Rbep;=Wo~!&=s{9yTPV zZ)6jjUD?7`i**~@g&pi<7YVT2626DM>=X8LfP);;Im{7`CfSY|NF<5l&IHQ@?F1(| z#c4g>enuaBmUEoPe1VIh<1TR-zhtiHaVgH=m{V7UYh33BH-%f=<_>p-d)(&%4|N{# zm?wJj(-=$YGoJIpk{%?5U-F9Ayb<2=j`w`f`N$`ndfI2<3#okNoA8|<{3K217r*%v zU`>a=hTwmQ(nRUXpp42SDwA?it{H-x%B|Y(r7*{=_GC;JsHSICb2VxQ;1T)NBJs~_f!7LN`MMf_P+niAQh}aRHzEmeC*sYmdXDE+`ibE literal 744 zcmV~$2SAi%9KhlKdme(w`0hY4wD`T^NWByk2jca8C*U5Krm4Aiu5zZPcaQ_zdk@^A z=Eyw?%Ds1~IMdt%Q#323=P`VRBwS$=RR}*jNq!Ps7=OY7NGU?eK+#1B!V0E>jSxan z1`eEri88_|CZ6I%U@yT3L`u_=SfyzBAs-Qi0b070CYqEo^eHRua+JsMF%>W?Qb|(9 z#V1sz3P~|CC6=nps)jv|>eOIaO^jN^OIB?X@YInAH=knS6&n#Q3lFL;i6oIMr;K{k z=RyM-Vl<+$+-yQqtY&h*IVrS2S+37$Nh^7i6Jr_$pVOK)$QQJw9qlo`q=V#kq!W(L zbWu@V>88p?cBh9&#rpTOyuF~eO6;UVNkqX?)LE#tGw@Ksp%#Ok|Q?KA9=$I%_J^ly^Ea3?{oA-kHoo zW;2Jm%)^>5?lcy#5Lv`xmar82GBR1NZm&RAvWhs@YSbFmvW_g3Z>`ta8`#JX$R;+k zg{{bsY-2k+ulN5_aKLSvg0sEILa~MI43yC zDd99{ILoYm?|K&g4Wtu)C z<2?n4R))6e=xA-%exeI&e;uHU*ma;Ts+|QvT7q>NAv#q1&bm)vXoq%&=rA3QnWw_c F{{glD(u@EA diff --git a/graphics/battle_anims/backgrounds/new/grassy_terrain.bin b/graphics/battle_anims/backgrounds/new/grassy_terrain.bin index be2421aaf18efd07a9667f6774effb4c68e6f46a..e955c23199355ec8e14ae9287f1d5b0d0df94635 100644 GIT binary patch literal 4096 zcmeH}WpofZ9K@k$ad(-4`Qyc1i@RHKDDLj=UWyfWcXxMpcXxL`F7$ezj_>z@zIn;Z zCi!J|XZK|i5*`SJ&b93@Z^rBE7WP!{D-9u-g#l~5T~P!-is9X_amny7`^sDrwwhx%v$Uo=D` zG)5CNMKd%<3$#Qlv_>1WMLV=d2XsUybVe6+MK^Ru5A;MY^hO`_ML+b%01U(+48{-) z#V`!V2#mxijD{b^z#n5V4&yNa6A^$(n2afyifNdR8JLM#n2kA@i+Pxj1z3nhSd1lD zie*@i6Ld=%YEaY2*Hr_U?_%W7>50=!ZAEO8G#Xl6p4`; zg;5!e(HVm=8H=$QhjAH?@tJ@LnTUy3GB}?HkRW!-tC4HT>nH@0yxRllR3rJ9vEl-oa*LI<8;p8 zOxHKdm4Eo@oK1hn2iTk-ey$q}pr3hQ9_PFE0{U?w7X|W*xr9lSSc#Mn2^3%P6jvUI zqu7e2n2O=r(G^Wm6-AL1Nf8x6o(ivU2&*s(tx#IZkjk%o%Bwuetz62f9Llb2%Bn2N ztW3(N3`#FArBhm^QEH`9N~MrVO0Hz0prop+I;yQ&s;L_CQFT>QRaH@CRZ>M&PzbBvIahEcS8+Aha4pwyJvVS8H}RxS=(vvQsE+8c4(Xr{Xg~I8 zul8uScIkuOyBy!lE!@g&+|C``$z9ydJ>1KE+|L6%$Y*-0Cwi<$dZ-7wuY02lJOhj^I2UPpM8$9Oz2;ZE=*Pw_O*(8EGn2>a>&hrjeg-}Oyj^#z~xNgtKM z%+B&$U{0Us1zzMOUgi~Ew`N?HjkZpEyqbqSpRi}7J+>tr2+ zt~*$J$KT>@-r-%|<9$BhLq6hTKH*b7<8$Y8L-XY*8|laqHr$5UP#a={ZIBJ*3%+zN ryyELXU*7O7-|;;^@FPFD{?CDT`@*mM7M%aV=bvB){$L0G@BIH8EQrX# literal 2244 zcmchX<#W|{7sSu+LP*eDG&sAkUlIsz!9p(X1b26LcXxMpFYd0zrLMSJC2g@nTbe%4 ztNsI>o!K*U=FGl1J0HLK%{=&!01071NQ7X7z!D<~k|G%_IZ_}Legsllwp2)sH1MZI zI*SZLdRPWzL?&d0WkFVC17JjUjWj51W9An1so&DVU0Bm=2qPnV5yyusN8Ed6*AdfQ49u z#jqtg5~pCNaRz7cG3*@9;{q^ppq8@LI(h1j|X@NdxXb$f~T-&c#aqN0p5@J2|pw5u4ljCSNw*T zuvd7EH+T#C9q;fSf587I{_=%>h=06!^f3VwGJOye#d#JQ%n%B(N(N;Du^D#dQ z7z?rx3$sWFi?Wz`Q7mpO!ICV+(#B|(VGIMtvMk5)tYECjO03K(#;UBw>a1a`$y$tM z?GV;sU0YR;_2a`Eupt|<@o4j!uqm6dxv>RXvK3n!+psO$vAwYaJF*iyhp-E~2E1CHoX^8Va#CiYLf3et=Am9rgHG@9Pq<hB~wx*ktJ4$ zf{{oTq=ZVKt?}hk8AYqKtdvTsgo?|eR7^!xL{?aZR8R$E`IS$3l}8q-+{&d0S-5h_ zNwOTuE()@2YN-}#E^DTyYNE!nMrx=AsxPajx~ikvvRKtpP1TT9S2a~t6!qIRq3*J7>Z&g4EbF9>>Y(Jqt&uix}}@C5r4yN+|C`eo!rIU+(X;TecaCjw1d2^Yq~1CqRYCZi?RzkuXBp0 z)mfd!50qE4)X|)@)+$nPw*s9(N6OW&+=p1IiBYWJ(oSxQ$5jR*&{vF z1KpS1(_P)sZTXY9#K9L5^8)Q6+vdH*%k*F2)$qt`yiWUspYk*MTtd&8`{2v;m+Vjd zq4#>Hc!Isv8@-m7(>eD!zX;!CU-Bz{&2MPm@;iRd8?>9e#oJ8hEUio9QoB^nQaZm2 zbtzm(awc<)qbj)a=E}LUF5qI!m2uIov@2z?8xY8zu+ zEmzakFjw7Gb5&gxbCq2sSJ4eTjr>u!2DtvNUm(=q*Y&YccX*d}kN5e24{4A1m{0hW z-ZMVu3;y7B^4ht!obINDG_k2}iks{vIh*JvxbbcrQ~t=Gyr7>M7je>l;jjFSFB$ZT muldHy@-|{x@b7%b_iz5kqW=O&|Ki}A5C7=x|HnU0v%dkz!kLo* diff --git a/graphics/battle_anims/backgrounds/new/high_speed.bin b/graphics/battle_anims/backgrounds/new/high_speed.bin index 52f7a9c51adec65bb3246326a8062aa05e32fca7..ca049478cca1889c44ad706ffadbc7110464f9c0 100644 GIT binary patch literal 896 zcmbu!1yht!6b9f~#THw{e$-FJ784sgQL(!*utmkfM6nYPyTzZ${dQMmoMm)o=b3xn z_nwoG$Vwa8X)7g1j&}d4y$(9+q_Zx%rsX!b)FxN!y6LV*cyad3sF&VBAAK{(OWxvp zte^aU=x>051{oX-F%-iLH$r5jQAR5;##rNwH^D@cOjc-$sVz)1-3&8>BD2gk$6WKw zw?MIlX^Skj#8S&F54oawAKzD6Wp#41Mv1l7g;`>Ka+WH!!A6^Gw#C-aTC>e|JM8?+ zE-Ab1Nw?pdOu1LeKKmVTF#Hasl{u^|*^fBtm~zLRaMCHKopIJV70xSgb*-HST-hp+_MfdlK@gXK_Z)z3?(CiGn{~sa2=mYYpn7 dH)^8>Z@p6&z4yUKpM3VkSKoa1!%vNVX#$JCrpf>S literal 496 zcmXAm*HRQ=6ok*&b(|en+yNIsSK(6!1S6Oe@?%cGnzN2sF|CSX0>*%1023f)#P|?i z=$m-$)jWbbWp#B`cUAXASGz%6>Xc9;WSv;3eQW1zw4N>;Ht#v0bL zPVDu+{Svo)0~^^ywQi=7CYr@cHb}$tmG9Eu7)3aE|j_ASYbp5|?QeTD&V@NRM|&~`e6P6BRoN4U#9y7KhyOYsA`d6?i4kHvmMPq)~;JaujF8D-CT@&6%{ vR8y7Hm-Nw(4DgCU20VF9pEt-GPHz>hRB za+1x4WV2uRk~8Pz%srFm-kEo1?pznHSz0Lb2xC4A2q%I_q70ic9nC@(v6v;q5R2Q8 zRQ&0A4{kB z6IpC#iw#!xkj+-Mv7H_4B*!Kz^Sj6;kNhA=W&Q;L>ZJVb`z>U5&~ekm9`>>?C_YE* z=Ku#OqS!X?79|{_lrqZkO1tm7A}i}KM>xtcj#KgfDdI%Q?<-fs0%sUFaFD?axPwI_kMh1C4~5 zva%mv{t8W8#%{+Hdgk&OE)?-niG;3lmBv)cH#xXm5z(#Aa#wfyHG$G=ZI9dyz~ zw=LF14-e?&A&+>>6I-l@r#$01FX-bX{dg>uR_E>&uXxP>Zy01qdV{TZNo9L@%RAol zfscHW)*d)3*Q3LHW`t43s1?f2sh-Vx(R|@6<9y>gKYZ#eGfEy)>d~K4J^G8^Oz6(r iO#Nu=#VeBe!=zM?PBA@81wA*n-ihic;3(iI5W-*d{ZKLh literal 880 zcmc(dSx-|z0EK5Lcqz4|f~aVb4=PsWqD94m6fcXoi@5JnSH!h$sJOI<3%FI>cX2^P zO^lDm7ypRKRsX;cHAaoWd!O_lka?M$e94(P=Xixz1SLuaT}e0)$)qp{4J{QXX-bN8 z6^eV^E(YVqBS^=~5Hd^^QbuKMCPT>*3}ZMW$S!51Dpp1$HVU60htcGMhdlCCk&>0~ z{em$RFqVLWag1kz3Md(m#0t?VVxnLYL5i7dD!-*`QYGxDKk~Bk{=w?DJNV( zh00dae%*||z!&?5+n`cqS%|IX>s3?}t+6RnmgzH*waj8Rb5xE6bfskIbD4*n&jJ=w zm-Nn5c}hmLMbxv{!4j6Ttopn1TWrv^oE5AjWfiMg(^f2$?6(d7KLa3`@>@@Py|Y4J zoBU=S>%(mL@hRd|A+Ngu5n&^n*ovfV=yNvd2K@tPfio$O*a zd&2B3_-K8}XwHtJ?PEU&EJT`yILINIIgIZJM^%B9U91IhjN_c(B+;0iTU?9Nia13Z zr#VCPtX)+{<2l+99h~O^7x7&pv#-fofvZjzmq~DiPDWqln%36WZAJg~y5I&kxy9`; zcjO=2y(MuMagX~v;31_A`cEt8mc%2v1dn;bQ=Wb9ZB&K75?OSoC7yfe;f2k#27IaX d@-i*)ir4+Wt8jnq{8!filx3S+Q?iyR{sJutMDG9q diff --git a/graphics/battle_anims/backgrounds/new/hydro_pump.bin b/graphics/battle_anims/backgrounds/new/hydro_pump.bin index 0f7e6a5d913d4051a8fc58c1029c3ff3092c61f2..917b5c6c966b2c7a2e4851293923ffa014bc4307 100644 GIT binary patch literal 896 zcmbuww++BR5Wq0JbI!5T0NQ^(?{EeSCekk%IRz!rD{2~AqIdKRj6|Q9Sy+j_v2$<| r{o>}~CHm{*?Pc`S!`;p3tBbRf(MJb+JEONY)>cL@EzHe~p8V$nFkx2# literal 224 zcmXw!xe!Pb}y6d5* zUV7`JuYUR)V4y)lKiCjM4Kv&bBaJfJ7-Nky-UJg(68g!em};8oW|(P~+2)vQp7~NN zuu$k1S!{_^OD(h93M-{qWwkZdT4%k`Z?MrOn{BbxHrws6(=NO1vDZHPh5mqp4ms?I zqmDW5gp*D=?ToX|IWP1VTy)80S6p??bvN8}%WZeubwDyS%O zR8rZ?qKc|sk&>q%l}=Ujs_Nl2uX{s{P*W|n)d_XgQ(uEzxe06NP4SjS-qu(&@s6gN ziRM~psg<18+9a&4cSAevbyfaY;zPZBq_^m!uYUTA0R|dm zu*@Nb%1hX=@Uc$}HzIs$q|b~Bqm41v=NZNsZ$iRiqDdzELQFB$G+&CZOgFCuj}}{EX*$U*v)l^tla*FkEq=DfTITa7o9%Yk8FtxikG)}^{SG*o>rlcDJ0gB{)NhW7<4!o~ckzcmopM^vndDYF zb=JA?m%p8NAzXCHWmm#g*Iaia%T50z?3TFgj=S!O`yTk$L-C(S9(yA5sb`)iOvL{k Clbi4W diff --git a/graphics/battle_anims/backgrounds/new/leaf_storm.bin b/graphics/battle_anims/backgrounds/new/leaf_storm.bin index 02a43683a67dcfbd4f907d696bd64d30a05bcf67..81fa3d3beb21f7374caa0163c6fd92789210fb75 100644 GIT binary patch literal 896 zcmYky1$2-F6oz48FuJ?n7dE=P8#ZEecXxMpBaMOqN+_wM(%1n?Dq(<<%4maB;b$sm z=R5bF@7(9cAub`rBR-)dAR&oJOcIikjO3&sC8hL}7|hlwuU81SKg&>E~XCvXrAd6{tuhDpQ53RHHgIs7Wnq z6G0?(s7pQS6Ga0e!y3|v#x$X6;LT`G3tG~O*0iB5?PyO2I?{>GbfGKV=uQuM(u>}K z_n|NS=+6KKGKj$pVJO2G&Im>_iqVW=EaMo@1ST?x$xLA?)0oZ-W-^P}%waAsGLQKz zU?GcG%o3LJ5-+oi<-EeHyvFOSU?p$xCaYM@8rJd_Z?lf|Y+xgs*vvb;%NDk>jqU7U zC-3n-yV%Vh_Og%t9N-`y@F5@ZF`w`$pYb_g@FjJ9qnZ2AYJTgH@n-zp7yf0ee7#L`#Zpa4sx(V9O^KKJHnBUao~_d!HG_C TvQwPuG^abmna*;ybDZl_wrT!$ literal 924 zcmWO41w)kw0EOZ65sJxG!Pf6R0%D6D7?@zAf*sg}iVAjIuw&D8cXv;hx->Rj>N<3t z#!@%ke15|diN;C+F~kyw;weXY5>N#yQi;l_3ROuYf~rxS8YH1)YEp~Z#MPlL^`hzZ zQ3Dzh0y2$AAr+<3m~@(;rZl5DEl^8Z(V7g@hPJe$J&_J{EC@T%8Fis6nRG+l=|NAj zP%nDZhrXyE{mCW=4PYRH7>tH6l$_LI1i1`n1S1tHk9e^ zD$~$(W-yakL}oKb;aujSLgur8g{X){EM^HRri7&|L(5sgN>-uOtYIzdP?S>2SdTWa zkxgtyTiD7rwxbDlf`*?|$c?G@7YrM{W zA_q8F5FX+U^d^Tn!dvKV-r-%|L+^8xV|;)<}dr>iDw9Y<9Ghx&#V;v#owIe9QucUInM?3 z-^B=lW2{)mIo{<=d1r(PuHcGtC0BM8SH+16Bd+G^at$Xr*)`=_uI)OmE7x;Zs}HXYiGEP+sf_S-W}Xg?&Qwy;;wS0yScl2#JH!k z+)H6^xsUt0pZg~`+c^rd(+0=`J;;MSL>}s4&h>D4ghx8h`SK`__85y&C@+Yp6OYh?K$#X&vT*Y%L}~FMP4K?_7WGnL|*D;UhWn0O0V*2uaVb! Zoue+5%e>wjyiwld&EDdz@-}a`{s$53-NXO@ diff --git a/graphics/battle_anims/backgrounds/new/malicious_moonsault.bin b/graphics/battle_anims/backgrounds/new/malicious_moonsault.bin index 37874dd0bfe49071e27547deb84976adcb9b6a3f..03bdeabc7f25c1b93996e63783c1fb1f42fe58d2 100644 GIT binary patch literal 896 zcmbW!W0Rv%5QgE(+BUCbvo>aJ+qP}nwr$(C@vk;{CzIKl+0BQou2X&b^mBLjsSXLH zupDxx$i~TBa?2yHeDW)xph5~OqNrj4S6qp}msCn=Wt3G;c@Z+%{1{!Llu_l^ome6KWS?8BfgrsS%MG&QT$mo-m_;=h=t7Nsmt6FQL zt#;b$prcMY>!Pb}y6d5*UV7`JuYUR)V4y(;8)B$oh8tm|Q7Nl4+8AR~YO+o>&Uh0{ zG|6OBOf}7PGt4y0Y;(-bR%@R57FcMJ#g71LsxP_W1Nw2^4UZhP#t&wd9SbSO~8Hxthvj-5CWb|iRD|HDzo9CyM= zr<``iS?3aV-USz3a@iGEU32{p>V}(cx$Ta-?j?x~GP}R;frlP>?1`tId7iWvUV7!V eH{N>Zy$?Pn?32&F`0AVQe)#EElF6k1_x2mV$hNrv literal 544 zcmWmCX;(~f9KiA4zcJNVGSndJcW#rVEL|D9y4EC7wq(5_WF1R(`ZJd7QX=bQ-y-`? z*?Zs|FQIe1f&0u;;|+Wte9qUaU1BO66^e_&<@j{O-3B+Y#0l|uXiGbxJsn7(qk)(7 zPIM+SQAol^7rF}FNTxeIgr4-GH+^CNKZaFgNFap(sq_{4(VqdN3F!=E5QBvwWMDEh zflP*3;ZX3mB5WrH8P14|V(tFpC`T1|Ml#CrMcgu)F^pv#l0`Nayeg;2^$ zR6Y^7!Tsn*RkoD*s}&jsp)i(KL| zSG1+Ba*YV}!gX$NlUs0G|GmRq?g{sKz(X2ZZ8NHt_lU#cSaW lZ+XXi;R7G}L{l`|%xAvvRrtnte(*Dk79ISrAAO=+{s92=kXrx% diff --git a/graphics/battle_anims/backgrounds/new/max_lightning.bin b/graphics/battle_anims/backgrounds/new/max_lightning.bin index 43511aa7249cd273fa4affd23208c11ec2f72fda..af4c39c1c0bc0ea0260ddccddc8ca26d7dbe7069 100644 GIT binary patch literal 896 zcmb7+Wl)q+7=>MG=>_b5u3o#lySux)3%gtF0J{ql3`DWP#%@rtP_et#)^~B4K}LT# zXU=&~-0w4BgDr+XU?<5Qhj^V4N1SlR1y_u?#arAl;ejV!Bqj+-Nk(!~kdjoSCJkvx zM|wb!fsANDCNh(StYjlQImk&aa+8O=V9W$hFJ4Zxx*4{ac_qIqmSGFen-exBN@eL(J}w| zhp~)fJQJA6B)LAq$-*hZslsWJe3;G*W-^P}%)u8w<}#1@EWl6u>V+&~F-us=GM2M~ zm8@d5U=3?U{U!Ocj`eI{Bb(Sv0D){_E8EykpbpSM>>!9>c8cyIL^Oom0*eb4?qRR! zKK64!aF9^KIK*L&aFj3|s*iD8aDs47a*ETO;VkDkFF9QF0vE0B5|_EcRU(Mwnk?73 zL8Ok*QABZ*TioW3xVyq=(Ra*cJCK4Ir3jk_`_ L57|u0Q+cUhGC~MW literal 744 zcmWN<34GRb0LSs~Z_oaF_U!4|^WPq`&1j$B{F70ZBT~wCB`~7_uLIzNNlbW32=jdIB45c1HW97a#_5m*X1oVX{`izDcbj--&II2!e#FUL@X z`f)7BaXdPK{+!53XaFZOkU{7a1~Y_HQJi9iG7Ob)8mDsxI+NjyU?dvFXwKqnRLVJ= z%NTSXV>zF3=mIWeJQtyhnZPAniZ0`FCUOP3lB>9yN$47`dg07jy?d|bUsWUyEdxr||Y{_dXEi6mK5~kD4P}yB!?&cmjej-0%e1GY^%w!g` z)0o3t1ko&lw2gHLsL?u;X5fAeSi$#@J=`CTYSjM9~#&YpE zPf*R11+0*Hil-H<@fE4z8CFs&o~4de)Qbk5<9S{Xt7-7+y*1)R*07eBD&)LOqr#26 z(kA1E)++Z^nv|csj`eJi*@&8H;Wb`IZ}289UbE-E#oIFP(2CyWJ>KU7oDcbkj}>i| z<8GoY9{Pk&(Py;N!Diy0EB_0=WV5FZZwp)a3TG={^Nm8CiWGOr`IhhaUZ&O!cVT{z z`H^j6J3q05pWzn;cCw3KA)&x;>}HQI=Xdt9k8WSlKlqcs*k7ycZpHq8fWK4uhkq52 uHL^)IV3VzrYEx`5Zc=S%mcnT^YArwXt6h$!< zM+uZfDU?PTltno=MtM{~MN~p%R6$i#Lv_?ZP1Hhd)InX;Lwz(rLo`BTG(l4|Lvyr1 zOSD33v_V_6Lwj^UM|47G1fmPNq8qxS2YR9xdZQ155RAT#2}D2i#{dk(APmM348<@E z#|VtXD2(>_F&K++7>@~iF zz)GybYOKLptiyV2z(#DsW^BP$Y{Pc!z)tMKZtTHc?8AOn;Q$We5Dw#rd-mZdj^Q{? z;3Q7rG|u2G&fz>R;36*JGOpk%t~p%C4cx>n+{PW;#Xa1|13bhx_!i&cd;IVPe#B4s z8ISN7Pw*7a@Z4MH3%tZDyv7^6#XG#mFZdO|;rIW`rQT>3K}<1+yhG7%Fq36nAzlQRWV5+qYGHAQ0@re!*& zX9i|;TqXuEv#XtjSzVir*_nemnTxsU^C%DVG9UA^01L7Z3$uvpQuiso#= zmTbk=Y{Rx}$M)>Nj;_y_=)}$pWEXa2w-9}I_HgLQUhK_23}P6BBGiFU2fkJZ{9JPS z5X`=eihl0$p}%(@z+evKAP(jb`n&w~$51A~Fb;R@2*-`&DE^}#&3+aYV>s4Rj{8?X z-l_dDgcH09f9oeYcA^Dyl2a#FG9^_KB~~IOR073UJozK8;wZLaDW+m5y1WyC*G5rf zMN&jXkRQS;oWiQ03MjwwDX;P4uMkXmWQaLpR zrBn(uP<_=?UDZ)-)lyB>Ky_79RaH@CRZ>M&Po~sS+x#Vk)X4Dy%~4 zt6&AGk9w<@da8%ItDCy2ivrPEozzhs)L!k>R&CT;t<+L2)LhNfR87=ajnq&xHAB-i zO;a^RlQl^bH9_MwPGdF3)d<9BjnYVs&~OdYPz}*w4bngjP=EFF_#N7=ZQ80W+N@35 zs0~`Lby}-6TCG)DsTEqTWm>8wTC7D{s0Esjd77&^PCZ+*a7CAONs~E+Q#p;(IfFAf zi?cb0b2-mTCtt!H(P16ZK^<`F{o1F!+N0gtrJZ`LN1D$CT*yUS%q3jPWn9h`T**aR z#noKHwS1@ty03e>t2?@_Te_(mx~^*uSM^aJw2te!fg8Dro4JKsxsBVogFCs4yBQF$ zhwt@HZ}kSR^-3@G!dv%qJ=0S?QDRGEd%2JMd4LCbh=+NEM|sSh0FLtnPx2I_SY(T2 z5gEaJe)?H>3uj?1jD6N8S1GsUvYeK~vRgLCXSFP@&1?b8WGR@@GFW;`XK5{snaNUH zDx<+tIxe{-v!s^9s##U5VwJ6uRkR9L-pYBSl(jNe+DchTE5YJc%!<0NMXazDvVvB? z@>@R3YkAD)Y#VEBt*oWBu;%W)nWqj!Q#V2rJIyoh1aa2o`Z=Bt$?rg1;6+~IWnS@i zC&>C(Z|h|}&6n%lL-bd9jn{dDH+hSr1G9tj8v@Huc0cX^NZL-zJ-{qKdYJJf+t M2f}#S|9|HHU&mRtwEzGB literal 2180 zcmcJPRdm(o7R2{IIY|x_IUzt20%Qi}gCM~jLQZfC?jGEOOOOP2cXxMptvga2YS-$e zExo-`O6j@}yxiBWS!?#Jd6Jw!u_%Bz6oeH*VZ;Ln(o%|`C3CO71j;i(E~kUY3POC=mYDEe&~+@uz?ta!59J?ieX5{aM%cp z#3+o0jlo!q!+7{6AOjOEHXSwzlQ9LEuq;f)G)#xhz)Z}-Yy{?DF5>55K5PLNVi6X@ zmS8ECVL5CCR$>)aBd`W*t=l@Rhi$+{Y{F*P7Hq{fY=`Z@PVB;N*dFY~KJ14bz(E|s zVb~EI#W5U*oxn+)!fDtUoW(huN8kc3TFNC{M)(z6#WhO}c&{2>!|QkhZyMgh+js}> z8s5YE_y8XouHy!7;ui3cdAD%~cMbP&9}n=*@Cc9bF+MSTiqG&l{sR20=B#wg}xKIS(@GlsD&V2ooy7GhyzJVCOE zu_#5yV#eZ3Ur$5GEUi2%7%Q?8E3-Y2E9(S&g{aj z?8dy^*~2#W#Qk&x(`-a9_GTYiU-n~v4xl%XgE*K&>}u8%ZzzW`ox}Yc!I8n_Q5>CR z-WZPMIF66t1ipBw_lKVU@4WOsrFiyo|467W=y@5O$n2P8pQvt=AVic|X%4f=}DCAM3DWKfSrJOO!p@c|;Ws~0&p>T!CX9!h@Jk>JQ zR1H;EHB(hpQDs#!Ra6C)M>$hjl~JNfn@XvqN+`ipT*c%hzlx%WCGiD?6tBYQqRysH z>ZlHCZ)&HuYJ=9MR%)phYHmtZGc{F{EL-1Ljnq&LO!ZYybydfdqM(vh+mxh<%FqPU zc#YFojWLbZD2>zz({QC@n1-5$Xs`xpplN{mtDpLs`lz>hDb3VVJ=9&@OkK5FtF+Rz zLd&&GOHE6(Sc|kUL<=-u^Q>;VVXo$Awq}`TYKEq3nrW)Cl&L9xP1YpDpVCRw2_4rl z9W@=%VI9&z(*f<*KJ7K_(QfV1PSXx;*EVf6ZP8|J(#8;M(0Z-2t!qtda8oyQ-L#a; zxST7DE4hlRxyHDb>$sj9t`vJ56LC#fbwz>8x@1WgbwPGs=X6$QWT*9|zR*V6CT`{y zZl!JGcJAO#+Ai+q7VV+!bAA^R;ldf_Vh8)og}M;uIrF>c`pw%}#Z@*}$yIa} zT=_W`U(S^^SH>k8OS{4>;SyYNSInGqaz$N{5Jv|WZ*hgp6?Ac~fNN#0rEB4u zyHs<{TvOM?HO@lcMy{c2;Od*J=jyVKOMwg8#AH|7C7G+`YPuS(y3bW}Rb6aae`oz% zU)RU=cCC6@?lf#qM^Bp^*2BHccl;^u`qu~E9AM!eH@Mgk9o8ZQ~ac-02OM$285dk}!(GJ#PrUF(j}N~1;ZFd81QARKAcPWz zfp8*-R5C5;NKXb$W+aMCWF`w)$wqc^kds{GCJ%YFQGm^ubwvR(}0FFqA^WqN;7qSa+=eE zmb9WZZD^})wxc~A=tw6z(}k{dqdPt5NiTZShraZqKLgA@mVpdnFhdy1Fx783BN)jj z^?o#C7|S@uGl7XrVlq=yrZSD`%rN_z%)&?+$uH7~sdvh!5uI3wrC5oz z*odvziM=?8qr~H+l(V>qYbrV#H*psa@f0t$MCn$nEstZiXub4yy$ z8k^9DwzQ*tva~L0bf6=hFgnwPu5=?sy3>Q6^g?>mhrYxh{pimC1|owP%n*iR9>#D+ z*uqC5c48UDXe?tGD+%Kmk7WWAC210qkts}N8q+amFq2u#7Q>jsT;?&~Hc}R_kT@10 zivr@P7T}32W(iAKhQyP=auSghtYj6dku|Jk9qWnQV0dq2lPzg8#um1+jqPH{4tBDO z-N+vHvXA}90S+oJ;)_DWn>a TTY~*HKm*k)j|Mry(}2i-F5t-B diff --git a/graphics/battle_anims/backgrounds/new/nightmare.bin b/graphics/battle_anims/backgrounds/new/nightmare.bin index c4b8b45a7c22538e8b445fdbc73ac41ada5fa8e6..11e1bb939b77c7965123d23d1e066263c447d688 100644 GIT binary patch literal 896 zcmX|-1CSm;5QTHrf409qGj?*ZbFppPwr$(CZQHhOb9S@Y>Z+Ok-g`YWHC9+-gDrO0 zMAdnz}2~iYE7~y~rp(v6lqKP4vI7RU! zkVq2Aq*e64(vhAFWF!-rm6nC9WFtE{bU!D#$W01)$V)!*Q-FdLqOduuol%6M6r(sL zD5)rwQk15Qn$f(nl%qTqs7NI$E3QISs!^R9)T9=*siRNSr5^QZpilgN)xW(Vjc800 zn$nEsrr&~=w4ya_NKMjmZE0tE7TVK+j&!24u63a+-RMpaGtrY?^rjDe=|_J<9l$`- zAH-mWFqC1YGTiL6+w2&@NJgn{G-K2{mT`<{0x5BtJCR9DW(rf8#&pG6&0r?8j9%l} z%waC`n9l+hvWUejVJXXu#Bx@!l2xo`jjpU^9qZY^M)QPCY-S5v*~WHuu#;WvW)FJ} ze;@lfz(EdiSXYj4lw%y{grbw2;S|U zJKW_S_j$lW9+}z4JmD$Ncy1~$RQHlsyygvWdB=OjANa^8KJ$gIeB(Pm_-W>U@tZ#e zr4cK!78|h@^~+)}4&o?I;;cw37qN(|xQV-Xh^MZ3>8rQ+h_CAW#9sm=P=X{_QHX>} en1l-=ddfnCL`sxION_)yoWx6lBubJb>+WB&5yRO4 literal 756 zcmWN|cR-W{7{KB8`|iMF$sH$45PmPn2IV44D?AP>M-WhshA0QpP9v=>JNuxare#@L zY19>B!+}(^j6jQqMO3sk$!;XXy$`BkFVT2Pwq!>mNLy5*o zgt&;o%`g&Ti6g1d7EgkZ$Z(QKw!|}n6jJ#=D{10QXQYrpCRt=#Ql3LDdE`4NV3g$@ zO`+i76pA?2l7=yy#_5cOaRkobOwJOD8IP9|!AB_*I2+Ef0+F1{L}3z>nZkLNw3kuN z`BZdEk+ZXsDlWjdkf}^#y7b8mF5+S?K`vz`)y$$~Hl7;%)KXIyoK`q6hk7m(F6Roa zVs?iG|p2<`x$DJ+~qO7IPaGu11=C z6L04Zf0f+HT`XZKmCO8fcL$G!upHM4?lGG0Wu?&~_i;a~cmRsCU2PAtnl-{hJj^4k zZSu9Q<58L$+aD7iC&&{#DYUSjRyLSC#nU|F>wi|*$R;+k1=`Y#t+ex;gXej{KiI*G z!b`l&E4(Uf<25>Y-9Z=KrS9$Q5Z>TTdU(r9^S#YGyvt5_&#ZW#UOuplF@1c{c&O}=9v`)dQ=3kNvJAr1#?R~|7tj`9OP z3di_~pE+)sJ%jwhuly$b&I$hDPX~YTcWu`{{0sk;_KF&6+SR6ZHR?4~bci}MOvAe+ z${iM=ks77OP>oinx^VkqNObEkjTMi?X}l(AqB@6bl6aGKgc>QDs;HKDB~8=U;B+5hn5kc3VLN2Is%PH_HD-UY63 zgL{I92RyB`9Wo%}zxYh>Lgqx%EXay%79u-xASZGGpq0;U@yui06b!uK17G+dFZ_`Y z0SH8X1R)q9D1d?}gu*C-q9}&qD1nkFh0-X4vIs>vgdrReh(virAsR7=MFmtuB~(Tg zR7EvZM-9|OE!0LG)I~kiM*}oOBQ!=6G(|HsM+>w>E3`%%v_(6#M+bC7Cv-*^bVWCG zM-TKwFZ4zq^hH1P#{dk(APmM348<@E#|VtXD2&D!jKw&NM;s<#A|_!nreG?jVLE1D zCT3wa=3p-7VLldM;lH#9i?IYtu?)+x0xPi!tFZ=a5s!6Pj}6#}P1uaj@HxJ)+$5(j z@fEgUE4E=fc3>xVVK??*FZNkH_TvB!;t&qwYkY%m@g2U$5BSldpYSt&!LRrYzvB-a z!BHH;ah$+OoWg0G!C9Qcd0fCnT*75s!Bt$tb=<&B+`?_#!ClhTim{Fa4O8{>;Y!1~NZ`7|akBU_lmQVHROg7E4COS%M{5ilteG zWf{tH3}ZMW7|HUCVl-oz3MooSASHoMHG#w(8p{v+w*ueyZ$(yO;?3mGALC<9@=Wqm zd!^O;mu>aoH>FncOya4toUD9hIx1Zf4~HatW_c-7lF45_8I{4xSD~jo5_osH$yF|i z_WhMte)5%%ykR8kO&$x8+v-3;xs+2ml-)APrmV`6h>ul_q7|j`id2Nc6{d0uRauo$ zX_Zn*l~8dNQ&AOBVHHwA6;OzR6{P$MRDklSz1pd*+NiZ!sij(|xtgh|ny9fFsUaGu zzUry2>ZrDAsitbEx~i$Fs;IImsiG=qyvAv)s#`o}vjH2jzxt`K z`lz>hsi%6VySk~Xx~Q`{siQh*nU<;%8?yLOsx9isPVCGs?8jpTCa7A z$6Bq?YOK;qtLNDuWu_jONqbw{^#OE+~x*L6)-bw!tTNf&iN=XFkJbw;OkN+)$f z$8}7ZOh%Kzcp4AmZrqHkaWT%u$)q=qCY^CG_9m^dGqxs;No{OQD)UZn^+vDtN-y<7 z&-F|NOo$0KK_8tGJqLxR&uL X{h#vxlajzEoIv8%{8)egU;Y0l8x2FS literal 1904 zcmchW*LN0V8pP*I0)!q2z0QPr2|a`sdOipNLg>Bs4$?bff>Ym2}wwaa9$*i@#i85^;nFN;w+J$8jI|2 zo}IWqvm{HgbU`$;49mvS&c&BwLU|^!!uT~6*(Eu;su(M=^5yh|Dy+(C`Ddy#sRnD} zR4vwKqz>znRP;>$6kMzqy=n%cK2zC%4T(l<%qDC~G-Dc@Go5I`mTbk=L>p$XE!z?8 z*?}F|iRjEsM%jhv$}DzcHqo6u*poR#FXpm0`w)HEkNr7-7|1~!%pt^34&!i+AVzW& zM{^7@mg6{{6NrhN#L1jOOyx9A=L}*dXK^-fAm(r`=W#xapxsF)R4J_bBViPxW3%3&6xScz=li0=G+{3-Z9o)w| zc^9L1Uyj_v{k)erz=J%*!^9CD(+f|H+s5 zFYsl)!i&5FzRK75I^O`_=dl~)o}K^2v( zN>F80QB_rgs;h=-s#ct8tB&eMBZQ4yCJwTB;S) zT5Xh}wp6=VMD5i<=%`NWtV|)QF6yc*p_{VRT|I=J%26+Y*JF|Y*8eAX@pSy|yj)$( z>#dBu@_p1-h3OX}vCMgyZF55`EfyJGwuFo4IOAG^FD1u0mbUgnq^!$CGyADj1DD*N zRm5sFS50x1%L6LAQZ%oBqLN*4{F(|*N_2Ub%U|8tjo^lE;8fQy#b8JG)x#qx`O)(- zUDtIIUE8(rQcc&OtLLB3buZ_@J>A3Ioeg($mbif=m%U%WDq&($oHFUGq=oZ}y-KN{MR_mbk+MpNwe4L;2vwj90&co+? z)=&Ek{FI;c6Mh{2&foeQe+_@-FCFt2@aO)_pZXK{V}IlieHH$|@B2N!3%}zlzU;T* zxBRBx@aynve$|(J5v~#{he{zCp<<{Il0tcea-nP}6G|hL3ME5gD1lHs6blI<9w9D7 z0>X9p7ys;^{3HB>ulaiy!YxCKkRF;Nq=jaoX=sAbI5Y|ki=Yjup?)Y(0klz@v{_r$ zMsl}mTZt>%wFBCzUD~ZZP_4l!ip^#h#-&c3`r6ptt<3J6m{?#JwqSR67Z{*mf*ljPyPXNvXCMB& zzHaC2{JuQb{dnO`DpD&xq`^x`OFGhv40>lIlLx-?HDM;R!E7;+g{))~*~vjpa*>-n z|%@B zwz7@wZg#L!>|(cW4}00iehv^pq&UbSH-|Yw6ww?N#|YC>#1QM^I43yCDNY;C5Jx;` z#W~K43+leeCFL@~T8Q-uSCwl7X%4QFpxnU0O>XIKbBDX!!>;{vp9ehTkt~mSBA)V$ z=e*!0uawuk@#rn@crQK>pe6f=lTX5F`7Fy9l6~bH-$`_l#1G{szxeIu5B}PJe*vVk B6bJwS literal 676 zcmWNLWpI=S7zW=b9B@G4?!${NM}Pna4aKc|L4yZ(IINUX+@<9R7Tn!}ySqbihvG$w zy9DcR@^5E$c4qzI6ebZt3OvY@l2iz#CbO3`rnIgv9kD+oiS$-113vJF}C}S#1Im#Oqs7NI$hfTjw1(z73D%Ge?4XA0VMJ%^D zX%bRX^EC_5+?*D)G_^8X(}uRR3y0L64ut5KTz8@~UFhoNSGtAt8{HFJ{Z0?lAM}i% z7rp5dQr~0dM5`bD8GsFB5Q7g0 z(KLz4#7uEDm1#_Om2w6%nPr-7j?G~%^O%nou#iP8cI7N#sc9LBVZ|&b(+XCyDpAgA z)|l3^&Xuia0~^_dXER&aYTAaoJyAQ@$u9i6*<;$vgkVCn_OU;#100Ot5QjMu($NTx zah$(RC!#oMIz_tEoJqbvOaI`2sB>^0U7%<1qL)itMpsCtt6X#S57)&FZqg+fC*9&U zcerbg|6lHz?(+aWyylJRb!6;YbKc?Cdp>yi YNK#mz_#BVE@Re_g`rl8fU>{-j9a=N1jsO4v diff --git a/graphics/battle_anims/backgrounds/new/shattered_psyche.bin b/graphics/battle_anims/backgrounds/new/shattered_psyche.bin index 225d8e95f306009a6aab40fd1a56d2f9e74400f8..233f54c10477c49c18eb12233c141defcf7094ce 100644 GIT binary patch literal 896 zcmYk)Wl&X76oz3hA}J}Yz`H>Dn%Es+cPln_Cw6ytcPn;xcXxMpcf0O^VVrN~{5WSn z-(GvqF=0h&tVx575nJrA*Ery)NsANCxZsK#?xe#5PrUHP2VeX&=`oQ3e*y>u!;7Kq z2{OE;!;xSz5<)0pgcCs|QJBd@X7yRrXC)iii6#d*$whARXhUA|k>9WdC`cg+t1m)P zicy>xVktpMN>N%HOq8K4CTvrkZ9nH_p(4mb9WZZD>n7+UwpO=%~IEol|@lJ%gF9B+!lS^q?ob=uIE>ed$Mk z1~8C8I^ST1FjTE2!x*08V;I3mMlqT(I)f!+8OL}gFp)`2W(rf8#&m7)V}{z9%wjfk zm`kiV=>+qb&jJ=|7O|KmEM*zX^&VG{$VyhRT07UMUduZ5>)F6YHtEcp*uu@f`);vkNa zRuc8bEO8P~wVpVOi@1uLxJw-A#6vujJG{gXZwbLie8o@FO9t_mcmfO`D2Nz7NP=~Z ZB^lL+NT}`ne$VV#5*0pi3H@uvXN5o*^Aq>Y$I3@y{V5FEL6ctkpDNYGW;vi9! zBAU`j3}q-wEKWJ%#KdEe@>HNAm1qTNN@^qtxSg|PO z^CoZcHetPahdz?umyCYm_Gdt*J5UP6&maaf1Q|*W?=lSMJ%*c%_sPYC7{N$J8DIEl z@)#q-95WWiW#$I?fbkwaWC9aSx?|)cCNY^Q$W%UN8q@L4;1gzQk546EK4TWM`5gNT zGW;opUoyvLF7w39=PO|WU-J#$hD_7%SjhJ*N@B5@^@CZkgry;Qu#DxbVC8s|vx?Q~ zT_f(=5biwIF*s?xO+FjU*g9-XW|N67Fh@3!7(+*krSNc6sL(g z!&$4-Km2QD#h&AQsF8E&0vCl#T;>W_g=<{r1~-LU+~y8bj0Kl->w%5+KZQHhO+qP}nwr$(Cy~_&{kU#_`2tf%(a6%B0P=qE7VF^cg zA`p>CL?#MRiAHo{5R+KMCJu3lM|?mMkdQ@0trU*qTMsZ3|l2VkW3}q=tc`8tmN>ru_RjEdGYEY9} z)TRz~sYiVp(2zznrU^}HMsr%wl2){)4Q**hdpgjOPIRUVUFk-5deDELd)dc+4seh|9Oei|ImU5LaFSD; z<_u>!$9XPrkxN|W3Rk(tb#8EzTioUjce%%X9`KMyJmv{cdB$^I@RC=&<_&Lo$9q2T zkxzW)3t#!hcYg4bU;O3|e+ghf0~y#L1~r($4Pi(_8QL(0HJss%U_>Js*(gRen$eA6 zOk)|_IL0-e@kLEwLKB(TBqlYP$xUHOQ<>T{rZt`E&0t0|nb|C6HJjPZVNP?I+dSqq zpZP6dK?_;fA{Mon#Vuh;OIg}7mbIMatzbnfS=lO9wVKtfVNGjU+d9^@p7m{DLmS!H zCN{O1&23>zTiMz+wzZw@?O;bc+1W03wVU1TVNZM6+dlTSpZy)+KnFS4Ar5tz!yVyB zM>*Otj&+>lo!~?#IoT;rb(+(i;Y?>a+d0m4p7UMcLKnH%CI1IYUFLFExYAXwc8zOY Z=Xy7|(M@i4i(B31c6YebUG8>|{{R5J02=@R literal 1052 zcmWmBg<}o~0LI~WrY1i*?e}Un-Q8_^Y}oK&820Iynr^1MnU3kcbLF~RcZa*<%Jm)Y z`4^r*TDTNO7Q)GjvXPw}7L6l?5aZDVCNhc1XbMxA#&k4;RAw>@&1MdBNkj9P&jJ>rMJ#3sOVKixvx1dq z6{}f8I$Fy**0TX^WD}d&g0`}a?d(81*~M=55Vn_n?B{^ObdU@VaTp!pD91RCPH>V_ zoJN_P;VkFSc`k5~OXxCJxXLwjof|yH!UMeadHi&KKxQzT#`XLEmzR@Aw}5z+LX~Bl?M- z`GsH6eSYJ2{y=~77k~2)`j`KB@Tgs3&f;)qwX!+8b2z6J;atw`JXT)kbAAV`0xsx6 zE^HNXQAfI%Roo?9(xt4@F5|Msvdg)=D_9j>$(3Ejs_JTvaY1Kp&GsD6b(%HL^S!_etwmn!C0=SR^K!57N^6x@dyUhrwO;4--e7I?CU5o@ zYpb_;yLVVSz0143$J*!Z1k6R~v(x-gd%JdnZ^*QUjFZiM_ xS(kmqSAEU8?i-c@=zpo9xKLzB_mgiYXC|d5DJ2*aj82RS>P~z_;;n>?*oPEd4TAsx diff --git a/graphics/battle_anims/backgrounds/new/snuggle_forever.bin b/graphics/battle_anims/backgrounds/new/snuggle_forever.bin index a4bcc4440d2d31ceb954cbd82d167f0607304af4..3abd4431783972300e5c4d0ca3c7a872b26b0aee 100644 GIT binary patch literal 896 zcmW-X1#lDw6a|6c5C|3=cHsg64tIBVcXxMpcXyYdElve(k-DNS(n4LJg0#3@GCT9$ zpT93Y2?!%0iAYQml9G(%q#z~Xq#`vDp$-qEAuZ`hPX;2%NT$#yGg;zXSRgCe$W9J& z0+Nf|1c(Smk%zoQ6CKP)ehP$akb)GVFhz(85u_-^VmnZr5|pGAr71&M%2A#QRHPD> zsX|q%QJospq!zWQLtW}op9VCf5shg=WOP%S(VP~vq!q1cLtEO>o(^=R6P@WoSGv)i z9`vLaz3D?=`q7^O3}g_48NyJ8F`N;MWE7(r!&t^Ko(W835|f$2RHiYV8O&rBvzfzO z<}sfIEMyUjS;A75v78mGWEHDf!&=s{o(*hd6Pww>R<;qtc6P9nUF>ELZ}4Uud*gB+ z`#Hct4snPD zLmu&%Cp_gD&w0U1UJ=juCNRu|CNi-}OlmTdo5GZao66Kin8viGGrbv%G^3f!Y!MEiZNMn=nAd3Ynco5iEodPNTg0Lkv$!QJX(>xv#Od)vpp z_OrhO9OxhiJH(+5bGRcM=_p4##<7lbyc3-0Bquw?sZMjcGo0xxXFJEa&U3yCT<9Vf ryTqj~bGa*A8Df>IUE^BUx!w(Kbd#Ii;#RlC+1N#l+udPIRP6m4$fWka literal 988 zcmV~$1z-&b0LS6~v+-t(H!(5e_vek_jp>dt-QC^YUDMs&F?AhWaKRndo#KM);7;C& z3%)Ou86^eCMikK~J2?mvgK`o}E^-ryBM*5ADX6$`Jo(6v3Q&*)3XxG*@kJ;~VpLd( z6eEe^s03h2qEdtjMUqiz%8)`zB)Tl+D6galN~Ho7Nh3X3fe4kT911F2g{oAex~M@- zYEfI%p)U2PFB;I0bQ+1qWYC1Bq8ZI;K}*q!*0iCmXh(YzQaXr^bfPm|L|3}eogShm zz35FJ(U*SoXMh;UAO91@2)!ciWHx=d%5UO#u5gt<#GhQ_Iyb~kZgHEx#NXWEF89QJ{^4K#6aVu7IUr|ql%t(p z&f%bAoKucv_)fe0hNvdXX2)OT5&}yj))4 zm0so5@*1!8IEc%wIYbEX1Yyw%&hUEblH-sRo$9`E%&?@#jql0we%LB||&R&pp6 F=^@Y~?;-#I diff --git a/graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.bin b/graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.bin index 44eb2f82d37873ec3d8612aa44f9cd175742750e..9bbee7ab43894b318dcfee60baefe1ca5cfdd132 100644 GIT binary patch literal 896 zcmZY5XLJq*0EJAD-q(n|#ol`p#NM&@2(dSbnb>;&@4cwnF4Bp>lHpYSQ4@j0hB%^A+}1z++NU-J#$a*p#{ z;3D7gJ(sx54*@^&6F+l>tNg;RT;n>w@jExT8E}i++~F>N@F#!qH~095fBBF9xzB@S z4|&96o{++nrZTl@OlvyRo53J6n#s&&F{|0kZVrPDF{ioAZK!$7Yd-TEW&sOYNYug> zv8crix40!NX(>xv#(MndfiV;?|n$@jgO>0@(I@YzG^=)878`;<zTiMz+wzZw@jkJRu?PQdl?P6EE+1(!Yw3of@V_*B(-)ILo&_T%tJH(+5bGRcM z=_p4##<7lbyfIF2qOneLvQwPuH17ren(ho|2G%TRJ13C2&U3yCj5FSafnMZdm$=kr jCYb1QSGdwuu6B)UUFUi?xY12+c8gox=5}|OWDHLM_?`P! literal 968 zcmWO31!I*30EW@`V|Tz9uuC^QFWsX%HoCjJyBS@hySp2cMhSyZP*709E-X^%HaUOc zgcBpAfFwi^LXjjT8Oc!;DTpQ|N=0g72%|KlB^~Ke1~QU~%qR<4$wqdRgPi07WO9>- zyeJ>}DL_F~h{6=1C@MyAVkv=2Qi{@)L1igNc`BfaRH8CfP*ti?oj4Rv4Qf&g)us-0 zsfX&*fQB?ejcGztnxW>jpe3zPYueD3cBnla=tw8jnJ#pt8|qFEdeRH^rVoAThx#*s zfeb=}8NyJ85e#PpBS|38C`L1ev1lCQnZQIeiOEbM5lv+p)0u&0GK<;FL35eMd={XE zEMhTB2rXq9%N49ZD_O;A)}XblV?7(tMmDjTEodv-*v<~LlU=;RtLQae=MCOOyV=8D z_M!b8;2?+4TfEI-j-aC);~m~b@9{pzIYHz}PVoW3hlq~I$0nP2#o-_Y+|<2pA8ZgPv;{GmX9a)-Oz zL-%>WLmr{WJmD$N2tDToe-ZqR{^4K#dzr7mNgUyj73ri-=HynCQ#jfwtyE6!7>BJi zPV00|Z)I>sXL4pMi?ceLvs*cw)47ag=XM_FwemT?3%Hsj^PzzyBVYV0O%>Sk7R zw{T0hvRb>1+q#|A-W}Z0ovhC8;;!yyb$1W5Lh3mcm diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.bin b/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.bin index e6227db9c9d8e449155452362f88ca325272b8be..44fab7fee209711e834a46e3c57c69bf169bee9e 100644 GIT binary patch literal 896 zcmW-dbyyZ=97QLnAYdT^_PO|b1@uD%6a!QQ6$9)pP>`?_0RwE;p_>b9vt743UFfEp zZn~KZW7DM_3v(O#+`sR0&b{UE!kh9`pdvo_QVBo&37|4ns7f`e6G#n$s7Wv(gc52Y z7HqW$vf2b%9qLk#`ZNGU7!5HTjR+@#NE*`w4^cEFnr6fhOB`_)YcbZGXlp@~c`Tlm zw4ya_NFb56w4*&qbRd}&I?{>Gq|$}1bfY_Iq?2xG)`On(qBp75hraZqf7yls3}g_4 z8NyJ8F`N-(kjY3!kwrG6$sw0K^2xV6%e5REL$+nvSjI7)2~1=XlbOO)rZJrYW>82G z#mr^OVs9AJ0QP%p*L?V?53iJjqimWf@QN49j_z z=XjnMSiwqGvC3B33R}$@UgRZ~+gjGKo(*hd6Pww>%e=y?yvFOi!JE9r+q}cOyvO@& zWgFYsZrg0DeZUTO@*yAH=YPy6>|!^c@)>*B%jbN-KKAn^UvYqge9bo;;xI=zT9zYr z*p6|WZ~2bz`GFIh`D zzlryF@een+$t`Ykhr9gCe>|Xa@{+g8tAZ-ZN4}~gKlv*_0nXp~xyq`ds;Z{y3RDdR zsiuMzqEOXRZPig-)l+>n5R$^wP$s8F3Ri?873m^exNEE?@+eAS?%w}R6|H89QLN(B zTrCu@mTINeYNG@ts;%0oy^_>H$x2a*OLiUANu8CdE=qJ=)lJ=%rgZgCPxVr7^-*8- zQ-2N6Kn>Dh4be~y({PPYhBB4uGTcawQkJqcS~<$qJ%c>uYmCNfoW^T{CTfxFwuX}0F5*cG`#SE2$}s{a90+wKkk literal 1000 zcmWO4heODD0LJ0BK~$(v*`Js1k5E#Ptz=X7UPYnoO&K|E@9hR|@4a#R+}?NG-h1D1 zd!Kv$h9_lvoD@SWam1qrG$esWs4}igIv^;Jn|_(1tCA=g&j-mQu=4Stt$T7>_0}k&$5%@spXtR2`g# zrZa(x9Q(^|iqJ->IIgQiN8Jx*k zoQ=-mT+ZWsbO9H#i;K|3T*9U7Mtj)H-moWVcesqpxdL6uu5cAsqieX9>$o1>z>VC* z&FB_x!y5cUV{3-|K?50df_4^#gLkD|vo$m2YLp5!T> z<{9)X&+$Ajpci?GmwAPlS2@ICUQ>(?heP3Y-av2i7H{(odYAWjpAXQ7e8k6mf(_lp`Fa=x8_+^dmpJV=I+jR&i`wp)cPLIbx%3Z`7UrTxwi}5$9?5~?(YE} zC=c>r7r9s-;t~(_P(>xtFc0?#d89{qU^H4DpE+*w|J|!S#?ouv?;2$HbmPUq+@J@?P34` diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_player.bin b/graphics/battle_anims/backgrounds/new/spacial_rend_player.bin index cae5112e003a1b2d5924c329d59bd2231481a186..7b479c88d672f56c52b5a2633d6b41aec8cdedca 100644 GIT binary patch literal 896 zcmW-eb$FKr0EAtS?sdEe_tCK)-LM`THEKPuTN=eyy3GY5pe3znO&i+Mj`nn*Bb|sNo&*v}BAFCY zNh6(*obEKII>pIOa-v0Nx?lpj(v9x)peMaTY;XF|mwsfBNfz1UkV_u<>mwC)*0Sj5gA}{m;&-Xmf^&HRk`CPzaF61IE<`ORDGA`!|u4D;I zLk*U(oE5BO6{}gpTGp}7YrV$nS>+9^@N#ct6Pww>R<7b|uHjm)<9cr3MsDI}ZsAt8 zaT~XD2Y0fa9qjOS-^JbB!@X?tecaCjJjg>l%p*L?V?53iJjqi$%`?Y0c$S^);yHG+ zhrR4$pZ9u?cl&vEd8c3CMPA}%_H%$&c$L?9oi})sw?gdOyu-V^$NPN1hkV4x9OMv( ze9)ipDWCBZ)$)t{&>CUh1tr>Z^XrP^Pk!tsLblFXY@HC&*WS4bVUh(qIkIPz}>? zjnGJq(rAs*SQV&HMJiSmB`Q^!$~8_EsyxnD1{J}0P0&P5(qvU>il%CsrfY_(Rij$f Osa_3gRFh_Emi_~I!0bK% literal 996 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 diff --git a/graphics/battle_anims/backgrounds/new/water_pulse.bin b/graphics/battle_anims/backgrounds/new/water_pulse.bin index 0982424c63433ea0fc13a7591f3f6d68f7ae4b97..f6cc14657fac5dbae19f34921823a3d2b08cdc1f 100644 GIT binary patch literal 896 zcmbWvV{aG$6h`69w*AbuZQHhO+qP|XHagq3%^$IL$+C7?vTivaZf^3P6Hd7QBz%w; zK}3;67DZIiL>EI$vBVZfT=B%0KthQmmPAs?B$q-;sic+$X{D211{r0NSr%DklU)uu z<&s+-dF7K|0Rb=6Z}0}VCO zSQAY((_9NJwbEJ}ZMD;02OV|NSr=V((_Ife_0n4(ef87d00Rv&*bqYvGu#LxjWXI8 zV~sQ31QSg%*%VVvGu;d`%`)2@bImi~0t+p&*b+-Ev)l?Rt+Lu0Ypt{11{-a%*%n)E z6A)&$+hM0&Vcv%<@3zNY`|Nk%pZ$XlIqZm|jtLARz;P#>bjoRGoOSMx#q%z>=#tB> zxcb8jc7wSV>I-z;4L3tIZn^D_yY9K~frr2Ce|AFNM;?3Psb`*h;iXqzd*f{w%wLsv YK~^yDeeltze{zE>pMCMwx4(Md0VT#JbN~PV literal 600 zcmWmB1y>Vb0EW@`V`4IxVhu$fY%EknW{cfow_7eD2ST~QHa7s zQbZI5q9`VcQ-YF|5~V3aG-X9O%2R=gB8Ey-rizHADsfa3@p!0C4N;R?)TWN8OFa^( zFB;I0Ml=>pXi77hix#w`6|F@Z5@}02(Vh-;q?71O7rN3-bf*VB=_PuTL?8N!e)MMm z1H~W)GlZdH7{eLCNHL1hjA5)8$9N`?EG9CE$xIPbnZ|Txh!nicWR{rC9Og1l%x3`$ zStJ&-grzJK%UQunR*BWDVJ+*#dN#0;O(K=eY+|;L%JfvkN z;5^8oP!4m%x~<7DN5wIYbApo|PT5Fne8HzVBhGS;^IQPGOd1!tBrX%+3Rgq8#&sL3 zup8(mx46w6BJOgJ_(aEjpVJ@210M3om+)9T;VI8}?%)M4Ne{$WBR{Wr%^UQVcf98V s`bY+!_)PK_8*NQe>Q}|N%r^($`N2;cWsTRD{)^xI;cvjY1OJfz13JB^$^ZZW diff --git a/graphics/battle_anims/backgrounds/new/waterfall.bin b/graphics/battle_anims/backgrounds/new/waterfall.bin index 0fbe00ac638522361e182ee6aa56cbdf876bec29..076beeff2fe1ba44277bad014102fbcc7c3180bc 100644 GIT binary patch literal 2048 zcmXw21(a1s6yxK%xG#`Ef-dgv?(XjH?(E|3&f@NFEmWZH?nUbEUOIf}nUmZkcix;g zb7mrlgpoAL$&ef=kP@koI`}k5i*!hj42TIXMi~QVLgv6(kQLdG9XXIQxCn9~ci=q8 zi&*4CeiQ&e6ht8iMqv~|Q4~XQlt3Ixq7+J_49cP$%A*1*q7o{j3aX+Ss-p&Kq84hS z4(g&F>Z1V~q7fRS37VoAnxh3;q7_=B4cej|+M@$Hq7yo!3%a5kx}yhrq8ECj5Bj1X z`eOhFVh{#n2!>)9hGPUqViZPW48~#{#$y5|ViG1}3Z`Njreg+XVism&4(4JW;*o&) zSb&9C6!y0mORyBnf?AFhfmdP`R$~p;Vjb3F12$q4HitZdE!c`}*dEp4112^#$p2jnH7SG{%ynq++5?;nDconbVb-aN$ z@fP03J9roG;eC975AhK`#x2~&9o)qy_!OVvb9{j>@fE(tH~1Fc;d}gmAMq1@#xM94 zzu|ZMfj{vV{>DG}7x$2a5hi6aCT9w!WGbd+8m47Bre_AmFe5WDGqW(953?~lBgny= z%*EWy!@P`TKIRWu0fJ;f7NY3jV_ldwOE^VSU2c;tj`8)$VP0;CTz-PY|a*J$yRL5Hf+mwY|jqt$WH9c zF6_!~?9LwS$zJTuKJ3eW?9Txl$Uz*;AsotK9L^CO$x$55F&xWr9M1`y$Vr^cDV)k_ zoX#1X$yuDuIh@ORjAsJpa{(7}5f^g_mvR}Ga|Ks&6<2c&*K!@#a|1VW6E|}Uw{jb| za|aW-le@T^d%`aE2JGX09tiay5AiUM@FpYn4`pKUtyWftP8imS}NMi?mP+G+zmd z*F4SD9L?4&&D0D{*ECJl6iwD7O$;;l1l%9HLrv5!?Nnk=JHm;^JnU@OHf`0GsN1Yf z+Ncd$uXS3hH6c6oaMpuW!Yhxi_Q0Lg2_4rl9Sw8hqw|jFuny^<4rssjX|G<<%X&#K z>IFTo=k%Iprr$8=rS^r#-uRbA0#UD8Ee(0QHHS)I{o{h;sloxasK z`dVMJeZl8_&S!nbr+q5qCj(CSxR3d$kNB_;`Cv#6c)$0B Hx;NlI69yLt literal 2128 zcmWN|Wk8k(8wKF=yntdMcI&y}+=_{c*h<*lVqswyb~grgcVTyTt=#6yO}Dvj*X`Qn z_g(+5Xhb3|U~~{-L>R-t2DfI~Qx!#Erq!I2!r(cl=41{3@;v64!uhxsL0(0o=$<+{`VJ z+{$g%VLNw3aVK|K@1Q|YefPp(=pN>9FCv0C?n^GUKbUoZ2f;%;%p*LSm&bVAR%Hbn zPJkzQil=!dnnkMB+8=O{?sm>o>*Cqq`Z=B_F7P5R@iK9RS9y)si5tAh$M`t$1fS$n zyhS|CXZS2{6VLH^zQ7lWmw1OS^A+MQ@9|Z>M!e4Ze1mTiZ}Dxu!*_}I_&z`2hr~zx zn4jM#>!eb zD~}?mU^KHB3y(FKBetvu6|IuRS!KkdidD60R^5Uc7H>7J7E;0k*0u!Zu4BoG=u+3} zS$&IWU=6Ji1~f(nnpjgyvSdq6L1wBov*v~t*3w#8YeO4rYwfJPp@Vg_PS)Ab#kyKI z>u%^_JuS_88G2hE>udcC>DJ!{*g(S|8*CXi#4yx`*>D?S7-^$yw2d*0wQ-hd;|&vR zqD`{NhAB4HrrC7E44Y}QY_?&J&9!+p->|?IT9z#`EVd=K)UplBY`Lwlm4;Qe+Sb@w z!#Z1U8*HOtlWn#ww$-rBw%ZQdY1n1EZI9(x#9rHH`-8*-L4)vvcE}C~DMt)P?U)_6 z6BcpOPTA?8+nFE@XYHJww+n`gcF8W=6^poP*X(+bc_WyF5-P4@Dyl+7R5+AgNYSAT z7F5E+0?My^k;*$6idPM&x~i$Fsz8+$r%I{_ zxujUdKqjh!%0uN;R%KK=J9N90O2*vju5M6Qbx~(^f;y^$+N&MZR&CT;t)P}_q2_7^ zr7A_qN`jiIi5jaB)KCpnU-h86O4MXcf+lK$#w!yVr?DEN(aI zf#yT=G*@#p8=9q=nxW|-P196O30t>6r`e``VY~KduX3trPuStzL6@jzr+0<4Q#-Uh z_U1NdtF~yfHifiN8?-*`-r1a6_ZMY7IHS`#l~*TqBJ5FC>_5k$V>+rMIt(4sK^@RN z=&oMT%en)-q!;yqo`;^(Z9S`Jpr>_9Pw7eM2|cdIbQ8Lv>$;|^&=pst1r+@Vi^tb-fpLzuSq2KkJeuaL~ z&-zJK;Z;0fWseJaC9mjZ!z2EmjUT@}}Md?HbQVr$*k;8+iRlujh4`V9DVpXO723VgCp@`*kHKHf8ZoR5W%@zFlYN5V(= za3AJF;X{1C@AJLz9N*)+eHVPE@9^!u4ZhX4_-5Y(-{>2By|06>^)v0#`pL|JQ`fWJb@qM- zdvMaE{r3+)kS<+~kl$)Xw`!@aPMGTc^>RJ+HPA3gwC-px<ZP|n`s$~@0R|dmupx#TX1EbX$~8(}WVC!^6jW0f znkr+1af%chZ-R*?nQV%wrllk$O%F*bF~iJ|l0?!hv&}KrJo7EE&?1X1vD7llBP*=5 z%4%z@jjgjjw!uc5Y_`SL$Tp=)6Wi^u(=NM%J@!V*?6Y6F0}h7#amZmu9CgfbC!BQ3 zX=j{u&UqJHbjf8`f~%2ht_L?#+fBFJcE?@!-1opkk39CoQ_np2!b`8b_QqT9ypMhG dF{MJKibU1+$!A|ezJ{hUOy7JD?+-s?zW_AAo!0;W literal 520 zcmYL^$5#^p7zckJn_y6*8?a*;B_g6I*ek3JtQfKPwPQ!@l?bT8f{48#V(-E3jX#Nt zXXQN(ygAHV$BjEGGTN<+e_h#Ge>>F>Op!SRoAaFjSwT|imQ-G-y`arWqdRU7ddkA| z!tITVMMy^(^r0{Pu>K5SAcJJeWH3V*iiQEh89^Y6C?kE#CN>JoQO0O;(HO>($2c^e zdP%KJV$RZYtB`jqbrMWEk zEGAn)uq?z%R>>)g#>8sYu$FaVJsa4_Cb5|W)I~F-}bW4xBVOt z2RX!HD&p7?DyfVf6~{Qv2~H+tr#OwB;jB2vc`i`ZCa1#UT%;P+P|GDQqbnq+<0`tw zb#73P-K2qAGNd4)rncSGw%ydW?cV%(lX>lQrgLWY?(V(k zn`??0=2&2+=(AHq4`Twfz zXio<^(uvM=A)W-f(v9x)_^%m9PkPatKJ+D#e)MMm0~y3%hA@<23}-}o#z;mnnlX%3 zjAOiF0u!0UWTr5cc>Oe{GlQATVm3+4VJ`ES&jJ>zghk3(Y{U|ls%aU^S;0zHv053a ztYIzdv~E2c*vKX}vxTjinM^X<*v<~cPIj@IJ?v#4`#E5+(=yWPK@Mr#!yMr#$2iUj zjgy?>G-o)=InHx|i(E3YFLQ;f+MGg){u|>;V$>M&jTJR9;v&>JmINP zg7F{z?4R+R7rf*ZuX)2;-YM%nANa^8KJ$gIeETcsJ3sho*!{vpOvOxLu2l=M6f4n* zwV1@FZf(R?>?8?$aS%swQe7&};-WfNaT9m(5Kr+EU8J}8h_CpGzXXVh1WJ$~BEb?O ZdI^;@KZ^I=*%ZQXHiIy0NmEYoV0a*Y5 literal 760 zcmWO4g?|)u9LM3$?{>HCw!vAd-T?(E}vJ0F-Vp zXhf+IN@IY95`uIcNUEUw7oOJ>2t`N^4-t3?`f!m%5sm!B5K9~?LQ&!gpahDMNO6=z z2}+WTH-%D^mMeqGQjYR~j8rO+hSI4>B`V`Gs6r-La^7qnpsM`UP<3ihlLt`_wWv)U zRF`_xrvWaPhiFJpPK{_x6PlujX~rWo$NMOc@p#ZZfm+a#RTxYuA)RkxGMjm>W=jcuk)RSI3&kML0d5M>KC0Ms0>{|PK(}!14UtXgh{m}ph zGKj$>zs`_w<_R~HH^iH~#oG)MA%-)8kzy318N*l)`HW+HUd;*O9VRk~$@y|qcvo&J z?}_*MfDf4_2Bb}A1|Nx!naM0>i#g0?9`j>Zz(U&l8)vRGH>+r4T3pP;y%R<_(*vKZi&1ef-DPS9s+u6a+VD1#(*YFMPcCnj1 z9`>@2{kQ|-Am8#G--{nO#9@AfpF+7m^9#R*m~ez6X}|G%Do2@djN@u}Lj1u=PVr|9 zr#T~cR%g$}ah?m|VPVHbaf!=Z;i?F8jqCgsa_Kj?$t`Y+JKW`O{uxn_^Dp7$RbwM;^j|h6TlLbSj-ZwxGc#^SV@ag wMzWCvSiuzKccR{%m4rY diff --git a/graphics/battle_anims/backgrounds/spacial_rend_opponent.bin b/graphics/battle_anims/backgrounds/spacial_rend_opponent.bin index e6227db9c9d8e449155452362f88ca325272b8be..44fab7fee209711e834a46e3c57c69bf169bee9e 100644 GIT binary patch literal 896 zcmW-dbyyZ=97QLnAYdT^_PO|b1@uD%6a!QQ6$9)pP>`?_0RwE;p_>b9vt743UFfEp zZn~KZW7DM_3v(O#+`sR0&b{UE!kh9`pdvo_QVBo&37|4ns7f`e6G#n$s7Wv(gc52Y z7HqW$vf2b%9qLk#`ZNGU7!5HTjR+@#NE*`w4^cEFnr6fhOB`_)YcbZGXlp@~c`Tlm zw4ya_NFb56w4*&qbRd}&I?{>Gq|$}1bfY_Iq?2xG)`On(qBp75hraZqf7yls3}g_4 z8NyJ8F`N-(kjY3!kwrG6$sw0K^2xV6%e5REL$+nvSjI7)2~1=XlbOO)rZJrYW>82G z#mr^OVs9AJ0QP%p*L?V?53iJjqimWf@QN49j_z z=XjnMSiwqGvC3B33R}$@UgRZ~+gjGKo(*hd6Pww>%e=y?yvFOi!JE9r+q}cOyvO@& zWgFYsZrg0DeZUTO@*yAH=YPy6>|!^c@)>*B%jbN-KKAn^UvYqge9bo;;xI=zT9zYr z*p6|WZ~2bz`GFIh`D zzlryF@een+$t`Ykhr9gCe>|Xa@{+g8tAZ-ZN4}~gKlv*_0nXp~xyq`ds;Z{y3RDdR zsiuMzqEOXRZPig-)l+>n5R$^wP$s8F3Ri?873m^exNEE?@+eAS?%w}R6|H89QLN(B zTrCu@mTINeYNG@ts;%0oy^_>H$x2a*OLiUANu8CdE=qJ=)lJ=%rgZgCPxVr7^-*8- zQ-2N6Kn>Dh4be~y({PPYhBB4uGTcawQkJqcS~<$qJ%c>uYmCNfoW^T{CTfxFwuX}0F5*cG`#SE2$}s{a90+wKkk literal 1000 zcmWO4heODD0LJ0BK~$(v*`Js1k5E#Ptz=X7UPYnoO&K|E@9hR|@4a#R+}?NG-h1D1 zd!Kv$h9_lvoD@SWam1qrG$esWs4}igIv^;Jn|_(1tCA=g&j-mQu=4Stt$T7>_0}k&$5%@spXtR2`g# zrZa(x9Q(^|iqJ->IIgQiN8Jx*k zoQ=-mT+ZWsbO9H#i;K|3T*9U7Mtj)H-moWVcesqpxdL6uu5cAsqieX9>$o1>z>VC* z&FB_x!y5cUV{3-|K?50df_4^#gLkD|vo$m2YLp5!T> z<{9)X&+$Ajpci?GmwAPlS2@ICUQ>(?heP3Y-av2i7H{(odYAWjpAXQ7e8k6mf(_lp`Fa=x8_+^dmpJV=I+jR&i`wp)cPLIbx%3Z`7UrTxwi}5$9?5~?(YE} zC=c>r7r9s-;t~(_P(>xtFc0?#d89{qU^H4DpE+*w|J|!S#?ouv?;2$HbmPUq+@J@?P34` diff --git a/graphics/battle_anims/backgrounds/spacial_rend_player.bin b/graphics/battle_anims/backgrounds/spacial_rend_player.bin index cae5112e003a1b2d5924c329d59bd2231481a186..7b479c88d672f56c52b5a2633d6b41aec8cdedca 100644 GIT binary patch literal 896 zcmW-eb$FKr0EAtS?sdEe_tCK)-LM`THEKPuTN=eyy3GY5pe3znO&i+Mj`nn*Bb|sNo&*v}BAFCY zNh6(*obEKII>pIOa-v0Nx?lpj(v9x)peMaTY;XF|mwsfBNfz1UkV_u<>mwC)*0Sj5gA}{m;&-Xmf^&HRk`CPzaF61IE<`ORDGA`!|u4D;I zLk*U(oE5BO6{}gpTGp}7YrV$nS>+9^@N#ct6Pww>R<7b|uHjm)<9cr3MsDI}ZsAt8 zaT~XD2Y0fa9qjOS-^JbB!@X?tecaCjJjg>l%p*L?V?53iJjqi$%`?Y0c$S^);yHG+ zhrR4$pZ9u?cl&vEd8c3CMPA}%_H%$&c$L?9oi})sw?gdOyu-V^$NPN1hkV4x9OMv( ze9)ipDWCBZ)$)t{&>CUh1tr>Z^XrP^Pk!tsLblFXY@HC&*WS4bVUh(qIkIPz}>? zjnGJq(rAs*SQV&HMJiSmB`Q^!$~8_EsyxnD1{J}0P0&P5(qvU>il%CsrfY_(Rij$f Osa_3gRFh_Emi_~I!0bK% literal 996 zcmWO41!ENi7>3bz$>>XO+v?$fOooC@X43W@LoYBP~)RB~+U_)TJJ(PXii~K#gcj6PluC zG^YjGD2JA`qBUwmTiO94+C|%F6KWl;qGjZSOnW*IC`m^;(V6rvbfudLyQ3cTq!+zW zA9CqS9?GYHe)J0!M1JH&-%xJ!iQds44PYRJ3_^n$LJ>pJForXNkt9YjT5F0aL8Xjg zEaT94CNLq!hsMR&7!#$Tk|>UeOhRQ$W(rf$G^R6ynIvX0Ticp52hF9Nc~qeJR8mDX zTEK#+j;c^)%#Vtg7b=g1EaEV9I7e_KN1>xRhGRJn9nT4z$VupA7PEw zRk1QwgqFv$SQ<-0i{lhda4R=uFPyY|bJ5T+ZYClwlX3wXEYp)}xEqz(zKq zO|daH#KmZRT*A6o8@iOsxST7{m0ZQuT!XIVIx}OJlkcZI2Ji? zJ9fph>KU7^dTSdG5gSd_Q$^X z1bxb9e9jl>OTOZ3zCqve9pCc<`jMabnP1Sa{KoJ6f&SzGfAKf^hkvQzAUedMI2bh{ zImM|?vkpYMGn{GFa+Yhmj#bz7T;C0x)zAqy+TO^G Date: Sat, 30 Oct 2021 10:02:25 -0300 Subject: [PATCH 149/193] Fixed Pikalax's PR --- src/graphics.c | 78 +++++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/src/graphics.c b/src/graphics.c index 2d0ff9a5c..70b50eadf 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1407,88 +1407,88 @@ const u32 gBattleAnimBgTilemap_RockWrecker[] = INCBIN_U32("graphics/battle_anims const u32 gBattleAnimBgImage_SpacialRendOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend_opponent.4bpp.lz"); const u32 gBattleAnimBgPalette_SpacialRendOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend_opponent.gbapal.lz"); -const u32 gBattleAnimBgTilemap_SpacialRendOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend_opponent.bin"); +const u32 gBattleAnimBgTilemap_SpacialRendOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend_opponent.bin.lz"); const u32 gBattleAnimBgImage_SpacialRendPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend_player.4bpp.lz"); const u32 gBattleAnimBgPalette_SpacialRendPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend_player.gbapal.lz"); -const u32 gBattleAnimBgTilemap_SpacialRendPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend_player.bin"); +const u32 gBattleAnimBgTilemap_SpacialRendPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend_player.bin.lz"); const u32 gBattleAnimBgImage_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark_void.4bpp.lz"); const u32 gBattleAnimBgPalette_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark_void.gbapal.lz"); -const u32 gBattleAnimBgTilemap_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark_void.bin"); +const u32 gBattleAnimBgTilemap_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark_void.bin.lz"); const u32 gBattleAnimBgPalette_SludgeWave[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/sludge_wave.gbapal.lz"); const u32 gBattleAnimBgImage_Aeroblast[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/aeroblast_tiles.4bpp.lz"); const u32 gBattleAnimBgPalette_Aeroblast[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/aeroblast.gbapal.lz"); -const u32 gBattleAnimBgTilemap_Aeroblast[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/aeroblast_map.bin"); +const u32 gBattleAnimBgTilemap_Aeroblast[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/aeroblast_map.bin.lz"); const u32 gBattleAnimBgPalette_AuraSphere[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/aura_sphere.gbapal.lz"); const u32 gBattleAnimBgImage_BlackholeEclipse[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/blackhole_eclipse.4bpp.lz"); const u32 gBattleAnimBgPalette_BlackholeEclipse[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/blackhole_eclipse.gbapal.lz"); -const u32 gBattleAnimBgTilemap_BlackholeEclipse[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/blackhole_eclipse.bin"); +const u32 gBattleAnimBgTilemap_BlackholeEclipse[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/blackhole_eclipse.bin.lz"); const u32 gBattleAnimBgImage_BloomDoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/bloom_doom.4bpp.lz"); const u32 gBattleAnimBgPalette_BloomDoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/bloom_doom.gbapal.lz"); -const u32 gBattleAnimBgTilemap_BloomDoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/bloom_doom.bin"); +const u32 gBattleAnimBgTilemap_BloomDoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/bloom_doom.bin.lz"); const u32 gBattleAnimBgImage_BoltStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/bolt_strike.4bpp.lz"); const u32 gBattleAnimBgPalette_BoltStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/bolt_strike.gbapal.lz"); -const u32 gBattleAnimBgTilemap_BoltStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/bolt_strike.bin"); +const u32 gBattleAnimBgTilemap_BoltStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/bolt_strike.bin.lz"); const u32 gBattleAnimBgImage_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/clangorous_soulblaze.4bpp.lz"); const u32 gBattleAnimBgPalette_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/clangorous_soulblaze.gbapal.lz"); -const u32 gBattleAnimBgTilemap_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/clangorous_soulblaze.bin"); +const u32 gBattleAnimBgTilemap_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/clangorous_soulblaze.bin.lz"); //const u32 gBattleAnimBgImage_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/dark_void.4bpp.lz"); //const u32 gBattleAnimBgPalette_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/dark_void.gbapal.lz"); -//const u32 gBattleAnimBgTilemap_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/dark_void.bin"); +//const u32 gBattleAnimBgTilemap_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/dark_void.bin.lz"); const u32 gBattleAnimBgPalette_DynamaxCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/dynamax_cannon.gbapal.lz"); const u32 gBattleAnimBgImage_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/electric_terrain.4bpp.lz"); const u32 gBattleAnimBgPalette_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/electric_terrain.gbapal.lz"); -const u32 gBattleAnimBgTilemap_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/electric_terrain.bin"); +const u32 gBattleAnimBgTilemap_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/electric_terrain.bin.lz"); const u32 gBattleAnimBgImage_Fire1[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/fire1.4bpp.lz"); const u32 gBattleAnimBgPalette_Fire1[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/fire1.gbapal.lz"); -const u32 gBattleAnimBgTilemap_Fire1[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/fire1.bin"); +const u32 gBattleAnimBgTilemap_Fire1[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/fire1.bin.lz"); const u32 gBattleAnimBgPalette_Fire2[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/fire2.gbapal.lz"); const u32 gBattleAnimBgImage_FocusBlast[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/focus_blast.4bpp.lz"); const u32 gBattleAnimBgPalette_FocusBlast[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/focus_blast.gbapal.lz"); -const u32 gBattleAnimBgTilemap_FocusBlast[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/focus_blast.bin"); +const u32 gBattleAnimBgTilemap_FocusBlast[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/focus_blast.bin.lz"); const u32 gBattleAnimBgPalette_GarbageFalls[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/garbage_falls.gbapal.lz"); const u32 gBattleAnimBgImage_GigaImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/giga_impact_opponent.4bpp.lz"); const u32 gBattleAnimBgPalette_GigaImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/giga_impact_opponent.gbapal.lz"); -const u32 gBattleAnimBgTilemap_GigaImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/giga_impact_opponent.bin"); +const u32 gBattleAnimBgTilemap_GigaImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/giga_impact_opponent.bin.lz"); const u32 gBattleAnimBgImage_GigaImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/giga_impact_player.4bpp.lz"); const u32 gBattleAnimBgPalette_GigaImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/giga_impact_player.gbapal.lz"); -const u32 gBattleAnimBgTilemap_GigaImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/giga_impact_player.bin"); +const u32 gBattleAnimBgTilemap_GigaImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/giga_impact_player.bin.lz"); const u32 gBattleAnimBgImage_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/grassy_terrain.4bpp.lz"); const u32 gBattleAnimBgPalette_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/grassy_terrain.gbapal.lz"); -const u32 gBattleAnimBgTilemap_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/grassy_terrain.bin"); +const u32 gBattleAnimBgTilemap_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/grassy_terrain.bin.lz"); const u32 gBattleAnimBgPalette_GunkShot[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/gunk_shot.gbapal.lz"); const u32 gBattleAnimBgImage_HighSpeed[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/high_speed.4bpp.lz"); const u32 gBattleAnimBgPalette_HighSpeed[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/high_speed.gbapal.lz"); -const u32 gBattleAnimBgTilemap_HighSpeed[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/high_speed.bin"); +const u32 gBattleAnimBgTilemap_HighSpeed[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/high_speed.bin.lz"); const u32 gBattleAnimBgImage_HydroCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hydro_cannon.4bpp.lz"); const u32 gBattleAnimBgPalette_HydroCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hydro_cannon.gbapal.lz"); -const u32 gBattleAnimBgTilemap_HydroCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hydro_cannon.bin"); +const u32 gBattleAnimBgTilemap_HydroCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hydro_cannon.bin.lz"); const u32 gBattleAnimBgImage_HydroPump[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hydro_pump.4bpp.lz"); const u32 gBattleAnimBgPalette_HydroPump[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hydro_pump.gbapal.lz"); -const u32 gBattleAnimBgTilemap_HydroPump[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hydro_pump.bin"); +const u32 gBattleAnimBgTilemap_HydroPump[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hydro_pump.bin.lz"); const u32 gBattleAnimBgPalette_HyperBeam[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hyper_beam.gbapal.lz"); @@ -1496,33 +1496,33 @@ const u32 gBattleAnimBgPalette_HyperspaceFury[] = INCBIN_U32("graphics/battle_an const u32 gBattleAnimBgImage_InfernoOverdrive[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/inferno_overdrive.4bpp.lz"); const u32 gBattleAnimBgPalette_InfernoOverdrive[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/inferno_overdrive.gbapal.lz"); -const u32 gBattleAnimBgTilemap_InfernoOverdrive[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/inferno_overdrive.bin"); +const u32 gBattleAnimBgTilemap_InfernoOverdrive[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/inferno_overdrive.bin.lz"); const u32 gBattleAnimBgImage_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/leaf_storm.4bpp.lz"); const u32 gBattleAnimBgPalette_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/leaf_storm.gbapal.lz"); -const u32 gBattleAnimBgTilemap_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/leaf_storm.bin"); +const u32 gBattleAnimBgTilemap_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/leaf_storm.bin.lz"); const u32 gBattleAnimBgPalette_MagicRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/magic_room.gbapal.lz"); const u32 gBattleAnimBgImage_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/malicious_moonsault.4bpp.lz"); const u32 gBattleAnimBgPalette_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/malicious_moonsault.gbapal.lz"); -const u32 gBattleAnimBgTilemap_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/malicious_moonsault.bin"); +const u32 gBattleAnimBgTilemap_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/malicious_moonsault.bin.lz"); const u32 gBattleAnimBgImage_MaxLightning[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/max_lightning.4bpp.lz"); const u32 gBattleAnimBgPalette_MaxLightning[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/max_lightning.gbapal.lz"); -const u32 gBattleAnimBgTilemap_MaxLightning[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/max_lightning.bin"); +const u32 gBattleAnimBgTilemap_MaxLightning[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/max_lightning.bin.lz"); const u32 gBattleAnimBgImage_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/misty_terrain.4bpp.lz"); const u32 gBattleAnimBgPalette_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/misty_terrain.gbapal.lz"); -const u32 gBattleAnimBgTilemap_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/misty_terrain.bin"); +const u32 gBattleAnimBgTilemap_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/misty_terrain.bin.lz"); const u32 gBattleAnimBgImage_NeverendingNightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/neverending_nightmare.4bpp.lz"); const u32 gBattleAnimBgPalette_NeverendingNightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/neverending_nightmare.gbapal.lz"); -const u32 gBattleAnimBgTilemap_NeverendingNightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/neverending_nightmare.bin"); +const u32 gBattleAnimBgTilemap_NeverendingNightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/neverending_nightmare.bin.lz"); const u32 gBattleAnimBgImage_Nightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/nightmare.4bpp.lz"); const u32 gBattleAnimBgPalette_Nightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/nightmare.gbapal.lz"); -const u32 gBattleAnimBgTilemap_Nightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/nightmare.bin"); +const u32 gBattleAnimBgTilemap_Nightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/nightmare.bin.lz"); const u32 gBattleAnimBgPalette_PoisonFalls[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/poison_falls.gbapal.lz"); @@ -1530,19 +1530,19 @@ const u32 gBattleAnimBgPalette_PsychicNew[] = INCBIN_U32("graphics/battle_anims/ const u32 gBattleAnimBgImage_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/psychic_terrain.4bpp.lz"); const u32 gBattleAnimBgPalette_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/psychic_terrain.gbapal.lz"); -const u32 gBattleAnimBgTilemap_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/psychic_terrain.bin"); +const u32 gBattleAnimBgTilemap_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/psychic_terrain.bin.lz"); //const u32 gBattleAnimBgImage_RockWrecker[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/rock_wrecker.4bpp.lz"); //const u32 gBattleAnimBgPalette_RockWrecker[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/rock_wrecker.gbapal.lz"); -//const u32 gBattleAnimBgTilemap_RockWrecker[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/rock_wrecker.bin"); +//const u32 gBattleAnimBgTilemap_RockWrecker[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/rock_wrecker.bin.lz"); const u32 gBattleAnimBgImage_ShatteredPsyche[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/shattered_psyche.4bpp.lz"); const u32 gBattleAnimBgPalette_ShatteredPsyche[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/shattered_psyche.gbapal.lz"); -const u32 gBattleAnimBgTilemap_ShatteredPsyche[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/shattered_psyche.bin"); +const u32 gBattleAnimBgTilemap_ShatteredPsyche[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/shattered_psyche.bin.lz"); const u32 gBattleAnimBgImage_SkyDay[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/sky_day.4bpp.lz"); const u32 gBattleAnimBgPalette_SkyDay[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/sky_day.gbapal.lz"); -const u32 gBattleAnimBgTilemap_SkyDay[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/sky_day.bin"); +const u32 gBattleAnimBgTilemap_SkyDay[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/sky_day.bin.lz"); const u32 gBattleAnimBgPalette_SkyAfternoon[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/sky_afternoon.gbapal.lz"); @@ -1550,46 +1550,46 @@ const u32 gBattleAnimBgPalette_SkyNight[] = INCBIN_U32("graphics/battle_anims/ba const u32 gBattleAnimBgImage_SnuggleForever[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/snuggle_forever.4bpp.lz"); const u32 gBattleAnimBgPalette_SnuggleForever[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/snuggle_forever.gbapal.lz"); -const u32 gBattleAnimBgTilemap_SnuggleForever[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/snuggle_forever.bin"); +const u32 gBattleAnimBgTilemap_SnuggleForever[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/snuggle_forever.bin.lz"); const u32 gBattleAnimBgImage_SoulStealing7StarStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.4bpp.lz"); const u32 gBattleAnimBgPalette_SoulStealing7StarStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.gbapal.lz"); -const u32 gBattleAnimBgTilemap_SoulStealing7StarStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.bin"); +const u32 gBattleAnimBgTilemap_SoulStealing7StarStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.bin.lz"); //const u32 gBattleAnimBgImage_SpacialRendOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/spacial_rend_opponent.4bpp.lz"); //const u32 gBattleAnimBgPalette_SpacialRendOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/spacial_rend_opponent.gbapal.lz"); -//const u32 gBattleAnimBgTilemap_SpacialRendOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/spacial_rend_opponent.bin"); +//const u32 gBattleAnimBgTilemap_SpacialRendOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/spacial_rend_opponent.bin.lz"); //const u32 gBattleAnimBgImage_SpacialRendPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/spacial_rend_player.4bpp.lz"); //const u32 gBattleAnimBgPalette_SpacialRendPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/spacial_rend_player.gbapal.lz"); -//const u32 gBattleAnimBgTilemap_SpacialRendPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/spacial_rend_player.bin"); +//const u32 gBattleAnimBgTilemap_SpacialRendPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/spacial_rend_player.bin.lz"); const u32 gBattleAnimBgPalette_TectonicRage[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/tectonic_rage.gbapal.lz"); const u32 gBattleAnimBgImage_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/trick_room.4bpp.lz"); const u32 gBattleAnimBgPalette_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/trick_room.gbapal.lz"); -const u32 gBattleAnimBgTilemap_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/trick_room.bin"); +const u32 gBattleAnimBgTilemap_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/trick_room.bin.lz"); const u32 gBattleAnimBgImage_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/twinkle_tackle.4bpp.lz"); const u32 gBattleAnimBgPalette_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/twinkle_tackle.gbapal.lz"); -const u32 gBattleAnimBgTilemap_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/twinkle_tackle.bin"); +const u32 gBattleAnimBgTilemap_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/twinkle_tackle.bin.lz"); const u32 gBattleAnimBgImage_WaterPulse[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/water_pulse.4bpp.lz"); const u32 gBattleAnimBgPalette_WaterPulse[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/water_pulse.gbapal.lz"); -const u32 gBattleAnimBgTilemap_WaterPulse[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/water_pulse.bin"); +const u32 gBattleAnimBgTilemap_WaterPulse[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/water_pulse.bin.lz"); const u32 gBattleAnimBgImage_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/waterfall.4bpp.lz"); const u32 gBattleAnimBgPalette_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/waterfall.gbapal.lz"); -const u32 gBattleAnimBgTilemap_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/waterfall.bin"); +const u32 gBattleAnimBgTilemap_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/waterfall.bin.lz"); const u32 gBattleAnimBgPalette_WonderRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/wonder_room.gbapal.lz"); const u32 gBattleAnimBgImage_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_activate.4bpp.lz"); const u32 gBattleAnimBgPalette_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_activate.gbapal.lz"); -const u32 gBattleAnimBgTilemap_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_activate.bin"); +const u32 gBattleAnimBgTilemap_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_activate.bin.lz"); const u32 gBattleAnimBgImage_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_mountain.4bpp.lz"); const u32 gBattleAnimBgPalette_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_mountain.gbapal.lz"); -const u32 gBattleAnimBgTilemap_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_mountain.bin"); +const u32 gBattleAnimBgTilemap_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_mountain.bin.lz"); const u32 gBattleAnimSpritePal_SteelBeam[] = INCBIN_U32("graphics/battle_anims/sprites/new/steel_beam.gbapal.lz"); const u32 gBattleAnimBgPalette_SteelBeam[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/steel_beam_bg.gbapal.lz"); From 468ee66cd877b175244eb204a1b5cd24cd379d78 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sat, 30 Oct 2021 11:04:50 -0400 Subject: [PATCH 150/193] fix synthesis and leaf guard w utility umbrella --- asm/macros/battle_script.inc | 7 +++---- data/battle_scripts_1.s | 12 ++++++------ include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 10 ++++++++-- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 3de14f586..7e35f6ab2 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1989,10 +1989,9 @@ goto \jumpptr .endm - .macro jumpifleafguard jumpptr:req - jumpifhalfword CMP_NO_COMMON_BITS, gBattleWeather, WEATHER_SUN_ANY, 1f - jumpifability BS_TARGET, ABILITY_LEAF_GUARD, \jumpptr - 1: + .macro jumpifleafguardprotected battler:req, jumpptr:req + various \battler, VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED + .4byte \jumpptr .endm .macro jumpifsafeguard jumpptr:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 180c74eed..c050fb4be 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2512,7 +2512,7 @@ BattleScript_EffectSleep:: jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects jumpifflowerveil BattleScript_FlowerVeilProtects jumpifability BS_TARGET_SIDE, ABILITY_SWEET_VEIL, BattleScript_SweetVeilProtects - jumpifleafguard BattleScript_LeafGuardProtects + jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed jumpifterrainaffected BS_TARGET, STATUS_FIELD_ELECTRIC_TERRAIN, BattleScript_ElectricTerrainPrevents @@ -3054,7 +3054,7 @@ BattleScript_EffectToxic:: jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects jumpifflowerveil BattleScript_FlowerVeilProtects - jumpifleafguard BattleScript_LeafGuardProtects + jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_POISON | STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned @@ -3409,7 +3409,7 @@ BattleScript_EffectPoison:: jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects jumpifflowerveil BattleScript_FlowerVeilProtects - jumpifleafguard BattleScript_LeafGuardProtects + jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned @@ -3434,7 +3434,7 @@ BattleScript_EffectParalyze: jumpifability BS_TARGET, ABILITY_LIMBER, BattleScript_LimberProtected jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects jumpifflowerveil BattleScript_FlowerVeilProtects - jumpifleafguard BattleScript_LeafGuardProtects + jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed .if B_GLARE_GHOST >= GEN_4 @@ -4874,7 +4874,7 @@ BattleScript_EffectWillOWisp:: jumpifability BS_TARGET, ABILITY_WATER_BUBBLE, BattleScript_WaterVeilPrevents jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects jumpifflowerveil BattleScript_FlowerVeilProtects - jumpifleafguard BattleScript_LeafGuardProtects + jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed jumpifterrainaffected BS_TARGET, STATUS_FIELD_MISTY_TERRAIN, BattleScript_MistyTerrainPrevents @@ -5152,7 +5152,7 @@ BattleScript_EffectYawn:: jumpifability BS_TARGET, ABILITY_INSOMNIA, BattleScript_PrintBankAbilityMadeIneffective jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_PrintBankAbilityMadeIneffective jumpifflowerveil BattleScript_FlowerVeilProtects - jumpifleafguard BattleScript_LeafGuardProtects + jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed jumpifsafeguard BattleScript_SafeguardProtected diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 74c2a3f59..18ae63179 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -195,6 +195,7 @@ #define VARIOUS_APPLY_PLASMA_FISTS 122 #define VARIOUS_JUMP_IF_SPECIES 123 #define VARIOUS_JUMP_IF_WEATHER_AFFECTED 124 +#define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 125 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index dbcd3ad95..44ae0e33e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8990,6 +8990,12 @@ static void Cmd_various(void) else gBattlescriptCurrInstr += 9; return; + case VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED: + if (IsLeafGuardProtected(gActiveBattler)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5); + else + gBattlescriptCurrInstr += 7; + return; } gBattlescriptCurrInstr += 3; @@ -11514,9 +11520,9 @@ static void Cmd_recoverbasedonsunlight(void) } else { - if (!(gBattleWeather & WEATHER_ANY) || !WEATHER_HAS_EFFECT) + if (!(gBattleWeather & WEATHER_ANY) || !WEATHER_HAS_EFFECT || GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; - else if (IsBattlerWeatherAffected(gBattlerAttacker, WEATHER_SUN_ANY)) + else if (gBattleWeather & WEATHER_SUN_ANY) gBattleMoveDamage = 20 * gBattleMons[gBattlerAttacker].maxHP / 30; else // not sunny weather gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; From 0ddcb69c65a5f9387d3b7e6434d0d95a3671a377 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 30 Oct 2021 12:14:28 -0300 Subject: [PATCH 151/193] Fixed Move_SPECIAL_REND typo --- data/battle_anim_scripts.s | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index ada08afc5..48f180e06 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -478,7 +478,7 @@ gBattleAnims_Moves:: .4byte Move_HEAD_SMASH .4byte Move_DOUBLE_HIT .4byte Move_ROAR_OF_TIME - .4byte Move_SPECIAL_REND + .4byte Move_SPACIAL_REND .4byte Move_LUNAR_DANCE .4byte Move_CRUSH_GRIP .4byte Move_MAGMA_STORM @@ -4166,7 +4166,7 @@ Move_ROAR_OF_TIME: waitforvisualfinish end -Move_SPECIAL_REND: +Move_SPACIAL_REND: loadspritegfx ANIM_TAG_PUNISHMENT_BLADES loadspritegfx ANIM_TAG_PINK_HEART_2 @ANIM_TAG_BERRY_EATEN monbg ANIM_ATK_PARTNER From 1925874d355a3911c14e856a16eb7da92a1911a8 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sat, 30 Oct 2021 11:18:50 -0400 Subject: [PATCH 152/193] hunger switch unaffected by wandering spirit --- src/battle_util.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_util.c b/src/battle_util.c index 07b7cd7e7..3453aac15 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4846,6 +4846,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move case ABILITY_DISGUISE: case ABILITY_FLOWER_GIFT: case ABILITY_GULP_MISSILE: + case ABILITY_HUNGER_SWITCH: case ABILITY_ICE_FACE: case ABILITY_ILLUSION: case ABILITY_IMPOSTER: From 2282c4fb5c687267a8f10ae727327bd706da3f77 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 31 Oct 2021 12:09:40 +1300 Subject: [PATCH 153/193] Fix MOVEEND_CHOICE_MOVE Oops --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b2dcb3958..ab1e2b531 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4942,7 +4942,7 @@ static void Cmd_moveend(void) break; case MOVEEND_CHOICE_MOVE: // update choice band move if (gHitMarker & HITMARKER_OBEYS - && (HOLD_EFFECT_CHOICE(holdEffectAtk) || GetBattlerAbility(gBattlerAttacker)) + && (HOLD_EFFECT_CHOICE(holdEffectAtk) || GetBattlerAbility(gBattlerAttacker) == ABILITY_GORILLA_TACTICS) && gChosenMove != MOVE_STRUGGLE && (*choicedMoveAtk == 0 || *choicedMoveAtk == 0xFFFF)) { From c87e2433a7294376b83467010e362d703cd1a883 Mon Sep 17 00:00:00 2001 From: Blackforest92 Date: Sun, 31 Oct 2021 21:41:39 +0700 Subject: [PATCH 154/193] Minor fix to Steel Beam --- data/battle_anim_scripts.s | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 48f180e06..73aeb9259 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -13947,6 +13947,8 @@ Move_STEEL_BEAM:: loadspritegfx ANIM_TAG_ELECTRIC_ORBS loadspritegfx ANIM_TAG_GUST launchtask AnimTask_ElectricChargingParticles 0x2 0x4 0x0 0x14 0x0 0x2 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 20 loadspritegfx ANIM_TAG_STEEL_BEAM call SetSteelBeamBackground panse_1B SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 From dfb92fa74e4c13021f0764fa3b09d0ff3ca06a7d Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sun, 31 Oct 2021 11:12:17 -0400 Subject: [PATCH 155/193] fix VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 44ae0e33e..ee46c4c35 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8992,7 +8992,7 @@ static void Cmd_various(void) return; case VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED: if (IsLeafGuardProtected(gActiveBattler)) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); else gBattlescriptCurrInstr += 7; return; From e59d0dd5cfdb63457d4f89bbc385a1785c911115 Mon Sep 17 00:00:00 2001 From: Blackforest92 Date: Sun, 31 Oct 2021 22:58:43 +0700 Subject: [PATCH 156/193] clean Spacial Rend background --- .../backgrounds/new/spacial_rend.pal | 19 ++++++++++++++++++ .../backgrounds/new/spacial_rend.png | Bin 0 -> 6531 bytes .../backgrounds/new/spacial_rend_opponent.bin | Bin 896 -> 896 bytes .../backgrounds/new/spacial_rend_opponent.pal | 19 ------------------ .../backgrounds/new/spacial_rend_opponent.png | Bin 5861 -> 0 bytes .../backgrounds/new/spacial_rend_player.bin | Bin 896 -> 896 bytes .../backgrounds/new/spacial_rend_player.pal | 19 ------------------ .../backgrounds/new/spacial_rend_player.png | Bin 6948 -> 0 bytes .../backgrounds/spacial_rend_opponent.bin | Bin 896 -> 0 bytes .../backgrounds/spacial_rend_opponent.pal | 19 ------------------ .../backgrounds/spacial_rend_opponent.png | Bin 5861 -> 0 bytes .../backgrounds/spacial_rend_player.bin | Bin 896 -> 0 bytes .../backgrounds/spacial_rend_player.pal | 19 ------------------ .../backgrounds/spacial_rend_player.png | Bin 6948 -> 0 bytes include/graphics.h | 6 ++---- src/battle_anim.c | 4 ++-- src/graphics.c | 11 ++++------ 17 files changed, 27 insertions(+), 89 deletions(-) create mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend.pal create mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend.png delete mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend_opponent.pal delete mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend_opponent.png delete mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend_player.pal delete mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend_player.png delete mode 100644 graphics/battle_anims/backgrounds/spacial_rend_opponent.bin delete mode 100644 graphics/battle_anims/backgrounds/spacial_rend_opponent.pal delete mode 100644 graphics/battle_anims/backgrounds/spacial_rend_opponent.png delete mode 100644 graphics/battle_anims/backgrounds/spacial_rend_player.bin delete mode 100644 graphics/battle_anims/backgrounds/spacial_rend_player.pal delete mode 100644 graphics/battle_anims/backgrounds/spacial_rend_player.png diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend.pal b/graphics/battle_anims/backgrounds/new/spacial_rend.pal new file mode 100644 index 000000000..afc2b31fc --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/spacial_rend.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +208 112 200 +216 184 249 +216 160 232 +211 107 195 +208 104 192 +217 129 209 +216 135 215 +209 120 208 +218 153 226 +216 168 232 +217 176 241 +220 188 252 +203 115 203 +223 182 246 +216 192 248 diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend.png b/graphics/battle_anims/backgrounds/new/spacial_rend.png new file mode 100644 index 0000000000000000000000000000000000000000..ea98198c4c0ad4c8f5aa27d39fc9937aeeeacad1 GIT binary patch literal 6531 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 diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.pal b/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.pal deleted file mode 100644 index 7f1f61789..000000000 --- a/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 0 -222 156 230 -222 180 246 -213 123 205 -213 189 246 -205 115 205 -213 164 230 -213 131 213 -222 197 255 -222 189 255 -213 139 222 -213 172 238 -213 106 197 -222 131 213 -213 115 205 -205 106 197 diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.png b/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.png deleted file mode 100644 index 637b9cf5a93f05f59639b81ff9a52ca6009dc9a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5861 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 vbRUphQp*g@dHO5200000NkvXXu0mjfv_DB9 diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_player.bin b/graphics/battle_anims/backgrounds/new/spacial_rend_player.bin index 7b479c88d672f56c52b5a2633d6b41aec8cdedca..3b89218e0e6cbba254e78a9f11abe717002cba8a 100644 GIT binary patch literal 896 zcmWN@WnfSR0EJP(KuNpfyW8FN9z0+@n)P5wV@qR8V@qRzG}zME(%912(%7y?V|Sik zC&BTKvmNUg%NRrqvHvHIcoGN*X-*3wTGEQvG^7!YX+l$)QIGm$INfPZb&8Xnp7n7S)S>c%wjfkn9Drovw+8VoF{mar+AuYc$Po-lfU?zfB2Ul_>mP}?qy!; zC0^`BUg(7^Vlhit$}*O-g6DXi7kH7Ec$rstm4<4h#%iLbYNq-+SsT3G>%7)$yxOb0 z(kofTYSyrpb*yItukku>@Fs8ZHt+B*7wZyTs>^h_uF%;!M?1XT+q~6VyxE()(Hq&s zX11`EZER-;@9{n#@F5@ZF`w`$&DBDYTB?;=D@L(8;Qij`z24*9-sPR%$u4%YhrR4$ zKL_}X&-sEc`HHXkhHq)7_UfRH>ZHy}R*LFe>l#GY5pe3znO&i+Mj`nn*Bb|sNo&*v}BAFCY zNh6(*obEKII>pIOa-v0Nx?lpj(v9x)peMaTY;XF|mwsfBNfz1UkV_u<>mwC)*0Sj5gA}{m;&-Xmf^&HRk`CPzaF61IE<`ORDGA`!|u4D;I zLk*U(oE5BO6{}gpTGp}7YrV$nS>+9^@N#ct6Pww>R<7b|uHjm)<9cr3MsDI}ZsAt8 zaT~XD2Y0fa9qjOS-^JbB!@X?tecaCjJjg>l%p*L?V?53iJjqi$%`?Y0c$S^);yHG+ zhrR4$pZ9u?cl&vEd8c3CMPA}%_H%$&c$L?9oi})sw?gdOyu-V^$NPN1hkV4x9OMv( ze9)ipDWCBZ)$)t{&>CUh1tr>Z^XrP^Pk!tsLblFXY@HC&*WS4bVUh(qIkIPz}>? zjnGJq(rAs*SQV&HMJiSmB`Q^!$~8_EsyxnD1{J}0P0&P5(qvU>il%CsrfY_(Rij$f Osa_3gRFh_Emi_~I!0bK% diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_player.pal b/graphics/battle_anims/backgrounds/new/spacial_rend_player.pal deleted file mode 100644 index 846d3e703..000000000 --- a/graphics/battle_anims/backgrounds/new/spacial_rend_player.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 0 -213 156 230 -222 180 246 -213 123 205 -213 189 246 -213 131 213 -205 115 205 -213 164 230 -222 197 255 -213 139 222 -222 189 255 -213 172 238 -213 106 197 -213 115 205 -222 156 230 -205 106 197 diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_player.png b/graphics/battle_anims/backgrounds/new/spacial_rend_player.png deleted file mode 100644 index 993b3d8a69827d2c1e87eb1a0cfc33cfa3c96cb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6948 zcmV+<8{6cGP)0058#0{{R3eVcu=0000mP)t-s{{R5h zoaWxN_SJjM)xGxBgVoJ*&DEsl-o^jbi{9S7|JAJS)oR7nbIsnI=FMuw#EaV9000`V zNklp4ba0m_Z2Bhjwibd>{eomRrTt;`|dsW-1|zBBpi&fOl26KEaAb&vGn*E_VMjw ze`OzckABNOU%zH^{w;32lZ(e5(=cYV>&whNjDE+ftfuQ{OsWGKOT%={@Jy!Jok(Ju z-RNEUj(xnkwaPxfeaEqiS8%hdsQG?JqasH8LIdF~?)a=L>{US4J|-qHQ%~9TvzZv1 zT;1wq*B{1;?4PC=ox)Ar``A(fIT|zA4n@AmKv0Z34Z1^QezQ>WRD?(9t3 zcoM|9#%;^tw6;4PO+0oLfM=Qpt_Z-0SZsO{W0y01j487-zhgeHoi;2V zXLncQ)Aupp26y<^^iW{kG!u1%$pOy4ZWx$miKqY+0XEF}EA0Bs%s`rb);I94tiNEl zF<_+c7F`Cs1zUba1{R0S)|+*VMVnhs>)#*TH`W}h+h?w@e<=q3$bN9_ zr;OXY?QU*U+<(Tog)ig2?&0?GeHUYV%8i%sW_Q|@Jrd2qA2z*82Tfo^%v6vu@7S}` z>~2o^n*E){PqQx0m+x94ev>}V-^b4{bF+H+{rZ!w0Vy*8qqh&>F`4K+?a54~+12S8 z@Z0j`*j;Y_D*q@fn3~e)!8_bh>WN~cDSxEO@~e1>C6k$pZH5wzVd^do!Ny8Y8$SLXyI~j8H*6Yp zEPk6@d6hek)h3=>NfY0tAK@8^g{;SXaGG5$#=72Pzb$tCioHYG@QnYGUGuG`ulZ=y zQiawz-VgWwQam?zlTrRiudH?(1ZQ)%J;xp+wwmux?DJgLAK7&qfNwje*m$5D$w5fE zAp4wc)iZhAyDWZ6im;p!uWlOqa+J+?iW}ED$Cd`#Cb{Ax@7aH0<1+xB^POVGR4*nV zAB~AMkHFL4FloAuXUwcFo9TUcg>`Xe1g7SJKou;uR%8lLH@yB#jU_uW|VIucW*Ld%eZa0 zjkx_CNb(TgiuEETc93WIH+ub3L-@%U zRg~M!pp5rheVa>LpYGv-|FI5t&HV+f>pcSwdQ5qi#-ni4F(_mPaar1kxCUm*+HATB zc$F9WfUt+h3tGMKTwz~9sJ~{v<$N`5%oISDRsg2J>T%SS*2f+*Lj+1~%?bv(fb-n) z_5})U_4s_oEo8XM(C^rFUhwhzH{kL#TP#4bGdh%Xfhrol2R(^VCU_}$R0q5YK*ero z4$1`BRcE}CrZU9eGoCrc`|O4SuZ%<9$Z_;9aa(>s6<~a+E~*0XYIn2hOyY6J{$-Ot zLgiij{?num2+o`jWp#Y&Cg}li=vkUzQ=e%gz`4S7c4@u7+z~28dsV`{0*i%$Op%ho zmn1b<ℑ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 diff --git a/graphics/battle_anims/backgrounds/spacial_rend_opponent.pal b/graphics/battle_anims/backgrounds/spacial_rend_opponent.pal deleted file mode 100644 index 7f1f61789..000000000 --- a/graphics/battle_anims/backgrounds/spacial_rend_opponent.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 0 -222 156 230 -222 180 246 -213 123 205 -213 189 246 -205 115 205 -213 164 230 -213 131 213 -222 197 255 -222 189 255 -213 139 222 -213 172 238 -213 106 197 -222 131 213 -213 115 205 -205 106 197 diff --git a/graphics/battle_anims/backgrounds/spacial_rend_opponent.png b/graphics/battle_anims/backgrounds/spacial_rend_opponent.png deleted file mode 100644 index 637b9cf5a93f05f59639b81ff9a52ca6009dc9a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5861 zcmVb^P)005u_0{{R3dEt5<0000mP)t-s{{R5q zoaWxN_SJjM)xGx3bIsMH=GBAM-o^jkz5msV-qoz`)oR7wgVoh@&CP1X^35>w000(n zNkl4<5C>HrC7bfAnmW<@>cokpv z(B;Ln|2#9^>H8FS`y`1=`OC?a zRq^Er@!wYTa_t}Szin6BGwHmRP?S)%6)>%Y4MQr(rLS*p-Tbvri}|0iulbvNOvhLZ z4Dn;RJY?pS@Y{Cv>r6VV#g$wv-U^uE!!90)vhz)dKR6?bsX=y^zsYLaJ!PU@Q6|jw zA@*NDzNIc4QUZ54tsuV>+WY&%Nk48(tCu7e>e z6ILaz(9}Mdm3^&%nRH*Ek`z;Ahy7pE7~i(lA&33hyAzfSV_5#Va?W9leWfV z*vP-xQ`rHS$-IBK8nMbl%>1xvv)(XWr*Q{A%?5kE%_%CaX; zpwhn$ar|xOuH*MFnv7@sukm9x@Oy8aVP1jSpL5}-jLo+z{n+9;B^;Nex6hlxaQSv@ z>D_^|fA_J8AviL_-$&EmtVl-{C6|8dYRFKwKkakI9DHXW0p!NLkMXeTZCVgTxc|wF zxYTp$>_7Y!0kQ}_G9O)AUXi4%qNFEeXTJUBHpI;5v~=cL*BmUOKDGCM=eYJInowGJ zs1Cs5S9<^BZ)i^J1^rp;8GIoHePJbYU&da{|9(5-aXi^wlW&KxZjCV(PO6b4Oj{8O zYE@sFHwVA?TMqc|^k?1~d{KPxby0c0O;%mTzHC99@LRGh-_eZl%;qvr`mN+B%v{i( zMk8hBxaM&V_|vm&ow=BLOdh?f1XGp^K=Zt@9Wj#)UY?oK61n5@sm6kgYuf0XG9mb` z)#g>lF`0%RI_#$(Ga2tpHMKmP2*>ny_+!?RiS+ip$&5>y7B`FsJ>SkX?o1Zva$!Ng zHqX|%g+68G5c}$v_8Gi0hn9YJCUGt%j%v?n2P!_SPs=C~gbX7esLda0+<~(wLgiY` zF$wU$KVxRu{pyGI!VrzsIebx?L?=_Xy@jTOzZ^%CIbUxA)EX+GN}~ z`&_)-091Iuqj+c30hQlWD>~+OS5fl%7{&3hAzi)yt$58DWG)+IrrdK%>9mr8_VAI> zVSIDmJS~2b*+L9wPaL_0f&YvHBCh?is^V)18)3~?#NUJ@wf*mE#TumLQyue++@+k; zMe$HLHd>f=Om$vPZ8YspVPL98h3v3}|_H zvoOxP%4hh}^7R~lQogHCo|-?YC1SQ36b#OTFWZ z`BOt!$2y|eQ7iAr?{5rNi8;Sk6fHRw&z% z5?My>?~f{BaH}Q-b>9|+=AV+^+L!L;yg+qhutdxU=E!SWE*wa%Bva8Z{=gjbRKSk3 z=OH_=3^|(bM7zNy3}_?K#L0;F?nafEAuJx_hWk=|nEtfpI5Qp+jFPbcb#r7Fb>BV^=1S*}&#hgV#CC0bz+@etDifO_IWt}qMJ=TC1*&xK zMrz2eE+lw>$_8rDQq^TbL_BLUb8xvU)EeVqSmKn}F_-I`mglx04Gb+D>?u9IN$e@B zPheEEfU#(45JMA^!!-t)yYLb2Wm+%rPH_%Dmuu(i=0t%XbDMlP$et6qPR`7LZqE7Q zQtVcZf{CCVuCW(SO}C@?@b(Ts0)Uz2N6IzxVm-?92~HLu_~w5>)7CWbbD*M${y_>R zg7&Vxe%o~jNs*~y;}l8d26&-EciiXT;7GVP|-hM$H%Zq2pm~0P=nDp=9|JF-?mq-OC!ldIBP)M8~3|H z#z;jA`NyOO)zX4QG6H@Np&5Wnd%7TkPVE1q|7&!0z^Er428SnguS2*&tuMzUh_#& zbWGXOb+O|fyi2=fGxo(?x^+P~ zBb9<6rE+`(*FEfp0~^1@MNHlCyLA)aZopOh+X&Uz&rj4P^It8M~jiv{rxw?1>d z0&#aPWr@vugtbIUs0y>#67XmaxfVceRiAqrk$D_0$}8?QtS zdqCtF^N$v%xkOue2fCBnzCei#;?1miZyDx@KjhB=@v`t`Aq+Oo{dZapdL z91wE??LCY#Zu)vAdl}iBYzY}<(qC4q72lllmX`Z*m9G*jmAZ}^S||rVEKSPNt%^8U zQXRHVFL6skRLg2c-{BfPe?4N+q$iQc3PdTB;*9Q#=fZ7W(r0!RO3buv`A`l~q%S1J zL@{7l7|#T8&&~HZmABs#>WE)FD$Nq@W+_33xT9R4b{`QpC2QjD(E0eAxm3!Ih5?2_dI^ z92W$NsX{3!;Un^CWGrBE_qM^Q9v&34ECO`k24E&eUv;!`|?;OJkZU7zEC`I(tJx&>E$FG5%bMUr zBq}1_r4U4R)i&F%@vx^X@xa(sSOwUO=dW3;S(SqMCBcVC1S`N}rB3tqG4E$aD_3q_ zX}+S!KW9g-B4GqqXxK93s$!2%f*7t)?!+xNKZRVcKa-!C5{rly&9Lbv#IPSh z!CIt*aigkJ94;)Csuu0(ny|pdJV}kqE-Q5>H6xb}2UFzo?$_W;#oM&>mfj)6!jj|i z?7W0v7B_O)Hu7Bef-DPTRCcAv5d>qbp9UagyrlW50K{YwpY*4>1l$_0=L!KzY@ot* z-zYu|`kzr$6h&-`MA?gS;?ANwdXEG^KLK(A21nfHf+ql*t%${tH(C!d6E46aL?6)s z05$Hp7diwGj+BL6iK)fz#uz37i?+vM@{C5q&mZAobiTvLkoSaXi86JUA2*a7m0SFa z@LcnPKygV#Mkk8Nj!ol`#1u^#p+@6?h88GOEL-dH5fnD91Dh7QSzm!L1)kJmuWPam zAx?XIFW2X{bTDoYMQdBN%J#}{7Xr-gqO`Yi2(qDAl!DiIAmwIwB4p6m2rO1#p6-PX zBiAo<9m1n%RbdFah?KyFiCX2TtXGbdB8bS8j2cErk~-UZ@jGrfn?W-J4JY^V<#D0; z45MF=5${5@sv}kvL=pw*gV+3va#BB11!br!2xvTy^HX@+E56>*e^5*kVuq0Hf=zB;S>Wm!JyW?B*Z`63uRAHZvY_8kfV+7ID`Mh8^O z68+YK-v^(ENP(0wDAa=S#opEtHoRwZ5d?`FHUKq0Xsu*NqiRL3Bt>WspIu|6NQFko z1FBRw>Ff&Fd=oI(ky9CFPi`$6aoMt9qd(# z%&JufthqL)O(GyoBsXDfc}g<~Q0H!C%3Zuxg%M(}oq1>?hyY(aWFYpGRnVnNMnGbY zE=(Wat9YM7kX9_YhkR9-fVI@TK*05iBDI~Q$S{99PLY=)i3Alws*Tvlvg&iDN|#D9 z23DUv0nZLz_5cmg*(z7HNitvn76SandZox+hy&{7=qlnb0HMk}K*z;`CVgIQBr6r6 zeE5_p7V+K|=iq)Ne4?Q9H8oc%-uA+xke@_XN!Nm8Jv`ANRcdizr0{)PsxiJPoFw|w zjg&TBkmVk}1a3s9$~VahxO7={-3=_7m2B*?gPf7Zs~Nodte020(Ki8dMB;P_G7)r! z^p4m0f+MN&5Jg8m_XCa_l~vLciDyNqb$MnKs}&)AH|bTEf0S zjZ5L`xNflf8^2&jJa^{7(Ag}y{R^t}q;4pQGOIKO1d z%D%EAvkQH^WK;GPMwv`A!BMZ9M%V~RyM?3uWnKTSvQB6O&D{d#{=ze}tMC*K816S( z!~I_JS=d2H;=u^Xte*Dvx<%j%-UxkAWcx{$y^`y7 zFS$NQk|ea?HK+g8*7W}%XlSEuT$t1#2n~b zOm(k(uLNtC-{j`>9e_nwYB+% z)cKM&lF(Y1CE-oQ+2$f!Q=>}?ij79sE*HKow3d!31EcbBa~ZI?6*ud(;&xy)T5&>a zaU1^5GxcqS%2#L>3a#b$8t|wD-&{)N!Em#kxwA#u+|CqQ8w5mm#KFzQ-h(z=$zX*& z+Z&;+_6FOdO-xs7t61>w(SSMB+<@7&kxkdmX0|}>N8UzK_Gu%DO>Lyw-fbjm$qUpV z<&7@r-EEC71oz0;QHn}hJf=e%@7L&Zc%zFPOQ066*NVHdqZJqNT5*Y2X~hZDWZrBR zhPF2g&)1uUQp^|I(JYLKyEY32+M4gJotg297&pGJhHD*g?;{4Atzu()t5}0*f`I2A z1yhyL`;O^0TF1hEhak3^*~YeJHo-|mQ^8TCF97X()?9Bix3?$Y5Cu~+(+57rv0FR7 z1@P4lnlv96F!+H1*|%NJz2Z@r-HtSD0e*+WI=daZr~~eGoJiXDIMHs$LcB7|D;{`~ z>Ia^7JGde=AN4!%k*#<4KC&fj9!6Zb-gIL4C5Otay$_WMbd1Bl#Jc>^Z%35}@&+B} z5MJk^gC?^#GyGwbbA#Env5IDEFOtD6iK8q{BM?=qYI=+FnUa zICN;|^#HpOI%3viDLDO8t1|aHI#%>rfOOyqL^Wn)+umHVFaDSgKD`zoKk6r4p+kQF vbRUphQp*g@dHO5200000NkvXXu0mjfv_DB9 diff --git a/graphics/battle_anims/backgrounds/spacial_rend_player.bin b/graphics/battle_anims/backgrounds/spacial_rend_player.bin deleted file mode 100644 index 7b479c88d672f56c52b5a2633d6b41aec8cdedca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 896 zcmW-eb$FKr0EAtS?sdEe_tCK)-LM`THEKPuTN=eyy3GY5pe3znO&i+Mj`nn*Bb|sNo&*v}BAFCY zNh6(*obEKII>pIOa-v0Nx?lpj(v9x)peMaTY;XF|mwsfBNfz1UkV_u<>mwC)*0Sj5gA}{m;&-Xmf^&HRk`CPzaF61IE<`ORDGA`!|u4D;I zLk*U(oE5BO6{}gpTGp}7YrV$nS>+9^@N#ct6Pww>R<7b|uHjm)<9cr3MsDI}ZsAt8 zaT~XD2Y0fa9qjOS-^JbB!@X?tecaCjJjg>l%p*L?V?53iJjqi$%`?Y0c$S^);yHG+ zhrR4$pZ9u?cl&vEd8c3CMPA}%_H%$&c$L?9oi})sw?gdOyu-V^$NPN1hkV4x9OMv( ze9)ipDWCBZ)$)t{&>CUh1tr>Z^XrP^Pk!tsLblFXY@HC&*WS4bVUh(qIkIPz}>? zjnGJq(rAs*SQV&HMJiSmB`Q^!$~8_EsyxnD1{J}0P0&P5(qvU>il%CsrfY_(Rij$f Osa_3gRFh_Emi_~I!0bK% diff --git a/graphics/battle_anims/backgrounds/spacial_rend_player.pal b/graphics/battle_anims/backgrounds/spacial_rend_player.pal deleted file mode 100644 index 846d3e703..000000000 --- a/graphics/battle_anims/backgrounds/spacial_rend_player.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 0 -213 156 230 -222 180 246 -213 123 205 -213 189 246 -213 131 213 -205 115 205 -213 164 230 -222 197 255 -213 139 222 -222 189 255 -213 172 238 -213 106 197 -213 115 205 -222 156 230 -205 106 197 diff --git a/graphics/battle_anims/backgrounds/spacial_rend_player.png b/graphics/battle_anims/backgrounds/spacial_rend_player.png deleted file mode 100644 index 993b3d8a69827d2c1e87eb1a0cfc33cfa3c96cb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6948 zcmV+<8{6cGP)0058#0{{R3eVcu=0000mP)t-s{{R5h zoaWxN_SJjM)xGxBgVoJ*&DEsl-o^jbi{9S7|JAJS)oR7nbIsnI=FMuw#EaV9000`V zNklp4ba0m_Z2Bhjwibd>{eomRrTt;`|dsW-1|zBBpi&fOl26KEaAb&vGn*E_VMjw ze`OzckABNOU%zH^{w;32lZ(e5(=cYV>&whNjDE+ftfuQ{OsWGKOT%={@Jy!Jok(Ju z-RNEUj(xnkwaPxfeaEqiS8%hdsQG?JqasH8LIdF~?)a=L>{US4J|-qHQ%~9TvzZv1 zT;1wq*B{1;?4PC=ox)Ar``A(fIT|zA4n@AmKv0Z34Z1^QezQ>WRD?(9t3 zcoM|9#%;^tw6;4PO+0oLfM=Qpt_Z-0SZsO{W0y01j487-zhgeHoi;2V zXLncQ)Aupp26y<^^iW{kG!u1%$pOy4ZWx$miKqY+0XEF}EA0Bs%s`rb);I94tiNEl zF<_+c7F`Cs1zUba1{R0S)|+*VMVnhs>)#*TH`W}h+h?w@e<=q3$bN9_ zr;OXY?QU*U+<(Tog)ig2?&0?GeHUYV%8i%sW_Q|@Jrd2qA2z*82Tfo^%v6vu@7S}` z>~2o^n*E){PqQx0m+x94ev>}V-^b4{bF+H+{rZ!w0Vy*8qqh&>F`4K+?a54~+12S8 z@Z0j`*j;Y_D*q@fn3~e)!8_bh>WN~cDSxEO@~e1>C6k$pZH5wzVd^do!Ny8Y8$SLXyI~j8H*6Yp zEPk6@d6hek)h3=>NfY0tAK@8^g{;SXaGG5$#=72Pzb$tCioHYG@QnYGUGuG`ulZ=y zQiawz-VgWwQam?zlTrRiudH?(1ZQ)%J;xp+wwmux?DJgLAK7&qfNwje*m$5D$w5fE zAp4wc)iZhAyDWZ6im;p!uWlOqa+J+?iW}ED$Cd`#Cb{Ax@7aH0<1+xB^POVGR4*nV zAB~AMkHFL4FloAuXUwcFo9TUcg>`Xe1g7SJKou;uR%8lLH@yB#jU_uW|VIucW*Ld%eZa0 zjkx_CNb(TgiuEETc93WIH+ub3L-@%U zRg~M!pp5rheVa>LpYGv-|FI5t&HV+f>pcSwdQ5qi#-ni4F(_mPaar1kxCUm*+HATB zc$F9WfUt+h3tGMKTwz~9sJ~{v<$N`5%oISDRsg2J>T%SS*2f+*Lj+1~%?bv(fb-n) z_5})U_4s_oEo8XM(C^rFUhwhzH{kL#TP#4bGdh%Xfhrol2R(^VCU_}$R0q5YK*ero z4$1`BRcE}CrZU9eGoCrc`|O4SuZ%<9$Z_;9aa(>s6<~a+E~*0XYIn2hOyY6J{$-Ot zLgiij{?num2+o`jWp#Y&Cg}li=vkUzQ=e%gz`4S7c4@u7+z~28dsV`{0*i%$Op%ho zmn1b<ℑ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 Date: Mon, 1 Nov 2021 01:06:39 +0700 Subject: [PATCH 157/193] Optimized Rock Wrecker and Hurricane --- data/battle_anim_scripts.s | 2 +- .../backgrounds/new/high_speed.bin | 2 -- .../backgrounds/new/high_speed.png | Bin 855 -> 0 bytes .../hurricane.bin} | Bin .../new/{high_speed.pal => hurricane.pal} | 0 .../backgrounds/new/hurricane.png | Bin 0 -> 519 bytes .../backgrounds/new/rock_wrecker.bin | 2 -- .../backgrounds/new/rock_wrecker.pal | 32 +++++++++--------- .../backgrounds/new/rock_wrecker.png | Bin 1511 -> 0 bytes .../battle_anims/backgrounds/rock_wrecker.png | Bin 1249 -> 0 bytes include/constants/battle_anim.h | 2 +- include/graphics.h | 10 +++--- src/battle_anim.c | 4 +-- src/graphics.c | 23 +++---------- 14 files changed, 29 insertions(+), 48 deletions(-) delete mode 100644 graphics/battle_anims/backgrounds/new/high_speed.bin delete mode 100644 graphics/battle_anims/backgrounds/new/high_speed.png rename graphics/battle_anims/backgrounds/{rock_wrecker_map.bin => new/hurricane.bin} (100%) rename graphics/battle_anims/backgrounds/new/{high_speed.pal => hurricane.pal} (100%) create mode 100644 graphics/battle_anims/backgrounds/new/hurricane.png delete mode 100644 graphics/battle_anims/backgrounds/new/rock_wrecker.bin delete mode 100644 graphics/battle_anims/backgrounds/new/rock_wrecker.png delete mode 100644 graphics/battle_anims/backgrounds/rock_wrecker.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 73aeb9259..03d72f3ea 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -6636,7 +6636,7 @@ Move_HURRICANE: monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET setalpha 12, 8 - fadetobg BG_HIGH_SPEED + fadetobg BG_HURRICANE waitbgfadeout launchtask AnimTask_StartSlidingBg 0x5 0x4 0x1000 0x0 0x1 0xffff waitbgfadein diff --git a/graphics/battle_anims/backgrounds/new/high_speed.bin b/graphics/battle_anims/backgrounds/new/high_speed.bin deleted file mode 100644 index ca049478c..000000000 --- a/graphics/battle_anims/backgrounds/new/high_speed.bin +++ /dev/null @@ -1,2 +0,0 @@ -                                                                                             -                                                                ! " # $ % & ' ( ) * + , - . / 0 1 2 3 3 3 3 3 3 4 5 6 7 7 8 9 : ; < = > ? @ A A A A B C D E F G D H A A A A A A I J K A A L M N O M M P M M Q Q R S T U V W S S S S S S S S S S S S S X Y Z [ [ [ [ [ [ [ [ \ \ \ \ ] ^ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ _ _ _ _ ` a b c _ d d d d e f e d d g h i j k l m n o p q r s t j$u v w x y z w${ | | | | | | } ~  $ } $ (((((( $ $ $ \ No newline at end of file diff --git a/graphics/battle_anims/backgrounds/new/high_speed.png b/graphics/battle_anims/backgrounds/new/high_speed.png deleted file mode 100644 index 08bb2b0de3dd768a622a8a586061d9afb9b879a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 855 zcmV-d1E~CoP)002k?0{{R3gZAU`0000mP)t-s0002R z|No2L_H)($YR&&*#s6Bg_DZDgL7eU}l;$am<|%X4AcNi@V$C30#VJa(skcN40008w zNklMN6{;~q+ zO!^7CC*?*xU@=3)u({PJ@b?Uz1Ij(Mz_IUVs71gxPZ;}#3B3>PETC$XBH+6x3wa$v zX8~(y?k#`Mr^SAB8=r^>|jLH5O{h1(C|p3;Gjip2CuOe?n|yIzr^Z(0eb!KPa=n`dzLSmVGm-SsCVpVcSL&xq$f)Nn7^zAKI*VkJ>W?T zg|aA5#fc35N0951t}R`A+p(~{Vc5B}2W8aiGWwrP#i?y6+-bVBb!FijuXn*hhwvEn zze60jzr}1dwA*Yx!_9$n{@*RpT^w!!EL|K?6h;GkF^4#e1`fZ}Xy7o87LJz>XDB0e z2h=Yx=oJVhX_D0MF)F%9^D5&aslqg0t81mpx^NeV<`oO|1XU;5fvWC86_vaa+3|EC z7}yu9roO5Ac57TxwM{7N7B~$qwYn*1CV}YQsK%<+i3)&_RkjwTT3bc#^bA)h2y{!m z8Suku6)+S_Q9!rmX4&B(4x@l3Dz9CHLQz2F$B`dUCcu#Enk^B9k1|nY1525JYHO5Q h2%K>npTPec_y?2488ib@x4=6h=47d=eI-vi3x1d{4^D8Z>-y7!6C9a$4=urmhemKX9yXbw z*jct&<^Co0Z7`DgexSDyST%I=dcJsN-24t zQc**A4c$xaax@J<^V#shg6VANq^^0fhM)@-fXp~XdRl7qXF`z~AdN#U;Pti#Gf6hn z=RiL!cx~>vQCDISdJe-am_C7i<=_ ? @ A B C D E F F G H I I J K L M N N N O P P P P P Q R S S S S S T Q U V S W X X Y Z [ \ ] ] ] ] ] ^ _ ` a a b c d e f g g g g g h i i i i j k k l m n o p p p p p q m m m m r s t u v w x y z { { | } ~ ~  ~ ~ ,,,, s,t( m, d,d,d,d,d, d, P,P,P, $ P, 4,4,4,4,4,4, \ No newline at end of file diff --git a/graphics/battle_anims/backgrounds/new/rock_wrecker.pal b/graphics/battle_anims/backgrounds/new/rock_wrecker.pal index f17343c31..198e7f034 100644 --- a/graphics/battle_anims/backgrounds/new/rock_wrecker.pal +++ b/graphics/battle_anims/backgrounds/new/rock_wrecker.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -0 0 0 -255 246 0 -255 238 0 -255 222 0 -255 205 0 -255 189 0 -255 172 0 -255 156 8 -255 139 8 -255 123 8 -255 106 8 -255 90 8 -255 74 8 -255 49 8 -255 41 8 -246 24 0 +96 192 24 +248 248 216 +248 248 176 +248 240 144 +248 232 120 +248 232 112 +248 216 96 +240 200 88 +232 192 72 +232 184 64 +232 176 56 +224 160 32 +216 152 32 +208 136 40 +192 120 40 +176 88 40 diff --git a/graphics/battle_anims/backgrounds/new/rock_wrecker.png b/graphics/battle_anims/backgrounds/new/rock_wrecker.png deleted file mode 100644 index 97cf4b73af4c1d66ced0caa1cf28a539f506a897..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1511 zcmV003wN0{{R3gj(ju0000mP)t-s00030 z_5lCx0RP?q|IGmZy#W8L0RNl_|BDF!dkFt(2>)6L|4In|F$n)D2=*8NZ#0u{000GY zNklvbAO6vw9poC<_ofmykL07?M@lmdXo-yJ{=@NxmbCg0713a}TYfe57m z2~}XB26C*-d*;q#cUk$I z>EGB?sE5_S2C~{r(`#P%u;Y59j|cKK>AnHni)uRXeld`m{+Z!?6DU-8gk9EA3yT7E zNTOUd`4Pa|c*z~VTrLqY`O&U_;JtZ#&SBwJ6QTofF!l7;k}0~wPcG=KAnc$BaCT<_ z@8>M~x>xo)rmaT^L+|Xte-H-jjB&i%X8|?HcC&S`$r~}R2E&=Ck!B&5FHDKPwrjl` zP;wv33AGUoBz(#vS|06EwCdD9K;VOVDZ3SUOvA|U7fWdE6gDo3*HIit%Q$jZp@t-D*aI&xx8_aeUFxgW6%LzM z0<~ob&-6&l6s96T*yA+>zCy~+NFUCA*zMy4uGd^lpr$^g5Nevb)W2Eq;B1LD!z>~V zY|^wyp#y2g1o+zxvdx#kVgj?XIV3>h$ilpFLkFG@anUP*1K^g401kW_9^XbfFo(=G zX<#1%ka;L{zdsh(Z&a9qRtm7|lx0G<*{s!RoOj_1md(Q~V3w5CY`M9nYYScIivg7w zkmYp;kWbffejs%!%dt%g1j(WGiEb}$KX+tFE+Cf!cm?uI9swZns_~w-+HroG6WCDe zOd*w}PS22vSbO84HPXmxj{|>|o2Ab#U^7f@P8T;Z5L=OCDNp-P%$^{QT2hu&)(0dy+p(Uo`^v%lqtw)P6(*$^yzi*^M79eJ{Ukxn$c zSAjr%<8x8Y(y6x<3Di7XeV4|9-&<8F?M=CYeBY}es#4SHAis2~?haf|P)V2e>Vt4Z z{2O_G|2x?8Cm)@_x2*vLD!uK=#r)y~_vQTzYztSU5ckk_u@9)#J)yQ6E<7mgzylAQz@F!#TRdWL0`~nX#$;XpY#VZyQeCn0mz%#fQb>5Xqfg@e$Vh8YXyX-_d zqBkpzu_d7Ij#C{ZjLrn|F6UMz&>f!r@-D^ioYtZblHq9tyjJ1UL=3Rws6A`og} zLvC@a^V!u+kBo}dOy+yFHZ4klp4aDX4hlFqN%ztb94;?v;3W0i;FK^oYw~Df71taKrgSfM$h6(8(2Y5mAcz$>4S__A2;jTL?&v z(SagM%x-ptfHYjM^~u9^vnvK97W#hECL%7XzmKUiQBL{tF^ewGqXX^Gg5# N002ovPDHLkV1iC@&gTFC diff --git a/graphics/battle_anims/backgrounds/rock_wrecker.png b/graphics/battle_anims/backgrounds/rock_wrecker.png deleted file mode 100644 index ca50da7b76be898616327410ffb07c75e5fbd5d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1249 zcmeAS@N?(olHy`uVBq!ia0vp^4nSA|DI)Syc>J@v}D!U2f;;5(uYEnls5>bt>tc- z_apt{(;3T)1-`f>W;#h}F*^DS=rAo~VX^%prR3`|v0uUH$iH7FW_tVjK36#LW@Fag zGfzE!X*bPVxB0NngVI9=0$;9pyM5SqV9wb_mDwUwjJ7qY+*J9}uW=J$fGx$b>8~F_Q|7-yzszdsevT`AKvLUisrHiuh8&({pNF8P~ds*JMR{r*ZE-eLi6C_sSW)mFFH>?QEK%)!qWa| z->PeZHsx!|g-hgDEx#K0_1yC9#ow2&)mmMm^mL#1-}BF9*;w-W&YB6SWHZlZcjodw z^V-2EoIyv>$8tUM_euW0 Date: Sun, 31 Oct 2021 19:50:31 -0300 Subject: [PATCH 158/193] Fixed Plasma Fists target --- src/data/battle_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 714349eb2..97d61202a 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -10446,7 +10446,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_IRON_FIST_BOOST, .split = SPLIT_PHYSICAL, From 30a8281d32fe104bda94d56434a0519c7815cb30 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 1 Nov 2021 11:56:25 -0300 Subject: [PATCH 159/193] Fixed battlerId in Poison Touch's confusionSeldDmg check --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 5e45798ab..70ea2ee0b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5199,7 +5199,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move case ABILITY_POISON_TOUCH: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerTarget].hp != 0 - && !gProtectStructs[gBattlerTarget].confusionSelfDmg + && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && CanBePoisoned(gBattlerTarget) && IsMoveMakingContact(move, gBattlerAttacker) && (Random() % 3) == 0) From 6357b2120258906fbf5ef987f50cf5f0e23695ae Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Mon, 1 Nov 2021 11:32:13 -0400 Subject: [PATCH 160/193] fix leaf guard ability pop up --- src/battle_script_commands.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f2311f198..e51b426a0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8992,9 +8992,14 @@ static void Cmd_various(void) return; case VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED: if (IsLeafGuardProtected(gActiveBattler)) + { + gBattlerAbility = gActiveBattler; gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } else + { gBattlescriptCurrInstr += 7; + } return; } From c4aa2a1e924c0f1b7a517ac5a13dcfd1e01efd31 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Mon, 1 Nov 2021 21:36:08 -0300 Subject: [PATCH 161/193] Added Gen 8 contest data (minus combos), also fixed Bubble's category --- src/data/contest_moves.h | 522 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 521 insertions(+), 1 deletion(-) diff --git a/src/data/contest_moves.h b/src/data/contest_moves.h index 2e8fd8089..160a05407 100644 --- a/src/data/contest_moves.h +++ b/src/data/contest_moves.h @@ -1158,7 +1158,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = [MOVE_BUBBLE] = { .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, .comboMoves = {COMBO_STARTER_RAIN_DANCE}, }, @@ -5398,6 +5398,526 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .comboStarterId = 0, .comboMoves = {0} }, + + [MOVE_DYNAMAX_CANNON] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_SNIPE_SHOT] = + { + .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_JAW_LOCK] = + { + .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_STUFF_CHEEKS] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_NO_RETREAT] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_TAR_SHOT] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MAGIC_POWDER] = + { + .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DRAGON_DARTS] = + { + .effect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_TEATIME] = + { + .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_OCTOLOCK] = + { + .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BOLT_BEAK] = + { + .effect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FISHIOUS_REND] = + { + .effect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_COURT_CHANGE] = + { + .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_CLANGOROUS_SOUL] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BODY_PRESS] = + { + .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DECORATE] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DRUM_BEATING] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SNAP_TRAP] = + { + .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PYRO_BALL] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BEHEMOTH_BLADE] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_BEHEMOTH_BASH] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_AURA_WHEEL] = + { + .effect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BREAKING_SWIPE] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_BRANCH_POKE] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_OVERDRIVE] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_APPLE_ACID] = + { + .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_GRAV_APPLE] = + { + .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_SPIRIT_BREAK] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_STRANGE_STEAM] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_LIFE_DEW] = + { + .effect = CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_OBSTRUCT] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_FALSE_SURRENDER] = + { + .effect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_METEOR_ASSAULT] = + { + .effect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ETERNABEAM] = + { + .effect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_STEEL_BEAM] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_EXPANDING_FORCE] = + { + .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_VENOM_DRENCH] = + { + .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_SCALE_SHOT] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_METEOR_BEAM] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_SHELL_SIDE_ARM] = + { + .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MISTY_EXPLOSION] = + { + .effect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_GRASSY_GLIDE] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_RISING_VOLTAGE] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_TERRAIN_PULSE] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_SKITTER_SMACK] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BURNING_JEALOUSY] = + { + .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_LASH_OUT] = + { + .effect = CONTEST_EFFECT_STARTLE_PREV_MON, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_POLTERGEIST] = + { + .effect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_CORROSIVE_GAS] = + { + .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_COACHING] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FLIP_TURN] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_TRIPLE_AXEL] = + { + .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DUAL_WINGBEAT] = + { + .effect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_SCORCHING_SANDS] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_JUNGLE_HEALING] = + { + .effect = CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_WICKED_BLOW] = + { + .effect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SURGING_STRIKES] = + { + .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_THUNDER_CAGE] = + { + .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DRAGON_ENERGY] = + { + .effect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FREEZING_GLARE] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FIERY_WRATH] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_THUNDEROUS_KICK] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_GLACIAL_LANCE] = + { + .effect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_ASTRAL_BARRAGE] = + { + .effect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0}, + }, + + [MOVE_EERIE_SPELL] = + { + .effect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, }; const struct ContestEffect gContestEffects[] = From 8332bfae4682c9b4a778386c944d01253a1a81cd Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Mon, 1 Nov 2021 21:59:34 -0300 Subject: [PATCH 162/193] Gen 8 combo moves --- include/constants/contest.h | 4 ++++ src/data/contest_moves.h | 18 +++++++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/include/constants/contest.h b/include/constants/contest.h index cefcbeebd..f7b858c4a 100644 --- a/include/constants/contest.h +++ b/include/constants/contest.h @@ -238,5 +238,9 @@ #define COMBO_STARTER_THOUSAND_WAVES 82 #define COMBO_STARTER_HYPERSPACE_FURY 83 #define COMBO_STARTER_SHADOW_BONE 84 +#define COMBO_STARTER_ELECTRIC_TERRAIN 85 +#define COMBO_STARTER_MISTY_TERRAIN 86 +#define COMBO_STARTER_GRASSY_TERRAIN 87 +#define COMBO_STARTER_PSYCHIC_TERRAIN 88 #endif // GUARD_CONSTANTS_CONTEST_H diff --git a/src/data/contest_moves.h b/src/data/contest_moves.h index 160a05407..8600dcbc6 100644 --- a/src/data/contest_moves.h +++ b/src/data/contest_moves.h @@ -4633,7 +4633,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = { .effect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_SMART, - .comboStarterId = 0, + .comboStarterId = COMBO_STARTER_GRASSY_TERRAIN, .comboMoves = {0} }, @@ -4641,7 +4641,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = { .effect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_CUTE, - .comboStarterId = 0, + .comboStarterId = COMBO_STARTER_MISTY_TERRAIN, .comboMoves = {0} }, @@ -4825,7 +4825,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = { .effect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_BEAUTY, - .comboStarterId = 0, + .comboStarterId = COMBO_STARTER_ELECTRIC_TERRAIN, .comboMoves = {0} }, @@ -5115,7 +5115,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = { .effect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_SMART, - .comboStarterId = 0, + .comboStarterId = COMBO_STARTER_PSYCHIC_TERRAIN, .comboMoves = {0} }, @@ -5684,7 +5684,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0} + .comboMoves = {COMBO_STARTER_PSYCHIC_TERRAIN} }, [MOVE_VENOM_DRENCH] = @@ -5724,7 +5724,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0} + .comboMoves = {COMBO_STARTER_MISTY_TERRAIN} }, [MOVE_GRASSY_GLIDE] = @@ -5732,7 +5732,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0} + .comboMoves = {COMBO_STARTER_GRASSY_TERRAIN} }, [MOVE_RISING_VOLTAGE] = @@ -5740,7 +5740,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0} + .comboMoves = {COMBO_STARTER_ELECTRIC_TERRAIN} }, [MOVE_TERRAIN_PULSE] = @@ -5748,7 +5748,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {COMBO_STARTER_ELECTRIC_TERRAIN, COMBO_STARTER_MISTY_TERRAIN, COMBO_STARTER_GRASSY_TERRAIN, COMBO_STARTER_PSYCHIC_TERRAIN}, }, [MOVE_SKITTER_SMACK] = From 10306d046cd4262741ca47415cc261ac3e3c7319 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Mon, 1 Nov 2021 22:07:54 -0300 Subject: [PATCH 163/193] Fixed Steam Roller's define --- src/data/contest_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/contest_moves.h b/src/data/contest_moves.h index 8600dcbc6..169e55991 100644 --- a/src/data/contest_moves.h +++ b/src/data/contest_moves.h @@ -5687,7 +5687,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .comboMoves = {COMBO_STARTER_PSYCHIC_TERRAIN} }, - [MOVE_VENOM_DRENCH] = + [MOVE_STEEL_ROLLER] = { .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, From 8af882348a504d953997baa2faf5a50c12e59009 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Tue, 2 Nov 2021 16:56:12 +1300 Subject: [PATCH 164/193] Fix Parental Bond Super Fang Min damage should be 2 --- src/battle_ai_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 3535e800c..9478d7343 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -796,7 +796,7 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) dmg = 0; // Two hits of Super Fang halves HP twice, leaving target with 25% HP else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) - dmg = max(1, gBattleMons[battlerDef].hp * 3 / 4); + dmg = max(2, gBattleMons[battlerDef].hp * 3 / 4); else dmg = max(1, gBattleMons[battlerDef].hp / 2); break; From 40bced517a9a66292cea932da1360bc3e02a1161 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Tue, 2 Nov 2021 20:00:57 +1300 Subject: [PATCH 165/193] Pastel Veil blocks poison for whole side Tested vs Toxic, Toxic Thread and Sludge with 100% effect chance. --- data/battle_scripts_1.s | 15 +++++++++++++++ include/constants/battle_string_ids.h | 3 ++- src/battle_message.c | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index dd6af61e5..dc0a1900e 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2581,6 +2581,18 @@ BattleScript_AromaVeilProtects: orhalfword gMoveResultFlags, MOVE_RESULT_FAILED goto BattleScript_MoveEnd +BattleScript_PastelVeilProtectsRet:: + pause B_WAIT_TIME_SHORT + call BattleScript_AbilityPopUp + printstring STRINGID_PASTELVEILPROTECTED + waitmessage B_WAIT_TIME_LONG + return + +BattleScript_PastelVeilProtects: + call BattleScript_PastelVeilProtectsRet + orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + goto BattleScript_MoveEnd + BattleScript_LeafGuardProtectsRet:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp @@ -3053,6 +3065,7 @@ BattleScript_EffectToxic:: ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects + jumpifability BS_TARGET_SIDE, ABILITY_PASTEL_VEIL, BattleScript_PastelVeilProtects jumpifflowerveil BattleScript_FlowerVeilProtects jumpifleafguard BattleScript_LeafGuardProtects jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects @@ -3080,6 +3093,7 @@ BattleScript_AlreadyPoisoned:: BattleScript_ImmunityProtected:: copybyte gEffectBattler, gBattlerTarget + call BattleScript_AbilityPopUp setbyte cMULTISTRING_CHOOSER, B_MSG_ABILITY_PREVENTS_MOVE_STATUS call BattleScript_PSNPrevention goto BattleScript_MoveEnd @@ -3408,6 +3422,7 @@ BattleScript_EffectPoison:: ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects + jumpifability BS_TARGET_SIDE, ABILITY_PASTEL_VEIL, BattleScript_PastelVeilProtects jumpifflowerveil BattleScript_FlowerVeilProtects jumpifleafguard BattleScript_LeafGuardProtects jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 1d461e2a0..a84f0ff34 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -597,8 +597,9 @@ #define STRINGID_BUTPOKEMONCANTUSETHEMOVE 594 #define STRINGID_BUTHOOPACANTUSEIT 595 #define STRINGID_BROKETHROUGHPROTECTION 596 +#define STRINGID_PASTELVEILPROTECTED 597 -#define BATTLESTRINGS_COUNT 597 +#define BATTLESTRINGS_COUNT 598 // The below IDs are all indexes into battle message tables, // used to determine which of a set of messages to print. diff --git a/src/battle_message.c b/src/battle_message.c index f26726a69..f6569f039 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -723,9 +723,11 @@ static const u8 sText_PkmnRevertedToPrimal[] = _("{B_ATK_NAME_WITH_PREFIX}'s Pri static const u8 sText_ButPokemonCantUseTheMove[] = _("But {B_ATK_NAME_WITH_PREFIX} can't\nuse the move!"); static const u8 sText_ButHoopaCantUseIt[] = _("But Hoopa can't use it\nthe way it is now!"); static const u8 sText_BrokeThroughProtection[] = _("It broke through the\n{B_DEF_NAME_WITH_PREFIX}'s protection!"); +static const u8 sText_PastelVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} is protected\nby a pastel veil!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_PASTELVEILPROTECTED -12] = sText_PastelVeilProtected, [STRINGID_BROKETHROUGHPROTECTION - 12] = sText_BrokeThroughProtection, [STRINGID_BUTPOKEMONCANTUSETHEMOVE - 12] = sText_ButPokemonCantUseTheMove, [STRINGID_BUTHOOPACANTUSEIT - 12] = sText_ButHoopaCantUseIt, From 95435b5f7f132da3d0d36464e8726ad132fd7008 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Tue, 2 Nov 2021 23:06:10 +1300 Subject: [PATCH 166/193] Pastel Veil switchin effect attempt Battle script isn't working for partner for some reason. --- data/battle_scripts_1.s | 8 ++++++++ include/battle_scripts.h | 1 + include/constants/battle_string_ids.h | 4 +++- src/battle_message.c | 3 +++ src/battle_util.c | 19 +++++++++++++++++++ 5 files changed, 34 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index dc0a1900e..d627008da 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8926,3 +8926,11 @@ BattleScript_DarkTypePreventsPrankster:: waitmessage B_WAIT_TIME_LONG orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT goto BattleScript_MoveEnd + +BattleScript_PastelVeilActivates:: + call BattleScript_AbilityPopUp + printfromtable gSwitchInAbilityStringIds + curestatus BS_SCRIPTING + updatestatusicon BS_SCRIPTING + waitmessage B_WAIT_TIME_LONG + end3 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index ec95a4549..5875eaa68 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -402,5 +402,6 @@ extern const u8 BattleScript_BlockedByPrimalWeatherEnd3[]; extern const u8 BattleScript_BlockedByPrimalWeatherRet[]; extern const u8 BattleScript_PrimalReversion[]; extern const u8 BattleScript_HyperspaceFuryRemoveProtect[]; +extern const u8 BattleScript_PastelVeilActivates[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index a84f0ff34..95a37223d 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -598,8 +598,9 @@ #define STRINGID_BUTHOOPACANTUSEIT 595 #define STRINGID_BROKETHROUGHPROTECTION 596 #define STRINGID_PASTELVEILPROTECTED 597 +#define STRINGID_PASTELVEILENTERS 598 -#define BATTLESTRINGS_COUNT 598 +#define BATTLESTRINGS_COUNT 599 // The below IDs are all indexes into battle message tables, // used to determine which of a set of messages to print. @@ -834,6 +835,7 @@ #define B_MSG_SWITCHIN_SCREENCLEANER 12 #define B_MSG_SWITCHIN_ASONE 13 #define B_MSG_SWITCHIN_CURIOUS_MEDICINE 14 +#define B_MSG_SWITCHIN_PASTEL_VEIL 15 // gMentalHerbCureStringIds #define B_MSG_MENTALHERBCURE_INFATUATION 0 diff --git a/src/battle_message.c b/src/battle_message.c index f6569f039..3a17a7240 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -724,9 +724,11 @@ static const u8 sText_ButPokemonCantUseTheMove[] = _("But {B_ATK_NAME_WITH_PREFI static const u8 sText_ButHoopaCantUseIt[] = _("But Hoopa can't use it\nthe way it is now!"); static const u8 sText_BrokeThroughProtection[] = _("It broke through the\n{B_DEF_NAME_WITH_PREFIX}'s protection!"); static const u8 sText_PastelVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} is protected\nby a pastel veil!"); +static const u8 sText_PastelVeilEnters[] = _("{B_EFF_NAME_WITH_PREFIX}'s poisoning\nwas cured!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_PASTELVEILENTERS - 12] = sText_PastelVeilEnters, [STRINGID_PASTELVEILPROTECTED -12] = sText_PastelVeilProtected, [STRINGID_BROKETHROUGHPROTECTION - 12] = sText_BrokeThroughProtection, [STRINGID_BUTPOKEMONCANTUSETHEMOVE - 12] = sText_ButPokemonCantUseTheMove, @@ -1373,6 +1375,7 @@ const u16 gSwitchInAbilityStringIds[] = [B_MSG_SWITCHIN_SCREENCLEANER] = STRINGID_SCREENCLEANERENTERS, [B_MSG_SWITCHIN_ASONE] = STRINGID_ASONEENTERS, [B_MSG_SWITCHIN_CURIOUS_MEDICINE] = STRINGID_CURIOUSMEDICINEENTERS, + [B_MSG_SWITCHIN_PASTEL_VEIL] = STRINGID_PASTELVEILENTERS, }; const u16 gMissStringIds[] = diff --git a/src/battle_util.c b/src/battle_util.c index 5dbe42227..0600d37e8 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4061,6 +4061,25 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move effect++; } break; + case ABILITY_PASTEL_VEIL: + if (!gSpecialStatuses[battler].switchInAbilityDone) + { + u32 side = GetBattlerSide(battler); + + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (IsBattlerAlive(i) && GetBattlerSide(i) == side + && (gBattleMons[i].status1 & STATUS1_POISON || gBattleMons[i].status1 & STATUS1_TOXIC_POISON)) + { + gActiveBattler = gBattleScripting.battler = gEffectBattler = i; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_PASTEL_VEIL; + BattleScriptPushCursorAndCallback(BattleScript_PastelVeilActivates); + effect++; + } + } + gSpecialStatuses[battler].switchInAbilityDone = 1; + } + break; case ABILITY_ANTICIPATION: if (!gSpecialStatuses[battler].switchInAbilityDone) { From 4668e11765c644e1e621275fae215c36a9fa2484 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Wed, 3 Nov 2021 00:45:24 +1300 Subject: [PATCH 167/193] Looping battlescript version 1 Would be better if it simply updated the target, cured the status and returned I think, needs testing. --- data/battle_scripts_1.s | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index d627008da..37b592365 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8927,10 +8927,30 @@ BattleScript_DarkTypePreventsPrankster:: orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT goto BattleScript_MoveEnd -BattleScript_PastelVeilActivates:: +BattleScript_PastelVeilActivatesOld:: call BattleScript_AbilityPopUp printfromtable gSwitchInAbilityStringIds curestatus BS_SCRIPTING updatestatusicon BS_SCRIPTING waitmessage B_WAIT_TIME_LONG end3 + +BattleScript_PastelVeilActivates:: + call BattleScript_AbilityPopUp + printfromtable gSwitchInAbilityStringIds + waitmessage B_WAIT_TIME_LONG + copybyte gBattlerTarget, gBattlerAttacker + setbyte gBattleCommunication, 0 +BattleScript_PastelVeil_TryCurePoison: + jumpifstatus BS_TARGET, STATUS1_POISON | STATUS1_TOXIC_POISON, BattleScript_PastelVeilCurePoison + goto BattleScript_PastelVeilEnd +BattleScript_PastelVeilCurePoison: + curestatus BS_TARGET + updatestatusicon BS_TARGET + jumpifbyte CMP_NOT_EQUAL, gBattleCommunication, 0x0, BattleScript_PastelVeilEnd + addbyte gBattleCommunication, 1 + jumpifnoally BS_TARGET, BattleScript_PastelVeilEnd + setallytonexttarget BattleScript_PastelVeil_TryCurePoison + goto BattleScript_MoveEnd +BattleScript_PastelVeilEnd: + end3 From 592a1dab63d3b8eb97679cbdc9161ade8f762d90 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 2 Nov 2021 12:02:58 -0400 Subject: [PATCH 168/193] fix mirror armor setstatchanger, handle reflected stat blockage --- data/battle_scripts_1.s | 2 +- src/battle_script_commands.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b72140a11..eb80a41d5 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2894,7 +2894,7 @@ BattleScript_MirrorArmorReflect:: call BattleScript_AbilityPopUp jumpifsubstituteblocks BattleScript_AbilityNoSpecificStatLoss BattleScript_MirrorArmorReflectStatLoss: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_NOT_PROTECT_AFFECTED, BattleScript_MirrorArmorReflectWontFall + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_NOT_PROTECT_AFFECTED | STAT_BUFF_ALLOW_PTR, BattleScript_MirrorArmorReflectEnd jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_MirrorArmorReflectAnim goto BattleScript_MirrorArmorReflectWontFall BattleScript_MirrorArmorReflectAnim: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 28cab4af3..2ee80557f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9689,10 +9689,12 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr { if (flags == STAT_BUFF_ALLOW_PTR) { + SET_STATCHANGER(statId, GET_STAT_BUFF_VALUE(statValue) | STAT_BUFF_NEGATIVE, TRUE); BattleScriptPush(BS_ptr); gBattleScripting.battler = gActiveBattler; gBattlerAbility = gActiveBattler; gBattlescriptCurrInstr = BattleScript_MirrorArmorReflect; + RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); } return STAT_CHANGE_DIDNT_WORK; } From 69b42de0d9b054617a946cfa37064749b43c5013 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 30 Oct 2021 20:40:05 -0300 Subject: [PATCH 169/193] Implemented Mimicry Thanks to AsparagusEduardo for helping me optimize RestoreBattlerOriginalTypes. --- asm/macros/battle_script.inc | 5 ++ data/battle_scripts_1.s | 23 ++++++++ include/battle_scripts.h | 2 + include/battle_util.h | 2 + include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 3 +- src/battle_message.c | 2 + src/battle_script_commands.c | 16 ++++++ src/battle_util.c | 62 +++++++++++++++++++++- 9 files changed, 114 insertions(+), 2 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 8fd760634..f288cfeaf 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1874,6 +1874,11 @@ .4byte \ptr .endm + .macro trytoapplymimicry battler:req, ptr:req + various \battler, VARIOUS_TRY_TO_APPLY_MIMICRY + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index df0048ad9..8c3e744c1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1908,8 +1908,25 @@ BattleScript_EffectPsychicTerrain: waitmessage B_WAIT_TIME_LONG playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL call BattleScript_TerrainSeedLoop + jumpifabilitypresent ABILITY_MIMICRY, BattleScript_ApplyMimicry goto BattleScript_MoveEnd +BattleScript_ApplyMimicry:: + savetarget + setbyte gBattlerTarget, 0 +BattleScript_MimicryLoopIter: + copybyte sBATTLER, gBattlerTarget + trytoapplymimicry BS_TARGET, BattleScript_MimicryLoop_NextBattler + copybyte gBattlerAbility, sBATTLER + call BattleScript_AbilityPopUp + printstring STRINGID_BATTLERTYPECHANGEDTO + waitmessage B_WAIT_TIME_LONG +BattleScript_MimicryLoop_NextBattler: + addbyte gBattlerTarget, 0x1 + jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_MimicryLoopIter + restoretarget + end + BattleScript_EffectTopsyTurvy: attackcanceler attackstring @@ -7957,6 +7974,12 @@ BattleScript_ColorChangeActivates:: waitmessage B_WAIT_TIME_LONG return +BattleScript_MimicryActivatesEnd3:: + call BattleScript_AbilityPopUp + printstring STRINGID_BATTLERTYPECHANGEDTO + waitmessage B_WAIT_TIME_LONG + end3 + BattleScript_ProteanActivates:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNCHANGEDTYPE diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 403af9515..537d9cb81 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -404,5 +404,7 @@ extern const u8 BattleScript_PrimalReversion[]; extern const u8 BattleScript_HyperspaceFuryRemoveProtect[]; extern const u8 BattleScript_SelectingNotAllowedMoveGorillaTactics[]; extern const u8 BattleScript_WanderingSpiritActivates[]; +extern const u8 BattleScript_MimicryActivatesEnd3[]; +extern const u8 BattleScript_ApplyMimicry[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index 7f267308d..62a7e1db6 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -157,6 +157,8 @@ void DoBurmyFormChange(u32 monId); bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef, bool32 checkTarget); u16 GetUsedHeldItem(u8 battler); bool32 IsBattlerWeatherAffected(u8 battlerId, u32 weatherFlags); +void TryToApplyMimicry(u8 battlerId, bool8 various); +void RestoreBattlerOriginalTypes(u8 battlerId); // ability checks bool32 IsRolePlayBannedAbilityAtk(u16 ability); diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index fb1142f48..ee6cd4c7f 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -197,6 +197,7 @@ #define VARIOUS_UPDATE_ABILITY_POPUP 124 #define VARIOUS_JUMP_IF_WEATHER_AFFECTED 125 #define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 126 +#define VARIOUS_TRY_TO_APPLY_MIMICRY 127 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 27b39475a..c4161c68f 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -599,8 +599,9 @@ #define STRINGID_BROKETHROUGHPROTECTION 596 #define STRINGID_ABILITYALLOWSONLYMOVE 597 #define STRINGID_SWAPPEDABILITIES 598 +#define STRINGID_BATTLERTYPECHANGEDTO 599 -#define BATTLESTRINGS_COUNT 599 +#define BATTLESTRINGS_COUNT 600 // The below IDs are all indexes into battle message tables, // used to determine which of a set of messages to print. diff --git a/src/battle_message.c b/src/battle_message.c index 37919ddca..30a8670ac 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -725,9 +725,11 @@ static const u8 sText_ButHoopaCantUseIt[] = _("But Hoopa can't use it\nthe way i static const u8 sText_BrokeThroughProtection[] = _("It broke through the\n{B_DEF_NAME_WITH_PREFIX}'s protection!"); static const u8 sText_AbilityAllowsOnlyMove[] = _("{B_ATK_ABILITY} allows the\nuse of only {B_CURRENT_MOVE}!\p"); static const u8 sText_SwappedAbilities[] = _("{B_DEF_NAME_WITH_PREFIX} swapped Abilities\nwith its target!"); +static const u8 sText_BattlerTypeChangedTo[] = _("{B_BUFF1}'s type\nchanged to {B_BUFF2}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_BATTLERTYPECHANGEDTO - 12] = sText_BattlerTypeChangedTo, [STRINGID_SWAPPEDABILITIES - 12] = sText_SwappedAbilities, [STRINGID_ABILITYALLOWSONLYMOVE - 12] = sText_AbilityAllowsOnlyMove, [STRINGID_BROKETHROUGHPROTECTION - 12] = sText_BrokeThroughProtection, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9e779da1b..2f4e8c46b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -54,6 +54,7 @@ #include "constants/rgb.h" #include "data.h" #include "constants/party_menu.h" +#include "battle_util.h" extern struct MusicPlayerInfo gMPlayInfo_BGM; extern struct Evolution gEvolutionTable[][EVOS_PER_MON]; @@ -9004,6 +9005,21 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; } return; + case VARIOUS_TRY_TO_APPLY_MIMICRY: + { + bool8 isMimicryDone = FALSE; + + if (GetBattlerAbility(gActiveBattler) == ABILITY_MIMICRY) + { + TryToApplyMimicry(gActiveBattler, TRUE); + isMimicryDone = TRUE; + } + if (!isMimicryDone) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; + } } gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index 224cb1af1..00e323d20 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1894,6 +1894,46 @@ u8 GetImprisonedMovesCount(u8 battlerId, u16 move) return imprisonedMoves; } +void RestoreBattlerOriginalTypes(u8 battlerId) +{ + gBattleMons[battlerId].type1 = gBaseStats[gBattleMons[battlerId].species].type1; + gBattleMons[battlerId].type2 = gBaseStats[gBattleMons[battlerId].species].type2; +} + +void TryToApplyMimicry(u8 battlerId, bool8 various) +{ + u32 moveType, move; + + GET_MOVE_TYPE(move, moveType); + switch (gFieldStatuses) + { + case STATUS_FIELD_ELECTRIC_TERRAIN: + moveType = TYPE_ELECTRIC; + break; + case STATUS_FIELD_MISTY_TERRAIN: + moveType = TYPE_FAIRY; + break; + case STATUS_FIELD_GRASSY_TERRAIN: + moveType = TYPE_GRASS; + break; + case STATUS_FIELD_PSYCHIC_TERRAIN: + moveType = TYPE_PSYCHIC; + break; + default: + moveType = 0; + break; + } + + if (moveType != 0 && !IS_BATTLER_OF_TYPE(battlerId, moveType)) + { + SET_BATTLER_TYPE(battlerId, moveType); + PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, battlerId, gBattlerPartyIndexes[battlerId]) + PREPARE_TYPE_BUFFER(gBattleTextBuff2, moveType); + if (!various) + BattleScriptPushCursorAndCallback(BattleScript_MimicryActivatesEnd3); + } +} + enum { ENDTURN_ORDER, @@ -2278,6 +2318,9 @@ u8 DoFieldEndTurnEffects(void) && (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.electricTerrainTimer == 0)) { gFieldStatuses &= ~(STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_TERRAIN_PERMANENT); + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + if (GetBattlerAbility(i) == ABILITY_MIMICRY) + RestoreBattlerOriginalTypes(i); BattleScriptExecute(BattleScript_ElectricTerrainEnds); effect++; } @@ -2288,6 +2331,9 @@ u8 DoFieldEndTurnEffects(void) && (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.mistyTerrainTimer == 0)) { gFieldStatuses &= ~(STATUS_FIELD_MISTY_TERRAIN); + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + if (GetBattlerAbility(i) == ABILITY_MIMICRY) + RestoreBattlerOriginalTypes(i); BattleScriptExecute(BattleScript_MistyTerrainEnds); effect++; } @@ -2298,8 +2344,12 @@ u8 DoFieldEndTurnEffects(void) { if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && (gFieldTimers.grassyTerrainTimer == 0 || --gFieldTimers.grassyTerrainTimer == 0)) + { gFieldStatuses &= ~(STATUS_FIELD_GRASSY_TERRAIN); - + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + if (GetBattlerAbility(i) == ABILITY_MIMICRY) + RestoreBattlerOriginalTypes(i); + } BattleScriptExecute(BattleScript_GrassyTerrainHeals); effect++; } @@ -2310,6 +2360,9 @@ u8 DoFieldEndTurnEffects(void) && (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.psychicTerrainTimer == 0)) { gFieldStatuses &= ~(STATUS_FIELD_PSYCHIC_TERRAIN); + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + if (GetBattlerAbility(i) == ABILITY_MIMICRY) + RestoreBattlerOriginalTypes(i); BattleScriptExecute(BattleScript_PsychicTerrainEnds); effect++; } @@ -4380,6 +4433,13 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move effect++; } break; + case ABILITY_MIMICRY: + if (gBattleMons[battler].hp != 0 && gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + { + TryToApplyMimicry(battler, FALSE); + effect++; + } + break; } break; case ABILITYEFFECT_ENDTURN: // 1 From d99fd30e4d60533e46d59e872cac542786a8d929 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Wed, 3 Nov 2021 11:51:20 +1300 Subject: [PATCH 170/193] Looping battle script, correct message Testing in Sword showed that the pop up should happen once if two mons are cured, and that the correct message is "X was cured of its poisoning!" --- data/battle_scripts_1.s | 24 ++++++++++-------------- src/battle_message.c | 2 +- src/battle_util.c | 17 ++++------------- 3 files changed, 15 insertions(+), 28 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 37b592365..5bd37cf04 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8927,30 +8927,26 @@ BattleScript_DarkTypePreventsPrankster:: orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT goto BattleScript_MoveEnd -BattleScript_PastelVeilActivatesOld:: - call BattleScript_AbilityPopUp - printfromtable gSwitchInAbilityStringIds - curestatus BS_SCRIPTING - updatestatusicon BS_SCRIPTING - waitmessage B_WAIT_TIME_LONG - end3 - BattleScript_PastelVeilActivates:: - call BattleScript_AbilityPopUp - printfromtable gSwitchInAbilityStringIds - waitmessage B_WAIT_TIME_LONG - copybyte gBattlerTarget, gBattlerAttacker setbyte gBattleCommunication, 0 + setbyte gBattleCommunication + 1, 0 BattleScript_PastelVeil_TryCurePoison: jumpifstatus BS_TARGET, STATUS1_POISON | STATUS1_TOXIC_POISON, BattleScript_PastelVeilCurePoison - goto BattleScript_PastelVeilEnd + goto BattleScript_PastelVeilLoopIncrement BattleScript_PastelVeilCurePoison: + jumpifbyte CMP_NOT_EQUAL, gBattleCommunication + 1, 0x0, BattleScript_PastelVeilCurePoisonNoPopUp + call BattleScript_AbilityPopUp + setbyte gBattleCommunication + 1, 1 +BattleScript_PastelVeilCurePoisonNoPopUp: @ Only show Pastel Veil pop up once if it cures two mons + printfromtable gSwitchInAbilityStringIds + waitmessage B_WAIT_TIME_LONG curestatus BS_TARGET updatestatusicon BS_TARGET +BattleScript_PastelVeilLoopIncrement: jumpifbyte CMP_NOT_EQUAL, gBattleCommunication, 0x0, BattleScript_PastelVeilEnd addbyte gBattleCommunication, 1 jumpifnoally BS_TARGET, BattleScript_PastelVeilEnd setallytonexttarget BattleScript_PastelVeil_TryCurePoison - goto BattleScript_MoveEnd + goto BattleScript_PastelVeilEnd BattleScript_PastelVeilEnd: end3 diff --git a/src/battle_message.c b/src/battle_message.c index 3a17a7240..61889a2b7 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -724,7 +724,7 @@ static const u8 sText_ButPokemonCantUseTheMove[] = _("But {B_ATK_NAME_WITH_PREFI static const u8 sText_ButHoopaCantUseIt[] = _("But Hoopa can't use it\nthe way it is now!"); static const u8 sText_BrokeThroughProtection[] = _("It broke through the\n{B_DEF_NAME_WITH_PREFIX}'s protection!"); static const u8 sText_PastelVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} is protected\nby a pastel veil!"); -static const u8 sText_PastelVeilEnters[] = _("{B_EFF_NAME_WITH_PREFIX}'s poisoning\nwas cured!"); +static const u8 sText_PastelVeilEnters[] = _("{B_DEF_NAME_WITH_PREFIX} was cured\nof its poisoning!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { diff --git a/src/battle_util.c b/src/battle_util.c index 0600d37e8..25bfde382 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4064,19 +4064,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move case ABILITY_PASTEL_VEIL: if (!gSpecialStatuses[battler].switchInAbilityDone) { - u32 side = GetBattlerSide(battler); - - for (i = 0; i < MAX_BATTLERS_COUNT; i++) - { - if (IsBattlerAlive(i) && GetBattlerSide(i) == side - && (gBattleMons[i].status1 & STATUS1_POISON || gBattleMons[i].status1 & STATUS1_TOXIC_POISON)) - { - gActiveBattler = gBattleScripting.battler = gEffectBattler = i; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_PASTEL_VEIL; - BattleScriptPushCursorAndCallback(BattleScript_PastelVeilActivates); - effect++; - } - } + gBattlerTarget = battler; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_PASTEL_VEIL; + BattleScriptPushCursorAndCallback(BattleScript_PastelVeilActivates); + effect++; gSpecialStatuses[battler].switchInAbilityDone = 1; } break; From 5bfb3096adba05e14938b3c1416aa0d9ad38d4ac Mon Sep 17 00:00:00 2001 From: sbird Date: Tue, 2 Nov 2021 23:53:03 +0000 Subject: [PATCH 171/193] [battle_debug] fix charbase overflow --- src/battle_debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_debug.c b/src/battle_debug.c index b34afe484..c967cfe00 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -559,7 +559,7 @@ static const struct BgTemplate sBgTemplates[] = }, { .bg = 1, - .charBaseIndex = 10, + .charBaseIndex = 2, .mapBaseIndex = 20, .screenSize = 0, .paletteMode = 0, From d33bcc335bd6e9beca0a94346098be89b6bffff6 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Wed, 3 Nov 2021 14:49:14 +1300 Subject: [PATCH 172/193] Revert Poison Touch target check This would prevent Poison Touch activating if the target hurt itself. --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 843ed16a7..7d955ee84 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5208,7 +5208,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move case ABILITY_POISON_TOUCH: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerTarget].hp != 0 - && !gProtectStructs[gBattlerTarget].confusionSelfDmg + && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && CanBePoisoned(gBattlerAttacker, gBattlerTarget) && IsMoveMakingContact(move, gBattlerAttacker) && TARGET_TURN_DAMAGED // Need to actually hit the target From 6ce1f01b8c92539659687658d1d6041841147382 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Wed, 3 Nov 2021 19:45:03 +1300 Subject: [PATCH 173/193] Hunger Switch and Aura Wheel Implement the ability Hunger Switch and the move Aura Wheel. --- data/battle_scripts_1.s | 12 ++++++++++-- include/constants/battle_config.h | 4 ++++ include/constants/battle_move_effects.h | 3 ++- src/battle_main.c | 4 ++++ src/battle_util.c | 17 +++++++++++++++++ src/data/battle_moves.h | 2 +- src/data/pokemon/base_stats.h | 4 ++-- 7 files changed, 40 insertions(+), 6 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index df0048ad9..8b2d14dc8 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -392,10 +392,18 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectSparklySwirl @ EFFECT_SPARKLY_SWIRL .4byte BattleScript_EffectPlasmaFists @ EFFECT_PLASMA_FISTS .4byte BattleScript_EffectHyperspaceFury @ EFFECT_HYPERSPACE_FURY + .4byte BattleScript_EffectAuraWheel @ EFFECT_AURA_WHEEL + +BattleScript_EffectAuraWheel: @ Aura Wheel can only be used by Morpeko + jumpifspecies BS_ATTACKER, SPECIES_MORPEKO, BattleScript_EffectSpeedUpHit + jumpifspecies BS_ATTACKER, SPECIES_MORPEKO_HANGRY, BattleScript_EffectSpeedUpHit + printstring STRINGID_BUTPOKEMONCANTUSETHEMOVE + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd BattleScript_EffectHyperspaceFury: - jumpifspecies BS_ATTACKER, SPECIES_TREECKO, BattleScript_EffectHyperspaceFuryUnbound - jumpifspecies BS_ATTACKER, SPECIES_MUDKIP, BattleScript_ButHoopaCantUseIt + jumpifspecies BS_ATTACKER, SPECIES_HOOPA_UNBOUND, BattleScript_EffectHyperspaceFuryUnbound + jumpifspecies BS_ATTACKER, SPECIES_HOOPA, BattleScript_ButHoopaCantUseIt printstring STRINGID_BUTPOKEMONCANTUSETHEMOVE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 41fee089d..defc44226 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -47,6 +47,10 @@ #define SPECIES_GRENINJA_ASH 10017 #define SPECIES_HOOPA 0 #define SPECIES_HOOPA_UNBOUND 10018 + #define SPECIES_MELOETTA 0 + #define SPECIES_MELOETTA_PIROUETTE 10019 + #define SPECIES_MORPEKO 0 + #define SPECIES_MORPEKO_HANGRY 10020 #endif // Items with peculiar battle effects. diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 62b49a191..7acb56c93 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -375,7 +375,8 @@ #define EFFECT_SPARKLY_SWIRL 369 #define EFFECT_PLASMA_FISTS 370 #define EFFECT_HYPERSPACE_FURY 371 +#define EFFECT_AURA_WHEEL 372 -#define NUM_BATTLE_MOVE_EFFECTS 372 +#define NUM_BATTLE_MOVE_EFFECTS 373 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/battle_main.c b/src/battle_main.c index ad02854bd..12324ef96 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5221,6 +5221,10 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) { gBattleStruct->dynamicMoveType = 0x80 | TYPE_ELECTRIC; } + else if (move == MOVE_AURA_WHEEL && gBattleMons[battlerAtk].species == SPECIES_MORPEKO_HANGRY) + { + gBattleStruct->dynamicMoveType = 0x80 | TYPE_DARK; + } // Check if a gem should activate. GET_MOVE_TYPE(move, moveType); diff --git a/src/battle_util.c b/src/battle_util.c index 224cb1af1..54a755f0e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4562,6 +4562,22 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move effect++; } break; + case ABILITY_HUNGER_SWITCH: + if (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) + { + if (gBattleMons[battler].species == SPECIES_MORPEKO) + { + gBattleMons[battler].species = SPECIES_MORPEKO_HANGRY; + BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3); + } + else if (gBattleMons[battler].species == SPECIES_MORPEKO_HANGRY) + { + gBattleMons[battler].species = SPECIES_MORPEKO; + BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3); + } + effect++; + } + break; } } break; @@ -8969,6 +8985,7 @@ void UndoFormChange(u32 monId, u32 side, bool32 isSwitchingOut) {SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI}, {SPECIES_CRAMORANT_GORGING, SPECIES_CRAMORANT}, {SPECIES_CRAMORANT_GULPING, SPECIES_CRAMORANT}, + {SPECIES_MORPEKO_HANGRY, SPECIES_MORPEKO} }; if (isSwitchingOut) // Don't revert Mimikyu Busted or Ash-Greninja when switching out diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 97d61202a..51c760166 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -11038,7 +11038,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_AURA_WHEEL] = { - .effect = EFFECT_SPEED_UP_HIT, + .effect = EFFECT_AURA_WHEEL, .power = 110, .type = TYPE_ELECTRIC, .accuracy = 100, diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h index 141631643..0014b4437 100644 --- a/src/data/pokemon/base_stats.h +++ b/src/data/pokemon/base_stats.h @@ -6848,7 +6848,7 @@ const struct BaseStats gBaseStats[] = .growthRate = GROWTH_MEDIUM_SLOW, .eggGroup1 = EGG_GROUP_BUG, .eggGroup2 = EGG_GROUP_BUG, - .abilities = {ABILITY_STURDY, ABILITY_NONE}, + .abilities = {ABILITY_HUNGER_SWITCH, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, @@ -7552,7 +7552,7 @@ const struct BaseStats gBaseStats[] = .growthRate = GROWTH_FAST, .eggGroup1 = EGG_GROUP_FIELD, .eggGroup2 = EGG_GROUP_FIELD, - .abilities = {ABILITY_OWN_TEMPO, ABILITY_NONE}, + .abilities = {ABILITY_HUNGER_SWITCH, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, From 5141e84296caff64a298cb46d1cb7f06cd6f35b3 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Wed, 3 Nov 2021 20:01:09 +1300 Subject: [PATCH 174/193] Fix base stats Clean up mess from testing. --- src/data/pokemon/base_stats.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h index 0014b4437..141631643 100644 --- a/src/data/pokemon/base_stats.h +++ b/src/data/pokemon/base_stats.h @@ -6848,7 +6848,7 @@ const struct BaseStats gBaseStats[] = .growthRate = GROWTH_MEDIUM_SLOW, .eggGroup1 = EGG_GROUP_BUG, .eggGroup2 = EGG_GROUP_BUG, - .abilities = {ABILITY_HUNGER_SWITCH, ABILITY_NONE}, + .abilities = {ABILITY_STURDY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, @@ -7552,7 +7552,7 @@ const struct BaseStats gBaseStats[] = .growthRate = GROWTH_FAST, .eggGroup1 = EGG_GROUP_FIELD, .eggGroup2 = EGG_GROUP_FIELD, - .abilities = {ABILITY_HUNGER_SWITCH, ABILITY_NONE}, + .abilities = {ABILITY_OWN_TEMPO, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, From b9c23f7c62d74570bf62987c9fc58091b27f21e7 Mon Sep 17 00:00:00 2001 From: Blackforest92 Date: Wed, 3 Nov 2021 16:29:09 +0700 Subject: [PATCH 175/193] Update waterfall, trick room, & focus blast BG --- data/battle_anim_scripts.s | 18 ++++++++++++-- .../battle_anims/backgrounds/dark_void.bin | Bin 2048 -> 0 bytes .../battle_anims/backgrounds/dark_void.pal | 19 --------------- .../battle_anims/backgrounds/dark_void.png | Bin 7041 -> 0 bytes .../backgrounds/new/dark_void.bin | Bin 2048 -> 2048 bytes .../backgrounds/new/dark_void.pal | 16 ++++++------- .../backgrounds/new/dark_void.png | Bin 7041 -> 0 bytes .../backgrounds/new/focus_blast.bin | Bin 896 -> 896 bytes .../backgrounds/new/focus_blast.png | Bin 3537 -> 984 bytes .../backgrounds/new/magic_room.pal | 12 +++++----- .../backgrounds/new/trick_room.bin | Bin 896 -> 896 bytes .../backgrounds/new/trick_room.pal | 12 +++++----- .../backgrounds/new/trick_room.png | Bin 2137 -> 1718 bytes .../backgrounds/new/waterfall.bin | Bin 2048 -> 2048 bytes .../backgrounds/new/waterfall.pal | 8 +++---- .../backgrounds/new/waterfall.png | Bin 5092 -> 814 bytes .../backgrounds/new/wonder_room.pal | 12 +++++----- .../battle_anims/backgrounds/trick_room.png | Bin 2043 -> 0 bytes .../backgrounds/trick_room_map.bin | Bin 1280 -> 0 bytes include/graphics.h | 1 - src/battle_anim.c | 2 +- src/graphics.c | 22 +++++------------- 22 files changed, 53 insertions(+), 69 deletions(-) delete mode 100644 graphics/battle_anims/backgrounds/dark_void.bin delete mode 100644 graphics/battle_anims/backgrounds/dark_void.pal delete mode 100644 graphics/battle_anims/backgrounds/dark_void.png delete mode 100644 graphics/battle_anims/backgrounds/new/dark_void.png delete mode 100644 graphics/battle_anims/backgrounds/trick_room.png delete mode 100644 graphics/battle_anims/backgrounds/trick_room_map.bin diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 03d72f3ea..cfe95371d 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1893,7 +1893,7 @@ Move_AURA_SPHERE: monbg ANIM_ATK_PARTNER monbgprio_28 ANIM_ATTACKER setalpha 12, 8 - call SetHighSpeedBg + call SetAuraSphereBG playsewithpan SE_M_SKY_UPPERCUT, 0 delay 60 createsprite gAuraSphereBlast, ANIM_TARGET, 3, 0 @@ -1908,6 +1908,10 @@ Move_AURA_SPHERE: delay 1 end +SetAuraSphereBG: + fadetobg BG_AURA_SPHERE + goto SetHighSpeedBgFade + Move_ROCK_POLISH: loadspritegfx ANIM_TAG_WHITE_STREAK loadspritegfx ANIM_TAG_SPARKLE_3 @@ -2378,7 +2382,7 @@ Move_FOCUS_BLAST: monbg ANIM_ATK_PARTNER monbgprio_28 ANIM_ATTACKER setalpha 12, 8 - call SetHighSpeedBg + call SetFocusBlastBG createsprite gSuperpowerOrbSpriteTemplate, ANIM_TARGET, 2, 0 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER waitforvisualfinish @@ -2391,6 +2395,10 @@ Move_FOCUS_BLAST: delay 1 end +SetFocusBlastBG: + fadetobg BG_FOCUS_BLAST + goto SetHighSpeedBgFade + Move_ENERGY_BALL: loadspritegfx ANIM_TAG_ENERGY_BALL monbg ANIM_TARGET @@ -3437,6 +3445,7 @@ Move_GUNK_SHOT: monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET setalpha 12, 8 + call SetGunkShotBG createvisualtask AnimTask_ShakeMon 5, 5, ANIM_ATTACKER, 0, 2, 40, 1 delay 6 panse_1B SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 0 @@ -3464,6 +3473,7 @@ Move_GUNK_SHOT: call GunkShotImpact call PoisonBubblesEffect waitforvisualfinish + call UnsetHighSpeedBg clearmonbg ANIM_DEF_PARTNER blendoff end @@ -3479,6 +3489,10 @@ GunkShotImpact: createsprite gGunkShotImpactSpriteTemplate, 4, 4, 0, 15, 1, 1 createsprite gGunkShotImpactSpriteTemplate, 4, 4, 0, -15, 1, 1 return +SetGunkShotBG: + fadetobg BG_GUNK_SHOT + goto SetHighSpeedBgFade + Move_IRON_HEAD: loadspritegfx ANIM_TAG_GUST diff --git a/graphics/battle_anims/backgrounds/dark_void.bin b/graphics/battle_anims/backgrounds/dark_void.bin deleted file mode 100644 index 97b879f01ba8ebc08c92d30497c894a1a7b186c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2048 zcmeH`W0Rg)6h-HaZF8-pgO1IPZM$RJwr!_l+qP|IY}=lBlA3=pUAJznefB-)!?{&E zL<~a2Bo?uWLtNq!p9CZ%5s3poNpO>rjO3&sC8Q3JlqG_4l&1m}sYGR}P?c&_rv^2t zMQ!R(mwMEv0S#$HW17&EW;CY-Eont-+7L-w+R>g4bfgoV=|We!(VZUjq!+#ELtpyQ zp8*VH5Q7=QP=+y_5sYLMqZz|k#xb4=Ok@(1nZi`2F`XIAWEQiT!(8Sup9L&r5sO*E zQkJot6|7_xQNhoISj`&NvMx{|*0X_)Y+^H8*c#N^*#64j!A^Fun?3AhANx7LK@M@4 zBOK)z$2q}CPH~zuoaG$nxxhs(ahWSz$y!A)*)n>*a)9`|{`Lmu&%Cp_gD&w0V? zyuq8i#oN5YyS&Hye87i%#K(NXr+miee8HD|#n*hpw|vL<{J@X=#LxV~ul&aE{K236 z#ozqHYle(rOk)|_IL0-e@l9Yt6Pef~CN-JKO<_t?nc6g_HJ$0rU`8{U*(_!iHJjND zGlx0NWp2aGV_x%_-vSo2kcBN`QHxpJ5|%VXDN9=>V2HATddZh3!g7|kLQq$^Beaj3%_?g&RZ%F&K-tm7Q-1SdMl$xd;q z)12-MXFAK-&T+2uobLh`y2!;YajDB(?h04B$|zU6#JKX6m zce}^E?sLBfJm?`0d&Hw2^SCEG=_yZp#3~?@CWcYb6c+pE<_KH`%=5=p)(_7y5 ij(5H1eINMHM?Ut6PkrWdUj%c}`H#+jbpHRZ`TrM_mOTvs diff --git a/graphics/battle_anims/backgrounds/dark_void.pal b/graphics/battle_anims/backgrounds/dark_void.pal deleted file mode 100644 index f4cf0f09d..000000000 --- a/graphics/battle_anims/backgrounds/dark_void.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -0 0 0 -131 131 131 -123 123 123 -115 115 115 -106 106 106 -98 98 98 -82 82 82 -65 65 65 -49 49 49 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/battle_anims/backgrounds/dark_void.png b/graphics/battle_anims/backgrounds/dark_void.png deleted file mode 100644 index 2922f89d3f24a6bb835fe3b53f62bedbd96029c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7041 zcmV-{8-C=8P)006)Q0{{R3aTRq$0000mP)t-s0001k zgM)i}dvkMhYHDg?Vq#KKQb9pMF)=X!0000000000000000000000000>A(T!000{d zNklBzMqy1kG@V5U84&UNd|U`m`u70$}21}xN$w$UEm45-Eua7F4Dl_ z%}U3h^CuAfBZwr=#hQfqeZuz=QVuE{M9hV|ED48$qAuTnVz0RKzKbmmnh5^CgH(Vq zMy9KEC1n2{sNF&A%J5VH zKv#eoAw#jg1rrb3lI#Mg`AC*U2|2g`P)TI`1Y)8w0MR3ex(4aMNE4uibRQ`)FClK#gz^0m$wk3<(nP ziGdW@D=`?fOekRzbRd*4(%j$<`W*C0pdA~*9C@3Ms&$EC6jr9(k3s76*IRQ{x?JQHr187nPAc1&iDVt%HMF6gPkO(kc=^>FL$H#UufJT6A z4yw5$dppb1G4?rVa?k`2;=Kc14sI;$>piGQ#mWe&9)*Ey=h#prG&fu$(EwZuFwSiN zHQ#|ivLuT#j~EDw0#5X ze(0K#g)FTDeaS7|C4O=8zx|psYq)8%5ht&O;8$m`zc+n`Wl5$pR(hAVte*G%d7bue@0=WopDH zCw62zUU-(|Q{Qr90F!`5jk}g#S34W6K0-ZD0n}vKR8e`DWu~*qQY9?qsY)?`v%&^& zZ@t#pEU#zDOm^ZBS}Q=l?Z$3MlN3cwR2eUuL!d<;nNy^bK4|4WXd~XAf+#W}=J-cU z(giM6c;GrL!U+^W@us*w%+}rv3ZRCyGE=Fxe&q$oC;qHR0n|6rN+K&e;+;@{7*P(g z9@JovaNJ1FkqzK02P3E;d`` z1mH{Zm(l!Q?vwRa5OR?R5Y1qq<(NlX7_}IxxrH`(ncoGmG6eFl21`6c;Xw zWYmG$a{Do@<#I7U!i}d26mcSTdhZ0hHa3#nwfx2VeqV@Born zTfQG&8>3q9uVOow&Eec$&*zt)^Rzmj#ha6}dba0HIm<7Ld?APVVr8R%2DY2H3s$5W z1nz$Nx`n{qK;YIzvla!IZCD|%KC*+0UH^3K3!rJmJg&a?U980gzW71pQb?b5h`HhX7<5`U}@5ss4ja7YbV4-!o;CfC>V;(TqZrhPlD zmF$$oAxgC*bcvi+kIQPfdycx#E129gEvKeJfzbOEGO4< z-ym)C`KGMPau?#zN}T8vXI5RM#kILsZ->v&*&Um*ZTNvvYA-%mrRKl(p9lY=ZjQ&y zQS>m^Ie6dN{j{pfe1TItT|}q63Yw}CJI=o^>GbgX+;p#^EL|i!7_FqU{4aayKy6 z1=Ex!TJw4NdCi{742`z`ar2tgghx3oNXy}^CR?xTrs-czHUbQ%8O`hf>>y8r%pEBMzy8zHPdptKcdYkrOWTU+Ph5?_ydjI-?e*dxBlcK{s1tY zRrV=B4nLxf`B~cj3)kkOd5n0Nv#ZA=YE$CiG?cPs6`m3a*>>Pt-GjJ%?rNV7mp}Q^ zXzQNRwe`aVp*<$Y{P3D00JFN_htOLo94KRx5IP&$LHYt>X(ZMje{1qt9G4j?mpqCe z&VUEaAP}>O<#}j_ub_m7#y)ko>mJzWhrgbiubEHNs$Q4Zw*LHCqH4{@(~f3RH)EGj zkosiO7Qv_;P9|PIK!u0+y>Hv)Yu2>lMz!Y#SK_DvltxqGNe-Wzv*CQ+PI!OU63P!W z_>1MdY=#cf;I5m03yN2LNAJSII1i079L0;XUk-f%Hd_p2?XAkspw!i~Z&qo>#X7#< z0G;n$k2>&4Tyxh=QF;)KL4+1fa}QfPE8=mGpr7B}v=iw-_d5{!=0jK@>0y%xyCmKZ7h8Y-u`+5#V>SJMt&!Y+s$)Q9}5tF0nwj8 zf*(MMdgH_ll^#Hy|Byw^{v$Zln?{H|9eM-F7?iuWM7lwYC{nj`1d=J-O zO7rVQ?@7n*!lIlVNV@zl2k{+bH?V6|W{U=<{B~kPd=!37zbI` z8%-<;kPIMWjQ16d3?N*=14B3hKwq*sX!0~n7eb~;3RoTJj=_NU5_tq# zcM!P%GELC{B+86gE+(wYqFI<%*~WwqUp&X}a?p}20A&s;0D626Tvg<=N1&m{QqX}i zarrkH1X)m9V*sJhn#e2Zyt_OFt_Bxkec-~RnkU-&0w7{ZItyuE05%jrfELe!OFAJs zc?35a;~Aemo6bRW1EC>pmTEHZ`U37h^N3gnAr+~TC2=uFlkQqo&V&YIX9Y7|A zB`Bc_GkQj3YC_ckgxPeY_h2Z6ZfP6TQlzOHxiMYo7=-}h9t=4Mze?1?Vpu{x2cb4Z z??H=TH_{o~@N%Y7=v9GXS_*juFrl%n<8*=$_5t&0qBDJJCsGK3>)Bo(xJ>dPa8)Vbfy)b! z@&d4h=1xTcObeSlrO9g)O{fls8N8n(HzT%Zb1)^!!VOk;5DwxXv@i6WI7O={VVUL5 zp?jOevUmc8gIha-63RV@J8&403ebiAk+svbqcxI3&md^l; z-vQJ^13=%Vp1i8vWVcvnwOa-AWnAp0RDdqcZJE7Fr4m`LE*nK{9S(KWEH*!*l6qDe zDuK@%I{27vC-y?|JODLMUo~!$XI0j?O*&ui%EQ!JLD$henmaOk5nu%1srHY@COR+P z0c5_FrivXi;_J!B>@b1Ab(yYt&}StT0(Z4BJagkh;AV6kHxRgiO6JjKm0G({m$PtT z#QxF`HQ$IEx5(Gkx`~=>xzFpv)ZCH@Gb4{VmIogZ0Ga?gp8M`@LQ>KyX|h*4d|~s= zW>r|bg`;GPY?{Q&Ak_mSZ&t;rf*HoPsn*r8KFqZ(ow(+PgDU`$>X`CwGg}Fe)>f0A zv$?Z)ahIFzs<89SQOc~E<;gnC^u#HyoBFheDb)q0=;u>&oLgIS;(8n3bf66cXvw?x zS-g6WK2qA)=ki)D7uid+e*cKe@VE}uvTBy6WS^BzF*}{Nb$y#0T-wjMy#vtStUM?a-d6P9^nbp_#c1XSO$MVZE zIQWyu|A_q%Kx>6xLSH`py)N>#u*;4_TMOR{js2Nw>)!A;XX zAK!j?=lktaPaFtb4FcDNo}h00$k2_`B|aV7&3XC$b5onKouz7!xHPbne=iQZ^pGc6 z3I*8duUV=*lK|Sjbqo!6E;Z^VSQ*BwzT}^m^ZR-I{aj<^aAY+nEDkec}7w{@%YgRuYt@n&c5pLI8gs%g<9$X89`3jUVem z(d=wU-xP^SrO6CAfpyA^Xel+X@97S}TXR7%TR%^$Qca7$1*{tL$X_ zwJub6$g(UuO!{1kG+E#<@lTl({RHr%$QO(GsQv3UDbl7?ZW$#oUhB&tsm}GUVe;Kv;JWZ%^YR6Jj^O5N;-)D_*|PNv>f5$e zeYURqA>3O&8}1Sp4%U?wM0N40O>=F*ggWz*DUn)vM2IEW|LzS(Mjlt9rc zk;K4(c@L!i^sk8wqZe^522{ z<^URmS(*C$0qN`3h0VX3_E=Qs@drd#x%NxoezTFTGm{bcvuW#UlzqFqZ`~>56wSE>$6_EA!XS!95w5XJ`q;SK>W_=mzQoh@Zf2 zJoz3(n5S0B0CtDEVlk2c34e0{$+sYS0&xe5gB2v!hV`KR4cOH5Nq3z3nc*1c>qZd5>dh)?AHfAfssTzkQf?Y zn}b}jY6(4oe8C@2iTxvpHC-M+M9EZRNQcR)L}1l-F15z*|xqiPcx= z`M%$?$GX8UWJWwiHCzb8h2RegHF2RyS5~3GWZ#0ep$s5Q;%A139T!Sy$}5C3U7}B*s{u&6 zh-VLJdfde)b{r1+0<^4|IH(Aa0vKCxq|U*WP+;gmv|IizKnFVlT&V#YK!UIUWt+zU zfGP(mUyis-R{jV?5`6$+@N#75HD+6HH4PZEWyXgh4hE7%0EDKLWuh_xB2&AAHja6t zQdz^u6d<0!s6j$G1n>Z0DnN}ln*e=D4myyj%-~6X3Sb%ss!yQkK?iEGCJPX{$b^bE z=mJ+?%oOdreF5Y1jHG<@4RyuEqv67P6QCG^0TCvMC0WRjbcZlP8>bim9@$jNpX6Y9&TdKxU ztv{p{GJ6R9YPe*A=&59!vMj10zvY$nKO!8&9azkUqK?}fwm(aR{xT@B(WqWQ9 z(iTnAVh<0==X$oq<@&M!(6aK#gXy-H0eFgk7x~X><)-S2hnFQQZb=f_fr{u{_}aWJ z-{3jyH`(E7zZj&Qe`s}8uhpgs{CwkUmJeX{v(7)u;%61F(&?6izN~nql$aC$4r>8;rTxU-Qj1so&-gy8AHx9k3V zt>3N}cGQ>U@EH2(G!4v*`CJu1+fU+Z+VG0BEr8qNwF4D(Rg>JB$N}mDmoL~gspf0P zG)|`RC~z%Vm$Ah};EoIM%GK2j{v4g3VwuVL%0XR#FW!_$7S({zJ8n*P`5VG^!-FhkPc533VZRV6j_>{*vB$YrU?s(9LhO> zn1i~-_^2l*0wh?IO-q{bFWC{a(SNGdBh(3$)j4x4h-1S=&#+<#%Z{&%g?6Hmq#x(jZ!Tv05bu4G6!=3 znzF6O!2lw?YVv+&&%qGJ*Xib8hh-oai>j$FOuZ>P4(f>-$*Sl=XWO26^7hZ%LU`Ue1pWPEcy7al?v4t>x4R=garM z4sYeG&k!}I^(iTm_4%cpj8m;m^LLsi$Nap$Pydef@)Y76r_-0DVRiCSE18k~SbzNW z`F6W(TklV4nO5hY?Zfo8ZGWd(ax6znR@zgu{_MfLaqINuqGnF^v-JW}+6)aJQ8~e4*&5gei08>zCy;%T@}2N=__hPklXf ziu4A;q~YGkW%mdtJtQmcV8+sA_3}2))*X1H7IR(#BMrx(L}*w4Ht~l3hQG}yPOf$N zR{gbKuB)vAk3%rL_@?uc7-?E&;vuqI+5v+#&%T^Y%I-b*JCS$2GmrRozg1mDQaKpD zrcRO7%d)A&_uvTiU_YF?cTmz6L)5|ml|r}m z=_pn8>vg4?>cvmJ^tGJTRnvS2qA>_$n3Z)|1Z-&U5!kMGs{e8ciXi(dTksxp1E2r7 z=Xe`U8~X9E+X}B+*)xRK_2QxKcQHh@$JgDmE$g)UQ7w7)eDbHQD_rTLAw>Gj6<-u4 z!O-3$l)l|6(YEIwjaZiVPhgu2|8`KQBE5XMg&RD<8;|{51mr(}^*xu`&v?4{7;WEl zia&yN^1Qf}PkEj)TIj3zNATgqTdwUnMTVTJZK`{kwk`gjVE?U-N&Bx3a`OKLhvt=l fY?_!zfAanZtmW~3kuXOo00000NkvXXu0mjf6ZK=N diff --git a/graphics/battle_anims/backgrounds/new/dark_void.bin b/graphics/battle_anims/backgrounds/new/dark_void.bin index 97b879f01ba8ebc08c92d30497c894a1a7b186c8..274b971db6077f17e2f02b8620be277d724c249b 100644 GIT binary patch literal 2048 zcmajcRaOE300q$_1|}sYNQl6IV-XS(``?x9;GOxrpR;%8){TFzUAc7OuXATkogDgc zANMq@`@Y%p)vn(rZ`<<4rVXEc^3ezHy|eDEHLG?^Ubf_o*Is$)h36JM z^VAcMEqG+btW@W>O-G-&cdi#EwC98uty6HYm!$T=5Wa>X?_lqi!t{Y{?!CQpBpr@zV5-{k3U z^7J=(`kOrcO`iTHPk)oAzsb|zn>_tZp8h6Jf0L)b$2LD%H+lM- F{2%-zDKG#4 literal 2048 zcmeH`W0Rg)6h-HaZF8-pgO1IPZM$RJwr!_l+qP|IY}=lBlA3=pUAJznefB-)!?{&E zL<~a2Bo?uWLtNq!p9CZ%5s3poNpO>rjO3&sC8Q3JlqG_4l&1m}sYGR}P?c&_rv^2t zMQ!R(mwMEv0S#$HW17&EW;CY-Eont-+7L-w+R>g4bfgoV=|We!(VZUjq!+#ELtpyQ zp8*VH5Q7=QP=+y_5sYLMqZz|k#xb4=Ok@(1nZi`2F`XIAWEQiT!(8Sup9L&r5sO*E zQkJot6|7_xQNhoISj`&NvMx{|*0X_)Y+^H8*c#N^*#64j!A^Fun?3AhANx7LK@M@4 zBOK)z$2q}CPH~zuoaG$nxxhs(ahWSz$y!A)*)n>*a)9`|{`Lmu&%Cp_gD&w0V? zyuq8i#oN5YyS&Hye87i%#K(NXr+miee8HD|#n*hpw|vL<{J@X=#LxV~ul&aE{K236 z#ozqHYle(rOk)|_IL0-e@l9Yt6Pef~CN-JKO<_t?nc6g_HJ$0rU`8{U*(_!iHJjND zGlx0NWp2aGV_x%_-vSo2kcBN`QHxpJ5|%VXDN9=>V2HATddZh3!g7|kLQq$^Beaj3%_?g&RZ%F&K-tm7Q-1SdMl$xd;q z)12-MXFAK-&T+2uobLh`y2!;YajDB(?h04B$|zU6#JKX6m zce}^E?sLBfJm?`0d&Hw2^SCEG=_yZp#3~?@CWcYb6c+pE<_KH`%=5=p)(_7y5 ij(5H1eINMHM?Ut6PkrWdUj%c}`H#+jbpHRZ`TrM_mOTvs diff --git a/graphics/battle_anims/backgrounds/new/dark_void.pal b/graphics/battle_anims/backgrounds/new/dark_void.pal index f4cf0f09d..6aa0b26a6 100644 --- a/graphics/battle_anims/backgrounds/new/dark_void.pal +++ b/graphics/battle_anims/backgrounds/new/dark_void.pal @@ -2,14 +2,14 @@ JASC-PAL 0100 16 0 0 0 -131 131 131 -123 123 123 -115 115 115 -106 106 106 -98 98 98 -82 82 82 -65 65 65 -49 49 49 +48 48 48 +72 72 72 +88 88 88 +120 120 120 +0 0 0 +0 0 0 +0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/dark_void.png b/graphics/battle_anims/backgrounds/new/dark_void.png deleted file mode 100644 index 2922f89d3f24a6bb835fe3b53f62bedbd96029c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7041 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 diff --git a/graphics/battle_anims/backgrounds/new/focus_blast.bin b/graphics/battle_anims/backgrounds/new/focus_blast.bin index 98e3e8e16b63fe73c0fb8cc7adc2cc1630bd3359..25c569a1465844e30b2dbf039894446f4cc7e984 100644 GIT binary patch literal 896 zcmWN|S35EQ00rPDlqf2DJ8^L2*dbeHWbe%EUH|{?``-IEfB-5`i7EsULN&suK`kPP zq7LaA z#ZGpxoo#Go3!B-*Mm8|PIDsVk&<|n&gBXG^j1)#-jA9Jq80Q#AX^t?(VTwZ>PSaE^nv%C_nvp1^NzQ@mB`s@3t6KGnm%ZdgFL>S=&w17}PJ7x@p7eyFr25n^YCwY;k~FN8 zMr4g@Oye5&m`81oIOSo>Lmu>i>3;V)X*jNg8q}yJHLFFfYE!#9)Tu6Yt4F=+b&tE< zBomp*LRPX7L3VPGlU(E`Pf#Rz$w&Th7oZ@8C`=KGQjFr1 z0Hh?PLPk-V=)h7YP+7`Ro(fc?5|yb!RjN^)8q}l~wZov8qknNG^PnnX-0Ee z5JN02X+>+=5Jy|u(Vh-;q!XQqrwd)_Mt6G9lV0?u4}IxJe+Dp+K@4UHLm9?!Mlh05 zjAjgDNnjk~nZQIQF_|e$Wg63&!AugF#cbvmXSEO(fD_KP{ zt69TZ*0G)qY-AIg*}_(~@i33@D37t79qeQmkMjgi@)S?=47=IGvpmQ1yue=e@ggs= zp937^5HIrzucqj=)P6ms-$=dQ4E+{|Il@tn1%8`%LLN`a6M;^0iqo9oUEbq;KHx0p z_>hnIm{0hW&p6KoJ`ehWi(KMMzT#`X;d00;T;&?qxxu%5$M^h@+CTCWH@U^n{KBvN z7IZt%9e(Ez{^T$I<{$2IkAL}(|GCdYrZKJQOm7A=n#s&&F{{~(FuOU-X)be{$4K*< z&-@m!poJ`K5sO;P;+7D#q@|3qw9$d0En`{BS>6g(w33yrVpXeI-5S=kmbI;8UF%uj z1~#;jjcsC6o7vnJ#u#f$TiMz+#@W_(wzorYM>~b=Y`k6UYB#&v!=CoCw|(quKl=v_ zaG--6>=1`K%;Ao3q@x_|7{{96ILAA|iB58|Q=IBFr#r)$COXU6&T+2uobLh`y2!;Y fajDB(?h2D!=_-@MYIRs82CZ?e>s;@K@VC(i6Oa3q diff --git a/graphics/battle_anims/backgrounds/new/focus_blast.png b/graphics/battle_anims/backgrounds/new/focus_blast.png index 8720658a784516bc636fe2156fc769109f312fda..7c8755f59a7d5666663c87dab82325fa8146d99b 100644 GIT binary patch delta 937 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 literal 896 zcmYL`RajI}6h_5iU;g6Rzv*sxbkY9lW5ljenVJKnP zwQ$1|3nPdmQj5@ni6TT8uEl$(G`kk>L7JT;SR5wZ>M#qFV$#j}f4As1hwZOhb(8LP z_mtbsj%Yv;L#$Af6RZ7qv}o<$dyJ-VyL&3$lgY2-q`*N+Qjr>+G^8aR>B&GwGLe}q zWF;Hf$w5wXk()f^B_H`IKtT#om?9LV7{w_;NlH=yOIp#IHngQ3?dd>AI?r62tn zz(Co`AUT5>!cc}WoDqy<6r&l#SjI7)2~1=XlbOO)rZJrv%#@wXVm5P_D{UV0g$r27 zA{MiRr7UAPD_F@YR>&DV<%2_v0Lb54}00iehzSuLmcJ^ zM>)oEPH>V_oaPKJ&T>w8o(sZ@ToSstZ14(KxyE&FaFbiy<_=E%F87GjuW_FTVh?#F zbn1_JV&qeU&vh($Fi=cX zMF0Q*n7H_Wpzvsj*idl5I9R9{IEax!7=Hi&0D(?i^#A|>32;bRa{vGi!~g&e!~vBn z4jTXf1}sTLK~!jg?ODls+cpr!D}Zuzhm`s*Qt@4us=L#CxpNWT{}DngvtnqsjlZ5c z2MYi(KW4{}cCON`&{He~zaJ9tyF;PwUjrz{{{j9}fYo*W5Yk`olOIFOdAME+ z>u}Cb;$NA$jC-iQLB~^Xd5S8pPzWUv&LR`Q~-+%7XK|c~CXO7FscerUTW5=w-w>HeH5t;1q5&X+% z8Bv}*tS28DiIVIuG@X<3l^8%~?uJI4IIpt*WcvacB8CdEq@b~wldZk5#mPSt*6PO9 z9^1@X_5??UjMHjJ$KvxN+0k_%ODdr5_@~XBW&bM00oN4@*^*F=8}gXdK!3q^Vndm^ z!J;*cI=v)UdVeef6$hEFTJ~fOu6$KLQv>kmmEH4xFP8#UJO!}YeRq$FgzM5K76}qy zm0fNv+jnx|yXQwR0G{edYuqY@Nc}{k!;OaQNqJ??C5VDQ?FxWMb)r`-{i=_UXX>&F ztL*34l6Kun7omQfyU!>n{(pG0s5jQjO@egw`C>6-H(b}MA0I^>3!rsfQos8t7oe!N z{OfJeE(R@9sAn_)t?Qx+-og(HIv0H7x>!n=k`e(0fGRn-yK7eVIOG6*QwB0M>cw&4h#eaD*0T!zs@B{>!QcAP{ZSEHSeY2FKv;i=JH_@f#4|fZo&E3M^zJQDcQUVyc zTQ;}+b3I7_Y^bjjFn<%oBnQ|~-{ikM0{|sv*vM&}z==+n=hUScxoanI-c0FSCHZdT zZl*Q?BY2S8zz*KbZvc6uZZZUPty7?lSLz(IZ|;D2%Yx7JFlNknk@&aDO z7Ys9qmkG9y&}fc#j+g;3nyLGF14{&0!FqQANuDdf;(?92p9z+xM(_xmrmXev8wEh9N7&?W4aShw1}5t zU)GWeym+#bHIiCn)`i@82OIG2XJI!yRjXJLww*l~Ks;g=TRL}q8P&#lR^_6-0x0JA$w zL>`f_7`GUU$;2gBBU{d$pEZ#)dH|Y6!u&=fK))v zglz0dxflz8>U#tWPed_6+dAF&@wky%^AbZ3950x%k~XuGHFiP1XUM6X@d;LUr{0sK zJuYI#?SY>k-CgVvamQ~&{R~q_b*fT;cMOWsNPhrs=O`1A7i7E`HNZpl$NSA0#*qYI zr98_c3?gD`!bconk?$h1ENsOT2aryaiKq-hXbfPM3^Ebbe<0~B1|V&&vP#L*8vt4W zHJ28({?DWZ7~h*3UotBKn(sfVGU++{e@X_>3hP8{qKaAA znF1^yM3wpo(+Z#xQJZ8@0PQyrEfT-iBQIzfKpU)0%qFoI$1g+&9I8s$2q^#n002ov JPDHLkV1m_VA$R}) delta 2135 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 N002ovPDHLkV1m*T11kUk diff --git a/graphics/battle_anims/backgrounds/new/waterfall.bin b/graphics/battle_anims/backgrounds/new/waterfall.bin index 076beeff2fe1ba44277bad014102fbcc7c3180bc..eb2085cb29530c90e242b6f08d485c95a2d228ba 100644 GIT binary patch literal 2048 zcmajc*;WAn00!YhB(gVK z<%9PwT{w5{Y{?!CQpBpr@zV5-{k3U z^7J=(`kOrcO`iTHPk)oAzsb|zn>_tZp8h6Jf0L)b$2LD%H+lM- F{2!U)2`~Tv literal 2048 zcmXw21(a1s6yxK%xG#`Ef-dgv?(XjH?(E|3&f@NFEmWZH?nUbEUOIf}nUmZkcix;g zb7mrlgpoAL$&ef=kP@koI`}k5i*!hj42TIXMi~QVLgv6(kQLdG9XXIQxCn9~ci=q8 zi&*4CeiQ&e6ht8iMqv~|Q4~XQlt3Ixq7+J_49cP$%A*1*q7o{j3aX+Ss-p&Kq84hS z4(g&F>Z1V~q7fRS37VoAnxh3;q7_=B4cej|+M@$Hq7yo!3%a5kx}yhrq8ECj5Bj1X z`eOhFVh{#n2!>)9hGPUqViZPW48~#{#$y5|ViG1}3Z`Njreg+XVism&4(4JW;*o&) zSb&9C6!y0mORyBnf?AFhfmdP`R$~p;Vjb3F12$q4HitZdE!c`}*dEp4112^#$p2jnH7SG{%ynq++5?;nDconbVb-aN$ z@fP03J9roG;eC975AhK`#x2~&9o)qy_!OVvb9{j>@fE(tH~1Fc;d}gmAMq1@#xM94 zzu|ZMfj{vV{>DG}7x$2a5hi6aCT9w!WGbd+8m47Bre_AmFe5WDGqW(953?~lBgny= z%*EWy!@P`TKIRWu0fJ;f7NY3jV_ldwOE^VSU2c;tj`8)$VP0;CTz-PY|a*J$yRL5Hf+mwY|jqt$WH9c zF6_!~?9LwS$zJTuKJ3eW?9Txl$Uz*;AsotK9L^CO$x$55F&xWr9M1`y$Vr^cDV)k_ zoX#1X$yuDuIh@ORjAsJpa{(7}5f^g_mvR}Ga|Ks&6<2c&*K!@#a|1VW6E|}Uw{jb| za|aW-le@T^d%`aE2JGX09tiay5AiUM@FpYn4`pKUtyWftP8imS}NMi?mP+G+zmd z*F4SD9L?4&&D0D{*ECJl6iwD7O$;;l1l%9HLrv5!?Nnk=JHm;^JnU@OHf`0GsN1Yf z+Ncd$uXS3hH6c6oaMpuW!Yhxi_Q0Lg2_4rl9Sw8hqw|jFuny^<4rssjX|G<<%X&#K z>IFTo=k%Iprr$8=rS^r#-uRbA0#UD8Ee(0QHHS)I{o{h;sloxasK z`dVMJeZl8_&S!nbr+q5qCj(CSxR3d$kNB_;`Cv#6c)$0B Hx;NlI69yLt diff --git a/graphics/battle_anims/backgrounds/new/waterfall.pal b/graphics/battle_anims/backgrounds/new/waterfall.pal index 1ae2f0ef9..69a25c589 100644 --- a/graphics/battle_anims/backgrounds/new/waterfall.pal +++ b/graphics/battle_anims/backgrounds/new/waterfall.pal @@ -2,10 +2,10 @@ JASC-PAL 0100 16 0 0 0 -131 205 230 -123 180 213 -115 156 205 -115 139 164 +128 200 232 +120 176 216 +112 152 200 +112 136 160 0 0 0 0 0 0 0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/waterfall.png b/graphics/battle_anims/backgrounds/new/waterfall.png index 2fa27759f34a96ef3f362b934933b038629c3501..3ddb1a0a2662eacdca77c95a78e0e55b8c203be0 100644 GIT binary patch delta 798 zcmV+(1L6GSC$0uKiBL{Q4GJ0x0000DNk~Le0001h0000W1Oos704NM?761SMFi=cX zMF0Q*fXL{0u-I^z$Z&|DkwF-dPzir|U}`!5000SaNLh0L01m_e01m_fl`9S#0007{ zNkl0ZA^^ErB1^Q}sp`(!6_8QE z>`bjv>n(qp@@*_b7U!VSIpwCA0eDnS8Mfqlol|`R(3Vi>s$5AMzOT-A2^p$3xlU`_ zZlkmeUO~U&O6;9fd*^Z#DLH??#IrU#MU_Im;qsoHtIjnL8YW?-xHIxQbI!t+lN5T1 zRdv~L`$ze*vNo<8OfS4q^$Bpp+7fFVuI62hc@+uH%G4#u6l-bJqsA+{uIaT&UAdir zF!!)fJP)SsZc2@D9A9F zyRPE40)VDGxCH=tUu0(8b_F;D3nx3k@E}Y8D|Hh9guL69dbH*XZc@Dzj5H`f)3yU_ zDgc*KW8)rB5V8RP`Joz%Hl+iAxiJp|w_tB!9RPS69SYR72Nbw9e_enr_Pqp|c0BA* zegMQ`0H6T31lN23&`^JL>j2<ZmpW?;Y*|IJdqDK)tc6 zjq2m4P!Ri^0q7rqFuMVUiLQE$fPv2mhzsy8YaUMk#Oi1&rh;0Lep3)nz!xnsn;i=5 z@*tiHJU(7NcI#%pIi~gn{RaH_<~kIN`4?b%aKzsMXT5XQ^@{m7Kzy`tDfnG{Q|9*y cK5Fmr2brLoW|qNUAOHXW07*qoM6N<$g2s+ilK=n! literal 5092 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 S`O;MX>!Y!D&bBNJ5c3m?gK+-< diff --git a/graphics/battle_anims/backgrounds/trick_room_map.bin b/graphics/battle_anims/backgrounds/trick_room_map.bin deleted file mode 100644 index 3d0041baaa897abd0ec1395b944b28a804c89c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1280 zcmeIuMVA#<6hPs|-Q7Q&;1b;3-GW1Kcc+11!QF#HBf+I{|7DzaCop30CQP`s_CDuU ztv#uN3MiN*IdKXp>^nt%*fZ~ce$Vtp6_YKQzPJ*yCDWHwO15PB(#pt|OkY+x6`gOb1k&gN^5Pj)lPdI{Hdc(I_sjV zZo2ECr(SyNqi@{$1^rV$z(9ixHpEcF3^&3^ql`AjSmTU0!9JPXB~= z*&W^!-*W8@a_vk0H+g^Zfz%&#$YDnu4Igvd2`8P3{j@XAI_G@y1s7xg&!zBXSHf3a zOZ{~>+;mHx+wO$#x)=W6eGg(j^eFt;lW?A=$Z`18v@_QfB V{Fwa7=QO`0e+}pSKEM1Ad;`R~qc8vf diff --git a/include/graphics.h b/include/graphics.h index 78d9f2c42..34eef131e 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4941,7 +4941,6 @@ extern const u32 gBattleAnimBgImage_SpacialRend[]; extern const u32 gBattleAnimBgPalette_SpacialRend[]; extern const u32 gBattleAnimBgTilemap_SpacialRendOpponent[]; extern const u32 gBattleAnimBgTilemap_SpacialRendPlayer[]; -extern const u32 gBattleAnimBgImage_DarkVoid[]; extern const u32 gBattleAnimBgPalette_DarkVoid[]; extern const u32 gBattleAnimBgTilemap_DarkVoid[]; extern const u32 gBattleAnimBgPalette_Dark[]; diff --git a/src/battle_anim.c b/src/battle_anim.c index 44a382296..b52ef0592 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -2059,7 +2059,7 @@ const struct BattleAnimBackground gBattleAnimBackgroundTable[] = [BG_ROCK_WRECKER] = {gBattleAnimBgImage_Hurricane, gBattleAnimBgPalette_RockWrecker, gBattleAnimBgTilemap_Hurricane}, [BG_SPACIAL_REND_ON_OPPONENT] = {gBattleAnimBgImage_SpacialRend, gBattleAnimBgPalette_SpacialRend, gBattleAnimBgTilemap_SpacialRendOpponent}, [BG_SPACIAL_REND_ON_PLAYER] = {gBattleAnimBgImage_SpacialRend, gBattleAnimBgPalette_SpacialRend, gBattleAnimBgTilemap_SpacialRendPlayer}, - [BG_DARK_VOID] = {gBattleAnimBgImage_DarkVoid, gBattleAnimBgPalette_DarkVoid, gBattleAnimBgTilemap_DarkVoid}, + [BG_DARK_VOID] = {gBattleAnimBgImage_Waterfall, gBattleAnimBgPalette_DarkVoid, gBattleAnimBgTilemap_DarkVoid}, [BG_WATER] = {gBattleAnimBgImage_HydroPump, gBattleAnimBgPalette_HydroPump, gBattleAnimBgTilemap_HydroPump}, [BG_NIGHTMARE] = {gBattleAnimBgImage_Nightmare, gBattleAnimBgPalette_Nightmare, gBattleAnimBgTilemap_Nightmare}, [BG_LEAF_STORM] = {gBattleAnimBgImage_LeafStorm, gBattleAnimBgPalette_LeafStorm, gBattleAnimBgTilemap_LeafStorm}, diff --git a/src/graphics.c b/src/graphics.c index 5ba3af42b..153d75c71 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1397,10 +1397,6 @@ const u32 gBattleAnimBgPalette_MagmaStorm[] = INCBIN_U32("graphics/battle_anims/ //new battle bgs const u32 gBattleAnimBgPalette_GigaImpact[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact.gbapal.lz"); -//const u32 gBattleAnimBgImage_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/trick_room.4bpp.lz"); -//const u32 gBattleAnimBgPalette_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/trick_room.gbapal.lz"); -//const u32 gBattleAnimBgTilemap_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/trick_room_map.bin.lz"); - const u32 gBattleAnimBgImage_Hurricane[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hurricane.4bpp.lz"); const u32 gBattleAnimBgPalette_Hurricane[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hurricane.gbapal.lz"); const u32 gBattleAnimBgTilemap_Hurricane[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hurricane.bin.lz"); @@ -1412,11 +1408,6 @@ const u32 gBattleAnimBgPalette_SpacialRend[] = INCBIN_U32("graphics/battle_anims const u32 gBattleAnimBgTilemap_SpacialRendOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/spacial_rend_opponent.bin.lz"); const u32 gBattleAnimBgTilemap_SpacialRendPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/spacial_rend_player.bin.lz"); -const u32 gBattleAnimBgImage_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark_void.4bpp.lz"); -const u32 gBattleAnimBgPalette_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark_void.gbapal.lz"); -const u32 gBattleAnimBgTilemap_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark_void.bin.lz"); - - const u32 gBattleAnimBgPalette_SludgeWave[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/sludge_wave.gbapal.lz"); const u32 gBattleAnimBgImage_Aeroblast[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/aeroblast_tiles.4bpp.lz"); @@ -1441,10 +1432,6 @@ const u32 gBattleAnimBgImage_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle const u32 gBattleAnimBgPalette_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/clangorous_soulblaze.gbapal.lz"); const u32 gBattleAnimBgTilemap_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/clangorous_soulblaze.bin.lz"); -//const u32 gBattleAnimBgImage_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/dark_void.4bpp.lz"); -//const u32 gBattleAnimBgPalette_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/dark_void.gbapal.lz"); -//const u32 gBattleAnimBgTilemap_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/dark_void.bin.lz"); - const u32 gBattleAnimBgPalette_DynamaxCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/dynamax_cannon.gbapal.lz"); const u32 gBattleAnimBgImage_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/electric_terrain.4bpp.lz"); @@ -1497,8 +1484,6 @@ const u32 gBattleAnimBgImage_LeafStorm[] = INCBIN_U32("graphics/battle_anims/bac const u32 gBattleAnimBgPalette_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/leaf_storm.gbapal.lz"); const u32 gBattleAnimBgTilemap_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/leaf_storm.bin.lz"); -const u32 gBattleAnimBgPalette_MagicRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/magic_room.gbapal.lz"); - const u32 gBattleAnimBgImage_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/malicious_moonsault.4bpp.lz"); const u32 gBattleAnimBgPalette_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/malicious_moonsault.gbapal.lz"); const u32 gBattleAnimBgTilemap_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/malicious_moonsault.bin.lz"); @@ -1553,6 +1538,10 @@ const u32 gBattleAnimBgImage_TrickRoom[] = INCBIN_U32("graphics/battle_anims/bac const u32 gBattleAnimBgPalette_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/trick_room.gbapal.lz"); const u32 gBattleAnimBgTilemap_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/trick_room.bin.lz"); +const u32 gBattleAnimBgPalette_MagicRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/magic_room.gbapal.lz"); + +const u32 gBattleAnimBgPalette_WonderRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/wonder_room.gbapal.lz"); + const u32 gBattleAnimBgImage_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/twinkle_tackle.4bpp.lz"); const u32 gBattleAnimBgPalette_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/twinkle_tackle.gbapal.lz"); const u32 gBattleAnimBgTilemap_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/twinkle_tackle.bin.lz"); @@ -1565,7 +1554,8 @@ const u32 gBattleAnimBgImage_Waterfall[] = INCBIN_U32("graphics/battle_anims/bac const u32 gBattleAnimBgPalette_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/waterfall.gbapal.lz"); const u32 gBattleAnimBgTilemap_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/waterfall.bin.lz"); -const u32 gBattleAnimBgPalette_WonderRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/wonder_room.gbapal.lz"); +const u32 gBattleAnimBgPalette_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/dark_void.gbapal.lz"); +const u32 gBattleAnimBgTilemap_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/dark_void.bin.lz"); const u32 gBattleAnimBgImage_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_activate.4bpp.lz"); const u32 gBattleAnimBgPalette_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_activate.gbapal.lz"); From 7e6e23005be4bbfbffda03be99c5db0c64ae892d Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 3 Nov 2021 13:59:26 -0400 Subject: [PATCH 176/193] fix clear body --- src/battle_script_commands.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2ee80557f..500b7cab0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2586,7 +2586,7 @@ void SetMoveEffect(bool32 primary, u32 certain) s32 i, byTwo, affectsUser = 0; bool32 statusChanged = FALSE; bool32 mirrorArmorReflected = (GetBattlerAbility(gBattlerTarget) == ABILITY_MIRROR_ARMOR); - u32 flags; + u32 flags = 0; switch (gBattleScripting.moveEffect) // Set move effects which happen later on { @@ -3017,7 +3017,7 @@ void SetMoveEffect(bool32 primary, u32 certain) case MOVE_EFFECT_SP_DEF_MINUS_1: case MOVE_EFFECT_ACC_MINUS_1: case MOVE_EFFECT_EVS_MINUS_1: - flags = affectsUser | certain; + flags = affectsUser; if (mirrorArmorReflected && !affectsUser) flags |= STAT_BUFF_ALLOW_PTR; @@ -3064,7 +3064,7 @@ void SetMoveEffect(bool32 primary, u32 certain) case MOVE_EFFECT_SP_DEF_MINUS_2: case MOVE_EFFECT_ACC_MINUS_2: case MOVE_EFFECT_EVS_MINUS_2: - flags = affectsUser | certain; + flags = affectsUser; if (mirrorArmorReflected && !affectsUser) flags |= STAT_BUFF_ALLOW_PTR; if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE, @@ -9567,7 +9567,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr bool32 certain = FALSE; bool32 notProtectAffected = FALSE; u32 index; - bool32 affectsUser = flags & MOVE_EFFECT_AFFECTS_USER; + bool32 affectsUser = (flags & MOVE_EFFECT_AFFECTS_USER); if (affectsUser) gActiveBattler = gBattlerAttacker; From 48c29a9cd823ea7d9b000c493ef52e925c467aba Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 3 Nov 2021 15:05:52 -0400 Subject: [PATCH 177/193] proper mirror armor sticky web targeting --- asm/macros/battle_script.inc | 4 ++-- data/battle_scripts_1.s | 5 +++-- include/battle.h | 1 + include/constants/battle_script_commands.h | 2 +- src/battle_main.c | 8 ++++++++ src/battle_script_commands.c | 24 +++++++--------------- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 6b2c248db..328780f53 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1839,8 +1839,8 @@ various BS_ATTACKER, VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER .endm - .macro getrandommirrorarmortarget - various BS_TARGET, VARIOUS_GET_RANDOM_MIRROR_ARMOR_TARGET + .macro setattackertostickywebuser + various BS_TARGET, VARIOUS_SET_ATTACKER_STICKY_WEB_USER .endm .macro getrototillertargets ptr:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index eb80a41d5..36ae4d967 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2910,10 +2910,11 @@ BattleScript_MirrorArmorReflectWontFall: copybyte gBattlerTarget, gBattlerAttacker @ STRINGID_STATSWONTDECREASE uses target goto BattleScript_MirrorArmorReflectPrintString +@ gBattlerTarget is battler with Mirror Armor BattleScript_MirrorArmorReflectStickyWeb: call BattleScript_AbilityPopUp - getrandommirrorarmortarget - jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_AbilityNoSpecificStatLossPrint + setattackertostickywebuser + jumpifbyteequal gBattlerAttacker, gBattlerTarget, BattleScript_StickyWebOnSwitchInEnd @ Sticky web user not on field -> no stat loss goto BattleScript_MirrorArmorReflectStatLoss BattleScript_StatDown:: diff --git a/include/battle.h b/include/battle.h index 5e5aa2479..770d826a5 100644 --- a/include/battle.h +++ b/include/battle.h @@ -612,6 +612,7 @@ struct BattleStruct struct StolenItem itemStolen[PARTY_SIZE]; // Player's team that had items stolen (two bytes per party member) u8 blunderPolicy:1; // should blunder policy activate u8 ballSpriteIds[2]; // item gfx, window gfx + u8 stickyWebUser; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 5034c4f56..3b4495208 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -197,7 +197,7 @@ #define VARIOUS_UPDATE_ABILITY_POPUP 124 #define VARIOUS_JUMP_IF_WEATHER_AFFECTED 125 #define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 126 -#define VARIOUS_GET_RANDOM_MIRROR_ARMOR_TARGET 127 +#define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 127 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_main.c b/src/battle_main.c index ad02854bd..f1adb1bfb 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2933,6 +2933,8 @@ static void BattleStartClearSetData(void) gBattleStruct->mega.triggerSpriteId = 0xFF; + gBattleStruct->stickyWebUser = 0xFF; + for (i = 0; i < PARTY_SIZE; i++) { gBattleStruct->usedHeldItems[i][0] = 0; @@ -3030,6 +3032,9 @@ void SwitchInClearSetData(void) gBattleStruct->lastTakenMoveFrom[gActiveBattler][3] = 0; gBattleStruct->lastMoveFailed &= ~(gBitTable[gActiveBattler]); gBattleStruct->palaceFlags &= ~(gBitTable[gActiveBattler]); + + if (gActiveBattler == gBattleStruct->stickyWebUser) + gBattleStruct->stickyWebUser = 0xFF; // Switched into sticky web user slot so reset it for (i = 0; i < gBattlersCount; i++) { @@ -3127,6 +3132,9 @@ void FaintClearSetData(void) gBattleStruct->lastTakenMoveFrom[gActiveBattler][3] = 0; gBattleStruct->palaceFlags &= ~(gBitTable[gActiveBattler]); + + if (gActiveBattler == gBattleStruct->stickyWebUser) + gBattleStruct->stickyWebUser = 0xFF; // User of sticky web fainted, so reset the stored battler ID for (i = 0; i < gBattlersCount; i++) { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 500b7cab0..3d5786b35 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9015,24 +9015,13 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; } return; - case VARIOUS_GET_RANDOM_MIRROR_ARMOR_TARGET: - i = BATTLE_OPPOSITE(gActiveBattler); - gBattlerAttacker = gBattlerTarget; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - if (IsBattlerAlive(i) - && !(gBattleMons[i].status2 & STATUS2_SUBSTITUTE)) - gBattlerAttacker = i; - else if (IsBattlerAlive(BATTLE_PARTNER(i)) - && !(gBattleMons[BATTLE_PARTNER(i)].status2 & STATUS2_SUBSTITUTE)) - gBattlerAttacker = BATTLE_PARTNER(i); - } - else - { - if (IsBattlerAlive(i) && !(gBattleMons[i].status2 & STATUS2_SUBSTITUTE)) - gBattlerAttacker = i; - } + case VARIOUS_SET_ATTACKER_STICKY_WEB_USER: + // For Mirror Armor: "If the Pokémon with this Ability is affected by Sticky Web, the effect is reflected back to the Pokémon which set it up. + // If Pokémon which set up Sticky Web is not on the field, no Pokémon have their Speed lowered." + gBattlerAttacker = gBattlerTarget; // Initialize 'fail' condition SET_STATCHANGER(STAT_SPEED, 1, TRUE); + if (gBattleStruct->stickyWebUser != 0xFF) + gBattlerAttacker = gBattleStruct->stickyWebUser; break; } @@ -11590,6 +11579,7 @@ static void Cmd_setstickyweb(void) { gSideStatuses[targetSide] |= SIDE_STATUS_STICKY_WEB; gSideTimers[targetSide].stickyWebAmount = 1; + gBattleStruct->stickyWebUser = gBattlerAttacker; // For Mirror Armor gBattlescriptCurrInstr += 5; } } From f0d7c75ec899bf3962794eb19f2be9b1f8099222 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 3 Nov 2021 17:48:04 -0300 Subject: [PATCH 178/193] Syntax corrections --- data/battle_scripts_1.s | 2 +- src/battle_util.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 8c3e744c1..aa6c10bcb 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1925,7 +1925,7 @@ BattleScript_MimicryLoop_NextBattler: addbyte gBattlerTarget, 0x1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_MimicryLoopIter restoretarget - end + goto BattleScript_MoveEnd BattleScript_EffectTopsyTurvy: attackcanceler diff --git a/src/battle_util.c b/src/battle_util.c index 00e323d20..45cba507b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2319,8 +2319,10 @@ u8 DoFieldEndTurnEffects(void) { gFieldStatuses &= ~(STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_TERRAIN_PERMANENT); for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { if (GetBattlerAbility(i) == ABILITY_MIMICRY) RestoreBattlerOriginalTypes(i); + } BattleScriptExecute(BattleScript_ElectricTerrainEnds); effect++; } @@ -2332,8 +2334,10 @@ u8 DoFieldEndTurnEffects(void) { gFieldStatuses &= ~(STATUS_FIELD_MISTY_TERRAIN); for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { if (GetBattlerAbility(i) == ABILITY_MIMICRY) RestoreBattlerOriginalTypes(i); + } BattleScriptExecute(BattleScript_MistyTerrainEnds); effect++; } @@ -2347,8 +2351,10 @@ u8 DoFieldEndTurnEffects(void) { gFieldStatuses &= ~(STATUS_FIELD_GRASSY_TERRAIN); for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { if (GetBattlerAbility(i) == ABILITY_MIMICRY) RestoreBattlerOriginalTypes(i); + } } BattleScriptExecute(BattleScript_GrassyTerrainHeals); effect++; @@ -2361,8 +2367,10 @@ u8 DoFieldEndTurnEffects(void) { gFieldStatuses &= ~(STATUS_FIELD_PSYCHIC_TERRAIN); for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { if (GetBattlerAbility(i) == ABILITY_MIMICRY) RestoreBattlerOriginalTypes(i); + } BattleScriptExecute(BattleScript_PsychicTerrainEnds); effect++; } From 5a855db4ad97a8bebfd3c1eb7135162c2c1c3997 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Thu, 4 Nov 2021 11:08:37 +1300 Subject: [PATCH 179/193] Fix prototype of CanBePoisoned --- include/battle_util.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/battle_util.h b/include/battle_util.h index 86fe789f0..d0a9d8f87 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -168,7 +168,7 @@ bool32 IsEntrainmentBannedAbilityAttacker(u16 ability); bool32 IsEntrainmentTargetOrSimpleBeamBannedAbility(u16 ability); bool32 CanSleep(u8 battlerId); -bool32 CanBePoisoned(u8 gBattlerAttacker, u8 battlerTarget); +bool32 CanBePoisoned(u8 battlerAttacker, u8 battlerTarget); bool32 CanBeBurned(u8 battlerId); bool32 CanBeParalyzed(u8 battlerId); bool32 CanBeFrozen(u8 battlerId); From 05850f0f65cbdbbbd0ee466aeceff512bc25cae2 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Wed, 3 Nov 2021 22:05:02 -0300 Subject: [PATCH 180/193] Refactored UndoFormChange to make it more user friendly --- src/battle_util.c | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 196ce0268..f32c9875b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8954,33 +8954,29 @@ void UndoFormChange(u32 monId, u32 side, bool32 isSwitchingOut) { u32 i, currSpecies; struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; - static const u16 species[][2] = // changed form id, default form id + static const u16 species[][3] = { - {SPECIES_MIMIKYU_BUSTED, SPECIES_MIMIKYU}, - {SPECIES_GRENINJA_ASH, SPECIES_GRENINJA_BATTLE_BOND}, - {SPECIES_AEGISLASH_BLADE, SPECIES_AEGISLASH}, - {SPECIES_DARMANITAN_ZEN_MODE, SPECIES_DARMANITAN}, - {SPECIES_MINIOR, SPECIES_MINIOR_CORE_RED}, - {SPECIES_MINIOR_METEOR_BLUE, SPECIES_MINIOR_CORE_BLUE}, - {SPECIES_MINIOR_METEOR_GREEN, SPECIES_MINIOR_CORE_GREEN}, - {SPECIES_MINIOR_METEOR_INDIGO, SPECIES_MINIOR_CORE_INDIGO}, - {SPECIES_MINIOR_METEOR_ORANGE, SPECIES_MINIOR_CORE_ORANGE}, - {SPECIES_MINIOR_METEOR_VIOLET, SPECIES_MINIOR_CORE_VIOLET}, - {SPECIES_MINIOR_METEOR_YELLOW, SPECIES_MINIOR_CORE_YELLOW}, - {SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI}, - {SPECIES_CRAMORANT_GORGING, SPECIES_CRAMORANT}, - {SPECIES_CRAMORANT_GULPING, SPECIES_CRAMORANT}, + // Changed Form ID Default Form ID Should change on switch + {SPECIES_MIMIKYU_BUSTED, SPECIES_MIMIKYU, FALSE}, + {SPECIES_GRENINJA_ASH, SPECIES_GRENINJA_BATTLE_BOND, FALSE}, + {SPECIES_AEGISLASH_BLADE, SPECIES_AEGISLASH, TRUE}, + {SPECIES_DARMANITAN_ZEN_MODE, SPECIES_DARMANITAN, TRUE}, + {SPECIES_MINIOR, SPECIES_MINIOR_CORE_RED, TRUE}, + {SPECIES_MINIOR_METEOR_BLUE, SPECIES_MINIOR_CORE_BLUE, TRUE}, + {SPECIES_MINIOR_METEOR_GREEN, SPECIES_MINIOR_CORE_GREEN, TRUE}, + {SPECIES_MINIOR_METEOR_INDIGO, SPECIES_MINIOR_CORE_INDIGO, TRUE}, + {SPECIES_MINIOR_METEOR_ORANGE, SPECIES_MINIOR_CORE_ORANGE, TRUE}, + {SPECIES_MINIOR_METEOR_VIOLET, SPECIES_MINIOR_CORE_VIOLET, TRUE}, + {SPECIES_MINIOR_METEOR_YELLOW, SPECIES_MINIOR_CORE_YELLOW, TRUE}, + {SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI, TRUE}, + {SPECIES_CRAMORANT_GORGING, SPECIES_CRAMORANT, TRUE}, + {SPECIES_CRAMORANT_GULPING, SPECIES_CRAMORANT, TRUE}, }; - if (isSwitchingOut) // Don't revert Mimikyu Busted or Ash-Greninja when switching out - i = 2; - else - i = 0; - currSpecies = GetMonData(&party[monId], MON_DATA_SPECIES, NULL); - for (; i < ARRAY_COUNT(species); i++) + for (i = 0; i < ARRAY_COUNT(species); i++) { - if (currSpecies == species[i][0]) + if (currSpecies == species[i][0] && (!isSwitchingOut || species[i][2] == TRUE)) { SetMonData(&party[monId], MON_DATA_SPECIES, &species[i][1]); CalculateMonStats(&party[monId]); From 4466fbd930af4a7b32521936ca40220aaeb1dccc Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 3 Nov 2021 21:36:33 -0400 Subject: [PATCH 181/193] ai version of CanPoisonType, CanBePoisoned and IsAbilityOnSide --- include/battle_ai_util.h | 2 +- src/battle_ai_main.c | 2 +- src/battle_ai_util.c | 40 +++++++++++++++++++++++++++++++--------- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index b8cd53c07..304a8149d 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -54,6 +54,7 @@ bool32 IsRecycleEncouragedItem(u16 item); bool32 CanKnockOffItem(u8 battler, u16 item); bool32 IsAbilityOfRating(u16 ability, s8 rating); s8 GetAbilityRating(u16 ability); +u32 AI_IsAbilityOnSide(u32 battlerId, u32 ability); // stat stage checks bool32 AnyStatIsRaised(u8 battlerId); @@ -120,7 +121,6 @@ bool32 IsSemiInvulnerable(u8 battlerDef, u16 move); // status checks bool32 AI_CanBeBurned(u8 battler, u16 ability); -bool32 AI_CanBePoisoned(u8 battler, u16 ability); bool32 AI_CanBeConfused(u8 battler, u16 ability); bool32 AI_CanSleep(u8 battler, u16 ability); bool32 IsBattlerIncapacitated(u8 battler, u16 ability); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 84fa7b634..526336947 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3999,7 +3999,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) score += 2; break; case HOLD_EFFECT_TOXIC_ORB: - if (!ShouldPoisonSelf(battlerAtk, AI_DATA->atkAbility) && AI_CanBePoisoned(battlerDef, AI_DATA->defAbility)) + if (!ShouldPoisonSelf(battlerAtk, AI_DATA->atkAbility)) score += 2; break; case HOLD_EFFECT_FLAME_ORB: diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 9640df2b4..bf10666f6 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1065,6 +1065,16 @@ bool32 CanTargetFaintAiWithMod(u8 battlerDef, u8 battlerAtk, s32 hpMod, s32 dmgM return FALSE; } +u32 AI_IsAbilityOnSide(u32 battlerId, u32 ability) +{ + if (IsBattlerAlive(battlerId) && AI_GetAbility(battlerId) == ability) + return battlerId + 1; + else if (IsBattlerAlive(BATTLE_PARTNER(battlerId)) && AI_GetAbility(BATTLE_PARTNER(battlerId)) == ability) + return BATTLE_PARTNER(battlerId) + 1; + else + return 0; +} + // does NOT include ability suppression checks s32 AI_GetAbility(u32 battlerId) { @@ -2613,20 +2623,32 @@ bool32 AI_CanPutToSleep(u8 battlerAtk, u8 battlerDef, u16 defAbility, u16 move, return TRUE; } -bool32 AI_CanBePoisoned(u8 battler, u16 ability) +static bool32 AI_CanPoisonType(u8 battlerAttacker, u8 battlerTarget) { - if (ability == ABILITY_IMMUNITY - || IsAbilityOnSide(battler, ABILITY_PASTEL_VEIL) - || gBattleMons[battler].status1 & STATUS1_ANY - || IsAbilityStatusProtected(battler) - || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) + return ((AI_GetAbility(battlerAttacker) == ABILITY_CORROSION && gBattleMoves[gCurrentMove].split == SPLIT_STATUS) + || !(IS_BATTLER_OF_TYPE(battlerTarget, TYPE_POISON) || IS_BATTLER_OF_TYPE(battlerTarget, TYPE_STEEL))); +} + +static bool32 AI_CanBePoisoned(u8 battlerAtk, u8 battlerDef) +{ + u16 ability = AI_GetAbility(battlerDef); + + if (!(AI_CanPoisonType(battlerAtk, battlerDef)) + || gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD + || gBattleMons[battlerDef].status1 & STATUS1_ANY + || ability == ABILITY_IMMUNITY + || ability == ABILITY_COMATOSE + || AI_IsAbilityOnSide(battlerDef, ABILITY_PASTEL_VEIL) + || gBattleMons[battlerDef].status1 & STATUS1_ANY + || IsAbilityStatusProtected(battlerDef) + || AI_IsTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; } bool32 ShouldPoisonSelf(u8 battler, u16 ability) { - if (AI_CanBePoisoned(battler, ability) && ( + if (AI_CanBePoisoned(battler, battler) && ( ability == ABILITY_MARVEL_SCALE || ability == ABILITY_POISON_HEAL || ability == ABILITY_QUICK_FEET @@ -2641,7 +2663,7 @@ bool32 ShouldPoisonSelf(u8 battler, u16 ability) bool32 AI_CanPoison(u8 battlerAtk, u8 battlerDef, u16 defAbility, u16 move, u16 partnerMove) { - if (!AI_CanBePoisoned(battlerDef, defAbility) + if (!AI_CanBePoisoned(battlerAtk, battlerDef) || AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0 || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || PartnerMoveEffectIsStatusSameTarget(BATTLE_PARTNER(battlerAtk), battlerDef, partnerMove)) @@ -2744,7 +2766,7 @@ bool32 AI_CanBeInfatuated(u8 battlerAtk, u8 battlerDef, u16 defAbility, u8 atkGe || atkGender == defGender || atkGender == MON_GENDERLESS || defGender == MON_GENDERLESS - || IsAbilityOnSide(battlerDef, ABILITY_AROMA_VEIL)) + || AI_IsAbilityOnSide(battlerDef, ABILITY_AROMA_VEIL)) return FALSE; return TRUE; } From 012877bdc157d2ad04afcb9b47e03ae7eafd9434 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 3 Nov 2021 21:49:46 -0400 Subject: [PATCH 182/193] fix ai's def magic guard check --- src/battle_ai_main.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 84fa7b634..767ef4e35 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -578,6 +578,21 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) { switch (AI_DATA->defAbility) { + case ABILITY_MAGIC_GUARD: + switch (moveEffect) + { + case EFFECT_POISON: + case EFFECT_WILL_O_WISP: + case EFFECT_TOXIC: + case EFFECT_LEECH_SEED: + score -= 5; + break; + case EFFECT_CURSE: + if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST)) + score -= 5; + break; + } + break; case ABILITY_VOLT_ABSORB: case ABILITY_MOTOR_DRIVE: case ABILITY_LIGHTNING_ROD: @@ -2949,7 +2964,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) } } - // ability checks + // attacker ability checks switch (AI_DATA->atkAbility) { case ABILITY_MOXIE: @@ -2960,21 +2975,6 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) score += 8; // prioritize killing target for stat boost } break; - case ABILITY_MAGIC_GUARD: - switch (moveEffect) - { - case EFFECT_POISON: - case EFFECT_WILL_O_WISP: - case EFFECT_TOXIC: - case EFFECT_LEECH_SEED: - score -= 5; - break; - case EFFECT_CURSE: - if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST)) - score -= 5; - break; - } - break; } // ability checks // move effect checks From 060ae35c7cc1c638e09b2a3ae4391fd309264080 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 3 Nov 2021 21:53:28 -0400 Subject: [PATCH 183/193] fix curse magic guard check --- src/battle_ai_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 767ef4e35..857908ef7 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -588,7 +588,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) score -= 5; break; case EFFECT_CURSE: - if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST)) + if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GHOST)) // Don't use Curse if you're a ghost type vs a Magic Guard user, they'll take no damage. score -= 5; break; } From b931e341728e4b4e70c24f4a33d9d1ab4b7c07f8 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 3 Nov 2021 21:04:34 -0300 Subject: [PATCH 184/193] Handled Mimicry's interaction with Steel Roller's effect --- asm/macros/battle_script.inc | 4 ++++ data/battle_scripts_1.s | 1 + include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 7 +++++++ 4 files changed, 13 insertions(+) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index b7a60dbbb..1625fe41c 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1883,6 +1883,10 @@ .4byte \ptr .endm + .macro trytorevertmimicry + various BS_ATTACKER, VARIOUS_TRY_TO_REVERT_MIMICRY + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index ac2d9a1a6..88d89ec3f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -660,6 +660,7 @@ BattleScript_EffectRemoveTerrain: resultmessage waitmessage B_WAIT_TIME_LONG removeterrain + trytorevertmimicry jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 4, BattleScript_MoveEnd printfromtable gTerrainEndingStringIds waitmessage B_WAIT_TIME_LONG diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 50db28028..3d7dfbc2b 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -199,6 +199,7 @@ #define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 126 #define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 127 #define VARIOUS_TRY_TO_APPLY_MIMICRY 128 +#define VARIOUS_TRY_TO_REVERT_MIMICRY 129 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 3bfa227bc..74d52dbb6 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9039,6 +9039,13 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; return; } + case VARIOUS_TRY_TO_REVERT_MIMICRY: + for (i = 0; i < gBattlersCount; i++) + { + if (GetBattlerAbility(i) == ABILITY_MIMICRY) + RestoreBattlerOriginalTypes(i); + } + break; } gBattlescriptCurrInstr += 3; From e930dae278e8b3d2385956f353ca9b93d40bc4bb Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Thu, 4 Nov 2021 15:40:26 +1300 Subject: [PATCH 185/193] Remove ability pop up for Hunger Switch Morpeko should change form each turn without showing its ability. --- data/battle_scripts_1.s | 5 +++++ include/battle_scripts.h | 1 + src/battle_util.c | 4 ++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a81d17f84..af4e96992 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6980,6 +6980,7 @@ BattleScript_AttackerFormChange:: call BattleScript_AbilityPopUp printstring STRINGID_EMPTYSTRING3 waitmessage 1 +BattleScript_AttackerFormChangeNoPopup:: handleformchange BS_ATTACKER, 0 handleformchange BS_ATTACKER, 1 playanimation BS_ATTACKER, B_ANIM_FORM_CHANGE, NULL @@ -6991,6 +6992,10 @@ BattleScript_AttackerFormChangeEnd3:: call BattleScript_AttackerFormChange end3 +BattleScript_AttackerFormChangeEnd3NoPopup:: + call BattleScript_AttackerFormChangeNoPopup + end3 + BattleScript_BallFetch:: call BattleScript_AbilityPopUp printstring STRINGID_FETCHEDPOKEBALL diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 12212ff94..035087fad 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -407,5 +407,6 @@ extern const u8 BattleScript_WanderingSpiritActivates[]; extern const u8 BattleScript_MirrorArmorReflect[]; extern const u8 BattleScript_GooeyActivates[]; extern const u8 BattleScript_PastelVeilActivates[]; +extern const u8 BattleScript_AttackerFormChangeEnd3NoPopup[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/src/battle_util.c b/src/battle_util.c index b17c82755..a1e39f329 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4578,12 +4578,12 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (gBattleMons[battler].species == SPECIES_MORPEKO) { gBattleMons[battler].species = SPECIES_MORPEKO_HANGRY; - BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3); + BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3NoPopup); } else if (gBattleMons[battler].species == SPECIES_MORPEKO_HANGRY) { gBattleMons[battler].species = SPECIES_MORPEKO; - BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3); + BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3NoPopup); } effect++; } From a2574b55cc231b4fa6b44878f0d699e17fecd5c3 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Thu, 4 Nov 2021 16:09:28 +1300 Subject: [PATCH 186/193] Fix dynamic move damage calculation Can't check effectiveness here without breaking the AI. After testing, it also appears that it doesn't need to be checked here after all. --- src/battle_ai_util.c | 80 +++++++------------------------------------- 1 file changed, 12 insertions(+), 68 deletions(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index ab7cc6b53..884e0fa37 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -738,95 +738,39 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) { case EFFECT_LEVEL_DAMAGE: case EFFECT_PSYWAVE: - { - // Psywave's expected damage is equal to the user's level - if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) - dmg = 0; - else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) - dmg = 2 * gBattleMons[battlerAtk].level; - else - dmg = gBattleMons[battlerAtk].level; + dmg = gBattleMons[battlerAtk].level * (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND ? 2 : 1); break; - } case EFFECT_DRAGON_RAGE: - { - if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) - dmg = 0; - else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) - dmg = 80; - else - dmg = 40; + dmg = 40 * (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND ? 2 : 1); break; - } case EFFECT_SONICBOOM: - { - if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) - dmg = 0; - else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) - dmg = 40; - else - dmg = 20; + dmg = 20 * (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND ? 2 : 1); break; - } case EFFECT_MULTI_HIT: - { - if (AI_DATA->atkAbility == ABILITY_SKILL_LINK) - dmg *= 5; - else - dmg *= 3; // Average number of hits is three + dmg *= (AI_DATA->atkAbility == ABILITY_SKILL_LINK ? 5 : 3); break; - } case EFFECT_TRIPLE_KICK: - { - dmg *= 6; + dmg *= (AI_DATA->atkAbility == ABILITY_SKILL_LINK ? 6 : 5); break; - } case EFFECT_ENDEAVOR: - { - if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) - dmg = 0; - else - // If target has less HP than user, Endeavor does no damage - dmg = max(0, gBattleMons[battlerDef].hp - gBattleMons[battlerAtk].hp); + // If target has less HP than user, Endeavor does no damage + dmg = max(0, gBattleMons[battlerDef].hp - gBattleMons[battlerAtk].hp); break; - } case EFFECT_SUPER_FANG: - { - if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) - dmg = 0; - // Two hits of Super Fang halves HP twice, leaving target with 25% HP - else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) - dmg = max(2, gBattleMons[battlerDef].hp * 3 / 4); - else - dmg = max(1, gBattleMons[battlerDef].hp / 2); + dmg = (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND + ? max(2, gBattleMons[battlerDef].hp * 3 / 4) + : max(1, gBattleMons[battlerDef].hp / 2)); break; - } case EFFECT_FINAL_GAMBIT: - { - if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) - dmg = 0; - else - dmg = gBattleMons[battlerAtk].hp; - break; - } - //case EFFECT_METAL_BURST: - //case EFFECT_COUNTER: - default: - //do not add the random factor, it's an average case analysis - //dmg *= (100 - (Random() % 10)) / 100; // add random factor + dmg = gBattleMons[battlerAtk].hp; break; } // Handle other multi-strike moves if (IsTwoStrikesMove(move)) - { dmg *= 2; - } - else if (move == MOVE_SURGING_STRIKES - || (move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH)) - { + else if (move == MOVE_SURGING_STRIKES || (move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH)) dmg *= 3; - } RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); From 7d1009768440b5c28a641f1700a45837af3d871c Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Thu, 4 Nov 2021 17:11:56 +1300 Subject: [PATCH 187/193] Replace IsTwoStrikesMove with FLAG_TWO_STRIKES Note that this flag does nothing until the Parental Bond PR is merged - it's just for the AI until then. --- include/battle_util.h | 3 --- include/constants/pokemon.h | 1 + src/battle_ai_util.c | 2 +- src/battle_util.c | 26 -------------------------- src/data/battle_moves.h | 20 ++++++++++---------- 5 files changed, 12 insertions(+), 40 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index ac27461bd..aa2a3d838 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -175,7 +175,4 @@ bool32 CanBeFrozen(u8 battlerId); bool32 CanBeConfused(u8 battlerId); bool32 IsBattlerTerrainAffected(u8 battlerId, u32 terrainFlag); -// Move checks -bool8 IsTwoStrikesMove(u16 move); - #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 4e776e592..959148e6c 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -308,6 +308,7 @@ #define FLAG_DMG_UNGROUNDED_IGNORE_TYPE_IF_FLYING (1 << 24) // Makes a Ground type move do 1x damage to flying and levitating targets #define FLAG_THAW_USER (1 << 25) #define FLAG_HIT_IN_SUBSTITUTE (1 << 26) // Hyperspace Fury +#define FLAG_TWO_STRIKES (1 << 27) // A move with this flag will strike twice, and may apply its effect on each hit // Split defines. #define SPLIT_PHYSICAL 0x0 diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 884e0fa37..4fd01418c 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -767,7 +767,7 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) } // Handle other multi-strike moves - if (IsTwoStrikesMove(move)) + if (gBattleMoves[move].flags & FLAG_TWO_STRIKES) dmg *= 2; else if (move == MOVE_SURGING_STRIKES || (move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH)) dmg *= 3; diff --git a/src/battle_util.c b/src/battle_util.c index 82d6ddcbd..05c7af122 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -217,20 +217,6 @@ static const u16 sEntrainmentTargetSimpleBeamBannedAbilities[] = ABILITY_GULP_MISSILE, }; -static const u16 sTwoStrikeMoves[] = -{ - MOVE_BONEMERANG, - MOVE_DOUBLE_HIT, - MOVE_DOUBLE_IRON_BASH, - MOVE_DOUBLE_KICK, - MOVE_DRAGON_DARTS, - MOVE_DUAL_CHOP, - MOVE_DUAL_WINGBEAT, - MOVE_GEAR_GRIND, - MOVE_TWINEEDLE, - 0xFFFF -}; - bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move) { u32 ability = GetBattlerAbility(battlerAtk); @@ -9620,15 +9606,3 @@ bool32 IsBattlerWeatherAffected(u8 battlerId, u32 weatherFlags) } return FALSE; } - -bool8 IsTwoStrikesMove(u16 move) -{ - u32 i; - - for (i = 0; i < ARRAY_COUNT(sTwoStrikeMoves); i++) - { - if (move == sTwoStrikeMoves[i]) - return TRUE; - } - return FALSE; -} diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 97d61202a..f4ace3915 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -378,7 +378,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -649,7 +649,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -2460,7 +2460,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -7267,7 +7267,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -8367,7 +8367,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -8575,7 +8575,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -10726,9 +10726,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_DOUBLE_IRON_BASH] = { #if B_UPDATED_MOVE_DATA >= GEN_8 - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST | FLAG_TWO_STRIKES, #else - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_DMG_MINIMIZE | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_DMG_MINIMIZE | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST | FLAG_TWO_STRIKES, #endif .effect = EFFECT_DOUBLE_IRON_BASH, .power = 60, @@ -10850,7 +10850,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -11480,7 +11480,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, From 2728f13eedce96ae3bd3c9cc18e2e14055749565 Mon Sep 17 00:00:00 2001 From: Jaizu Date: Thu, 4 Nov 2021 09:58:55 +0100 Subject: [PATCH 188/193] Fix comment typo --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ee9379d8d..d76dd8283 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12817,7 +12817,7 @@ static void Cmd_handleballthrow(void) gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = 0; if (CriticalCapture(odds)) { - maxShakes = 1; //critical capture doesn't gauarantee capture + maxShakes = 1; //critical capture doesn't guarantee capture gBattleSpritesDataPtr->animationData->isCriticalCapture = 1; } else From 6b10801ee8f511d5cd3ed413c8016274798c94c9 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 4 Nov 2021 10:43:33 -0400 Subject: [PATCH 189/193] convert AI_IsabilityOnSide to bool --- include/battle_ai_util.h | 2 +- src/battle_ai_util.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 304a8149d..b6df2168e 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -54,7 +54,7 @@ bool32 IsRecycleEncouragedItem(u16 item); bool32 CanKnockOffItem(u8 battler, u16 item); bool32 IsAbilityOfRating(u16 ability, s8 rating); s8 GetAbilityRating(u16 ability); -u32 AI_IsAbilityOnSide(u32 battlerId, u32 ability); +bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability); // stat stage checks bool32 AnyStatIsRaised(u8 battlerId); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index bf10666f6..a08034979 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1065,14 +1065,14 @@ bool32 CanTargetFaintAiWithMod(u8 battlerDef, u8 battlerAtk, s32 hpMod, s32 dmgM return FALSE; } -u32 AI_IsAbilityOnSide(u32 battlerId, u32 ability) +bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability) { if (IsBattlerAlive(battlerId) && AI_GetAbility(battlerId) == ability) - return battlerId + 1; + return TRUE; else if (IsBattlerAlive(BATTLE_PARTNER(battlerId)) && AI_GetAbility(BATTLE_PARTNER(battlerId)) == ability) - return BATTLE_PARTNER(battlerId) + 1; + return TRUE; else - return 0; + return FALSE; } // does NOT include ability suppression checks From 4f251e6ec2b8cd4cb9339dec7a825e7c5d5f9100 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 4 Nov 2021 12:13:55 -0300 Subject: [PATCH 190/193] Moved VARIOUS_TRY_TO_REVERT_MIMICRY to VARIOUS_REMOVE_TERRAIN --- asm/macros/battle_script.inc | 4 ---- data/battle_scripts_1.s | 1 - include/constants/battle_script_commands.h | 1 - src/battle_script_commands.c | 12 +++++------- 4 files changed, 5 insertions(+), 13 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 1625fe41c..b7a60dbbb 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1883,10 +1883,6 @@ .4byte \ptr .endm - .macro trytorevertmimicry - various BS_ATTACKER, VARIOUS_TRY_TO_REVERT_MIMICRY - .endm - @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 88d89ec3f..ac2d9a1a6 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -660,7 +660,6 @@ BattleScript_EffectRemoveTerrain: resultmessage waitmessage B_WAIT_TIME_LONG removeterrain - trytorevertmimicry jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 4, BattleScript_MoveEnd printfromtable gTerrainEndingStringIds waitmessage B_WAIT_TIME_LONG diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 3d7dfbc2b..50db28028 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -199,7 +199,6 @@ #define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 126 #define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 127 #define VARIOUS_TRY_TO_APPLY_MIMICRY 128 -#define VARIOUS_TRY_TO_REVERT_MIMICRY 129 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 74d52dbb6..d615e0b35 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8865,6 +8865,11 @@ static void Cmd_various(void) break; } gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; // remove the terrain + for (i = 0; i < gBattlersCount; i++) // restore the types of Pokémon with Mimicry + { + if (GetBattlerAbility(i) == ABILITY_MIMICRY) + RestoreBattlerOriginalTypes(i); + } break; case VARIOUS_JUMP_IF_PRANKSTER_BLOCKED: if (BlocksPrankster(gCurrentMove, gBattlerAttacker, gActiveBattler, TRUE)) @@ -9039,13 +9044,6 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; return; } - case VARIOUS_TRY_TO_REVERT_MIMICRY: - for (i = 0; i < gBattlersCount; i++) - { - if (GetBattlerAbility(i) == ABILITY_MIMICRY) - RestoreBattlerOriginalTypes(i); - } - break; } gBattlescriptCurrInstr += 3; From b64d506809c2b84e9a6ae1e91b9d081b5b37b71e Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 4 Nov 2021 12:20:31 -0300 Subject: [PATCH 191/193] Made a function to lift Mimicry's effect --- include/battle_util.h | 1 + src/battle_script_commands.c | 6 +----- src/battle_util.c | 35 +++++++++++++++-------------------- 3 files changed, 17 insertions(+), 25 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index 62a7e1db6..cb196519e 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -158,6 +158,7 @@ bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef, bool32 chec u16 GetUsedHeldItem(u8 battler); bool32 IsBattlerWeatherAffected(u8 battlerId, u32 weatherFlags); void TryToApplyMimicry(u8 battlerId, bool8 various); +void TryToRevertMimicry(void); void RestoreBattlerOriginalTypes(u8 battlerId); // ability checks diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d615e0b35..d056bfa5a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8865,11 +8865,7 @@ static void Cmd_various(void) break; } gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; // remove the terrain - for (i = 0; i < gBattlersCount; i++) // restore the types of Pokémon with Mimicry - { - if (GetBattlerAbility(i) == ABILITY_MIMICRY) - RestoreBattlerOriginalTypes(i); - } + TryToRevertMimicry(); // restore the types of Pokémon with Mimicry break; case VARIOUS_JUMP_IF_PRANKSTER_BLOCKED: if (BlocksPrankster(gCurrentMove, gBattlerAttacker, gActiveBattler, TRUE)) diff --git a/src/battle_util.c b/src/battle_util.c index a924722eb..b3cf60819 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1934,6 +1934,17 @@ void TryToApplyMimicry(u8 battlerId, bool8 various) } } +void TryToRevertMimicry(void) +{ + s32 i; + + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (GetBattlerAbility(i) == ABILITY_MIMICRY) + RestoreBattlerOriginalTypes(i); + } +} + enum { ENDTURN_ORDER, @@ -2318,11 +2329,7 @@ u8 DoFieldEndTurnEffects(void) && (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.electricTerrainTimer == 0)) { gFieldStatuses &= ~(STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_TERRAIN_PERMANENT); - for (i = 0; i < MAX_BATTLERS_COUNT; i++) - { - if (GetBattlerAbility(i) == ABILITY_MIMICRY) - RestoreBattlerOriginalTypes(i); - } + TryToRevertMimicry(); BattleScriptExecute(BattleScript_ElectricTerrainEnds); effect++; } @@ -2333,11 +2340,7 @@ u8 DoFieldEndTurnEffects(void) && (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.mistyTerrainTimer == 0)) { gFieldStatuses &= ~(STATUS_FIELD_MISTY_TERRAIN); - for (i = 0; i < MAX_BATTLERS_COUNT; i++) - { - if (GetBattlerAbility(i) == ABILITY_MIMICRY) - RestoreBattlerOriginalTypes(i); - } + TryToRevertMimicry(); BattleScriptExecute(BattleScript_MistyTerrainEnds); effect++; } @@ -2350,11 +2353,7 @@ u8 DoFieldEndTurnEffects(void) && (gFieldTimers.grassyTerrainTimer == 0 || --gFieldTimers.grassyTerrainTimer == 0)) { gFieldStatuses &= ~(STATUS_FIELD_GRASSY_TERRAIN); - for (i = 0; i < MAX_BATTLERS_COUNT; i++) - { - if (GetBattlerAbility(i) == ABILITY_MIMICRY) - RestoreBattlerOriginalTypes(i); - } + TryToRevertMimicry(); } BattleScriptExecute(BattleScript_GrassyTerrainHeals); effect++; @@ -2366,11 +2365,7 @@ u8 DoFieldEndTurnEffects(void) && (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.psychicTerrainTimer == 0)) { gFieldStatuses &= ~(STATUS_FIELD_PSYCHIC_TERRAIN); - for (i = 0; i < MAX_BATTLERS_COUNT; i++) - { - if (GetBattlerAbility(i) == ABILITY_MIMICRY) - RestoreBattlerOriginalTypes(i); - } + TryToRevertMimicry(); BattleScriptExecute(BattleScript_PsychicTerrainEnds); effect++; } From bf786c6c9a8069be877aea3b5723d7a46660b7cb Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Fri, 5 Nov 2021 18:22:52 +1300 Subject: [PATCH 192/193] Fix Magma Storm Fix the strings and animation displayed when Magma Storm. Also move gTrappingMoves to battle_script_message.c as it's only sued in this file, and this allows ARRAY_COUNT(sTrappingMoves) to replace the constant in SetMoveEffect. --- data/battle_anim_scripts.s | 27 +++++++++++++++++++++++++++ include/battle_message.h | 1 - include/constants/battle_anim.h | 3 ++- include/constants/battle_string_ids.h | 2 +- src/battle_anim_throw.c | 2 ++ src/battle_message.c | 24 ++++++++++-------------- src/battle_script_commands.c | 9 +++++++-- 7 files changed, 49 insertions(+), 19 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index cfe95371d..4198f6410 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -24037,6 +24037,7 @@ General_TurnTrap: jumpargeq 0, TRAP_ANIM_WHIRLPOOL, Status_Whirlpool jumpargeq 0, TRAP_ANIM_CLAMP, Status_Clamp jumpargeq 0, TRAP_ANIM_SAND_TOMB, Status_SandTomb + jumpargeq 0, TRAP_ANIM_MAGMA_STORM, Status_MagmaStorm jumpargeq 0, TRAP_ANIM_INFESTATION, Status_Infestation goto Status_BindWrap Status_BindWrap: @@ -24063,6 +24064,32 @@ Status_FireSpin: stopsound end +Status_MagmaStorm: + loadspritegfx ANIM_TAG_SMALL_EMBER + fadetobg BG_MAGMA_STORM + waitbgfadeout + createvisualtask AnimTask_MoveSeismicTossBg, 3 + playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET + loopsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET, 5, 8 + createvisualtask AnimTask_SeismicTossBgAccelerateDownAtEnd, 3 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 47, 1 + createvisualtask AnimTask_BlendColorCycle, 2, 6, 4, 2, 2, 0, 12, RGB(22, 9, 7) + call FireSpinEffect + call FireSpinEffect + createvisualtask AnimTask_BlendColorCycle, 2, 6, 4, 2, 2, 0, 12, RGB(22, 9, 7) + call FireSpinEffect + call FireSpinEffect + createvisualtask AnimTask_BlendColorCycle, 2, 6, 4, 2, 2, 0, 12, RGB(22, 9, 7) + call FireSpinEffect + restorebg + waitbgfadeout + setarg 7, 0xFFF + waitbgfadein + stopsound + clearmonbg ANIM_DEF_PARTNER + blendoff + end + Status_Whirlpool: loadspritegfx ANIM_TAG_WATER_ORB monbg ANIM_DEF_PARTNER diff --git a/include/battle_message.h b/include/battle_message.h index e8b362c9e..5c10f9e04 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -310,6 +310,5 @@ extern const u8 gText_BattleTourney[]; extern const u16 gMissStringIds[]; extern const u16 gStatUpStringIds[]; -extern const u16 gTrappingMoves[]; #endif // GUARD_BATTLE_MESSAGE_H diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index c7871bd15..7df75794e 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -565,7 +565,8 @@ #define TRAP_ANIM_WHIRLPOOL 2 #define TRAP_ANIM_CLAMP 3 #define TRAP_ANIM_SAND_TOMB 4 -#define TRAP_ANIM_INFESTATION 5 +#define TRAP_ANIM_MAGMA_STORM 5 +#define TRAP_ANIM_INFESTATION 6 // Weather defines for battle animation scripts. #define ANIM_WEATHER_NONE 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 74105f3bf..8fba7597c 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -410,7 +410,7 @@ #define STRINGID_PKMNTWISTEDDIMENSIONS 406 #define STRINGID_POINTEDSTONESFLOAT 407 #define STRINGID_CLOAKEDINMYSTICALMOONLIGHT 408 -#define STRINGID_TRAPPERBYSWIRLINGMAGMA 409 +#define STRINGID_TRAPPEDBYSWIRLINGMAGMA 409 #define STRINGID_VANISHEDINSTANTLY 410 #define STRINGID_PROTECTEDTEAM 411 #define STRINGID_SHAREDITSGUARD 412 diff --git a/src/battle_anim_throw.c b/src/battle_anim_throw.c index 207d1255d..f325cba07 100755 --- a/src/battle_anim_throw.c +++ b/src/battle_anim_throw.c @@ -2496,6 +2496,8 @@ void AnimTask_GetTrappedMoveAnimId(u8 taskId) gBattleAnimArgs[0] = TRAP_ANIM_CLAMP; else if (gBattleSpritesDataPtr->animationData->animArg == MOVE_SAND_TOMB) gBattleAnimArgs[0] = TRAP_ANIM_SAND_TOMB; + else if (gBattleSpritesDataPtr->animationData->animArg == MOVE_MAGMA_STORM) + gBattleAnimArgs[0] = TRAP_ANIM_MAGMA_STORM; else if (gBattleSpritesDataPtr->animationData->animArg == MOVE_INFESTATION) gBattleAnimArgs[0] = TRAP_ANIM_INFESTATION; else diff --git a/src/battle_message.c b/src/battle_message.c index 60b7f5203..f52f6be7e 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -1200,7 +1200,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PKMNTWISTEDDIMENSIONS - 12] = sText_PkmnTwistedDimensions, [STRINGID_POINTEDSTONESFLOAT - 12] = sText_PointedStonesFloat, [STRINGID_CLOAKEDINMYSTICALMOONLIGHT - 12] = sText_CloakedInMysticalMoonlight, - [STRINGID_TRAPPERBYSWIRLINGMAGMA - 12] = sText_TrappedBySwirlingMagma, + [STRINGID_TRAPPEDBYSWIRLINGMAGMA - 12] = sText_TrappedBySwirlingMagma, [STRINGID_VANISHEDINSTANTLY - 12] = sText_VanishedInstantly, [STRINGID_PROTECTEDTEAM - 12] = sText_ProtectedTeam, [STRINGID_SHAREDITSGUARD - 12] = sText_SharedItsGuard, @@ -1535,16 +1535,17 @@ const u16 gFirstTurnOfTwoStringIds[] = [B_MSG_TURN1_FREEZE_SHOCK] = STRINGID_CLOAKEDINAFREEZINGLIGHT, }; -// Index copied from move's index in gTrappingMoves +// Index copied from move's index in sTrappingMoves const u16 gWrappedStringIds[] = { - STRINGID_PKMNSQUEEZEDBYBIND, // MOVE_BIND - STRINGID_PKMNWRAPPEDBY, // MOVE_WRAP - STRINGID_PKMNTRAPPEDINVORTEX, // MOVE_FIRE_SPIN - STRINGID_PKMNCLAMPED, // MOVE_CLAMP - STRINGID_PKMNTRAPPEDINVORTEX, // MOVE_WHIRLPOOL - STRINGID_PKMNTRAPPEDBYSANDTOMB,// MOVE_SAND_TOMB - STRINGID_INFESTATION, // MOVE_INFESTATION + STRINGID_PKMNSQUEEZEDBYBIND, // MOVE_BIND + STRINGID_PKMNWRAPPEDBY, // MOVE_WRAP + STRINGID_PKMNTRAPPEDINVORTEX, // MOVE_FIRE_SPIN + STRINGID_PKMNCLAMPED, // MOVE_CLAMP + STRINGID_PKMNTRAPPEDINVORTEX, // MOVE_WHIRLPOOL + STRINGID_PKMNTRAPPEDBYSANDTOMB, // MOVE_SAND_TOMB + STRINGID_TRAPPEDBYSWIRLINGMAGMA, // MOVE_MAGMA_STORM + STRINGID_INFESTATION, // MOVE_INFESTATION }; const u16 gMistUsedStringIds[] = @@ -1755,11 +1756,6 @@ const u16 gCaughtMonStringIds[] = [B_MSG_LANETTES_BOX_FULL] = STRINGID_PKMNBOXLANETTESPCFULL, }; -const u16 gTrappingMoves[] = -{ - MOVE_BIND, MOVE_WRAP, MOVE_FIRE_SPIN, MOVE_CLAMP, MOVE_WHIRLPOOL, MOVE_SAND_TOMB, MOVE_INFESTATION, 0xFFFF -}; - const u16 gRoomsStringIds[] = { STRINGID_PKMNTWISTEDDIMENSIONS, STRINGID_TRICKROOMENDS, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6f0fec8a7..dd49d0493 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -279,6 +279,11 @@ static const s32 sExperienceScalingFactors[] = 159767, }; +static const u16 sTrappingMoves[] = +{ + MOVE_BIND, MOVE_WRAP, MOVE_FIRE_SPIN, MOVE_CLAMP, MOVE_WHIRLPOOL, MOVE_SAND_TOMB, MOVE_MAGMA_STORM, MOVE_INFESTATION, 0xFFFF +}; + #define STAT_CHANGE_WORKED 0 #define STAT_CHANGE_DIDNT_WORK 1 @@ -2978,9 +2983,9 @@ void SetMoveEffect(bool32 primary, u32 certain) for (gBattleCommunication[MULTISTRING_CHOOSER] = 0; ; gBattleCommunication[MULTISTRING_CHOOSER]++) { - if (gBattleCommunication[MULTISTRING_CHOOSER] > 5) + if (gBattleCommunication[MULTISTRING_CHOOSER] > ARRAY_COUNT(sTrappingMoves)) break; - if (gTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]] == gCurrentMove) + if (sTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]] == gCurrentMove) break; } } From 3f1ce399e640c4e43c889e11cded0a1b94a1c90d Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Fri, 5 Nov 2021 18:37:45 +1300 Subject: [PATCH 193/193] Account for terminator in sTrappingMoves --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index dd49d0493..b81639db0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2983,7 +2983,7 @@ void SetMoveEffect(bool32 primary, u32 certain) for (gBattleCommunication[MULTISTRING_CHOOSER] = 0; ; gBattleCommunication[MULTISTRING_CHOOSER]++) { - if (gBattleCommunication[MULTISTRING_CHOOSER] > ARRAY_COUNT(sTrappingMoves)) + if (gBattleCommunication[MULTISTRING_CHOOSER] > ARRAY_COUNT(sTrappingMoves) - 1) break; if (sTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]] == gCurrentMove) break;