From 67fefd0261ff0f2b11f26829ecfa3622d05eabf0 Mon Sep 17 00:00:00 2001 From: Evan Date: Sun, 13 Dec 2020 19:42:48 -0700 Subject: [PATCH 01/39] var terrain, surge fixes --- data/battle_anim_scripts.s | 16 ---------- data/battle_scripts_1.s | 16 +++++++--- include/battle.h | 1 + include/battle_scripts.h | 1 + include/battle_util.h | 1 + include/constants/battle.h | 25 ++++++++-------- include/constants/battle_anim.h | 12 +++----- include/constants/battle_config.h | 5 ++++ src/battle_interface.c | 5 +--- src/battle_main.c | 6 ++++ src/battle_script_commands.c | 7 +++-- src/battle_util.c | 50 +++++++++++++++++++++++++++---- 12 files changed, 94 insertions(+), 51 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index cf11f4d6ae..1cd25477fd 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -808,10 +808,6 @@ gBattleAnims_General:: .4byte General_IngrainHeal .4byte General_WishHeal .4byte General_MegaEvolution - .4byte General_TerrainMisty - .4byte General_TerrainGrassy - .4byte General_TerrainElectric - .4byte General_TerrainPsychic .4byte General_IllusionOff .4byte General_FormChange .4byte General_SlideOffScreen @@ -24319,18 +24315,6 @@ MegaEvolutionParticles: delay 3 return -General_TerrainMisty: - end - -General_TerrainGrassy: - end - -General_TerrainElectric: - end - -General_TerrainPsychic: - end - General_RestoreBg: restorebg waitbgfadein diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0ccaa7ef64..9811a2fba9 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5386,6 +5386,12 @@ BattleScript_OverworldWeatherStarts:: playanimation2 BS_ATTACKER, sB_ANIM_ARG1, NULL end3 +BattleScript_OverworldTerrain:: + printfromtable gTerrainStringIds + waitmessage 0x40 + playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL + end3 + BattleScript_SideStatusWoreOff:: printstring STRINGID_PKMNSXWOREOFF waitmessage 0x40 @@ -6823,7 +6829,7 @@ BattleScript_ElectricSurgeActivates:: call BattleScript_AbilityPopUp printstring STRINGID_TERRAINBECOMESELECTRIC waitstate - playanimation BS_SCRIPTING, B_ANIM_TERRAIN_ELECTRIC, NULL + playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL end3 BattleScript_MistySurgeActivates:: @@ -6831,7 +6837,7 @@ BattleScript_MistySurgeActivates:: call BattleScript_AbilityPopUp printstring STRINGID_TERRAINBECOMESMISTY waitstate - playanimation BS_SCRIPTING, B_ANIM_TERRAIN_MISTY, NULL + playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL end3 BattleScript_GrassySurgeActivates:: @@ -6839,7 +6845,7 @@ BattleScript_GrassySurgeActivates:: call BattleScript_AbilityPopUp printstring STRINGID_TERRAINBECOMESGRASSY waitstate - playanimation BS_SCRIPTING, B_ANIM_TERRAIN_GRASSY, NULL + playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL end3 BattleScript_PsychicSurgeActivates:: @@ -6847,7 +6853,7 @@ BattleScript_PsychicSurgeActivates:: call BattleScript_AbilityPopUp printstring STRINGID_TERRAINBECOMESPSYCHIC waitstate - playanimation BS_SCRIPTING, B_ANIM_TERRAIN_PSYCHIC, NULL + playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL end3 BattleScript_BadDreamsActivates:: @@ -7035,7 +7041,9 @@ BattleScript_GrassyTerrainLoopIncrement:: jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_GrassyTerrainLoop BattleScript_GrassyTerrainLoopEnd:: bicword gHitMarker, HITMARKER_x20 | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_TERRAIN_PERMANENT, BattleScript_GrassyTerrainHealEnd jumpifbyte CMP_EQUAL, gFieldTimers + 5, 0x0, BattleScript_GrassyTerrainEnds +BattleScript_GrassyTerrainHealEnd: end2 BattleScript_AbilityNoSpecificStatLoss:: diff --git a/include/battle.h b/include/battle.h index 488e0fc51c..f43220e9b1 100644 --- a/include/battle.h +++ b/include/battle.h @@ -503,6 +503,7 @@ struct BattleStruct u8 wishPerishSongState; u8 wishPerishSongBattlerId; bool8 overworldWeatherDone; + bool8 terrainDone; u8 atkCancellerTracker; struct BattleTvMovePoints tvMovePoints; struct BattleTv tv; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 3566a1c4d2..980dde468a 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -48,6 +48,7 @@ extern const u8 BattleScript_SandStormHailEnds[]; extern const u8 BattleScript_SunlightContinues[]; extern const u8 BattleScript_SunlightFaded[]; extern const u8 BattleScript_OverworldWeatherStarts[]; +extern const u8 BattleScript_OverworldTerrain[]; extern const u8 BattleScript_SideStatusWoreOff[]; extern const u8 BattleScript_SafeguardProtected[]; extern const u8 BattleScript_SafeguardEnds[]; diff --git a/include/battle_util.h b/include/battle_util.h index f7699fceda..0637e80f77 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -23,6 +23,7 @@ #define ABILITYEFFECT_TRACE1 0xC #define ABILITYEFFECT_TRACE2 0xD #define ABILITYEFFECT_MOVE_END_OTHER 0xE +#define ABILITYEFFECT_SWITCH_IN_TERRAIN 0xFE #define ABILITYEFFECT_SWITCH_IN_WEATHER 0xFF #define ITEMEFFECT_ON_SWITCH_IN 0x0 diff --git a/include/constants/battle.h b/include/constants/battle.h index 40c604c9ed..7ea1e5e483 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -221,18 +221,19 @@ #define SIDE_STATUS_MAT_BLOCK (1 << 21) // Field affecting statuses. -#define STATUS_FIELD_MAGIC_ROOM 0x1 -#define STATUS_FIELD_TRICK_ROOM 0x2 -#define STATUS_FIELD_WONDER_ROOM 0x4 -#define STATUS_FIELD_MUDSPORT 0x8 -#define STATUS_FIELD_WATERSPORT 0x10 -#define STATUS_FIELD_GRAVITY 0x20 -#define STATUS_FIELD_GRASSY_TERRAIN 0x40 -#define STATUS_FIELD_MISTY_TERRAIN 0x80 -#define STATUS_FIELD_ELECTRIC_TERRAIN 0x100 -#define STATUS_FIELD_PSYCHIC_TERRAIN 0x200 -#define STATUS_FIELD_ION_DELUGE 0x400 -#define STATUS_FIELD_FAIRY_LOCK 0x800 +#define STATUS_FIELD_MAGIC_ROOM (1 << 0) +#define STATUS_FIELD_TRICK_ROOM (1 << 1) +#define STATUS_FIELD_WONDER_ROOM (1 << 2) +#define STATUS_FIELD_MUDSPORT (1 << 3) +#define STATUS_FIELD_WATERSPORT (1 << 4) +#define STATUS_FIELD_GRAVITY (1 << 5) +#define STATUS_FIELD_GRASSY_TERRAIN (1 << 6) +#define STATUS_FIELD_MISTY_TERRAIN (1 << 7) +#define STATUS_FIELD_ELECTRIC_TERRAIN (1 << 8) +#define STATUS_FIELD_PSYCHIC_TERRAIN (1 << 9) +#define STATUS_FIELD_ION_DELUGE (1 << 10) +#define STATUS_FIELD_FAIRY_LOCK (1 << 11) +#define STATUS_FIELD_TERRAIN_PERMANENT (1 << 12) // Overworld thunderstorm generates electric terrain #define STATUS_TERRAIN_ANY (STATUS_FIELD_GRASSY_TERRAIN | STATUS_FIELD_MISTY_TERRAIN | STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_PSYCHIC_TERRAIN) diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 4066060505..025b9e310c 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -518,14 +518,10 @@ #define B_ANIM_INGRAIN_HEAL 0x15 #define B_ANIM_WISH_HEAL 0x16 #define B_ANIM_MEGA_EVOLUTION 0x17 -#define B_ANIM_TERRAIN_MISTY 0x18 -#define B_ANIM_TERRAIN_GRASSY 0x19 -#define B_ANIM_TERRAIN_ELECTRIC 0x1A -#define B_ANIM_TERRAIN_PSYCHIC 0x1B -#define B_ANIM_ILLUSION_OFF 0x1C -#define B_ANIM_FORM_CHANGE 0x1D -#define B_ANIM_SLIDE_OFFSCREEN 0x1E // for Emergency Exit -#define B_ANIM_RESTORE_BG 0x1F // for Terrain Endings +#define B_ANIM_ILLUSION_OFF 0x18 +#define B_ANIM_FORM_CHANGE 0x19 +#define B_ANIM_SLIDE_OFFSCREEN 0x1A // for Emergency Exit +#define B_ANIM_RESTORE_BG 0x1B // for Terrain Endings, Surge abilities // special animations table #define B_ANIM_LVL_UP 0x0 diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index be58ba7e74..df255ac59d 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -131,6 +131,10 @@ #define B_FLAG_INVERSE_BATTLE 0 // If this flag is set, the battle's type effectiveness are inversed. For example, fire is super effective against water. #define B_FLAG_FORCE_DOUBLE_WILD 0 // If this flag is set, all land and surfing wild battles will be double battles. +// Var Settings +// To use the following features in scripting, replace the 0s with the Var ID you're assigning to it. Eg: replace VAR_UNUSED_0x40F7 with VAR_TERRAIN for that feature +#define VAR_TERRAIN 0 // If this var has a value, assigning a STATUS_FIELD_xx_TERRAIN to it before battle causes the battle to start with that terrain active + // Interface settings #define B_ABILITY_POP_UP TRUE // In Gen5+, the Pokémon abilities are displayed in a pop-up, when they activate in battle. #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. @@ -147,6 +151,7 @@ #define B_PARALYZE_ELECTRIC GEN_6 // In Gen6+, Electric-type Pokémon can't be paralyzed. #define B_POWDER_GRASS GEN_6 // In Gen6+, Grass-type Pokémon are immune to powder and spore moves. #define B_STEEL_RESISTANCES GEN_6 // In Gen6+, Steel-type Pokémon are no longer resistant to Dark and Ghost moves. +#define B_THUNDERSTORM_TERRAIN TRUE // If TRUE, overworld Thunderstorm generates Rain and Electric Terrain as in Gen 8. // Animation Settings #define B_NEW_SWORD_PARTICLE TRUE // If set to TRUE, it updates Swords Dance's particle. diff --git a/src/battle_interface.c b/src/battle_interface.c index 267b06ece1..9a0b98618f 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -965,10 +965,7 @@ static void TryToggleHealboxVisibility(u8 priority, u8 healthboxLeftSpriteId, u8 case B_ANIM_WISH_HEAL: //new case B_ANIM_MEGA_EVOLUTION: - case B_ANIM_TERRAIN_MISTY: - case B_ANIM_TERRAIN_GRASSY: - case B_ANIM_TERRAIN_ELECTRIC: - case B_ANIM_TERRAIN_PSYCHIC: + case B_ANIM_RESTORE_BG: break; } return; //all other special anims dont hide diff --git a/src/battle_main.c b/src/battle_main.c index 48129c5230..d9b3757f0e 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3483,6 +3483,12 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleStruct->overworldWeatherDone = TRUE; return; } + if (!gBattleStruct->terrainDone && AbilityBattleEffects(0, 0, 0, ABILITYEFFECT_SWITCH_IN_TERRAIN, 0) != 0) + { + gBattleStruct->terrainDone = TRUE; + return; + } + // Check all switch in abilities happening from the fastest mon to slowest. while (gBattleStruct->switchInAbilitiesCounter < gBattlersCount) { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c1587f0940..df46f35a2d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6937,8 +6937,11 @@ static void HandleTerrainMove(u32 moveEffect) gBattleCommunication[MULTISTRING_CHOOSER] = 1; break; case EFFECT_ELECTRIC_TERRAIN: - statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN, timer = &gFieldTimers.electricTerrainTimer; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT)) + { + statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN, timer = &gFieldTimers.electricTerrainTimer; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + } break; case EFFECT_PSYCHIC_TERRAIN: statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN, timer = &gFieldTimers.psychicTerrainTimer; diff --git a/src/battle_util.c b/src/battle_util.c index b929b7499d..bff9c1d75d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1988,16 +1988,18 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_ELECTRIC_TERRAIN: - if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && --gFieldTimers.electricTerrainTimer == 0) + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN + && ((!gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.electricTerrainTimer == 0)) { - gFieldStatuses &= ~(STATUS_FIELD_ELECTRIC_TERRAIN); + gFieldStatuses &= ~(STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_TERRAIN_PERMANENT); BattleScriptExecute(BattleScript_ElectricTerrainEnds); effect++; } gBattleStruct->turnCountersTracker++; break; case ENDTURN_MISTY_TERRAIN: - if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN && --gFieldTimers.mistyTerrainTimer == 0) + if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN + && ((!gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.mistyTerrainTimer == 0)) { gFieldStatuses &= ~(STATUS_FIELD_MISTY_TERRAIN); BattleScriptExecute(BattleScript_MistyTerrainEnds); @@ -2008,15 +2010,18 @@ u8 DoFieldEndTurnEffects(void) case ENDTURN_GRASSY_TERRAIN: if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN) { - if (gFieldTimers.grassyTerrainTimer == 0 || --gFieldTimers.grassyTerrainTimer == 0) + if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) + && (gFieldTimers.grassyTerrainTimer == 0 || --gFieldTimers.grassyTerrainTimer == 0)) gFieldStatuses &= ~(STATUS_FIELD_GRASSY_TERRAIN); + BattleScriptExecute(BattleScript_GrassyTerrainHeals); effect++; } gBattleStruct->turnCountersTracker++; break; case ENDTURN_PSYCHIC_TERRAIN: - if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN && --gFieldTimers.psychicTerrainTimer == 0) + if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN + && ((!gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.psychicTerrainTimer == 0)) { gFieldStatuses &= ~(STATUS_FIELD_PSYCHIC_TERRAIN); BattleScriptExecute(BattleScript_PsychicTerrainEnds); @@ -3602,6 +3607,41 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move gBattleScripting.battler = battler; switch (gLastUsedAbility) { + case ABILITYEFFECT_SWITCH_IN_TERRAIN: + if (VarGet(VAR_TERRAIN) & STATUS_TERRAIN_ANY) + { + u16 terrainFlags = VarGet(VAR_TERRAIN) & STATUS_TERRAIN_ANY; // only works for status flag (1 << 15) + gFieldStatuses = terrainFlags | STATUS_FIELD_TERRAIN_PERMANENT; // terrain is permanent + switch (VarGet(VAR_TERRAIN) & STATUS_TERRAIN_ANY) + { + case STATUS_FIELD_ELECTRIC_TERRAIN: + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + break; + case STATUS_FIELD_MISTY_TERRAIN: + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + break; + case STATUS_FIELD_GRASSY_TERRAIN: + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + break; + case STATUS_FIELD_PSYCHIC_TERRAIN: + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + break; + } + + BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); + effect++; + } + #if B_THUNDERSTORM_TERRAIN == TRUE + else if (GetCurrentWeather() == WEATHER_RAIN_THUNDERSTORM && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)) + { + // drizzle started rain, so just do electric terrain anim + gFieldStatuses = (STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_TERRAIN_PERMANENT); + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); + effect++; + } + #endif + break; case ABILITYEFFECT_SWITCH_IN_WEATHER: if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) { From 9c64635ebe4c5621a5362a6672273024e7591376 Mon Sep 17 00:00:00 2001 From: Evan Date: Sun, 13 Dec 2020 19:50:02 -0700 Subject: [PATCH 02/39] remove redundant permanent terrain check --- src/battle_script_commands.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index df46f35a2d..c1587f0940 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6937,11 +6937,8 @@ static void HandleTerrainMove(u32 moveEffect) gBattleCommunication[MULTISTRING_CHOOSER] = 1; break; case EFFECT_ELECTRIC_TERRAIN: - if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT)) - { - statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN, timer = &gFieldTimers.electricTerrainTimer; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } + statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN, timer = &gFieldTimers.electricTerrainTimer; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; break; case EFFECT_PSYCHIC_TERRAIN: statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN, timer = &gFieldTimers.psychicTerrainTimer; From 09496abef0101ce2e8eaf3d1e8dfddd1969fb8eb Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 14 Dec 2020 08:59:57 -0700 Subject: [PATCH 03/39] reset VAR_TERRAIN on whiteout --- src/overworld.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/overworld.c b/src/overworld.c index 223e6e1522..2fac455a3c 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -403,6 +403,9 @@ static void Overworld_ResetStateAfterWhiteOut(void) FlagClear(FLAG_SYS_SAFARI_MODE); FlagClear(FLAG_SYS_USE_STRENGTH); FlagClear(FLAG_SYS_USE_FLASH); + #if VAR_TERRAIN != 0 + VarSet(VAR_TERRAIN, 0); + #endif // If you were defeated by Kyogre/Groudon and the step counter has // maxed out, end the abnormal weather. if (VarGet(VAR_SHOULD_END_ABNORMAL_WEATHER) == 1) From 4923af960e5ff514e2bc3e02fb32b39fcfc82fe8 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 5 Jan 2021 15:44:12 -0700 Subject: [PATCH 04/39] steely spirit, screen cleaner, transistor, dragon's maw --- src/battle_util.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index aeeefa7347..397a011bba 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -53,6 +53,8 @@ match the ROM; this is also why sSoundMovesTable's declaration is in the middle functions instead of at the top of the file with the other declarations. */ +static bool32 TryRemoveScreens(u8 battler); + extern const u8 *const gBattleScriptsForMoveEffects[]; extern const u8 *const gBattlescriptsForBallThrow[]; extern const u8 *const gBattlescriptsForRunningByItem[]; @@ -3830,7 +3832,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move } break; case ABILITY_SCREEN_CLEANER: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (!gSpecialStatuses[battler].switchInAbilityDone && TryRemoveScreens(battler)) { gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_SCREENCLEANER; gSpecialStatuses[battler].switchInAbilityDone = 1; @@ -6682,6 +6684,18 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe if (moveType == TYPE_NORMAL && gBattleStruct->ateBoost[battlerAtk]) MulModifier(&modifier, UQ_4_12(1.2)); break; + case ABILITY_STEELY_SPIRIT: + if (moveType == TYPE_STEEL) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_TRANSISTOR: + if (moveType == TYPE_ELECTRIC) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_DRAGONS_MAW: + if (moveType == TYPE_DRAGON) + MulModifier(&modifier, UQ_4_12(1.5)); + break; } // field abilities @@ -6703,6 +6717,10 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe if (IS_MOVE_SPECIAL(move)) MulModifier(&modifier, UQ_4_12(1.3)); break; + case ABILITY_STEELY_SPIRIT: + if (moveType == TYPE_STEEL) + MulModifier(&modifier, UQ_4_12(1.5)); + break; } } @@ -7830,3 +7848,26 @@ u8 GetBattleMoveSplit(u32 moveId) else return SPLIT_SPECIAL; } + +static bool32 TryRemoveScreens(u8 battler) +{ + bool32 removed = FALSE; + u8 battlerSide = GetBattlerSide(battler); + u8 enemySide = GetBattlerSide(BATTLE_OPPOSITE(battler)); + + // try to remove from battler's side + if (gSideStatuses[battlerSide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL)) + { + gSideStatuses[battlerSide] &= ~(SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL); + removed = TRUE; + } + + // try to remove from battler opponent's side + if (gSideStatuses[enemySide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL)) + { + gSideStatuses[enemySide] &= ~(SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL); + removed = TRUE; + } + + return removed; +} From 0a3908ee924c8028725b1995c424ed308610fa26 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 5 Jan 2021 19:37:23 -0700 Subject: [PATCH 05/39] add neigh and as one abilities --- asm/macros/battle_script.inc | 4 ++++ data/battle_scripts_1.s | 3 ++- include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 4 +++- src/battle_message.c | 3 +++ src/battle_script_commands.c | 27 ++++++++++++++++++---- src/battle_util.c | 24 +++++++++++++++++-- 7 files changed, 57 insertions(+), 9 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 135960c124..ec83a6c2d0 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1760,6 +1760,10 @@ various BS_ABILITY_BATTLER, VARIOUS_DESTROY_ABILITY_POPUP .endm + .macro tryactivategrimneigh, battler:req + various \battler, VARIOUS_TRY_ACTIVATE_GRIM_NEIGH + .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 3eb1f5cbe6..88e4743732 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4965,8 +4965,9 @@ BattleScript_FaintTarget:: tryactivatefellstinger BS_ATTACKER tryactivatesoulheart tryactivatereceiver BS_TARGET - tryactivatemoxie BS_ATTACKER + tryactivatemoxie BS_ATTACKER @ and chilling neigh, as one ice rider tryactivatebeastboost BS_ATTACKER + tryactivategrimneigh BS_ATTACKER @ and as one shadow rider trytrainerslidefirstdownmsg BS_TARGET return diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 2f52da3197..e68278b1d2 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -167,6 +167,7 @@ #define VARIOUS_PARALYZE_TYPE_IMMUNITY 100 #define VARIOUS_JUMP_IF_ABSENT 101 #define VARIOUS_DESTROY_ABILITY_POPUP 102 +#define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 103 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 9348d67d5d..10562bd988 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -558,8 +558,9 @@ #define STRINGID_AURABREAKENTERS 554 #define STRINGID_COMATOSEENTERS 555 #define STRINGID_SCREENCLEANERENTERS 556 +#define STRINGID_ASONEENTERS 557 -#define BATTLESTRINGS_COUNT 557 +#define BATTLESTRINGS_COUNT 558 //// multichoice message IDs // switch in ability message @@ -576,5 +577,6 @@ #define MULTI_SWITCHIN_AURABREAK 10 #define MULTI_SWITCHIN_COMATOSE 11 #define MULTI_SWITCHIN_SCREENCLEANER 12 +#define MULTI_SWITCHIN_ASONE 13 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index 35ccc6e268..c629d30927 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -685,9 +685,11 @@ static const u8 sText_FairyAuraActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} static const u8 sText_AuraBreakActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} reversed all\nother POKéMON's auras!"); static const u8 sText_ComatoseActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is drowsing!"); static const u8 sText_ScreenCleanerActivates[] = _("All screens on the field were\ncleansed!"); +static const u8 sText_AsOneEnters[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} has two Abilities!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_ASONEENTERS - 12] = sText_AsOneEnters, [STRINGID_STATWASNOTLOWERED - 12] = sText_StatWasNotLowered, [STRINGID_CLOAKEDINAFREEZINGLIGHT - 12] = sText_CloakedInAFreezingLight, [STRINGID_DESTINYKNOTACTIVATES - 12] = sText_DestinyKnotActivates, @@ -1275,6 +1277,7 @@ const u16 gSwitchInAbilityStringIds[] = [MULTI_SWITCHIN_AURABREAK] = STRINGID_AURABREAKENTERS, [MULTI_SWITCHIN_COMATOSE] = STRINGID_COMATOSEENTERS, [MULTI_SWITCHIN_SCREENCLEANER] = STRINGID_SCREENCLEANERENTERS, + [MULTI_SWITCHIN_ASONE] = STRINGID_ASONEENTERS, }; const u16 gMissStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index bc427698ef..0857b1c5e9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7527,11 +7527,13 @@ static void Cmd_various(void) BtlController_EmitSetMonData(0, REQUEST_PP_DATA_BATTLE, 0, 5, data); MarkBattlerForControllerExec(gActiveBattler); break; - case VARIOUS_TRY_ACTIVATE_MOXIE: - if (GetBattlerAbility(gActiveBattler) == ABILITY_MOXIE - && HasAttackerFaintedTarget() - && !NoAliveMonsForEitherParty() - && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 12) + case VARIOUS_TRY_ACTIVATE_MOXIE: // and chilling neigh + as one ice rider + if ((GetBattlerAbility(gActiveBattler) == ABILITY_MOXIE + || GetBattlerAbility(gActiveBattler) == ABILITY_CHILLING_NEIGH + || GetBattlerAbility(gActiveBattler) == ABILITY_AS_ONE_ICE_RIDER) + && HasAttackerFaintedTarget() + && !NoAliveMonsForEitherParty() + && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 12) { gBattleMons[gBattlerAttacker].statStages[STAT_ATK]++; SET_STATCHANGER(STAT_ATK, 1, FALSE); @@ -7541,6 +7543,21 @@ static void Cmd_various(void) return; } break; + case VARIOUS_TRY_ACTIVATE_GRIM_NEIGH: // and as one shadow rider + if ((GetBattlerAbility(gActiveBattler) == ABILITY_GRIM_NEIGH + || GetBattlerAbility(gActiveBattler) == ABILITY_AS_ONE_SHADOW_RIDER) + && HasAttackerFaintedTarget() + && !NoAliveMonsForEitherParty() + && gBattleMons[gBattlerAttacker].statStages[STAT_SPATK] != 12) + { + gBattleMons[gBattlerAttacker].statStages[STAT_SPATK]++; + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); + BattleScriptPush(gBattlescriptCurrInstr + 3); + gBattlescriptCurrInstr = BattleScript_AttackerAbilityStatRaise; + return; + } + break; case VARIOUS_TRY_ACTIVATE_RECEIVER: // Partner gets fainted's ally ability gBattlerAbility = BATTLE_PARTNER(gActiveBattler); i = GetBattlerAbility(gBattlerAbility); diff --git a/src/battle_util.c b/src/battle_util.c index 397a011bba..f7804851c4 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -54,6 +54,7 @@ functions instead of at the top of the file with the other declarations. */ static bool32 TryRemoveScreens(u8 battler); +static bool32 IsUnnerveAbilityOnOpposingSide(u8 battlerId); extern const u8 *const gBattleScriptsForMoveEffects[]; extern const u8 *const gBattlescriptsForBallThrow[]; @@ -3701,6 +3702,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move effect++; } break; + case ABILITY_AS_ONE_ICE_RIDER: + case ABILITY_AS_ONE_SHADOW_RIDER: + if (!gSpecialStatuses[battler].switchInAbilityDone) + { + gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_ASONE; + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + effect++; + } + break; case ABILITY_ANTICIPATION: if (!gSpecialStatuses[battler].switchInAbilityDone) { @@ -4986,7 +4997,7 @@ static bool32 HasEnoughHpToEatBerry(u32 battlerId, u32 hpFraction, u32 itemId) if (gBattleMons[battlerId].hp == 0) return FALSE; // Unnerve prevents consumption of opponents' berries. - if (isBerry && IsAbilityOnOpposingSide(battlerId, ABILITY_UNNERVE)) + if (isBerry && IsUnnerveAbilityOnOpposingSide(battlerId)) return FALSE; if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / hpFraction) return TRUE; @@ -5100,7 +5111,7 @@ static u8 ItemHealHp(u32 battlerId, u32 itemId, bool32 end2, bool32 percentHeal) static bool32 UnnerveOn(u32 battlerId, u32 itemId) { - if (ItemId_GetPocket(itemId) == POCKET_BERRIES && IsAbilityOnOpposingSide(battlerId, ABILITY_UNNERVE)) + if (ItemId_GetPocket(itemId) == POCKET_BERRIES && IsUnnerveAbilityOnOpposingSide(battlerId)) return TRUE; return FALSE; } @@ -7871,3 +7882,12 @@ static bool32 TryRemoveScreens(u8 battler) return removed; } + +static bool32 IsUnnerveAbilityOnOpposingSide(u8 battlerId) +{ + if (IsAbilityOnOpposingSide(battlerId, ABILITY_UNNERVE) + || IsAbilityOnOpposingSide(battlerId, ABILITY_AS_ONE_ICE_RIDER) + || IsAbilityOnOpposingSide(battlerId, ABILITY_AS_ONE_SHADOW_RIDER)) + return TRUE; + return FALSE; +} From 4c1e8f2f2ebed06769dfcc8e93b2466fb4b9f7a5 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 5 Jan 2021 20:02:11 -0700 Subject: [PATCH 06/39] add curious medicine --- include/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 4 +++- src/battle_message.c | 2 ++ src/battle_script_commands.c | 17 +++++++++++------ src/battle_util.c | 13 +++++++++++++ 5 files changed, 30 insertions(+), 7 deletions(-) diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 454b6ab345..14ed1ebb87 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -26,6 +26,7 @@ u32 IsFlowerVeilProtected(u32 battler); u32 IsLeafGuardProtected(u32 battler); bool32 IsShieldsDownProtected(u32 battler); u32 IsAbilityStatusProtected(u32 battler); +void ResetBattlerStatChanges(u8 battler); extern void (* const gBattleScriptingCommandsTable[])(void); extern const u8 gBattlePalaceNatureToMoveGroupLikelihood[NUM_NATURES][4]; diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 10562bd988..665d47c273 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -559,8 +559,9 @@ #define STRINGID_COMATOSEENTERS 555 #define STRINGID_SCREENCLEANERENTERS 556 #define STRINGID_ASONEENTERS 557 +#define STRINGID_CURIOUSMEDICINEENTERS 558 -#define BATTLESTRINGS_COUNT 558 +#define BATTLESTRINGS_COUNT 559 //// multichoice message IDs // switch in ability message @@ -578,5 +579,6 @@ #define MULTI_SWITCHIN_COMATOSE 11 #define MULTI_SWITCHIN_SCREENCLEANER 12 #define MULTI_SWITCHIN_ASONE 13 +#define MULTI_SWITCHIN_CURIOUS_MEDICINE 14 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index c629d30927..48c297d72e 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -686,9 +686,11 @@ static const u8 sText_AuraBreakActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} static const u8 sText_ComatoseActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is drowsing!"); static const u8 sText_ScreenCleanerActivates[] = _("All screens on the field were\ncleansed!"); 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_CURIOUSMEDICINEENTERS - 12] = sText_CuriousMedicineEnters, [STRINGID_ASONEENTERS - 12] = sText_AsOneEnters, [STRINGID_STATWASNOTLOWERED - 12] = sText_StatWasNotLowered, [STRINGID_CLOAKEDINAFREEZINGLIGHT - 12] = sText_CloakedInAFreezingLight, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 0857b1c5e9..61a54e3d85 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9074,17 +9074,22 @@ static void Cmd_statbuffchange(void) gBattlescriptCurrInstr = jumpPtr; } +void ResetBattlerStatChanges(u8 battler) +{ + u32 j; + + gDisableStructs[battler].stockpileDef = 0; + gDisableStructs[battler].stockpileSpDef = 0; + for (j = 0; j < NUM_BATTLE_STATS; j++) + gBattleMons[battler].statStages[j] = DEFAULT_STAT_STAGE; +} + static void Cmd_normalisebuffs(void) // haze { s32 i, j; for (i = 0; i < gBattlersCount; i++) - { - gDisableStructs[i].stockpileDef = 0; - gDisableStructs[i].stockpileSpDef = 0; - for (j = 0; j < NUM_BATTLE_STATS; j++) - gBattleMons[i].statStages[j] = DEFAULT_STAT_STAGE; - } + ResetBattlerStatChanges(i); gBattlescriptCurrInstr++; } diff --git a/src/battle_util.c b/src/battle_util.c index f7804851c4..10a38a26bc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3712,6 +3712,18 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move effect++; } break; + case ABILITY_CURIOUS_MEDICINE: + if (!gSpecialStatuses[battler].switchInAbilityDone && IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + { + u32 i; + gEffectBattler = BATTLE_PARTNER(battler); + ResetBattlerStatChanges(gEffectBattler); + gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_CURIOUS_MEDICINE; + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + effect++; + } + break; case ABILITY_ANTICIPATION: if (!gSpecialStatuses[battler].switchInAbilityDone) { @@ -7891,3 +7903,4 @@ static bool32 IsUnnerveAbilityOnOpposingSide(u8 battlerId) return TRUE; return FALSE; } + From f046a25ce036e7af01efafdb22dade424ca7bd7b Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 5 Jan 2021 21:15:21 -0700 Subject: [PATCH 07/39] ripen & hp restoring berries --- data/battle_scripts_1.s | 10 ++++++++++ src/battle_util.c | 10 ++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3eb1f5cbe6..f892e26117 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7461,6 +7461,11 @@ BattleScript_WhiteHerbRet:: return BattleScript_ItemHealHP_RemoveItemRet:: + jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_ItemHealHP_RemoveItemRet_AbilityPopUp + goto BattleScript_ItemHealHP_RemoveItemRet_Anim +BattleScript_ItemHealHP_RemoveItemRet_AbilityPopUp: + call BattleScript_AbilityPopUp +BattleScript_ItemHealHP_RemoveItemRet_Anim: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, NULL printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage 0x40 @@ -7470,6 +7475,11 @@ BattleScript_ItemHealHP_RemoveItemRet:: removeitem BS_SCRIPTING return BattleScript_ItemHealHP_RemoveItemEnd2:: + jumpifability BS_ATTACKER, ABILITY_RIPEN BattleScript_ItemHealHP_RemoveItemEnd2_AbilityPopUp + goto BattleScript_ItemHealHP_RemoveItemEnd2_Anim +BattleScript_ItemHealHP_RemoveItemEnd2_AbilityPopUp: + call BattleScript_AbilityPopUp +BattleScript_ItemHealHP_RemoveItemEnd2_Anim: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage 0x40 diff --git a/src/battle_util.c b/src/battle_util.c index aeeefa7347..aff3a1c53b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4980,7 +4980,7 @@ enum static bool32 HasEnoughHpToEatBerry(u32 battlerId, u32 hpFraction, u32 itemId) { bool32 isBerry = (ItemId_GetPocket(itemId) == POCKET_BERRIES); - + if (gBattleMons[battlerId].hp == 0) return FALSE; // Unnerve prevents consumption of opponents' berries. @@ -5073,6 +5073,7 @@ static u8 RandomStatRaiseBerry(u32 battlerId, u32 itemId) return 0; } +// berries, berry juice static u8 ItemHealHp(u32 battlerId, u32 itemId, bool32 end2, bool32 percentHeal) { if (HasEnoughHpToEatBerry(battlerId, 2, itemId)) @@ -5081,7 +5082,12 @@ static u8 ItemHealHp(u32 battlerId, u32 itemId, bool32 end2, bool32 percentHeal) gBattleMoveDamage = (gBattleMons[battlerId].maxHP * GetBattlerHoldEffectParam(battlerId) / 100) * -1; else gBattleMoveDamage = GetBattlerHoldEffectParam(battlerId) * -1; - + + // check ripen + if (ItemId_GetPocket(itemId) == POCKET_BERRIES && GetBattlerAbility(battlerId) == ABILITY_RIPEN) + gBattleMoveDamage *= 2; + + gBattlerAbility = battlerId; // in SWSH, berry juice shows ability pop up but has no effect. This is mimicked here if (end2) { BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); From b3a6df8d572a06a7ca03d546667c63b5152084e4 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 5 Jan 2021 22:13:32 -0700 Subject: [PATCH 08/39] stat raising berries --- data/battle_scripts_1.s | 51 +++++++++++- include/battle_scripts.h | 2 + src/battle_util.c | 166 ++++++++++++++++++++++++++++++--------- 3 files changed, 183 insertions(+), 36 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index f892e26117..03f3b00de5 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7474,8 +7474,9 @@ BattleScript_ItemHealHP_RemoveItemRet_Anim: datahpupdate BS_SCRIPTING removeitem BS_SCRIPTING return + BattleScript_ItemHealHP_RemoveItemEnd2:: - jumpifability BS_ATTACKER, ABILITY_RIPEN BattleScript_ItemHealHP_RemoveItemEnd2_AbilityPopUp + jumpifability BS_ATTACKER, ABILITY_RIPEN, BattleScript_ItemHealHP_RemoveItemEnd2_AbilityPopUp goto BattleScript_ItemHealHP_RemoveItemEnd2_Anim BattleScript_ItemHealHP_RemoveItemEnd2_AbilityPopUp: call BattleScript_AbilityPopUp @@ -7490,6 +7491,11 @@ BattleScript_ItemHealHP_RemoveItemEnd2_Anim: end2 BattleScript_BerryPPHealEnd2:: + jumpifability BS_ATTACKER, ABILITY_RIPEN, BattleScript_BerryPPHealEnd2_AbilityPopup + goto BattleScript_BerryPPHealEnd2_Anim +BattleScript_BerryPPHealEnd2_AbilityPopup: + call BattleScript_AbilityPopUp +BattleScript_BerryPPHealEnd2_Anim: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL printstring STRINGID_PKMNSITEMRESTOREDPP waitmessage 0x40 @@ -7553,6 +7559,11 @@ BattleScript_HangedOnMsgRet: return BattleScript_BerryConfuseHealEnd2:: + jumpifability BS_ATTACKER, 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 printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage 0x40 @@ -7566,7 +7577,31 @@ BattleScript_BerryConfuseHealEnd2:: removeitem BS_ATTACKER end2 +BattleScript_BerryConfuseHealRet:: + jumpifability BS_SCRIPTING, 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 + printstring STRINGID_PKMNSITEMRESTOREDHEALTH + waitmessage 0x40 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE + healthbarupdate BS_SCRIPTING + datahpupdate BS_SCRIPTING + printstring STRINGID_FORXCOMMAYZ + waitmessage 0x40 + setmoveeffect MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER + seteffectprimary + removeitem BS_SCRIPTING + return + BattleScript_BerryStatRaiseEnd2:: + jumpifability BS_ATTACKER, ABILITY_RIPEN, BattleScript_BerryStatRaiseEnd2_AbilityPopup + goto BattleScript_BerryStatRaiseEnd2_Anim +BattleScript_BerryStatRaiseEnd2_AbilityPopup: + call BattleScript_AbilityPopUp +BattleScript_BerryStatRaiseEnd2_Anim: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_82DB85B BattleScript_82DB85B:: @@ -7575,6 +7610,20 @@ BattleScript_82DB85B:: removeitem BS_ATTACKER end2 +BattleScript_BerryStatRaiseRet:: + jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_BerryStatRaiseRet_AbilityPopup + goto BattleScript_BerryStatRaiseRet_Anim +BattleScript_BerryStatRaiseRet_AbilityPopup: + call BattleScript_AbilityPopUp +BattleScript_BerryStatRaiseRet_Anim: + playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, NULL + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_BerryStatRaiseRet_End +BattleScript_BerryStatRaiseRet_End: + setbyte cMULTISTRING_CHOOSER, 0x4 + call BattleScript_StatUp + removeitem BS_SCRIPTING + return + BattleScript_BerryFocusEnergyEnd2:: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL printstring STRINGID_PKMNUSEDXTOGETPUMPED diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 3566a1c4d2..f0e59cba3c 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -208,7 +208,9 @@ extern const u8 BattleScript_ItemHealHP_Ret[]; extern const u8 BattleScript_SelectingNotAllowedMoveChoiceItem[]; extern const u8 BattleScript_HangedOnMsg[]; extern const u8 BattleScript_BerryConfuseHealEnd2[]; +extern const u8 BattleScript_BerryConfuseHealRet[]; extern const u8 BattleScript_BerryStatRaiseEnd2[]; +extern const u8 BattleScript_BerryStatRaiseRet[]; extern const u8 BattleScript_BerryFocusEnergyEnd2[]; extern const u8 BattleScript_ActionSelectionItemsCantBeUsed[]; extern const u8 BattleScript_ArenaTurnBeginning[]; diff --git a/src/battle_util.c b/src/battle_util.c index aff3a1c53b..56e7a2928c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4999,7 +4999,7 @@ static bool32 HasEnoughHpToEatBerry(u32 battlerId, u32 hpFraction, u32 itemId) return FALSE; } -static u8 HealConfuseBerry(u32 battlerId, u32 itemId, u8 flavorId) +static u8 HealConfuseBerry(u32 battlerId, u32 itemId, u8 flavorId, bool32 end2) { if (HasEnoughHpToEatBerry(battlerId, 2, itemId)) { @@ -5009,17 +5009,35 @@ static u8 HealConfuseBerry(u32 battlerId, u32 itemId, u8 flavorId) if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; - if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, flavorId) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); + + if (GetBattlerAbility(battlerId) == ABILITY_RIPEN) + { + gBattleMoveDamage *= 2; + gBattlerAbility = battlerId; + } + + if (end2) + { + if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, flavorId) < 0) + BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); + else + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); + } else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); + { + BattleScriptPushCursor(); + if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, flavorId) < 0) + gBattlescriptCurrInstr = BattleScript_BerryConfuseHealRet; + else + gBattlescriptCurrInstr = BattleScript_ItemHealHP_RemoveItemRet; + } return ITEM_HP_CHANGE; } return 0; } -static u8 StatRaiseBerry(u32 battlerId, u32 itemId, u32 statId) +static u8 StatRaiseBerry(u32 battlerId, u32 itemId, u32 statId, bool32 end2) { if (gBattleMons[battlerId].statStages[statId] < 0xC && HasEnoughHpToEatBerry(battlerId, GetBattlerHoldEffectParam(battlerId), itemId)) { @@ -5027,16 +5045,29 @@ static u8 StatRaiseBerry(u32 battlerId, u32 itemId, u32 statId) PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE); gEffectBattler = battlerId; - SET_STATCHANGER(statId, 1, FALSE); + if (GetBattlerAbility(battlerId) == ABILITY_RIPEN) + SET_STATCHANGER(statId, 2, FALSE); + else + SET_STATCHANGER(statId, 1, FALSE); + gBattleScripting.animArg1 = 0xE + statId; gBattleScripting.animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + + if (end2) + { + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + } + else + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BerryStatRaiseRet; + } return ITEM_STATS_CHANGE; } return 0; } -static u8 RandomStatRaiseBerry(u32 battlerId, u32 itemId) +static u8 RandomStatRaiseBerry(u32 battlerId, u32 itemId, bool32 end2) { s32 i; @@ -5064,10 +5095,24 @@ static u8 RandomStatRaiseBerry(u32 battlerId, u32 itemId) gBattleTextBuff2[7] = EOS; gEffectBattler = battlerId; - SET_STATCHANGER(i + 1, 2, FALSE); + + if (GetBattlerAbility(battlerId) == ABILITY_RIPEN) + SET_STATCHANGER(i + 1, 4, FALSE); + else + SET_STATCHANGER(i + 1, 2, FALSE); + gBattleScripting.animArg1 = 0x21 + i + 6; gBattleScripting.animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + + if (end2) + { + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + } + else + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BerryStatRaiseRet; + } return ITEM_STATS_CHANGE; } return 0; @@ -5155,43 +5200,43 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) break; case HOLD_EFFECT_CONFUSE_SPICY: if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SPICY); + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SPICY, TRUE); break; case HOLD_EFFECT_CONFUSE_DRY: if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_DRY); + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_DRY, TRUE); break; case HOLD_EFFECT_CONFUSE_SWEET: if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SWEET); + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SWEET, TRUE); break; case HOLD_EFFECT_CONFUSE_BITTER: if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_BITTER); + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_BITTER, TRUE); break; case HOLD_EFFECT_CONFUSE_SOUR: if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SOUR); + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SOUR, TRUE); break; case HOLD_EFFECT_ATTACK_UP: if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_ATK); + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_ATK, TRUE); break; case HOLD_EFFECT_DEFENSE_UP: if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_DEF); + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_DEF, TRUE); break; case HOLD_EFFECT_SPEED_UP: if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPEED); + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPEED, TRUE); break; case HOLD_EFFECT_SP_ATTACK_UP: if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPATK); + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPATK, TRUE); break; case HOLD_EFFECT_SP_DEFENSE_UP: if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPDEF); + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPDEF, TRUE); break; case HOLD_EFFECT_CRITICAL_UP: if (B_BERRIES_INSTANT >= GEN_4 && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY) && HasEnoughHpToEatBerry(battlerId, GetBattlerHoldEffectParam(battlerId), gLastUsedItem)) @@ -5203,7 +5248,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) break; case HOLD_EFFECT_RANDOM_STAT_UP: if (B_BERRIES_INSTANT >= GEN_4) - effect = RandomStatRaiseBerry(battlerId, gLastUsedItem); + effect = RandomStatRaiseBerry(battlerId, gLastUsedItem, TRUE); break; case HOLD_EFFECT_CURE_PAR: if (B_BERRIES_INSTANT >= GEN_4 && gBattleMons[battlerId].status1 & STATUS1_PARALYSIS && !UnnerveOn(battlerId, gLastUsedItem)) @@ -5335,7 +5380,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) effect = ItemHealHp(battlerId, gLastUsedItem, TRUE, FALSE); break; case HOLD_EFFECT_RESTORE_PCT_HP: - if (B_BERRIES_INSTANT >= GEN_4) + if (!moveTurn) effect = ItemHealHp(battlerId, gLastUsedItem, TRUE, TRUE); break; case HOLD_EFFECT_RESTORE_PP: @@ -5360,10 +5405,17 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) if (i != MAX_MON_MOVES) { u8 maxPP = CalculatePPWithBonus(move, ppBonuses, i); - if (changedPP + GetBattlerHoldEffectParam(battlerId) > maxPP) + u8 ppRestored = GetBattlerHoldEffectParam(battlerId); + + if (GetBattlerAbility(battlerId) == ABILITY_RIPEN) + { + ppRestored *= 2; + gBattlerAbility = battlerId; + } + if (changedPP + ppRestored > maxPP) changedPP = maxPP; else - changedPP = changedPP + GetBattlerHoldEffectParam(battlerId); + changedPP = changedPP + ppRestored; PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); @@ -5421,43 +5473,43 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) break; case HOLD_EFFECT_CONFUSE_SPICY: if (!moveTurn) - effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SPICY); + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SPICY, TRUE); break; case HOLD_EFFECT_CONFUSE_DRY: if (!moveTurn) - effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_DRY); + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_DRY, TRUE); break; case HOLD_EFFECT_CONFUSE_SWEET: if (!moveTurn) - effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SWEET); + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SWEET, TRUE); break; case HOLD_EFFECT_CONFUSE_BITTER: if (!moveTurn) - effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_BITTER); + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_BITTER, TRUE); break; case HOLD_EFFECT_CONFUSE_SOUR: if (!moveTurn) - effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SOUR); + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SOUR, TRUE); break; case HOLD_EFFECT_ATTACK_UP: if (!moveTurn) - effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_ATK); + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_ATK, TRUE); break; case HOLD_EFFECT_DEFENSE_UP: if (!moveTurn) - effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_DEF); + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_DEF, TRUE); break; case HOLD_EFFECT_SPEED_UP: if (!moveTurn) - effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPEED); + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPEED, TRUE); break; case HOLD_EFFECT_SP_ATTACK_UP: if (!moveTurn) - effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPATK); + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPATK, TRUE); break; case HOLD_EFFECT_SP_DEFENSE_UP: if (!moveTurn) - effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPDEF); + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPDEF, TRUE); break; case HOLD_EFFECT_CRITICAL_UP: if (!moveTurn && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY) && HasEnoughHpToEatBerry(battlerId, GetBattlerHoldEffectParam(battlerId), gLastUsedItem)) @@ -5469,7 +5521,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) break; case HOLD_EFFECT_RANDOM_STAT_UP: if (!moveTurn) - effect = RandomStatRaiseBerry(battlerId, gLastUsedItem); + effect = RandomStatRaiseBerry(battlerId, gLastUsedItem, TRUE); break; case HOLD_EFFECT_CURE_PAR: if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS && !UnnerveOn(battlerId, gLastUsedItem)) @@ -5609,6 +5661,50 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) if (B_BERRIES_INSTANT >= GEN_4) effect = ItemHealHp(battlerId, gLastUsedItem, FALSE, TRUE); break; + case HOLD_EFFECT_CONFUSE_SPICY: + if (B_BERRIES_INSTANT >= GEN_4) + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SPICY, FALSE); + break; + case HOLD_EFFECT_CONFUSE_DRY: + if (B_BERRIES_INSTANT >= GEN_4) + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_DRY, FALSE); + break; + case HOLD_EFFECT_CONFUSE_SWEET: + if (B_BERRIES_INSTANT >= GEN_4) + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SWEET, FALSE); + break; + case HOLD_EFFECT_CONFUSE_BITTER: + if (B_BERRIES_INSTANT >= GEN_4) + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_BITTER, FALSE); + break; + case HOLD_EFFECT_CONFUSE_SOUR: + if (B_BERRIES_INSTANT >= GEN_4) + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SOUR, FALSE); + break; + case HOLD_EFFECT_ATTACK_UP: + if (B_BERRIES_INSTANT >= GEN_4) + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_ATK, FALSE); + break; + case HOLD_EFFECT_DEFENSE_UP: + if (B_BERRIES_INSTANT >= GEN_4) + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_DEF, FALSE); + break; + case HOLD_EFFECT_SPEED_UP: + if (B_BERRIES_INSTANT >= GEN_4) + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPEED, FALSE); + break; + case HOLD_EFFECT_SP_ATTACK_UP: + if (B_BERRIES_INSTANT >= GEN_4) + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPATK, FALSE); + break; + case HOLD_EFFECT_SP_DEFENSE_UP: + if (B_BERRIES_INSTANT >= GEN_4) + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPDEF, FALSE); + break; + case HOLD_EFFECT_RANDOM_STAT_UP: + if (B_BERRIES_INSTANT >= GEN_4) + effect = RandomStatRaiseBerry(battlerId, gLastUsedItem, FALSE); + break; case HOLD_EFFECT_CURE_PAR: if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS && !UnnerveOn(battlerId, gLastUsedItem)) { From d3ae05189db302fc981cfffdaf413a036b46f94b Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 5 Jan 2021 22:21:38 -0700 Subject: [PATCH 09/39] resist berry ripen boost --- src/battle_util.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 56e7a2928c..fcfa97e82e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7407,7 +7407,10 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move if (moveType == GetBattlerHoldEffectParam(battlerDef) && (moveType == TYPE_NORMAL || typeEffectivenessModifier >= UQ_4_12(2.0))) { - MulModifier(&finalModifier, UQ_4_12(0.5)); + if (abilityDef == ABILITY_RIPEN) + MulModifier(&finalModifier, UQ_4_12(0.25)); + else + MulModifier(&finalModifier, UQ_4_12(0.5)); if (updateFlags) gSpecialStatuses[battlerDef].berryReduced = 1; } From f2e486eb0d92ff6d7099de5899dbb4d260a64160 Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 6 Jan 2021 09:37:31 -0700 Subject: [PATCH 10/39] custap berry effect, custap/quick claw activation message --- data/battle_scripts_1.s | 15 +++++++ include/battle.h | 9 ++++ include/battle_scripts.h | 2 + include/battle_util.h | 1 + include/constants/battle_string_ids.h | 3 +- include/constants/hold_effects.h | 3 ++ src/battle_main.c | 61 ++++++++++++++++++++++----- src/battle_message.c | 2 + src/battle_util.c | 2 +- 9 files changed, 86 insertions(+), 12 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3eb1f5cbe6..28da6de0e1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7714,3 +7714,18 @@ BattleScript_AnnounceAirLockCloudNine:: waitmessage 0x40 call BattleScript_WeatherFormChanges end3 + +BattleScript_QuickClawActivation:: + playanimation BS_ATTACKER, B_ANIM_FOCUS_PUNCH_SETUP, NULL + waitanimation + printstring STRINGID_CANACTFASTERTHANKSTO + waitmessage 0x40 + end2 + +BattleScript_CustapBerryActivation:: + playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL + waitanimation + printstring STRINGID_CANACTFASTERTHANKSTO + waitmessage 0x40 + removeitem BS_ATTACKER + end2 diff --git a/include/battle.h b/include/battle.h index 488e0fc51c..a7e8f5212b 100644 --- a/include/battle.h +++ b/include/battle.h @@ -427,6 +427,13 @@ struct Illusion struct Pokemon *mon; }; +struct PinchBerry +{ + u8 micleBerry:1; + u8 custap:1; // also quick claw + +}; + struct BattleStruct { u8 turnEffectsTracker; @@ -542,6 +549,8 @@ struct BattleStruct u8 sameMoveTurns[MAX_BATTLERS_COUNT]; // For Metronome, number of times the same moves has been SUCCESFULLY used. u16 moveEffect2; // For Knock Off u16 changedSpecies[PARTY_SIZE]; // For Zygarde or future forms when multiple mons can change into the same pokemon. + struct PinchBerry pinchBerry[MAX_BATTLERS_COUNT]; + u8 quickClawBattlerId; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 3566a1c4d2..a5548791a2 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -350,5 +350,7 @@ extern const u8 BattleScript_EmergencyExitWild[]; extern const u8 BattleScript_EmergencyExitWildNoPopUp[]; extern const u8 BattleScript_CheekPouchActivates[]; extern const u8 BattleScript_AnnounceAirLockCloudNine[]; +extern const u8 BattleScript_QuickClawActivation[]; +extern const u8 BattleScript_CustapBerryActivation[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index f7699fceda..06256aa773 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -130,5 +130,6 @@ void ClearIllusionMon(u32 battlerId); bool32 SetIllusionMon(struct Pokemon *mon, u32 battlerId); bool8 ShouldGetStatBadgeBoost(u16 flagId, u8 battlerId); u8 GetBattleMoveSplit(u32 moveId); +bool32 HasEnoughHpToEatBerry(u32 battlerId, u32 hpFraction, u32 itemId); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 9348d67d5d..bcb3e86786 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -558,8 +558,9 @@ #define STRINGID_AURABREAKENTERS 554 #define STRINGID_COMATOSEENTERS 555 #define STRINGID_SCREENCLEANERENTERS 556 +#define STRINGID_CANACTFASTERTHANKSTO 557 -#define BATTLESTRINGS_COUNT 557 +#define BATTLESTRINGS_COUNT 558 //// multichoice message IDs // switch in ability message diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 85017cb405..3de2e7b43b 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -104,6 +104,9 @@ #define HOLD_EFFECT_RESIST_BERRY 98 #define HOLD_EFFECT_POWER_ITEM 99 #define HOLD_EFFECT_RESTORE_PCT_HP 100 +#define HOLD_EFFECT_MICLE_BERRY 101 +#define HOLD_EFFECT_JABOCA_BERRY 102 +#define HOLD_EFFECT_CUSTAP_BERRY 103 // Gen5 hold effects #define HOLD_EFFECT_FLOAT_STONE 115 diff --git a/src/battle_main.c b/src/battle_main.c index 48129c5230..916bf20b1d 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -107,6 +107,7 @@ static void sub_803CDF8(void); static bool8 AllAtActionConfirmed(void); static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void); static void CheckMegaEvolutionBeforeTurn(void); +static void CheckQuickClaw_CustapBerryActivation(void); static void FreeResetData_ReturnToOvOrDoEvolutions(void); static void ReturnFromBattleToOverworld(void); static void TryEvolvePokemon(void); @@ -4324,20 +4325,23 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) u8 strikesFirst = 0; u32 speedBattler1 = 0, speedBattler2 = 0; u32 holdEffectBattler1 = 0, holdEffectBattler2 = 0; - bool32 quickClawBattler1 = FALSE, quickClawBattler2 = FALSE; s8 priority1 = 0, priority2 = 0; speedBattler1 = GetBattlerTotalSpeedStat(battler1); holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); - if (holdEffectBattler1 == HOLD_EFFECT_QUICK_CLAW - && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler1)) / 100) - quickClawBattler1 = TRUE; + if ((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))) + gBattleStruct->pinchBerry[battler1].custap = TRUE; speedBattler2 = GetBattlerTotalSpeedStat(battler2); holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); - if (holdEffectBattler2 == HOLD_EFFECT_QUICK_CLAW - && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler2)) / 100) - quickClawBattler2 = TRUE; + if ((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))) + gBattleStruct->pinchBerry[battler2].custap = TRUE; if (!ignoreChosenMoves) { @@ -4349,13 +4353,13 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) if (priority1 == priority2) { - // QUICK CLAW - always first + // QUICK CLAW / CUSTAP - always first // LAGGING TAIL - always last // STALL - always last - if (quickClawBattler1 && !quickClawBattler2) + if (gBattleStruct->pinchBerry[battler1].custap && !gBattleStruct->pinchBerry[battler2].custap) strikesFirst = 0; - else if (quickClawBattler2 && !quickClawBattler1) + else if (gBattleStruct->pinchBerry[battler2].custap && !gBattleStruct->pinchBerry[battler1].custap) strikesFirst = 1; else if (holdEffectBattler1 == HOLD_EFFECT_LAGGING_TAIL && holdEffectBattler2 != HOLD_EFFECT_LAGGING_TAIL) strikesFirst = 1; @@ -4592,6 +4596,43 @@ static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) } } + gBattleMainFunc = CheckQuickClaw_CustapBerryActivation; + gBattleStruct->quickClawBattlerId = 0; +} + +static void CheckQuickClaw_CustapBerryActivation(void) +{ + u32 i; + + if (!(gHitMarker & HITMARKER_RUN)) + { + while (gBattleStruct->quickClawBattlerId < gBattlersCount) + { + gActiveBattler = gBattlerAttacker = gBattleStruct->quickClawBattlerId; + gBattleStruct->quickClawBattlerId++; + if (gBattleStruct->pinchBerry[gActiveBattler].custap + && !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) + && !(gDisableStructs[gBattlerAttacker].truantCounter) + && !(gProtectStructs[gActiveBattler].noValidMoves)) + { + gBattleStruct->pinchBerry[gActiveBattler].custap = FALSE; + gLastUsedItem = gBattleMons[gActiveBattler].item; + 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); + } + return; + } + } + } + + // setup stuff before turns/actions TryClearRageAndFuryCutter(); gCurrentTurnActionNumber = 0; gCurrentActionFuncId = gActionsByTurnOrder[0]; diff --git a/src/battle_message.c b/src/battle_message.c index 35ccc6e268..bf52cba31a 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -685,9 +685,11 @@ static const u8 sText_FairyAuraActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} static const u8 sText_AuraBreakActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} reversed all\nother POKéMON's auras!"); static const u8 sText_ComatoseActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is drowsing!"); static const u8 sText_ScreenCleanerActivates[] = _("All screens on the field were\ncleansed!"); +static const u8 sText_CanActFaster[] = _("{B_ATK_NAME_WITH_PREFIX} can act\nfaster, thanks to {B_LAST_ITEM}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_CANACTFASTERTHANKSTO - 12] = sText_CanActFaster, [STRINGID_STATWASNOTLOWERED - 12] = sText_StatWasNotLowered, [STRINGID_CLOAKEDINAFREEZINGLIGHT - 12] = sText_CloakedInAFreezingLight, [STRINGID_DESTINYKNOTACTIVATES - 12] = sText_DestinyKnotActivates, diff --git a/src/battle_util.c b/src/battle_util.c index aeeefa7347..586454efbe 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4977,7 +4977,7 @@ enum }; // second argument is 1/X of current hp compared to max hp -static bool32 HasEnoughHpToEatBerry(u32 battlerId, u32 hpFraction, u32 itemId) +bool32 HasEnoughHpToEatBerry(u32 battlerId, u32 hpFraction, u32 itemId) { bool32 isBerry = (ItemId_GetPocket(itemId) == POCKET_BERRIES); From efa4fe89adeadaaf43eb1ba59b0b1ac9999c8e16 Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 6 Jan 2021 10:47:07 -0700 Subject: [PATCH 11/39] micle berry --- data/battle_scripts_1.s | 25 ++++++++++++++++++++++++ include/battle.h | 2 +- include/battle_scripts.h | 2 ++ include/constants/battle_string_ids.h | 3 ++- src/battle_message.c | 4 +++- src/battle_script_commands.c | 9 +++++++++ src/battle_util.c | 28 +++++++++++++++++++++++++++ 7 files changed, 70 insertions(+), 3 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 28da6de0e1..c7f3cc663a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7729,3 +7729,28 @@ BattleScript_CustapBerryActivation:: waitmessage 0x40 removeitem BS_ATTACKER end2 + +BattleScript_MicleBerryActivateEnd2:: + jumpifability BS_ATTACKER, ABILITY_RIPEN, BattleScript_MicleBerryActivateEnd2_Ripen + goto BattleScript_MicleBerryActivateEnd2_Anim +BattleScript_MicleBerryActivateEnd2_Ripen: + call BattleScript_AbilityPopUp +BattleScript_MicleBerryActivateEnd2_Anim: + playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL + printstring STRINGID_MICLEBERRYACTIVATES + waitmessage 0x40 + removeitem BS_ATTACKER + end2 + +BattleScript_MicleBerryActivateRet:: + jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_MicleBerryActivateRet_Ripen + goto BattleScript_MicleBerryActivateRet_Anim +BattleScript_MicleBerryActivateRet_Ripen: + call BattleScript_AbilityPopUp +BattleScript_MicleBerryActivateRet_Anim: + playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, NULL + printstring STRINGID_MICLEBERRYACTIVATES + waitmessage 0x40 + removeitem BS_SCRIPTING + return + diff --git a/include/battle.h b/include/battle.h index a7e8f5212b..a108bac8ef 100644 --- a/include/battle.h +++ b/include/battle.h @@ -429,7 +429,7 @@ struct Illusion struct PinchBerry { - u8 micleBerry:1; + u8 micle:1; u8 custap:1; // also quick claw }; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index a5548791a2..aec8dbc6e0 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -352,5 +352,7 @@ extern const u8 BattleScript_CheekPouchActivates[]; extern const u8 BattleScript_AnnounceAirLockCloudNine[]; extern const u8 BattleScript_QuickClawActivation[]; extern const u8 BattleScript_CustapBerryActivation[]; +extern const u8 BattleScript_MicleBerryActivateEnd2[]; +extern const u8 BattleScript_MicleBerryActivateRet[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index bcb3e86786..321411cab2 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -559,8 +559,9 @@ #define STRINGID_COMATOSEENTERS 555 #define STRINGID_SCREENCLEANERENTERS 556 #define STRINGID_CANACTFASTERTHANKSTO 557 +#define STRINGID_MICLEBERRYACTIVATES 558 -#define BATTLESTRINGS_COUNT 558 +#define BATTLESTRINGS_COUNT 559 //// multichoice message IDs // switch in ability message diff --git a/src/battle_message.c b/src/battle_message.c index bf52cba31a..078175bd24 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -685,10 +685,12 @@ static const u8 sText_FairyAuraActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} static const u8 sText_AuraBreakActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} reversed all\nother POKéMON's auras!"); static const u8 sText_ComatoseActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is drowsing!"); static const u8 sText_ScreenCleanerActivates[] = _("All screens on the field were\ncleansed!"); -static const u8 sText_CanActFaster[] = _("{B_ATK_NAME_WITH_PREFIX} can act\nfaster, thanks to {B_LAST_ITEM}!"); +static const u8 sText_CanActFaster[] = _("{B_ATK_NAME_WITH_PREFIX} can act faster,\nthanks to {B_LAST_ITEM}!"); +static const u8 sText_MicleBerryActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} boosted the accuracy of its\nnext move using {B_LAST_ITEM}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_MICLEBERRYACTIVATES - 12] = sText_MicleBerryActivates, [STRINGID_CANACTFASTERTHANKSTO - 12] = sText_CanActFaster, [STRINGID_STATWASNOTLOWERED - 12] = sText_StatWasNotLowered, [STRINGID_CLOAKEDINAFREEZINGLIGHT - 12] = sText_CloakedInAFreezingLight, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index bc427698ef..48fe60aa53 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1563,6 +1563,15 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move) calc = (calc * (100 + atkParam)) / 100; else if (atkHoldEffect == HOLD_EFFECT_ZOOM_LENS && GetBattlerTurnOrderNum(battlerAtk) > GetBattlerTurnOrderNum(battlerDef)); calc = (calc * (100 + atkParam)) / 100; + + if (gBattleStruct->pinchBerry[battlerAtk].micle) + { + gBattleStruct->pinchBerry[battlerAtk].micle = FALSE; + if (atkAbility == ABILITY_RIPEN) + calc = (calc * 140) / 100; // ripen gives 40% acc boost + else + calc = (calc * 120) / 100; // 20% acc boost + } return calc; } diff --git a/src/battle_util.c b/src/battle_util.c index 586454efbe..54df2df63b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5073,6 +5073,26 @@ static u8 RandomStatRaiseBerry(u32 battlerId, u32 itemId) return 0; } +static u8 TrySetMicleBerry(u32 battlerId, u32 itemId, bool32 end2) +{ + if (HasEnoughHpToEatBerry(battlerId, 4, itemId)) + { + gBattleStruct->pinchBerry[battlerId].micle = TRUE; // battler's next attack has increased accuracy + + if (end2) + { + BattleScriptExecute(BattleScript_MicleBerryActivateEnd2); + } + else + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MicleBerryActivateRet; + } + return ITEM_EFFECT_OTHER; + } + return 0; +} + static u8 ItemHealHp(u32 battlerId, u32 itemId, bool32 end2, bool32 percentHeal) { if (HasEnoughHpToEatBerry(battlerId, 2, itemId)) @@ -5569,6 +5589,10 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) effect = ITEM_EFFECT_OTHER; } break; + case HOLD_EFFECT_MICLE_BERRY: + if (!moveTurn) + effect = TrySetMicleBerry(battlerId, gLastUsedItem, TRUE); + break; } if (effect) @@ -5595,6 +5619,10 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) battlerHoldEffect = GetBattlerHoldEffect(battlerId, TRUE); switch (battlerHoldEffect) { + case HOLD_EFFECT_MICLE_BERRY: + if (B_HP_BERRIES >= GEN_4) + effect = TrySetMicleBerry(battlerId, gLastUsedItem, FALSE); + break; case HOLD_EFFECT_RESTORE_HP: if (B_HP_BERRIES >= GEN_4) effect = ItemHealHp(battlerId, gLastUsedItem, FALSE, FALSE); From 7646855e797416de9a25a2bd76e3760432cb6b8b Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 6 Jan 2021 11:15:56 -0700 Subject: [PATCH 12/39] jaboca, rowap berry effects --- data/battle_scripts_1.s | 14 ++++++++++++++ include/battle_scripts.h | 1 + include/constants/hold_effects.h | 1 + src/battle_util.c | 19 +++++++++++++++++++ 4 files changed, 35 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c7f3cc663a..3a503315a3 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7754,3 +7754,17 @@ BattleScript_MicleBerryActivateRet_Anim: removeitem BS_SCRIPTING return +BattleScript_JabocaRowapBerryActivates:: + jumpifability BS_TARGET, ABILITY_RIPEN, BattleScript_JabocaRowapBerryActivate_Ripen + goto BattleScript_JabocaRowapBerryActivate_Anim +BattleScript_JabocaRowapBerryActivate_Ripen: + call BattleScript_AbilityPopUp +BattleScript_JabocaRowapBerryActivate_Anim: + jumpifabsent BS_TARGET, BattleScript_JabocaRowapBerryActivate_Dmg @ dont play the animation for a fainted target + playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT, NULL + waitanimation +BattleScript_JabocaRowapBerryActivate_Dmg: + call BattleScript_HurtAttacker + removeitem BS_TARGET + return + diff --git a/include/battle_scripts.h b/include/battle_scripts.h index aec8dbc6e0..4ca82e3bf6 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -354,5 +354,6 @@ extern const u8 BattleScript_QuickClawActivation[]; extern const u8 BattleScript_CustapBerryActivation[]; extern const u8 BattleScript_MicleBerryActivateEnd2[]; extern const u8 BattleScript_MicleBerryActivateRet[]; +extern const u8 BattleScript_JabocaRowapBerryActivates[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 3de2e7b43b..52a3ffda4b 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -107,6 +107,7 @@ #define HOLD_EFFECT_MICLE_BERRY 101 #define HOLD_EFFECT_JABOCA_BERRY 102 #define HOLD_EFFECT_CUSTAP_BERRY 103 +#define HOLD_EFFECT_RETALIATE_BERRY 104 // rowap, jaboca // Gen5 hold effects #define HOLD_EFFECT_FLOAT_STONE 115 diff --git a/src/battle_util.c b/src/battle_util.c index 54df2df63b..b6d83d9576 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5890,6 +5890,25 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gBattleScripting.statChanger = SET_STATCHANGER(STAT_SPATK, 1, FALSE); } break; + case HOLD_EFFECT_RETALIATE_BERRY: + if (IsBattlerAlive(battlerId) + && TARGET_TURN_DAMAGED + && !DoesSubstituteBlockMove(gBattlerAttacker, battlerId, gCurrentMove) + && GetBattleMoveSplit(gCurrentMove) == ItemId_GetHoldEffectParam(gLastUsedItem)) + { + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + if (GetBattlerAbility(battlerId) == ABILITY_RIPEN) + gBattleMoveDamage *= 2; + + effect = ITEM_HP_CHANGE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_JabocaRowapBerryActivates; + PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); + RecordItemEffectBattle(battlerId, HOLD_EFFECT_ROCKY_HELMET); + } + break; } } break; From aac3f9c3db7e53d77c5fab1d4fab9c6430aecdd0 Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 6 Jan 2021 13:07:18 -0700 Subject: [PATCH 13/39] kee, maranga, sitrus beries --- include/constants/hold_effects.h | 9 +++-- src/battle_util.c | 56 ++++++++++++++++++++++++++++++-- src/data/items.h | 4 +-- 3 files changed, 62 insertions(+), 7 deletions(-) diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 52a3ffda4b..0b3236db9f 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -105,9 +105,12 @@ #define HOLD_EFFECT_POWER_ITEM 99 #define HOLD_EFFECT_RESTORE_PCT_HP 100 #define HOLD_EFFECT_MICLE_BERRY 101 -#define HOLD_EFFECT_JABOCA_BERRY 102 -#define HOLD_EFFECT_CUSTAP_BERRY 103 -#define HOLD_EFFECT_RETALIATE_BERRY 104 // rowap, jaboca +#define HOLD_EFFECT_CUSTAP_BERRY 102 +#define HOLD_EFFECT_JABOCA_BERRY 103 +#define HOLD_EFFECT_ROWAP_BERRY 104 +#define HOLD_EFFECT_KEE_BERRY 105 +#define HOLD_EFFECT_MARANGA_BERRY 106 + // Gen5 hold effects #define HOLD_EFFECT_FLOAT_STONE 115 diff --git a/src/battle_util.c b/src/battle_util.c index 6981b811ab..b452c10b4b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5138,6 +5138,33 @@ static u8 TrySetMicleBerry(u32 battlerId, u32 itemId, bool32 end2) return 0; } +static u8 DamagedStatBoostBerryEffect(u8 battlerId, u8 statId, u8 split) +{ + if (IsBattlerAlive(battlerId) + && TARGET_TURN_DAMAGED + && gBattleMons[battlerId].statStages[statId] < MAX_STAT_STAGE + && !DoesSubstituteBlockMove(gBattlerAttacker, battlerId, gCurrentMove) + && GetBattleMoveSplit(gCurrentMove) == split) + { + + PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); + PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE); + + gEffectBattler = battlerId; + if (GetBattlerAbility(battlerId) == ABILITY_RIPEN) + SET_STATCHANGER(statId, 2, FALSE); + else + SET_STATCHANGER(statId, 1, FALSE); + + gBattleScripting.animArg1 = 0xE + statId; + gBattleScripting.animArg2 = 0; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BerryStatRaiseRet; + return ITEM_STATS_CHANGE; + } + return 0; +} + static u8 ItemHealHp(u32 battlerId, u32 itemId, bool32 end2, bool32 percentHeal) { if (HasEnoughHpToEatBerry(battlerId, 2, itemId)) @@ -5991,11 +6018,11 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gBattleScripting.statChanger = SET_STATCHANGER(STAT_SPATK, 1, FALSE); } break; - case HOLD_EFFECT_RETALIATE_BERRY: + case HOLD_EFFECT_JABOCA_BERRY: // consume and damage attacker if used physical move if (IsBattlerAlive(battlerId) && TARGET_TURN_DAMAGED && !DoesSubstituteBlockMove(gBattlerAttacker, battlerId, gCurrentMove) - && GetBattleMoveSplit(gCurrentMove) == ItemId_GetHoldEffectParam(gLastUsedItem)) + && IS_MOVE_PHYSICAL(gCurrentMove)) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; if (gBattleMoveDamage == 0) @@ -6010,6 +6037,31 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) RecordItemEffectBattle(battlerId, HOLD_EFFECT_ROCKY_HELMET); } break; + case HOLD_EFFECT_ROWAP_BERRY: // consume and damage attacker if used special move + if (IsBattlerAlive(battlerId) + && TARGET_TURN_DAMAGED + && !DoesSubstituteBlockMove(gBattlerAttacker, battlerId, gCurrentMove) + && IS_MOVE_SPECIAL(gCurrentMove)) + { + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + if (GetBattlerAbility(battlerId) == ABILITY_RIPEN) + gBattleMoveDamage *= 2; + + effect = ITEM_HP_CHANGE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_JabocaRowapBerryActivates; + PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); + RecordItemEffectBattle(battlerId, HOLD_EFFECT_ROCKY_HELMET); + } + break; + case HOLD_EFFECT_KEE_BERRY: // consume and boost defense if used physical move + effect = DamagedStatBoostBerryEffect(battlerId, STAT_DEF, SPLIT_PHYSICAL); + break; + case HOLD_EFFECT_MARANGA_BERRY: // consume and boost sp. defense if used special move + effect = DamagedStatBoostBerryEffect(battlerId, STAT_SPDEF, SPLIT_SPECIAL); + break; } } break; diff --git a/src/data/items.h b/src/data/items.h index 30beb53528..0f2e8461c6 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -1867,8 +1867,8 @@ const struct Item gItems[] = .name = _("SITRUS BERRY"), .itemId = ITEM_SITRUS_BERRY, .price = 20, - .holdEffect = HOLD_EFFECT_RESTORE_HP, - .holdEffectParam = 30, + .holdEffect = HOLD_EFFECT_RESTORE_PCT_HP, + .holdEffectParam = 25, .description = sSitrusBerryDesc, .pocket = POCKET_BERRIES, .type = 1, From 8bad377a2e9e3e078896685f82001157eaff7a0a Mon Sep 17 00:00:00 2001 From: Evan Date: Sun, 10 Jan 2021 16:57:27 -0700 Subject: [PATCH 14/39] magic room affects macho brace/power item speed drop --- 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 048ba0157b..07c39df0d4 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4251,7 +4251,7 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId) } // item effects - if (GetBattlerHoldEffect(battlerId, FALSE) == HOLD_EFFECT_MACHO_BRACE || GetBattlerHoldEffect(battlerId, FALSE) == HOLD_EFFECT_POWER_ITEM) + if (holdEffect == HOLD_EFFECT_MACHO_BRACE || holdEffect == HOLD_EFFECT_POWER_ITEM) speed /= 2; else if (holdEffect == HOLD_EFFECT_IRON_BALL) speed /= 2; From d26605c9fe124906baf58270a4e65401d01d71b8 Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 13 Jan 2021 16:01:47 -0700 Subject: [PATCH 15/39] fix bad bg fade if no permanent terrain --- data/battle_anim_scripts.s | 8 -------- data/battle_scripts_1.s | 9 +++++---- data/event_scripts.s | 1 + include/constants/battle_anim.h | 14 +++++--------- include/constants/battle_config.h | 4 ++-- src/battle_script_commands.c | 9 +++++++++ 6 files changed, 22 insertions(+), 23 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 59ab539028..24f05d6e63 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -8474,8 +8474,6 @@ Move_GRASSY_TERRAIN:: delay 4 createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 4, 0, RGB(31, 24, 31) waitforvisualfinish - restorebg - waitbgfadein end Move_MISTY_TERRAIN:: @@ -8514,8 +8512,6 @@ Move_MISTY_TERRAIN:: delay 4 createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 7, 0, RGB(31, 24, 31) waitforvisualfinish - restorebg - waitbgfadein end Move_ELECTRIFY:: @@ -9399,8 +9395,6 @@ Move_ELECTRIC_TERRAIN:: delay 2 createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 4, 0, RGB(28, 28, 0) waitforvisualfinish - restorebg - waitbgfadein end Move_DAZZLING_GLEAM:: @@ -11056,8 +11050,6 @@ Move_PSYCHIC_TERRAIN:: delay 4 createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 4, 0, RGB(27, 0, 13) waitforvisualfinish - restorebg - waitbgfadein end Move_LUNGE:: diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 5a7af4fb87..28644edf7c 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1520,6 +1520,7 @@ BattleScript_EffectPsychicTerrain: waitanimation printfromtable gTerrainStringIds waitmessage 0x40 + playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL goto BattleScript_MoveEnd BattleScript_EffectTopsyTurvy: @@ -6893,7 +6894,7 @@ BattleScript_ElectricSurgeActivates:: pause 0x20 call BattleScript_AbilityPopUp printstring STRINGID_TERRAINBECOMESELECTRIC - waitstate + waitmessage 0x40 playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL end3 @@ -6901,7 +6902,7 @@ BattleScript_MistySurgeActivates:: pause 0x20 call BattleScript_AbilityPopUp printstring STRINGID_TERRAINBECOMESMISTY - waitstate + waitmessage 0x40 playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL end3 @@ -6909,7 +6910,7 @@ BattleScript_GrassySurgeActivates:: pause 0x20 call BattleScript_AbilityPopUp printstring STRINGID_TERRAINBECOMESGRASSY - waitstate + waitmessage 0x40 playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL end3 @@ -6917,7 +6918,7 @@ BattleScript_PsychicSurgeActivates:: pause 0x20 call BattleScript_AbilityPopUp printstring STRINGID_TERRAINBECOMESPSYCHIC - waitstate + waitmessage 0x40 playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL end3 diff --git a/data/event_scripts.s b/data/event_scripts.s index 8039be6876..f22377aa27 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -2,6 +2,7 @@ #include "constants/apprentice.h" #include "constants/battle.h" #include "constants/battle_arena.h" +#include "constants/battle_config.h" #include "constants/battle_dome.h" #include "constants/battle_factory.h" #include "constants/battle_frontier.h" diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 90766f9d59..6d32abfa8c 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -518,15 +518,11 @@ #define B_ANIM_INGRAIN_HEAL 0x15 #define B_ANIM_WISH_HEAL 0x16 #define B_ANIM_MEGA_EVOLUTION 0x17 -#define B_ANIM_TERRAIN_MISTY 0x18 -#define B_ANIM_TERRAIN_GRASSY 0x19 -#define B_ANIM_TERRAIN_ELECTRIC 0x1A -#define B_ANIM_TERRAIN_PSYCHIC 0x1B -#define B_ANIM_ILLUSION_OFF 0x1C -#define B_ANIM_FORM_CHANGE 0x1D -#define B_ANIM_SLIDE_OFFSCREEN 0x1E // for Emergency Exit -#define B_ANIM_RESTORE_BG 0x1F // for Terrain Endings -#define B_ANIM_TOTEM_FLARE 0x20 // Totem boosts aura flare +#define B_ANIM_ILLUSION_OFF 0x18 +#define B_ANIM_FORM_CHANGE 0x19 +#define B_ANIM_SLIDE_OFFSCREEN 0x1A // for Emergency Exit +#define B_ANIM_RESTORE_BG 0x1B // for Terrain Endings +#define B_ANIM_TOTEM_FLARE 0x1C // Totem boosts aura flare // special animations table #define B_ANIM_LVL_UP 0x0 diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 0c063f2fbc..5b4a895f50 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -135,7 +135,7 @@ // Var Settings // To use the following features in scripting, replace the 0s with the Var ID you're assigning to it. Eg: replace VAR_UNUSED_0x40F7 with VAR_TERRAIN for that feature -#define VAR_TERRAIN 0 // If this var has a value, assigning a STATUS_FIELD_xx_TERRAIN to it before battle causes the battle to start with that terrain active +#define VAR_TERRAIN VAR_UNUSED_0x40F7 // If this var has a value, assigning a STATUS_FIELD_xx_TERRAIN to it before battle causes the battle to start with that terrain active // Interface settings #define B_ABILITY_POP_UP TRUE // In Gen5+, the Pokémon abilities are displayed in a pop-up, when they activate in battle. @@ -173,7 +173,7 @@ #define B_NEW_SURF_PARTICLE_PALETTE TRUE // If set to TRUE, it updates Surf's wave palette. #define 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_TERRAIN_BG_CHANGE FALSE // 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_script_commands.c b/src/battle_script_commands.c index 6c5f37a7d4..c86691cd89 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4403,6 +4403,15 @@ static void Cmd_playanimation(void) gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); argumentPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3); + + #if B_TERRAIN_BG_CHANGE == FALSE + if (gBattlescriptCurrInstr[2] == B_ANIM_RESTORE_BG) + { + // workaround for .if not working + gBattlescriptCurrInstr += 7; + return; + } + #endif if (gBattlescriptCurrInstr[2] == B_ANIM_STATS_CHANGE || gBattlescriptCurrInstr[2] == B_ANIM_SNATCH_MOVE From d571c8b02806dcaa265e743e27e956ef02e2adaf Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 13 Jan 2021 16:02:32 -0700 Subject: [PATCH 16/39] B_TERRAIN_BG_CHANGE TRUE by default --- 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 5b4a895f50..42eeb592aa 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -173,7 +173,7 @@ #define B_NEW_SURF_PARTICLE_PALETTE TRUE // If set to TRUE, it updates Surf's wave palette. #define HIDE_HEALTHBOXES_DURING_ANIMS TRUE // If set to TRUE, hides healthboxes during move animations -#define B_TERRAIN_BG_CHANGE FALSE // If set to TRUE, terrain moves permanently change the default battle background until the effect fades. +#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 From 544d59850648b7fac42c4a3da64f18515f6fd1bc Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 15 Jan 2021 18:34:47 -0700 Subject: [PATCH 17/39] update tailwind timer --- 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 2c179f9d5d..c249c19164 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -112,6 +112,7 @@ #define B_PP_REDUCED_BY_SPITE GEN_6 // In Gen4+, Spite reduces the foe's last move's PP by 4, instead of 2 to 5. #define B_CAN_SPITE_FAIL GEN_6 // 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_6 // In Gen4+, The user of Jump Kick or Hi Jump Kick will "keep going and crash" if it attacks a target that is immune to the move. +#define B_TAILWIND_TIMER GEN_5 // In Gen5+, Tailwind lasts 4 turns instead of 3. // Ability settings #define B_ABILITY_WEATHER GEN_6 // In Gen6+, ability-induced weather lasts 5 turns. Before, it lasted until the battle ended or until it was changed by a move. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6c5f37a7d4..7b03fdc951 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10208,7 +10208,7 @@ static void Cmd_settailwind(void) { gSideStatuses[side] |= SIDE_STATUS_TAILWIND; gSideTimers[side].tailwindBattlerId = gBattlerAttacker; - gSideTimers[side].tailwindTimer = 3; + gSideTimers[side].tailwindTimer = (B_TAILWIND_TIMER >= GEN_5) ? 4 : 3; gBattlescriptCurrInstr += 5; } else From b576eb5247d84e98781da7bf463e5ed82d94ab0f Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 19 Jan 2021 13:26:36 -0700 Subject: [PATCH 18/39] fix var_terrain default, wording --- include/constants/battle_config.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 42eeb592aa..b192db7cfa 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -134,8 +134,9 @@ #define B_FLAG_FORCE_DOUBLE_WILD 0 // If this flag is set, all land and surfing wild battles will be double battles. // Var Settings -// To use the following features in scripting, replace the 0s with the Var ID you're assigning to it. Eg: replace VAR_UNUSED_0x40F7 with VAR_TERRAIN for that feature -#define VAR_TERRAIN VAR_UNUSED_0x40F7 // If this var has a value, assigning a STATUS_FIELD_xx_TERRAIN to it before battle causes the battle to start with that terrain active +// To use the following features in scripting, replace the 0s with the var ID you're assigning it to. +// Eg: Replace with VAR_UNUSED_0x40F7 so you can use VAR_TERRAIN for that feature. +#define VAR_TERRAIN 0 // If this var has a value, assigning a STATUS_FIELD_xx_TERRAIN to it before battle causes the battle to start with that terrain active // Interface settings #define B_ABILITY_POP_UP TRUE // In Gen5+, the Pokémon abilities are displayed in a pop-up, when they activate in battle. From 9d9da6a485cf5176b920debf80046f8d73045352 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Tue, 19 Jan 2021 15:01:51 -0700 Subject: [PATCH 19/39] Update include/constants/battle_config.h Co-authored-by: ultima-soul <33333039+ultima-soul@users.noreply.github.com> --- 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 b192db7cfa..8d3f48080a 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -136,7 +136,7 @@ // Var Settings // To use the following features in scripting, replace the 0s with the var ID you're assigning it to. // Eg: Replace with VAR_UNUSED_0x40F7 so you can use VAR_TERRAIN for that feature. -#define VAR_TERRAIN 0 // If this var has a value, assigning a STATUS_FIELD_xx_TERRAIN to it before battle causes the battle to start with that terrain active +#define VAR_TERRAIN 0 // If this var has a value, assigning a STATUS_FIELD_xx_TERRAIN to it before battle causes the battle to start with that terrain active // Interface settings #define B_ABILITY_POP_UP TRUE // In Gen5+, the Pokémon abilities are displayed in a pop-up, when they activate in battle. From bfb7333507ab825a6cd116acf30de4d7a74c2e22 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 21 Jan 2021 12:03:30 -0700 Subject: [PATCH 20/39] memento gen4 failing --- include/constants/battle_config.h | 1 + src/battle_script_commands.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index f7b38000c2..5e0491b610 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -112,6 +112,7 @@ #define B_PP_REDUCED_BY_SPITE GEN_6 // In Gen4+, Spite reduces the foe's last move's PP by 4, instead of 2 to 5. #define B_CAN_SPITE_FAIL GEN_6 // 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_6 // In Gen4+, The user of Jump Kick or Hi Jump Kick will "keep going and crash" if it attacks a target that is immune to the move. +#define B_MEMENTO_FAIL GEN_4 // 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 // Ability settings #define B_ABILITY_WEATHER GEN_6 // In Gen6+, ability-induced weather lasts 5 turns. Before, it lasted until the battle ended or until it was changed by a move. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6c5f37a7d4..4eb6aaf091 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10952,9 +10952,16 @@ static void Cmd_sethail(void) static void Cmd_jumpifattackandspecialattackcannotfall(void) // memento { + #if B_MEMENTO_FAIL == GEN_3 if (gBattleMons[gBattlerTarget].statStages[STAT_ATK] == MIN_STAT_STAGE && gBattleMons[gBattlerTarget].statStages[STAT_SPATK] == MIN_STAT_STAGE && gBattleCommunication[6] != 1) + #else + if (gBattleCommunication[6] != 1 + || gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE + || IsBattlerProtected(gBattlerTarget, gCurrentMove) + || DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + #endif { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } From 5aff5333dc76794f84469882c06e8cab8fb37c10 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 21 Jan 2021 12:05:01 -0700 Subject: [PATCH 21/39] fix B_MEMENTO_FAIL comment --- 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 5e0491b610..ef9405cc5a 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -112,7 +112,7 @@ #define B_PP_REDUCED_BY_SPITE GEN_6 // In Gen4+, Spite reduces the foe's last move's PP by 4, instead of 2 to 5. #define B_CAN_SPITE_FAIL GEN_6 // 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_6 // In Gen4+, The user of Jump Kick or Hi Jump Kick will "keep going and crash" if it attacks a target that is immune to the move. -#define B_MEMENTO_FAIL GEN_4 // 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_MEMENTO_FAIL GEN_4 // 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 // Ability settings #define B_ABILITY_WEATHER GEN_6 // In Gen6+, ability-induced weather lasts 5 turns. Before, it lasted until the battle ended or until it was changed by a move. From f428e5e2dcbb8f03c2deed7a4a5802004206a804 Mon Sep 17 00:00:00 2001 From: Evan Date: Sun, 31 Jan 2021 23:31:27 -0700 Subject: [PATCH 22/39] some quick claw/custap berry fixes --- data/battle_scripts_1.s | 4 ++++ include/battle.h | 10 ++-------- src/battle_main.c | 14 ++++++++------ src/battle_script_commands.c | 4 ++-- src/battle_util.c | 2 +- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4d3ef6c949..eab1de1693 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7853,6 +7853,8 @@ BattleScript_AnnounceAirLockCloudNine:: end3 BattleScript_QuickClawActivation:: + printstring STRINGID_EMPTYSTRING3 + waitmessage 0x1 playanimation BS_ATTACKER, B_ANIM_FOCUS_PUNCH_SETUP, NULL waitanimation printstring STRINGID_CANACTFASTERTHANKSTO @@ -7860,6 +7862,8 @@ BattleScript_QuickClawActivation:: end2 BattleScript_CustapBerryActivation:: + printstring STRINGID_EMPTYSTRING3 + waitmessage 0x1 playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL waitanimation printstring STRINGID_CANACTFASTERTHANKSTO diff --git a/include/battle.h b/include/battle.h index 8e1970d461..494e92b14e 100644 --- a/include/battle.h +++ b/include/battle.h @@ -140,6 +140,8 @@ struct ProtectStruct u32 usedGravityPreventedMove:1; u32 powderSelfDmg:1; u32 usedThroatChopPreventedMove:1; + u32 micle:1; + u32 custap:1; // also quick claw u32 physicalDmg; u32 specialDmg; u8 physicalBattlerId; @@ -427,13 +429,6 @@ struct Illusion struct Pokemon *mon; }; -struct PinchBerry -{ - u8 micle:1; - u8 custap:1; // also quick claw - -}; - struct BattleStruct { u8 turnEffectsTracker; @@ -549,7 +544,6 @@ struct BattleStruct u8 sameMoveTurns[MAX_BATTLERS_COUNT]; // For Metronome, number of times the same moves has been SUCCESFULLY used. u16 moveEffect2; // For Knock Off u16 changedSpecies[PARTY_SIZE]; // For Zygarde or future forms when multiple mons can change into the same pokemon. - struct PinchBerry pinchBerry[MAX_BATTLERS_COUNT]; u8 quickClawBattlerId; }; diff --git a/src/battle_main.c b/src/battle_main.c index d069c3a4e5..e0ae096811 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4353,7 +4353,7 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) || (!IsAbilityOnOpposingSide(battler1, ABILITY_UNNERVE) && holdEffectBattler1 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler1, 4, gBattleMons[battler1].item))) - gBattleStruct->pinchBerry[battler1].custap = TRUE; + gProtectStructs[battler1].custap = TRUE; speedBattler2 = GetBattlerTotalSpeedStat(battler2); holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); @@ -4361,7 +4361,7 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) || (!IsAbilityOnOpposingSide(battler2, ABILITY_UNNERVE) && holdEffectBattler2 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler2, 4, gBattleMons[battler2].item))) - gBattleStruct->pinchBerry[battler2].custap = TRUE; + gProtectStructs[battler2].custap = TRUE; if (!ignoreChosenMoves) { @@ -4377,9 +4377,9 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) // LAGGING TAIL - always last // STALL - always last - if (gBattleStruct->pinchBerry[battler1].custap && !gBattleStruct->pinchBerry[battler2].custap) + if (gProtectStructs[battler1].custap && !gProtectStructs[battler2].custap) strikesFirst = 0; - else if (gBattleStruct->pinchBerry[battler2].custap && !gBattleStruct->pinchBerry[battler1].custap) + else if (gProtectStructs[battler2].custap && !gProtectStructs[battler1].custap) strikesFirst = 1; else if (holdEffectBattler1 == HOLD_EFFECT_LAGGING_TAIL && holdEffectBattler2 != HOLD_EFFECT_LAGGING_TAIL) strikesFirst = 1; @@ -4630,12 +4630,14 @@ static void CheckQuickClaw_CustapBerryActivation(void) { gActiveBattler = gBattlerAttacker = gBattleStruct->quickClawBattlerId; gBattleStruct->quickClawBattlerId++; - if (gBattleStruct->pinchBerry[gActiveBattler].custap + if (gChosenActionByBattler[gActiveBattler] == B_ACTION_USE_MOVE + && gChosenMoveByBattler[gActiveBattler] != MOVE_FOCUS_PUNCH // quick claw message doesn't need to activate here + && gProtectStructs[gActiveBattler].custap && !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) && !(gDisableStructs[gBattlerAttacker].truantCounter) && !(gProtectStructs[gActiveBattler].noValidMoves)) { - gBattleStruct->pinchBerry[gActiveBattler].custap = FALSE; + gProtectStructs[gActiveBattler].custap = 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 450ee74ebd..cd8ac212c7 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1564,9 +1564,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 (gBattleStruct->pinchBerry[battlerAtk].micle) + if (gProtectStructs[battlerAtk].micle) { - gBattleStruct->pinchBerry[battlerAtk].micle = FALSE; + gProtectStructs[battlerAtk].micle = 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 6568ae2e44..fc9b4cab65 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5221,7 +5221,7 @@ static u8 TrySetMicleBerry(u32 battlerId, u32 itemId, bool32 end2) { if (HasEnoughHpToEatBerry(battlerId, 4, itemId)) { - gBattleStruct->pinchBerry[battlerId].micle = TRUE; // battler's next attack has increased accuracy + gProtectStructs[battlerId].micle = TRUE; // battler's next attack has increased accuracy if (end2) { From f4d4cf262e2a7c408444ae79083bb31a92a1cdd1 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 2 Feb 2021 09:00:07 -0700 Subject: [PATCH 23/39] fix screen cleaner, curious medicine, as one --- data/battle_scripts_1.s | 23 ++++++++++++++++++++++ include/battle.h | 1 + include/battle_script_commands.h | 2 +- include/battle_scripts.h | 2 ++ include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 2 +- src/battle_interface.c | 3 +++ src/battle_message.c | 5 +++-- src/battle_script_commands.c | 22 +++++++++++++++++---- src/battle_util.c | 12 ++++++++--- 10 files changed, 62 insertions(+), 11 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index d1d867ae01..297cd4159a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6628,6 +6628,7 @@ BattleScript_AbilityPopUp: showabilitypopup BS_ABILITY_BATTLER recordability BS_ABILITY_BATTLER pause 40 + sethword sABILITY_OVERWRITE, 0 return BattleScript_SpeedBoostActivates:: @@ -7219,6 +7220,16 @@ BattleScript_WeakArmorSpeedAnim: BattleScript_WeakArmorActivatesEnd: return +BattleScript_RaiseStatOnFaintingTarget:: + copybyte gBattlerAbility, gBattlerAttacker + call BattleScript_AbilityPopUp + setgraphicalstatchangevalues + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + waitanimation + printstring STRINGID_LASTABILITYRAISEDSTAT + waitmessage 0x40 + return + BattleScript_AttackerAbilityStatRaise:: copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp @@ -7248,6 +7259,18 @@ BattleScript_SwitchInAbilityMsg:: printfromtable gSwitchInAbilityStringIds waitmessage 0x40 end3 + +BattleScript_ActivateAsOne:: + call BattleScript_AbilityPopUp + printfromtable gSwitchInAbilityStringIds + waitmessage 0x40 + @ show unnerve + sethword sABILITY_OVERWRITE, ABILITY_UNNERVE + setbyte cMULTISTRING_CHOOSER, MULTI_SWITCHIN_UNNERVE + call BattleScript_AbilityPopUp + printfromtable gSwitchInAbilityStringIds + waitmessage 0x40 + end3 BattleScript_FriskMsgWithPopup:: copybyte gBattlerAbility, gBattlerAttacker diff --git a/include/battle.h b/include/battle.h index 5917a4ab3a..326616e385 100644 --- a/include/battle.h +++ b/include/battle.h @@ -613,6 +613,7 @@ struct BattleScripting u16 multihitMoveEffect; u8 illusionNickHack; // To properly display nick in STRINGID_ENEMYABOUTTOSWITCHPKMN. bool8 fixedPopup; // force ability popup to stick until manually called back + u16 abilityPopupOverwrite; }; // rom_80A5C6C diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 14ed1ebb87..ff35570088 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -26,7 +26,7 @@ u32 IsFlowerVeilProtected(u32 battler); u32 IsLeafGuardProtected(u32 battler); bool32 IsShieldsDownProtected(u32 battler); u32 IsAbilityStatusProtected(u32 battler); -void ResetBattlerStatChanges(u8 battler); +bool32 TryResetBattlerStatChanges(u8 battler); extern void (* const gBattleScriptingCommandsTable[])(void); extern const u8 gBattlePalaceNatureToMoveGroupLikelihood[NUM_NATURES][4]; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 009590f3a3..0461721699 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -357,5 +357,7 @@ extern const u8 BattleScript_CottonDownActivates[]; extern const u8 BattleScript_BallFetch[]; extern const u8 BattleScript_SandSpitActivates[]; extern const u8 BattleScript_PerishBodyActivates[]; +extern const u8 BattleScript_ActivateAsOne[]; +extern const u8 BattleScript_RaiseStatOnFaintingTarget[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 5ddda25588..0b8b84d7c3 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -36,6 +36,7 @@ #define sMULTIHIT_EFFECT gBattleScripting + 0x30 #define sILLUSION_NICK_HACK gBattleScripting + 0x32 #define sFIXED_ABILITY_POPUP gBattleScripting + 0x33 +#define sABILITY_OVERWRITE gBattleScripting + 0x34 #define cMULTISTRING_CHOOSER gBattleCommunication + 5 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 453c122c04..9821e6df33 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -470,7 +470,7 @@ #define STRINGID_FRISKACTIVATES 466 #define STRINGID_UNNERVEENTERS 467 #define STRINGID_HARVESTBERRY 468 -#define STRINGID_MOXIEATKRISE 469 +#define STRINGID_LASTABILITYRAISEDSTAT 469 #define STRINGID_MAGICBOUNCEACTIVATES 470 #define STRINGID_PROTEANTYPECHANGE 471 #define STRINGID_SYMBIOSISITEMPASS 472 diff --git a/src/battle_interface.c b/src/battle_interface.c index a77aacde5d..d68c15e870 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -3018,6 +3018,9 @@ void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle) if (!B_ABILITY_POP_UP) return; + + if (gBattleScripting.abilityPopupOverwrite != 0) + ability = gBattleScripting.abilityPopupOverwrite; if (!gBattleStruct->activeAbilityPopUps) { diff --git a/src/battle_message.c b/src/battle_message.c index 2cacbd1276..abc74ef593 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -601,7 +601,7 @@ static const u8 sText_SnowWarningHail[] = _("It started to hail!"); static const u8 sText_FriskActivates[] = _("{B_ATK_NAME_WITH_PREFIX} frisked {B_DEF_NAME_WITH_PREFIX} and\nfound its {B_LAST_ITEM}!"); static const u8 sText_UnnerveEnters[] = _("The opposing team is too nervous\nto eat Berries!"); static const u8 sText_HarvestBerry[] = _("{B_ATK_NAME_WITH_PREFIX} harvested\nits {B_LAST_ITEM}!"); -static const u8 sText_MoxieAtkRise[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} raised its Attack!"); +static const u8 sText_LastAbilityRaisedBuff1[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_LAST_ABILITY}\nraised its {B_BUFF1}!"); static const u8 sText_MagicBounceActivates[] = _("The {B_DEF_NAME_WITH_PREFIX} bounced the\n{B_ATK_NAME_WITH_PREFIX} back!"); static const u8 sText_ProteanTypeChange[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} transformed\nit into the {B_BUFF1} type!"); static const u8 sText_SymbiosisItemPass[] = _("{B_ATK_NAME_WITH_PREFIX} passed its {B_LAST_ITEM}\nto {B_SCR_ACTIVE_NAME_WITH_PREFIX} through {B_ATK_ABILITY}!"); @@ -1189,7 +1189,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_FRISKACTIVATES - 12] = sText_FriskActivates, [STRINGID_UNNERVEENTERS - 12] = sText_UnnerveEnters, [STRINGID_HARVESTBERRY - 12] = sText_HarvestBerry, - [STRINGID_MOXIEATKRISE - 12] = sText_MoxieAtkRise, + [STRINGID_LASTABILITYRAISEDSTAT - 12] = sText_LastAbilityRaisedBuff1, [STRINGID_MAGICBOUNCEACTIVATES - 12] = sText_MagicBounceActivates, [STRINGID_PROTEANTYPECHANGE - 12] = sText_ProteanTypeChange, [STRINGID_SYMBIOSISITEMPASS - 12] = sText_SymbiosisItemPass, @@ -1292,6 +1292,7 @@ const u16 gSwitchInAbilityStringIds[] = [MULTI_SWITCHIN_COMATOSE] = STRINGID_COMATOSEENTERS, [MULTI_SWITCHIN_SCREENCLEANER] = STRINGID_SCREENCLEANERENTERS, [MULTI_SWITCHIN_ASONE] = STRINGID_ASONEENTERS, + [MULTI_SWITCHIN_CURIOUS_MEDICINE] = STRINGID_CURIOUSMEDICINEENTERS, }; const u16 gMissStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e67d56b612..233efd9d3b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7534,7 +7534,10 @@ static void Cmd_various(void) SET_STATCHANGER(STAT_ATK, 1, FALSE); PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); BattleScriptPush(gBattlescriptCurrInstr + 3); - gBattlescriptCurrInstr = BattleScript_AttackerAbilityStatRaise; + gLastUsedAbility = GetBattlerAbility(gActiveBattler); + if (GetBattlerAbility(gActiveBattler) == ABILITY_AS_ONE_ICE_RIDER) + gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_CHILLING_NEIGH; + gBattlescriptCurrInstr = BattleScript_RaiseStatOnFaintingTarget; return; } break; @@ -7549,7 +7552,10 @@ static void Cmd_various(void) SET_STATCHANGER(STAT_SPATK, 1, FALSE); PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); BattleScriptPush(gBattlescriptCurrInstr + 3); - gBattlescriptCurrInstr = BattleScript_AttackerAbilityStatRaise; + gLastUsedAbility = GetBattlerAbility(gActiveBattler); + if (GetBattlerAbility(gActiveBattler) == ABILITY_AS_ONE_SHADOW_RIDER) + gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_GRIM_NEIGH; + gBattlescriptCurrInstr = BattleScript_RaiseStatOnFaintingTarget; return; } break; @@ -9104,14 +9110,22 @@ static void Cmd_statbuffchange(void) gBattlescriptCurrInstr = jumpPtr; } -void ResetBattlerStatChanges(u8 battler) +bool32 TryResetBattlerStatChanges(u8 battler) { u32 j; + bool32 ret = FALSE; gDisableStructs[battler].stockpileDef = 0; gDisableStructs[battler].stockpileSpDef = 0; for (j = 0; j < NUM_BATTLE_STATS; j++) + { + if (gBattleMons[battler].statStages[j] != DEFAULT_STAT_STAGE) + ret = TRUE; // returns TRUE if any stat was reset + gBattleMons[battler].statStages[j] = DEFAULT_STAT_STAGE; + } + + return ret; } static void Cmd_normalisebuffs(void) // haze @@ -9119,7 +9133,7 @@ static void Cmd_normalisebuffs(void) // haze s32 i, j; for (i = 0; i < gBattlersCount; i++) - ResetBattlerStatChanges(i); + TryResetBattlerStatChanges(i); gBattlescriptCurrInstr++; } diff --git a/src/battle_util.c b/src/battle_util.c index c6115735e6..652fc8f499 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3714,16 +3714,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move { gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_ASONE; gSpecialStatuses[battler].switchInAbilityDone = 1; - BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + BattleScriptPushCursorAndCallback(BattleScript_ActivateAsOne); effect++; } break; case ABILITY_CURIOUS_MEDICINE: - if (!gSpecialStatuses[battler].switchInAbilityDone && IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + if (!gSpecialStatuses[battler].switchInAbilityDone && IsDoubleBattle() + && IsBattlerAlive(BATTLE_PARTNER(battler)) && TryResetBattlerStatChanges(BATTLE_PARTNER(battler))) { u32 i; gEffectBattler = BATTLE_PARTNER(battler); - ResetBattlerStatChanges(gEffectBattler); gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_CURIOUS_MEDICINE; gSpecialStatuses[battler].switchInAbilityDone = 1; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); @@ -7998,6 +7998,9 @@ static bool32 TryRemoveScreens(u8 battler) if (gSideStatuses[battlerSide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL)) { gSideStatuses[battlerSide] &= ~(SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL); + gSideTimers[battlerSide].reflectTimer = 0; + gSideTimers[battlerSide].lightscreenTimer = 0; + gSideTimers[battlerSide].auroraVeilTimer = 0; removed = TRUE; } @@ -8005,6 +8008,9 @@ static bool32 TryRemoveScreens(u8 battler) if (gSideStatuses[enemySide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL)) { gSideStatuses[enemySide] &= ~(SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL); + gSideTimers[enemySide].reflectTimer = 0; + gSideTimers[enemySide].lightscreenTimer = 0; + gSideTimers[enemySide].auroraVeilTimer = 0; removed = TRUE; } From 6139b12a49a69d5933aa971913a8a61541d5a957 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 2 Feb 2021 23:30:08 -0700 Subject: [PATCH 24/39] fix hp boxes not dissapearing --- include/battle_interface.h | 2 +- src/battle_anim.c | 26 ++++++++++++++++++++++++-- src/battle_anim_throw.c | 6 +++--- src/battle_interface.c | 37 ++----------------------------------- 4 files changed, 30 insertions(+), 41 deletions(-) diff --git a/include/battle_interface.h b/include/battle_interface.h index d06c44e884..0bcadaaacb 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -74,7 +74,7 @@ void SetHealthboxSpriteInvisible(u8 healthboxSpriteId); void SetHealthboxSpriteVisible(u8 healthboxSpriteId); void DestoryHealthboxSprite(u8 healthboxSpriteId); void DummyBattleInterfaceFunc(u8 healthboxSpriteId, bool8 isDoubleBattleBankOnly); -void UpdateOamPriorityInAllHealthboxes(u8 priority); +void UpdateOamPriorityInAllHealthboxes(u8 priority, bool32 hideHpBoxes); void InitBattlerHealthboxCoords(u8 battler); void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent); void SwapHpBarsWithHpText(void); diff --git a/src/battle_anim.c b/src/battle_anim.c index cb7ea5bea0..f20d30dabb 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -18,6 +18,7 @@ #include "task.h" #include "constants/battle_anim.h" #include "constants/battle_config.h" +#include "constants/battle_moves.h" #define ANIM_SPRITE_INDEX_COUNT 8 @@ -2198,11 +2199,32 @@ void DoMoveAnim(u16 move) void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMoveAnim) { s32 i; + bool32 hideHpBoxes = (tableId == MOVE_TRANSFORM) ? FALSE : TRUE; + + if (!isMoveAnim) + { + switch (tableId) + { + case B_ANIM_TURN_TRAP: + case B_ANIM_LEECH_SEED_DRAIN: + case B_ANIM_MON_HIT: + case B_ANIM_SNATCH_MOVE: + case B_ANIM_FUTURE_SIGHT_HIT: + case B_ANIM_DOOM_DESIRE_HIT: + case B_ANIM_WISH_HEAL: + case B_ANIM_MEGA_EVOLUTION: + hideHpBoxes = TRUE; + break; + default: + hideHpBoxes = FALSE; + break; + } + } if (!IsContest()) { sub_80A8278(); - UpdateOamPriorityInAllHealthboxes(0); + UpdateOamPriorityInAllHealthboxes(0, hideHpBoxes); for (i = 0; i < MAX_BATTLERS_COUNT; i++) { if (GetBattlerSide(i) != B_SIDE_PLAYER) @@ -2511,7 +2533,7 @@ static void ScriptCmd_end(void) if (!IsContest()) { sub_80A8278(); - UpdateOamPriorityInAllHealthboxes(1); + UpdateOamPriorityInAllHealthboxes(1, TRUE); } gAnimScriptActive = FALSE; } diff --git a/src/battle_anim_throw.c b/src/battle_anim_throw.c index cd686af5ca..869daf030f 100755 --- a/src/battle_anim_throw.c +++ b/src/battle_anim_throw.c @@ -1332,7 +1332,7 @@ static void SpriteCB_Ball_Capture_Step(struct Sprite *sprite) else if (sprite->sTimer == 95) { gDoingBattleAnim = FALSE; - UpdateOamPriorityInAllHealthboxes(1); + UpdateOamPriorityInAllHealthboxes(1, FALSE); m4aMPlayAllStop(); PlaySE(MUS_RG_CAUGHT_INTRO); } @@ -1515,7 +1515,7 @@ static void SpriteCB_Ball_Release_Wait(struct Sprite *sprite) sprite->sFrame = 0; sprite->callback = DestroySpriteAfterOneFrame; gDoingBattleAnim = 0; - UpdateOamPriorityInAllHealthboxes(1); + UpdateOamPriorityInAllHealthboxes(1, FALSE); } } @@ -1557,7 +1557,7 @@ static void SpriteCB_Ball_Block_Step(struct Sprite *sprite) sprite->sFrame = 0; sprite->callback = DestroySpriteAfterOneFrame; gDoingBattleAnim = 0; - UpdateOamPriorityInAllHealthboxes(1); + UpdateOamPriorityInAllHealthboxes(1, FALSE); } } diff --git a/src/battle_interface.c b/src/battle_interface.c index 73b66a7ff0..9cf708f37a 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -944,39 +944,6 @@ static void TryToggleHealboxVisibility(u8 priority, u8 healthboxLeftSpriteId, u8 u8 spriteIds[4] = {healthboxLeftSpriteId, healthboxRightSpriteId, healthbarSpriteId, indicatorSpriteId}; int i; - switch (gBattleResources->bufferA[gBattleAnimAttacker][0]) - { - case CONTROLLER_MOVEANIMATION: - if (gBattleResources->bufferA[gBattleAnimAttacker][1] == MOVE_TRANSFORM) - return; - break; - case CONTROLLER_BALLTHROWANIM: - return; //throwing ball does not hide hp boxes - case CONTROLLER_BATTLEANIMATION: - //check special anims that hide health boxes - switch (gBattleResources->bufferA[gBattleAnimAttacker][1]) - { - case B_ANIM_TURN_TRAP: - case B_ANIM_LEECH_SEED_DRAIN: - case B_ANIM_MON_HIT: - case B_ANIM_SNATCH_MOVE: - case B_ANIM_FUTURE_SIGHT_HIT: - case B_ANIM_DOOM_DESIRE_HIT: - case B_ANIM_WISH_HEAL: - //new - case B_ANIM_MEGA_EVOLUTION: - case B_ANIM_TERRAIN_MISTY: - case B_ANIM_TERRAIN_GRASSY: - case B_ANIM_TERRAIN_ELECTRIC: - case B_ANIM_TERRAIN_PSYCHIC: - break; - } - return; //all other special anims dont hide - default: - return; - } - - // if we've reached here, we should hide hp boxes for (i = 0; i < NELEMS(spriteIds); i++) { if (spriteIds[i] == 0xFF) @@ -994,7 +961,7 @@ static void TryToggleHealboxVisibility(u8 priority, u8 healthboxLeftSpriteId, u8 } } -void UpdateOamPriorityInAllHealthboxes(u8 priority) +void UpdateOamPriorityInAllHealthboxes(u8 priority, bool32 hideHPBoxes) { s32 i; @@ -1012,7 +979,7 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority) gSprites[indicatorSpriteId].oam.priority = priority; #if B_HIDE_HEALTHBOXES_DURING_ANIMS - if (IsBattlerAlive(i)) + if (hideHPBoxes && IsBattlerAlive(i)) TryToggleHealboxVisibility(priority, healthboxLeftSpriteId, healthboxRightSpriteId, healthbarSpriteId, indicatorSpriteId); #endif } From 5e8c8a6aaf8b565072556e8b38e9905c34baa39e Mon Sep 17 00:00:00 2001 From: Evan Date: Sun, 7 Feb 2021 12:05:55 -0700 Subject: [PATCH 25/39] fix ghost types unable to escape from mean look/trap --- src/battle_util.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 8c55ba7ca5..3aa869fadf 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5071,10 +5071,16 @@ u32 IsAbilityPreventingEscape(u32 battlerId) bool32 CanBattlerEscape(u32 battlerId) // no ability check { - return (GetBattlerHoldEffect(battlerId, TRUE) == HOLD_EFFECT_SHED_SHELL - || !((gBattleMons[battlerId].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) - || (gStatuses3[battlerId] & STATUS3_ROOTED) - || gFieldStatuses & STATUS_FIELD_FAIRY_LOCK)); + if (GetBattlerHoldEffect(battlerId, TRUE) == HOLD_EFFECT_SHED_SHELL) + return TRUE; + else if ((B_GHOSTS_ESCAPE >= GEN_6 && !IS_BATTLER_OF_TYPE(battlerId, TYPE_GHOST)) && gBattleMons[battlerId].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) + return FALSE; + else if (gStatuses3[battlerId] & STATUS3_ROOTED) + return FALSE; + else if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) + return FALSE; + else + return TRUE; } void BattleScriptExecute(const u8 *BS_ptr) From 2b90c0b94557d88a575f096752715d122fa33c74 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Fri, 19 Feb 2021 13:57:29 +1300 Subject: [PATCH 26/39] Fix Spiky Shield/Jump Kick bug Spiky Shield no longer tries to hurt a Pokemon that has already fainted. Previously this would freeze the game if Jump Kick recoil fainted a Pokemon due to the target using Spiky Shield. --- 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 b7be704299..e683265834 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7293,6 +7293,7 @@ BattleScript_RockyHelmetActivatesDmg: return BattleScript_SpikyShieldEffect:: + jumpifabsent BS_ATTACKER, BattleScript_SpikyShieldRet orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT healthbarupdate BS_ATTACKER @@ -7300,6 +7301,7 @@ BattleScript_SpikyShieldEffect:: printstring STRINGID_PKMNHURTSWITH waitmessage 0x40 tryfaintmon BS_ATTACKER, FALSE, NULL +BattleScript_SpikyShieldRet:: return BattleScript_KingsShieldEffect:: From 3a30fe900ab2d7ce822e9c99de6092a7ebe28804 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Wed, 3 Mar 2021 09:13:49 -0700 Subject: [PATCH 27/39] Update include/constants/hold_effects.h Co-authored-by: ultima-soul <33333039+ultima-soul@users.noreply.github.com> --- include/constants/hold_effects.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 0b3236db9f..f4c810d960 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -111,7 +111,6 @@ #define HOLD_EFFECT_KEE_BERRY 105 #define HOLD_EFFECT_MARANGA_BERRY 106 - // Gen5 hold effects #define HOLD_EFFECT_FLOAT_STONE 115 #define HOLD_EFFECT_EVIOLITE 116 From 63b1a02c286d9bd6ed99971bb3111cbb288ed0fa Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Wed, 3 Mar 2021 09:13:56 -0700 Subject: [PATCH 28/39] Update src/battle_util.c Co-authored-by: ultima-soul <33333039+ultima-soul@users.noreply.github.com> --- src/battle_util.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index b9db48f795..3477e83eb4 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5107,7 +5107,6 @@ enum bool32 HasEnoughHpToEatBerry(u32 battlerId, u32 hpFraction, u32 itemId) { bool32 isBerry = (ItemId_GetPocket(itemId) == POCKET_BERRIES); - if (gBattleMons[battlerId].hp == 0) return FALSE; // Unnerve prevents consumption of opponents' berries. From bcb6fe154b82418fc87f7a5610d2939eeab90b5f Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Wed, 3 Mar 2021 09:14:00 -0700 Subject: [PATCH 29/39] Update src/battle_main.c Co-authored-by: ultima-soul <33333039+ultima-soul@users.noreply.github.com> --- src/battle_main.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index e0ae096811..4b3fc53dde 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4631,11 +4631,11 @@ static void CheckQuickClaw_CustapBerryActivation(void) gActiveBattler = gBattlerAttacker = gBattleStruct->quickClawBattlerId; 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 - && !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) - && !(gDisableStructs[gBattlerAttacker].truantCounter) - && !(gProtectStructs[gActiveBattler].noValidMoves)) + && gChosenMoveByBattler[gActiveBattler] != MOVE_FOCUS_PUNCH // quick claw message doesn't need to activate here + && gProtectStructs[gActiveBattler].custap + && !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) + && !(gDisableStructs[gBattlerAttacker].truantCounter) + && !(gProtectStructs[gActiveBattler].noValidMoves)) { gProtectStructs[gActiveBattler].custap = FALSE; gLastUsedItem = gBattleMons[gActiveBattler].item; From 0ee9425599768946039528f831bd395ddf1574b8 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Wed, 3 Mar 2021 09:14:07 -0700 Subject: [PATCH 30/39] Update include/battle_scripts.h Co-authored-by: ultima-soul <33333039+ultima-soul@users.noreply.github.com> --- include/battle_scripts.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 2cf8c95b44..812bd96a15 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -365,5 +365,4 @@ extern const u8 BattleScript_MicleBerryActivateEnd2[]; extern const u8 BattleScript_MicleBerryActivateRet[]; extern const u8 BattleScript_JabocaRowapBerryActivates[]; - #endif // GUARD_BATTLE_SCRIPTS_H From 43ec4e1041a18e98a6c786823f71ac0bcae19699 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Wed, 3 Mar 2021 09:14:14 -0700 Subject: [PATCH 31/39] Update src/battle_util.c Co-authored-by: ultima-soul <33333039+ultima-soul@users.noreply.github.com> --- 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 3477e83eb4..e2fe56fbf5 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5267,10 +5267,10 @@ static u8 TrySetMicleBerry(u32 battlerId, u32 itemId, bool32 end2) static u8 DamagedStatBoostBerryEffect(u8 battlerId, u8 statId, u8 split) { if (IsBattlerAlive(battlerId) - && TARGET_TURN_DAMAGED - && gBattleMons[battlerId].statStages[statId] < MAX_STAT_STAGE - && !DoesSubstituteBlockMove(gBattlerAttacker, battlerId, gCurrentMove) - && GetBattleMoveSplit(gCurrentMove) == split) + && TARGET_TURN_DAMAGED + && gBattleMons[battlerId].statStages[statId] < MAX_STAT_STAGE + && !DoesSubstituteBlockMove(gBattlerAttacker, battlerId, gCurrentMove) + && GetBattleMoveSplit(gCurrentMove) == split) { PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); From 3edb7ede29a41de62b3ddf311313ee23a54b5008 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Wed, 3 Mar 2021 09:14:20 -0700 Subject: [PATCH 32/39] Update src/battle_util.c Co-authored-by: ultima-soul <33333039+ultima-soul@users.noreply.github.com> --- src/battle_util.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index e2fe56fbf5..2f7e3e4a4a 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6146,9 +6146,9 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) break; case HOLD_EFFECT_JABOCA_BERRY: // consume and damage attacker if used physical move if (IsBattlerAlive(battlerId) - && TARGET_TURN_DAMAGED - && !DoesSubstituteBlockMove(gBattlerAttacker, battlerId, gCurrentMove) - && IS_MOVE_PHYSICAL(gCurrentMove)) + && TARGET_TURN_DAMAGED + && !DoesSubstituteBlockMove(gBattlerAttacker, battlerId, gCurrentMove) + && IS_MOVE_PHYSICAL(gCurrentMove)) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; if (gBattleMoveDamage == 0) From 99c8bd19ca1bbc6582a8315f01779820cf0409b9 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Wed, 3 Mar 2021 09:14:25 -0700 Subject: [PATCH 33/39] Update src/battle_util.c Co-authored-by: ultima-soul <33333039+ultima-soul@users.noreply.github.com> --- src/battle_util.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 2f7e3e4a4a..4bdd96f687 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6165,9 +6165,9 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) break; case HOLD_EFFECT_ROWAP_BERRY: // consume and damage attacker if used special move if (IsBattlerAlive(battlerId) - && TARGET_TURN_DAMAGED - && !DoesSubstituteBlockMove(gBattlerAttacker, battlerId, gCurrentMove) - && IS_MOVE_SPECIAL(gCurrentMove)) + && TARGET_TURN_DAMAGED + && !DoesSubstituteBlockMove(gBattlerAttacker, battlerId, gCurrentMove) + && IS_MOVE_SPECIAL(gCurrentMove)) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; if (gBattleMoveDamage == 0) From 64e3f7dc24987a89552f7b748d7f43e35b2497a5 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Wed, 3 Mar 2021 10:47:59 -0700 Subject: [PATCH 34/39] Update src/battle_util.c Co-authored-by: ultima-soul <33333039+ultima-soul@users.noreply.github.com> --- 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 3dd0dd92f1..f7def5b9a9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5172,6 +5172,7 @@ enum bool32 HasEnoughHpToEatBerry(u32 battlerId, u32 hpFraction, u32 itemId) { bool32 isBerry = (ItemId_GetPocket(itemId) == POCKET_BERRIES); + if (gBattleMons[battlerId].hp == 0) return FALSE; // Unnerve prevents consumption of opponents' berries. @@ -8298,4 +8299,3 @@ static bool32 IsUnnerveAbilityOnOpposingSide(u8 battlerId) return TRUE; return FALSE; } - From 6739433e9ec9c0372fd2e94aeb6411929f5f6bcf Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Wed, 3 Mar 2021 10:48:05 -0700 Subject: [PATCH 35/39] Update src/battle_util.c Co-authored-by: ultima-soul <33333039+ultima-soul@users.noreply.github.com> --- 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 f7def5b9a9..cfc9bd836c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6215,7 +6215,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) && TARGET_TURN_DAMAGED && !DoesSubstituteBlockMove(gBattlerAttacker, battlerId, gCurrentMove) && IS_MOVE_PHYSICAL(gCurrentMove) - && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) + && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; if (gBattleMoveDamage == 0) From 5207d48b210499830a797f03e4d2b8a68fe4c136 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Wed, 3 Mar 2021 10:48:11 -0700 Subject: [PATCH 36/39] Update src/battle_util.c Co-authored-by: ultima-soul <33333039+ultima-soul@users.noreply.github.com> --- 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 cfc9bd836c..33ee8644ef 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6235,7 +6235,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) && TARGET_TURN_DAMAGED && !DoesSubstituteBlockMove(gBattlerAttacker, battlerId, gCurrentMove) && IS_MOVE_SPECIAL(gCurrentMove) - && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) + && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; if (gBattleMoveDamage == 0) From f83e8b4f94b90b68dcda07f60000034425dd070f Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Wed, 3 Mar 2021 10:48:17 -0700 Subject: [PATCH 37/39] Update src/battle_message.c Co-authored-by: ultima-soul <33333039+ultima-soul@users.noreply.github.com> --- src/battle_message.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/battle_message.c b/src/battle_message.c index 67f83bbeb9..05874c5954 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -696,7 +696,6 @@ static const u8 sText_CuriousMedicineEnters[] = _("{B_EFF_NAME_WITH_PREFIX}'s\ns static const u8 sText_CanActFaster[] = _("{B_ATK_NAME_WITH_PREFIX} can act faster,\nthanks to {B_LAST_ITEM}!"); static const u8 sText_MicleBerryActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} boosted the accuracy of its\nnext move using {B_LAST_ITEM}!"); - const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { [STRINGID_MICLEBERRYACTIVATES - 12] = sText_MicleBerryActivates, From 41d47a867e3ba813bd1274a1d0c4f500fb419a19 Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 3 Mar 2021 10:48:57 -0700 Subject: [PATCH 38/39] format fixes --- include/battle_scripts.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 7bdaf1d184..2fc993b9c2 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -368,5 +368,4 @@ extern const u8 BattleScript_MicleBerryActivateEnd2[]; extern const u8 BattleScript_MicleBerryActivateRet[]; extern const u8 BattleScript_JabocaRowapBerryActivates[]; - #endif // GUARD_BATTLE_SCRIPTS_H From d6e89a99ce46f831797c6cac9b9b401a42ee5957 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 14 Mar 2021 12:35:08 -0300 Subject: [PATCH 39/39] Corrected the name of an included header file include/constants/battle_moves.h doesn't exist. The right header file to include was include/constants/moves.h instead. --- src/battle_anim.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_anim.c b/src/battle_anim.c index f20d30dabb..6613c36395 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -18,7 +18,7 @@ #include "task.h" #include "constants/battle_anim.h" #include "constants/battle_config.h" -#include "constants/battle_moves.h" +#include "constants/moves.h" #define ANIM_SPRITE_INDEX_COUNT 8