From 748259284ddc1a6d6bfe646218262c09f556e085 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Wed, 6 Dec 2023 14:42:34 +0100 Subject: [PATCH 1/5] Update PR template (#3639) --- .github/pull_request_template.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 930d20a018..f5bedcbf7f 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -11,6 +11,9 @@ +## Issue(s) that this PR introduces + + ## **Discord contact info** \ No newline at end of file From d86a2136a79754602984fba67fa20a1d65dbbb71 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 8 Dec 2023 17:29:29 +0100 Subject: [PATCH 2/5] Fixes Cutton Down / Defiant interaction (#3657) --- data/battle_scripts_1.s | 10 ++--- test/battle/ability/cotton_down.c | 64 +++++++++++++++++++++++++++++++ test/battle/ability/defiant.c | 37 ++++++++++++++++++ 3 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 test/battle/ability/cotton_down.c diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 6124f72fa8..c05991da46 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7887,10 +7887,11 @@ BattleScript_IllusionOff:: return BattleScript_CottonDownActivates:: - setbyte sFIXED_ABILITY_POPUP, TRUE - call BattleScript_AbilityPopUp + showabilitypopup BS_TARGET + pause B_WAIT_TIME_LONG + destroyabilitypopup copybyte gEffectBattler, gBattlerTarget - savetarget + swapattackerwithtarget setbyte gBattlerTarget, 0 BattleScript_CottonDownLoop: jumpiffainted BS_TARGET, TRUE, BattleScript_CottonDownLoopIncrement @@ -7909,8 +7910,7 @@ BattleScript_CottonDownLoopIncrement: addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_CottonDownLoop BattleScript_CottonDownReturn: - restoretarget - destroyabilitypopup + swapattackerwithtarget return BattleScript_AnticipationActivates:: diff --git a/test/battle/ability/cotton_down.c b/test/battle/ability/cotton_down.c new file mode 100644 index 0000000000..8e15283926 --- /dev/null +++ b/test/battle/ability/cotton_down.c @@ -0,0 +1,64 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Cotton Down drops speed by one of opposing battler if hit by a damaging move") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ELDEGOSS) { Ability(ABILITY_COTTON_DOWN); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ABILITY_POPUP(opponent, ABILITY_COTTON_DOWN); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Speed fell!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + } +} + +SINGLE_BATTLE_TEST("Cotton Down drops speed by one for each multi hit") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ELDEGOSS) { Ability(ABILITY_COTTON_DOWN); } + } WHEN { + TURN { MOVE(player, MOVE_DOUBLE_KICK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_KICK, player); + ABILITY_POPUP(opponent, ABILITY_COTTON_DOWN); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Speed fell!"); + ABILITY_POPUP(opponent, ABILITY_COTTON_DOWN); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Speed fell!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 2); + } +} + +DOUBLE_BATTLE_TEST("Cotton Down drops speed by one of all other battlers on the field") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_ELDEGOSS) { Ability(ABILITY_COTTON_DOWN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_COTTON_DOWN); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Wobbuffet's Speed fell!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("Wynaut's Speed fell!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + MESSAGE("Foe Wobbuffet's Speed fell!"); + } THEN { + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(playerRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(opponentRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + } +} diff --git a/test/battle/ability/defiant.c b/test/battle/ability/defiant.c index e8443ecc5f..3463cad18d 100644 --- a/test/battle/ability/defiant.c +++ b/test/battle/ability/defiant.c @@ -138,3 +138,40 @@ SINGLE_BATTLE_TEST("Defiant activates after Sticky Web lowers Speed") MESSAGE("Mankey's Attack sharply rose!"); } } + + +DOUBLE_BATTLE_TEST("Defiant is activated by Cotton Down for non-ally pokemon") +{ + GIVEN { + PLAYER(SPECIES_MANKEY) { Ability(ABILITY_DEFIANT); } + PLAYER(SPECIES_MANKEY) { Ability(ABILITY_DEFIANT); } + OPPONENT(SPECIES_ELDEGOSS) { Ability(ABILITY_COTTON_DOWN); } + OPPONENT(SPECIES_MANKEY) { Ability(ABILITY_DEFIANT); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_COTTON_DOWN); + + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Mankey's Speed fell!"); + ABILITY_POPUP(playerLeft, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Mankey's Attack sharply rose!"); + + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("Mankey's Speed fell!"); + ABILITY_POPUP(playerRight, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("Mankey's Attack sharply rose!"); + + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + MESSAGE("Foe Mankey's Speed fell!"); + } THEN { + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(playerRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(opponentRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(playerRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + } +} From 57ce85207ee3b1a1643cbac64086f0f1285a2952 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 9 Dec 2023 17:40:04 +0100 Subject: [PATCH 3/5] Fixes Substitute triggering Stamina and Eject Button on crash damage (#3669) * Fixes Substitute triggering Stamina * Fix Eject Button triggering on crash damage --- src/battle_script_commands.c | 4 +-- src/battle_util.c | 1 + test/battle/ability/stamina.c | 36 ++++++++++++++++++++++++++ test/battle/hold_effect/eject_button.c | 21 +++++++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2395a65e1f..b1fbc21485 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5858,9 +5858,9 @@ static void Cmd_moveend(void) u8 battler = battlers[i]; // Attacker is the damage-dealer, battler is mon to be switched out if (IsBattlerAlive(battler) + && gBattlerAttacker != battler && GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_EJECT_BUTTON - && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && (gSpecialStatuses[battler].physicalDmg != 0 || gSpecialStatuses[battler].specialDmg != 0) + && TARGET_TURN_DAMAGED && CountUsablePartyMons(battler) > 0) // Has mon to switch into { gBattleScripting.battler = battler; diff --git a/src/battle_util.c b/src/battle_util.c index 0a89e7e70e..71809c86a1 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5193,6 +5193,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_STAMINA: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattlerAttacker != gBattlerTarget && TARGET_TURN_DAMAGED && IsBattlerAlive(battler) && CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN)) diff --git a/test/battle/ability/stamina.c b/test/battle/ability/stamina.c index 3470cce518..e4a1a255a3 100644 --- a/test/battle/ability/stamina.c +++ b/test/battle/ability/stamina.c @@ -87,3 +87,39 @@ DOUBLE_BATTLE_TEST("Stamina activates correctly for every battler with the abili EXPECT_EQ(opponentLeft->hp, opponentLeft->maxHP); } } + +SINGLE_BATTLE_TEST("Stamina activates for every hit of a multi hit move") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_MUDBRAY) { Ability(ABILITY_STAMINA); } + } WHEN { + TURN { MOVE(player, MOVE_DOUBLE_KICK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_KICK, player); + HP_BAR(opponent); + STAMINA_STAT_RAISE(opponent, "Foe Mudbray's Defense rose!"); + STAMINA_STAT_RAISE(opponent, "Foe Mudbray's Defense rose!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 2); + } +} + +SINGLE_BATTLE_TEST("Stamina is not activated by users own Substitute") +{ + GIVEN { + PLAYER(SPECIES_MUDBRAY) { Ability(ABILITY_STAMINA); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, player); + MESSAGE("Mudbray made a SUBSTITUTE!"); + NONE_OF { + ABILITY_POPUP(player, ABILITY_STAMINA); + MESSAGE("Mudbray's Defense rose!"); + } + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); + } +} diff --git a/test/battle/hold_effect/eject_button.c b/test/battle/hold_effect/eject_button.c index 45dfc539b8..a94978b3ee 100644 --- a/test/battle/hold_effect/eject_button.c +++ b/test/battle/hold_effect/eject_button.c @@ -187,3 +187,24 @@ SINGLE_BATTLE_TEST("Eject Button is activated before Emergency Exit") MESSAGE("Foe Golisopod is switched out with the Eject Button!"); } } + +SINGLE_BATTLE_TEST("Eject Button is not triggered after High Jump Kick crash damage") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_BUTTON); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_PROTECT); + MOVE(opponent, MOVE_HIGH_JUMP_KICK); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, player); + MESSAGE("Foe Wobbuffet kept going and crashed!"); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + MESSAGE("Foe Wobbuffet is switched out with the Eject Button!"); + } + } +} From d5f3df6f08a10205cb43935df8add25c663bbe7e Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 10 Dec 2023 00:26:03 +0100 Subject: [PATCH 4/5] Fix Defog and Prevent Escape effects (#3668) * Fix Defog and Prevent Escape effects * pain split / mirror coat interaction * remove unused various define * use pain split effect * remove test --- asm/macros/battle_script.inc | 12 +- data/battle_scripts_1.s | 9 +- include/constants/battle_script_commands.h | 203 ++++++++++----------- src/battle_script_commands.c | 47 ++--- 4 files changed, 139 insertions(+), 132 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 8002df68ab..70c19b84d6 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1466,6 +1466,12 @@ .4byte \failInstr .endm + .macro trydefog clear:req, failInstr:req + callnative BS_TryDefog + .byte \clear + .4byte \failInstr + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves battler:req various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES @@ -1738,12 +1744,6 @@ various \battler, VARIOUS_UPDATE_ABILITY_POPUP .endm - .macro defogclear battler:req, clear:req, failInstr:req - various \battler, VARIOUS_DEFOG - .byte \clear - .4byte \failInstr - .endm - .macro jumpiftargetally jumpInstr:req various BS_ATTACKER, VARIOUS_JUMP_IF_TARGET_ALLY .4byte \jumpInstr diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c05991da46..7ddde66a82 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1997,7 +1997,7 @@ BattleScript_EffectDefog: jumpifsubstituteblocks BattleScript_DefogIfCanClearHazards jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_EVASION, MIN_STAT_STAGE, BattleScript_DefogWorks BattleScript_DefogIfCanClearHazards: - defogclear BS_ATTACKER, FALSE, BattleScript_FailedFromAtkString + trydefog FALSE, BattleScript_FailedFromAtkString BattleScript_DefogWorks: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring @@ -2017,7 +2017,7 @@ BattleScript_DefogPrintString:: waitmessage B_WAIT_TIME_LONG BattleScript_DefogTryHazards:: copybyte gEffectBattler, gBattlerAttacker - defogclear BS_ATTACKER, TRUE, NULL + trydefog TRUE, NULL copybyte gBattlerAttacker, gEffectBattler goto BattleScript_MoveEnd BattleScript_DefogTryHazardsWithAnim: @@ -4690,8 +4690,11 @@ BattleScript_EffectThief:: goto BattleScript_EffectHit BattleScript_EffectHitPreventEscape: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE setmoveeffect MOVE_EFFECT_PREVENT_ESCAPE - goto BattleScript_EffectHit + seteffectprimary + goto BattleScript_HitFromAtkString BattleScript_EffectMeanLook:: attackcanceler diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index e7d0f8f4be..82c2692af4 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -145,108 +145,107 @@ #define VARIOUS_TRY_AUTOTOMIZE 53 #define VARIOUS_TRY_COPYCAT 54 #define VARIOUS_ABILITY_POPUP 55 -#define VARIOUS_DEFOG 56 -#define VARIOUS_JUMP_IF_TARGET_ALLY 57 -#define VARIOUS_TRY_SYNCHRONOISE 58 -#define VARIOUS_PSYCHO_SHIFT 59 -#define VARIOUS_CURE_STATUS 60 -#define VARIOUS_POWER_TRICK 61 -#define VARIOUS_AFTER_YOU 62 -#define VARIOUS_BESTOW 63 -#define VARIOUS_ARGUMENT_TO_MOVE_EFFECT 64 -#define VARIOUS_JUMP_IF_NOT_GROUNDED 65 -#define VARIOUS_HANDLE_TRAINER_SLIDE_MSG 66 -#define VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF 67 -#define VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON 68 -#define VARIOUS_SET_AURORA_VEIL 69 -#define VARIOUS_TRY_THIRD_TYPE 70 -#define VARIOUS_ACUPRESSURE 71 -#define VARIOUS_SET_POWDER 72 -#define VARIOUS_SPECTRAL_THIEF 73 -#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 74 -#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 75 -#define VARIOUS_JUMP_IF_ROAR_FAILS 76 -#define VARIOUS_TRY_INSTRUCT 77 -#define VARIOUS_JUMP_IF_NOT_BERRY 78 -#define VARIOUS_TRACE_ABILITY 79 -#define VARIOUS_UPDATE_NICK 80 -#define VARIOUS_TRY_ILLUSION_OFF 81 -#define VARIOUS_SET_SPRITEIGNORE0HP 82 -#define VARIOUS_HANDLE_FORM_CHANGE 83 -#define VARIOUS_GET_STAT_VALUE 84 -#define VARIOUS_JUMP_IF_FULL_HP 85 -#define VARIOUS_LOSE_TYPE 86 -#define VARIOUS_TRY_ACTIVATE_SOULHEART 87 -#define VARIOUS_TRY_ACTIVATE_RECEIVER 88 -#define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 89 -#define VARIOUS_TRY_FRISK 90 -#define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 91 -#define VARIOUS_TRY_FAIRY_LOCK 92 -#define VARIOUS_JUMP_IF_NO_ALLY 93 -#define VARIOUS_POISON_TYPE_IMMUNITY 94 -#define VARIOUS_JUMP_IF_NO_HOLD_EFFECT 95 -#define VARIOUS_INFATUATE_WITH_BATTLER 96 -#define VARIOUS_SET_LAST_USED_ITEM 97 -#define VARIOUS_PARALYZE_TYPE_IMMUNITY 98 -#define VARIOUS_JUMP_IF_ABSENT 99 -#define VARIOUS_DESTROY_ABILITY_POPUP 100 -#define VARIOUS_TOTEM_BOOST 101 -#define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 102 -#define VARIOUS_MOVEEND_ITEM_EFFECTS 103 -#define VARIOUS_TERRAIN_SEED 104 -#define VARIOUS_MAKE_INVISIBLE 105 -#define VARIOUS_ROOM_SERVICE 106 -#define VARIOUS_EERIE_SPELL_PP_REDUCE 107 -#define VARIOUS_JUMP_IF_TEAM_HEALTHY 108 -#define VARIOUS_TRY_HEAL_QUARTER_HP 109 -#define VARIOUS_REMOVE_TERRAIN 110 -#define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 111 -#define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 112 -#define VARIOUS_GET_ROTOTILLER_TARGETS 113 -#define VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED 114 -#define VARIOUS_TRY_ACTIVATE_BATTLE_BOND 115 -#define VARIOUS_CONSUME_BERRY 116 -#define VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL 117 -#define VARIOUS_APPLY_PLASMA_FISTS 118 -#define VARIOUS_JUMP_IF_SPECIES 119 -#define VARIOUS_UPDATE_ABILITY_POPUP 120 -#define VARIOUS_JUMP_IF_WEATHER_AFFECTED 121 -#define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 122 -#define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 123 -#define VARIOUS_PHOTON_GEYSER_CHECK 124 -#define VARIOUS_SHELL_SIDE_ARM_CHECK 125 -#define VARIOUS_TRY_NO_RETREAT 126 -#define VARIOUS_TRY_TAR_SHOT 127 -#define VARIOUS_CAN_TAR_SHOT_WORK 128 -#define VARIOUS_CHECK_POLTERGEIST 129 -#define VARIOUS_SET_OCTOLOCK 130 -#define VARIOUS_CUT_1_3_HP_RAISE_STATS 131 -#define VARIOUS_TRY_END_NEUTRALIZING_GAS 132 -#define VARIOUS_JUMP_IF_UNDER_200 133 -#define VARIOUS_SET_SKY_DROP 134 -#define VARIOUS_CLEAR_SKY_DROP 135 -#define VARIOUS_SKY_DROP_YAWN 136 -#define VARIOUS_JUMP_IF_HOLD_EFFECT 137 -#define VARIOUS_CURE_CERTAIN_STATUSES 138 -#define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 139 -#define VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY 140 -#define VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT 141 -#define VARIOUS_SAVE_BATTLER_ITEM 142 -#define VARIOUS_RESTORE_BATTLER_ITEM 143 -#define VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM 144 -#define VARIOUS_SET_BEAK_BLAST 145 -#define VARIOUS_SWAP_SIDE_STATUSES 146 -#define VARIOUS_SWAP_STATS 147 -#define VARIOUS_TEATIME_INVUL 148 -#define VARIOUS_TEATIME_TARGETS 149 -#define VARIOUS_TRY_WIND_RIDER_POWER 150 -#define VARIOUS_ACTIVATE_WEATHER_CHANGE_ABILITIES 151 -#define VARIOUS_ACTIVATE_TERRAIN_CHANGE_ABILITIES 152 -#define VARIOUS_STORE_HEALING_WISH 153 -#define VARIOUS_HIT_SWITCH_TARGET_FAILED 154 -#define VARIOUS_TRY_REVIVAL_BLESSING 155 -#define VARIOUS_TRY_TRAINER_SLIDE_MSG_Z_MOVE 156 -#define VARIOUS_TRY_TRAINER_SLIDE_MSG_MEGA_EVOLUTION 157 +#define VARIOUS_JUMP_IF_TARGET_ALLY 56 +#define VARIOUS_TRY_SYNCHRONOISE 57 +#define VARIOUS_PSYCHO_SHIFT 58 +#define VARIOUS_CURE_STATUS 59 +#define VARIOUS_POWER_TRICK 60 +#define VARIOUS_AFTER_YOU 61 +#define VARIOUS_BESTOW 62 +#define VARIOUS_ARGUMENT_TO_MOVE_EFFECT 63 +#define VARIOUS_JUMP_IF_NOT_GROUNDED 64 +#define VARIOUS_HANDLE_TRAINER_SLIDE_MSG 65 +#define VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF 66 +#define VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON 67 +#define VARIOUS_SET_AURORA_VEIL 68 +#define VARIOUS_TRY_THIRD_TYPE 69 +#define VARIOUS_ACUPRESSURE 70 +#define VARIOUS_SET_POWDER 71 +#define VARIOUS_SPECTRAL_THIEF 72 +#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 73 +#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 74 +#define VARIOUS_JUMP_IF_ROAR_FAILS 75 +#define VARIOUS_TRY_INSTRUCT 76 +#define VARIOUS_JUMP_IF_NOT_BERRY 77 +#define VARIOUS_TRACE_ABILITY 78 +#define VARIOUS_UPDATE_NICK 79 +#define VARIOUS_TRY_ILLUSION_OFF 80 +#define VARIOUS_SET_SPRITEIGNORE0HP 81 +#define VARIOUS_HANDLE_FORM_CHANGE 82 +#define VARIOUS_GET_STAT_VALUE 83 +#define VARIOUS_JUMP_IF_FULL_HP 84 +#define VARIOUS_LOSE_TYPE 85 +#define VARIOUS_TRY_ACTIVATE_SOULHEART 86 +#define VARIOUS_TRY_ACTIVATE_RECEIVER 87 +#define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 88 +#define VARIOUS_TRY_FRISK 89 +#define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 90 +#define VARIOUS_TRY_FAIRY_LOCK 91 +#define VARIOUS_JUMP_IF_NO_ALLY 92 +#define VARIOUS_POISON_TYPE_IMMUNITY 93 +#define VARIOUS_JUMP_IF_NO_HOLD_EFFECT 94 +#define VARIOUS_INFATUATE_WITH_BATTLER 95 +#define VARIOUS_SET_LAST_USED_ITEM 96 +#define VARIOUS_PARALYZE_TYPE_IMMUNITY 97 +#define VARIOUS_JUMP_IF_ABSENT 98 +#define VARIOUS_DESTROY_ABILITY_POPUP 99 +#define VARIOUS_TOTEM_BOOST 100 +#define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 101 +#define VARIOUS_MOVEEND_ITEM_EFFECTS 102 +#define VARIOUS_TERRAIN_SEED 103 +#define VARIOUS_MAKE_INVISIBLE 104 +#define VARIOUS_ROOM_SERVICE 105 +#define VARIOUS_EERIE_SPELL_PP_REDUCE 106 +#define VARIOUS_JUMP_IF_TEAM_HEALTHY 107 +#define VARIOUS_TRY_HEAL_QUARTER_HP 108 +#define VARIOUS_REMOVE_TERRAIN 109 +#define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 110 +#define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 111 +#define VARIOUS_GET_ROTOTILLER_TARGETS 112 +#define VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED 113 +#define VARIOUS_TRY_ACTIVATE_BATTLE_BOND 114 +#define VARIOUS_CONSUME_BERRY 115 +#define VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL 116 +#define VARIOUS_APPLY_PLASMA_FISTS 117 +#define VARIOUS_JUMP_IF_SPECIES 118 +#define VARIOUS_UPDATE_ABILITY_POPUP 119 +#define VARIOUS_JUMP_IF_WEATHER_AFFECTED 120 +#define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 121 +#define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 122 +#define VARIOUS_PHOTON_GEYSER_CHECK 123 +#define VARIOUS_SHELL_SIDE_ARM_CHECK 124 +#define VARIOUS_TRY_NO_RETREAT 125 +#define VARIOUS_TRY_TAR_SHOT 126 +#define VARIOUS_CAN_TAR_SHOT_WORK 127 +#define VARIOUS_CHECK_POLTERGEIST 128 +#define VARIOUS_SET_OCTOLOCK 129 +#define VARIOUS_CUT_1_3_HP_RAISE_STATS 130 +#define VARIOUS_TRY_END_NEUTRALIZING_GAS 131 +#define VARIOUS_JUMP_IF_UNDER_200 132 +#define VARIOUS_SET_SKY_DROP 133 +#define VARIOUS_CLEAR_SKY_DROP 134 +#define VARIOUS_SKY_DROP_YAWN 135 +#define VARIOUS_JUMP_IF_HOLD_EFFECT 136 +#define VARIOUS_CURE_CERTAIN_STATUSES 137 +#define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 138 +#define VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY 139 +#define VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT 140 +#define VARIOUS_SAVE_BATTLER_ITEM 141 +#define VARIOUS_RESTORE_BATTLER_ITEM 142 +#define VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM 143 +#define VARIOUS_SET_BEAK_BLAST 144 +#define VARIOUS_SWAP_SIDE_STATUSES 145 +#define VARIOUS_SWAP_STATS 146 +#define VARIOUS_TEATIME_INVUL 147 +#define VARIOUS_TEATIME_TARGETS 148 +#define VARIOUS_TRY_WIND_RIDER_POWER 149 +#define VARIOUS_ACTIVATE_WEATHER_CHANGE_ABILITIES 150 +#define VARIOUS_ACTIVATE_TERRAIN_CHANGE_ABILITIES 151 +#define VARIOUS_STORE_HEALING_WISH 152 +#define VARIOUS_HIT_SWITCH_TARGET_FAILED 153 +#define VARIOUS_TRY_REVIVAL_BLESSING 154 +#define VARIOUS_TRY_TRAINER_SLIDE_MSG_Z_MOVE 155 +#define VARIOUS_TRY_TRAINER_SLIDE_MSG_MEGA_EVOLUTION 156 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b1fbc21485..1deaedaf16 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2375,7 +2375,7 @@ static void Cmd_datahpupdate(void) if (!gSpecialStatuses[battler].dmg && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE)) gSpecialStatuses[battler].dmg = gHpDealt; - if (IS_MOVE_PHYSICAL(gCurrentMove) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE) && gCurrentMove != MOVE_PAIN_SPLIT) + if (IS_MOVE_PHYSICAL(gCurrentMove) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE) && gBattleMoves[gCurrentMove].effect != EFFECT_PAIN_SPLIT) { gProtectStructs[battler].physicalDmg = gHpDealt; gSpecialStatuses[battler].physicalDmg = gHpDealt; @@ -2390,7 +2390,7 @@ static void Cmd_datahpupdate(void) gSpecialStatuses[battler].physicalBattlerId = gBattlerTarget; } } - else if (!IS_MOVE_PHYSICAL(gCurrentMove) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE)) + else if (!IS_MOVE_PHYSICAL(gCurrentMove) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE) && gBattleMoves[gCurrentMove].effect != EFFECT_PAIN_SPLIT) { gProtectStructs[battler].specialDmg = gHpDealt; gSpecialStatuses[battler].specialDmg = gHpDealt; @@ -8180,6 +8180,8 @@ static void RemoveAllTerrains(void) static bool32 TryDefogClear(u32 battlerAtk, bool32 clear) { s32 i; + u8 saveBattler = gBattlerAttacker; + for (i = 0; i < 2; i++) { struct SideTimer *sideTimer = &gSideTimers[i]; @@ -8209,6 +8211,8 @@ static bool32 TryDefogClear(u32 battlerAtk, bool32 clear) #endif // B_DEFOG_CLEARS_TERRAIN } + gBattlerAttacker = saveBattler; + return FALSE; } @@ -9576,25 +9580,6 @@ static void Cmd_various(void) UpdateAbilityPopup(battler); break; } - case VARIOUS_DEFOG: - { - VARIOUS_ARGS(bool8 clear, const u8 *failInstr); - if (cmd->clear) // Clear - { - if (TryDefogClear(gEffectBattler, TRUE)) - return; - else - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - if (TryDefogClear(battler, FALSE)) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->failInstr; - } - return; - } case VARIOUS_JUMP_IF_TARGET_ALLY: { VARIOUS_ARGS(const u8 *jumpInstr); @@ -16352,3 +16337,23 @@ void BS_TryHealPulse(void) gBattlescriptCurrInstr = cmd->nextInstr; } } + +void BS_TryDefog(void) +{ + NATIVE_ARGS(u8 clear, const u8 *failInstr); + + if (cmd->clear) + { + if (TryDefogClear(gEffectBattler, TRUE)) + return; + else + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + if (TryDefogClear(gBattlerAttacker, FALSE)) + gBattlescriptCurrInstr = cmd->nextInstr; + else + gBattlescriptCurrInstr = cmd->failInstr; + } +} From 403843cecfa6c807594eb018de7ba0c79c61b08c Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 10 Dec 2023 00:27:05 +0100 Subject: [PATCH 5/5] Fixes Fling damage calcs (#3670) --- data/battle_scripts_1.s | 10 ++++++++-- test/battle/move_effect/fling.c | 24 +++++++++++++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7ddde66a82..bb9ef9a7b7 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -904,8 +904,7 @@ BattleScript_EffectFling: attackcanceler jumpifcantfling BS_ATTACKER, BattleScript_FailedFromAtkString setlastuseditem BS_ATTACKER - removeitem BS_ATTACKER - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + accuracycheck BattleScript_FlingMissed, ACC_CURR_MOVE attackstring pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNFLUNG @@ -914,6 +913,7 @@ BattleScript_EffectFling: critcalc damagecalc adjustdamage + removeitem BS_ATTACKER attackanimation waitanimation effectivenesssound @@ -989,6 +989,12 @@ BattleScript_FlingWhiteHerb: swapattackerwithtarget goto BattleScript_FlingEnd +BattleScript_FlingMissed: + removeitem BS_ATTACKER + attackstring + ppreduce + goto BattleScript_MoveMissedPause + BattleScript_EffectShellSideArm: shellsidearmcheck setmoveeffect MOVE_EFFECT_POISON diff --git a/test/battle/move_effect/fling.c b/test/battle/move_effect/fling.c index 8d44d9b9f1..1c4c08eb76 100644 --- a/test/battle/move_effect/fling.c +++ b/test/battle/move_effect/fling.c @@ -273,7 +273,7 @@ SINGLE_BATTLE_TEST("Fling - thrown berry's effect activates for the target even PARAMETRIZE { item = ITEM_SALAC_BERRY; effect = HOLD_EFFECT_SPEED_UP; statId = STAT_SPEED; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(item); } + PLAYER(SPECIES_WOBBUFFET) { Item(item); Attack(1); } OPPONENT(SPECIES_WOBBUFFET) { Status1(status1); HP(399); MaxHP(400); MovesWithPP({MOVE_CELEBRATE, 35}); } } WHEN { TURN { MOVE(player, MOVE_FLING); } @@ -346,3 +346,25 @@ SINGLE_BATTLE_TEST("Fling - thrown berry's effect activates for the target even } } +SINGLE_BATTLE_TEST("Fling deals damage based on items fling power") +{ + u16 item; + s16 damage[2]; + + GIVEN { + ASSUME(gBattleMoves[MOVE_CRUNCH].power == 80); + ASSUME(gItems[ITEM_VENUSAURITE].flingPower == 80); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_VENUSAURITE); } + OPPONENT(SPECIES_REGIROCK); + } WHEN { + TURN { MOVE(player, MOVE_CRUNCH); } + TURN { MOVE(player, MOVE_FLING); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CRUNCH, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +}