From f3342de00bae76116d557a214dbe630b78469d1d Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Fri, 19 Jan 2024 17:01:14 +0100 Subject: [PATCH 01/11] Condense Oinkologne teachable learnsets (#4026) * Condense Oinkologne teachable learnsets * Fix redundant backslash --- src/data/pokemon/species_info/gen_9.h | 6 ++-- src/data/pokemon/teachable_learnsets.h | 38 +------------------------- 2 files changed, 4 insertions(+), 40 deletions(-) diff --git a/src/data/pokemon/species_info/gen_9.h b/src/data/pokemon/species_info/gen_9.h index e7846ec90a..7a45fc66e4 100644 --- a/src/data/pokemon/species_info/gen_9.h +++ b/src/data/pokemon/species_info/gen_9.h @@ -507,6 +507,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .pokemonOffset = 17, \ .trainerScale = 256, \ .trainerOffset = 0, \ + .teachableLearnset = sOinkologneTeachableLearnset, \ .formSpeciesIdTable = sOinkologneFormSpeciesIdTable [SPECIES_OINKOLOGNE_MALE] = @@ -535,8 +536,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = PALETTES(OinkologneMale), ICON(OinkologneMale, 1), //.footprint = gMonFootprint_Oinkologne, - LEARNSETS(OinkologneMale), - + .levelUpLearnset = sOinkologneMaleLevelUpLearnset, }, [SPECIES_OINKOLOGNE_FEMALE] = @@ -566,7 +566,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = PALETTES(OinkologneFemale), ICON(OinkologneFemale, 2), //.footprint = gMonFootprint_Oinkologne, - LEARNSETS(OinkologneFemale), + .levelUpLearnset = sOinkologneFemaleLevelUpLearnset, }, #endif //P_FAMILY_LECHONK diff --git a/src/data/pokemon/teachable_learnsets.h b/src/data/pokemon/teachable_learnsets.h index f274363f61..4d51cf8280 100644 --- a/src/data/pokemon/teachable_learnsets.h +++ b/src/data/pokemon/teachable_learnsets.h @@ -35492,43 +35492,7 @@ static const u16 sLechonkTeachableLearnset[] = { MOVE_UNAVAILABLE, }; -static const u16 sOinkologneMaleTeachableLearnset[] = { - MOVE_BODY_PRESS, - MOVE_BODY_SLAM, - MOVE_BULLDOZE, - MOVE_BULLET_SEED, - MOVE_CHILLING_WATER, - MOVE_DIG, - MOVE_DISARMING_VOICE, - MOVE_EARTH_POWER, - MOVE_ENDURE, - MOVE_ENERGY_BALL, - MOVE_FACADE, - MOVE_GIGA_IMPACT, - MOVE_HELPING_HAND, - MOVE_HYPER_BEAM, - MOVE_HYPER_VOICE, - MOVE_IRON_HEAD, - MOVE_MUD_SHOT, - MOVE_MUD_SLAP, - MOVE_PLAY_ROUGH, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_SEED_BOMB, - MOVE_SLEEP_TALK, - MOVE_STOMPING_TANTRUM, - MOVE_SUBSTITUTE, - MOVE_SUNNY_DAY, - MOVE_TAKE_DOWN, - MOVE_TERA_BLAST, - MOVE_THIEF, - MOVE_TRAILBLAZE, - MOVE_ZEN_HEADBUTT, - MOVE_UNAVAILABLE, -}; - -static const u16 sOinkologneFemaleTeachableLearnset[] = { +static const u16 sOinkologneTeachableLearnset[] = { MOVE_BODY_PRESS, MOVE_BODY_SLAM, MOVE_BULLDOZE, From d125da77970bbbb242e6a5ae8a55c86985acc8e4 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 20 Jan 2024 22:48:34 +0100 Subject: [PATCH 02/11] Fixes Life Orb + Eject Pack / Red Card interaction (#4038) * Fixes Life Orb + Eject Pack / Red Card interaction * fix test --- include/battle.h | 2 +- src/battle_script_commands.c | 6 ++++-- src/battle_util.c | 2 +- test/battle/hold_effect/eject_pack.c | 26 ++++++++++++++++++++++++++ test/battle/hold_effect/red_card.c | 17 +++++++++++++++++ 5 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 test/battle/hold_effect/eject_pack.c diff --git a/include/battle.h b/include/battle.h index ea710ed797..21b3727ec3 100644 --- a/include/battle.h +++ b/include/battle.h @@ -208,7 +208,7 @@ struct SpecialStatus // End of byte u8 emergencyExited:1; u8 afterYou:1; - u8 magicianStolen:1; // So that Life Orb doesn't activate after Magician steals it. + u8 preventLifeOrbDamage:1; // So that Life Orb doesn't activate various effects. }; struct SideTimer diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e9fd422e20..cc7dd6ac92 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5711,7 +5711,7 @@ static void Cmd_moveend(void) gEffectBattler = gBattlerTarget; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MagicianActivates; - gSpecialStatuses[gBattlerAttacker].magicianStolen = TRUE; + gSpecialStatuses[gBattlerAttacker].preventLifeOrbDamage = TRUE; effect = TRUE; } gBattleScripting.moveendState++; @@ -5898,6 +5898,7 @@ static void Cmd_moveend(void) gBattlescriptCurrInstr = BattleScript_MoveEnd; // Prevent user switch-in selection BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_RedCardActivates; + gSpecialStatuses[gBattlerAttacker].preventLifeOrbDamage = TRUE; effect = TRUE; break; // Only fastest red card activates } @@ -5924,6 +5925,7 @@ static void Cmd_moveend(void) gLastUsedItem = gBattleMons[battler].item; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_EjectPackActivates; + gSpecialStatuses[gBattlerAttacker].preventLifeOrbDamage = TRUE; effect = TRUE; break; // Only fastest eject pack activates } @@ -6076,7 +6078,7 @@ static void Cmd_moveend(void) gStatuses3[gBattlerAttacker] &= ~STATUS3_ME_FIRST; gSpecialStatuses[gBattlerAttacker].gemBoost = FALSE; gSpecialStatuses[gBattlerAttacker].damagedMons = 0; - gSpecialStatuses[gBattlerAttacker].magicianStolen = 0; + gSpecialStatuses[gBattlerAttacker].preventLifeOrbDamage = 0; gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; gBattleScripting.moveEffect = 0; // clear attacker z move data diff --git a/src/battle_util.c b/src/battle_util.c index 81a5c82d8c..5f633fc1e4 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7775,7 +7775,7 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) if (IsBattlerAlive(gBattlerAttacker) && !(TestSheerForceFlag(gBattlerAttacker, gCurrentMove)) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD - && !gSpecialStatuses[gBattlerAttacker].magicianStolen + && !gSpecialStatuses[gBattlerAttacker].preventLifeOrbDamage && gSpecialStatuses[gBattlerAttacker].damagedMons) { gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 10; diff --git a/test/battle/hold_effect/eject_pack.c b/test/battle/hold_effect/eject_pack.c new file mode 100644 index 0000000000..4f58a1477e --- /dev/null +++ b/test/battle/hold_effect/eject_pack.c @@ -0,0 +1,26 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItems[ITEM_EJECT_PACK].holdEffect == HOLD_EFFECT_EJECT_PACK); +} + +SINGLE_BATTLE_TEST("Eject Pack does not cause the new pokemon to lose hp due to it's held Life Orb") +{ + GIVEN { + ASSUME(gItems[ITEM_LIFE_ORB].holdEffect == HOLD_EFFECT_LIFE_ORB); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_PACK); } + PLAYER(SPECIES_WYNAUT) { Item(ITEM_LIFE_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_OVERHEAT); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_OVERHEAT, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet is switched out with the Eject Pack!"); + MESSAGE("Go! Wynaut!"); + NOT MESSAGE("Wynaut was hurt by its Life Orb!"); + } +} diff --git a/test/battle/hold_effect/red_card.c b/test/battle/hold_effect/red_card.c index 0f80dd176c..79db49fabd 100644 --- a/test/battle/hold_effect/red_card.c +++ b/test/battle/hold_effect/red_card.c @@ -430,4 +430,21 @@ SINGLE_BATTLE_TEST("Red Card is consumed after dragged out replacement has its S } } +SINGLE_BATTLE_TEST("Red Card does not cause the dragged out mon to lose hp due to it's held Life Orb") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT) { Item(ITEM_LIFE_ORB); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + MESSAGE("Foe Wobbuffet held up its Red Card against Wobbuffet!"); + MESSAGE("Wynaut was dragged out!"); + NOT MESSAGE("Wynaut was hurt by its Life Orb!"); + } +} + // SINGLE_BATTLE_TEST("Red Card activates but fails if the attacker has Dynamaxed") From 73a1fa30e98558f90221e308bf725215d041cdbf Mon Sep 17 00:00:00 2001 From: Philipp AUER Date: Sun, 21 Jan 2024 09:11:10 +0100 Subject: [PATCH 03/11] fix: emergency exit cutoff off by 1 on odd max hp (#4040) * fix: emergency exit cutoff off by 1 on odd max hp * squash!: newline at end of file --------- Co-authored-by: sbird --- src/battle_util.c | 12 +++++++----- test/battle/ability/emergency_exit.c | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 test/battle/ability/emergency_exit.c diff --git a/src/battle_util.c b/src/battle_util.c index 5f633fc1e4..1e56ab1914 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4211,11 +4211,14 @@ static uq4_12_t GetSupremeOverlordModifier(u32 battler) return modifier; } -static bool32 HadMoreThanHalfHpNowHasLess(u32 battler) +static inline bool32 HadMoreThanHalfHpNowHasLess(u32 battler) { + u32 cutoff = gBattleMons[battler].maxHP / 2; + if (gBattleMons[battler].maxHP % 2 == 1) + cutoff++; // Had more than half of hp before, now has less - return (gBattleStruct->hpBefore[battler] >= gBattleMons[battler].maxHP / 2 - && gBattleMons[battler].hp < gBattleMons[battler].maxHP / 2); + return (gBattleStruct->hpBefore[battler] >= cutoff + && gBattleMons[battler].hp < cutoff); } u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg) @@ -5271,8 +5274,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && TARGET_TURN_DAMAGED && IsBattlerAlive(battler) // Had more than half of hp before, now has less - && gBattleStruct->hpBefore[battler] > gBattleMons[battler].maxHP / 2 - && gBattleMons[battler].hp < gBattleMons[battler].maxHP / 2 + && HadMoreThanHalfHpNowHasLess(battler) && (gMultiHitCounter == 0 || gMultiHitCounter == 1) && !(TestSheerForceFlag(gBattlerAttacker, gCurrentMove)) && (CanBattlerSwitch(battler) || !(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) diff --git a/test/battle/ability/emergency_exit.c b/test/battle/ability/emergency_exit.c new file mode 100644 index 0000000000..ad1fd630a0 --- /dev/null +++ b/test/battle/ability/emergency_exit.c @@ -0,0 +1,20 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Emergency Exit switches out when taking 50% max-hp damage") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Attack(1314); }; // will deal exactly 132 damage, putting GOLISOPOD just under half hp + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(263); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_POUND); + SEND_OUT(opponent, 1); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, player); + HP_BAR(opponent); + ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); + } +} From 53a46b7a29992a8d39a11ef253c03caca5e147c9 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Sun, 21 Jan 2024 10:25:37 +0100 Subject: [PATCH 04/11] Remove faulty teachable learnset moves (#4039) --- src/data/pokemon/teachable_learnsets.h | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/data/pokemon/teachable_learnsets.h b/src/data/pokemon/teachable_learnsets.h index 4d51cf8280..a478c8d179 100644 --- a/src/data/pokemon/teachable_learnsets.h +++ b/src/data/pokemon/teachable_learnsets.h @@ -663,7 +663,6 @@ static const u16 sRattataTeachableLearnset[] = { static const u16 sRaticateTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BULK_UP, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, @@ -689,7 +688,6 @@ static const u16 sRaticateTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TORMENT, MOVE_TOXIC, MOVE_BODY_SLAM, MOVE_COUNTER, @@ -930,7 +928,6 @@ static const u16 sPikachuTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, - MOVE_FLY, MOVE_FOCUS_PUNCH, MOVE_FRUSTRATION, MOVE_HIDDEN_POWER, @@ -7942,7 +7939,6 @@ static const u16 sPorygonTeachableLearnset[] = { MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, - MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, MOVE_DREAM_EATER, MOVE_ENDURE, @@ -12566,9 +12562,6 @@ static const u16 sWyrdeerTeachableLearnset[] = { #if P_FAMILY_SMEARGLE static const u16 sSmeargleTeachableLearnset[] = { - MOVE_FLAMETHROWER, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SMEARGLE @@ -14883,7 +14876,6 @@ static const u16 sShedinjaTeachableLearnset[] = { MOVE_SNORE, MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NINCADA From 04fa3aa72586c65103f660d3a77bd5b4db2a94e4 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 21 Jan 2024 11:08:25 +0100 Subject: [PATCH 05/11] Fixes Emergency Exit when hp is restored over tag out range (#4041) * Fixes Emergency Exit when hp is restored over tag out range * Update test/battle/ability/emergency_exit.c Co-authored-by: Bassoonian --------- Co-authored-by: Bassoonian --- src/battle_util.c | 4 ++++ test/battle/ability/emergency_exit.c | 26 ++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 1e56ab1914..ec7654caf0 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6793,6 +6793,10 @@ static u8 ItemHealHp(u32 battler, u32 itemId, bool32 end2, bool32 percentHeal) BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ItemHealHP_RemoveItemRet; } + if (gBattleResources->flags->flags[battler] & RESOURCE_FLAG_EMERGENCY_EXIT + && GetNonDynamaxMaxHP(battler) > gBattleMons[battler].maxHP / 2) + gBattleResources->flags->flags[battler] &= ~RESOURCE_FLAG_EMERGENCY_EXIT; + return ITEM_HP_CHANGE; } return 0; diff --git a/test/battle/ability/emergency_exit.c b/test/battle/ability/emergency_exit.c index ad1fd630a0..73c7ebbe00 100644 --- a/test/battle/ability/emergency_exit.c +++ b/test/battle/ability/emergency_exit.c @@ -4,17 +4,35 @@ SINGLE_BATTLE_TEST("Emergency Exit switches out when taking 50% max-hp damage") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Attack(1314); }; // will deal exactly 132 damage, putting GOLISOPOD just under half hp - OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(263); }; + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(262); }; OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { - MOVE(player, MOVE_POUND); + MOVE(player, MOVE_SUPER_FANG); SEND_OUT(opponent, 1); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUPER_FANG, player); HP_BAR(opponent); ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); } } + +SINGLE_BATTLE_TEST("Emergency Exit switches out when taking 50% max-hp damage after a restore hp hold effect was used") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(262); Item(ITEM_SITRUS_BERRY); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_SUPER_FANG); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUPER_FANG, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + NOT ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); + } +} From 35e2157c092341c767c02feba418348d895b4861 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 21 Jan 2024 12:27:58 +0100 Subject: [PATCH 06/11] Fixes ability Corrosion (#4037) * Fixes ability Corrosion * forgot AI_CanPoisonType * More tests * review comments applied * more review changes * simplify CanPosionType (original state) * remove redundant function --------- Co-authored-by: Bassoonian --- src/battle_ai_util.c | 8 +- src/battle_script_commands.c | 4 +- test/battle/ability/corrosion.c | 128 ++++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+), 9 deletions(-) create mode 100644 test/battle/ability/corrosion.c diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 14016684dd..1853ba22cf 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2750,17 +2750,11 @@ bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move return TRUE; } -static bool32 AI_CanPoisonType(u32 battlerAttacker, u32 battlerTarget, u32 move) -{ - return ((AI_DATA->abilities[battlerAttacker] == ABILITY_CORROSION && gBattleMoves[move].split == SPLIT_STATUS) - || !(IS_BATTLER_OF_TYPE(battlerTarget, TYPE_POISON) || IS_BATTLER_OF_TYPE(battlerTarget, TYPE_STEEL))); -} - static bool32 AI_CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 move) { u32 ability = AI_DATA->abilities[battlerDef]; - if (!(AI_CanPoisonType(battlerAtk, battlerDef, move)) + if (!(CanPoisonType(battlerAtk, battlerDef)) || gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD || gBattleMons[battlerDef].status1 & STATUS1_ANY || ability == ABILITY_IMMUNITY diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index cc7dd6ac92..cb82e32176 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8123,8 +8123,8 @@ static bool32 HasAttackerFaintedTarget(void) bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget) { - return ((GetBattlerAbility(battlerAttacker) == ABILITY_CORROSION && gBattleMoves[gCurrentMove].split == SPLIT_STATUS) - || !(IS_BATTLER_OF_TYPE(battlerTarget, TYPE_POISON) || IS_BATTLER_OF_TYPE(battlerTarget, TYPE_STEEL))); + return GetBattlerAbility(battlerAttacker) == ABILITY_CORROSION + || (!IS_BATTLER_OF_TYPE(battlerTarget, TYPE_STEEL) && !IS_BATTLER_OF_TYPE(battlerTarget, TYPE_POISON)); } bool32 CanParalyzeType(u8 battlerAttacker, u8 battlerTarget) diff --git a/test/battle/ability/corrosion.c b/test/battle/ability/corrosion.c new file mode 100644 index 0000000000..2c53a5132b --- /dev/null +++ b/test/battle/ability/corrosion.c @@ -0,0 +1,128 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Corrosion can poison or badly poison a Pokemon regardless of its typing") +{ + u16 species; + + PARAMETRIZE { species = SPECIES_ODDISH; } + PARAMETRIZE { species = SPECIES_BELDUM; } + + GIVEN { + ASSUME(gBattleMoves[MOVE_TWINEEDLE].effect == EFFECT_POISON_HIT); + PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } + OPPONENT(species); + } WHEN { + TURN { MOVE(player, MOVE_TWINEEDLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TWINEEDLE, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, poison: TRUE); + } +} + +SINGLE_BATTLE_TEST("Corrosion can poison or badly poison a Steel type with a status poison effect") +{ + u16 move; + + PARAMETRIZE { move = MOVE_POISON_POWDER; } + PARAMETRIZE { move = MOVE_TOXIC; } + + GIVEN { + ASSUME(gBattleMoves[MOVE_POISON_POWDER].effect == EFFECT_POISON); + ASSUME(gBattleMoves[MOVE_TOXIC].effect == EFFECT_TOXIC); + PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } + OPPONENT(SPECIES_BELDUM); + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + if (move == MOVE_POISON_POWDER) + STATUS_ICON(opponent, poison: TRUE); + else + STATUS_ICON(opponent, badPoison: TRUE); + } +} + +SINGLE_BATTLE_TEST("Corrosion does not effect poison type damaging moves if the target is immune to it") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_SLUDGE_BOMB].effect == EFFECT_POISON_HIT); + PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } + OPPONENT(SPECIES_BELDUM); + } WHEN { + TURN { MOVE(player, MOVE_SLUDGE_BOMB); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SLUDGE_BOMB, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, poison: TRUE); + } + } +} + +SINGLE_BATTLE_TEST("Corrosion can poison Poison- and Steel-type targets if it uses Fling while holding a Toxic Orb or a Poison Barb") +{ + u16 heldItem; + + PARAMETRIZE { heldItem = ITEM_POISON_BARB; } + PARAMETRIZE { heldItem = ITEM_TOXIC_ORB; } + + GIVEN { + ASSUME(gBattleMoves[MOVE_FLING].effect == EFFECT_FLING); + ASSUME(gItems[ITEM_POISON_BARB].holdEffect == HOLD_EFFECT_POISON_POWER); + ASSUME(gItems[ITEM_TOXIC_ORB].holdEffect == HOLD_EFFECT_TOXIC_ORB); + PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Item(heldItem); } + OPPONENT(SPECIES_ODDISH); + } WHEN { + TURN { MOVE(player, MOVE_FLING); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + if (heldItem == ITEM_POISON_BARB) + STATUS_ICON(opponent, poison: TRUE); + else + STATUS_ICON(opponent, badPoison: TRUE); + } +} + +SINGLE_BATTLE_TEST("If a Poison- or Steel-type Pokémon with Corrosion holds a Toxic Orb, it will badly poison itself") +{ + GIVEN { + ASSUME(gItems[ITEM_TOXIC_ORB].holdEffect == HOLD_EFFECT_TOXIC_ORB); + PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Item(ITEM_TOXIC_ORB); } + OPPONENT(SPECIES_ODDISH); + } WHEN { + TURN { } + } SCENE { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, player); + STATUS_ICON(player, badPoison: TRUE); + } +} + +SINGLE_BATTLE_TEST("If a Poison- or Steel-type Pokémon with Corrosion poisons a target with Synchronize, Synchronize will not poison Poison- or Steel-type Pokémon") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_TOXIC].effect == EFFECT_TOXIC); + PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } + OPPONENT(SPECIES_ABRA) { Ability(ABILITY_SYNCHRONIZE); } + } WHEN { + TURN { MOVE(player, MOVE_TOXIC); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, badPoison: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, player); + STATUS_ICON(player, badPoison: TRUE); + } + } +} + +TO_DO_BATTLE_TEST("Corrosion cannot bypass moves or Abilities that prevent poisoning, such as Safeguard or Immunity"); +TO_DO_BATTLE_TEST("If the Pokémon with this Ability uses Magic Coat to reflect a status move that inflicts poison, the reflected move will be able to poison Poison- or Steel-type Pokémon."); +TO_DO_BATTLE_TEST("Moves used by a Pokémon with Corrosion that are reflected by Magic Coat or Magic Bounce do not retain the ability to poison Poison- or Steel-type Pokémon.") From 9286b808661d37aad2dbeae8c076b744898798c0 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Sun, 21 Jan 2024 13:02:45 +0100 Subject: [PATCH 07/11] Remove illegal moves from teachable learnsets (#4042) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- src/data/pokemon/teachable_learnsets.h | 95 -------------------------- 1 file changed, 95 deletions(-) diff --git a/src/data/pokemon/teachable_learnsets.h b/src/data/pokemon/teachable_learnsets.h index a478c8d179..c4eaf84c9b 100644 --- a/src/data/pokemon/teachable_learnsets.h +++ b/src/data/pokemon/teachable_learnsets.h @@ -710,7 +710,6 @@ static const u16 sRaticateTeachableLearnset[] = { #if P_ALOLAN_FORMS static const u16 sRattataAlolanTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_CUT, MOVE_DIG, MOVE_FACADE, MOVE_ICE_BEAM, @@ -727,7 +726,6 @@ static const u16 sRattataAlolanTeachableLearnset[] = { static const u16 sRaticateAlolanTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BULK_UP, - MOVE_CUT, MOVE_DIG, MOVE_FACADE, MOVE_HYPER_BEAM, @@ -1022,7 +1020,6 @@ static const u16 sRaichuAlolanTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIG, MOVE_FACADE, - MOVE_FLASH, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -1031,7 +1028,6 @@ static const u16 sRaichuAlolanTeachableLearnset[] = { MOVE_REFLECT, MOVE_REST, MOVE_ROCK_SMASH, - MOVE_STRENGTH, MOVE_THUNDERBOLT, MOVE_THUNDER, MOVE_TOXIC, @@ -1138,7 +1134,6 @@ static const u16 sSandslashTeachableLearnset[] = { static const u16 sSandshrewAlolanTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, - MOVE_CUT, MOVE_DIG, MOVE_EARTHQUAKE, MOVE_FACADE, @@ -1146,8 +1141,6 @@ static const u16 sSandshrewAlolanTeachableLearnset[] = { MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SMASH, - MOVE_STRENGTH, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -1155,7 +1148,6 @@ static const u16 sSandshrewAlolanTeachableLearnset[] = { static const u16 sSandslashAlolanTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, - MOVE_CUT, MOVE_DIG, MOVE_EARTHQUAKE, MOVE_FACADE, @@ -1164,8 +1156,6 @@ static const u16 sSandslashAlolanTeachableLearnset[] = { MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SMASH, - MOVE_STRENGTH, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -2379,27 +2369,23 @@ static const u16 sDugtrioTeachableLearnset[] = { #if P_ALOLAN_FORMS static const u16 sDiglettAlolanTeachableLearnset[] = { - MOVE_CUT, MOVE_DIG, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SMASH, MOVE_SLUDGE_BOMB, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sDugtrioAlolanTeachableLearnset[] = { - MOVE_CUT, MOVE_DIG, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SMASH, MOVE_SLUDGE_BOMB, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -2500,9 +2486,7 @@ static const u16 sPersianTeachableLearnset[] = { #if P_ALOLAN_FORMS static const u16 sMeowthAlolanTeachableLearnset[] = { - MOVE_CUT, MOVE_FACADE, - MOVE_FLASH, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, @@ -2515,9 +2499,7 @@ static const u16 sMeowthAlolanTeachableLearnset[] = { }; static const u16 sPersianAlolanTeachableLearnset[] = { - MOVE_CUT, MOVE_FACADE, - MOVE_FLASH, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, @@ -3760,7 +3742,6 @@ static const u16 sGeodudeAlolanTeachableLearnset[] = { MOVE_PROTECT, MOVE_REST, MOVE_ROCK_SMASH, - MOVE_STRENGTH, MOVE_THUNDERBOLT, MOVE_THUNDER, MOVE_TOXIC, @@ -3777,7 +3758,6 @@ static const u16 sGravelerAlolanTeachableLearnset[] = { MOVE_PROTECT, MOVE_REST, MOVE_ROCK_SMASH, - MOVE_STRENGTH, MOVE_THUNDERBOLT, MOVE_THUNDER, MOVE_TOXIC, @@ -3795,7 +3775,6 @@ static const u16 sGolemAlolanTeachableLearnset[] = { MOVE_PROTECT, MOVE_REST, MOVE_ROCK_SMASH, - MOVE_STRENGTH, MOVE_THUNDERBOLT, MOVE_THUNDER, MOVE_TOXIC, @@ -4634,7 +4613,6 @@ static const u16 sGrimerAlolanTeachableLearnset[] = { MOVE_REST, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, - MOVE_STRENGTH, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -4649,10 +4627,8 @@ static const u16 sMukAlolanTeachableLearnset[] = { MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SMASH, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, - MOVE_STRENGTH, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -5298,7 +5274,6 @@ static const u16 sExeggutorAlolanTeachableLearnset[] = { MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLAMETHROWER, - MOVE_FLASH, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -5308,7 +5283,6 @@ static const u16 sExeggutorAlolanTeachableLearnset[] = { MOVE_REST, MOVE_SOLAR_BEAM, MOVE_SLUDGE_BOMB, - MOVE_STRENGTH, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -5431,9 +5405,7 @@ static const u16 sMarowakAlolanTeachableLearnset[] = { MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SMASH, MOVE_SHADOW_BALL, - MOVE_STRENGTH, MOVE_THUNDERBOLT, MOVE_THUNDER, MOVE_TOXIC, @@ -7312,8 +7284,6 @@ static const u16 sTaurosTeachableLearnset[] = { #if P_PALDEAN_FORMS static const u16 sTaurosPaldeanCombatBreedTeachableLearnset[] = { - MOVE_ATTRACT, - MOVE_BLIZZARD, MOVE_BODY_SLAM, MOVE_BULLDOZE, MOVE_CLOSE_COMBAT, @@ -7321,31 +7291,20 @@ static const u16 sTaurosPaldeanCombatBreedTeachableLearnset[] = { MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, MOVE_GIGA_IMPACT, - MOVE_HELPING_HAND, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_HEAD, MOVE_OUTRAGE, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_REVERSAL, MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, MOVE_SCARY_FACE, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, MOVE_SMART_STRIKE, - MOVE_SOLAR_BEAM, MOVE_STOMPING_TANTRUM, MOVE_STONE_EDGE, MOVE_SUBSTITUTE, @@ -7354,9 +7313,6 @@ static const u16 sTaurosPaldeanCombatBreedTeachableLearnset[] = { MOVE_TAKE_DOWN, MOVE_TERA_BLAST, MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, MOVE_TRAILBLAZE, MOVE_WILD_CHARGE, MOVE_ZEN_HEADBUTT, @@ -7364,8 +7320,6 @@ static const u16 sTaurosPaldeanCombatBreedTeachableLearnset[] = { }; static const u16 sTaurosPaldeanBlazeBreedTeachableLearnset[] = { - MOVE_ATTRACT, - MOVE_BLIZZARD, MOVE_BODY_SLAM, MOVE_BULLDOZE, MOVE_CLOSE_COMBAT, @@ -7375,40 +7329,27 @@ static const u16 sTaurosPaldeanBlazeBreedTeachableLearnset[] = { MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, MOVE_GIGA_IMPACT, - MOVE_HELPING_HAND, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_HEAD, MOVE_OUTRAGE, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_REVERSAL, MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, MOVE_SCARY_FACE, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, MOVE_SMART_STRIKE, - MOVE_SOLAR_BEAM, MOVE_STOMPING_TANTRUM, MOVE_STONE_EDGE, MOVE_SUBSTITUTE, MOVE_SUNNY_DAY, - MOVE_SURF, MOVE_TAKE_DOWN, MOVE_TERA_BLAST, MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, MOVE_TRAILBLAZE, MOVE_WILD_CHARGE, MOVE_ZEN_HEADBUTT, @@ -7416,8 +7357,6 @@ static const u16 sTaurosPaldeanBlazeBreedTeachableLearnset[] = { }; static const u16 sTaurosPaldeanAquaBreedTeachableLearnset[] = { - MOVE_ATTRACT, - MOVE_BLIZZARD, MOVE_BODY_SLAM, MOVE_BULLDOZE, MOVE_CLOSE_COMBAT, @@ -7425,42 +7364,27 @@ static const u16 sTaurosPaldeanAquaBreedTeachableLearnset[] = { MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, MOVE_GIGA_IMPACT, - MOVE_HELPING_HAND, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_HEAD, MOVE_OUTRAGE, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_REVERSAL, MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, MOVE_SCARY_FACE, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, MOVE_SMART_STRIKE, - MOVE_SOLAR_BEAM, MOVE_STOMPING_TANTRUM, MOVE_STONE_EDGE, MOVE_SUBSTITUTE, - MOVE_SUNNY_DAY, MOVE_SURF, MOVE_TAKE_DOWN, MOVE_TERA_BLAST, MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, MOVE_TRAILBLAZE, MOVE_WILD_CHARGE, MOVE_ZEN_HEADBUTT, @@ -10619,38 +10543,27 @@ static const u16 sQuagsireTeachableLearnset[] = { static const u16 sWooperPaldeanTeachableLearnset[] = { MOVE_ACID_SPRAY, MOVE_AMNESIA, - MOVE_ATTRACT, - MOVE_AVALANCHE, - MOVE_BLIZZARD, MOVE_BODY_SLAM, MOVE_BULLDOZE, MOVE_CHILLING_WATER, MOVE_DIG, MOVE_EARTH_POWER, MOVE_EARTHQUAKE, - MOVE_ENCORE, MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HELPING_HAND, - MOVE_HIDDEN_POWER, MOVE_HYDRO_PUMP, - MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIQUIDATION, MOVE_MUD_SHOT, MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNOWSCAPE, MOVE_SPIKES, MOVE_STEALTH_ROCK, MOVE_STOMPING_TANTRUM, @@ -19255,17 +19168,11 @@ static const u16 sDeoxysNormalTeachableLearnset[] = { MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, MOVE_PSYCH_UP, MOVE_ROCK_SLIDE, @@ -33081,7 +32988,6 @@ static const u16 sMeltanTeachableLearnset[] = { MOVE_IRON_DEFENSE, MOVE_GYRO_BALL, MOVE_STEEL_BEAM, - MOVE_HIDDEN_POWER, MOVE_UNAVAILABLE, }; @@ -33126,7 +33032,6 @@ static const u16 sMelmetalTeachableLearnset[] = { MOVE_BODY_PRESS, MOVE_STEEL_BEAM, MOVE_STEEL_ROLLER, - MOVE_HIDDEN_POWER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MELTAN From a01d442f3666eae280372b8214ee651f440e8f41 Mon Sep 17 00:00:00 2001 From: Mathew Arnold Date: Sun, 21 Jan 2024 17:23:55 +0000 Subject: [PATCH 08/11] Fixed Kingra's learnset gen (#4044) In level_up_learnsets.h, Kingdra's learnset was inside a check for P_GEN_4_CROSS_EVOS. As a Gen 2 Pokemon, this has been updated to check for P_GEN_2_CROSS_EVOS instead. --- src/data/pokemon/level_up_learnsets.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/pokemon/level_up_learnsets.h b/src/data/pokemon/level_up_learnsets.h index 3325cb2b8a..37b22e5921 100644 --- a/src/data/pokemon/level_up_learnsets.h +++ b/src/data/pokemon/level_up_learnsets.h @@ -3479,7 +3479,7 @@ static const struct LevelUpMove sSeadraLevelUpLearnset[] = { LEVEL_UP_END }; -#if P_GEN_4_CROSS_EVOS +#if P_GEN_2_CROSS_EVOS static const struct LevelUpMove sKingdraLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_HYDRO_PUMP), LEVEL_UP_MOVE( 1, MOVE_YAWN), From 0ec777dd24c09a1bb428e20ce632c56468a49a83 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 21 Jan 2024 23:42:01 +0100 Subject: [PATCH 09/11] Fixes Mind Blown / Magic Guard interaction and renames Steel Beam effect (#4043) * Fixes Mind Blown / Magic Guard interaction and renames Steel Beam effect * review fixes --------- Co-authored-by: Bassoonian --- data/battle_scripts_1.s | 5 +-- include/constants/battle_move_effects.h | 2 +- src/battle_ai_util.c | 2 +- src/battle_tv.c | 2 +- src/data/battle_moves.h | 4 +-- test/battle/move_effect/max_hp_50_recoil.c | 39 ++++++++++++++++++++++ test/battle/move_effect/mind_blown.c | 13 ++++++++ 7 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 test/battle/move_effect/max_hp_50_recoil.c diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 2e2fd09e23..18d20ebc94 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -406,7 +406,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_RISING_VOLTAGE .4byte BattleScript_EffectHit @ EFFECT_BEAK_BLAST .4byte BattleScript_EffectCourtChange @ EFFECT_COURT_CHANGE - .4byte BattleScript_EffectSteelBeam @ EFFECT_STEEL_BEAM + .4byte BattleScript_EffectMaxHp50Recoil @ EFFECT_MAX_HP_50_RECOIL .4byte BattleScript_EffectExtremeEvoboost @ EFFECT_EXTREME_EVOBOOST .4byte BattleScript_EffectHitSetRemoveTerrain @ EFFECT_HIT_SET_REMOVE_TERRAIN .4byte BattleScript_EffectDarkVoid @ EFFECT_DARK_VOID @@ -927,7 +927,7 @@ BattleScript_EffectShellTrap:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectSteelBeam:: +BattleScript_EffectMaxHp50Recoil:: attackcanceler attackstring ppreduce @@ -3592,6 +3592,7 @@ BattleScript_MindBlownDamp: goto BattleScript_DampStopsExplosion BattleScript_EffectMindBlown_HpDown: setbyte sMULTIHIT_EFFECT, 1 @ Note to not faint the attacker + jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_EffectMindBlown_AnimDmgNoFaint dmg_1_2_attackerhp healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index beebe59462..056f0ce4f7 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -383,7 +383,7 @@ #define EFFECT_RISING_VOLTAGE 377 #define EFFECT_BEAK_BLAST 378 #define EFFECT_COURT_CHANGE 379 -#define EFFECT_STEEL_BEAM 380 +#define EFFECT_MAX_HP_50_RECOIL 380 #define EFFECT_EXTREME_EVOBOOST 381 #define EFFECT_HIT_SET_REMOVE_TERRAIN 382 // genesis supernova #define EFFECT_DARK_VOID 383 diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 1853ba22cf..f675602fb9 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -972,7 +972,7 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s case EFFECT_OVERHEAT: case EFFECT_MAKE_IT_RAIN: case EFFECT_MIND_BLOWN: - case EFFECT_STEEL_BEAM: + case EFFECT_MAX_HP_50_RECOIL: return TRUE; case EFFECT_RECOIL_25: case EFFECT_RECOIL_IF_MISS: diff --git a/src/battle_tv.c b/src/battle_tv.c index af485df70d..f22b9f96e5 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -467,7 +467,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_RISING_VOLTAGE] = 0, // TODO: Assign points [EFFECT_BEAK_BLAST] = 0, // TODO: Assign points [EFFECT_COURT_CHANGE] = 0, // TODO: Assign points - [EFFECT_STEEL_BEAM] = 0, // TODO: Assign points + [EFFECT_MAX_HP_50_RECOIL] = 0, // TODO: Assign points [EFFECT_EXTREME_EVOBOOST] = 0, // TODO: Assign points [EFFECT_HIT_SET_REMOVE_TERRAIN] = 0, // TODO: Assign points [EFFECT_DARK_VOID] = 0, // TODO: Assign points diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 005415a956..1a2347f557 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -12606,7 +12606,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_STEEL_BEAM] = { - .effect = EFFECT_STEEL_BEAM, + .effect = EFFECT_MAX_HP_50_RECOIL, .power = 140, .type = TYPE_STEEL, .accuracy = 95, @@ -13259,7 +13259,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 120, #endif - .effect = EFFECT_STEEL_BEAM, + .effect = EFFECT_MAX_HP_50_RECOIL, .type = TYPE_GRASS, .accuracy = 95, .pp = 5, diff --git a/test/battle/move_effect/max_hp_50_recoil.c b/test/battle/move_effect/max_hp_50_recoil.c new file mode 100644 index 0000000000..b921e5a85f --- /dev/null +++ b/test/battle/move_effect/max_hp_50_recoil.c @@ -0,0 +1,39 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_STEEL_BEAM].effect == EFFECT_MAX_HP_50_RECOIL); +} + +SINGLE_BATTLE_TEST("Steel Beam causes the user to take damage equal to half of its maximum HP") +{ + s16 recoilDamage; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_STEEL_BEAM); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEEL_BEAM, player); + HP_BAR(opponent); + HP_BAR(player, captureDamage: &recoilDamage); + } THEN { + EXPECT_EQ(player->maxHP / 2, recoilDamage); + } +} + +SINGLE_BATTLE_TEST("Steel Beam hp loss is prevented by Magic Guard") +{ + GIVEN { + PLAYER(SPECIES_CLEFAIRY) { Ability(ABILITY_MAGIC_GUARD); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_STEEL_BEAM); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEEL_BEAM, player); + HP_BAR(opponent); + NOT HP_BAR(player); + } +} diff --git a/test/battle/move_effect/mind_blown.c b/test/battle/move_effect/mind_blown.c index 485f2abd66..671491a846 100644 --- a/test/battle/move_effect/mind_blown.c +++ b/test/battle/move_effect/mind_blown.c @@ -105,3 +105,16 @@ DOUBLE_BATTLE_TEST("Mind Blown causes everyone to faint in a double battle") MESSAGE("Wobbuffet fainted!"); } } + +SINGLE_BATTLE_TEST("Mind Blown hp loss is prevented by Magic Guard") +{ + GIVEN { + PLAYER(SPECIES_CLEFAIRY) { Ability(ABILITY_MAGIC_GUARD); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_MIND_BLOWN); } + } SCENE { + NOT HP_BAR(player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIND_BLOWN, player); + } +} From b99ec5d43cb9535592f6bc3cc077906fef18b642 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Mon, 22 Jan 2024 00:07:19 +0100 Subject: [PATCH 10/11] Update level_up_learnsets.h (#4046) --- src/data/pokemon/level_up_learnsets.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/pokemon/level_up_learnsets.h b/src/data/pokemon/level_up_learnsets.h index 37b22e5921..70658961c1 100644 --- a/src/data/pokemon/level_up_learnsets.h +++ b/src/data/pokemon/level_up_learnsets.h @@ -3500,7 +3500,7 @@ static const struct LevelUpMove sKingdraLevelUpLearnset[] = { LEVEL_UP_MOVE(60, MOVE_HYDRO_PUMP), LEVEL_UP_END }; -#endif //P_GEN_4_CROSS_EVOS +#endif //P_GEN_2_CROSS_EVOS #endif //P_FAMILY_HORSEA #if P_FAMILY_GOLDEEN From 91f429b5e59d2693729a4f070d9427198b4bf75e Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 22 Jan 2024 13:55:08 +0100 Subject: [PATCH 11/11] Fixes Glimmering Charm (#4047) Co-authored-by: Eduardo Quezada D'Ottone --- .../items/icon_palettes/glimmering_charm.pal | 27 +++++++++--------- graphics/items/icons/glimmering_charm.png | Bin 324 -> 323 bytes 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/graphics/items/icon_palettes/glimmering_charm.pal b/graphics/items/icon_palettes/glimmering_charm.pal index 813886d85a..ff3b601987 100644 --- a/graphics/items/icon_palettes/glimmering_charm.pal +++ b/graphics/items/icon_palettes/glimmering_charm.pal @@ -1,18 +1,19 @@ JASC-PAL 0100 -15 -114 109 97 +16 0 0 0 -115 62 231 -57 95 90 -52 103 15 -48 101 216 -225 59 159 -136 154 143 +49 49 49 60 195 171 -76 204 74 -202 150 255 -142 191 235 -242 193 215 -238 219 161 +57 95 90 255 255 255 +255 204 227 +202 150 255 +115 62 231 +48 101 216 +219 48 105 +76 204 74 +52 103 15 +136 154 143 +142 191 235 +255 211 201 +255 235 173 diff --git a/graphics/items/icons/glimmering_charm.png b/graphics/items/icons/glimmering_charm.png index bbed0dcb0490aea8ea664740b7aefc1561505ba5..89094731444edfca2a0f21e630fa3117f3b48fa4 100644 GIT binary patch delta 308 zcmX@YbeL&^L_G&H0|UeLm1j=@DT4r?5LX~=XlQ72c(rAG)PEp2^Z3-X|HXFC4N`C1 zHpuij<7JZ0-!ZGdZ~yE6mrwqGz4qv&=hZ+x0wqCy!3-b`NZ>#~w=+;~lc$Sgh{nX! ziJU@*6?m8pr%5wu{`tRM)F7CtKCF*ZyQjZpgGz9sxTnmev&vH&HA1JhF3z}bF@L}E z;|2{!gN`)lE47=Hu<0000ISs=>*001peOjJd3ZD9Za0CPU)IbT{dXAdxC*x@^$ zh?dfpO3If1j=$^j!PoBFq5uE?-v3)H00001bW%=J06^y0W&i*H0b)x>L;#2d z9Y_EG0Jup+K~xyiV_*OQW@AGE1}I=|Ha0dk1T$F#jX}Z?9)AZ=97KZ&iDpA%gL0r^ z2e1wX3-RL&48mYD3>b`Sij5&^fuLqhF`Qj}O6LH~n%dIcF>ub=$=B7O9P`?D)2DBT zaM-Unzbl7xp4YuQGPipJMA^AFcki4z2i3!O_wL~DeUiebvm0WLY$p)w5YXYSsqg*%7+E}RMSK>-qn9ZCZLtN%pW5=Rn~00000NkvXX Hu0mjfkqm%F