Fixes Dragon Tail using the effect twice during a Parental Bond attack (#5630)

Co-authored-by: Eduardo Quezada <eduardo602002@gmail.com>
This commit is contained in:
Alex 2024-11-02 13:38:29 +01:00 committed by GitHub
parent 69d4eec009
commit 45d063dcf8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 141 additions and 120 deletions

View file

@ -1685,6 +1685,11 @@
.4byte \failInstr .4byte \failInstr
.endm .endm
.macro tryhitswitchtarget failInstr:req
callnative BS_TryHitSwitchTarget
.4byte \failInstr
.endm
@ various command changed to more readable macros @ various command changed to more readable macros
.macro cancelmultiturnmoves battler:req .macro cancelmultiturnmoves battler:req
various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES
@ -1916,11 +1921,6 @@
various BS_ATTACKER, VARIOUS_SET_ARG_TO_BATTLE_DAMAGE various BS_ATTACKER, VARIOUS_SET_ARG_TO_BATTLE_DAMAGE
.endm .endm
.macro tryhitswitchtarget failInstr:req
various BS_ATTACKER, VARIOUS_TRY_HIT_SWITCH_TARGET
.4byte \failInstr
.endm
.macro tryautotomize battler:req, failInstr:req .macro tryautotomize battler:req, failInstr:req
various \battler, VARIOUS_TRY_AUTOTOMIZE various \battler, VARIOUS_TRY_AUTOTOMIZE
.4byte \failInstr .4byte \failInstr

View file

@ -138,102 +138,101 @@
#define VARIOUS_HANDLE_MEGA_EVO 46 #define VARIOUS_HANDLE_MEGA_EVO 46
#define VARIOUS_TRY_LAST_RESORT 47 #define VARIOUS_TRY_LAST_RESORT 47
#define VARIOUS_SET_ARG_TO_BATTLE_DAMAGE 48 #define VARIOUS_SET_ARG_TO_BATTLE_DAMAGE 48
#define VARIOUS_TRY_HIT_SWITCH_TARGET 49 #define VARIOUS_TRY_AUTOTOMIZE 49
#define VARIOUS_TRY_AUTOTOMIZE 50 #define VARIOUS_ABILITY_POPUP 50
#define VARIOUS_ABILITY_POPUP 51 #define VARIOUS_JUMP_IF_TARGET_ALLY 51
#define VARIOUS_JUMP_IF_TARGET_ALLY 52 #define VARIOUS_TRY_SYNCHRONOISE 52
#define VARIOUS_TRY_SYNCHRONOISE 53 #define VARIOUS_PSYCHO_SHIFT 53
#define VARIOUS_PSYCHO_SHIFT 54 #define VARIOUS_CURE_STATUS 54
#define VARIOUS_CURE_STATUS 55 #define VARIOUS_POWER_TRICK 55
#define VARIOUS_POWER_TRICK 56 #define VARIOUS_AFTER_YOU 56
#define VARIOUS_AFTER_YOU 57 #define VARIOUS_BESTOW 57
#define VARIOUS_BESTOW 58 #define VARIOUS_JUMP_IF_NOT_GROUNDED 58
#define VARIOUS_JUMP_IF_NOT_GROUNDED 59 #define VARIOUS_HANDLE_TRAINER_SLIDE_MSG 59
#define VARIOUS_HANDLE_TRAINER_SLIDE_MSG 60 #define VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF 60
#define VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF 61 #define VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON 61
#define VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON 62 #define VARIOUS_SET_AURORA_VEIL 62
#define VARIOUS_SET_AURORA_VEIL 63 #define VARIOUS_TRY_THIRD_TYPE 63
#define VARIOUS_TRY_THIRD_TYPE 64 #define VARIOUS_ACUPRESSURE 64
#define VARIOUS_ACUPRESSURE 65 #define VARIOUS_SET_POWDER 65
#define VARIOUS_SET_POWDER 66 #define VARIOUS_SPECTRAL_THIEF 66
#define VARIOUS_SPECTRAL_THIEF 67 #define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 67
#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 68 #define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 68
#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 69 #define VARIOUS_JUMP_IF_ROAR_FAILS 69
#define VARIOUS_JUMP_IF_ROAR_FAILS 70 #define VARIOUS_TRY_INSTRUCT 70
#define VARIOUS_TRY_INSTRUCT 71 #define VARIOUS_JUMP_IF_NOT_BERRY 71
#define VARIOUS_JUMP_IF_NOT_BERRY 72 #define VARIOUS_TRACE_ABILITY 72
#define VARIOUS_TRACE_ABILITY 73 #define VARIOUS_UPDATE_NICK 73
#define VARIOUS_UPDATE_NICK 74 #define VARIOUS_TRY_ILLUSION_OFF 74
#define VARIOUS_TRY_ILLUSION_OFF 75 #define VARIOUS_SET_SPRITEIGNORE0HP 75
#define VARIOUS_SET_SPRITEIGNORE0HP 76 #define VARIOUS_HANDLE_FORM_CHANGE 76
#define VARIOUS_HANDLE_FORM_CHANGE 77 #define VARIOUS_GET_STAT_VALUE 77
#define VARIOUS_GET_STAT_VALUE 78 #define VARIOUS_JUMP_IF_FULL_HP 78
#define VARIOUS_JUMP_IF_FULL_HP 79 #define VARIOUS_LOSE_TYPE 79
#define VARIOUS_LOSE_TYPE 80 #define VARIOUS_TRY_ACTIVATE_SOULHEART 80
#define VARIOUS_TRY_ACTIVATE_SOULHEART 81 #define VARIOUS_TRY_ACTIVATE_RECEIVER 81
#define VARIOUS_TRY_ACTIVATE_RECEIVER 82 #define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 82
#define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 83 #define VARIOUS_TRY_FRISK 83
#define VARIOUS_TRY_FRISK 84 #define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 84
#define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 85 #define VARIOUS_TRY_FAIRY_LOCK 85
#define VARIOUS_TRY_FAIRY_LOCK 86 #define VARIOUS_JUMP_IF_NO_ALLY 86
#define VARIOUS_JUMP_IF_NO_ALLY 87 #define VARIOUS_POISON_TYPE_IMMUNITY 87
#define VARIOUS_POISON_TYPE_IMMUNITY 88 #define VARIOUS_JUMP_IF_HOLD_EFFECT 88
#define VARIOUS_JUMP_IF_HOLD_EFFECT 89 #define VARIOUS_INFATUATE_WITH_BATTLER 89
#define VARIOUS_INFATUATE_WITH_BATTLER 90 #define VARIOUS_SET_LAST_USED_ITEM 90
#define VARIOUS_SET_LAST_USED_ITEM 91 #define VARIOUS_PARALYZE_TYPE_IMMUNITY 91
#define VARIOUS_PARALYZE_TYPE_IMMUNITY 92 #define VARIOUS_JUMP_IF_ABSENT 92
#define VARIOUS_JUMP_IF_ABSENT 93 #define VARIOUS_DESTROY_ABILITY_POPUP 93
#define VARIOUS_DESTROY_ABILITY_POPUP 94 #define VARIOUS_TOTEM_BOOST 94
#define VARIOUS_TOTEM_BOOST 95 #define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 95
#define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 96 #define VARIOUS_MOVEEND_ITEM_EFFECTS 96
#define VARIOUS_MOVEEND_ITEM_EFFECTS 97 #define VARIOUS_TERRAIN_SEED 97
#define VARIOUS_TERRAIN_SEED 98 #define VARIOUS_MAKE_INVISIBLE 98
#define VARIOUS_MAKE_INVISIBLE 99 #define VARIOUS_ROOM_SERVICE 99
#define VARIOUS_ROOM_SERVICE 100 #define VARIOUS_EERIE_SPELL_PP_REDUCE 100
#define VARIOUS_EERIE_SPELL_PP_REDUCE 101 #define VARIOUS_JUMP_IF_TEAM_HEALTHY 101
#define VARIOUS_JUMP_IF_TEAM_HEALTHY 102 #define VARIOUS_TRY_HEAL_QUARTER_HP 102
#define VARIOUS_TRY_HEAL_QUARTER_HP 103 #define VARIOUS_REMOVE_TERRAIN 103
#define VARIOUS_REMOVE_TERRAIN 104 #define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 104
#define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 105 #define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 105
#define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 106 #define VARIOUS_GET_ROTOTILLER_TARGETS 106
#define VARIOUS_GET_ROTOTILLER_TARGETS 107 #define VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED 107
#define VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED 108 #define VARIOUS_TRY_ACTIVATE_BATTLE_BOND 108
#define VARIOUS_TRY_ACTIVATE_BATTLE_BOND 109 #define VARIOUS_CONSUME_BERRY 109
#define VARIOUS_CONSUME_BERRY 110 #define VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL 110
#define VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL 111 #define VARIOUS_JUMP_IF_SPECIES 111
#define VARIOUS_JUMP_IF_SPECIES 112 #define VARIOUS_UPDATE_ABILITY_POPUP 112
#define VARIOUS_UPDATE_ABILITY_POPUP 113 #define VARIOUS_JUMP_IF_WEATHER_AFFECTED 113
#define VARIOUS_JUMP_IF_WEATHER_AFFECTED 114 #define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 114
#define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 115 #define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 115
#define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 116 #define VARIOUS_TRY_NO_RETREAT 116
#define VARIOUS_TRY_NO_RETREAT 117 #define VARIOUS_TRY_TAR_SHOT 117
#define VARIOUS_TRY_TAR_SHOT 118 #define VARIOUS_CAN_TAR_SHOT_WORK 118
#define VARIOUS_CAN_TAR_SHOT_WORK 119 #define VARIOUS_CHECK_POLTERGEIST 119
#define VARIOUS_CHECK_POLTERGEIST 120 #define VARIOUS_CUT_1_3_HP_RAISE_STATS 120
#define VARIOUS_CUT_1_3_HP_RAISE_STATS 121 #define VARIOUS_TRY_END_NEUTRALIZING_GAS 121
#define VARIOUS_TRY_END_NEUTRALIZING_GAS 122 #define VARIOUS_JUMP_IF_UNDER_200 122
#define VARIOUS_JUMP_IF_UNDER_200 123 #define VARIOUS_SET_SKY_DROP 123
#define VARIOUS_SET_SKY_DROP 124 #define VARIOUS_CLEAR_SKY_DROP 124
#define VARIOUS_CLEAR_SKY_DROP 125 #define VARIOUS_SKY_DROP_YAWN 125
#define VARIOUS_SKY_DROP_YAWN 126 #define VARIOUS_CURE_CERTAIN_STATUSES 126
#define VARIOUS_CURE_CERTAIN_STATUSES 127 #define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 127
#define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 128 #define VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY 128
#define VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY 129 #define VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT 129
#define VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT 130 #define VARIOUS_SAVE_BATTLER_ITEM 130
#define VARIOUS_SAVE_BATTLER_ITEM 131 #define VARIOUS_RESTORE_BATTLER_ITEM 131
#define VARIOUS_RESTORE_BATTLER_ITEM 132 #define VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM 132
#define VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM 133 #define VARIOUS_SET_BEAK_BLAST 133
#define VARIOUS_SET_BEAK_BLAST 134 #define VARIOUS_SWAP_SIDE_STATUSES 134
#define VARIOUS_SWAP_SIDE_STATUSES 135 #define VARIOUS_SWAP_STATS 135
#define VARIOUS_SWAP_STATS 136 #define VARIOUS_TEATIME_INVUL 136
#define VARIOUS_TEATIME_INVUL 137 #define VARIOUS_TEATIME_TARGETS 137
#define VARIOUS_TEATIME_TARGETS 138 #define VARIOUS_TRY_WIND_RIDER_POWER 138
#define VARIOUS_TRY_WIND_RIDER_POWER 139 #define VARIOUS_ACTIVATE_WEATHER_CHANGE_ABILITIES 139
#define VARIOUS_ACTIVATE_WEATHER_CHANGE_ABILITIES 140 #define VARIOUS_ACTIVATE_TERRAIN_CHANGE_ABILITIES 140
#define VARIOUS_ACTIVATE_TERRAIN_CHANGE_ABILITIES 141 #define VARIOUS_STORE_HEALING_WISH 141
#define VARIOUS_STORE_HEALING_WISH 142 #define VARIOUS_HIT_SWITCH_TARGET_FAILED 142
#define VARIOUS_HIT_SWITCH_TARGET_FAILED 143 #define VARIOUS_TRY_REVIVAL_BLESSING 143
#define VARIOUS_TRY_REVIVAL_BLESSING 144
// Cmd_manipulatedamage // Cmd_manipulatedamage
#define DMG_CHANGE_SIGN 0 #define DMG_CHANGE_SIGN 0

View file

@ -8788,7 +8788,7 @@ u32 GetHighestStatId(u32 battler)
} }
if (gBattleMons[battler].speed > highestStat) if (gBattleMons[battler].speed > highestStat)
highestId = STAT_SPEED; highestId = STAT_SPEED;
return highestId; return highestId;
} }
@ -9947,24 +9947,6 @@ static void Cmd_various(void)
gBattleMoveDamage = gMovesInfo[gCurrentMove].argument; gBattleMoveDamage = gMovesInfo[gCurrentMove].argument;
break; break;
} }
case VARIOUS_TRY_HIT_SWITCH_TARGET:
{
VARIOUS_ARGS(const u8 *failInstr);
if (IsBattlerAlive(gBattlerAttacker)
&& IsBattlerAlive(gBattlerTarget)
&& !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
&& TARGET_TURN_DAMAGED
&& GetBattlerAbility(gBattlerTarget) != ABILITY_GUARD_DOG)
{
gBattleScripting.switchCase = B_SWITCH_HIT;
gBattlescriptCurrInstr = cmd->nextInstr;
}
else
{
gBattlescriptCurrInstr = cmd->failInstr;
}
return;
}
case VARIOUS_TRY_AUTOTOMIZE: case VARIOUS_TRY_AUTOTOMIZE:
{ {
VARIOUS_ARGS(const u8 *failInstr); VARIOUS_ARGS(const u8 *failInstr);
@ -17333,3 +17315,23 @@ void BS_JumpIfBlockedBySoundproof(void)
gBattlescriptCurrInstr = cmd->nextInstr; gBattlescriptCurrInstr = cmd->nextInstr;
} }
} }
void BS_TryHitSwitchTarget(void)
{
NATIVE_ARGS(const u8 *failInstr);
if (IsBattlerAlive(gBattlerAttacker)
&& IsBattlerAlive(gBattlerTarget)
&& !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
&& TARGET_TURN_DAMAGED
&& gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT
&& GetBattlerAbility(gBattlerTarget) != ABILITY_GUARD_DOG)
{
gBattleScripting.switchCase = B_SWITCH_HIT;
gBattlescriptCurrInstr = cmd->nextInstr;
}
else
{
gBattlescriptCurrInstr = cmd->failInstr;
}
}

View file

@ -286,6 +286,26 @@ SINGLE_BATTLE_TEST("Parental Bond Snore strikes twice while asleep")
} }
} }
SINGLE_BATTLE_TEST("Parental Bond only triggers Dragon Tail's target switch out on the second hit")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_DRAGON_TAIL].effect == EFFECT_HIT_SWITCH_TARGET);
PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); }
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WYNAUT);
} WHEN {
TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_DRAGON_TAIL, gimmick: GIMMICK_MEGA); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, player);
HP_BAR(opponent);
HP_BAR(opponent);
MESSAGE("Foe Wynaut was dragged out!");
}
THEN {
EXPECT_EQ(player->species, SPECIES_KANGASKHAN_MEGA);
}
}
TO_DO_BATTLE_TEST("Parental Bond tests"); TO_DO_BATTLE_TEST("Parental Bond tests");
// Temporary TODO: Convert Bulbapedia description into tests. // Temporary TODO: Convert Bulbapedia description into tests.