diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7ef1ecbf97..895735a154 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2223,6 +2223,10 @@ BattleScript_EffectEntrainment:: setlastusedability printstring STRINGID_PKMNACQUIREDABILITY waitmessage B_WAIT_TIME_LONG + trytoclearprimalweather + tryrevertweatherform + flushtextbox + tryendneutralizinggas goto BattleScript_MoveEnd BattleScript_EffectSimpleBeam:: @@ -2298,6 +2302,9 @@ BattleScript_EffectHealingWishGen4: switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER trytoclearprimalweather + tryrevertweatherform + flushtextbox + tryendneutralizinggas flushtextbox printstring STRINGID_SWITCHINMON switchinanim BS_ATTACKER, FALSE, TRUE @@ -3319,6 +3326,9 @@ BattleScript_EffectTransform:: attackstring ppreduce trytoclearprimalweather + tryrevertweatherform + flushtextbox + tryendneutralizinggas flushtextbox transformdataexecution attackanimation @@ -4551,6 +4561,7 @@ BattleScript_EffectNonVolatileStatus:: attackanimation waitanimation setnonvolatilestatus TRIGGER_ON_MOVE + clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -5075,6 +5086,9 @@ BattleScript_FaintAttacker:: dofaintanimation BS_ATTACKER printstring STRINGID_ATTACKERFAINTED cleareffectsonfaint BS_ATTACKER + trytoclearprimalweather + tryrevertweatherform + flushtextbox waitanimation tryactivatesoulheart tryactivatereceiver BS_ATTACKER @@ -5090,6 +5104,9 @@ BattleScript_FaintTarget:: dofaintanimation BS_TARGET printstring STRINGID_TARGETFAINTED cleareffectsonfaint BS_TARGET + trytoclearprimalweather + tryrevertweatherform + flushtextbox waitanimation tryactivatesoulheart tryactivatereceiver BS_TARGET @@ -7962,6 +7979,10 @@ BattleScript_MummyActivates:: recordability BS_ATTACKER printstring STRINGID_ATTACKERACQUIREDABILITY waitmessage B_WAIT_TIME_LONG + trytoclearprimalweather + tryrevertweatherform + flushtextbox + tryendneutralizinggas return BattleScript_WanderingSpiritActivates:: diff --git a/src/battle_message.c b/src/battle_message.c index 7ba4d2d47f..4b581c01d8 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -623,7 +623,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_SOLARPOWERHPDROP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} takes its toll!"), //don't think this message is displayed anymore [STRINGID_AFTERMATHDMG] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} was hurt!"), [STRINGID_ANTICIPATIONACTIVATES] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} shuddered!"), - [STRINGID_FOREWARNACTIVATES] = COMPOUND_STRING("{B_SCR_ABILITY} alerted {B_SCR_NAME_WITH_PREFIX2} to {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), + [STRINGID_FOREWARNACTIVATES] = COMPOUND_STRING("{B_SCR_ABILITY} alerted {B_SCR_NAME_WITH_PREFIX2} to {B_EFF_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), [STRINGID_ICEBODYHPGAIN] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} healed it a little bit!"), //don't think this message is displayed anymore [STRINGID_SNOWWARNINGHAIL] = COMPOUND_STRING("It started to hail!"), [STRINGID_FRISKACTIVATES] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} frisked {B_DEF_NAME_WITH_PREFIX2} and found its {B_LAST_ITEM}!"), diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index de6fe66a4b..6eab4e819b 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -17849,7 +17849,7 @@ void BS_GetTotemBoost(void) void BS_ActivateItemEffects(void) { NATIVE_ARGS(); - if (ItemBattleEffects(ITEMEFFECT_NORMAL, gBattlerTarget)) + if (ItemBattleEffects(ITEMEFFECT_TRY_HEALING, gBattlerTarget)) return; gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/src/battle_util.c b/src/battle_util.c index b98590024c..4352a900d1 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2906,9 +2906,9 @@ static void ForewarnChooseMove(u32 battler) bestId = i; } - gBattlerTarget = data[bestId].battler; + gEffectBattler = data[bestId].battler; PREPARE_MOVE_BUFFER(gBattleTextBuff1, data[bestId].moveId) - RecordKnownMove(gBattlerTarget, data[bestId].moveId); + RecordKnownMove(data[bestId].battler, data[bestId].moveId); Free(data); } @@ -5188,6 +5188,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleScripting.battler = gBattlerAbility = gBattlerTarget; RecordAbilityBattle(gBattlerTarget, ABILITY_SYNCHRONIZE); + if (B_SYNCHRONIZE_TOXIC < GEN_5 && gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; + if (CanSetNonVolatileStatus( gBattlerTarget, gBattlerAttacker, @@ -5196,9 +5199,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleStruct->synchronizeMoveEffect, CHECK_TRIGGER)) { - if (B_SYNCHRONIZE_TOXIC < GEN_5 && gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) - gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; - gEffectBattler = gBattlerAttacker; gBattleScripting.moveEffect = gBattleStruct->synchronizeMoveEffect; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, ABILITY_SYNCHRONIZE); @@ -5218,6 +5218,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleScripting.battler = gBattlerAbility = gBattlerAttacker; RecordAbilityBattle(gBattlerAttacker, ABILITY_SYNCHRONIZE); + if (B_SYNCHRONIZE_TOXIC < GEN_5 && gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; + if (CanSetNonVolatileStatus( gBattlerAttacker, gBattlerTarget, diff --git a/src/data/pokemon/teachable_learnsets.h b/src/data/pokemon/teachable_learnsets.h index ae04d18e68..8b400f5675 100644 --- a/src/data/pokemon/teachable_learnsets.h +++ b/src/data/pokemon/teachable_learnsets.h @@ -32096,6 +32096,7 @@ static const u16 sDipplinTeachableLearnset[] = { static const u16 sHydrappleTeachableLearnset[] = { MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_ENDURE, @@ -32106,6 +32107,7 @@ static const u16 sHydrappleTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, diff --git a/test/battle/ability/desolate_land.c b/test/battle/ability/desolate_land.c index 0b99040189..b7cc02d47e 100644 --- a/test/battle/ability/desolate_land.c +++ b/test/battle/ability/desolate_land.c @@ -83,3 +83,18 @@ SINGLE_BATTLE_TEST("Desolate Land will not create a softlock when move in semi i ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); } } + +SINGLE_BATTLE_TEST("Desolate Land is removed immediately if user faints") +{ + GIVEN { + PLAYER(SPECIES_GROUDON) { HP(1); Item(ITEM_RED_ORB); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_POUND); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponent); + NOT MESSAGE("The sunlight is strong."); + MESSAGE("The extremely harsh sunlight faded!"); + } +} diff --git a/test/battle/move_effect/entrainment.c b/test/battle/move_effect/entrainment.c index fd47937f04..ac6050bbe0 100644 --- a/test/battle/move_effect/entrainment.c +++ b/test/battle/move_effect/entrainment.c @@ -58,4 +58,19 @@ SINGLE_BATTLE_TEST("Entrainment fails if the target's ability has cantBeOverwrit } } +SINGLE_BATTLE_TEST("Entrainment causes primal weather to revert") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + } WHEN { + TURN { MOVE(player, MOVE_ENTRAINMENT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENTRAINMENT, player); + MESSAGE("The extremely harsh sunlight faded!"); + } THEN { + EXPECT(opponent->ability == ABILITY_TELEPATHY); + } +} + TO_DO_BATTLE_TEST("Entrainment fails on Dynamaxed Pokémon"); diff --git a/test/battle/status1/paralysis.c b/test/battle/status1/paralysis.c index 0635e83d1d..c81daa9179 100644 --- a/test/battle/status1/paralysis.c +++ b/test/battle/status1/paralysis.c @@ -77,3 +77,17 @@ SINGLE_BATTLE_TEST("Thunder Wave doesn't affect Electric types in Gen6+") MESSAGE("It doesn't affect the opposing Pikachu…"); } } + +SINGLE_BATTLE_TEST("Thunder Wave doesn't print an effectiveness message") +{ + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING); + PLAYER(SPECIES_PIDGEY); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_THUNDER_WAVE); } + } SCENE { + MESSAGE("The opposing Wobbuffet used Thunder Wave!"); + NOT MESSAGE("It's super effective!"); + } +}