From 2f03ac31b9892ed35bde167bb5a33b16e5c896b0 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Thu, 23 Sep 2021 14:31:21 +1200 Subject: [PATCH 01/32] Multihit refactor and Parental Bond Port multihit system from the CFRU, implement Parental Bond, refactor certain moves as required and implement all remaining multi hit moves except Dragon Darts. --- data/battle_scripts_1.s | 111 ++--- include/battle.h | 9 +- include/battle_scripts.h | 2 + include/battle_util.h | 4 + include/constants/battle.h | 111 +++-- include/constants/battle_config.h | 2 + include/constants/battle_script_commands.h | 51 +-- src/battle_main.c | 3 + src/battle_script_commands.c | 470 +++++++++++++-------- src/battle_util.c | 150 +++++++ src/data/battle_moves.h | 10 +- 11 files changed, 590 insertions(+), 333 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 324bb62a6..7d06e34e7 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -48,7 +48,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectBide @ EFFECT_BIDE .4byte BattleScript_EffectRampage @ EFFECT_RAMPAGE .4byte BattleScript_EffectRoar @ EFFECT_ROAR - .4byte BattleScript_EffectMultiHit @ EFFECT_MULTI_HIT + .4byte BattleScript_EffectHit @ EFFECT_MULTI_HIT .4byte BattleScript_EffectConversion @ EFFECT_CONVERSION .4byte BattleScript_EffectFlinchHit @ EFFECT_FLINCH_HIT .4byte BattleScript_EffectRestoreHp @ EFFECT_RESTORE_HP @@ -63,11 +63,11 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectDragonRage @ EFFECT_DRAGON_RAGE .4byte BattleScript_EffectTrap @ EFFECT_TRAP .4byte BattleScript_EffectHealBlock @ EFFECT_HEAL_BLOCK - .4byte BattleScript_EffectDoubleHit @ EFFECT_DOUBLE_HIT + .4byte BattleScript_EffectHit @ EFFECT_DOUBLE_HIT .4byte BattleScript_EffectRecoilIfMiss @ EFFECT_RECOIL_IF_MISS .4byte BattleScript_EffectMist @ EFFECT_MIST .4byte BattleScript_EffectFocusEnergy @ EFFECT_FOCUS_ENERGY - .4byte BattleScript_EffectRecoil25 @ EFFECT_RECOIL_25 + .4byte BattleScript_EffectHit @ EFFECT_RECOIL_25 .4byte BattleScript_EffectConfuse @ EFFECT_CONFUSE .4byte BattleScript_EffectAttackUp2 @ EFFECT_ATTACK_UP_2 .4byte BattleScript_EffectDefenseUp2 @ EFFECT_DEFENSE_UP_2 @@ -217,7 +217,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectSnatch @ EFFECT_SNATCH .4byte BattleScript_EffectHit @ EFFECT_LOW_KICK .4byte BattleScript_EffectSecretPower @ EFFECT_SECRET_POWER - .4byte BattleScript_EffectRecoil33 @ EFFECT_RECOIL_33 + .4byte BattleScript_EffectHit @ EFFECT_RECOIL_33 .4byte BattleScript_EffectTeeterDance @ EFFECT_TEETER_DANCE .4byte BattleScript_EffectHitEscape @ EFFECT_HIT_ESCAPE .4byte BattleScript_EffectMudSport @ EFFECT_MUD_SPORT @@ -306,9 +306,9 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectGrowth @ EFFECT_GROWTH .4byte BattleScript_EffectCloseCombat @ EFFECT_CLOSE_COMBAT .4byte BattleScript_EffectLastResort @ EFFECT_LAST_RESORT - .4byte BattleScript_EffectRecoil33WithStatus @ EFFECT_RECOIL_33_STATUS + .4byte BattleScript_EffectHit @ EFFECT_RECOIL_33_STATUS .4byte BattleScript_EffectFlinchWithStatus @ EFFECT_FLINCH_STATUS - .4byte BattleScript_EffectRecoil50 @ EFFECT_RECOIL_50 + .4byte BattleScript_EffectHit @ EFFECT_RECOIL_50 .4byte BattleScript_EffectShellSmash @ EFFECT_SHELL_SMASH .4byte BattleScript_EffectShiftGear @ EFFECT_SHIFT_GEAR .4byte BattleScript_EffectDefenseUp3 @ EFFECT_DEFENSE_UP_3 @@ -407,9 +407,11 @@ BattleScript_EffectBurnUp: attackstring ppreduce jumpiftype BS_ATTACKER, TYPE_FIRE, BattleScript_BurnUpWorks - goto BattleScript_ButItFailed + goto BattleScript_MoveEnd BattleScript_BurnUpWorks: accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + setmoveeffect MOVE_EFFECT_BURN_UP + seteffectwithchance critcalc damagecalc adjustdamage @@ -424,11 +426,14 @@ BattleScript_BurnUpWorks: waitmessage B_WAIT_TIME_LONG resultmessage waitmessage B_WAIT_TIME_LONG + tryfaintmon BS_TARGET, FALSE, NULL + goto BattleScript_MoveEnd + +BattleScript_BurnUpRemoveType:: losetype BS_ATTACKER, TYPE_FIRE printstring STRINGID_ATTACKERLOSTFIRETYPE waitmessage B_WAIT_TIME_LONG - tryfaintmon BS_TARGET, FALSE, NULL - goto BattleScript_MoveEnd + return BattleScript_EffectPurify: attackcanceler @@ -2593,6 +2598,8 @@ BattleScript_MultiHitPrintStrings:: copyarray gBattleTextBuff1, sMULTIHIT_STRING, 6 printstring STRINGID_HITXTIMES waitmessage B_WAIT_TIME_LONG + return + BattleScript_MultiHitEnd:: seteffectwithchance tryfaintmon BS_TARGET, FALSE, NULL @@ -3497,57 +3504,16 @@ BattleScript_PartyHealEnd:: BattleScript_EffectTripleKick:: attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - sethword sTRIPLE_KICK_POWER, 0 - initmultihitstring - setmultihit 3 -BattleScript_TripleKickLoop:: - jumpifhasnohp BS_ATTACKER, BattleScript_TripleKickEnd - jumpifhasnohp BS_TARGET, BattleScript_TripleKickNoMoreHits - jumpifhalfword CMP_EQUAL, gChosenMove, MOVE_SLEEP_TALK, BattleScript_DoTripleKickAttack - jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_TripleKickNoMoreHits -BattleScript_DoTripleKickAttack:: - accuracycheck BattleScript_TripleKickNoMoreHits, ACC_CURR_MOVE - movevaluescleanup - addbyte sTRIPLE_KICK_POWER, 10 - addbyte sMULTIHIT_STRING + 4, 1 - critcalc - damagecalc - adjustdamage - jumpifmovehadnoeffect BattleScript_TripleKickNoMoreHits - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - printstring STRINGID_EMPTYSTRING3 - waitmessage 1 - moveendto MOVEEND_NEXT_TARGET - jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_FOE_ENDURED, BattleScript_TripleKickPrintStrings - decrementmultihit BattleScript_TripleKickLoop - goto BattleScript_TripleKickPrintStrings -BattleScript_TripleKickNoMoreHits:: - pause B_WAIT_TIME_SHORT - jumpifbyte CMP_EQUAL, sMULTIHIT_STRING + 4, 0, BattleScript_TripleKickPrintStrings - bichalfword gMoveResultFlags, MOVE_RESULT_MISSED -BattleScript_TripleKickPrintStrings:: - resultmessage - waitmessage B_WAIT_TIME_LONG - jumpifbyte CMP_EQUAL, sMULTIHIT_STRING + 4, 0, BattleScript_TripleKickEnd - jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_TripleKickEnd - copyarray gBattleTextBuff1, sMULTIHIT_STRING, 6 - printstring STRINGID_HITXTIMES - waitmessage B_WAIT_TIME_LONG -BattleScript_TripleKickEnd:: - seteffectwithchance - tryfaintmon BS_TARGET, FALSE, NULL - moveendfrom MOVEEND_UPDATE_LAST_MOVES - end + jumpifmove MOVE_TRIPLE_AXEL BS_TripleAxel + addbyte sTRIPLE_KICK_POWER 10 + goto BattleScript_HitFromAtkString + +BS_TripleAxel: + addbyte sTRIPLE_KICK_POWER 20 + goto BattleScript_HitFromAtkString BattleScript_EffectThief:: setmoveeffect MOVE_EFFECT_STEAL_ITEM @@ -4064,6 +4030,7 @@ BattleScript_EffectTeleport: setoutcomeonteleport BS_ATTACKER goto BattleScript_MoveEnd +.if B_BEAT_UP_DMG < GEN_5 BattleScript_EffectBeatUp:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -4096,6 +4063,13 @@ BattleScript_BeatUpAttack:: goto BattleScript_BeatUpLoop BattleScript_BeatUpEnd:: end +.else +BattleScript_EffectBeatUp:: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + addbyte gBattleCommunication, 1 + goto BattleScript_HitFromAtkString +.endif BattleScript_EffectSemiInvulnerable:: jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_SecondTurnSemiInvulnerable @@ -4717,24 +4691,6 @@ BattleScript_EffectSecretPower:: getsecretpowereffect goto BattleScript_EffectHit -BattleScript_EffectRecoil25: - setmoveeffect MOVE_EFFECT_RECOIL_25 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - jumpifnotmove MOVE_STRUGGLE, BattleScript_EffectHit - incrementgamestat GAME_STAT_USED_STRUGGLE - goto BattleScript_EffectHit - -BattleScript_EffectRecoil33:: - setmoveeffect MOVE_EFFECT_RECOIL_33 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit - -BattleScript_EffectRecoil33WithStatus: - setmoveeffect MOVE_EFFECT_RECOIL_33_STATUS | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit - -BattleScript_EffectRecoil50: - setmoveeffect MOVE_EFFECT_RECOIL_50 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit - BattleScript_EffectTeeterDance:: attackcanceler attackstring @@ -6657,7 +6613,6 @@ BattleScript_MoveEffectConfusion:: BattleScript_MoveEffectRecoilWithStatus:: argumentstatuseffect - copyword gBattleMoveDamage, sSAVED_DMG BattleScript_MoveEffectRecoil:: jumpifmove MOVE_STRUGGLE, BattleScript_DoRecoil jumpifability BS_ATTACKER, ABILITY_ROCK_HEAD, BattleScript_RecoilEnd @@ -7600,6 +7555,7 @@ BattleScript_BerryCureSlpRet:: BattleScript_GemActivates:: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL waitanimation + setlastuseditem BS_ATTACKER printstring STRINGID_GEMACTIVATES waitmessage B_WAIT_TIME_LONG removeitem BS_ATTACKER @@ -7608,6 +7564,7 @@ BattleScript_GemActivates:: BattleScript_BerryReduceDmg:: playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT, NULL waitanimation + setlastuseditem BS_TARGET printstring STRINGID_TARGETATEITEM waitmessage B_WAIT_TIME_LONG removeitem BS_TARGET diff --git a/include/battle.h b/include/battle.h index 36646c9fe..98c9a825e 100644 --- a/include/battle.h +++ b/include/battle.h @@ -162,15 +162,20 @@ struct SpecialStatus u8 traced:1; u8 ppNotAffectedByPressure:1; u8 flag40:1; - u8 focusBanded:1; + // end of byte + u8 focusBanded:1; u8 focusSashed:1; u8 sturdied:1; u8 stormDrainRedirected:1; u8 switchInAbilityDone:1; - u8 switchInItemDone:1; + u8 switchInItemDone:1; + // end of byte, two bits unused u8 instructedChosenTarget:3; u8 berryReduced:1; u8 gemBoost:1; + u8 parentalBondOn:2; + u8 multiHitOn:1; + // end of byte u8 gemParam; u8 damagedMons:4; // Mons that have been damaged directly by using a move, includes substitute. u8 dancerUsedMove:1; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index b15ab3aeb..2229f0a05 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -384,5 +384,7 @@ extern const u8 BattleScript_MentalHerbCureEnd2[]; extern const u8 BattleScript_TerrainPreventsEnd2[]; extern const u8 BattleScript_MistyTerrainPrevents[]; extern const u8 BattleScript_ElectricTerrainPrevents[]; +extern const u8 BattleScript_MultiHitPrintStrings[]; +extern const u8 BattleScript_BurnUpRemoveType[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index 26bfe3c7c..25be32939 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -152,6 +152,7 @@ bool32 CompareStat(u8 battlerId, u8 statId, u8 cmpTo, u8 cmpKind); bool32 TryRoomService(u8 battlerId); void BufferStatChange(u8 battlerId, u8 statId, u8 stringId); void DoBurmyFormChange(u32 monId); +bool8 IsMoveAffectedByParentalBond(u16 move, u8 battlerId); // ability checks bool32 IsRolePlayBannedAbilityAtk(u16 ability); @@ -170,4 +171,7 @@ bool32 CanBeFrozen(u8 battlerId); bool32 CanBeConfused(u8 battlerId); bool32 IsBattlerTerrainAffected(u8 battlerId, u32 terrainFlag); +// Move checks +bool8 IsTwoStrikesMove(u16 move); + #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 73d5c3deb..18001a1a2 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -291,63 +291,60 @@ #define MOVE_EFFECT_PAYDAY 0xB #define MOVE_EFFECT_CHARGING 0xC #define MOVE_EFFECT_WRAP 0xD -#define MOVE_EFFECT_RECOIL_25 0xE -#define MOVE_EFFECT_ATK_PLUS_1 0xF -#define MOVE_EFFECT_DEF_PLUS_1 0x10 -#define MOVE_EFFECT_SPD_PLUS_1 0x11 -#define MOVE_EFFECT_SP_ATK_PLUS_1 0x12 -#define MOVE_EFFECT_SP_DEF_PLUS_1 0x13 -#define MOVE_EFFECT_ACC_PLUS_1 0x14 -#define MOVE_EFFECT_EVS_PLUS_1 0x15 -#define MOVE_EFFECT_ATK_MINUS_1 0x16 -#define MOVE_EFFECT_DEF_MINUS_1 0x17 -#define MOVE_EFFECT_SPD_MINUS_1 0x18 -#define MOVE_EFFECT_SP_ATK_MINUS_1 0x19 -#define MOVE_EFFECT_SP_DEF_MINUS_1 0x1A -#define MOVE_EFFECT_ACC_MINUS_1 0x1B -#define MOVE_EFFECT_EVS_MINUS_1 0x1C -#define MOVE_EFFECT_RECHARGE 0x1D -#define MOVE_EFFECT_RAGE 0x1E -#define MOVE_EFFECT_STEAL_ITEM 0x1F -#define MOVE_EFFECT_PREVENT_ESCAPE 0x20 -#define MOVE_EFFECT_NIGHTMARE 0x21 -#define MOVE_EFFECT_ALL_STATS_UP 0x22 -#define MOVE_EFFECT_RAPIDSPIN 0x23 -#define MOVE_EFFECT_REMOVE_STATUS 0x24 -#define MOVE_EFFECT_ATK_DEF_DOWN 0x25 -#define MOVE_EFFECT_RECOIL_33 0x26 -#define MOVE_EFFECT_ATK_PLUS_2 0x27 -#define MOVE_EFFECT_DEF_PLUS_2 0x28 -#define MOVE_EFFECT_SPD_PLUS_2 0x29 -#define MOVE_EFFECT_SP_ATK_PLUS_2 0x2A -#define MOVE_EFFECT_SP_DEF_PLUS_2 0x2B -#define MOVE_EFFECT_ACC_PLUS_2 0x2C -#define MOVE_EFFECT_EVS_PLUS_2 0x2D -#define MOVE_EFFECT_ATK_MINUS_2 0x2E -#define MOVE_EFFECT_DEF_MINUS_2 0x2F -#define MOVE_EFFECT_SPD_MINUS_2 0x30 -#define MOVE_EFFECT_SP_ATK_MINUS_2 0x31 -#define MOVE_EFFECT_SP_DEF_MINUS_2 0x32 -#define MOVE_EFFECT_ACC_MINUS_2 0x33 -#define MOVE_EFFECT_EVS_MINUS_2 0x34 -#define MOVE_EFFECT_THRASH 0x35 -#define MOVE_EFFECT_KNOCK_OFF 0x36 -#define MOVE_EFFECT_DEF_SPDEF_DOWN 0x37 -#define MOVE_EFFECT_RECOIL_33_STATUS 0x38 -#define MOVE_EFFECT_RECOIL_50 0x39 -#define MOVE_EFFECT_CLEAR_SMOG 0x3A -#define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x3B -#define MOVE_EFFECT_SMACK_DOWN 0x3C -#define MOVE_EFFECT_FLAME_BURST 0x3D -#define MOVE_EFFECT_FEINT 0x3E -#define MOVE_EFFECT_SPECTRAL_THIEF 0x3F -#define MOVE_EFFECT_V_CREATE 0x40 -#define MOVE_EFFECT_HAPPY_HOUR 0x41 -#define MOVE_EFFECT_CORE_ENFORCER 0x42 -#define MOVE_EFFECT_THROAT_CHOP 0x43 -#define MOVE_EFFECT_INCINERATE 0x44 -#define MOVE_EFFECT_BUG_BITE 0x45 -#define NUM_MOVE_EFFECTS 0x46 +#define MOVE_EFFECT_ATK_PLUS_1 0xE +#define MOVE_EFFECT_DEF_PLUS_1 0xF +#define MOVE_EFFECT_SPD_PLUS_1 0x10 +#define MOVE_EFFECT_SP_ATK_PLUS_1 0x11 +#define MOVE_EFFECT_SP_DEF_PLUS_1 0x12 +#define MOVE_EFFECT_ACC_PLUS_1 0x13 +#define MOVE_EFFECT_EVS_PLUS_1 0x14 +#define MOVE_EFFECT_ATK_MINUS_1 0x15 +#define MOVE_EFFECT_DEF_MINUS_1 0x16 +#define MOVE_EFFECT_SPD_MINUS_1 0x17 +#define MOVE_EFFECT_SP_ATK_MINUS_1 0x18 +#define MOVE_EFFECT_SP_DEF_MINUS_1 0x19 +#define MOVE_EFFECT_ACC_MINUS_1 0x1A +#define MOVE_EFFECT_EVS_MINUS_1 0x1B +#define MOVE_EFFECT_RECHARGE 0x1C +#define MOVE_EFFECT_RAGE 0x1D +#define MOVE_EFFECT_STEAL_ITEM 0x1E +#define MOVE_EFFECT_PREVENT_ESCAPE 0x1F +#define MOVE_EFFECT_NIGHTMARE 0x20 +#define MOVE_EFFECT_ALL_STATS_UP 0x21 +#define MOVE_EFFECT_RAPIDSPIN 0x22 +#define MOVE_EFFECT_REMOVE_STATUS 0x23 +#define MOVE_EFFECT_ATK_DEF_DOWN 0x24 +#define MOVE_EFFECT_ATK_PLUS_2 0x25 +#define MOVE_EFFECT_DEF_PLUS_2 0x26 +#define MOVE_EFFECT_SPD_PLUS_2 0x27 +#define MOVE_EFFECT_SP_ATK_PLUS_2 0x28 +#define MOVE_EFFECT_SP_DEF_PLUS_2 0x29 +#define MOVE_EFFECT_ACC_PLUS_2 0x2A +#define MOVE_EFFECT_EVS_PLUS_2 0x2B +#define MOVE_EFFECT_ATK_MINUS_2 0x2C +#define MOVE_EFFECT_DEF_MINUS_2 0x2D +#define MOVE_EFFECT_SPD_MINUS_2 0x2E +#define MOVE_EFFECT_SP_ATK_MINUS_2 0x2F +#define MOVE_EFFECT_SP_DEF_MINUS_2 0x30 +#define MOVE_EFFECT_ACC_MINUS_2 0x31 +#define MOVE_EFFECT_EVS_MINUS_2 0x32 +#define MOVE_EFFECT_THRASH 0x33 +#define MOVE_EFFECT_KNOCK_OFF 0x34 +#define MOVE_EFFECT_DEF_SPDEF_DOWN 0x35 +#define MOVE_EFFECT_CLEAR_SMOG 0x36 +#define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x37 +#define MOVE_EFFECT_SMACK_DOWN 0x38 +#define MOVE_EFFECT_FLAME_BURST 0x39 +#define MOVE_EFFECT_FEINT 0x3A +#define MOVE_EFFECT_SPECTRAL_THIEF 0x3B +#define MOVE_EFFECT_V_CREATE 0x3C +#define MOVE_EFFECT_HAPPY_HOUR 0x3D +#define MOVE_EFFECT_CORE_ENFORCER 0x3E +#define MOVE_EFFECT_THROAT_CHOP 0x3F +#define MOVE_EFFECT_INCINERATE 0x40 +#define MOVE_EFFECT_BUG_BITE 0x41 +#define MOVE_EFFECT_BURN_UP 0x42 +#define NUM_MOVE_EFFECTS 0x43 #define MOVE_EFFECT_AFFECTS_USER 0x4000 #define MOVE_EFFECT_CERTAIN 0x8000 diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index b2559dbb7..e1888a500 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -96,6 +96,7 @@ #define B_RECOIL_IF_MISS_DMG GEN_7 // In Gen5+, Jump Kick and High Jump Kick will always do half of the user's max HP when missing. #define B_PSYWAVE_DMG GEN_7 // Psywave's damage formula. See Cmd_psywavedamageeffect. #define B_BADGE_BOOST GEN_7 // In Gen4+, Gym Badges no longer boost a Pokémon's stats. +#define B_BEAT_UP_DMG GEN_8 // In Gen5+, Beat Up uses a different formula to calculate the damage of each hit, and deals Dark-type damage. // Move data settings #define B_UPDATED_MOVE_DATA GEN_8 // Updates move data in gBattleMoves, including Power, Accuracy, PP, stat changes, targets, chances of secondary effects, etc. @@ -128,6 +129,7 @@ #define B_FLASH_FIRE_FROZEN GEN_7 // In Gen5+, Flash Fire can trigger even when frozen, when it couldn't before. #define B_SYNCHRONIZE_NATURE GEN_8 // In Gen8, if the Pokémon with Synchronize is leading the party, it's 100% guaranteed that wild Pokémon will have the same ability, as opposed to 50% previously. #define B_UPDATED_INTIMIDATE GEN_8 // In Gen8, Intimidate doesn't work on opponents with the Inner Focus, Scrappy, Own Tempo or Oblivious abilities. +#define B_PARENTAL_BOND_DAMAGE GEN_8 // In Gen7+, Parental Bond's second hit does 25% of the initial hits damage. Before, it did 50%. // Item settings #define B_HP_BERRIES GEN_7 // In Gen4+, berries which restore hp activate immediately after HP drops to half. In Gen3, the effect occurs at the end of the turn. diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 66f592503..0b037b9a1 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -217,36 +217,39 @@ #define PARTY_SCREEN_OPTIONAL (1 << 7) // Flag for first argument to openpartyscreen // cases for Cmd_moveend -#define MOVEEND_PROTECT_LIKE_EFFECT 0 -#define MOVEEND_RAGE 1 -#define MOVEEND_DEFROST 2 +#define MOVEEND_SUM_DAMAGE 0 +#define MOVEEND_PROTECT_LIKE_EFFECT 1 +#define MOVEEND_RAGE 2 #define MOVEEND_SYNCHRONIZE_TARGET 3 #define MOVEEND_ABILITIES 4 #define MOVEEND_ABILITIES_ATTACKER 5 #define MOVEEND_STATUS_IMMUNITY_ABILITIES 6 #define MOVEEND_SYNCHRONIZE_ATTACKER 7 #define MOVEEND_CHOICE_MOVE 8 -#define MOVEEND_CHANGED_ITEMS 9 -#define MOVEEND_ATTACKER_INVISIBLE 10 -#define MOVEEND_ATTACKER_VISIBLE 11 -#define MOVEEND_TARGET_VISIBLE 12 -#define MOVEEND_ITEM_EFFECTS_TARGET 13 -#define MOVEEND_MOVE_EFFECTS2 14 -#define MOVEEND_ITEM_EFFECTS_ALL 15 -#define MOVEEND_KINGSROCK 16 // These item effects will occur each strike of a multi-hit move -#define MOVEEND_SUBSTITUTE 17 -#define MOVEEND_UPDATE_LAST_MOVES 18 -#define MOVEEND_MIRROR_MOVE 19 -#define MOVEEND_NEXT_TARGET 20 // Everything up until here is handled for each strike of a multi-hit move -#define MOVEEND_EJECT_BUTTON 21 -#define MOVEEND_RED_CARD 22 -#define MOVEEND_EJECT_PACK 23 -#define MOVEEND_LIFEORB_SHELLBELL 24 // Includes shell bell, throat spray, etc -#define MOVEEND_PICKPOCKET 25 -#define MOVEEND_DANCER 26 -#define MOVEEND_EMERGENCY_EXIT 27 -#define MOVEEND_CLEAR_BITS 28 -#define MOVEEND_COUNT 29 +#define MOVEEND_ATTACKER_INVISIBLE 9 +#define MOVEEND_ATTACKER_VISIBLE 10 +#define MOVEEND_TARGET_VISIBLE 11 +#define MOVEEND_ITEM_EFFECTS_TARGET 12 +#define MOVEEND_ITEM_EFFECTS_ALL 13 +#define MOVEEND_KINGSROCK 14 +#define MOVEEND_SUBSTITUTE 15 +#define MOVEEND_UPDATE_LAST_MOVES 16 +#define MOVEEND_MIRROR_MOVE 17 +#define MOVEEND_NEXT_TARGET 18 // Everything up until here is handled for each strike of a multi-hit move +#define MOVEEND_MULTIHIT_MOVE 19 +#define MOVEEND_MOVE_EFFECTS2 20 +#define MOVEEND_RECOIL 21 +#define MOVEEND_EJECT_BUTTON 22 +#define MOVEEND_RED_CARD 23 +#define MOVEEND_EJECT_PACK 24 +#define MOVEEND_LIFEORB_SHELLBELL 25 // Includes shell bell, throat spray, etc +#define MOVEEND_CHANGED_ITEMS 26 +#define MOVEEND_DEFROST 27 +#define MOVEEND_PICKPOCKET 28 +#define MOVEEND_DANCER 29 +#define MOVEEND_EMERGENCY_EXIT 30 +#define MOVEEND_CLEAR_BITS 31 +#define MOVEEND_COUNT 32 // switch cases #define B_SWITCH_NORMAL 0 diff --git a/src/battle_main.c b/src/battle_main.c index 72d05a0fd..074633437 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2894,6 +2894,7 @@ static void BattleStartClearSetData(void) gBattleScripting.monCaught = FALSE; gMultiHitCounter = 0; + gBattleScripting.savedDmg = 0; gBattleOutcome = 0; gBattleControllerExecFlags = 0; gPaydayMoney = 0; @@ -4563,6 +4564,8 @@ static void TurnValuesCleanUp(bool8 var0) if (gDisableStructs[gActiveBattler].substituteHP == 0) gBattleMons[gActiveBattler].status2 &= ~(STATUS2_SUBSTITUTE); + + gSpecialStatuses[gActiveBattler].parentalBondOn = 0; } gSideStatuses[0] &= ~(SIDE_STATUS_QUICK_GUARD | SIDE_STATUS_WIDE_GUARD | SIDE_STATUS_CRAFTY_SHIELD | SIDE_STATUS_MAT_BLOCK); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 5840e8805..4e8af061e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -862,8 +862,6 @@ static const u8* const sMoveEffectBS_Ptrs[] = [MOVE_EFFECT_UPROAR] = BattleScript_MoveEffectUproar, [MOVE_EFFECT_PAYDAY] = BattleScript_MoveEffectPayDay, [MOVE_EFFECT_WRAP] = BattleScript_MoveEffectWrap, - [MOVE_EFFECT_RECOIL_25] = BattleScript_MoveEffectRecoil, - [MOVE_EFFECT_RECOIL_33] = BattleScript_MoveEffectRecoil, }; static const struct WindowTemplate sUnusedWinTemplate = {0, 1, 3, 7, 0xF, 0x1F, 0x3F}; @@ -908,6 +906,7 @@ static const u16 sProtectSuccessRates[] = {USHRT_MAX, USHRT_MAX / 2, USHRT_MAX / #define FORBIDDEN_ASSIST 0x4 #define FORBIDDEN_COPYCAT 0x8 #define FORBIDDEN_SLEEP_TALK 0x10 +#define FORBIDDEN_PARENTAL_BOND 0x20 #define FORBIDDEN_INSTRUCT_END 0xFFFF @@ -917,27 +916,34 @@ static const u8 sForbiddenMoves[MOVES_COUNT] = [MOVE_STRUGGLE] = 0xFF, // Neither Struggle [MOVE_AFTER_YOU] = FORBIDDEN_METRONOME, [MOVE_APPLE_ACID] = FORBIDDEN_METRONOME, + [MOVE_ARM_THRUST] = FORBIDDEN_PARENTAL_BOND, [MOVE_ASSIST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, [MOVE_ASTRAL_BARRAGE] = FORBIDDEN_METRONOME, [MOVE_AURA_WHEEL] = FORBIDDEN_METRONOME, [MOVE_BADDY_BAD] = FORBIDDEN_METRONOME, [MOVE_BANEFUL_BUNKER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_BARRAGE] = FORBIDDEN_PARENTAL_BOND, [MOVE_BEAK_BLAST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_BEAT_UP] = FORBIDDEN_PARENTAL_BOND, [MOVE_BEHEMOTH_BASH] = FORBIDDEN_METRONOME | FORBIDDEN_COPYCAT, [MOVE_BEHEMOTH_BLADE] = FORBIDDEN_METRONOME | FORBIDDEN_COPYCAT, [MOVE_BELCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, [MOVE_BESTOW] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_BIDE] = FORBIDDEN_SLEEP_TALK, [MOVE_BODY_PRESS] = FORBIDDEN_METRONOME, - [MOVE_BOUNCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK, + [MOVE_BONE_RUSH] = FORBIDDEN_PARENTAL_BOND, + [MOVE_BONEMERANG] = FORBIDDEN_PARENTAL_BOND, + [MOVE_BOUNCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_PARENTAL_BOND, [MOVE_BOUNCY_BUBBLE] = FORBIDDEN_METRONOME, [MOVE_BRANCH_POKE] = FORBIDDEN_METRONOME, [MOVE_BREAKING_SWIPE] = FORBIDDEN_METRONOME, + [MOVE_BULLET_SEED] = FORBIDDEN_PARENTAL_BOND, [MOVE_BUZZY_BUZZ] = FORBIDDEN_METRONOME, [MOVE_CELEBRATE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, [MOVE_CHATTER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK, [MOVE_CIRCLE_THROW] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_CLANGOROUS_SOUL] = FORBIDDEN_METRONOME, + [MOVE_COMET_PUNCH] = FORBIDDEN_PARENTAL_BOND, [MOVE_COPYCAT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, [MOVE_COUNTER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_COVET] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, @@ -946,36 +952,54 @@ static const u8 sForbiddenMoves[MOVES_COUNT] = [MOVE_DESTINY_BOND] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_DETECT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_DIAMOND_STORM] = FORBIDDEN_METRONOME, - [MOVE_DIG] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK, - [MOVE_DIVE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK, - [MOVE_DOUBLE_IRON_BASH] = FORBIDDEN_METRONOME, + [MOVE_DIG] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_PARENTAL_BOND, + [MOVE_DIVE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_PARENTAL_BOND, + [MOVE_DOUBLE_IRON_BASH] = FORBIDDEN_METRONOME | FORBIDDEN_PARENTAL_BOND, + [MOVE_DOUBLE_HIT] = FORBIDDEN_PARENTAL_BOND, + [MOVE_DOUBLE_KICK] = FORBIDDEN_PARENTAL_BOND, + [MOVE_DOUBLE_SLAP] = FORBIDDEN_PARENTAL_BOND, [MOVE_DRAGON_ASCENT] = FORBIDDEN_METRONOME, [MOVE_DRAGON_ENERGY] = FORBIDDEN_METRONOME, + [MOVE_DRAGON_DARTS] = FORBIDDEN_PARENTAL_BOND, [MOVE_DRAGON_TAIL] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_DRUM_BEATING] = FORBIDDEN_METRONOME, + [MOVE_DUAL_CHOP] = FORBIDDEN_PARENTAL_BOND, + [MOVE_DUAL_WINGBEAT] = FORBIDDEN_PARENTAL_BOND, [MOVE_DYNAMAX_CANNON] = FORBIDDEN_METRONOME | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_ENDEAVOR] = FORBIDDEN_PARENTAL_BOND, [MOVE_ENDURE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_ETERNABEAM] = FORBIDDEN_METRONOME, + [MOVE_EXPLOSION] = FORBIDDEN_PARENTAL_BOND, [MOVE_FALSE_SURRENDER] = FORBIDDEN_METRONOME, [MOVE_FEINT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_FIERY_WRATH] = FORBIDDEN_METRONOME, + [MOVE_FINAL_GAMBIT] = FORBIDDEN_PARENTAL_BOND, + [MOVE_FISSURE] = FORBIDDEN_PARENTAL_BOND, [MOVE_FLEUR_CANNON] = FORBIDDEN_METRONOME, + [MOVE_FLING] = FORBIDDEN_PARENTAL_BOND, [MOVE_FLOATY_FALL] = FORBIDDEN_METRONOME, - [MOVE_FLY] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK, + [MOVE_FLY] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_PARENTAL_BOND, [MOVE_FOCUS_PUNCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, [MOVE_FOLLOW_ME] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, - [MOVE_FREEZE_SHOCK] = FORBIDDEN_METRONOME | FORBIDDEN_SLEEP_TALK, + [MOVE_FREEZE_SHOCK] = FORBIDDEN_METRONOME | FORBIDDEN_SLEEP_TALK | FORBIDDEN_PARENTAL_BOND, [MOVE_FREEZING_GLARE] = FORBIDDEN_METRONOME, [MOVE_FREEZY_FROST] = FORBIDDEN_METRONOME, - [MOVE_GEOMANCY] = FORBIDDEN_SLEEP_TALK, + [MOVE_FURY_ATTACK] = FORBIDDEN_PARENTAL_BOND, + [MOVE_FURY_SWIPES] = FORBIDDEN_PARENTAL_BOND, + [MOVE_GEAR_GRIND] = FORBIDDEN_PARENTAL_BOND, + [MOVE_GEOMANCY] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_PARENTAL_BOND, [MOVE_GLACIAL_LANCE] = FORBIDDEN_METRONOME, [MOVE_GLITZY_GLOW] = FORBIDDEN_METRONOME, [MOVE_GRAV_APPLE] = FORBIDDEN_METRONOME, + [MOVE_GUILLOTINE] = FORBIDDEN_PARENTAL_BOND, [MOVE_HELPING_HAND] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_HOLD_HANDS] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_HORN_DRILL] = FORBIDDEN_PARENTAL_BOND, [MOVE_HYPERSPACE_FURY] = FORBIDDEN_METRONOME, [MOVE_HYPERSPACE_HOLE] = FORBIDDEN_METRONOME, - [MOVE_ICE_BURN] = FORBIDDEN_METRONOME | FORBIDDEN_SLEEP_TALK, + [MOVE_ICE_BALL] = FORBIDDEN_PARENTAL_BOND, + [MOVE_ICE_BURN] = FORBIDDEN_METRONOME | FORBIDDEN_SLEEP_TALK | FORBIDDEN_PARENTAL_BOND, + [MOVE_ICICLE_SPEAR] = FORBIDDEN_PARENTAL_BOND, [MOVE_INSTRUCT] = FORBIDDEN_METRONOME, [MOVE_JUNGLE_HEALING] = FORBIDDEN_METRONOME, [MOVE_KINGS_SHIELD] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, @@ -984,6 +1008,7 @@ static const u8 sForbiddenMoves[MOVES_COUNT] = [MOVE_MAT_BLOCK] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_ME_FIRST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, [MOVE_METEOR_ASSAULT] = FORBIDDEN_METRONOME, + [MOVE_METEOR_BEAM] = FORBIDDEN_PARENTAL_BOND, [MOVE_METRONOME] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, [MOVE_MIMIC] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK, [MOVE_MIND_BLOWN] = FORBIDDEN_METRONOME, @@ -995,9 +1020,10 @@ static const u8 sForbiddenMoves[MOVES_COUNT] = [MOVE_OBSTRUCT] = FORBIDDEN_METRONOME | FORBIDDEN_COPYCAT, [MOVE_ORIGIN_PULSE] = FORBIDDEN_METRONOME, [MOVE_OVERDRIVE] = FORBIDDEN_METRONOME, - [MOVE_PHANTOM_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK, + [MOVE_PHANTOM_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_PARENTAL_BOND, [MOVE_PHOTON_GEYSER] = FORBIDDEN_METRONOME, [MOVE_PIKA_PAPOW] = FORBIDDEN_METRONOME, + [MOVE_PIN_MISSILE] = FORBIDDEN_PARENTAL_BOND, [MOVE_PLASMA_FISTS] = FORBIDDEN_METRONOME, [MOVE_PRECIPICE_BLADES] = FORBIDDEN_METRONOME, [MOVE_PROTECT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, @@ -1005,27 +1031,33 @@ static const u8 sForbiddenMoves[MOVES_COUNT] = [MOVE_QUASH] = FORBIDDEN_METRONOME, [MOVE_QUICK_GUARD] = FORBIDDEN_METRONOME, [MOVE_RAGE_POWDER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, - [MOVE_RAZOR_WIND] = FORBIDDEN_SLEEP_TALK, + [MOVE_RAZOR_WIND] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_PARENTAL_BOND, [MOVE_RELIC_SONG] = FORBIDDEN_METRONOME, [MOVE_ROAR] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_ROCK_BLAST] = FORBIDDEN_PARENTAL_BOND, + [MOVE_ROLLOUT] = FORBIDDEN_PARENTAL_BOND, [MOVE_SAPPY_SEED] = FORBIDDEN_METRONOME, + [MOVE_SCALE_SHOT] = FORBIDDEN_PARENTAL_BOND, [MOVE_SECRET_SWORD] = FORBIDDEN_METRONOME, - [MOVE_SHADOW_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK, + [MOVE_SELF_DESTRUCT] = FORBIDDEN_PARENTAL_BOND, + [MOVE_SHADOW_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_PARENTAL_BOND, + [MOVE_SHEER_COLD] = FORBIDDEN_PARENTAL_BOND, [MOVE_SHELL_TRAP] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, [MOVE_SIZZLY_SLIDE] = FORBIDDEN_METRONOME, [MOVE_SKETCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK, - [MOVE_SKULL_BASH] = FORBIDDEN_SLEEP_TALK, - [MOVE_SKY_ATTACK] = FORBIDDEN_SLEEP_TALK, - [MOVE_SKY_DROP] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK, + [MOVE_SKULL_BASH] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_PARENTAL_BOND, + [MOVE_SKY_ATTACK] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_PARENTAL_BOND, + [MOVE_SKY_DROP] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_PARENTAL_BOND, [MOVE_SLEEP_TALK] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, [MOVE_SNAP_TRAP] = FORBIDDEN_METRONOME, [MOVE_SNARL] = FORBIDDEN_METRONOME, [MOVE_SNATCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_SNORE] = FORBIDDEN_METRONOME, - [MOVE_SOLAR_BEAM] = FORBIDDEN_SLEEP_TALK, - [MOVE_SOLAR_BLADE] = FORBIDDEN_SLEEP_TALK, + [MOVE_SOLAR_BEAM] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_PARENTAL_BOND, + [MOVE_SOLAR_BLADE] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_PARENTAL_BOND, [MOVE_SPARKLY_SWIRL] = FORBIDDEN_METRONOME, [MOVE_SPECTRAL_THIEF] = FORBIDDEN_METRONOME, + [MOVE_SPIKE_CANNON] = FORBIDDEN_PARENTAL_BOND, [MOVE_SPIKY_SHIELD] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_SPIRIT_BREAK] = FORBIDDEN_METRONOME, [MOVE_SPLISHY_SPLASH] = FORBIDDEN_METRONOME, @@ -1034,8 +1066,9 @@ static const u8 sForbiddenMoves[MOVES_COUNT] = [MOVE_STEEL_BEAM] = FORBIDDEN_METRONOME, [MOVE_STRANGE_STEAM] = FORBIDDEN_METRONOME, [MOVE_SUNSTEEL_STRIKE] = FORBIDDEN_METRONOME, - [MOVE_SURGING_STRIKES] = FORBIDDEN_METRONOME, + [MOVE_SURGING_STRIKES] = FORBIDDEN_METRONOME | FORBIDDEN_PARENTAL_BOND, [MOVE_SWITCHEROO] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_TAIL_SLAP] = FORBIDDEN_PARENTAL_BOND, [MOVE_TECHNO_BLAST] = FORBIDDEN_METRONOME, [MOVE_THIEF] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_THOUSAND_ARROWS] = FORBIDDEN_METRONOME, @@ -1044,9 +1077,13 @@ static const u8 sForbiddenMoves[MOVES_COUNT] = [MOVE_THUNDEROUS_KICK] = FORBIDDEN_METRONOME, [MOVE_TRANSFORM] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC, [MOVE_TRICK] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, - [MOVE_UPROAR] = FORBIDDEN_SLEEP_TALK, + [MOVE_TRIPLE_AXEL] = FORBIDDEN_PARENTAL_BOND, + [MOVE_TRIPLE_KICK] = FORBIDDEN_PARENTAL_BOND, + [MOVE_TWINEEDLE] = FORBIDDEN_PARENTAL_BOND, + [MOVE_UPROAR] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_PARENTAL_BOND, [MOVE_V_CREATE] = FORBIDDEN_METRONOME, [MOVE_VEEVEE_VOLLEY] = FORBIDDEN_METRONOME, + [MOVE_WATER_SHURIKEN] = FORBIDDEN_PARENTAL_BOND, [MOVE_WHIRLWIND] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_WICKED_BLOW] = FORBIDDEN_METRONOME, [MOVE_WIDE_GUARD] = FORBIDDEN_METRONOME, @@ -1341,6 +1378,17 @@ static void Cmd_attackcanceler(void) if (AtkCanceller_UnableToUseMove()) return; + if (!gSpecialStatuses[gBattlerAttacker].parentalBondOn + && GetBattlerAbility(gBattlerAttacker) == ABILITY_PARENTAL_BOND + && IsMoveAffectedByParentalBond(gCurrentMove, gBattlerAttacker) + && !(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) + { + gSpecialStatuses[gBattlerAttacker].parentalBondOn = 2; + gMultiHitCounter = 2; + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) + return; + } + // Check Protean activation. GET_MOVE_TYPE(gCurrentMove, moveType); if ((GetBattlerAbility(gBattlerAttacker) == ABILITY_PROTEAN || GetBattlerAbility(gBattlerAttacker) == ABILITY_LIBERO) @@ -1669,6 +1717,13 @@ static void Cmd_accuracycheck(void) else if (!JumpIfMoveAffectedByProtect(0)) gBattlescriptCurrInstr += 7; } + else if (gSpecialStatuses[gBattlerAttacker].parentalBondOn == 1 + || (gSpecialStatuses[gBattlerAttacker].multiHitOn && (gBattleMoves[move].effect != EFFECT_TRIPLE_KICK + || GetBattlerAbility(gBattlerAttacker) == ABILITY_SKILL_LINK))) + { + // No acc checks for second hit of Parental Bond or multi hit moves, except Triple Kick/Triple Axel + gBattlescriptCurrInstr += 7; + } else { GET_MOVE_TYPE(move, type); @@ -1749,7 +1804,8 @@ static void Cmd_ppreduce(void) // For item Metronome, echoed voice if (gCurrentMove == gLastResultingMoves[gBattlerAttacker] && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && !WasUnableToUseMove(gBattlerAttacker)) + && !WasUnableToUseMove(gBattlerAttacker) + && gSpecialStatuses[gBattlerAttacker].parentalBondOn != 2) // Don't increment counter on first hit gBattleStruct->sameMoveTurns[gBattlerAttacker]++; else gBattleStruct->sameMoveTurns[gBattlerAttacker] = 0; @@ -2008,6 +2064,12 @@ static void Cmd_attackanimation(void) } else { + if (gSpecialStatuses[gBattlerAttacker].parentalBondOn == 1) // No animation on second hit + { + gBattlescriptCurrInstr++; + return; + } + if ((gBattleMoves[gCurrentMove].target & MOVE_TARGET_BOTH || gBattleMoves[gCurrentMove].target & MOVE_TARGET_FOES_AND_ALLY || gBattleMoves[gCurrentMove].target & MOVE_TARGET_DEPENDS) @@ -2295,10 +2357,12 @@ static void Cmd_resultmessage(void) switch (gMoveResultFlags & (~MOVE_RESULT_MISSED)) { case MOVE_RESULT_SUPER_EFFECTIVE: - stringId = STRINGID_SUPEREFFECTIVE; + if (!gMultiHitCounter) // Don't print effectiveness on each hit in a multi hit attack + stringId = STRINGID_SUPEREFFECTIVE; break; case MOVE_RESULT_NOT_VERY_EFFECTIVE: - stringId = STRINGID_NOTVERYEFFECTIVE; + if (!gMultiHitCounter) + stringId = STRINGID_NOTVERYEFFECTIVE; break; case MOVE_RESULT_ONE_HIT_KO: stringId = STRINGID_ONEHITKO; @@ -2377,7 +2441,6 @@ static void Cmd_resultmessage(void) if (gSpecialStatuses[gBattlerTarget].berryReduced && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { - gLastUsedItem = gBattleMons[gBattlerTarget].item; gSpecialStatuses[gBattlerTarget].berryReduced = 0; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_PrintBerryReduceString; @@ -2524,6 +2587,10 @@ void SetMoveEffect(bool32 primary, u32 certain) switch (gBattleScripting.moveEffect) // Set move effects which happen later on { case MOVE_EFFECT_KNOCK_OFF: + case MOVE_EFFECT_SMACK_DOWN: + case MOVE_EFFECT_REMOVE_STATUS: + case MOVE_EFFECT_STEAL_ITEM: + case MOVE_EFFECT_BURN_UP: gBattleStruct->moveEffect2 = gBattleScripting.moveEffect; gBattlescriptCurrInstr++; return; @@ -3013,61 +3080,6 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattleMons[gBattlerAttacker].status2 |= STATUS2_RAGE; gBattlescriptCurrInstr++; break; - case MOVE_EFFECT_STEAL_ITEM: - { - if (!CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item)) - { - gBattlescriptCurrInstr++; - break; - } - - side = GetBattlerSide(gBattlerAttacker); - if (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT - && !(gBattleTypeFlags & - (BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_FRONTIER - | BATTLE_TYPE_LINK - | BATTLE_TYPE_RECORDED_LINK - | BATTLE_TYPE_SECRET_BASE))) - { - gBattlescriptCurrInstr++; - } - else if (!(gBattleTypeFlags & - (BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_FRONTIER - | BATTLE_TYPE_LINK - | BATTLE_TYPE_RECORDED_LINK - | BATTLE_TYPE_SECRET_BASE)) - && (gWishFutureKnock.knockedOffMons[side] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]])) - { - gBattlescriptCurrInstr++; - } - else if (gBattleMons[gBattlerTarget].item - && gBattleMons[gBattlerTarget].ability == ABILITY_STICKY_HOLD) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_NoItemSteal; - - gLastUsedAbility = gBattleMons[gBattlerTarget].ability; - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); - } - else if (gBattleMons[gBattlerAttacker].item != 0 - || gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY - || gBattleMons[gBattlerTarget].item == 0) - { - gBattlescriptCurrInstr++; - } - else - { - StealTargetItem(gBattlerAttacker, gBattlerTarget); // Attacker steals target item - gBattleMons[gBattlerAttacker].item = 0; // Item assigned later on with thief (see MOVEEND_CHANGED_ITEMS) - gBattleStruct->changedItems[gBattlerAttacker] = gLastUsedItem; // Stolen item to be assigned later - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_ItemSteal; - } - - } - break; case MOVE_EFFECT_PREVENT_ESCAPE: gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; @@ -3085,34 +3097,6 @@ void SetMoveEffect(bool32 primary, u32 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_RapidSpinAway; break; - case MOVE_EFFECT_REMOVE_STATUS: // Smelling salts - if (!(gBattleMons[gBattlerTarget].status1 & gBattleMoves[gCurrentMove].argument)) - { - gBattlescriptCurrInstr++; - } - else - { - gBattleMons[gBattlerTarget].status1 &= ~(gBattleMoves[gCurrentMove].argument); - - gActiveBattler = gBattlerTarget; - BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); - MarkBattlerForControllerExec(gActiveBattler); - - BattleScriptPush(gBattlescriptCurrInstr + 1); - switch (gBattleMoves[gCurrentMove].argument) - { - case STATUS1_PARALYSIS: - gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; - break; - case STATUS1_SLEEP: - gBattlescriptCurrInstr = BattleScript_TargetWokeUp; - break; - case STATUS1_BURN: - gBattlescriptCurrInstr = BattleScript_TargetBurnHeal; - break; - } - } - break; case MOVE_EFFECT_ATK_DEF_DOWN: // SuperPower BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_AtkDefDown; @@ -3121,38 +3105,6 @@ void SetMoveEffect(bool32 primary, u32 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_DefSpDefDown; break; - case MOVE_EFFECT_RECOIL_25: // Take Down, 25% recoil - gBattleMoveDamage = (gHpDealt) / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; - break; - case MOVE_EFFECT_RECOIL_33: // Double Edge, 33 % recoil - gBattleMoveDamage = gHpDealt / 3; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; - break; - case MOVE_EFFECT_RECOIL_50: // Head Smash, 50 % recoil - gBattleMoveDamage = gHpDealt / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; - break; - case MOVE_EFFECT_RECOIL_33_STATUS: // Flare Blitz - can burn, Volt Tackle - can paralyze - gBattleScripting.savedDmg = gHpDealt / 3; - if (gBattleScripting.savedDmg == 0) - gBattleScripting.savedDmg = 1; - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectRecoilWithStatus; - break; case MOVE_EFFECT_THRASH: if (gBattleMons[gEffectBattler].status2 & STATUS2_LOCK_CONFUSE) { @@ -3183,15 +3135,6 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattlescriptCurrInstr = BattleScript_MoveEffectClearSmog; } break; - case MOVE_EFFECT_SMACK_DOWN: - if (!IsBattlerGrounded(gBattlerTarget)) - { - gStatuses3[gBattlerTarget] |= STATUS3_SMACKED_DOWN; - gStatuses3[gBattlerTarget] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectSmackDown; - } - break; case MOVE_EFFECT_FLAME_BURST: if (IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget)) && GetBattlerAbility(BATTLE_PARTNER(gBattlerTarget)) != ABILITY_MAGIC_GUARD) { @@ -4748,6 +4691,10 @@ static void Cmd_moveend(void) { switch (gBattleScripting.moveendState) { + case MOVEEND_SUM_DAMAGE: // Sum and store damage dealt for multi strike recoil + gBattleScripting.savedDmg += gHpDealt; + gBattleScripting.moveendState++; + break; case MOVEEND_PROTECT_LIKE_EFFECT: if (gProtectStructs[gBattlerAttacker].touchedProtectLike) { @@ -4815,6 +4762,41 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; + case MOVEEND_RECOIL: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && IsBattlerAlive(gBattlerAttacker)) + { + switch (gBattleMoves[gCurrentMove].effect) + { + case EFFECT_RECOIL_25: // Take Down, 25% recoil + gBattleMoveDamage = max(1, gBattleScripting.savedDmg / 4); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; + effect = TRUE; + break; + case EFFECT_RECOIL_33: // Double Edge, 33 % recoil + gBattleMoveDamage = max(1, gBattleScripting.savedDmg / 3); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; + effect = TRUE; + break; + case EFFECT_RECOIL_50: // Head Smash, 50 % recoil + gBattleMoveDamage = max(1, gBattleScripting.savedDmg / 2); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; + effect = TRUE; + break; + case EFFECT_RECOIL_33_STATUS: // Flare Blitz - can burn, Volt Tackle - can paralyze + gBattleMoveDamage = max(1, gBattleScripting.savedDmg / 3); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MoveEffectRecoilWithStatus; + effect = TRUE; + break; + } + } + gBattleScripting.moveendState++; + break; case MOVEEND_SYNCHRONIZE_TARGET: // target synchronize if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBattlerTarget, 0, 0, 0)) effect = TRUE; @@ -4882,15 +4864,82 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_MOVE_EFFECTS2: // For effects which should happen after target items, for example Knock Off after damage from Rocky Helmet. + { switch (gBattleStruct->moveEffect2) { case MOVE_EFFECT_KNOCK_OFF: effect = TryKnockOffBattleScript(gBattlerTarget); break; + case MOVE_EFFECT_SMACK_DOWN: + if (!IsBattlerGrounded(gBattlerTarget) && IsBattlerAlive(gBattlerTarget)) + { + gStatuses3[gBattlerTarget] |= STATUS3_SMACKED_DOWN; + gStatuses3[gBattlerTarget] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR); + effect = TRUE; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectSmackDown; + } + break; + case MOVE_EFFECT_REMOVE_STATUS: // Smelling salts, Wake-Up Slap, Sparkling Aria + if ((gBattleMons[gBattlerTarget].status1 & gBattleMoves[gCurrentMove].argument) && IsBattlerAlive(gBattlerTarget)) + { + gBattleMons[gBattlerTarget].status1 &= ~(gBattleMoves[gCurrentMove].argument); + + gActiveBattler = gBattlerTarget; + BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + MarkBattlerForControllerExec(gActiveBattler); + effect = TRUE; + BattleScriptPush(gBattlescriptCurrInstr + 1); + switch (gBattleMoves[gCurrentMove].argument) + { + case STATUS1_PARALYSIS: + gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; + break; + case STATUS1_SLEEP: + gBattlescriptCurrInstr = BattleScript_TargetWokeUp; + break; + case STATUS1_BURN: + gBattlescriptCurrInstr = BattleScript_TargetBurnHeal; + break; + } + } + break; // MOVE_EFFECT_REMOVE_STATUS + case MOVE_EFFECT_STEAL_ITEM: + if (!CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) + || gBattleMons[gBattlerAttacker].item != ITEM_NONE + || gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY + || gBattleMons[gBattlerTarget].item == ITEM_NONE) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MoveEnd; // Can't steal item, just do damage + } + else if (gBattleMons[gBattlerTarget].item + && gBattleMons[gBattlerTarget].ability == ABILITY_STICKY_HOLD) // Can steal item, but ability prevents it + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_NoItemSteal; + + gLastUsedAbility = gBattleMons[gBattlerTarget].ability; + RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); + } + else + { + StealTargetItem(gBattlerAttacker, gBattlerTarget); // Attacker steals target item + gBattleStruct->changedItems[gBattlerAttacker] = gLastUsedItem; // Stolen item to be assigned later + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_ItemSteal; + } + break; // MOVE_EFFECT_STEAL_ITEM + case MOVE_EFFECT_BURN_UP: + effect = TRUE; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_BurnUpRemoveType; + break; } gBattleStruct->moveEffect2 = 0; gBattleScripting.moveendState++; - break; + break; // MOVEEND_MOVE_EFFECTS2 + } case MOVEEND_ITEM_EFFECTS_ALL: // item effects for all battlers if (ItemBattleEffects(ITEMEFFECT_MOVE_END, 0, FALSE)) effect = TRUE; @@ -5076,6 +5125,56 @@ static void Cmd_moveend(void) RecordLastUsedMoveBy(gBattlerAttacker, gCurrentMove); gBattleScripting.moveendState++; break; + case MOVEEND_MULTIHIT_MOVE: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && gMultiHitCounter + && !(gCurrentMove == MOVE_PRESENT && gBattleStruct->presentBasePower == 0)) // Silly edge case + { + gBattleScripting.multihitString[4]++; + if (--gMultiHitCounter == 0) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; + effect = 1; + } + else + { + if (gCurrentMove == MOVE_DRAGON_DARTS) + { + // TODO + } + + if (gBattleMons[gBattlerAttacker].hp + && gBattleMons[gBattlerTarget].hp + && (gChosenMove == MOVE_SLEEP_TALK || !(gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)) + && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE)) + { + if (gSpecialStatuses[gBattlerAttacker].parentalBondOn) + gSpecialStatuses[gBattlerAttacker].parentalBondOn--; + + gHitMarker |= (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING); + gBattleScripting.animTargetsHit = 0; + gBattleScripting.moveendState = 0; + gSpecialStatuses[gBattlerAttacker].multiHitOn = TRUE; + MoveValuesCleanUp(); + BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); + gBattlescriptCurrInstr = BattleScript_FlushMessageBox; + return; + } + else + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; + effect = 1; + } + } + } + gMultiHitCounter = 0; + gSpecialStatuses[gBattlerAttacker].parentalBondOn = 0; + gSpecialStatuses[gBattlerAttacker].multiHitOn = 0; + gBattleScripting.moveendState++; + break; case MOVEEND_EJECT_BUTTON: if (gCurrentMove != MOVE_DRAGON_TAIL && gCurrentMove != MOVE_CIRCLE_THROW @@ -10808,7 +10907,8 @@ static void Cmd_handlefurycutter(void) } else { - if (gDisableStructs[gBattlerAttacker].furyCutterCounter != 5) + if (gDisableStructs[gBattlerAttacker].furyCutterCounter != 5 + && gSpecialStatuses[gBattlerAttacker].parentalBondOn != 2) // Don't increment counter on first hit gDisableStructs[gBattlerAttacker].furyCutterCounter++; gBattlescriptCurrInstr++; @@ -10833,27 +10933,37 @@ static void Cmd_presentdamagecalculation(void) { u32 rand = Random() & 0xFF; - if (rand < 102) + /* Don't reroll present effect/power for the second hit of Parental Bond. + * Not sure if this is the correct behaviour, but bulbapedia states + * that if present heals the foe, it doesn't strike twice, and if it deals + * damage, the second strike will always deal damage too. This is a simple way + * to replicate that effect. + */ + if (gSpecialStatuses[gBattlerAttacker].parentalBondOn != 1) { - gBattleStruct->presentBasePower = 40; - } - else if (rand < 178) - { - gBattleStruct->presentBasePower = 80; - } - else if (rand < 204) - { - gBattleStruct->presentBasePower = 120; - } - else - { - gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + if (rand < 102) + { + gBattleStruct->presentBasePower = 40; + } + else if (rand < 178) + { + gBattleStruct->presentBasePower = 80; + } + else if (rand < 204) + { + gBattleStruct->presentBasePower = 120; + } + else + { + gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 4; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + gBattleStruct->presentBasePower = 0; + } } - if (rand < 204) + if (gBattleStruct->presentBasePower) { gBattlescriptCurrInstr = BattleScript_HitFromCritCalc; } @@ -12873,3 +12983,27 @@ static bool32 CriticalCapture(u32 odds) #endif } +bool8 IsMoveAffectedByParentalBond(u16 move, u8 battlerId) +{ + if (gBattleMoves[move].split != SPLIT_STATUS && !(sForbiddenMoves[move] & FORBIDDEN_PARENTAL_BOND)) + { + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + switch (gBattleMoves[move].target) + { + case MOVE_TARGET_BOTH: + if (CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) >= 2) // Check for single target + return FALSE; + break; + case MOVE_TARGET_FOES_AND_ALLY: + if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) >= 2) // Count mons on both sides; ignore attacker + return FALSE; + break; + } + } + + return TRUE; + } + + return FALSE; +} diff --git a/src/battle_util.c b/src/battle_util.c index f0adfebb9..5229e48c4 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -217,6 +217,37 @@ static const u16 sEntrainmentTargetSimpleBeamBannedAbilities[] = ABILITY_GULP_MISSILE, }; +static const u16 sTwoStrikeMoves[] = +{ + MOVE_BONEMERANG, + MOVE_DOUBLE_HIT, + MOVE_DOUBLE_IRON_BASH, + MOVE_DOUBLE_KICK, + MOVE_DRAGON_DARTS, + MOVE_DUAL_CHOP, + MOVE_DUAL_WINGBEAT, + MOVE_GEAR_GRIND, + MOVE_TWINEEDLE, + 0xFFFF +}; + +static u8 CalcBeatUpPower(void) +{ + struct Pokemon *party; + u8 basePower; + u16 species; + + if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) + party = gPlayerParty; + else + party = gEnemyParty; + // Party slot is set in the battle script for Beat Up + species = GetMonData(&party[gBattleCommunication[0] - 1], MON_DATA_SPECIES); + basePower = (gBaseStats[species].baseAttack / 10) + 5; + + return basePower; +} + bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide) { u32 ability = GetBattlerAbility(battlerAtk); @@ -248,6 +279,7 @@ void HandleAction_UseMove(void) gBattleStruct->atkCancellerTracker = 0; gMoveResultFlags = 0; gMultiHitCounter = 0; + gBattleScripting.savedDmg = 0; gBattleCommunication[6] = 0; gBattleScripting.savedMoveEffect = 0; gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerAttacker); @@ -3085,6 +3117,7 @@ enum CANCELLER_POWDER_MOVE, CANCELLER_POWDER_STATUS, CANCELLER_THROAT_CHOP, + CANCELLER_MULTIHIT_MOVES, CANCELLER_END, CANCELLER_PSYCHIC_TERRAIN, CANCELLER_END2, @@ -3101,6 +3134,7 @@ u8 AtkCanceller_UnableToUseMove(void) case CANCELLER_FLAGS: // flags clear gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_DESTINY_BOND); gStatuses3[gBattlerAttacker] &= ~(STATUS3_GRUDGE); + gBattleScripting.tripleKickPower = 0; gBattleStruct->atkCancellerTracker++; break; case CANCELLER_ASLEEP: // check being asleep @@ -3412,6 +3446,95 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; + case CANCELLER_MULTIHIT_MOVES: + if (gBattleMoves[gCurrentMove].effect == EFFECT_MULTI_HIT) + { + u16 ability = gBattleMons[gBattlerAttacker].ability; + + if (ability == ABILITY_SKILL_LINK) + { + gMultiHitCounter = 5; + } + #ifdef POKEMON_EXPANSION + else if (ability == ABILITY_BATTLE_BOND + && gCurrentMove == MOVE_WATER_SHURIKEN + && gBattleMons[gBattlerAttacker].species == SPECIES_GRENINJA_ASH) + { + gMultiHitCounter = 3; + } + #endif + else + { + if (B_MULTI_HIT_CHANCE >= GEN_5) + { + // 2 and 3 hits: 33.3% + // 4 and 5 hits: 16.7% + gMultiHitCounter = Random() % 4; + if (gMultiHitCounter > 2) + { + gMultiHitCounter = (Random() % 3); + if (gMultiHitCounter < 2) + gMultiHitCounter = 2; + else + gMultiHitCounter = 3; + } + else + gMultiHitCounter += 3; + } + else + { + // 2 and 3 hits: 37.5% + // 4 and 5 hits: 12.5% + gMultiHitCounter = Random() % 4; + if (gMultiHitCounter > 1) + gMultiHitCounter = (Random() % 4) + 2; + else + gMultiHitCounter += 2; + } + } + + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) + } + else if (IsTwoStrikesMove(gCurrentMove)) + { + gMultiHitCounter = 2; + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) + if (gCurrentMove == MOVE_DRAGON_DARTS) + { + // TODO + } + } + else if (gBattleMoves[gCurrentMove].effect == EFFECT_TRIPLE_KICK || gCurrentMove == MOVE_SURGING_STRIKES) + { + gMultiHitCounter = 3; + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) + } + #if B_BEAT_UP_DMG >= GEN_5 + else if (gBattleMoves[gCurrentMove].effect == EFFECT_BEAT_UP) + { + struct Pokemon* party; + int i; + + if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) + party = gPlayerParty; + else + party = gEnemyParty; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&party[i], MON_DATA_HP) + && GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE + && !GetMonData(&party[i], MON_DATA_IS_EGG) + && !GetMonData(&party[i], MON_DATA_STATUS)) + gMultiHitCounter++; + } + + gBattleCommunication[0] = 0; // For later + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) + } + #endif + gBattleStruct->atkCancellerTracker++; + break; case CANCELLER_END: break; } @@ -7466,6 +7589,11 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) if (gBattleMoves[gLastUsedMove].effect == EFFECT_FUSION_COMBO && move != gLastUsedMove) basePower *= 2; break; + #if B_BEAT_UP_DMG >= GEN_5 + case EFFECT_BEAT_UP: + basePower = CalcBeatUpPower(); + break; + #endif } if (basePower == 0) @@ -8163,6 +8291,15 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move MulModifier(&finalModifier, UQ_4_12(0.5)); } + // Parental Bond Second Strike + if (gSpecialStatuses[gBattlerAttacker].parentalBondOn == 1) + { + if (B_PARENTAL_BOND_DAMAGE < GEN_7) + MulModifier(&finalModifier, UQ_4_12(0.5)); + else + MulModifier(&finalModifier, UQ_4_12(0.25)); + } + // attacker's abilities switch (abilityAtk) { @@ -9214,3 +9351,16 @@ void DoBurmyFormChange(u32 monId) } } } + +// Move Checks +bool8 IsTwoStrikesMove(u16 move) +{ + u32 i; + + for (i = 0; i < ARRAY_COUNT(sTwoStrikeMoves); i++) + { + if (move == sTwoStrikeMoves[i]) + return TRUE; + } + return FALSE; +} diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 657341b5e..b0377ccc1 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -641,7 +641,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_TWINEEDLE] = { - .effect = EFFECT_TWINEEDLE, + .effect = EFFECT_POISON_HIT, .power = 25, .type = TYPE_BUG, .accuracy = 100, @@ -10020,7 +10020,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_THAW_USER, @@ -10716,7 +10716,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = #else .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_DMG_MINIMIZE | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST, #endif - .effect = EFFECT_PLACEHOLDER, //TODO (EFFECT_FLINCH_HIT + EFFECT_DOUBLE_HIT) + .effect = EFFECT_FLINCH_HIT, .power = 60, .type = TYPE_STEEL, .accuracy = 100, @@ -11444,7 +11444,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_TRIPLE_AXEL] = { - .effect = EFFECT_TRIPLE_KICK, //TODO: Increase damage by 20 instead of 10 + .effect = EFFECT_TRIPLE_KICK, .power = 20, .type = TYPE_ICE, .accuracy = 90, @@ -11513,7 +11513,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_SURGING_STRIKES] = { - .effect = EFFECT_PLACEHOLDER, //TODO (Multi hit + Always Crit) + .effect = EFFECT_ALWAYS_CRIT, .power = 25, .type = TYPE_WATER, .accuracy = 100, From f49a486a8ccad34508b7ee75984d6c9dfffcc911 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Thu, 23 Sep 2021 16:55:05 +1200 Subject: [PATCH 02/32] Replace tabs with spaces --- src/battle_script_commands.c | 58 ++++++++++++++++++------------------ src/battle_util.c | 36 +++++++++++----------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index dac210ff5..b0508b80b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1729,8 +1729,8 @@ static void Cmd_accuracycheck(void) gBattlescriptCurrInstr += 7; } else if (gSpecialStatuses[gBattlerAttacker].parentalBondOn == 1 - || (gSpecialStatuses[gBattlerAttacker].multiHitOn && (gBattleMoves[move].effect != EFFECT_TRIPLE_KICK - || GetBattlerAbility(gBattlerAttacker) == ABILITY_SKILL_LINK))) + || (gSpecialStatuses[gBattlerAttacker].multiHitOn && (gBattleMoves[move].effect != EFFECT_TRIPLE_KICK + || GetBattlerAbility(gBattlerAttacker) == ABILITY_SKILL_LINK))) { // No acc checks for second hit of Parental Bond or multi hit moves, except Triple Kick/Triple Axel gBattlescriptCurrInstr += 7; @@ -2078,8 +2078,8 @@ static void Cmd_attackanimation(void) { if (gSpecialStatuses[gBattlerAttacker].parentalBondOn == 1) // No animation on second hit { - gBattlescriptCurrInstr++; - return; + gBattlescriptCurrInstr++; + return; } if ((gBattleMoves[gCurrentMove].target & MOVE_TARGET_BOTH @@ -5162,9 +5162,9 @@ static void Cmd_moveend(void) gBattleScripting.multihitString[4]++; if (--gMultiHitCounter == 0) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; - effect = 1; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; + effect = 1; } else { @@ -5176,7 +5176,7 @@ static void Cmd_moveend(void) if (gBattleMons[gBattlerAttacker].hp && gBattleMons[gBattlerTarget].hp && (gChosenMove == MOVE_SLEEP_TALK || !(gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)) - && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE)) + && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE)) { if (gSpecialStatuses[gBattlerAttacker].parentalBondOn) gSpecialStatuses[gBattlerAttacker].parentalBondOn--; @@ -5187,14 +5187,14 @@ static void Cmd_moveend(void) gSpecialStatuses[gBattlerAttacker].multiHitOn = TRUE; MoveValuesCleanUp(); BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); - gBattlescriptCurrInstr = BattleScript_FlushMessageBox; - return; + gBattlescriptCurrInstr = BattleScript_FlushMessageBox; + return; } else { BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; - effect = 1; + gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; + effect = 1; } } } @@ -13124,24 +13124,24 @@ static bool32 CriticalCapture(u32 odds) bool8 IsMoveAffectedByParentalBond(u16 move, u8 battlerId) { if (gBattleMoves[move].split != SPLIT_STATUS && !(sForbiddenMoves[move] & FORBIDDEN_PARENTAL_BOND)) - { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - switch (gBattleMoves[move].target) + { + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + switch (gBattleMoves[move].target) { - case MOVE_TARGET_BOTH: - if (CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) >= 2) // Check for single target - return FALSE; - break; - case MOVE_TARGET_FOES_AND_ALLY: - if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) >= 2) // Count mons on both sides; ignore attacker - return FALSE; - break; - } - } + case MOVE_TARGET_BOTH: + if (CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) >= 2) // Check for single target + return FALSE; + break; + case MOVE_TARGET_FOES_AND_ALLY: + if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) >= 2) // Count mons on both sides; ignore attacker + return FALSE; + break; + } + } - return TRUE; - } + return TRUE; + } - return FALSE; + return FALSE; } diff --git a/src/battle_util.c b/src/battle_util.c index 36060103b..0c0f51ddc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3500,7 +3500,7 @@ u8 AtkCanceller_UnableToUseMove(void) else if (IsTwoStrikesMove(gCurrentMove)) { gMultiHitCounter = 2; - PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) if (gCurrentMove == MOVE_DRAGON_DARTS) { // TODO @@ -3509,7 +3509,7 @@ u8 AtkCanceller_UnableToUseMove(void) else if (gBattleMoves[gCurrentMove].effect == EFFECT_TRIPLE_KICK || gCurrentMove == MOVE_SURGING_STRIKES) { gMultiHitCounter = 3; - PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) } #if B_BEAT_UP_DMG >= GEN_5 else if (gBattleMoves[gCurrentMove].effect == EFFECT_BEAT_UP) @@ -3523,16 +3523,16 @@ u8 AtkCanceller_UnableToUseMove(void) party = gEnemyParty; for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&party[i], MON_DATA_HP) - && GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE - && !GetMonData(&party[i], MON_DATA_IS_EGG) - && !GetMonData(&party[i], MON_DATA_STATUS)) - gMultiHitCounter++; - } + { + if (GetMonData(&party[i], MON_DATA_HP) + && GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE + && !GetMonData(&party[i], MON_DATA_IS_EGG) + && !GetMonData(&party[i], MON_DATA_STATUS)) + gMultiHitCounter++; + } - gBattleCommunication[0] = 0; // For later - PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) + gBattleCommunication[0] = 0; // For later + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) } #endif gBattleStruct->atkCancellerTracker++; @@ -8309,13 +8309,13 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move } // Parental Bond Second Strike - if (gSpecialStatuses[gBattlerAttacker].parentalBondOn == 1) - { - if (B_PARENTAL_BOND_DAMAGE < GEN_7) - MulModifier(&finalModifier, UQ_4_12(0.5)); - else - MulModifier(&finalModifier, UQ_4_12(0.25)); - } + if (gSpecialStatuses[gBattlerAttacker].parentalBondOn == 1) + { + if (B_PARENTAL_BOND_DAMAGE < GEN_7) + MulModifier(&finalModifier, UQ_4_12(0.5)); + else + MulModifier(&finalModifier, UQ_4_12(0.25)); + } // attacker's abilities switch (abilityAtk) From 1ee841146f370b12e67489683d7f5eafd6a35596 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 2 Oct 2021 15:08:15 +1300 Subject: [PATCH 03/32] Fix recoil occurring on zero damage attack The "x was hit with recoil!" message was appearing when the target was immune due to protection or an ability - this should fix that and handle any other cases where 0 damage is dealt. --- src/battle_script_commands.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b0508b80b..aa85b5d30 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4793,7 +4793,8 @@ static void Cmd_moveend(void) case MOVEEND_RECOIL: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && IsBattlerAlive(gBattlerAttacker)) + && IsBattlerAlive(gBattlerAttacker) + && gBattleScripting.savedDmg != 0) // Some checks may be redundant alongside this one { switch (gBattleMoves[gCurrentMove].effect) { From 41d6969dea90b84ab530888dbc0eca614599ef4f Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 9 Oct 2021 12:49:37 +1300 Subject: [PATCH 04/32] Fix Sturdy/Sash/Band Make these effects endure one hit of a multi strike move, not all of them. --- src/battle_script_commands.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index aa85b5d30..c4c29304b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5185,6 +5185,9 @@ static void Cmd_moveend(void) gHitMarker |= (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING); gBattleScripting.animTargetsHit = 0; gBattleScripting.moveendState = 0; + gSpecialStatuses[gBattlerTarget].sturdied = 0; + gSpecialStatuses[gBattlerTarget].focusBanded = 0; // Delete this line to make Focus Band last for the duration of the whole move turn. + gSpecialStatuses[gBattlerTarget].focusSashed = 0; // Delete this line to make Focus Sash last for the duration of the whole move turn. gSpecialStatuses[gBattlerAttacker].multiHitOn = TRUE; MoveValuesCleanUp(); BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); From 61add8823eb38eb54c06a26e01383b92d85a9eec Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Wed, 13 Oct 2021 18:25:04 +1300 Subject: [PATCH 05/32] Fix Thief Thief doesn't work as a move end effect - the item steal animation only works if it runs before the target faints. This restores its original code and adds a simple check to handle its interaction with Parental Bond. --- src/battle_script_commands.c | 29 ++--------------------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 20fb438d8..1c9af7897 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2651,7 +2651,6 @@ void SetMoveEffect(bool32 primary, u32 certain) case MOVE_EFFECT_KNOCK_OFF: case MOVE_EFFECT_SMACK_DOWN: case MOVE_EFFECT_REMOVE_STATUS: - case MOVE_EFFECT_STEAL_ITEM: case MOVE_EFFECT_BURN_UP: gBattleStruct->moveEffect2 = gBattleScripting.moveEffect; gBattlescriptCurrInstr++; @@ -3146,6 +3145,8 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattlescriptCurrInstr++; break; case MOVE_EFFECT_STEAL_ITEM: + // Only steal items on the final strike of Parental Bond + if (!(gSpecialStatuses[gBattlerAttacker].parentalBondOn == 2 && gBattleMons[gBattlerTarget].hp != 0)) { if (!CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item)) { @@ -5046,32 +5047,6 @@ static void Cmd_moveend(void) } } break; // MOVE_EFFECT_REMOVE_STATUS - case MOVE_EFFECT_STEAL_ITEM: - if (!CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) - || gBattleMons[gBattlerAttacker].item != ITEM_NONE - || gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY - || gBattleMons[gBattlerTarget].item == ITEM_NONE) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveEnd; // Can't steal item, just do damage - } - else if (gBattleMons[gBattlerTarget].item - && gBattleMons[gBattlerTarget].ability == ABILITY_STICKY_HOLD) // Can steal item, but ability prevents it - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_NoItemSteal; - - gLastUsedAbility = gBattleMons[gBattlerTarget].ability; - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); - } - else - { - StealTargetItem(gBattlerAttacker, gBattlerTarget); // Attacker steals target item - gBattleStruct->changedItems[gBattlerAttacker] = gLastUsedItem; // Stolen item to be assigned later - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_ItemSteal; - } - break; // MOVE_EFFECT_STEAL_ITEM case MOVE_EFFECT_BURN_UP: effect = TRUE; BattleScriptPush(gBattlescriptCurrInstr + 1); From 8db2e725d5140cf79696f3c477dc59f388580802 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Fri, 15 Oct 2021 17:07:02 +1300 Subject: [PATCH 06/32] Parental Bond/Bug Bite interaction Bug Bite's effect should only occur on the final strike of Parental Bond (which can also be the first strike if it KO's the target). --- src/battle_script_commands.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c7edc283b..e3f0c5902 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3373,7 +3373,8 @@ void SetMoveEffect(bool32 primary, u32 certain) break; case MOVE_EFFECT_BUG_BITE: if (ItemId_GetPocket(gBattleMons[gEffectBattler].item) == POCKET_BERRIES - && GetBattlerAbility(gEffectBattler) != ABILITY_STICKY_HOLD) + && GetBattlerAbility(gEffectBattler) != ABILITY_STICKY_HOLD + && !(gSpecialStatuses[gBattlerAttacker].parentalBondOn == 2 && gBattleMons[gBattlerTarget].hp != 0)) // Steal berry on final hit { // target loses their berry gLastUsedItem = gBattleMons[gEffectBattler].item; From 0345dea91820e49b9dd0fc929f454ef94bbcbd5f Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Mon, 1 Nov 2021 23:39:37 +1300 Subject: [PATCH 07/32] Replace EFFECT_DOUBLE_HIT with FLAG_TWO_STRIKES This removes the need to have separate move effects for Twineedle, Double Iron Bash, and any custom two strike moves. --- data/battle_scripts_1.s | 34 -- include/battle_util.h | 3 - include/constants/battle_move_effects.h | 750 ++++++++++++------------ include/constants/pokemon.h | 1 + src/battle_ai_main.c | 1 - src/battle_tv.c | 4 +- src/battle_util.c | 28 +- src/data/battle_moves.h | 32 +- 8 files changed, 393 insertions(+), 460 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7cd3ef1ae..9f2f46484 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -64,7 +64,6 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectDragonRage @ EFFECT_DRAGON_RAGE .4byte BattleScript_EffectTrap @ EFFECT_TRAP .4byte BattleScript_EffectHealBlock @ EFFECT_HEAL_BLOCK - .4byte BattleScript_EffectHit @ EFFECT_DOUBLE_HIT .4byte BattleScript_EffectRecoilIfMiss @ EFFECT_RECOIL_IF_MISS .4byte BattleScript_EffectMist @ EFFECT_MIST .4byte BattleScript_EffectFocusEnergy @ EFFECT_FOCUS_ENERGY @@ -97,7 +96,6 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_EVASION_DOWN_HIT .4byte BattleScript_EffectTwoTurnsAttack @ EFFECT_TWO_TURNS_ATTACK .4byte BattleScript_EffectConfuseHit @ EFFECT_CONFUSE_HIT - .4byte BattleScript_EffectTwineedle @ EFFECT_TWINEEDLE .4byte BattleScript_EffectHit @ EFFECT_VITAL_THROW .4byte BattleScript_EffectSubstitute @ EFFECT_SUBSTITUTE .4byte BattleScript_EffectRecharge @ EFFECT_RECHARGE @@ -379,12 +377,10 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_DYNAMAX_DOUBLE_DMG .4byte BattleScript_EffectDecorate @ EFFECT_DECORATE .4byte BattleScript_EffectHit @ EFFECT_SNIPE_SHOT - .4byte BattleScript_EffectTripleHit @ EFFECT_TRIPLE_HIT .4byte BattleScript_EffectRecoilHP25 @ EFFECT_RECOIL_HP_25 .4byte BattleScript_EffectStuffCheeks @ EFFECT_STUFF_CHEEKS .4byte BattleScript_EffectDefenseDownHit @ EFFECT_GRAV_APPLE .4byte BattleScript_EffectEvasionUpHit @ EFFECT_EVASION_UP_HIT - .4byte BattleScript_EffectDoubleIronBash @ EFFECT_DOUBLE_IRON_BASH .4byte BattleScript_EffectGlitzyGlow @ EFFECT_GLITZY_GLOW .4byte BattleScript_EffectBaddyBad @ EFFECT_BADDY_BAD .4byte BattleScript_EffectSappySeed @ EFFECT_SAPPY_SEED @@ -577,16 +573,6 @@ BattleScript_EffectGlitzyGlow: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectDoubleIronBash: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - setmultihitcounter 2 - initmultihitstring - sethword sMULTIHIT_EFFECT, MOVE_EFFECT_FLINCH - goto BattleScript_MultiHitLoop - BattleScript_EffectEvasionUpHit: setmoveeffect MOVE_EFFECT_EVS_PLUS_1 | MOVE_EFFECT_AFFECTS_USER goto BattleScript_EffectHit @@ -3207,26 +3193,6 @@ BattleScript_EffectTrap:: setmoveeffect MOVE_EFFECT_WRAP goto BattleScript_EffectHit -BattleScript_EffectTripleHit:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - setmultihitcounter 3 - initmultihitstring - sethword sMULTIHIT_EFFECT, 0 - goto BattleScript_MultiHitLoop - -BattleScript_EffectDoubleHit:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - setmultihitcounter 2 - initmultihitstring - sethword sMULTIHIT_EFFECT, 0 - goto BattleScript_MultiHitLoop - BattleScript_EffectRecoilIfMiss:: attackcanceler accuracycheck BattleScript_MoveMissedDoDamage, ACC_CURR_MOVE diff --git a/include/battle_util.h b/include/battle_util.h index 2f7ea6850..00aa0cd59 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -175,7 +175,4 @@ bool32 CanBeFrozen(u8 battlerId); bool32 CanBeConfused(u8 battlerId); bool32 IsBattlerTerrainAffected(u8 battlerId, u32 terrainFlag); -// Move checks -bool8 IsTwoStrikesMove(u16 move); - #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 62b49a191..fd8919374 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -1,381 +1,377 @@ #ifndef GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H #define GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H -#define EFFECT_HIT 0 -#define EFFECT_SLEEP 1 -#define EFFECT_POISON_HIT 2 -#define EFFECT_ABSORB 3 -#define EFFECT_BURN_HIT 4 -#define EFFECT_FREEZE_HIT 5 -#define EFFECT_PARALYZE_HIT 6 -#define EFFECT_EXPLOSION 7 -#define EFFECT_DREAM_EATER 8 -#define EFFECT_MIRROR_MOVE 9 -#define EFFECT_ATTACK_UP 10 -#define EFFECT_DEFENSE_UP 11 -#define EFFECT_SPEED_UP 12 -#define EFFECT_SPECIAL_ATTACK_UP 13 -#define EFFECT_SPECIAL_DEFENSE_UP 14 -#define EFFECT_ACCURACY_UP 15 -#define EFFECT_EVASION_UP 16 -#define EFFECT_SPECIAL_ATTACK_UP_3 17 -#define EFFECT_ATTACK_DOWN 18 -#define EFFECT_DEFENSE_DOWN 19 -#define EFFECT_SPEED_DOWN 20 -#define EFFECT_SPECIAL_ATTACK_DOWN 21 -#define EFFECT_SPECIAL_DEFENSE_DOWN 22 -#define EFFECT_ACCURACY_DOWN 23 -#define EFFECT_EVASION_DOWN 24 -#define EFFECT_HAZE 25 -#define EFFECT_BIDE 26 -#define EFFECT_RAMPAGE 27 -#define EFFECT_ROAR 28 -#define EFFECT_MULTI_HIT 29 -#define EFFECT_CONVERSION 30 -#define EFFECT_FLINCH_HIT 31 -#define EFFECT_RESTORE_HP 32 -#define EFFECT_TOXIC 33 -#define EFFECT_PAY_DAY 34 -#define EFFECT_LIGHT_SCREEN 35 -#define EFFECT_TRI_ATTACK 36 -#define EFFECT_REST 37 -#define EFFECT_OHKO 38 -#define EFFECT_FUSION_COMBO 39 -#define EFFECT_SUPER_FANG 40 -#define EFFECT_DRAGON_RAGE 41 -#define EFFECT_TRAP 42 -#define EFFECT_HEAL_BLOCK 43 -#define EFFECT_DOUBLE_HIT 44 -#define EFFECT_RECOIL_IF_MISS 45 -#define EFFECT_MIST 46 -#define EFFECT_FOCUS_ENERGY 47 -#define EFFECT_RECOIL_25 48 -#define EFFECT_CONFUSE 49 -#define EFFECT_ATTACK_UP_2 50 -#define EFFECT_DEFENSE_UP_2 51 -#define EFFECT_SPEED_UP_2 52 -#define EFFECT_SPECIAL_ATTACK_UP_2 53 -#define EFFECT_SPECIAL_DEFENSE_UP_2 54 -#define EFFECT_ACCURACY_UP_2 55 -#define EFFECT_EVASION_UP_2 56 -#define EFFECT_TRANSFORM 57 -#define EFFECT_ATTACK_DOWN_2 58 -#define EFFECT_DEFENSE_DOWN_2 59 -#define EFFECT_SPEED_DOWN_2 60 -#define EFFECT_SPECIAL_ATTACK_DOWN_2 61 -#define EFFECT_SPECIAL_DEFENSE_DOWN_2 62 -#define EFFECT_ACCURACY_DOWN_2 63 -#define EFFECT_EVASION_DOWN_2 64 -#define EFFECT_REFLECT 65 -#define EFFECT_POISON 66 -#define EFFECT_PARALYZE 67 -#define EFFECT_ATTACK_DOWN_HIT 68 -#define EFFECT_DEFENSE_DOWN_HIT 69 -#define EFFECT_SPEED_DOWN_HIT 70 -#define EFFECT_SPECIAL_ATTACK_DOWN_HIT 71 -#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT 72 -#define EFFECT_ACCURACY_DOWN_HIT 73 -#define EFFECT_EVASION_DOWN_HIT 74 -#define EFFECT_TWO_TURNS_ATTACK 75 -#define EFFECT_CONFUSE_HIT 76 -#define EFFECT_TWINEEDLE 77 -#define EFFECT_VITAL_THROW 78 -#define EFFECT_SUBSTITUTE 79 -#define EFFECT_RECHARGE 80 -#define EFFECT_RAGE 81 -#define EFFECT_MIMIC 82 -#define EFFECT_METRONOME 83 -#define EFFECT_LEECH_SEED 84 -#define EFFECT_DO_NOTHING 85 -#define EFFECT_DISABLE 86 -#define EFFECT_LEVEL_DAMAGE 87 -#define EFFECT_PSYWAVE 88 -#define EFFECT_COUNTER 89 -#define EFFECT_ENCORE 90 -#define EFFECT_PAIN_SPLIT 91 -#define EFFECT_SNORE 92 -#define EFFECT_CONVERSION_2 93 -#define EFFECT_LOCK_ON 94 -#define EFFECT_SKETCH 95 -#define EFFECT_HAMMER_ARM 96 -#define EFFECT_SLEEP_TALK 97 -#define EFFECT_DESTINY_BOND 98 -#define EFFECT_FLAIL 99 -#define EFFECT_SPITE 100 -#define EFFECT_FALSE_SWIPE 101 -#define EFFECT_HEAL_BELL 102 -#define EFFECT_ALWAYS_CRIT 103 -#define EFFECT_TRIPLE_KICK 104 -#define EFFECT_THIEF 105 -#define EFFECT_MEAN_LOOK 106 -#define EFFECT_NIGHTMARE 107 -#define EFFECT_MINIMIZE 108 -#define EFFECT_CURSE 109 -#define EFFECT_HEALING_WISH 110 -#define EFFECT_PROTECT 111 -#define EFFECT_SPIKES 112 -#define EFFECT_FORESIGHT 113 -#define EFFECT_PERISH_SONG 114 -#define EFFECT_SANDSTORM 115 -#define EFFECT_ENDURE 116 -#define EFFECT_ROLLOUT 117 -#define EFFECT_SWAGGER 118 -#define EFFECT_FURY_CUTTER 119 -#define EFFECT_ATTRACT 120 -#define EFFECT_RETURN 121 -#define EFFECT_PRESENT 122 -#define EFFECT_FRUSTRATION 123 -#define EFFECT_SAFEGUARD 124 -#define EFFECT_UNUSED_125 125 -#define EFFECT_MAGNITUDE 126 -#define EFFECT_BATON_PASS 127 -#define EFFECT_PURSUIT 128 -#define EFFECT_RAPID_SPIN 129 -#define EFFECT_SONICBOOM 130 -#define EFFECT_CAPTIVATE 131 -#define EFFECT_MORNING_SUN 132 -#define EFFECT_SYNTHESIS 133 -#define EFFECT_MOONLIGHT 134 -#define EFFECT_HIDDEN_POWER 135 -#define EFFECT_RAIN_DANCE 136 -#define EFFECT_SUNNY_DAY 137 -#define EFFECT_DEFENSE_UP_HIT 138 -#define EFFECT_ATTACK_UP_HIT 139 -#define EFFECT_ALL_STATS_UP_HIT 140 -#define EFFECT_FELL_STINGER 141 -#define EFFECT_BELLY_DRUM 142 -#define EFFECT_PSYCH_UP 143 -#define EFFECT_MIRROR_COAT 144 -#define EFFECT_SKULL_BASH 145 -#define EFFECT_TWISTER 146 -#define EFFECT_EARTHQUAKE 147 -#define EFFECT_FUTURE_SIGHT 148 -#define EFFECT_GUST 149 -#define EFFECT_FLINCH_MINIMIZE_HIT 150 -#define EFFECT_SOLARBEAM 151 -#define EFFECT_THUNDER 152 -#define EFFECT_TELEPORT 153 -#define EFFECT_BEAT_UP 154 -#define EFFECT_SEMI_INVULNERABLE 155 -#define EFFECT_DEFENSE_CURL 156 -#define EFFECT_SOFTBOILED 157 -#define EFFECT_FAKE_OUT 158 -#define EFFECT_UPROAR 159 -#define EFFECT_STOCKPILE 160 -#define EFFECT_SPIT_UP 161 -#define EFFECT_SWALLOW 162 -#define EFFECT_WORRY_SEED 163 -#define EFFECT_HAIL 164 -#define EFFECT_TORMENT 165 -#define EFFECT_FLATTER 166 -#define EFFECT_WILL_O_WISP 167 -#define EFFECT_MEMENTO 168 -#define EFFECT_FACADE 169 -#define EFFECT_FOCUS_PUNCH 170 -#define EFFECT_SMELLINGSALT 171 -#define EFFECT_FOLLOW_ME 172 -#define EFFECT_NATURE_POWER 173 -#define EFFECT_CHARGE 174 -#define EFFECT_TAUNT 175 -#define EFFECT_HELPING_HAND 176 -#define EFFECT_TRICK 177 -#define EFFECT_ROLE_PLAY 178 -#define EFFECT_WISH 179 -#define EFFECT_ASSIST 180 -#define EFFECT_INGRAIN 181 -#define EFFECT_SUPERPOWER 182 -#define EFFECT_MAGIC_COAT 183 -#define EFFECT_RECYCLE 184 -#define EFFECT_REVENGE 185 -#define EFFECT_BRICK_BREAK 186 -#define EFFECT_YAWN 187 -#define EFFECT_KNOCK_OFF 188 -#define EFFECT_ENDEAVOR 189 -#define EFFECT_ERUPTION 190 -#define EFFECT_SKILL_SWAP 191 -#define EFFECT_IMPRISON 192 -#define EFFECT_REFRESH 193 -#define EFFECT_GRUDGE 194 -#define EFFECT_SNATCH 195 -#define EFFECT_LOW_KICK 196 -#define EFFECT_SECRET_POWER 197 -#define EFFECT_RECOIL_33 198 -#define EFFECT_TEETER_DANCE 199 -#define EFFECT_HIT_ESCAPE 200 -#define EFFECT_MUD_SPORT 201 -#define EFFECT_POISON_FANG 202 -#define EFFECT_WEATHER_BALL 203 -#define EFFECT_OVERHEAT 204 -#define EFFECT_TICKLE 205 -#define EFFECT_COSMIC_POWER 206 -#define EFFECT_SKY_UPPERCUT 207 -#define EFFECT_BULK_UP 208 -#define EFFECT_PLACEHOLDER 209 -#define EFFECT_WATER_SPORT 210 -#define EFFECT_CALM_MIND 211 -#define EFFECT_DRAGON_DANCE 212 -#define EFFECT_CAMOUFLAGE 213 +#define EFFECT_HIT 0 +#define EFFECT_SLEEP 1 +#define EFFECT_POISON_HIT 2 +#define EFFECT_ABSORB 3 +#define EFFECT_BURN_HIT 4 +#define EFFECT_FREEZE_HIT 5 +#define EFFECT_PARALYZE_HIT 6 +#define EFFECT_EXPLOSION 7 +#define EFFECT_DREAM_EATER 8 +#define EFFECT_MIRROR_MOVE 9 +#define EFFECT_ATTACK_UP 10 +#define EFFECT_DEFENSE_UP 11 +#define EFFECT_SPEED_UP 12 +#define EFFECT_SPECIAL_ATTACK_UP 13 +#define EFFECT_SPECIAL_DEFENSE_UP 14 +#define EFFECT_ACCURACY_UP 15 +#define EFFECT_EVASION_UP 16 +#define EFFECT_SPECIAL_ATTACK_UP_3 17 +#define EFFECT_ATTACK_DOWN 18 +#define EFFECT_DEFENSE_DOWN 19 +#define EFFECT_SPEED_DOWN 20 +#define EFFECT_SPECIAL_ATTACK_DOWN 21 +#define EFFECT_SPECIAL_DEFENSE_DOWN 22 +#define EFFECT_ACCURACY_DOWN 23 +#define EFFECT_EVASION_DOWN 24 +#define EFFECT_HAZE 25 +#define EFFECT_BIDE 26 +#define EFFECT_RAMPAGE 27 +#define EFFECT_ROAR 28 +#define EFFECT_MULTI_HIT 29 +#define EFFECT_CONVERSION 30 +#define EFFECT_FLINCH_HIT 31 +#define EFFECT_RESTORE_HP 32 +#define EFFECT_TOXIC 33 +#define EFFECT_PAY_DAY 34 +#define EFFECT_LIGHT_SCREEN 35 +#define EFFECT_TRI_ATTACK 36 +#define EFFECT_REST 37 +#define EFFECT_OHKO 38 +#define EFFECT_FUSION_COMBO 39 +#define EFFECT_SUPER_FANG 40 +#define EFFECT_DRAGON_RAGE 41 +#define EFFECT_TRAP 42 +#define EFFECT_HEAL_BLOCK 43 +#define EFFECT_RECOIL_IF_MISS 44 +#define EFFECT_MIST 45 +#define EFFECT_FOCUS_ENERGY 46 +#define EFFECT_RECOIL_25 47 +#define EFFECT_CONFUSE 48 +#define EFFECT_ATTACK_UP_2 49 +#define EFFECT_DEFENSE_UP_2 50 +#define EFFECT_SPEED_UP_2 51 +#define EFFECT_SPECIAL_ATTACK_UP_2 52 +#define EFFECT_SPECIAL_DEFENSE_UP_2 53 +#define EFFECT_ACCURACY_UP_2 54 +#define EFFECT_EVASION_UP_2 55 +#define EFFECT_TRANSFORM 56 +#define EFFECT_ATTACK_DOWN_2 57 +#define EFFECT_DEFENSE_DOWN_2 58 +#define EFFECT_SPEED_DOWN_2 59 +#define EFFECT_SPECIAL_ATTACK_DOWN_2 60 +#define EFFECT_SPECIAL_DEFENSE_DOWN_2 61 +#define EFFECT_ACCURACY_DOWN_2 62 +#define EFFECT_EVASION_DOWN_2 63 +#define EFFECT_REFLECT 64 +#define EFFECT_POISON 65 +#define EFFECT_PARALYZE 66 +#define EFFECT_ATTACK_DOWN_HIT 67 +#define EFFECT_DEFENSE_DOWN_HIT 68 +#define EFFECT_SPEED_DOWN_HIT 69 +#define EFFECT_SPECIAL_ATTACK_DOWN_HIT 70 +#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT 71 +#define EFFECT_ACCURACY_DOWN_HIT 72 +#define EFFECT_EVASION_DOWN_HIT 73 +#define EFFECT_TWO_TURNS_ATTACK 74 +#define EFFECT_CONFUSE_HIT 75 +#define EFFECT_VITAL_THROW 76 +#define EFFECT_SUBSTITUTE 77 +#define EFFECT_RECHARGE 78 +#define EFFECT_RAGE 79 +#define EFFECT_MIMIC 80 +#define EFFECT_METRONOME 81 +#define EFFECT_LEECH_SEED 82 +#define EFFECT_DO_NOTHING 83 +#define EFFECT_DISABLE 84 +#define EFFECT_LEVEL_DAMAGE 85 +#define EFFECT_PSYWAVE 86 +#define EFFECT_COUNTER 87 +#define EFFECT_ENCORE 88 +#define EFFECT_PAIN_SPLIT 89 +#define EFFECT_SNORE 90 +#define EFFECT_CONVERSION_2 91 +#define EFFECT_LOCK_ON 92 +#define EFFECT_SKETCH 93 +#define EFFECT_HAMMER_ARM 94 +#define EFFECT_SLEEP_TALK 95 +#define EFFECT_DESTINY_BOND 96 +#define EFFECT_FLAIL 97 +#define EFFECT_SPITE 98 +#define EFFECT_FALSE_SWIPE 99 +#define EFFECT_HEAL_BELL 100 +#define EFFECT_ALWAYS_CRIT 101 +#define EFFECT_TRIPLE_KICK 102 +#define EFFECT_THIEF 103 +#define EFFECT_MEAN_LOOK 104 +#define EFFECT_NIGHTMARE 105 +#define EFFECT_MINIMIZE 106 +#define EFFECT_CURSE 107 +#define EFFECT_HEALING_WISH 108 +#define EFFECT_PROTECT 109 +#define EFFECT_SPIKES 110 +#define EFFECT_FORESIGHT 111 +#define EFFECT_PERISH_SONG 112 +#define EFFECT_SANDSTORM 113 +#define EFFECT_ENDURE 114 +#define EFFECT_ROLLOUT 115 +#define EFFECT_SWAGGER 116 +#define EFFECT_FURY_CUTTER 117 +#define EFFECT_ATTRACT 118 +#define EFFECT_RETURN 119 +#define EFFECT_PRESENT 120 +#define EFFECT_FRUSTRATION 121 +#define EFFECT_SAFEGUARD 122 +#define EFFECT_UNUSED_125 123 +#define EFFECT_MAGNITUDE 124 +#define EFFECT_BATON_PASS 125 +#define EFFECT_PURSUIT 126 +#define EFFECT_RAPID_SPIN 127 +#define EFFECT_SONICBOOM 128 +#define EFFECT_CAPTIVATE 129 +#define EFFECT_MORNING_SUN 130 +#define EFFECT_SYNTHESIS 131 +#define EFFECT_MOONLIGHT 132 +#define EFFECT_HIDDEN_POWER 133 +#define EFFECT_RAIN_DANCE 134 +#define EFFECT_SUNNY_DAY 135 +#define EFFECT_DEFENSE_UP_HIT 136 +#define EFFECT_ATTACK_UP_HIT 137 +#define EFFECT_ALL_STATS_UP_HIT 138 +#define EFFECT_FELL_STINGER 139 +#define EFFECT_BELLY_DRUM 140 +#define EFFECT_PSYCH_UP 141 +#define EFFECT_MIRROR_COAT 142 +#define EFFECT_SKULL_BASH 143 +#define EFFECT_TWISTER 144 +#define EFFECT_EARTHQUAKE 145 +#define EFFECT_FUTURE_SIGHT 146 +#define EFFECT_GUST 147 +#define EFFECT_FLINCH_MINIMIZE_HIT 148 +#define EFFECT_SOLARBEAM 149 +#define EFFECT_THUNDER 150 +#define EFFECT_TELEPORT 151 +#define EFFECT_BEAT_UP 152 +#define EFFECT_SEMI_INVULNERABLE 153 +#define EFFECT_DEFENSE_CURL 154 +#define EFFECT_SOFTBOILED 155 +#define EFFECT_FAKE_OUT 156 +#define EFFECT_UPROAR 157 +#define EFFECT_STOCKPILE 158 +#define EFFECT_SPIT_UP 159 +#define EFFECT_SWALLOW 160 +#define EFFECT_WORRY_SEED 161 +#define EFFECT_HAIL 162 +#define EFFECT_TORMENT 163 +#define EFFECT_FLATTER 164 +#define EFFECT_WILL_O_WISP 165 +#define EFFECT_MEMENTO 166 +#define EFFECT_FACADE 167 +#define EFFECT_FOCUS_PUNCH 168 +#define EFFECT_SMELLINGSALT 169 +#define EFFECT_FOLLOW_ME 170 +#define EFFECT_NATURE_POWER 171 +#define EFFECT_CHARGE 172 +#define EFFECT_TAUNT 173 +#define EFFECT_HELPING_HAND 174 +#define EFFECT_TRICK 175 +#define EFFECT_ROLE_PLAY 176 +#define EFFECT_WISH 177 +#define EFFECT_ASSIST 178 +#define EFFECT_INGRAIN 179 +#define EFFECT_SUPERPOWER 180 +#define EFFECT_MAGIC_COAT 181 +#define EFFECT_RECYCLE 182 +#define EFFECT_REVENGE 183 +#define EFFECT_BRICK_BREAK 184 +#define EFFECT_YAWN 185 +#define EFFECT_KNOCK_OFF 186 +#define EFFECT_ENDEAVOR 187 +#define EFFECT_ERUPTION 188 +#define EFFECT_SKILL_SWAP 189 +#define EFFECT_IMPRISON 190 +#define EFFECT_REFRESH 191 +#define EFFECT_GRUDGE 192 +#define EFFECT_SNATCH 193 +#define EFFECT_LOW_KICK 194 +#define EFFECT_SECRET_POWER 195 +#define EFFECT_RECOIL_33 196 +#define EFFECT_TEETER_DANCE 197 +#define EFFECT_HIT_ESCAPE 198 +#define EFFECT_MUD_SPORT 199 +#define EFFECT_POISON_FANG 200 +#define EFFECT_WEATHER_BALL 201 +#define EFFECT_OVERHEAT 202 +#define EFFECT_TICKLE 203 +#define EFFECT_COSMIC_POWER 204 +#define EFFECT_SKY_UPPERCUT 205 +#define EFFECT_BULK_UP 206 +#define EFFECT_PLACEHOLDER 207 +#define EFFECT_WATER_SPORT 208 +#define EFFECT_CALM_MIND 209 +#define EFFECT_DRAGON_DANCE 210 +#define EFFECT_CAMOUFLAGE 211 + +// New move effects 212 +#define EFFECT_PLEDGE 213 +#define EFFECT_FLING 214 +#define EFFECT_NATURAL_GIFT 215 +#define EFFECT_WAKE_UP_SLAP 216 +#define EFFECT_WRING_OUT 217 +#define EFFECT_HEX 218 +#define EFFECT_ASSURANCE 219 +#define EFFECT_TRUMP_CARD 220 +#define EFFECT_ACROBATICS 221 +#define EFFECT_HEAT_CRASH 222 +#define EFFECT_PUNISHMENT 223 +#define EFFECT_STORED_POWER 224 +#define EFFECT_ELECTRO_BALL 225 +#define EFFECT_GYRO_BALL 226 +#define EFFECT_ECHOED_VOICE 227 +#define EFFECT_PAYBACK 228 +#define EFFECT_ROUND 229 +#define EFFECT_BRINE 230 +#define EFFECT_VENOSHOCK 231 +#define EFFECT_RETALIATE 232 +#define EFFECT_BULLDOZE 233 +#define EFFECT_FOUL_PLAY 234 +#define EFFECT_PSYSHOCK 235 +#define EFFECT_ROOST 236 +#define EFFECT_GRAVITY 237 +#define EFFECT_MIRACLE_EYE 238 +#define EFFECT_TAILWIND 239 +#define EFFECT_EMBARGO 240 +#define EFFECT_AQUA_RING 241 +#define EFFECT_TRICK_ROOM 242 +#define EFFECT_WONDER_ROOM 243 +#define EFFECT_MAGIC_ROOM 244 +#define EFFECT_MAGNET_RISE 245 +#define EFFECT_TOXIC_SPIKES 246 +#define EFFECT_GASTRO_ACID 247 +#define EFFECT_STEALTH_ROCK 248 +#define EFFECT_TELEKINESIS 249 +#define EFFECT_POWER_SWAP 250 +#define EFFECT_GUARD_SWAP 251 +#define EFFECT_HEART_SWAP 252 +#define EFFECT_POWER_SPLIT 253 +#define EFFECT_GUARD_SPLIT 254 +#define EFFECT_STICKY_WEB 255 +#define EFFECT_METAL_BURST 256 +#define EFFECT_LUCKY_CHANT 257 +#define EFFECT_SUCKER_PUNCH 258 +#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 259 +#define EFFECT_SIMPLE_BEAM 260 +#define EFFECT_ENTRAINMENT 261 +#define EFFECT_HEAL_PULSE 262 +#define EFFECT_QUASH 263 +#define EFFECT_ION_DELUGE 264 +#define EFFECT_FREEZE_DRY 265 +#define EFFECT_TOPSY_TURVY 266 +#define EFFECT_MISTY_TERRAIN 267 +#define EFFECT_GRASSY_TERRAIN 268 +#define EFFECT_ELECTRIC_TERRAIN 269 +#define EFFECT_PSYCHIC_TERRAIN 270 +#define EFFECT_ATTACK_ACCURACY_UP 271 +#define EFFECT_ATTACK_SPATK_UP 272 +#define EFFECT_HURRICANE 273 +#define EFFECT_TWO_TYPED_MOVE 274 +#define EFFECT_ME_FIRST 275 +#define EFFECT_SPEED_UP_HIT 276 +#define EFFECT_QUIVER_DANCE 277 +#define EFFECT_COIL 278 +#define EFFECT_ELECTRIFY 279 +#define EFFECT_SCALD 280 +#define EFFECT_REFLECT_TYPE 281 +#define EFFECT_SOAK 282 +#define EFFECT_GROWTH 283 +#define EFFECT_CLOSE_COMBAT 284 +#define EFFECT_LAST_RESORT 285 +#define EFFECT_RECOIL_33_STATUS 286 +#define EFFECT_FLINCH_STATUS 287 +#define EFFECT_RECOIL_50 288 +#define EFFECT_SHELL_SMASH 289 +#define EFFECT_SHIFT_GEAR 290 +#define EFFECT_DEFENSE_UP_3 291 +#define EFFECT_NOBLE_ROAR 292 +#define EFFECT_VENOM_DRENCH 293 +#define EFFECT_TOXIC_THREAD 294 +#define EFFECT_CLEAR_SMOG 295 +#define EFFECT_HIT_SWITCH_TARGET 296 +#define EFFECT_FINAL_GAMBIT 297 +#define EFFECT_CHANGE_TYPE_ON_ITEM 298 +#define EFFECT_AUTOTOMIZE 299 +#define EFFECT_COPYCAT 300 +#define EFFECT_DEFOG 301 +#define EFFECT_HIT_ENEMY_HEAL_ALLY 302 +#define EFFECT_SMACK_DOWN 303 +#define EFFECT_SYNCHRONOISE 304 +#define EFFECT_PSYCHO_SHIFT 305 +#define EFFECT_POWER_TRICK 306 +#define EFFECT_FLAME_BURST 307 +#define EFFECT_AFTER_YOU 308 +#define EFFECT_BESTOW 309 +#define EFFECT_ROTOTILLER 310 +#define EFFECT_FLOWER_SHIELD 311 +#define EFFECT_HIT_PREVENT_ESCAPE 312 +#define EFFECT_SPEED_SWAP 313 +#define EFFECT_DEFENSE_UP2_HIT 314 +#define EFFECT_REVELATION_DANCE 315 +#define EFFECT_AURORA_VEIL 316 +#define EFFECT_THIRD_TYPE 317 +#define EFFECT_FEINT 318 +#define EFFECT_SPARKLING_ARIA 319 +#define EFFECT_ACUPRESSURE 320 +#define EFFECT_AROMATIC_MIST 321 +#define EFFECT_POWDER 322 +#define EFFECT_SP_ATTACK_UP_HIT 323 +#define EFFECT_BELCH 324 +#define EFFECT_PARTING_SHOT 325 +#define EFFECT_SPECTRAL_THIEF 326 +#define EFFECT_V_CREATE 327 +#define EFFECT_MAT_BLOCK 328 +#define EFFECT_STOMPING_TANTRUM 329 +#define EFFECT_CORE_ENFORCER 330 +#define EFFECT_INSTRUCT 331 +#define EFFECT_THROAT_CHOP 332 +#define EFFECT_LASER_FOCUS 333 +#define EFFECT_MAGNETIC_FLUX 334 +#define EFFECT_GEAR_UP 335 +#define EFFECT_INCINERATE 336 +#define EFFECT_BUG_BITE 337 +#define EFFECT_STRENGTH_SAP 338 +#define EFFECT_MIND_BLOWN 339 +#define EFFECT_PURIFY 340 +#define EFFECT_BURN_UP 341 +#define EFFECT_SHORE_UP 342 +#define EFFECT_GEOMANCY 343 +#define EFFECT_FAIRY_LOCK 344 +#define EFFECT_ALLY_SWITCH 345 +#define EFFECT_SLEEP_HIT 346 +#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 347 +#define EFFECT_BODY_PRESS 348 +#define EFFECT_EERIE_SPELL 349 +#define EFFECT_JUNGLE_HEALING 350 +#define EFFECT_COACHING 351 +#define EFFECT_LASH_OUT 352 +#define EFFECT_GRASSY_GLIDE 353 +#define EFFECT_REMOVE_TERRAIN 354 +#define EFFECT_DYNAMAX_DOUBLE_DMG 355 +#define EFFECT_DECORATE 356 +#define EFFECT_SNIPE_SHOT 357 +#define EFFECT_RECOIL_HP_25 358 +#define EFFECT_STUFF_CHEEKS 359 +#define EFFECT_GRAV_APPLE 360 +#define EFFECT_EVASION_UP_HIT 361 +#define EFFECT_GLITZY_GLOW 362 +#define EFFECT_BADDY_BAD 363 +#define EFFECT_SAPPY_SEED 364 +#define EFFECT_FREEZY_FROST 365 +#define EFFECT_SPARKLY_SWIRL 366 +#define EFFECT_PLASMA_FISTS 367 +#define EFFECT_HYPERSPACE_FURY 368 + +#define NUM_BATTLE_MOVE_EFFECTS 369 -// New move effects -#define EFFECT_PLEDGE 214 -#define EFFECT_FLING 215 -#define EFFECT_NATURAL_GIFT 216 -#define EFFECT_WAKE_UP_SLAP 217 -#define EFFECT_WRING_OUT 218 -#define EFFECT_HEX 219 -#define EFFECT_ASSURANCE 220 -#define EFFECT_TRUMP_CARD 221 -#define EFFECT_ACROBATICS 222 -#define EFFECT_HEAT_CRASH 223 -#define EFFECT_PUNISHMENT 224 -#define EFFECT_STORED_POWER 225 -#define EFFECT_ELECTRO_BALL 226 -#define EFFECT_GYRO_BALL 227 -#define EFFECT_ECHOED_VOICE 228 -#define EFFECT_PAYBACK 229 -#define EFFECT_ROUND 230 -#define EFFECT_BRINE 231 -#define EFFECT_VENOSHOCK 232 -#define EFFECT_RETALIATE 233 -#define EFFECT_BULLDOZE 234 -#define EFFECT_FOUL_PLAY 235 -#define EFFECT_PSYSHOCK 236 -#define EFFECT_ROOST 237 -#define EFFECT_GRAVITY 238 -#define EFFECT_MIRACLE_EYE 239 -#define EFFECT_TAILWIND 240 -#define EFFECT_EMBARGO 241 -#define EFFECT_AQUA_RING 242 -#define EFFECT_TRICK_ROOM 243 -#define EFFECT_WONDER_ROOM 244 -#define EFFECT_MAGIC_ROOM 245 -#define EFFECT_MAGNET_RISE 246 -#define EFFECT_TOXIC_SPIKES 247 -#define EFFECT_GASTRO_ACID 248 -#define EFFECT_STEALTH_ROCK 249 -#define EFFECT_TELEKINESIS 250 -#define EFFECT_POWER_SWAP 251 -#define EFFECT_GUARD_SWAP 252 -#define EFFECT_HEART_SWAP 253 -#define EFFECT_POWER_SPLIT 254 -#define EFFECT_GUARD_SPLIT 255 -#define EFFECT_STICKY_WEB 256 -#define EFFECT_METAL_BURST 257 -#define EFFECT_LUCKY_CHANT 258 -#define EFFECT_SUCKER_PUNCH 259 -#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 260 -#define EFFECT_SIMPLE_BEAM 261 -#define EFFECT_ENTRAINMENT 262 -#define EFFECT_HEAL_PULSE 263 -#define EFFECT_QUASH 264 -#define EFFECT_ION_DELUGE 265 -#define EFFECT_FREEZE_DRY 266 -#define EFFECT_TOPSY_TURVY 267 -#define EFFECT_MISTY_TERRAIN 268 -#define EFFECT_GRASSY_TERRAIN 269 -#define EFFECT_ELECTRIC_TERRAIN 270 -#define EFFECT_PSYCHIC_TERRAIN 271 -#define EFFECT_ATTACK_ACCURACY_UP 272 -#define EFFECT_ATTACK_SPATK_UP 273 -#define EFFECT_HURRICANE 274 -#define EFFECT_TWO_TYPED_MOVE 275 -#define EFFECT_ME_FIRST 276 -#define EFFECT_SPEED_UP_HIT 277 -#define EFFECT_QUIVER_DANCE 278 -#define EFFECT_COIL 279 -#define EFFECT_ELECTRIFY 280 -#define EFFECT_SCALD 281 -#define EFFECT_REFLECT_TYPE 282 -#define EFFECT_SOAK 283 -#define EFFECT_GROWTH 284 -#define EFFECT_CLOSE_COMBAT 285 -#define EFFECT_LAST_RESORT 286 -#define EFFECT_RECOIL_33_STATUS 287 -#define EFFECT_FLINCH_STATUS 288 -#define EFFECT_RECOIL_50 289 -#define EFFECT_SHELL_SMASH 290 -#define EFFECT_SHIFT_GEAR 291 -#define EFFECT_DEFENSE_UP_3 292 -#define EFFECT_NOBLE_ROAR 293 -#define EFFECT_VENOM_DRENCH 294 -#define EFFECT_TOXIC_THREAD 295 -#define EFFECT_CLEAR_SMOG 296 -#define EFFECT_HIT_SWITCH_TARGET 297 -#define EFFECT_FINAL_GAMBIT 298 -#define EFFECT_CHANGE_TYPE_ON_ITEM 299 -#define EFFECT_AUTOTOMIZE 300 -#define EFFECT_COPYCAT 301 -#define EFFECT_DEFOG 302 -#define EFFECT_HIT_ENEMY_HEAL_ALLY 303 -#define EFFECT_SMACK_DOWN 304 -#define EFFECT_SYNCHRONOISE 305 -#define EFFECT_PSYCHO_SHIFT 306 -#define EFFECT_POWER_TRICK 307 -#define EFFECT_FLAME_BURST 308 -#define EFFECT_AFTER_YOU 309 -#define EFFECT_BESTOW 310 -#define EFFECT_ROTOTILLER 311 -#define EFFECT_FLOWER_SHIELD 312 -#define EFFECT_HIT_PREVENT_ESCAPE 313 -#define EFFECT_SPEED_SWAP 314 -#define EFFECT_DEFENSE_UP2_HIT 315 -#define EFFECT_REVELATION_DANCE 316 -#define EFFECT_AURORA_VEIL 317 -#define EFFECT_THIRD_TYPE 318 -#define EFFECT_FEINT 319 -#define EFFECT_SPARKLING_ARIA 320 -#define EFFECT_ACUPRESSURE 321 -#define EFFECT_AROMATIC_MIST 322 -#define EFFECT_POWDER 323 -#define EFFECT_SP_ATTACK_UP_HIT 324 -#define EFFECT_BELCH 325 -#define EFFECT_PARTING_SHOT 326 -#define EFFECT_SPECTRAL_THIEF 327 -#define EFFECT_V_CREATE 328 -#define EFFECT_MAT_BLOCK 329 -#define EFFECT_STOMPING_TANTRUM 330 -#define EFFECT_CORE_ENFORCER 331 -#define EFFECT_INSTRUCT 332 -#define EFFECT_THROAT_CHOP 333 -#define EFFECT_LASER_FOCUS 334 -#define EFFECT_MAGNETIC_FLUX 335 -#define EFFECT_GEAR_UP 336 -#define EFFECT_INCINERATE 337 -#define EFFECT_BUG_BITE 338 -#define EFFECT_STRENGTH_SAP 339 -#define EFFECT_MIND_BLOWN 340 -#define EFFECT_PURIFY 341 -#define EFFECT_BURN_UP 342 -#define EFFECT_SHORE_UP 343 -#define EFFECT_GEOMANCY 344 -#define EFFECT_FAIRY_LOCK 345 -#define EFFECT_ALLY_SWITCH 346 -#define EFFECT_SLEEP_HIT 347 -#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 348 -#define EFFECT_BODY_PRESS 349 -#define EFFECT_EERIE_SPELL 350 -#define EFFECT_JUNGLE_HEALING 351 -#define EFFECT_COACHING 352 -#define EFFECT_LASH_OUT 353 -#define EFFECT_GRASSY_GLIDE 354 -#define EFFECT_REMOVE_TERRAIN 355 -#define EFFECT_DYNAMAX_DOUBLE_DMG 356 -#define EFFECT_DECORATE 357 -#define EFFECT_SNIPE_SHOT 358 -#define EFFECT_TRIPLE_HIT 359 -#define EFFECT_RECOIL_HP_25 360 -#define EFFECT_STUFF_CHEEKS 361 -#define EFFECT_GRAV_APPLE 362 -#define EFFECT_EVASION_UP_HIT 363 -#define EFFECT_DOUBLE_IRON_BASH 364 -#define EFFECT_GLITZY_GLOW 365 -#define EFFECT_BADDY_BAD 366 -#define EFFECT_SAPPY_SEED 367 -#define EFFECT_FREEZY_FROST 368 -#define EFFECT_SPARKLY_SWIRL 369 -#define EFFECT_PLASMA_FISTS 370 -#define EFFECT_HYPERSPACE_FURY 371 - -#define NUM_BATTLE_MOVE_EFFECTS 372 - -#endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H +#endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 4e776e592..959148e6c 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -308,6 +308,7 @@ #define FLAG_DMG_UNGROUNDED_IGNORE_TYPE_IF_FLYING (1 << 24) // Makes a Ground type move do 1x damage to flying and levitating targets #define FLAG_THAW_USER (1 << 25) #define FLAG_HIT_IN_SUBSTITUTE (1 << 26) // Hyperspace Fury +#define FLAG_TWO_STRIKES (1 << 27) // A move with this flag will strike twice, and may apply its effect on each hit // Split defines. #define SPLIT_PHYSICAL 0x0 diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 84fa7b634..43979a673 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3241,7 +3241,6 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) score += min(CountPositiveStatStages(battlerDef), 4); break; case EFFECT_MULTI_HIT: - case EFFECT_DOUBLE_HIT: case EFFECT_TRIPLE_KICK: break; case EFFECT_CONVERSION: diff --git a/src/battle_tv.c b/src/battle_tv.c index e6e29470d..3566f0873 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -130,7 +130,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_DRAGON_RAGE] = 2, [EFFECT_TRAP] = 4, // [EFFECT_HIGH_CRITICAL] = 1, - [EFFECT_DOUBLE_HIT] = 1, +// [EFFECT_DOUBLE_HIT] = 1, [EFFECT_RECOIL_IF_MISS] = 1, [EFFECT_MIST] = 5, [EFFECT_FOCUS_ENERGY] = 1, @@ -163,7 +163,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_EVASION_DOWN_HIT] = 1, // [EFFECT_SKY_ATTACK] = 4, [EFFECT_CONFUSE_HIT] = 1, - [EFFECT_TWINEEDLE] = 1, +// [EFFECT_TWINEEDLE] = 1, [EFFECT_VITAL_THROW] = 1, [EFFECT_SUBSTITUTE] = 4, [EFFECT_RECHARGE] = 5, diff --git a/src/battle_util.c b/src/battle_util.c index 6163e040f..e624ca166 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -217,20 +217,6 @@ static const u16 sEntrainmentTargetSimpleBeamBannedAbilities[] = ABILITY_GULP_MISSILE, }; -static const u16 sTwoStrikeMoves[] = -{ - MOVE_BONEMERANG, - MOVE_DOUBLE_HIT, - MOVE_DOUBLE_IRON_BASH, - MOVE_DOUBLE_KICK, - MOVE_DRAGON_DARTS, - MOVE_DUAL_CHOP, - MOVE_DUAL_WINGBEAT, - MOVE_GEAR_GRIND, - MOVE_TWINEEDLE, - 0xFFFF -}; - static u8 CalcBeatUpPower(void) { struct Pokemon *party; @@ -3571,7 +3557,7 @@ u8 AtkCanceller_UnableToUseMove(void) PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) } - else if (IsTwoStrikesMove(gCurrentMove)) + else if (gBattleMoves[gCurrentMove].flags & FLAG_TWO_STRIKES) { gMultiHitCounter = 2; PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) @@ -9714,15 +9700,3 @@ u16 GetUsedHeldItem(u8 battler) { return gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)]; } - -bool8 IsTwoStrikesMove(u16 move) -{ - u32 i; - - for (i = 0; i < ARRAY_COUNT(sTwoStrikeMoves); i++) - { - if (move == sTwoStrikeMoves[i]) - return TRUE; - } - return FALSE; -} diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index c3892cdc8..3729bf224 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -370,7 +370,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_DOUBLE_KICK] = { - .effect = EFFECT_DOUBLE_HIT, + .effect = EFFECT_HIT, .power = 30, .type = TYPE_FIGHTING, .accuracy = 100, @@ -378,7 +378,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -649,7 +649,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -2452,7 +2452,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_BONEMERANG] = { - .effect = EFFECT_DOUBLE_HIT, + .effect = EFFECT_HIT, .power = 50, .type = TYPE_GROUND, .accuracy = 90, @@ -2460,7 +2460,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -7259,7 +7259,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_DOUBLE_HIT] = { - .effect = EFFECT_DOUBLE_HIT, + .effect = EFFECT_HIT, .power = 35, .type = TYPE_NORMAL, .accuracy = 90, @@ -7267,7 +7267,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -8359,7 +8359,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_DUAL_CHOP] = { - .effect = EFFECT_DOUBLE_HIT, + .effect = EFFECT_HIT, .power = 40, .type = TYPE_DRAGON, .accuracy = 90, @@ -8367,7 +8367,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -8567,7 +8567,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_GEAR_GRIND] = { - .effect = EFFECT_DOUBLE_HIT, + .effect = EFFECT_HIT, .power = 50, .type = TYPE_STEEL, .accuracy = 85, @@ -8575,7 +8575,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -10726,9 +10726,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_DOUBLE_IRON_BASH] = { #if B_UPDATED_MOVE_DATA >= GEN_8 - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST | FLAG_TWO_STRIKES, #else - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_DMG_MINIMIZE | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_DMG_MINIMIZE | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST | FLAG_TWO_STRIKES, #endif .effect = EFFECT_FLINCH_HIT, .power = 60, @@ -10850,7 +10850,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -11472,7 +11472,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_DUAL_WINGBEAT] = { - .effect = EFFECT_DOUBLE_HIT, + .effect = EFFECT_HIT, .power = 40, .type = TYPE_FLYING, .accuracy = 90, @@ -11480,7 +11480,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, From 5d678bc2ce66f3432ceaf689839f11c950ce1a2d Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Mon, 1 Nov 2021 23:51:03 +1300 Subject: [PATCH 08/32] Fix move effect defines Had a define in a comment, which offset all the new move effects and misaligned their battle scripts. --- data/battle_scripts_1.s | 10 - include/constants/battle_move_effects.h | 316 ++++++++++++------------ 2 files changed, 158 insertions(+), 168 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 9f2f46484..e4514abf6 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3551,16 +3551,6 @@ BattleScript_EffectConfuseHit:: setmoveeffect MOVE_EFFECT_CONFUSION goto BattleScript_EffectHit -BattleScript_EffectTwineedle:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - sethword sMULTIHIT_EFFECT, MOVE_EFFECT_POISON - attackstring - ppreduce - setmultihitcounter 2 - initmultihitstring - goto BattleScript_MultiHitLoop - BattleScript_EffectSubstitute:: attackcanceler ppreduce diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index fd8919374..1892d9da9 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -214,164 +214,164 @@ #define EFFECT_DRAGON_DANCE 210 #define EFFECT_CAMOUFLAGE 211 -// New move effects 212 -#define EFFECT_PLEDGE 213 -#define EFFECT_FLING 214 -#define EFFECT_NATURAL_GIFT 215 -#define EFFECT_WAKE_UP_SLAP 216 -#define EFFECT_WRING_OUT 217 -#define EFFECT_HEX 218 -#define EFFECT_ASSURANCE 219 -#define EFFECT_TRUMP_CARD 220 -#define EFFECT_ACROBATICS 221 -#define EFFECT_HEAT_CRASH 222 -#define EFFECT_PUNISHMENT 223 -#define EFFECT_STORED_POWER 224 -#define EFFECT_ELECTRO_BALL 225 -#define EFFECT_GYRO_BALL 226 -#define EFFECT_ECHOED_VOICE 227 -#define EFFECT_PAYBACK 228 -#define EFFECT_ROUND 229 -#define EFFECT_BRINE 230 -#define EFFECT_VENOSHOCK 231 -#define EFFECT_RETALIATE 232 -#define EFFECT_BULLDOZE 233 -#define EFFECT_FOUL_PLAY 234 -#define EFFECT_PSYSHOCK 235 -#define EFFECT_ROOST 236 -#define EFFECT_GRAVITY 237 -#define EFFECT_MIRACLE_EYE 238 -#define EFFECT_TAILWIND 239 -#define EFFECT_EMBARGO 240 -#define EFFECT_AQUA_RING 241 -#define EFFECT_TRICK_ROOM 242 -#define EFFECT_WONDER_ROOM 243 -#define EFFECT_MAGIC_ROOM 244 -#define EFFECT_MAGNET_RISE 245 -#define EFFECT_TOXIC_SPIKES 246 -#define EFFECT_GASTRO_ACID 247 -#define EFFECT_STEALTH_ROCK 248 -#define EFFECT_TELEKINESIS 249 -#define EFFECT_POWER_SWAP 250 -#define EFFECT_GUARD_SWAP 251 -#define EFFECT_HEART_SWAP 252 -#define EFFECT_POWER_SPLIT 253 -#define EFFECT_GUARD_SPLIT 254 -#define EFFECT_STICKY_WEB 255 -#define EFFECT_METAL_BURST 256 -#define EFFECT_LUCKY_CHANT 257 -#define EFFECT_SUCKER_PUNCH 258 -#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 259 -#define EFFECT_SIMPLE_BEAM 260 -#define EFFECT_ENTRAINMENT 261 -#define EFFECT_HEAL_PULSE 262 -#define EFFECT_QUASH 263 -#define EFFECT_ION_DELUGE 264 -#define EFFECT_FREEZE_DRY 265 -#define EFFECT_TOPSY_TURVY 266 -#define EFFECT_MISTY_TERRAIN 267 -#define EFFECT_GRASSY_TERRAIN 268 -#define EFFECT_ELECTRIC_TERRAIN 269 -#define EFFECT_PSYCHIC_TERRAIN 270 -#define EFFECT_ATTACK_ACCURACY_UP 271 -#define EFFECT_ATTACK_SPATK_UP 272 -#define EFFECT_HURRICANE 273 -#define EFFECT_TWO_TYPED_MOVE 274 -#define EFFECT_ME_FIRST 275 -#define EFFECT_SPEED_UP_HIT 276 -#define EFFECT_QUIVER_DANCE 277 -#define EFFECT_COIL 278 -#define EFFECT_ELECTRIFY 279 -#define EFFECT_SCALD 280 -#define EFFECT_REFLECT_TYPE 281 -#define EFFECT_SOAK 282 -#define EFFECT_GROWTH 283 -#define EFFECT_CLOSE_COMBAT 284 -#define EFFECT_LAST_RESORT 285 -#define EFFECT_RECOIL_33_STATUS 286 -#define EFFECT_FLINCH_STATUS 287 -#define EFFECT_RECOIL_50 288 -#define EFFECT_SHELL_SMASH 289 -#define EFFECT_SHIFT_GEAR 290 -#define EFFECT_DEFENSE_UP_3 291 -#define EFFECT_NOBLE_ROAR 292 -#define EFFECT_VENOM_DRENCH 293 -#define EFFECT_TOXIC_THREAD 294 -#define EFFECT_CLEAR_SMOG 295 -#define EFFECT_HIT_SWITCH_TARGET 296 -#define EFFECT_FINAL_GAMBIT 297 -#define EFFECT_CHANGE_TYPE_ON_ITEM 298 -#define EFFECT_AUTOTOMIZE 299 -#define EFFECT_COPYCAT 300 -#define EFFECT_DEFOG 301 -#define EFFECT_HIT_ENEMY_HEAL_ALLY 302 -#define EFFECT_SMACK_DOWN 303 -#define EFFECT_SYNCHRONOISE 304 -#define EFFECT_PSYCHO_SHIFT 305 -#define EFFECT_POWER_TRICK 306 -#define EFFECT_FLAME_BURST 307 -#define EFFECT_AFTER_YOU 308 -#define EFFECT_BESTOW 309 -#define EFFECT_ROTOTILLER 310 -#define EFFECT_FLOWER_SHIELD 311 -#define EFFECT_HIT_PREVENT_ESCAPE 312 -#define EFFECT_SPEED_SWAP 313 -#define EFFECT_DEFENSE_UP2_HIT 314 -#define EFFECT_REVELATION_DANCE 315 -#define EFFECT_AURORA_VEIL 316 -#define EFFECT_THIRD_TYPE 317 -#define EFFECT_FEINT 318 -#define EFFECT_SPARKLING_ARIA 319 -#define EFFECT_ACUPRESSURE 320 -#define EFFECT_AROMATIC_MIST 321 -#define EFFECT_POWDER 322 -#define EFFECT_SP_ATTACK_UP_HIT 323 -#define EFFECT_BELCH 324 -#define EFFECT_PARTING_SHOT 325 -#define EFFECT_SPECTRAL_THIEF 326 -#define EFFECT_V_CREATE 327 -#define EFFECT_MAT_BLOCK 328 -#define EFFECT_STOMPING_TANTRUM 329 -#define EFFECT_CORE_ENFORCER 330 -#define EFFECT_INSTRUCT 331 -#define EFFECT_THROAT_CHOP 332 -#define EFFECT_LASER_FOCUS 333 -#define EFFECT_MAGNETIC_FLUX 334 -#define EFFECT_GEAR_UP 335 -#define EFFECT_INCINERATE 336 -#define EFFECT_BUG_BITE 337 -#define EFFECT_STRENGTH_SAP 338 -#define EFFECT_MIND_BLOWN 339 -#define EFFECT_PURIFY 340 -#define EFFECT_BURN_UP 341 -#define EFFECT_SHORE_UP 342 -#define EFFECT_GEOMANCY 343 -#define EFFECT_FAIRY_LOCK 344 -#define EFFECT_ALLY_SWITCH 345 -#define EFFECT_SLEEP_HIT 346 -#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 347 -#define EFFECT_BODY_PRESS 348 -#define EFFECT_EERIE_SPELL 349 -#define EFFECT_JUNGLE_HEALING 350 -#define EFFECT_COACHING 351 -#define EFFECT_LASH_OUT 352 -#define EFFECT_GRASSY_GLIDE 353 -#define EFFECT_REMOVE_TERRAIN 354 -#define EFFECT_DYNAMAX_DOUBLE_DMG 355 -#define EFFECT_DECORATE 356 -#define EFFECT_SNIPE_SHOT 357 -#define EFFECT_RECOIL_HP_25 358 -#define EFFECT_STUFF_CHEEKS 359 -#define EFFECT_GRAV_APPLE 360 -#define EFFECT_EVASION_UP_HIT 361 -#define EFFECT_GLITZY_GLOW 362 -#define EFFECT_BADDY_BAD 363 -#define EFFECT_SAPPY_SEED 364 -#define EFFECT_FREEZY_FROST 365 -#define EFFECT_SPARKLY_SWIRL 366 -#define EFFECT_PLASMA_FISTS 367 -#define EFFECT_HYPERSPACE_FURY 368 +// New move effects +#define EFFECT_PLEDGE 212 +#define EFFECT_FLING 213 +#define EFFECT_NATURAL_GIFT 214 +#define EFFECT_WAKE_UP_SLAP 215 +#define EFFECT_WRING_OUT 216 +#define EFFECT_HEX 217 +#define EFFECT_ASSURANCE 218 +#define EFFECT_TRUMP_CARD 219 +#define EFFECT_ACROBATICS 220 +#define EFFECT_HEAT_CRASH 221 +#define EFFECT_PUNISHMENT 222 +#define EFFECT_STORED_POWER 223 +#define EFFECT_ELECTRO_BALL 224 +#define EFFECT_GYRO_BALL 225 +#define EFFECT_ECHOED_VOICE 226 +#define EFFECT_PAYBACK 227 +#define EFFECT_ROUND 228 +#define EFFECT_BRINE 229 +#define EFFECT_VENOSHOCK 230 +#define EFFECT_RETALIATE 231 +#define EFFECT_BULLDOZE 232 +#define EFFECT_FOUL_PLAY 233 +#define EFFECT_PSYSHOCK 234 +#define EFFECT_ROOST 235 +#define EFFECT_GRAVITY 236 +#define EFFECT_MIRACLE_EYE 237 +#define EFFECT_TAILWIND 238 +#define EFFECT_EMBARGO 239 +#define EFFECT_AQUA_RING 240 +#define EFFECT_TRICK_ROOM 241 +#define EFFECT_WONDER_ROOM 242 +#define EFFECT_MAGIC_ROOM 243 +#define EFFECT_MAGNET_RISE 244 +#define EFFECT_TOXIC_SPIKES 245 +#define EFFECT_GASTRO_ACID 246 +#define EFFECT_STEALTH_ROCK 247 +#define EFFECT_TELEKINESIS 248 +#define EFFECT_POWER_SWAP 249 +#define EFFECT_GUARD_SWAP 250 +#define EFFECT_HEART_SWAP 251 +#define EFFECT_POWER_SPLIT 252 +#define EFFECT_GUARD_SPLIT 253 +#define EFFECT_STICKY_WEB 254 +#define EFFECT_METAL_BURST 255 +#define EFFECT_LUCKY_CHANT 256 +#define EFFECT_SUCKER_PUNCH 257 +#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 258 +#define EFFECT_SIMPLE_BEAM 259 +#define EFFECT_ENTRAINMENT 260 +#define EFFECT_HEAL_PULSE 261 +#define EFFECT_QUASH 262 +#define EFFECT_ION_DELUGE 263 +#define EFFECT_FREEZE_DRY 264 +#define EFFECT_TOPSY_TURVY 265 +#define EFFECT_MISTY_TERRAIN 266 +#define EFFECT_GRASSY_TERRAIN 267 +#define EFFECT_ELECTRIC_TERRAIN 268 +#define EFFECT_PSYCHIC_TERRAIN 269 +#define EFFECT_ATTACK_ACCURACY_UP 270 +#define EFFECT_ATTACK_SPATK_UP 271 +#define EFFECT_HURRICANE 272 +#define EFFECT_TWO_TYPED_MOVE 273 +#define EFFECT_ME_FIRST 274 +#define EFFECT_SPEED_UP_HIT 275 +#define EFFECT_QUIVER_DANCE 276 +#define EFFECT_COIL 277 +#define EFFECT_ELECTRIFY 278 +#define EFFECT_SCALD 279 +#define EFFECT_REFLECT_TYPE 280 +#define EFFECT_SOAK 281 +#define EFFECT_GROWTH 282 +#define EFFECT_CLOSE_COMBAT 283 +#define EFFECT_LAST_RESORT 284 +#define EFFECT_RECOIL_33_STATUS 285 +#define EFFECT_FLINCH_STATUS 286 +#define EFFECT_RECOIL_50 287 +#define EFFECT_SHELL_SMASH 288 +#define EFFECT_SHIFT_GEAR 289 +#define EFFECT_DEFENSE_UP_3 290 +#define EFFECT_NOBLE_ROAR 291 +#define EFFECT_VENOM_DRENCH 292 +#define EFFECT_TOXIC_THREAD 293 +#define EFFECT_CLEAR_SMOG 294 +#define EFFECT_HIT_SWITCH_TARGET 295 +#define EFFECT_FINAL_GAMBIT 296 +#define EFFECT_CHANGE_TYPE_ON_ITEM 297 +#define EFFECT_AUTOTOMIZE 298 +#define EFFECT_COPYCAT 299 +#define EFFECT_DEFOG 300 +#define EFFECT_HIT_ENEMY_HEAL_ALLY 301 +#define EFFECT_SMACK_DOWN 302 +#define EFFECT_SYNCHRONOISE 303 +#define EFFECT_PSYCHO_SHIFT 304 +#define EFFECT_POWER_TRICK 305 +#define EFFECT_FLAME_BURST 306 +#define EFFECT_AFTER_YOU 307 +#define EFFECT_BESTOW 308 +#define EFFECT_ROTOTILLER 309 +#define EFFECT_FLOWER_SHIELD 310 +#define EFFECT_HIT_PREVENT_ESCAPE 311 +#define EFFECT_SPEED_SWAP 312 +#define EFFECT_DEFENSE_UP2_HIT 313 +#define EFFECT_REVELATION_DANCE 314 +#define EFFECT_AURORA_VEIL 315 +#define EFFECT_THIRD_TYPE 316 +#define EFFECT_FEINT 317 +#define EFFECT_SPARKLING_ARIA 318 +#define EFFECT_ACUPRESSURE 319 +#define EFFECT_AROMATIC_MIST 320 +#define EFFECT_POWDER 321 +#define EFFECT_SP_ATTACK_UP_HIT 322 +#define EFFECT_BELCH 323 +#define EFFECT_PARTING_SHOT 324 +#define EFFECT_SPECTRAL_THIEF 325 +#define EFFECT_V_CREATE 326 +#define EFFECT_MAT_BLOCK 327 +#define EFFECT_STOMPING_TANTRUM 328 +#define EFFECT_CORE_ENFORCER 329 +#define EFFECT_INSTRUCT 330 +#define EFFECT_THROAT_CHOP 331 +#define EFFECT_LASER_FOCUS 332 +#define EFFECT_MAGNETIC_FLUX 333 +#define EFFECT_GEAR_UP 334 +#define EFFECT_INCINERATE 335 +#define EFFECT_BUG_BITE 336 +#define EFFECT_STRENGTH_SAP 337 +#define EFFECT_MIND_BLOWN 338 +#define EFFECT_PURIFY 339 +#define EFFECT_BURN_UP 340 +#define EFFECT_SHORE_UP 341 +#define EFFECT_GEOMANCY 342 +#define EFFECT_FAIRY_LOCK 343 +#define EFFECT_ALLY_SWITCH 344 +#define EFFECT_SLEEP_HIT 345 +#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 346 +#define EFFECT_BODY_PRESS 347 +#define EFFECT_EERIE_SPELL 348 +#define EFFECT_JUNGLE_HEALING 349 +#define EFFECT_COACHING 350 +#define EFFECT_LASH_OUT 351 +#define EFFECT_GRASSY_GLIDE 352 +#define EFFECT_REMOVE_TERRAIN 353 +#define EFFECT_DYNAMAX_DOUBLE_DMG 354 +#define EFFECT_DECORATE 355 +#define EFFECT_SNIPE_SHOT 356 +#define EFFECT_RECOIL_HP_25 357 +#define EFFECT_STUFF_CHEEKS 358 +#define EFFECT_GRAV_APPLE 359 +#define EFFECT_EVASION_UP_HIT 360 +#define EFFECT_GLITZY_GLOW 361 +#define EFFECT_BADDY_BAD 362 +#define EFFECT_SAPPY_SEED 363 +#define EFFECT_FREEZY_FROST 364 +#define EFFECT_SPARKLY_SWIRL 365 +#define EFFECT_PLASMA_FISTS 366 +#define EFFECT_HYPERSPACE_FURY 367 -#define NUM_BATTLE_MOVE_EFFECTS 369 +#define NUM_BATTLE_MOVE_EFFECTS 368 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H From 735ee60f85dca77a845bf50fddc521885aa2a2c0 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Tue, 2 Nov 2021 16:17:57 +1300 Subject: [PATCH 09/32] Restore missing break --- src/battle_util.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_util.c b/src/battle_util.c index e624ca166..efb63b301 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7874,6 +7874,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) #if B_BEAT_UP_DMG >= GEN_5 basePower = CalcBeatUpPower(); #endif + break; } // move-specific base power changes From be518608e8749526643aefc4f96dc8f8206a8688 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 7 Nov 2021 12:16:06 +1300 Subject: [PATCH 10/32] Update move effect defines Removing move effects above the ones that have stat change animations causes the wrong stat change to be shown, so I've reordered the list to fix that. --- include/constants/battle.h | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/include/constants/battle.h b/include/constants/battle.h index 0a2cfc49c..144cd3a13 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -300,7 +300,7 @@ #define MOVE_EFFECT_PAYDAY 0xB #define MOVE_EFFECT_CHARGING 0xC #define MOVE_EFFECT_WRAP 0xD -#define MOVE_EFFECT_RECOIL_25 0xE +#define MOVE_EFFECT_INCINERATE 0xE #define MOVE_EFFECT_ATK_PLUS_1 0xF #define MOVE_EFFECT_DEF_PLUS_1 0x10 #define MOVE_EFFECT_SPD_PLUS_1 0x11 @@ -324,7 +324,7 @@ #define MOVE_EFFECT_RAPIDSPIN 0x23 #define MOVE_EFFECT_REMOVE_STATUS 0x24 #define MOVE_EFFECT_ATK_DEF_DOWN 0x25 -#define MOVE_EFFECT_RECOIL_33 0x26 +#define MOVE_EFFECT_RECOIL_HP_25 0x26 #define MOVE_EFFECT_ATK_PLUS_2 0x27 #define MOVE_EFFECT_DEF_PLUS_2 0x28 #define MOVE_EFFECT_SPD_PLUS_2 0x29 @@ -342,9 +342,9 @@ #define MOVE_EFFECT_THRASH 0x35 #define MOVE_EFFECT_KNOCK_OFF 0x36 #define MOVE_EFFECT_DEF_SPDEF_DOWN 0x37 -#define MOVE_EFFECT_RECOIL_33_STATUS 0x38 -#define MOVE_EFFECT_RECOIL_50 0x39 -#define MOVE_EFFECT_CLEAR_SMOG 0x3A +#define MOVE_EFFECT_BURN_UP 0x38 +#define MOVE_EFFECT_CLEAR_SMOG 0x39 +#define MOVE_EFFECT_BUG_BITE 0x3A #define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x3B #define MOVE_EFFECT_SMACK_DOWN 0x3C #define MOVE_EFFECT_FLAME_BURST 0x3D @@ -354,12 +354,8 @@ #define MOVE_EFFECT_HAPPY_HOUR 0x41 #define MOVE_EFFECT_CORE_ENFORCER 0x42 #define MOVE_EFFECT_THROAT_CHOP 0x43 -#define MOVE_EFFECT_INCINERATE 0x44 -#define MOVE_EFFECT_BUG_BITE 0x45 -#define MOVE_EFFECT_RECOIL_HP_25 0x46 -#define MOVE_EFFECT_RELIC_SONG 0x47 -#define MOVE_EFFECT_BURN_UP 0x48 -#define NUM_MOVE_EFFECTS 0x48 + +#define NUM_MOVE_EFFECTS 0x44 #define MOVE_EFFECT_AFFECTS_USER 0x4000 #define MOVE_EFFECT_CERTAIN 0x8000 From c69e7666e7a4b9ce610ffa140bddae56ddb8be3a Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 7 Nov 2021 12:22:55 +1300 Subject: [PATCH 11/32] Update battle_move_effects.h --- include/constants/battle_move_effects.h | 753 ++++++++++++------------ 1 file changed, 380 insertions(+), 373 deletions(-) diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 1892d9da9..ac307a09a 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -1,377 +1,384 @@ #ifndef GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H #define GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H -#define EFFECT_HIT 0 -#define EFFECT_SLEEP 1 -#define EFFECT_POISON_HIT 2 -#define EFFECT_ABSORB 3 -#define EFFECT_BURN_HIT 4 -#define EFFECT_FREEZE_HIT 5 -#define EFFECT_PARALYZE_HIT 6 -#define EFFECT_EXPLOSION 7 -#define EFFECT_DREAM_EATER 8 -#define EFFECT_MIRROR_MOVE 9 -#define EFFECT_ATTACK_UP 10 -#define EFFECT_DEFENSE_UP 11 -#define EFFECT_SPEED_UP 12 -#define EFFECT_SPECIAL_ATTACK_UP 13 -#define EFFECT_SPECIAL_DEFENSE_UP 14 -#define EFFECT_ACCURACY_UP 15 -#define EFFECT_EVASION_UP 16 -#define EFFECT_SPECIAL_ATTACK_UP_3 17 -#define EFFECT_ATTACK_DOWN 18 -#define EFFECT_DEFENSE_DOWN 19 -#define EFFECT_SPEED_DOWN 20 -#define EFFECT_SPECIAL_ATTACK_DOWN 21 -#define EFFECT_SPECIAL_DEFENSE_DOWN 22 -#define EFFECT_ACCURACY_DOWN 23 -#define EFFECT_EVASION_DOWN 24 -#define EFFECT_HAZE 25 -#define EFFECT_BIDE 26 -#define EFFECT_RAMPAGE 27 -#define EFFECT_ROAR 28 -#define EFFECT_MULTI_HIT 29 -#define EFFECT_CONVERSION 30 -#define EFFECT_FLINCH_HIT 31 -#define EFFECT_RESTORE_HP 32 -#define EFFECT_TOXIC 33 -#define EFFECT_PAY_DAY 34 -#define EFFECT_LIGHT_SCREEN 35 -#define EFFECT_TRI_ATTACK 36 -#define EFFECT_REST 37 -#define EFFECT_OHKO 38 -#define EFFECT_FUSION_COMBO 39 -#define EFFECT_SUPER_FANG 40 -#define EFFECT_DRAGON_RAGE 41 -#define EFFECT_TRAP 42 -#define EFFECT_HEAL_BLOCK 43 -#define EFFECT_RECOIL_IF_MISS 44 -#define EFFECT_MIST 45 -#define EFFECT_FOCUS_ENERGY 46 -#define EFFECT_RECOIL_25 47 -#define EFFECT_CONFUSE 48 -#define EFFECT_ATTACK_UP_2 49 -#define EFFECT_DEFENSE_UP_2 50 -#define EFFECT_SPEED_UP_2 51 -#define EFFECT_SPECIAL_ATTACK_UP_2 52 -#define EFFECT_SPECIAL_DEFENSE_UP_2 53 -#define EFFECT_ACCURACY_UP_2 54 -#define EFFECT_EVASION_UP_2 55 -#define EFFECT_TRANSFORM 56 -#define EFFECT_ATTACK_DOWN_2 57 -#define EFFECT_DEFENSE_DOWN_2 58 -#define EFFECT_SPEED_DOWN_2 59 -#define EFFECT_SPECIAL_ATTACK_DOWN_2 60 -#define EFFECT_SPECIAL_DEFENSE_DOWN_2 61 -#define EFFECT_ACCURACY_DOWN_2 62 -#define EFFECT_EVASION_DOWN_2 63 -#define EFFECT_REFLECT 64 -#define EFFECT_POISON 65 -#define EFFECT_PARALYZE 66 -#define EFFECT_ATTACK_DOWN_HIT 67 -#define EFFECT_DEFENSE_DOWN_HIT 68 -#define EFFECT_SPEED_DOWN_HIT 69 -#define EFFECT_SPECIAL_ATTACK_DOWN_HIT 70 -#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT 71 -#define EFFECT_ACCURACY_DOWN_HIT 72 -#define EFFECT_EVASION_DOWN_HIT 73 -#define EFFECT_TWO_TURNS_ATTACK 74 -#define EFFECT_CONFUSE_HIT 75 -#define EFFECT_VITAL_THROW 76 -#define EFFECT_SUBSTITUTE 77 -#define EFFECT_RECHARGE 78 -#define EFFECT_RAGE 79 -#define EFFECT_MIMIC 80 -#define EFFECT_METRONOME 81 -#define EFFECT_LEECH_SEED 82 -#define EFFECT_DO_NOTHING 83 -#define EFFECT_DISABLE 84 -#define EFFECT_LEVEL_DAMAGE 85 -#define EFFECT_PSYWAVE 86 -#define EFFECT_COUNTER 87 -#define EFFECT_ENCORE 88 -#define EFFECT_PAIN_SPLIT 89 -#define EFFECT_SNORE 90 -#define EFFECT_CONVERSION_2 91 -#define EFFECT_LOCK_ON 92 -#define EFFECT_SKETCH 93 -#define EFFECT_HAMMER_ARM 94 -#define EFFECT_SLEEP_TALK 95 -#define EFFECT_DESTINY_BOND 96 -#define EFFECT_FLAIL 97 -#define EFFECT_SPITE 98 -#define EFFECT_FALSE_SWIPE 99 -#define EFFECT_HEAL_BELL 100 -#define EFFECT_ALWAYS_CRIT 101 -#define EFFECT_TRIPLE_KICK 102 -#define EFFECT_THIEF 103 -#define EFFECT_MEAN_LOOK 104 -#define EFFECT_NIGHTMARE 105 -#define EFFECT_MINIMIZE 106 -#define EFFECT_CURSE 107 -#define EFFECT_HEALING_WISH 108 -#define EFFECT_PROTECT 109 -#define EFFECT_SPIKES 110 -#define EFFECT_FORESIGHT 111 -#define EFFECT_PERISH_SONG 112 -#define EFFECT_SANDSTORM 113 -#define EFFECT_ENDURE 114 -#define EFFECT_ROLLOUT 115 -#define EFFECT_SWAGGER 116 -#define EFFECT_FURY_CUTTER 117 -#define EFFECT_ATTRACT 118 -#define EFFECT_RETURN 119 -#define EFFECT_PRESENT 120 -#define EFFECT_FRUSTRATION 121 -#define EFFECT_SAFEGUARD 122 -#define EFFECT_UNUSED_125 123 -#define EFFECT_MAGNITUDE 124 -#define EFFECT_BATON_PASS 125 -#define EFFECT_PURSUIT 126 -#define EFFECT_RAPID_SPIN 127 -#define EFFECT_SONICBOOM 128 -#define EFFECT_CAPTIVATE 129 -#define EFFECT_MORNING_SUN 130 -#define EFFECT_SYNTHESIS 131 -#define EFFECT_MOONLIGHT 132 -#define EFFECT_HIDDEN_POWER 133 -#define EFFECT_RAIN_DANCE 134 -#define EFFECT_SUNNY_DAY 135 -#define EFFECT_DEFENSE_UP_HIT 136 -#define EFFECT_ATTACK_UP_HIT 137 -#define EFFECT_ALL_STATS_UP_HIT 138 -#define EFFECT_FELL_STINGER 139 -#define EFFECT_BELLY_DRUM 140 -#define EFFECT_PSYCH_UP 141 -#define EFFECT_MIRROR_COAT 142 -#define EFFECT_SKULL_BASH 143 -#define EFFECT_TWISTER 144 -#define EFFECT_EARTHQUAKE 145 -#define EFFECT_FUTURE_SIGHT 146 -#define EFFECT_GUST 147 -#define EFFECT_FLINCH_MINIMIZE_HIT 148 -#define EFFECT_SOLARBEAM 149 -#define EFFECT_THUNDER 150 -#define EFFECT_TELEPORT 151 -#define EFFECT_BEAT_UP 152 -#define EFFECT_SEMI_INVULNERABLE 153 -#define EFFECT_DEFENSE_CURL 154 -#define EFFECT_SOFTBOILED 155 -#define EFFECT_FAKE_OUT 156 -#define EFFECT_UPROAR 157 -#define EFFECT_STOCKPILE 158 -#define EFFECT_SPIT_UP 159 -#define EFFECT_SWALLOW 160 -#define EFFECT_WORRY_SEED 161 -#define EFFECT_HAIL 162 -#define EFFECT_TORMENT 163 -#define EFFECT_FLATTER 164 -#define EFFECT_WILL_O_WISP 165 -#define EFFECT_MEMENTO 166 -#define EFFECT_FACADE 167 -#define EFFECT_FOCUS_PUNCH 168 -#define EFFECT_SMELLINGSALT 169 -#define EFFECT_FOLLOW_ME 170 -#define EFFECT_NATURE_POWER 171 -#define EFFECT_CHARGE 172 -#define EFFECT_TAUNT 173 -#define EFFECT_HELPING_HAND 174 -#define EFFECT_TRICK 175 -#define EFFECT_ROLE_PLAY 176 -#define EFFECT_WISH 177 -#define EFFECT_ASSIST 178 -#define EFFECT_INGRAIN 179 -#define EFFECT_SUPERPOWER 180 -#define EFFECT_MAGIC_COAT 181 -#define EFFECT_RECYCLE 182 -#define EFFECT_REVENGE 183 -#define EFFECT_BRICK_BREAK 184 -#define EFFECT_YAWN 185 -#define EFFECT_KNOCK_OFF 186 -#define EFFECT_ENDEAVOR 187 -#define EFFECT_ERUPTION 188 -#define EFFECT_SKILL_SWAP 189 -#define EFFECT_IMPRISON 190 -#define EFFECT_REFRESH 191 -#define EFFECT_GRUDGE 192 -#define EFFECT_SNATCH 193 -#define EFFECT_LOW_KICK 194 -#define EFFECT_SECRET_POWER 195 -#define EFFECT_RECOIL_33 196 -#define EFFECT_TEETER_DANCE 197 -#define EFFECT_HIT_ESCAPE 198 -#define EFFECT_MUD_SPORT 199 -#define EFFECT_POISON_FANG 200 -#define EFFECT_WEATHER_BALL 201 -#define EFFECT_OVERHEAT 202 -#define EFFECT_TICKLE 203 -#define EFFECT_COSMIC_POWER 204 -#define EFFECT_SKY_UPPERCUT 205 -#define EFFECT_BULK_UP 206 -#define EFFECT_PLACEHOLDER 207 -#define EFFECT_WATER_SPORT 208 -#define EFFECT_CALM_MIND 209 -#define EFFECT_DRAGON_DANCE 210 -#define EFFECT_CAMOUFLAGE 211 - -// New move effects -#define EFFECT_PLEDGE 212 -#define EFFECT_FLING 213 -#define EFFECT_NATURAL_GIFT 214 -#define EFFECT_WAKE_UP_SLAP 215 -#define EFFECT_WRING_OUT 216 -#define EFFECT_HEX 217 -#define EFFECT_ASSURANCE 218 -#define EFFECT_TRUMP_CARD 219 -#define EFFECT_ACROBATICS 220 -#define EFFECT_HEAT_CRASH 221 -#define EFFECT_PUNISHMENT 222 -#define EFFECT_STORED_POWER 223 -#define EFFECT_ELECTRO_BALL 224 -#define EFFECT_GYRO_BALL 225 -#define EFFECT_ECHOED_VOICE 226 -#define EFFECT_PAYBACK 227 -#define EFFECT_ROUND 228 -#define EFFECT_BRINE 229 -#define EFFECT_VENOSHOCK 230 -#define EFFECT_RETALIATE 231 -#define EFFECT_BULLDOZE 232 -#define EFFECT_FOUL_PLAY 233 -#define EFFECT_PSYSHOCK 234 -#define EFFECT_ROOST 235 -#define EFFECT_GRAVITY 236 -#define EFFECT_MIRACLE_EYE 237 -#define EFFECT_TAILWIND 238 -#define EFFECT_EMBARGO 239 -#define EFFECT_AQUA_RING 240 -#define EFFECT_TRICK_ROOM 241 -#define EFFECT_WONDER_ROOM 242 -#define EFFECT_MAGIC_ROOM 243 -#define EFFECT_MAGNET_RISE 244 -#define EFFECT_TOXIC_SPIKES 245 -#define EFFECT_GASTRO_ACID 246 -#define EFFECT_STEALTH_ROCK 247 -#define EFFECT_TELEKINESIS 248 -#define EFFECT_POWER_SWAP 249 -#define EFFECT_GUARD_SWAP 250 -#define EFFECT_HEART_SWAP 251 -#define EFFECT_POWER_SPLIT 252 -#define EFFECT_GUARD_SPLIT 253 -#define EFFECT_STICKY_WEB 254 -#define EFFECT_METAL_BURST 255 -#define EFFECT_LUCKY_CHANT 256 -#define EFFECT_SUCKER_PUNCH 257 -#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 258 -#define EFFECT_SIMPLE_BEAM 259 -#define EFFECT_ENTRAINMENT 260 -#define EFFECT_HEAL_PULSE 261 -#define EFFECT_QUASH 262 -#define EFFECT_ION_DELUGE 263 -#define EFFECT_FREEZE_DRY 264 -#define EFFECT_TOPSY_TURVY 265 -#define EFFECT_MISTY_TERRAIN 266 -#define EFFECT_GRASSY_TERRAIN 267 -#define EFFECT_ELECTRIC_TERRAIN 268 -#define EFFECT_PSYCHIC_TERRAIN 269 -#define EFFECT_ATTACK_ACCURACY_UP 270 -#define EFFECT_ATTACK_SPATK_UP 271 -#define EFFECT_HURRICANE 272 -#define EFFECT_TWO_TYPED_MOVE 273 -#define EFFECT_ME_FIRST 274 -#define EFFECT_SPEED_UP_HIT 275 -#define EFFECT_QUIVER_DANCE 276 -#define EFFECT_COIL 277 -#define EFFECT_ELECTRIFY 278 -#define EFFECT_SCALD 279 -#define EFFECT_REFLECT_TYPE 280 -#define EFFECT_SOAK 281 -#define EFFECT_GROWTH 282 -#define EFFECT_CLOSE_COMBAT 283 -#define EFFECT_LAST_RESORT 284 -#define EFFECT_RECOIL_33_STATUS 285 -#define EFFECT_FLINCH_STATUS 286 -#define EFFECT_RECOIL_50 287 -#define EFFECT_SHELL_SMASH 288 -#define EFFECT_SHIFT_GEAR 289 -#define EFFECT_DEFENSE_UP_3 290 -#define EFFECT_NOBLE_ROAR 291 -#define EFFECT_VENOM_DRENCH 292 -#define EFFECT_TOXIC_THREAD 293 -#define EFFECT_CLEAR_SMOG 294 -#define EFFECT_HIT_SWITCH_TARGET 295 -#define EFFECT_FINAL_GAMBIT 296 -#define EFFECT_CHANGE_TYPE_ON_ITEM 297 -#define EFFECT_AUTOTOMIZE 298 -#define EFFECT_COPYCAT 299 -#define EFFECT_DEFOG 300 -#define EFFECT_HIT_ENEMY_HEAL_ALLY 301 -#define EFFECT_SMACK_DOWN 302 -#define EFFECT_SYNCHRONOISE 303 -#define EFFECT_PSYCHO_SHIFT 304 -#define EFFECT_POWER_TRICK 305 -#define EFFECT_FLAME_BURST 306 -#define EFFECT_AFTER_YOU 307 -#define EFFECT_BESTOW 308 -#define EFFECT_ROTOTILLER 309 -#define EFFECT_FLOWER_SHIELD 310 -#define EFFECT_HIT_PREVENT_ESCAPE 311 -#define EFFECT_SPEED_SWAP 312 -#define EFFECT_DEFENSE_UP2_HIT 313 -#define EFFECT_REVELATION_DANCE 314 -#define EFFECT_AURORA_VEIL 315 -#define EFFECT_THIRD_TYPE 316 -#define EFFECT_FEINT 317 -#define EFFECT_SPARKLING_ARIA 318 -#define EFFECT_ACUPRESSURE 319 -#define EFFECT_AROMATIC_MIST 320 -#define EFFECT_POWDER 321 -#define EFFECT_SP_ATTACK_UP_HIT 322 -#define EFFECT_BELCH 323 -#define EFFECT_PARTING_SHOT 324 -#define EFFECT_SPECTRAL_THIEF 325 -#define EFFECT_V_CREATE 326 -#define EFFECT_MAT_BLOCK 327 -#define EFFECT_STOMPING_TANTRUM 328 -#define EFFECT_CORE_ENFORCER 329 -#define EFFECT_INSTRUCT 330 -#define EFFECT_THROAT_CHOP 331 -#define EFFECT_LASER_FOCUS 332 -#define EFFECT_MAGNETIC_FLUX 333 -#define EFFECT_GEAR_UP 334 -#define EFFECT_INCINERATE 335 -#define EFFECT_BUG_BITE 336 -#define EFFECT_STRENGTH_SAP 337 -#define EFFECT_MIND_BLOWN 338 -#define EFFECT_PURIFY 339 -#define EFFECT_BURN_UP 340 -#define EFFECT_SHORE_UP 341 -#define EFFECT_GEOMANCY 342 -#define EFFECT_FAIRY_LOCK 343 -#define EFFECT_ALLY_SWITCH 344 -#define EFFECT_SLEEP_HIT 345 -#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 346 -#define EFFECT_BODY_PRESS 347 -#define EFFECT_EERIE_SPELL 348 -#define EFFECT_JUNGLE_HEALING 349 -#define EFFECT_COACHING 350 -#define EFFECT_LASH_OUT 351 -#define EFFECT_GRASSY_GLIDE 352 -#define EFFECT_REMOVE_TERRAIN 353 -#define EFFECT_DYNAMAX_DOUBLE_DMG 354 -#define EFFECT_DECORATE 355 -#define EFFECT_SNIPE_SHOT 356 -#define EFFECT_RECOIL_HP_25 357 -#define EFFECT_STUFF_CHEEKS 358 -#define EFFECT_GRAV_APPLE 359 -#define EFFECT_EVASION_UP_HIT 360 -#define EFFECT_GLITZY_GLOW 361 -#define EFFECT_BADDY_BAD 362 -#define EFFECT_SAPPY_SEED 363 -#define EFFECT_FREEZY_FROST 364 -#define EFFECT_SPARKLY_SWIRL 365 -#define EFFECT_PLASMA_FISTS 366 -#define EFFECT_HYPERSPACE_FURY 367 - -#define NUM_BATTLE_MOVE_EFFECTS 368 +#define EFFECT_HIT 0 +#define EFFECT_SLEEP 1 +#define EFFECT_POISON_HIT 2 +#define EFFECT_ABSORB 3 +#define EFFECT_BURN_HIT 4 +#define EFFECT_FREEZE_HIT 5 +#define EFFECT_PARALYZE_HIT 6 +#define EFFECT_EXPLOSION 7 +#define EFFECT_DREAM_EATER 8 +#define EFFECT_MIRROR_MOVE 9 +#define EFFECT_ATTACK_UP 10 +#define EFFECT_DEFENSE_UP 11 +#define EFFECT_SPEED_UP 12 +#define EFFECT_SPECIAL_ATTACK_UP 13 +#define EFFECT_SPECIAL_DEFENSE_UP 14 +#define EFFECT_ACCURACY_UP 15 +#define EFFECT_EVASION_UP 16 +#define EFFECT_SPECIAL_ATTACK_UP_3 17 +#define EFFECT_ATTACK_DOWN 18 +#define EFFECT_DEFENSE_DOWN 19 +#define EFFECT_SPEED_DOWN 20 +#define EFFECT_SPECIAL_ATTACK_DOWN 21 +#define EFFECT_SPECIAL_DEFENSE_DOWN 22 +#define EFFECT_ACCURACY_DOWN 23 +#define EFFECT_EVASION_DOWN 24 +#define EFFECT_HAZE 25 +#define EFFECT_BIDE 26 +#define EFFECT_RAMPAGE 27 +#define EFFECT_ROAR 28 +#define EFFECT_MULTI_HIT 29 +#define EFFECT_CONVERSION 30 +#define EFFECT_FLINCH_HIT 31 +#define EFFECT_RESTORE_HP 32 +#define EFFECT_TOXIC 33 +#define EFFECT_PAY_DAY 34 +#define EFFECT_LIGHT_SCREEN 35 +#define EFFECT_TRI_ATTACK 36 +#define EFFECT_REST 37 +#define EFFECT_OHKO 38 +#define EFFECT_FUSION_COMBO 39 +#define EFFECT_SUPER_FANG 40 +#define EFFECT_DRAGON_RAGE 41 +#define EFFECT_TRAP 42 +#define EFFECT_HEAL_BLOCK 43 +#define EFFECT_DOUBLE_HIT 44 +#define EFFECT_RECOIL_IF_MISS 45 +#define EFFECT_MIST 46 +#define EFFECT_FOCUS_ENERGY 47 +#define EFFECT_RECOIL_25 48 +#define EFFECT_CONFUSE 49 +#define EFFECT_ATTACK_UP_2 50 +#define EFFECT_DEFENSE_UP_2 51 +#define EFFECT_SPEED_UP_2 52 +#define EFFECT_SPECIAL_ATTACK_UP_2 53 +#define EFFECT_SPECIAL_DEFENSE_UP_2 54 +#define EFFECT_ACCURACY_UP_2 55 +#define EFFECT_EVASION_UP_2 56 +#define EFFECT_TRANSFORM 57 +#define EFFECT_ATTACK_DOWN_2 58 +#define EFFECT_DEFENSE_DOWN_2 59 +#define EFFECT_SPEED_DOWN_2 60 +#define EFFECT_SPECIAL_ATTACK_DOWN_2 61 +#define EFFECT_SPECIAL_DEFENSE_DOWN_2 62 +#define EFFECT_ACCURACY_DOWN_2 63 +#define EFFECT_EVASION_DOWN_2 64 +#define EFFECT_REFLECT 65 +#define EFFECT_POISON 66 +#define EFFECT_PARALYZE 67 +#define EFFECT_ATTACK_DOWN_HIT 68 +#define EFFECT_DEFENSE_DOWN_HIT 69 +#define EFFECT_SPEED_DOWN_HIT 70 +#define EFFECT_SPECIAL_ATTACK_DOWN_HIT 71 +#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT 72 +#define EFFECT_ACCURACY_DOWN_HIT 73 +#define EFFECT_EVASION_DOWN_HIT 74 +#define EFFECT_TWO_TURNS_ATTACK 75 +#define EFFECT_CONFUSE_HIT 76 +#define EFFECT_TWINEEDLE 77 +#define EFFECT_VITAL_THROW 78 +#define EFFECT_SUBSTITUTE 79 +#define EFFECT_RECHARGE 80 +#define EFFECT_RAGE 81 +#define EFFECT_MIMIC 82 +#define EFFECT_METRONOME 83 +#define EFFECT_LEECH_SEED 84 +#define EFFECT_DO_NOTHING 85 +#define EFFECT_DISABLE 86 +#define EFFECT_LEVEL_DAMAGE 87 +#define EFFECT_PSYWAVE 88 +#define EFFECT_COUNTER 89 +#define EFFECT_ENCORE 90 +#define EFFECT_PAIN_SPLIT 91 +#define EFFECT_SNORE 92 +#define EFFECT_CONVERSION_2 93 +#define EFFECT_LOCK_ON 94 +#define EFFECT_SKETCH 95 +#define EFFECT_HAMMER_ARM 96 +#define EFFECT_SLEEP_TALK 97 +#define EFFECT_DESTINY_BOND 98 +#define EFFECT_FLAIL 99 +#define EFFECT_SPITE 100 +#define EFFECT_FALSE_SWIPE 101 +#define EFFECT_HEAL_BELL 102 +#define EFFECT_ALWAYS_CRIT 103 +#define EFFECT_TRIPLE_KICK 104 +#define EFFECT_THIEF 105 +#define EFFECT_MEAN_LOOK 106 +#define EFFECT_NIGHTMARE 107 +#define EFFECT_MINIMIZE 108 +#define EFFECT_CURSE 109 +#define EFFECT_HEALING_WISH 110 +#define EFFECT_PROTECT 111 +#define EFFECT_SPIKES 112 +#define EFFECT_FORESIGHT 113 +#define EFFECT_PERISH_SONG 114 +#define EFFECT_SANDSTORM 115 +#define EFFECT_ENDURE 116 +#define EFFECT_ROLLOUT 117 +#define EFFECT_SWAGGER 118 +#define EFFECT_FURY_CUTTER 119 +#define EFFECT_ATTRACT 120 +#define EFFECT_RETURN 121 +#define EFFECT_PRESENT 122 +#define EFFECT_FRUSTRATION 123 +#define EFFECT_SAFEGUARD 124 +#define EFFECT_UNUSED_125 125 +#define EFFECT_MAGNITUDE 126 +#define EFFECT_BATON_PASS 127 +#define EFFECT_PURSUIT 128 +#define EFFECT_RAPID_SPIN 129 +#define EFFECT_SONICBOOM 130 +#define EFFECT_CAPTIVATE 131 +#define EFFECT_MORNING_SUN 132 +#define EFFECT_SYNTHESIS 133 +#define EFFECT_MOONLIGHT 134 +#define EFFECT_HIDDEN_POWER 135 +#define EFFECT_RAIN_DANCE 136 +#define EFFECT_SUNNY_DAY 137 +#define EFFECT_DEFENSE_UP_HIT 138 +#define EFFECT_ATTACK_UP_HIT 139 +#define EFFECT_ALL_STATS_UP_HIT 140 +#define EFFECT_FELL_STINGER 141 +#define EFFECT_BELLY_DRUM 142 +#define EFFECT_PSYCH_UP 143 +#define EFFECT_MIRROR_COAT 144 +#define EFFECT_SKULL_BASH 145 +#define EFFECT_TWISTER 146 +#define EFFECT_EARTHQUAKE 147 +#define EFFECT_FUTURE_SIGHT 148 +#define EFFECT_GUST 149 +#define EFFECT_FLINCH_MINIMIZE_HIT 150 +#define EFFECT_SOLARBEAM 151 +#define EFFECT_THUNDER 152 +#define EFFECT_TELEPORT 153 +#define EFFECT_BEAT_UP 154 +#define EFFECT_SEMI_INVULNERABLE 155 +#define EFFECT_DEFENSE_CURL 156 +#define EFFECT_SOFTBOILED 157 +#define EFFECT_FAKE_OUT 158 +#define EFFECT_UPROAR 159 +#define EFFECT_STOCKPILE 160 +#define EFFECT_SPIT_UP 161 +#define EFFECT_SWALLOW 162 +#define EFFECT_WORRY_SEED 163 +#define EFFECT_HAIL 164 +#define EFFECT_TORMENT 165 +#define EFFECT_FLATTER 166 +#define EFFECT_WILL_O_WISP 167 +#define EFFECT_MEMENTO 168 +#define EFFECT_FACADE 169 +#define EFFECT_FOCUS_PUNCH 170 +#define EFFECT_SMELLINGSALT 171 +#define EFFECT_FOLLOW_ME 172 +#define EFFECT_NATURE_POWER 173 +#define EFFECT_CHARGE 174 +#define EFFECT_TAUNT 175 +#define EFFECT_HELPING_HAND 176 +#define EFFECT_TRICK 177 +#define EFFECT_ROLE_PLAY 178 +#define EFFECT_WISH 179 +#define EFFECT_ASSIST 180 +#define EFFECT_INGRAIN 181 +#define EFFECT_SUPERPOWER 182 +#define EFFECT_MAGIC_COAT 183 +#define EFFECT_RECYCLE 184 +#define EFFECT_REVENGE 185 +#define EFFECT_BRICK_BREAK 186 +#define EFFECT_YAWN 187 +#define EFFECT_KNOCK_OFF 188 +#define EFFECT_ENDEAVOR 189 +#define EFFECT_ERUPTION 190 +#define EFFECT_SKILL_SWAP 191 +#define EFFECT_IMPRISON 192 +#define EFFECT_REFRESH 193 +#define EFFECT_GRUDGE 194 +#define EFFECT_SNATCH 195 +#define EFFECT_LOW_KICK 196 +#define EFFECT_SECRET_POWER 197 +#define EFFECT_RECOIL_33 198 +#define EFFECT_TEETER_DANCE 199 +#define EFFECT_HIT_ESCAPE 200 +#define EFFECT_MUD_SPORT 201 +#define EFFECT_POISON_FANG 202 +#define EFFECT_WEATHER_BALL 203 +#define EFFECT_OVERHEAT 204 +#define EFFECT_TICKLE 205 +#define EFFECT_COSMIC_POWER 206 +#define EFFECT_SKY_UPPERCUT 207 +#define EFFECT_BULK_UP 208 +#define EFFECT_PLACEHOLDER 209 +#define EFFECT_WATER_SPORT 210 +#define EFFECT_CALM_MIND 211 +#define EFFECT_DRAGON_DANCE 212 +#define EFFECT_CAMOUFLAGE 213 -#endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H +// New move effects +#define EFFECT_PLEDGE 214 +#define EFFECT_FLING 215 +#define EFFECT_NATURAL_GIFT 216 +#define EFFECT_WAKE_UP_SLAP 217 +#define EFFECT_WRING_OUT 218 +#define EFFECT_HEX 219 +#define EFFECT_ASSURANCE 220 +#define EFFECT_TRUMP_CARD 221 +#define EFFECT_ACROBATICS 222 +#define EFFECT_HEAT_CRASH 223 +#define EFFECT_PUNISHMENT 224 +#define EFFECT_STORED_POWER 225 +#define EFFECT_ELECTRO_BALL 226 +#define EFFECT_GYRO_BALL 227 +#define EFFECT_ECHOED_VOICE 228 +#define EFFECT_PAYBACK 229 +#define EFFECT_ROUND 230 +#define EFFECT_BRINE 231 +#define EFFECT_VENOSHOCK 232 +#define EFFECT_RETALIATE 233 +#define EFFECT_BULLDOZE 234 +#define EFFECT_FOUL_PLAY 235 +#define EFFECT_PSYSHOCK 236 +#define EFFECT_ROOST 237 +#define EFFECT_GRAVITY 238 +#define EFFECT_MIRACLE_EYE 239 +#define EFFECT_TAILWIND 240 +#define EFFECT_EMBARGO 241 +#define EFFECT_AQUA_RING 242 +#define EFFECT_TRICK_ROOM 243 +#define EFFECT_WONDER_ROOM 244 +#define EFFECT_MAGIC_ROOM 245 +#define EFFECT_MAGNET_RISE 246 +#define EFFECT_TOXIC_SPIKES 247 +#define EFFECT_GASTRO_ACID 248 +#define EFFECT_STEALTH_ROCK 249 +#define EFFECT_TELEKINESIS 250 +#define EFFECT_POWER_SWAP 251 +#define EFFECT_GUARD_SWAP 252 +#define EFFECT_HEART_SWAP 253 +#define EFFECT_POWER_SPLIT 254 +#define EFFECT_GUARD_SPLIT 255 +#define EFFECT_STICKY_WEB 256 +#define EFFECT_METAL_BURST 257 +#define EFFECT_LUCKY_CHANT 258 +#define EFFECT_SUCKER_PUNCH 259 +#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 260 +#define EFFECT_SIMPLE_BEAM 261 +#define EFFECT_ENTRAINMENT 262 +#define EFFECT_HEAL_PULSE 263 +#define EFFECT_QUASH 264 +#define EFFECT_ION_DELUGE 265 +#define EFFECT_FREEZE_DRY 266 +#define EFFECT_TOPSY_TURVY 267 +#define EFFECT_MISTY_TERRAIN 268 +#define EFFECT_GRASSY_TERRAIN 269 +#define EFFECT_ELECTRIC_TERRAIN 270 +#define EFFECT_PSYCHIC_TERRAIN 271 +#define EFFECT_ATTACK_ACCURACY_UP 272 +#define EFFECT_ATTACK_SPATK_UP 273 +#define EFFECT_HURRICANE 274 +#define EFFECT_TWO_TYPED_MOVE 275 +#define EFFECT_ME_FIRST 276 +#define EFFECT_SPEED_UP_HIT 277 +#define EFFECT_QUIVER_DANCE 278 +#define EFFECT_COIL 279 +#define EFFECT_ELECTRIFY 280 +#define EFFECT_SCALD 281 +#define EFFECT_REFLECT_TYPE 282 +#define EFFECT_SOAK 283 +#define EFFECT_GROWTH 284 +#define EFFECT_CLOSE_COMBAT 285 +#define EFFECT_LAST_RESORT 286 +#define EFFECT_RECOIL_33_STATUS 287 +#define EFFECT_FLINCH_STATUS 288 +#define EFFECT_RECOIL_50 289 +#define EFFECT_SHELL_SMASH 290 +#define EFFECT_SHIFT_GEAR 291 +#define EFFECT_DEFENSE_UP_3 292 +#define EFFECT_NOBLE_ROAR 293 +#define EFFECT_VENOM_DRENCH 294 +#define EFFECT_TOXIC_THREAD 295 +#define EFFECT_CLEAR_SMOG 296 +#define EFFECT_HIT_SWITCH_TARGET 297 +#define EFFECT_FINAL_GAMBIT 298 +#define EFFECT_CHANGE_TYPE_ON_ITEM 299 +#define EFFECT_AUTOTOMIZE 300 +#define EFFECT_COPYCAT 301 +#define EFFECT_DEFOG 302 +#define EFFECT_HIT_ENEMY_HEAL_ALLY 303 +#define EFFECT_SMACK_DOWN 304 +#define EFFECT_SYNCHRONOISE 305 +#define EFFECT_PSYCHO_SHIFT 306 +#define EFFECT_POWER_TRICK 307 +#define EFFECT_FLAME_BURST 308 +#define EFFECT_AFTER_YOU 309 +#define EFFECT_BESTOW 310 +#define EFFECT_ROTOTILLER 311 +#define EFFECT_FLOWER_SHIELD 312 +#define EFFECT_HIT_PREVENT_ESCAPE 313 +#define EFFECT_SPEED_SWAP 314 +#define EFFECT_DEFENSE_UP2_HIT 315 +#define EFFECT_REVELATION_DANCE 316 +#define EFFECT_AURORA_VEIL 317 +#define EFFECT_THIRD_TYPE 318 +#define EFFECT_FEINT 319 +#define EFFECT_SPARKLING_ARIA 320 +#define EFFECT_ACUPRESSURE 321 +#define EFFECT_AROMATIC_MIST 322 +#define EFFECT_POWDER 323 +#define EFFECT_SP_ATTACK_UP_HIT 324 +#define EFFECT_BELCH 325 +#define EFFECT_PARTING_SHOT 326 +#define EFFECT_SPECTRAL_THIEF 327 +#define EFFECT_V_CREATE 328 +#define EFFECT_MAT_BLOCK 329 +#define EFFECT_STOMPING_TANTRUM 330 +#define EFFECT_CORE_ENFORCER 331 +#define EFFECT_INSTRUCT 332 +#define EFFECT_THROAT_CHOP 333 +#define EFFECT_LASER_FOCUS 334 +#define EFFECT_MAGNETIC_FLUX 335 +#define EFFECT_GEAR_UP 336 +#define EFFECT_INCINERATE 337 +#define EFFECT_BUG_BITE 338 +#define EFFECT_STRENGTH_SAP 339 +#define EFFECT_MIND_BLOWN 340 +#define EFFECT_PURIFY 341 +#define EFFECT_BURN_UP 342 +#define EFFECT_SHORE_UP 343 +#define EFFECT_GEOMANCY 344 +#define EFFECT_FAIRY_LOCK 345 +#define EFFECT_ALLY_SWITCH 346 +#define EFFECT_RELIC_SONG 347 +#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 348 +#define EFFECT_BODY_PRESS 349 +#define EFFECT_EERIE_SPELL 350 +#define EFFECT_JUNGLE_HEALING 351 +#define EFFECT_COACHING 352 +#define EFFECT_LASH_OUT 353 +#define EFFECT_GRASSY_GLIDE 354 +#define EFFECT_REMOVE_TERRAIN 355 +#define EFFECT_DYNAMAX_DOUBLE_DMG 356 +#define EFFECT_DECORATE 357 +#define EFFECT_SNIPE_SHOT 358 +#define EFFECT_TRIPLE_HIT 359 +#define EFFECT_RECOIL_HP_25 360 +#define EFFECT_STUFF_CHEEKS 361 +#define EFFECT_GRAV_APPLE 362 +#define EFFECT_EVASION_UP_HIT 363 +#define EFFECT_DOUBLE_IRON_BASH 364 +#define EFFECT_GLITZY_GLOW 365 +#define EFFECT_BADDY_BAD 366 +#define EFFECT_SAPPY_SEED 367 +#define EFFECT_FREEZY_FROST 368 +#define EFFECT_SPARKLY_SWIRL 369 +#define EFFECT_PLASMA_FISTS 370 +#define EFFECT_HYPERSPACE_FURY 371 +#define EFFECT_AURA_WHEEL 372 +#define EFFECT_PHOTON_GEYSER 373 +#define EFFECT_SHELL_SIDE_ARM 374 + +#define NUM_BATTLE_MOVE_EFFECTS 375 + +#endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H \ No newline at end of file From 9351df5ed856b2bbd3658970fc77de03dc5925ce Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 7 Nov 2021 12:25:26 +1300 Subject: [PATCH 12/32] Revert "Update move effect defines" This reverts commit be518608e8749526643aefc4f96dc8f8206a8688. --- include/constants/battle.h | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/include/constants/battle.h b/include/constants/battle.h index 144cd3a13..0a2cfc49c 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -300,7 +300,7 @@ #define MOVE_EFFECT_PAYDAY 0xB #define MOVE_EFFECT_CHARGING 0xC #define MOVE_EFFECT_WRAP 0xD -#define MOVE_EFFECT_INCINERATE 0xE +#define MOVE_EFFECT_RECOIL_25 0xE #define MOVE_EFFECT_ATK_PLUS_1 0xF #define MOVE_EFFECT_DEF_PLUS_1 0x10 #define MOVE_EFFECT_SPD_PLUS_1 0x11 @@ -324,7 +324,7 @@ #define MOVE_EFFECT_RAPIDSPIN 0x23 #define MOVE_EFFECT_REMOVE_STATUS 0x24 #define MOVE_EFFECT_ATK_DEF_DOWN 0x25 -#define MOVE_EFFECT_RECOIL_HP_25 0x26 +#define MOVE_EFFECT_RECOIL_33 0x26 #define MOVE_EFFECT_ATK_PLUS_2 0x27 #define MOVE_EFFECT_DEF_PLUS_2 0x28 #define MOVE_EFFECT_SPD_PLUS_2 0x29 @@ -342,9 +342,9 @@ #define MOVE_EFFECT_THRASH 0x35 #define MOVE_EFFECT_KNOCK_OFF 0x36 #define MOVE_EFFECT_DEF_SPDEF_DOWN 0x37 -#define MOVE_EFFECT_BURN_UP 0x38 -#define MOVE_EFFECT_CLEAR_SMOG 0x39 -#define MOVE_EFFECT_BUG_BITE 0x3A +#define MOVE_EFFECT_RECOIL_33_STATUS 0x38 +#define MOVE_EFFECT_RECOIL_50 0x39 +#define MOVE_EFFECT_CLEAR_SMOG 0x3A #define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x3B #define MOVE_EFFECT_SMACK_DOWN 0x3C #define MOVE_EFFECT_FLAME_BURST 0x3D @@ -354,8 +354,12 @@ #define MOVE_EFFECT_HAPPY_HOUR 0x41 #define MOVE_EFFECT_CORE_ENFORCER 0x42 #define MOVE_EFFECT_THROAT_CHOP 0x43 - -#define NUM_MOVE_EFFECTS 0x44 +#define MOVE_EFFECT_INCINERATE 0x44 +#define MOVE_EFFECT_BUG_BITE 0x45 +#define MOVE_EFFECT_RECOIL_HP_25 0x46 +#define MOVE_EFFECT_RELIC_SONG 0x47 +#define MOVE_EFFECT_BURN_UP 0x48 +#define NUM_MOVE_EFFECTS 0x48 #define MOVE_EFFECT_AFFECTS_USER 0x4000 #define MOVE_EFFECT_CERTAIN 0x8000 From d30f2b57125b5cbca83248799079de40ffba51a2 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 7 Nov 2021 15:22:33 +1300 Subject: [PATCH 13/32] Fix move effects list Fixed it properly this time! --- include/constants/battle_move_effects.h | 752 ++++++++++++------------ 1 file changed, 374 insertions(+), 378 deletions(-) diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index ac307a09a..6397a09d7 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -1,384 +1,380 @@ #ifndef GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H #define GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H -#define EFFECT_HIT 0 -#define EFFECT_SLEEP 1 -#define EFFECT_POISON_HIT 2 -#define EFFECT_ABSORB 3 -#define EFFECT_BURN_HIT 4 -#define EFFECT_FREEZE_HIT 5 -#define EFFECT_PARALYZE_HIT 6 -#define EFFECT_EXPLOSION 7 -#define EFFECT_DREAM_EATER 8 -#define EFFECT_MIRROR_MOVE 9 -#define EFFECT_ATTACK_UP 10 -#define EFFECT_DEFENSE_UP 11 -#define EFFECT_SPEED_UP 12 -#define EFFECT_SPECIAL_ATTACK_UP 13 -#define EFFECT_SPECIAL_DEFENSE_UP 14 -#define EFFECT_ACCURACY_UP 15 -#define EFFECT_EVASION_UP 16 -#define EFFECT_SPECIAL_ATTACK_UP_3 17 -#define EFFECT_ATTACK_DOWN 18 -#define EFFECT_DEFENSE_DOWN 19 -#define EFFECT_SPEED_DOWN 20 -#define EFFECT_SPECIAL_ATTACK_DOWN 21 -#define EFFECT_SPECIAL_DEFENSE_DOWN 22 -#define EFFECT_ACCURACY_DOWN 23 -#define EFFECT_EVASION_DOWN 24 -#define EFFECT_HAZE 25 -#define EFFECT_BIDE 26 -#define EFFECT_RAMPAGE 27 -#define EFFECT_ROAR 28 -#define EFFECT_MULTI_HIT 29 -#define EFFECT_CONVERSION 30 -#define EFFECT_FLINCH_HIT 31 -#define EFFECT_RESTORE_HP 32 -#define EFFECT_TOXIC 33 -#define EFFECT_PAY_DAY 34 -#define EFFECT_LIGHT_SCREEN 35 -#define EFFECT_TRI_ATTACK 36 -#define EFFECT_REST 37 -#define EFFECT_OHKO 38 -#define EFFECT_FUSION_COMBO 39 -#define EFFECT_SUPER_FANG 40 -#define EFFECT_DRAGON_RAGE 41 -#define EFFECT_TRAP 42 -#define EFFECT_HEAL_BLOCK 43 -#define EFFECT_DOUBLE_HIT 44 -#define EFFECT_RECOIL_IF_MISS 45 -#define EFFECT_MIST 46 -#define EFFECT_FOCUS_ENERGY 47 -#define EFFECT_RECOIL_25 48 -#define EFFECT_CONFUSE 49 -#define EFFECT_ATTACK_UP_2 50 -#define EFFECT_DEFENSE_UP_2 51 -#define EFFECT_SPEED_UP_2 52 -#define EFFECT_SPECIAL_ATTACK_UP_2 53 -#define EFFECT_SPECIAL_DEFENSE_UP_2 54 -#define EFFECT_ACCURACY_UP_2 55 -#define EFFECT_EVASION_UP_2 56 -#define EFFECT_TRANSFORM 57 -#define EFFECT_ATTACK_DOWN_2 58 -#define EFFECT_DEFENSE_DOWN_2 59 -#define EFFECT_SPEED_DOWN_2 60 -#define EFFECT_SPECIAL_ATTACK_DOWN_2 61 -#define EFFECT_SPECIAL_DEFENSE_DOWN_2 62 -#define EFFECT_ACCURACY_DOWN_2 63 -#define EFFECT_EVASION_DOWN_2 64 -#define EFFECT_REFLECT 65 -#define EFFECT_POISON 66 -#define EFFECT_PARALYZE 67 -#define EFFECT_ATTACK_DOWN_HIT 68 -#define EFFECT_DEFENSE_DOWN_HIT 69 -#define EFFECT_SPEED_DOWN_HIT 70 -#define EFFECT_SPECIAL_ATTACK_DOWN_HIT 71 -#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT 72 -#define EFFECT_ACCURACY_DOWN_HIT 73 -#define EFFECT_EVASION_DOWN_HIT 74 -#define EFFECT_TWO_TURNS_ATTACK 75 -#define EFFECT_CONFUSE_HIT 76 -#define EFFECT_TWINEEDLE 77 -#define EFFECT_VITAL_THROW 78 -#define EFFECT_SUBSTITUTE 79 -#define EFFECT_RECHARGE 80 -#define EFFECT_RAGE 81 -#define EFFECT_MIMIC 82 -#define EFFECT_METRONOME 83 -#define EFFECT_LEECH_SEED 84 -#define EFFECT_DO_NOTHING 85 -#define EFFECT_DISABLE 86 -#define EFFECT_LEVEL_DAMAGE 87 -#define EFFECT_PSYWAVE 88 -#define EFFECT_COUNTER 89 -#define EFFECT_ENCORE 90 -#define EFFECT_PAIN_SPLIT 91 -#define EFFECT_SNORE 92 -#define EFFECT_CONVERSION_2 93 -#define EFFECT_LOCK_ON 94 -#define EFFECT_SKETCH 95 -#define EFFECT_HAMMER_ARM 96 -#define EFFECT_SLEEP_TALK 97 -#define EFFECT_DESTINY_BOND 98 -#define EFFECT_FLAIL 99 -#define EFFECT_SPITE 100 -#define EFFECT_FALSE_SWIPE 101 -#define EFFECT_HEAL_BELL 102 -#define EFFECT_ALWAYS_CRIT 103 -#define EFFECT_TRIPLE_KICK 104 -#define EFFECT_THIEF 105 -#define EFFECT_MEAN_LOOK 106 -#define EFFECT_NIGHTMARE 107 -#define EFFECT_MINIMIZE 108 -#define EFFECT_CURSE 109 -#define EFFECT_HEALING_WISH 110 -#define EFFECT_PROTECT 111 -#define EFFECT_SPIKES 112 -#define EFFECT_FORESIGHT 113 -#define EFFECT_PERISH_SONG 114 -#define EFFECT_SANDSTORM 115 -#define EFFECT_ENDURE 116 -#define EFFECT_ROLLOUT 117 -#define EFFECT_SWAGGER 118 -#define EFFECT_FURY_CUTTER 119 -#define EFFECT_ATTRACT 120 -#define EFFECT_RETURN 121 -#define EFFECT_PRESENT 122 -#define EFFECT_FRUSTRATION 123 -#define EFFECT_SAFEGUARD 124 -#define EFFECT_UNUSED_125 125 -#define EFFECT_MAGNITUDE 126 -#define EFFECT_BATON_PASS 127 -#define EFFECT_PURSUIT 128 -#define EFFECT_RAPID_SPIN 129 -#define EFFECT_SONICBOOM 130 -#define EFFECT_CAPTIVATE 131 -#define EFFECT_MORNING_SUN 132 -#define EFFECT_SYNTHESIS 133 -#define EFFECT_MOONLIGHT 134 -#define EFFECT_HIDDEN_POWER 135 -#define EFFECT_RAIN_DANCE 136 -#define EFFECT_SUNNY_DAY 137 -#define EFFECT_DEFENSE_UP_HIT 138 -#define EFFECT_ATTACK_UP_HIT 139 -#define EFFECT_ALL_STATS_UP_HIT 140 -#define EFFECT_FELL_STINGER 141 -#define EFFECT_BELLY_DRUM 142 -#define EFFECT_PSYCH_UP 143 -#define EFFECT_MIRROR_COAT 144 -#define EFFECT_SKULL_BASH 145 -#define EFFECT_TWISTER 146 -#define EFFECT_EARTHQUAKE 147 -#define EFFECT_FUTURE_SIGHT 148 -#define EFFECT_GUST 149 -#define EFFECT_FLINCH_MINIMIZE_HIT 150 -#define EFFECT_SOLARBEAM 151 -#define EFFECT_THUNDER 152 -#define EFFECT_TELEPORT 153 -#define EFFECT_BEAT_UP 154 -#define EFFECT_SEMI_INVULNERABLE 155 -#define EFFECT_DEFENSE_CURL 156 -#define EFFECT_SOFTBOILED 157 -#define EFFECT_FAKE_OUT 158 -#define EFFECT_UPROAR 159 -#define EFFECT_STOCKPILE 160 -#define EFFECT_SPIT_UP 161 -#define EFFECT_SWALLOW 162 -#define EFFECT_WORRY_SEED 163 -#define EFFECT_HAIL 164 -#define EFFECT_TORMENT 165 -#define EFFECT_FLATTER 166 -#define EFFECT_WILL_O_WISP 167 -#define EFFECT_MEMENTO 168 -#define EFFECT_FACADE 169 -#define EFFECT_FOCUS_PUNCH 170 -#define EFFECT_SMELLINGSALT 171 -#define EFFECT_FOLLOW_ME 172 -#define EFFECT_NATURE_POWER 173 -#define EFFECT_CHARGE 174 -#define EFFECT_TAUNT 175 -#define EFFECT_HELPING_HAND 176 -#define EFFECT_TRICK 177 -#define EFFECT_ROLE_PLAY 178 -#define EFFECT_WISH 179 -#define EFFECT_ASSIST 180 -#define EFFECT_INGRAIN 181 -#define EFFECT_SUPERPOWER 182 -#define EFFECT_MAGIC_COAT 183 -#define EFFECT_RECYCLE 184 -#define EFFECT_REVENGE 185 -#define EFFECT_BRICK_BREAK 186 -#define EFFECT_YAWN 187 -#define EFFECT_KNOCK_OFF 188 -#define EFFECT_ENDEAVOR 189 -#define EFFECT_ERUPTION 190 -#define EFFECT_SKILL_SWAP 191 -#define EFFECT_IMPRISON 192 -#define EFFECT_REFRESH 193 -#define EFFECT_GRUDGE 194 -#define EFFECT_SNATCH 195 -#define EFFECT_LOW_KICK 196 -#define EFFECT_SECRET_POWER 197 -#define EFFECT_RECOIL_33 198 -#define EFFECT_TEETER_DANCE 199 -#define EFFECT_HIT_ESCAPE 200 -#define EFFECT_MUD_SPORT 201 -#define EFFECT_POISON_FANG 202 -#define EFFECT_WEATHER_BALL 203 -#define EFFECT_OVERHEAT 204 -#define EFFECT_TICKLE 205 -#define EFFECT_COSMIC_POWER 206 -#define EFFECT_SKY_UPPERCUT 207 -#define EFFECT_BULK_UP 208 -#define EFFECT_PLACEHOLDER 209 -#define EFFECT_WATER_SPORT 210 -#define EFFECT_CALM_MIND 211 -#define EFFECT_DRAGON_DANCE 212 -#define EFFECT_CAMOUFLAGE 213 +#define EFFECT_HIT 0 +#define EFFECT_SLEEP 1 +#define EFFECT_POISON_HIT 2 +#define EFFECT_ABSORB 3 +#define EFFECT_BURN_HIT 4 +#define EFFECT_FREEZE_HIT 5 +#define EFFECT_PARALYZE_HIT 6 +#define EFFECT_EXPLOSION 7 +#define EFFECT_DREAM_EATER 8 +#define EFFECT_MIRROR_MOVE 9 +#define EFFECT_ATTACK_UP 10 +#define EFFECT_DEFENSE_UP 11 +#define EFFECT_SPEED_UP 12 +#define EFFECT_SPECIAL_ATTACK_UP 13 +#define EFFECT_SPECIAL_DEFENSE_UP 14 +#define EFFECT_ACCURACY_UP 15 +#define EFFECT_EVASION_UP 16 +#define EFFECT_SPECIAL_ATTACK_UP_3 17 +#define EFFECT_ATTACK_DOWN 18 +#define EFFECT_DEFENSE_DOWN 19 +#define EFFECT_SPEED_DOWN 20 +#define EFFECT_SPECIAL_ATTACK_DOWN 21 +#define EFFECT_SPECIAL_DEFENSE_DOWN 22 +#define EFFECT_ACCURACY_DOWN 23 +#define EFFECT_EVASION_DOWN 24 +#define EFFECT_HAZE 25 +#define EFFECT_BIDE 26 +#define EFFECT_RAMPAGE 27 +#define EFFECT_ROAR 28 +#define EFFECT_MULTI_HIT 29 +#define EFFECT_CONVERSION 30 +#define EFFECT_FLINCH_HIT 31 +#define EFFECT_RESTORE_HP 32 +#define EFFECT_TOXIC 33 +#define EFFECT_PAY_DAY 34 +#define EFFECT_LIGHT_SCREEN 35 +#define EFFECT_TRI_ATTACK 36 +#define EFFECT_REST 37 +#define EFFECT_OHKO 38 +#define EFFECT_FUSION_COMBO 39 +#define EFFECT_SUPER_FANG 40 +#define EFFECT_DRAGON_RAGE 41 +#define EFFECT_TRAP 42 +#define EFFECT_HEAL_BLOCK 43 +#define EFFECT_RECOIL_IF_MISS 44 +#define EFFECT_MIST 45 +#define EFFECT_FOCUS_ENERGY 46 +#define EFFECT_RECOIL_25 47 +#define EFFECT_CONFUSE 48 +#define EFFECT_ATTACK_UP_2 49 +#define EFFECT_DEFENSE_UP_2 50 +#define EFFECT_SPEED_UP_2 51 +#define EFFECT_SPECIAL_ATTACK_UP_2 52 +#define EFFECT_SPECIAL_DEFENSE_UP_2 53 +#define EFFECT_ACCURACY_UP_2 54 +#define EFFECT_EVASION_UP_2 55 +#define EFFECT_TRANSFORM 56 +#define EFFECT_ATTACK_DOWN_2 57 +#define EFFECT_DEFENSE_DOWN_2 58 +#define EFFECT_SPEED_DOWN_2 59 +#define EFFECT_SPECIAL_ATTACK_DOWN_2 60 +#define EFFECT_SPECIAL_DEFENSE_DOWN_2 61 +#define EFFECT_ACCURACY_DOWN_2 62 +#define EFFECT_EVASION_DOWN_2 63 +#define EFFECT_REFLECT 64 +#define EFFECT_POISON 65 +#define EFFECT_PARALYZE 66 +#define EFFECT_ATTACK_DOWN_HIT 67 +#define EFFECT_DEFENSE_DOWN_HIT 68 +#define EFFECT_SPEED_DOWN_HIT 69 +#define EFFECT_SPECIAL_ATTACK_DOWN_HIT 70 +#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT 71 +#define EFFECT_ACCURACY_DOWN_HIT 72 +#define EFFECT_EVASION_DOWN_HIT 73 +#define EFFECT_TWO_TURNS_ATTACK 74 +#define EFFECT_CONFUSE_HIT 75 +#define EFFECT_VITAL_THROW 76 +#define EFFECT_SUBSTITUTE 77 +#define EFFECT_RECHARGE 78 +#define EFFECT_RAGE 79 +#define EFFECT_MIMIC 80 +#define EFFECT_METRONOME 81 +#define EFFECT_LEECH_SEED 82 +#define EFFECT_DO_NOTHING 83 +#define EFFECT_DISABLE 84 +#define EFFECT_LEVEL_DAMAGE 85 +#define EFFECT_PSYWAVE 86 +#define EFFECT_COUNTER 87 +#define EFFECT_ENCORE 88 +#define EFFECT_PAIN_SPLIT 89 +#define EFFECT_SNORE 90 +#define EFFECT_CONVERSION_2 91 +#define EFFECT_LOCK_ON 92 +#define EFFECT_SKETCH 93 +#define EFFECT_HAMMER_ARM 94 +#define EFFECT_SLEEP_TALK 95 +#define EFFECT_DESTINY_BOND 96 +#define EFFECT_FLAIL 97 +#define EFFECT_SPITE 98 +#define EFFECT_FALSE_SWIPE 99 +#define EFFECT_HEAL_BELL 100 +#define EFFECT_ALWAYS_CRIT 101 +#define EFFECT_TRIPLE_KICK 102 +#define EFFECT_THIEF 103 +#define EFFECT_MEAN_LOOK 104 +#define EFFECT_NIGHTMARE 105 +#define EFFECT_MINIMIZE 106 +#define EFFECT_CURSE 107 +#define EFFECT_HEALING_WISH 108 +#define EFFECT_PROTECT 109 +#define EFFECT_SPIKES 110 +#define EFFECT_FORESIGHT 111 +#define EFFECT_PERISH_SONG 112 +#define EFFECT_SANDSTORM 113 +#define EFFECT_ENDURE 114 +#define EFFECT_ROLLOUT 115 +#define EFFECT_SWAGGER 116 +#define EFFECT_FURY_CUTTER 117 +#define EFFECT_ATTRACT 118 +#define EFFECT_RETURN 119 +#define EFFECT_PRESENT 120 +#define EFFECT_FRUSTRATION 121 +#define EFFECT_SAFEGUARD 122 +#define EFFECT_UNUSED_125 123 +#define EFFECT_MAGNITUDE 124 +#define EFFECT_BATON_PASS 125 +#define EFFECT_PURSUIT 126 +#define EFFECT_RAPID_SPIN 127 +#define EFFECT_SONICBOOM 128 +#define EFFECT_CAPTIVATE 129 +#define EFFECT_MORNING_SUN 130 +#define EFFECT_SYNTHESIS 131 +#define EFFECT_MOONLIGHT 132 +#define EFFECT_HIDDEN_POWER 133 +#define EFFECT_RAIN_DANCE 134 +#define EFFECT_SUNNY_DAY 135 +#define EFFECT_DEFENSE_UP_HIT 136 +#define EFFECT_ATTACK_UP_HIT 137 +#define EFFECT_ALL_STATS_UP_HIT 138 +#define EFFECT_FELL_STINGER 139 +#define EFFECT_BELLY_DRUM 140 +#define EFFECT_PSYCH_UP 141 +#define EFFECT_MIRROR_COAT 142 +#define EFFECT_SKULL_BASH 143 +#define EFFECT_TWISTER 144 +#define EFFECT_EARTHQUAKE 145 +#define EFFECT_FUTURE_SIGHT 146 +#define EFFECT_GUST 147 +#define EFFECT_FLINCH_MINIMIZE_HIT 148 +#define EFFECT_SOLARBEAM 149 +#define EFFECT_THUNDER 150 +#define EFFECT_TELEPORT 151 +#define EFFECT_BEAT_UP 152 +#define EFFECT_SEMI_INVULNERABLE 153 +#define EFFECT_DEFENSE_CURL 154 +#define EFFECT_SOFTBOILED 155 +#define EFFECT_FAKE_OUT 156 +#define EFFECT_UPROAR 157 +#define EFFECT_STOCKPILE 158 +#define EFFECT_SPIT_UP 159 +#define EFFECT_SWALLOW 160 +#define EFFECT_WORRY_SEED 161 +#define EFFECT_HAIL 162 +#define EFFECT_TORMENT 163 +#define EFFECT_FLATTER 164 +#define EFFECT_WILL_O_WISP 165 +#define EFFECT_MEMENTO 166 +#define EFFECT_FACADE 167 +#define EFFECT_FOCUS_PUNCH 168 +#define EFFECT_SMELLINGSALT 169 +#define EFFECT_FOLLOW_ME 170 +#define EFFECT_NATURE_POWER 171 +#define EFFECT_CHARGE 172 +#define EFFECT_TAUNT 173 +#define EFFECT_HELPING_HAND 174 +#define EFFECT_TRICK 175 +#define EFFECT_ROLE_PLAY 176 +#define EFFECT_WISH 177 +#define EFFECT_ASSIST 178 +#define EFFECT_INGRAIN 179 +#define EFFECT_SUPERPOWER 180 +#define EFFECT_MAGIC_COAT 181 +#define EFFECT_RECYCLE 182 +#define EFFECT_REVENGE 183 +#define EFFECT_BRICK_BREAK 184 +#define EFFECT_YAWN 185 +#define EFFECT_KNOCK_OFF 186 +#define EFFECT_ENDEAVOR 187 +#define EFFECT_ERUPTION 188 +#define EFFECT_SKILL_SWAP 189 +#define EFFECT_IMPRISON 190 +#define EFFECT_REFRESH 191 +#define EFFECT_GRUDGE 192 +#define EFFECT_SNATCH 193 +#define EFFECT_LOW_KICK 194 +#define EFFECT_SECRET_POWER 195 +#define EFFECT_RECOIL_33 196 +#define EFFECT_TEETER_DANCE 197 +#define EFFECT_HIT_ESCAPE 198 +#define EFFECT_MUD_SPORT 199 +#define EFFECT_POISON_FANG 200 +#define EFFECT_WEATHER_BALL 201 +#define EFFECT_OVERHEAT 202 +#define EFFECT_TICKLE 203 +#define EFFECT_COSMIC_POWER 204 +#define EFFECT_SKY_UPPERCUT 205 +#define EFFECT_BULK_UP 206 +#define EFFECT_PLACEHOLDER 207 +#define EFFECT_WATER_SPORT 208 +#define EFFECT_CALM_MIND 209 +#define EFFECT_DRAGON_DANCE 210 +#define EFFECT_CAMOUFLAGE 211 + +// New move effects +#define EFFECT_PLEDGE 212 +#define EFFECT_FLING 213 +#define EFFECT_NATURAL_GIFT 214 +#define EFFECT_WAKE_UP_SLAP 215 +#define EFFECT_WRING_OUT 216 +#define EFFECT_HEX 217 +#define EFFECT_ASSURANCE 218 +#define EFFECT_TRUMP_CARD 219 +#define EFFECT_ACROBATICS 220 +#define EFFECT_HEAT_CRASH 221 +#define EFFECT_PUNISHMENT 222 +#define EFFECT_STORED_POWER 223 +#define EFFECT_ELECTRO_BALL 224 +#define EFFECT_GYRO_BALL 225 +#define EFFECT_ECHOED_VOICE 226 +#define EFFECT_PAYBACK 227 +#define EFFECT_ROUND 228 +#define EFFECT_BRINE 229 +#define EFFECT_VENOSHOCK 230 +#define EFFECT_RETALIATE 231 +#define EFFECT_BULLDOZE 232 +#define EFFECT_FOUL_PLAY 233 +#define EFFECT_PSYSHOCK 234 +#define EFFECT_ROOST 235 +#define EFFECT_GRAVITY 236 +#define EFFECT_MIRACLE_EYE 237 +#define EFFECT_TAILWIND 238 +#define EFFECT_EMBARGO 239 +#define EFFECT_AQUA_RING 240 +#define EFFECT_TRICK_ROOM 241 +#define EFFECT_WONDER_ROOM 242 +#define EFFECT_MAGIC_ROOM 243 +#define EFFECT_MAGNET_RISE 244 +#define EFFECT_TOXIC_SPIKES 245 +#define EFFECT_GASTRO_ACID 246 +#define EFFECT_STEALTH_ROCK 247 +#define EFFECT_TELEKINESIS 248 +#define EFFECT_POWER_SWAP 249 +#define EFFECT_GUARD_SWAP 250 +#define EFFECT_HEART_SWAP 251 +#define EFFECT_POWER_SPLIT 252 +#define EFFECT_GUARD_SPLIT 253 +#define EFFECT_STICKY_WEB 254 +#define EFFECT_METAL_BURST 255 +#define EFFECT_LUCKY_CHANT 256 +#define EFFECT_SUCKER_PUNCH 257 +#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 258 +#define EFFECT_SIMPLE_BEAM 259 +#define EFFECT_ENTRAINMENT 260 +#define EFFECT_HEAL_PULSE 261 +#define EFFECT_QUASH 262 +#define EFFECT_ION_DELUGE 263 +#define EFFECT_FREEZE_DRY 264 +#define EFFECT_TOPSY_TURVY 265 +#define EFFECT_MISTY_TERRAIN 266 +#define EFFECT_GRASSY_TERRAIN 267 +#define EFFECT_ELECTRIC_TERRAIN 268 +#define EFFECT_PSYCHIC_TERRAIN 269 +#define EFFECT_ATTACK_ACCURACY_UP 270 +#define EFFECT_ATTACK_SPATK_UP 271 +#define EFFECT_HURRICANE 272 +#define EFFECT_TWO_TYPED_MOVE 273 +#define EFFECT_ME_FIRST 274 +#define EFFECT_SPEED_UP_HIT 275 +#define EFFECT_QUIVER_DANCE 276 +#define EFFECT_COIL 277 +#define EFFECT_ELECTRIFY 278 +#define EFFECT_SCALD 279 +#define EFFECT_REFLECT_TYPE 280 +#define EFFECT_SOAK 281 +#define EFFECT_GROWTH 282 +#define EFFECT_CLOSE_COMBAT 283 +#define EFFECT_LAST_RESORT 284 +#define EFFECT_RECOIL_33_STATUS 285 +#define EFFECT_FLINCH_STATUS 286 +#define EFFECT_RECOIL_50 287 +#define EFFECT_SHELL_SMASH 288 +#define EFFECT_SHIFT_GEAR 289 +#define EFFECT_DEFENSE_UP_3 290 +#define EFFECT_NOBLE_ROAR 291 +#define EFFECT_VENOM_DRENCH 292 +#define EFFECT_TOXIC_THREAD 293 +#define EFFECT_CLEAR_SMOG 294 +#define EFFECT_HIT_SWITCH_TARGET 295 +#define EFFECT_FINAL_GAMBIT 296 +#define EFFECT_CHANGE_TYPE_ON_ITEM 297 +#define EFFECT_AUTOTOMIZE 298 +#define EFFECT_COPYCAT 299 +#define EFFECT_DEFOG 300 +#define EFFECT_HIT_ENEMY_HEAL_ALLY 301 +#define EFFECT_SMACK_DOWN 302 +#define EFFECT_SYNCHRONOISE 303 +#define EFFECT_PSYCHO_SHIFT 304 +#define EFFECT_POWER_TRICK 305 +#define EFFECT_FLAME_BURST 306 +#define EFFECT_AFTER_YOU 307 +#define EFFECT_BESTOW 308 +#define EFFECT_ROTOTILLER 309 +#define EFFECT_FLOWER_SHIELD 310 +#define EFFECT_HIT_PREVENT_ESCAPE 311 +#define EFFECT_SPEED_SWAP 312 +#define EFFECT_DEFENSE_UP2_HIT 313 +#define EFFECT_REVELATION_DANCE 314 +#define EFFECT_AURORA_VEIL 315 +#define EFFECT_THIRD_TYPE 316 +#define EFFECT_FEINT 317 +#define EFFECT_SPARKLING_ARIA 318 +#define EFFECT_ACUPRESSURE 319 +#define EFFECT_AROMATIC_MIST 320 +#define EFFECT_POWDER 321 +#define EFFECT_SP_ATTACK_UP_HIT 322 +#define EFFECT_BELCH 323 +#define EFFECT_PARTING_SHOT 324 +#define EFFECT_SPECTRAL_THIEF 325 +#define EFFECT_V_CREATE 326 +#define EFFECT_MAT_BLOCK 327 +#define EFFECT_STOMPING_TANTRUM 328 +#define EFFECT_CORE_ENFORCER 329 +#define EFFECT_INSTRUCT 330 +#define EFFECT_THROAT_CHOP 331 +#define EFFECT_LASER_FOCUS 332 +#define EFFECT_MAGNETIC_FLUX 333 +#define EFFECT_GEAR_UP 334 +#define EFFECT_INCINERATE 335 +#define EFFECT_BUG_BITE 336 +#define EFFECT_STRENGTH_SAP 337 +#define EFFECT_MIND_BLOWN 338 +#define EFFECT_PURIFY 339 +#define EFFECT_BURN_UP 340 +#define EFFECT_SHORE_UP 341 +#define EFFECT_GEOMANCY 342 +#define EFFECT_FAIRY_LOCK 343 +#define EFFECT_ALLY_SWITCH 344 +#define EFFECT_RELIC_SONG 345 +#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 346 +#define EFFECT_BODY_PRESS 347 +#define EFFECT_EERIE_SPELL 348 +#define EFFECT_JUNGLE_HEALING 349 +#define EFFECT_COACHING 350 +#define EFFECT_LASH_OUT 351 +#define EFFECT_GRASSY_GLIDE 352 +#define EFFECT_REMOVE_TERRAIN 353 +#define EFFECT_DYNAMAX_DOUBLE_DMG 354 +#define EFFECT_DECORATE 355 +#define EFFECT_SNIPE_SHOT 356 +#define EFFECT_RECOIL_HP_25 357 +#define EFFECT_STUFF_CHEEKS 358 +#define EFFECT_GRAV_APPLE 359 +#define EFFECT_EVASION_UP_HIT 360 +#define EFFECT_GLITZY_GLOW 361 +#define EFFECT_BADDY_BAD 362 +#define EFFECT_SAPPY_SEED 363 +#define EFFECT_FREEZY_FROST 364 +#define EFFECT_SPARKLY_SWIRL 365 +#define EFFECT_PLASMA_FISTS 366 +#define EFFECT_HYPERSPACE_FURY 367 +#define EFFECT_AURA_WHEEL 368 +#define EFFECT_PHOTON_GEYSER 369 +#define EFFECT_SHELL_SIDE_ARM 370 -// New move effects -#define EFFECT_PLEDGE 214 -#define EFFECT_FLING 215 -#define EFFECT_NATURAL_GIFT 216 -#define EFFECT_WAKE_UP_SLAP 217 -#define EFFECT_WRING_OUT 218 -#define EFFECT_HEX 219 -#define EFFECT_ASSURANCE 220 -#define EFFECT_TRUMP_CARD 221 -#define EFFECT_ACROBATICS 222 -#define EFFECT_HEAT_CRASH 223 -#define EFFECT_PUNISHMENT 224 -#define EFFECT_STORED_POWER 225 -#define EFFECT_ELECTRO_BALL 226 -#define EFFECT_GYRO_BALL 227 -#define EFFECT_ECHOED_VOICE 228 -#define EFFECT_PAYBACK 229 -#define EFFECT_ROUND 230 -#define EFFECT_BRINE 231 -#define EFFECT_VENOSHOCK 232 -#define EFFECT_RETALIATE 233 -#define EFFECT_BULLDOZE 234 -#define EFFECT_FOUL_PLAY 235 -#define EFFECT_PSYSHOCK 236 -#define EFFECT_ROOST 237 -#define EFFECT_GRAVITY 238 -#define EFFECT_MIRACLE_EYE 239 -#define EFFECT_TAILWIND 240 -#define EFFECT_EMBARGO 241 -#define EFFECT_AQUA_RING 242 -#define EFFECT_TRICK_ROOM 243 -#define EFFECT_WONDER_ROOM 244 -#define EFFECT_MAGIC_ROOM 245 -#define EFFECT_MAGNET_RISE 246 -#define EFFECT_TOXIC_SPIKES 247 -#define EFFECT_GASTRO_ACID 248 -#define EFFECT_STEALTH_ROCK 249 -#define EFFECT_TELEKINESIS 250 -#define EFFECT_POWER_SWAP 251 -#define EFFECT_GUARD_SWAP 252 -#define EFFECT_HEART_SWAP 253 -#define EFFECT_POWER_SPLIT 254 -#define EFFECT_GUARD_SPLIT 255 -#define EFFECT_STICKY_WEB 256 -#define EFFECT_METAL_BURST 257 -#define EFFECT_LUCKY_CHANT 258 -#define EFFECT_SUCKER_PUNCH 259 -#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 260 -#define EFFECT_SIMPLE_BEAM 261 -#define EFFECT_ENTRAINMENT 262 -#define EFFECT_HEAL_PULSE 263 -#define EFFECT_QUASH 264 -#define EFFECT_ION_DELUGE 265 -#define EFFECT_FREEZE_DRY 266 -#define EFFECT_TOPSY_TURVY 267 -#define EFFECT_MISTY_TERRAIN 268 -#define EFFECT_GRASSY_TERRAIN 269 -#define EFFECT_ELECTRIC_TERRAIN 270 -#define EFFECT_PSYCHIC_TERRAIN 271 -#define EFFECT_ATTACK_ACCURACY_UP 272 -#define EFFECT_ATTACK_SPATK_UP 273 -#define EFFECT_HURRICANE 274 -#define EFFECT_TWO_TYPED_MOVE 275 -#define EFFECT_ME_FIRST 276 -#define EFFECT_SPEED_UP_HIT 277 -#define EFFECT_QUIVER_DANCE 278 -#define EFFECT_COIL 279 -#define EFFECT_ELECTRIFY 280 -#define EFFECT_SCALD 281 -#define EFFECT_REFLECT_TYPE 282 -#define EFFECT_SOAK 283 -#define EFFECT_GROWTH 284 -#define EFFECT_CLOSE_COMBAT 285 -#define EFFECT_LAST_RESORT 286 -#define EFFECT_RECOIL_33_STATUS 287 -#define EFFECT_FLINCH_STATUS 288 -#define EFFECT_RECOIL_50 289 -#define EFFECT_SHELL_SMASH 290 -#define EFFECT_SHIFT_GEAR 291 -#define EFFECT_DEFENSE_UP_3 292 -#define EFFECT_NOBLE_ROAR 293 -#define EFFECT_VENOM_DRENCH 294 -#define EFFECT_TOXIC_THREAD 295 -#define EFFECT_CLEAR_SMOG 296 -#define EFFECT_HIT_SWITCH_TARGET 297 -#define EFFECT_FINAL_GAMBIT 298 -#define EFFECT_CHANGE_TYPE_ON_ITEM 299 -#define EFFECT_AUTOTOMIZE 300 -#define EFFECT_COPYCAT 301 -#define EFFECT_DEFOG 302 -#define EFFECT_HIT_ENEMY_HEAL_ALLY 303 -#define EFFECT_SMACK_DOWN 304 -#define EFFECT_SYNCHRONOISE 305 -#define EFFECT_PSYCHO_SHIFT 306 -#define EFFECT_POWER_TRICK 307 -#define EFFECT_FLAME_BURST 308 -#define EFFECT_AFTER_YOU 309 -#define EFFECT_BESTOW 310 -#define EFFECT_ROTOTILLER 311 -#define EFFECT_FLOWER_SHIELD 312 -#define EFFECT_HIT_PREVENT_ESCAPE 313 -#define EFFECT_SPEED_SWAP 314 -#define EFFECT_DEFENSE_UP2_HIT 315 -#define EFFECT_REVELATION_DANCE 316 -#define EFFECT_AURORA_VEIL 317 -#define EFFECT_THIRD_TYPE 318 -#define EFFECT_FEINT 319 -#define EFFECT_SPARKLING_ARIA 320 -#define EFFECT_ACUPRESSURE 321 -#define EFFECT_AROMATIC_MIST 322 -#define EFFECT_POWDER 323 -#define EFFECT_SP_ATTACK_UP_HIT 324 -#define EFFECT_BELCH 325 -#define EFFECT_PARTING_SHOT 326 -#define EFFECT_SPECTRAL_THIEF 327 -#define EFFECT_V_CREATE 328 -#define EFFECT_MAT_BLOCK 329 -#define EFFECT_STOMPING_TANTRUM 330 -#define EFFECT_CORE_ENFORCER 331 -#define EFFECT_INSTRUCT 332 -#define EFFECT_THROAT_CHOP 333 -#define EFFECT_LASER_FOCUS 334 -#define EFFECT_MAGNETIC_FLUX 335 -#define EFFECT_GEAR_UP 336 -#define EFFECT_INCINERATE 337 -#define EFFECT_BUG_BITE 338 -#define EFFECT_STRENGTH_SAP 339 -#define EFFECT_MIND_BLOWN 340 -#define EFFECT_PURIFY 341 -#define EFFECT_BURN_UP 342 -#define EFFECT_SHORE_UP 343 -#define EFFECT_GEOMANCY 344 -#define EFFECT_FAIRY_LOCK 345 -#define EFFECT_ALLY_SWITCH 346 -#define EFFECT_RELIC_SONG 347 -#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 348 -#define EFFECT_BODY_PRESS 349 -#define EFFECT_EERIE_SPELL 350 -#define EFFECT_JUNGLE_HEALING 351 -#define EFFECT_COACHING 352 -#define EFFECT_LASH_OUT 353 -#define EFFECT_GRASSY_GLIDE 354 -#define EFFECT_REMOVE_TERRAIN 355 -#define EFFECT_DYNAMAX_DOUBLE_DMG 356 -#define EFFECT_DECORATE 357 -#define EFFECT_SNIPE_SHOT 358 -#define EFFECT_TRIPLE_HIT 359 -#define EFFECT_RECOIL_HP_25 360 -#define EFFECT_STUFF_CHEEKS 361 -#define EFFECT_GRAV_APPLE 362 -#define EFFECT_EVASION_UP_HIT 363 -#define EFFECT_DOUBLE_IRON_BASH 364 -#define EFFECT_GLITZY_GLOW 365 -#define EFFECT_BADDY_BAD 366 -#define EFFECT_SAPPY_SEED 367 -#define EFFECT_FREEZY_FROST 368 -#define EFFECT_SPARKLY_SWIRL 369 -#define EFFECT_PLASMA_FISTS 370 -#define EFFECT_HYPERSPACE_FURY 371 -#define EFFECT_AURA_WHEEL 372 -#define EFFECT_PHOTON_GEYSER 373 -#define EFFECT_SHELL_SIDE_ARM 374 - -#define NUM_BATTLE_MOVE_EFFECTS 375 +#define NUM_BATTLE_MOVE_EFFECTS 371 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H \ No newline at end of file From e407883b58b0ec3fa0d33ff915f77ead4f997b0a Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 7 Nov 2021 20:31:09 +1300 Subject: [PATCH 14/32] Rethink final strike effects This is now checked in SetMoveEffect instead of in each move that should behave this way. Some effects will need to be redone to make them play nice with this change, but some just work as is. --- data/battle_scripts_1.s | 7 +++-- include/constants/battle.h | 2 +- src/battle_script_commands.c | 53 ++++++++++++++++++++++++++++-------- 3 files changed, 47 insertions(+), 15 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index bf396ca20..a11510689 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -813,11 +813,9 @@ BattleScript_EffectBurnUp: attackstring ppreduce jumpiftype BS_ATTACKER, TYPE_FIRE, BattleScript_BurnUpWorks - goto BattleScript_MoveEnd + goto BattleScript_ButItFailed BattleScript_BurnUpWorks: accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - setmoveeffect MOVE_EFFECT_BURN_UP - seteffectwithchance critcalc damagecalc adjustdamage @@ -832,6 +830,9 @@ BattleScript_BurnUpWorks: waitmessage B_WAIT_TIME_LONG resultmessage waitmessage B_WAIT_TIME_LONG + losetype BS_ATTACKER, TYPE_FIRE + printstring STRINGID_ATTACKERLOSTFIRETYPE + waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET, FALSE, NULL goto BattleScript_MoveEnd diff --git a/include/constants/battle.h b/include/constants/battle.h index 0a2cfc49c..6b8698720 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -358,7 +358,7 @@ #define MOVE_EFFECT_BUG_BITE 0x45 #define MOVE_EFFECT_RECOIL_HP_25 0x46 #define MOVE_EFFECT_RELIC_SONG 0x47 -#define MOVE_EFFECT_BURN_UP 0x48 + #define NUM_MOVE_EFFECTS 0x48 #define MOVE_EFFECT_AFFECTS_USER 0x4000 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index cf9fcb93e..a4a3f39e0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -301,6 +301,7 @@ static bool8 sub_804F344(void); static void PutMonIconOnLvlUpBox(void); static void PutLevelAndGenderOnLvlUpBox(void); static bool32 CriticalCapture(u32 odds); +static bool8 IsFinalStrikeEffect(u16 move); static void SpriteCB_MonIconOnLvlUpBox(struct Sprite* sprite); @@ -1134,6 +1135,24 @@ static const u16 sMoveEffectsForbiddenToInstruct[] = FORBIDDEN_INSTRUCT_END }; +static const u16 sFinalStrikeOnlyEffects[] = +{ + EFFECT_RELIC_SONG, + EFFECT_BUG_BITE, + EFFECT_THIEF, + EFFECT_BURN_UP, + EFFECT_PAY_DAY, + EFFECT_SECRET_POWER, + EFFECT_HIT_SWITCH_TARGET, + EFFECT_SMACK_DOWN, + EFFECT_SPARKLING_ARIA, + EFFECT_SMELLINGSALT, + EFFECT_WAKE_UP_SLAP, + EFFECT_HIT_ESCAPE, + EFFECT_RECOIL_HP_25, + EFFECT_HIT_PREVENT_ESCAPE, +}; + static const u16 sNaturePowerMoves[] = { [BATTLE_TERRAIN_GRASS] = MOVE_ENERGY_BALL, @@ -2656,13 +2675,20 @@ void SetMoveEffect(bool32 primary, u32 certain) bool32 statusChanged = FALSE; bool32 mirrorArmorReflected = (GetBattlerAbility(gBattlerTarget) == ABILITY_MIRROR_ARMOR); u32 flags = 0; - + + if (gSpecialStatuses[gBattlerAttacker].parentalBondOn == 2 + && gBattleMons[gBattlerTarget].hp != 0 + && IsFinalStrikeEffect(gCurrentMove)) + { + gBattlescriptCurrInstr++; + return; + } + switch (gBattleScripting.moveEffect) // Set move effects which happen later on { case MOVE_EFFECT_KNOCK_OFF: case MOVE_EFFECT_SMACK_DOWN: case MOVE_EFFECT_REMOVE_STATUS: - case MOVE_EFFECT_BURN_UP: gBattleStruct->moveEffect2 = gBattleScripting.moveEffect; gBattlescriptCurrInstr++; return; @@ -3160,8 +3186,6 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattlescriptCurrInstr++; break; case MOVE_EFFECT_STEAL_ITEM: - // Only steal items on the final strike of Parental Bond - if (!(gSpecialStatuses[gBattlerAttacker].parentalBondOn == 2 && gBattleMons[gBattlerTarget].hp != 0)) { if (!CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item)) { @@ -3385,8 +3409,7 @@ void SetMoveEffect(bool32 primary, u32 certain) break; case MOVE_EFFECT_BUG_BITE: if (ItemId_GetPocket(gBattleMons[gEffectBattler].item) == POCKET_BERRIES - && GetBattlerAbility(gEffectBattler) != ABILITY_STICKY_HOLD - && !(gSpecialStatuses[gBattlerAttacker].parentalBondOn == 2 && gBattleMons[gBattlerTarget].hp != 0)) // Steal berry on final hit + && GetBattlerAbility(gEffectBattler) != ABILITY_STICKY_HOLD) { // target loses their berry gLastUsedItem = gBattleMons[gEffectBattler].item; @@ -5089,11 +5112,6 @@ static void Cmd_moveend(void) } } break; // MOVE_EFFECT_REMOVE_STATUS - case MOVE_EFFECT_BURN_UP: - effect = TRUE; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_BurnUpRemoveType; - break; } gBattleStruct->moveEffect2 = 0; gBattleScripting.moveendState++; @@ -13582,3 +13600,16 @@ bool8 IsMoveAffectedByParentalBond(u16 move, u8 battlerId) return FALSE; } + +static bool8 IsFinalStrikeEffect(u16 move) +{ + u32 i; + u16 moveEffect = gBattleMoves[move].effect; + + for (i = 0; i < ARRAY_COUNT(sFinalStrikeOnlyEffects); i++) + { + if (moveEffect == sFinalStrikeOnlyEffects[i]) + return TRUE; + } + return FALSE; +} From 6232b046b1f0e140880f99cfcb993381533b594a Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 13 Nov 2021 12:40:45 +1300 Subject: [PATCH 15/32] Fix Burn Up Now works properly with and without Parental Bond. It wasn't broken before, but its interaction with Parental Bond was. --- data/battle_scripts_1.s | 23 +++-------------------- include/constants/battle.h | 3 ++- src/battle_script_commands.c | 5 +++++ 3 files changed, 10 insertions(+), 21 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a11510689..0353c9133 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -814,27 +814,10 @@ BattleScript_EffectBurnUp: ppreduce jumpiftype BS_ATTACKER, TYPE_FIRE, BattleScript_BurnUpWorks goto BattleScript_ButItFailed + BattleScript_BurnUpWorks: - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - losetype BS_ATTACKER, TYPE_FIRE - printstring STRINGID_ATTACKERLOSTFIRETYPE - waitmessage B_WAIT_TIME_LONG - tryfaintmon BS_TARGET, FALSE, NULL - goto BattleScript_MoveEnd + setmoveeffect MOVE_EFFECT_BURN_UP | MOVE_EFFECT_CERTAIN + goto BattleScript_EffectHit BattleScript_BurnUpRemoveType:: losetype BS_ATTACKER, TYPE_FIRE diff --git a/include/constants/battle.h b/include/constants/battle.h index 6b8698720..5a95d1853 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -358,8 +358,9 @@ #define MOVE_EFFECT_BUG_BITE 0x45 #define MOVE_EFFECT_RECOIL_HP_25 0x46 #define MOVE_EFFECT_RELIC_SONG 0x47 +#define MOVE_EFFECT_BURN_UP 0x48 -#define NUM_MOVE_EFFECTS 0x48 +#define NUM_MOVE_EFFECTS 0x49 #define MOVE_EFFECT_AFFECTS_USER 0x4000 #define MOVE_EFFECT_CERTAIN 0x8000 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a4a3f39e0..f8548f522 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3443,6 +3443,11 @@ void SetMoveEffect(bool32 primary, u32 certain) } } break; + case MOVE_EFFECT_BURN_UP: + // This seems unnecessary but is done to make it work properly with Parental Bond + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_BurnUpRemoveType; + break; } } } From d0336a9edf7c53db15fab0341ea62d4c30670210 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 13 Nov 2021 14:01:36 +1300 Subject: [PATCH 16/32] Fix Payday Only scatters coins on the first hit of Parental Bond. --- src/battle_script_commands.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f8548f522..dad910d5e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1141,7 +1141,6 @@ static const u16 sFinalStrikeOnlyEffects[] = EFFECT_BUG_BITE, EFFECT_THIEF, EFFECT_BURN_UP, - EFFECT_PAY_DAY, EFFECT_SECRET_POWER, EFFECT_HIT_SWITCH_TARGET, EFFECT_SMACK_DOWN, @@ -3019,15 +3018,21 @@ void SetMoveEffect(bool32 primary, u32 certain) } break; case MOVE_EFFECT_PAYDAY: - if (GET_BATTLER_SIDE(gBattlerAttacker) == B_SIDE_PLAYER) + // Don't scatter coins on the second hit of Parental Bond + if (GET_BATTLER_SIDE(gBattlerAttacker) == B_SIDE_PLAYER && gSpecialStatuses[gBattlerAttacker].parentalBondOn != 1) { u16 PayDay = gPaydayMoney; gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 5); if (PayDay > gPaydayMoney) gPaydayMoney = 0xFFFF; + + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectPayDay; + } + else + { + gBattlescriptCurrInstr++; } - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; break; case MOVE_EFFECT_HAPPY_HOUR: if (GET_BATTLER_SIDE(gBattlerAttacker) == B_SIDE_PLAYER && !gBattleStruct->moneyMultiplierMove) From 2bf72fc51eb526319353d046c6bbef871c615f72 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 13 Nov 2021 15:29:24 +1300 Subject: [PATCH 17/32] Double Struggle damage for PB Not sure if this should hit twice. If not, this works. --- src/battle_script_commands.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index dad910d5e..789c95bb0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1142,7 +1142,6 @@ static const u16 sFinalStrikeOnlyEffects[] = EFFECT_THIEF, EFFECT_BURN_UP, EFFECT_SECRET_POWER, - EFFECT_HIT_SWITCH_TARGET, EFFECT_SMACK_DOWN, EFFECT_SPARKLING_ARIA, EFFECT_SMELLINGSALT, @@ -3274,6 +3273,8 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattleMoveDamage = (gBattleMons[gEffectBattler].maxHP) / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; + if (GetBattlerAbility(gEffectBattler) == ABILITY_PARENTAL_BOND) + gBattleMoveDamage *= 2; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; From 55b279ba0ab302be4fd0e61e7afeca6336d38af7 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 13 Nov 2021 16:29:12 +1300 Subject: [PATCH 18/32] Fix several move effects Dragon Tail, Natural Gift, Spit Up all hit twice now. Could maybe use isparentalbondlaststrike instead of some of the other checks too. --- asm/macros/battle_script.inc | 5 +++++ data/battle_scripts_1.s | 4 ++++ include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 17 +++++++++++++---- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index df4a860dd..a5ac603ed 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1891,6 +1891,11 @@ various BS_ATTACKER, VARIOUS_SHELL_SIDE_ARM_CHECK .endm + .macro isparentalbondlaststrike ptr:req + various BS_ATTACKER, VARIOUS_IS_PARENTAL_BOND_LAST_STRIKE + .4byte \ptr + .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 0353c9133..3677bc535 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1534,6 +1534,7 @@ BattleScript_EffectHitSwitchTarget: resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET, FALSE, NULL + isparentalbondlaststrike BattleScript_EffectHitSwitchTargetMoveEnd jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted tryhitswitchtarget BattleScript_EffectHitSwitchTargetMoveEnd @@ -2536,6 +2537,7 @@ BattleScript_EffectNaturalGift: waitmessage B_WAIT_TIME_LONG seteffectwithchance jumpifmovehadnoeffect BattleScript_EffectNaturalGiftEnd + isparentalbondlaststrike BattleScript_EffectNaturalGiftEnd removeitem BS_ATTACKER BattleScript_EffectNaturalGiftEnd: tryfaintmon BS_TARGET, FALSE, NULL @@ -4817,9 +4819,11 @@ BattleScript_EffectSpitUp:: stockpiletobasedamage BattleScript_SpitUpFail goto BattleScript_HitFromAtkAnimation BattleScript_SpitUpFail:: + isparentalbondlaststrike BattleScript_SpitUpEnd pause B_WAIT_TIME_SHORT printstring STRINGID_FAILEDTOSPITUP waitmessage B_WAIT_TIME_LONG +BattleScript_SpitUpEnd: goto BattleScript_MoveEnd BattleScript_SpitUpFailProtect:: diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 82a28f86a..b3fa659c2 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -201,6 +201,7 @@ #define VARIOUS_TRY_TO_APPLY_MIMICRY 128 #define VARIOUS_PHOTON_GEYSER_CHECK 129 #define VARIOUS_SHELL_SIDE_ARM_CHECK 130 +#define VARIOUS_IS_PARENTAL_BOND_LAST_STRIKE 131 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 789c95bb0..d3cafecca 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9275,6 +9275,12 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; return; } + case VARIOUS_IS_PARENTAL_BOND_LAST_STRIKE: + if (gSpecialStatuses[gBattlerAttacker].parentalBondOn == 2 && gBattleMons[gBattlerTarget].hp != 0) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; } gBattlescriptCurrInstr += 3; @@ -9743,10 +9749,13 @@ static void Cmd_stockpiletobasedamage(void) if (gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; - gDisableStructs[gBattlerAttacker].stockpileCounter = 0; - // Restore stat changes from stockpile. - gBattleMons[gBattlerAttacker].statStages[STAT_DEF] -= gDisableStructs[gBattlerAttacker].stockpileDef; - gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF] -= gDisableStructs[gBattlerAttacker].stockpileSpDef; + if (!(gSpecialStatuses[gBattlerAttacker].parentalBondOn == 2 && gBattleMons[gBattlerTarget].hp != 0)) + { + gDisableStructs[gBattlerAttacker].stockpileCounter = 0; + // Restore stat changes from stockpile. + gBattleMons[gBattlerAttacker].statStages[STAT_DEF] -= gDisableStructs[gBattlerAttacker].stockpileDef; + gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF] -= gDisableStructs[gBattlerAttacker].stockpileSpDef; + } gBattlescriptCurrInstr += 5; } } From 02b3a1da8679c5d71e3ba2669e5e8bf62f49079b Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 13 Nov 2021 17:13:03 +1300 Subject: [PATCH 19/32] Fix infinite Bide loop Bide no longer gets stuck in a loop, but also doesn't strike twice. --- src/battle_script_commands.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d3cafecca..243661622 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -13598,7 +13598,9 @@ static bool32 CriticalCapture(u32 odds) bool8 IsMoveAffectedByParentalBond(u16 move, u8 battlerId) { - if (gBattleMoves[move].split != SPLIT_STATUS && !(sForbiddenMoves[move] & FORBIDDEN_PARENTAL_BOND)) + if (gBattleMoves[move].split != SPLIT_STATUS + && !(sForbiddenMoves[move] & FORBIDDEN_PARENTAL_BOND) + && gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { From 3e1934ebe3dac459443893e1bb329825f28714cd Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 7 May 2022 14:20:37 +1200 Subject: [PATCH 20/32] Rework VARIOUS_IS_PARENTAL_BOND_LAST_STRIKE Make this more versatile by allowing it to check parentalBondOn instead of only checking if parentalBondOn == 2. Also, fix Dragon Tail/Circle Throw switching the target on the first hit. --- asm/macros/battle_script.inc | 5 +++-- data/battle_scripts_1.s | 12 ++++++------ include/constants/battle_script_commands.h | 2 +- src/battle_script_commands.c | 16 ++++++++++------ 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 4fa360db0..a45b9967b 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1976,8 +1976,9 @@ various BS_ATTACKER, VARIOUS_SWAP_SIDE_STATUSES .endm - .macro isparentalbondlaststrike ptr:req - various BS_ATTACKER, VARIOUS_IS_PARENTAL_BOND_LAST_STRIKE + .macro checkparentalbondcounter counter:req, ptr:req + various BS_ATTACKER, VARIOUS_CHECK_PARENTAL_BOND_COUNTER + .byte \counter .4byte \ptr .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 95a279f28..52eaf89f1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -306,7 +306,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectCloseCombat @ EFFECT_CLOSE_COMBAT .4byte BattleScript_EffectLastResort @ EFFECT_LAST_RESORT .4byte BattleScript_EffectHit @ EFFECT_RECOIL_33_STATUS - .4byte BattleScript_EffectFlinchWithStatus @ EFFECT_FLINCH_STATUS + .4byte BattleScript_EffectFlinchStatus @ EFFECT_FLINCH_STATUS .4byte BattleScript_EffectHit @ EFFECT_RECOIL_50 .4byte BattleScript_EffectShellSmash @ EFFECT_SHELL_SMASH .4byte BattleScript_EffectShiftGear @ EFFECT_SHIFT_GEAR @@ -1907,7 +1907,7 @@ BattleScript_EffectHitSwitchTarget: resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET - isparentalbondlaststrike BattleScript_EffectHitSwitchTargetMoveEnd + checkparentalbondcounter 2, BattleScript_EffectHitSwitchTargetMoveEnd moveendcase MOVEEND_MAGICIAN @ possibly others? jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted @@ -2913,7 +2913,7 @@ BattleScript_EffectNaturalGift: waitmessage B_WAIT_TIME_LONG seteffectwithchance jumpifmovehadnoeffect BattleScript_EffectNaturalGiftEnd - isparentalbondlaststrike BattleScript_EffectNaturalGiftEnd + checkparentalbondcounter 2, BattleScript_EffectNaturalGiftEnd removeitem BS_ATTACKER BattleScript_EffectNaturalGiftEnd: tryfaintmon BS_TARGET @@ -4380,11 +4380,11 @@ BattleScript_EffectTripleKick:: attackstring ppreduce jumpifmove MOVE_TRIPLE_AXEL BS_TripleAxel - addbyte sTRIPLE_KICK_POWER 10 @ triple kick gets +10 power + addbyte sTRIPLE_KICK_POWER, 10 @ triple kick gets +10 power goto BattleScript_HitFromAtkString BS_TripleAxel: - addbyte sTRIPLE_KICK_POWER 20 @ triple axel gets +20 power + addbyte sTRIPLE_KICK_POWER, 20 @ triple axel gets +20 power goto BattleScript_HitFromAtkString BattleScript_EffectThief:: @@ -5193,7 +5193,7 @@ BattleScript_EffectSpitUp:: stockpiletobasedamage BattleScript_SpitUpFail goto BattleScript_HitFromAtkAnimation BattleScript_SpitUpFail:: - isparentalbondlaststrike BattleScript_SpitUpEnd + checkparentalbondcounter 2, BattleScript_SpitUpEnd pause B_WAIT_TIME_SHORT printstring STRINGID_FAILEDTOSPITUP waitmessage B_WAIT_TIME_LONG diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 35966c13f..78c36a662 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -241,7 +241,7 @@ #define VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM 150 #define VARIOUS_SET_BEAK_BLAST 151 #define VARIOUS_SWAP_SIDE_STATUSES 152 -#define VARIOUS_IS_PARENTAL_BOND_LAST_STRIKE 153 +#define VARIOUS_CHECK_PARENTAL_BOND_COUNTER 153 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index cc19a9da6..7f2ba2b89 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9727,12 +9727,17 @@ static void Cmd_various(void) case VARIOUS_SWAP_SIDE_STATUSES: CourtChangeSwapSideStatuses(); break; - case VARIOUS_IS_PARENTAL_BOND_LAST_STRIKE: - if (gSpecialStatuses[gBattlerAttacker].parentalBondOn == 2 && gBattleMons[gBattlerTarget].hp != 0) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + case VARIOUS_CHECK_PARENTAL_BOND_COUNTER: + { + // Some effects should only happen on the first or second strike of Parental Bond, + // so a way to check this in battle scripts is useful + u8 counter = T1_READ_8(gBattlescriptCurrInstr + 3); + if (gSpecialStatuses[gBattlerAttacker].parentalBondOn == counter && gBattleMons[gBattlerTarget].hp != 0) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 4); else - gBattlescriptCurrInstr += 7; + gBattlescriptCurrInstr += 8; return; + } } // End of switch (gBattlescriptCurrInstr[2]) gBattlescriptCurrInstr += 3; @@ -14468,8 +14473,7 @@ static bool32 CriticalCapture(u32 odds) bool8 IsMoveAffectedByParentalBond(u16 move, u8 battlerId) { if (gBattleMoves[move].split != SPLIT_STATUS - && !(sForbiddenMoves[move] & FORBIDDEN_PARENTAL_BOND) - && gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) + && !(sForbiddenMoves[move] & FORBIDDEN_PARENTAL_BOND)) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { From 57003c62fdd2a77fc1e006bf0a187fe4b6dbfb08 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 7 May 2022 14:20:56 +1200 Subject: [PATCH 21/32] EFFECT_SOLAR_BEAM Fix definition. --- include/constants/battle_move_effects.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 31b9b4cbb..c24fd02f7 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -150,7 +150,7 @@ #define EFFECT_FUTURE_SIGHT 146 #define EFFECT_GUST 147 #define EFFECT_FLINCH_MINIMIZE_HIT 148 -#define EFFECT_SOLARBEAM 149 +#define EFFECT_SOLAR_BEAM 149 #define EFFECT_THUNDER 150 #define EFFECT_TELEPORT 151 #define EFFECT_BEAT_UP 152 From 3e645b1839f22c64754fcad9872ae44b6e15e58a Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 7 May 2022 14:37:02 +1200 Subject: [PATCH 22/32] IsMoveAffectedByParentalBond supports dynamic move targeting Update IsMoveAffectedByParentalBond to properly handle Expanding Force. --- src/battle_script_commands.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7f2ba2b89..5fd946407 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -14477,7 +14477,7 @@ bool8 IsMoveAffectedByParentalBond(u16 move, u8 battlerId) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - switch (gBattleMoves[move].target) + switch (GetBattlerMoveTargetType(battlerId, move)) { case MOVE_TARGET_BOTH: if (CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) >= 2) // Check for single target @@ -14487,12 +14487,12 @@ bool8 IsMoveAffectedByParentalBond(u16 move, u8 battlerId) if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) >= 2) // Count mons on both sides; ignore attacker return FALSE; break; + default: + break; } } - return TRUE; } - return FALSE; } From bd00df400ad0c7882d4c217a7fb555313e2c4e9a Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 22 May 2022 11:51:20 +1200 Subject: [PATCH 23/32] Fix indentation in IsMoveAffectedByParentalBond --- src/battle_script_commands.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e1f02c768..75a27c9de 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -14479,16 +14479,16 @@ bool8 IsMoveAffectedByParentalBond(u16 move, u8 battlerId) { switch (GetBattlerMoveTargetType(battlerId, move)) { - case MOVE_TARGET_BOTH: - if (CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) >= 2) // Check for single target - return FALSE; - break; - case MOVE_TARGET_FOES_AND_ALLY: - if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) >= 2) // Count mons on both sides; ignore attacker - return FALSE; - break; - default: + case MOVE_TARGET_BOTH: + if (CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) >= 2) // Check for single target + return FALSE; break; + case MOVE_TARGET_FOES_AND_ALLY: + if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) >= 2) // Count mons on both sides; ignore attacker + return FALSE; + break; + default: + break; } } return TRUE; From d29293f71520604a851da1f66ebc99d591ba8145 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 22 May 2022 13:05:45 +1200 Subject: [PATCH 24/32] Prevent infinite Bide loop with Parental Bond Prevent infinite loop from Bide + Parental Bond until this interaction can be implemented properly. --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 8d78a8240..358a55e05 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -945,7 +945,7 @@ static const u8 sForbiddenMoves[MOVES_COUNT] = [MOVE_BEHEMOTH_BLADE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_BELCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [MOVE_BESTOW] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, - [MOVE_BIDE] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_BIDE] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND, // Note: Bide should work with Parental Bond. This will be addressed in future. [MOVE_BLAST_BURN] = FORBIDDEN_INSTRUCT, [MOVE_BODY_PRESS] = FORBIDDEN_METRONOME, [MOVE_BONE_RUSH] = FORBIDDEN_PARENTAL_BOND, From 3775c5d00c5ec5468388806d89a98d68864bc909 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sat, 22 Oct 2022 18:54:25 +1300 Subject: [PATCH 25/32] Fix move effects Restore unintentionally removed MOVEEND_DEFROST, fix move effect definitions. --- include/constants/battle.h | 122 ++++--- include/constants/battle_move_effects.h | 358 ++++++++++----------- include/constants/battle_script_commands.h | 18 +- 3 files changed, 246 insertions(+), 252 deletions(-) diff --git a/include/constants/battle.h b/include/constants/battle.h index 9f79e7672..0cb022758 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -307,70 +307,66 @@ #define MOVE_EFFECT_PAYDAY 0xB #define MOVE_EFFECT_CHARGING 0xC #define MOVE_EFFECT_WRAP 0xD -#define MOVE_EFFECT_RECOIL_25 0xE -#define MOVE_EFFECT_ATK_PLUS_1 0xF -#define MOVE_EFFECT_DEF_PLUS_1 0x10 -#define MOVE_EFFECT_SPD_PLUS_1 0x11 -#define MOVE_EFFECT_SP_ATK_PLUS_1 0x12 -#define MOVE_EFFECT_SP_DEF_PLUS_1 0x13 -#define MOVE_EFFECT_ACC_PLUS_1 0x14 -#define MOVE_EFFECT_EVS_PLUS_1 0x15 -#define MOVE_EFFECT_ATK_MINUS_1 0x16 -#define MOVE_EFFECT_DEF_MINUS_1 0x17 -#define MOVE_EFFECT_SPD_MINUS_1 0x18 -#define MOVE_EFFECT_SP_ATK_MINUS_1 0x19 -#define MOVE_EFFECT_SP_DEF_MINUS_1 0x1A -#define MOVE_EFFECT_ACC_MINUS_1 0x1B -#define MOVE_EFFECT_EVS_MINUS_1 0x1C -#define MOVE_EFFECT_RECHARGE 0x1D -#define MOVE_EFFECT_RAGE 0x1E -#define MOVE_EFFECT_STEAL_ITEM 0x1F -#define MOVE_EFFECT_PREVENT_ESCAPE 0x20 -#define MOVE_EFFECT_NIGHTMARE 0x21 -#define MOVE_EFFECT_ALL_STATS_UP 0x22 -#define MOVE_EFFECT_RAPIDSPIN 0x23 -#define MOVE_EFFECT_REMOVE_STATUS 0x24 -#define MOVE_EFFECT_ATK_DEF_DOWN 0x25 -#define MOVE_EFFECT_RECOIL_33 0x26 -#define MOVE_EFFECT_ATK_PLUS_2 0x27 -#define MOVE_EFFECT_DEF_PLUS_2 0x28 -#define MOVE_EFFECT_SPD_PLUS_2 0x29 -#define MOVE_EFFECT_SP_ATK_PLUS_2 0x2A -#define MOVE_EFFECT_SP_DEF_PLUS_2 0x2B -#define MOVE_EFFECT_ACC_PLUS_2 0x2C -#define MOVE_EFFECT_EVS_PLUS_2 0x2D -#define MOVE_EFFECT_ATK_MINUS_2 0x2E -#define MOVE_EFFECT_DEF_MINUS_2 0x2F -#define MOVE_EFFECT_SPD_MINUS_2 0x30 -#define MOVE_EFFECT_SP_ATK_MINUS_2 0x31 -#define MOVE_EFFECT_SP_DEF_MINUS_2 0x32 -#define MOVE_EFFECT_ACC_MINUS_2 0x33 -#define MOVE_EFFECT_EVS_MINUS_2 0x34 -#define MOVE_EFFECT_THRASH 0x35 -#define MOVE_EFFECT_KNOCK_OFF 0x36 -#define MOVE_EFFECT_DEF_SPDEF_DOWN 0x37 -#define MOVE_EFFECT_RECOIL_33_STATUS 0x38 -#define MOVE_EFFECT_RECOIL_50 0x39 -#define MOVE_EFFECT_CLEAR_SMOG 0x3A -#define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x3B -#define MOVE_EFFECT_SMACK_DOWN 0x3C -#define MOVE_EFFECT_FLAME_BURST 0x3D -#define MOVE_EFFECT_FEINT 0x3E -#define MOVE_EFFECT_SPECTRAL_THIEF 0x3F -#define MOVE_EFFECT_V_CREATE 0x40 -#define MOVE_EFFECT_HAPPY_HOUR 0x41 -#define MOVE_EFFECT_CORE_ENFORCER 0x42 -#define MOVE_EFFECT_THROAT_CHOP 0x43 -#define MOVE_EFFECT_INCINERATE 0x44 -#define MOVE_EFFECT_BUG_BITE 0x45 -#define MOVE_EFFECT_RECOIL_HP_25 0x46 -#define MOVE_EFFECT_RELIC_SONG 0x47 -#define MOVE_EFFECT_TRAP_BOTH 0x48 -#define MOVE_EFFECT_SKY_DROP 0x49 -#define MOVE_EFFECT_SCALE_SHOT 0x4A -#define MOVE_EFFECT_BURN_UP 0x4B +#define MOVE_EFFECT_ATK_PLUS_1 0xE +#define MOVE_EFFECT_DEF_PLUS_1 0xF +#define MOVE_EFFECT_SPD_PLUS_1 0x10 +#define MOVE_EFFECT_SP_ATK_PLUS_1 0x11 +#define MOVE_EFFECT_SP_DEF_PLUS_1 0x12 +#define MOVE_EFFECT_ACC_PLUS_1 0x13 +#define MOVE_EFFECT_EVS_PLUS_1 0x14 +#define MOVE_EFFECT_ATK_MINUS_1 0x15 +#define MOVE_EFFECT_DEF_MINUS_1 0x16 +#define MOVE_EFFECT_SPD_MINUS_1 0x17 +#define MOVE_EFFECT_SP_ATK_MINUS_1 0x18 +#define MOVE_EFFECT_SP_DEF_MINUS_1 0x19 +#define MOVE_EFFECT_ACC_MINUS_1 0x1A +#define MOVE_EFFECT_EVS_MINUS_1 0x1B +#define MOVE_EFFECT_RECHARGE 0x1C +#define MOVE_EFFECT_RAGE 0x1D +#define MOVE_EFFECT_STEAL_ITEM 0x1E +#define MOVE_EFFECT_PREVENT_ESCAPE 0x1F +#define MOVE_EFFECT_NIGHTMARE 0x20 +#define MOVE_EFFECT_ALL_STATS_UP 0x21 +#define MOVE_EFFECT_RAPIDSPIN 0x22 +#define MOVE_EFFECT_REMOVE_STATUS 0x23 +#define MOVE_EFFECT_ATK_DEF_DOWN 0x24 +#define MOVE_EFFECT_ATK_PLUS_2 0x25 +#define MOVE_EFFECT_DEF_PLUS_2 0x26 +#define MOVE_EFFECT_SPD_PLUS_2 0x27 +#define MOVE_EFFECT_SP_ATK_PLUS_2 0x28 +#define MOVE_EFFECT_SP_DEF_PLUS_2 0x29 +#define MOVE_EFFECT_ACC_PLUS_2 0x2A +#define MOVE_EFFECT_EVS_PLUS_2 0x2B +#define MOVE_EFFECT_ATK_MINUS_2 0x2C +#define MOVE_EFFECT_DEF_MINUS_2 0x2D +#define MOVE_EFFECT_SPD_MINUS_2 0x2E +#define MOVE_EFFECT_SP_ATK_MINUS_2 0x2F +#define MOVE_EFFECT_SP_DEF_MINUS_2 0x30 +#define MOVE_EFFECT_ACC_MINUS_2 0x31 +#define MOVE_EFFECT_EVS_MINUS_2 0x32 +#define MOVE_EFFECT_THRASH 0x33 +#define MOVE_EFFECT_KNOCK_OFF 0x34 +#define MOVE_EFFECT_DEF_SPDEF_DOWN 0x35 +#define MOVE_EFFECT_CLEAR_SMOG 0x36 +#define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x37 +#define MOVE_EFFECT_SMACK_DOWN 0x38 +#define MOVE_EFFECT_FLAME_BURST 0x39 +#define MOVE_EFFECT_FEINT 0x3A +#define MOVE_EFFECT_SPECTRAL_THIEF 0x3B +#define MOVE_EFFECT_V_CREATE 0x3C +#define MOVE_EFFECT_HAPPY_HOUR 0x3D +#define MOVE_EFFECT_CORE_ENFORCER 0x3E +#define MOVE_EFFECT_THROAT_CHOP 0x3F +#define MOVE_EFFECT_INCINERATE 0x40 +#define MOVE_EFFECT_BUG_BITE 0x41 +#define MOVE_EFFECT_RECOIL_HP_25 0x42 +#define MOVE_EFFECT_RELIC_SONG 0x43 +#define MOVE_EFFECT_TRAP_BOTH 0x44 +#define MOVE_EFFECT_SKY_DROP 0x45 +#define MOVE_EFFECT_SCALE_SHOT 0x46 +#define MOVE_EFFECT_BURN_UP 0x47 -#define NUM_MOVE_EFFECTS 0x4C +#define NUM_MOVE_EFFECTS 0x48 #define MOVE_EFFECT_AFFECTS_USER 0x4000 #define MOVE_EFFECT_CERTAIN 0x8000 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 98e95a0cc..c941f1f92 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -215,186 +215,184 @@ #define EFFECT_CAMOUFLAGE 211 // New move effects -#define EFFECT_PLEDGE 214 -#define EFFECT_FLING 215 -#define EFFECT_NATURAL_GIFT 216 -#define EFFECT_WAKE_UP_SLAP 217 -#define EFFECT_WRING_OUT 218 -#define EFFECT_HEX 219 -#define EFFECT_ASSURANCE 220 -#define EFFECT_TRUMP_CARD 221 -#define EFFECT_ACROBATICS 222 -#define EFFECT_HEAT_CRASH 223 -#define EFFECT_PUNISHMENT 224 -#define EFFECT_STORED_POWER 225 -#define EFFECT_ELECTRO_BALL 226 -#define EFFECT_GYRO_BALL 227 -#define EFFECT_ECHOED_VOICE 228 -#define EFFECT_PAYBACK 229 -#define EFFECT_ROUND 230 -#define EFFECT_BRINE 231 -#define EFFECT_VENOSHOCK 232 -#define EFFECT_RETALIATE 233 -#define EFFECT_BULLDOZE 234 -#define EFFECT_FOUL_PLAY 235 -#define EFFECT_PSYSHOCK 236 -#define EFFECT_ROOST 237 -#define EFFECT_GRAVITY 238 -#define EFFECT_MIRACLE_EYE 239 -#define EFFECT_TAILWIND 240 -#define EFFECT_EMBARGO 241 -#define EFFECT_AQUA_RING 242 -#define EFFECT_TRICK_ROOM 243 -#define EFFECT_WONDER_ROOM 244 -#define EFFECT_MAGIC_ROOM 245 -#define EFFECT_MAGNET_RISE 246 -#define EFFECT_TOXIC_SPIKES 247 -#define EFFECT_GASTRO_ACID 248 -#define EFFECT_STEALTH_ROCK 249 -#define EFFECT_TELEKINESIS 250 -#define EFFECT_POWER_SWAP 251 -#define EFFECT_GUARD_SWAP 252 -#define EFFECT_HEART_SWAP 253 -#define EFFECT_POWER_SPLIT 254 -#define EFFECT_GUARD_SPLIT 255 -#define EFFECT_STICKY_WEB 256 -#define EFFECT_METAL_BURST 257 -#define EFFECT_LUCKY_CHANT 258 -#define EFFECT_SUCKER_PUNCH 259 -#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 260 -#define EFFECT_SIMPLE_BEAM 261 -#define EFFECT_ENTRAINMENT 262 -#define EFFECT_HEAL_PULSE 263 -#define EFFECT_QUASH 264 -#define EFFECT_ION_DELUGE 265 -#define EFFECT_FREEZE_DRY 266 -#define EFFECT_TOPSY_TURVY 267 -#define EFFECT_MISTY_TERRAIN 268 -#define EFFECT_GRASSY_TERRAIN 269 -#define EFFECT_ELECTRIC_TERRAIN 270 -#define EFFECT_PSYCHIC_TERRAIN 271 -#define EFFECT_ATTACK_ACCURACY_UP 272 -#define EFFECT_ATTACK_SPATK_UP 273 -#define EFFECT_HURRICANE 274 -#define EFFECT_TWO_TYPED_MOVE 275 -#define EFFECT_ME_FIRST 276 -#define EFFECT_SPEED_UP_HIT 277 -#define EFFECT_QUIVER_DANCE 278 -#define EFFECT_COIL 279 -#define EFFECT_ELECTRIFY 280 -#define EFFECT_SCALD 281 -#define EFFECT_REFLECT_TYPE 282 -#define EFFECT_SOAK 283 -#define EFFECT_GROWTH 284 -#define EFFECT_CLOSE_COMBAT 285 -#define EFFECT_LAST_RESORT 286 -#define EFFECT_RECOIL_33_STATUS 287 -#define EFFECT_FLINCH_STATUS 288 -#define EFFECT_RECOIL_50 289 -#define EFFECT_SHELL_SMASH 290 -#define EFFECT_SHIFT_GEAR 291 -#define EFFECT_DEFENSE_UP_3 292 -#define EFFECT_NOBLE_ROAR 293 -#define EFFECT_VENOM_DRENCH 294 -#define EFFECT_TOXIC_THREAD 295 -#define EFFECT_CLEAR_SMOG 296 -#define EFFECT_HIT_SWITCH_TARGET 297 -#define EFFECT_FINAL_GAMBIT 298 -#define EFFECT_CHANGE_TYPE_ON_ITEM 299 -#define EFFECT_AUTOTOMIZE 300 -#define EFFECT_COPYCAT 301 -#define EFFECT_DEFOG 302 -#define EFFECT_HIT_ENEMY_HEAL_ALLY 303 -#define EFFECT_SMACK_DOWN 304 -#define EFFECT_SYNCHRONOISE 305 -#define EFFECT_PSYCHO_SHIFT 306 -#define EFFECT_POWER_TRICK 307 -#define EFFECT_FLAME_BURST 308 -#define EFFECT_AFTER_YOU 309 -#define EFFECT_BESTOW 310 -#define EFFECT_ROTOTILLER 311 -#define EFFECT_FLOWER_SHIELD 312 -#define EFFECT_HIT_PREVENT_ESCAPE 313 -#define EFFECT_SPEED_SWAP 314 -#define EFFECT_DEFENSE_UP2_HIT 315 -#define EFFECT_REVELATION_DANCE 316 -#define EFFECT_AURORA_VEIL 317 -#define EFFECT_THIRD_TYPE 318 -#define EFFECT_FEINT 319 -#define EFFECT_SPARKLING_ARIA 320 -#define EFFECT_ACUPRESSURE 321 -#define EFFECT_AROMATIC_MIST 322 -#define EFFECT_POWDER 323 -#define EFFECT_SP_ATTACK_UP_HIT 324 -#define EFFECT_BELCH 325 -#define EFFECT_PARTING_SHOT 326 -#define EFFECT_SPECTRAL_THIEF 327 -#define EFFECT_V_CREATE 328 -#define EFFECT_MAT_BLOCK 329 -#define EFFECT_STOMPING_TANTRUM 330 -#define EFFECT_CORE_ENFORCER 331 -#define EFFECT_INSTRUCT 332 -#define EFFECT_THROAT_CHOP 333 -#define EFFECT_LASER_FOCUS 334 -#define EFFECT_MAGNETIC_FLUX 335 -#define EFFECT_GEAR_UP 336 -#define EFFECT_INCINERATE 337 -#define EFFECT_BUG_BITE 338 -#define EFFECT_STRENGTH_SAP 339 -#define EFFECT_MIND_BLOWN 340 -#define EFFECT_PURIFY 341 -#define EFFECT_BURN_UP 342 -#define EFFECT_SHORE_UP 343 -#define EFFECT_GEOMANCY 344 -#define EFFECT_FAIRY_LOCK 345 -#define EFFECT_ALLY_SWITCH 346 -#define EFFECT_RELIC_SONG 347 -#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 348 -#define EFFECT_BODY_PRESS 349 -#define EFFECT_EERIE_SPELL 350 -#define EFFECT_JUNGLE_HEALING 351 -#define EFFECT_COACHING 352 -#define EFFECT_LASH_OUT 353 -#define EFFECT_GRASSY_GLIDE 354 -#define EFFECT_REMOVE_TERRAIN 355 -#define EFFECT_DYNAMAX_DOUBLE_DMG 356 -#define EFFECT_DECORATE 357 -#define EFFECT_SNIPE_SHOT 358 -#define EFFECT_TRIPLE_HIT 359 -#define EFFECT_RECOIL_HP_25 360 -#define EFFECT_STUFF_CHEEKS 361 -#define EFFECT_GRAV_APPLE 362 -#define EFFECT_EVASION_UP_HIT 363 -#define EFFECT_DOUBLE_IRON_BASH 364 -#define EFFECT_GLITZY_GLOW 365 -#define EFFECT_BADDY_BAD 366 -#define EFFECT_SAPPY_SEED 367 -#define EFFECT_FREEZY_FROST 368 -#define EFFECT_SPARKLY_SWIRL 369 -#define EFFECT_PLASMA_FISTS 370 -#define EFFECT_HYPERSPACE_FURY 371 -#define EFFECT_AURA_WHEEL 372 -#define EFFECT_PHOTON_GEYSER 373 -#define EFFECT_SHELL_SIDE_ARM 374 -#define EFFECT_TERRAIN_PULSE 375 -#define EFFECT_JAW_LOCK 376 -#define EFFECT_NO_RETREAT 377 -#define EFFECT_TAR_SHOT 378 -#define EFFECT_POLTERGEIST 379 -#define EFFECT_OCTOLOCK 380 -#define EFFECT_CLANGOROUS_SOUL 381 -#define EFFECT_BOLT_BEAK 382 -#define EFFECT_SKY_DROP 383 -#define EFFECT_EXPANDING_FORCE 384 -#define EFFECT_SCALE_SHOT 385 -#define EFFECT_METEOR_BEAM 386 -#define EFFECT_RISING_VOLTAGE 387 -#define EFFECT_BEAK_BLAST 388 -#define EFFECT_COURT_CHANGE 389 -#define EFFECT_STEEL_BEAM 390 -#define EFFECT_EXTREME_EVOBOOST 391 -#define EFFECT_DAMAGE_SET_TERRAIN 392 // genesis supernova +#define EFFECT_PLEDGE 212 +#define EFFECT_FLING 213 +#define EFFECT_NATURAL_GIFT 214 +#define EFFECT_WAKE_UP_SLAP 215 +#define EFFECT_WRING_OUT 216 +#define EFFECT_HEX 217 +#define EFFECT_ASSURANCE 218 +#define EFFECT_TRUMP_CARD 219 +#define EFFECT_ACROBATICS 220 +#define EFFECT_HEAT_CRASH 221 +#define EFFECT_PUNISHMENT 222 +#define EFFECT_STORED_POWER 223 +#define EFFECT_ELECTRO_BALL 224 +#define EFFECT_GYRO_BALL 225 +#define EFFECT_ECHOED_VOICE 226 +#define EFFECT_PAYBACK 227 +#define EFFECT_ROUND 228 +#define EFFECT_BRINE 229 +#define EFFECT_VENOSHOCK 230 +#define EFFECT_RETALIATE 231 +#define EFFECT_BULLDOZE 232 +#define EFFECT_FOUL_PLAY 233 +#define EFFECT_PSYSHOCK 234 +#define EFFECT_ROOST 235 +#define EFFECT_GRAVITY 236 +#define EFFECT_MIRACLE_EYE 237 +#define EFFECT_TAILWIND 238 +#define EFFECT_EMBARGO 239 +#define EFFECT_AQUA_RING 240 +#define EFFECT_TRICK_ROOM 241 +#define EFFECT_WONDER_ROOM 242 +#define EFFECT_MAGIC_ROOM 243 +#define EFFECT_MAGNET_RISE 244 +#define EFFECT_TOXIC_SPIKES 245 +#define EFFECT_GASTRO_ACID 246 +#define EFFECT_STEALTH_ROCK 247 +#define EFFECT_TELEKINESIS 248 +#define EFFECT_POWER_SWAP 249 +#define EFFECT_GUARD_SWAP 250 +#define EFFECT_HEART_SWAP 251 +#define EFFECT_POWER_SPLIT 252 +#define EFFECT_GUARD_SPLIT 253 +#define EFFECT_STICKY_WEB 254 +#define EFFECT_METAL_BURST 255 +#define EFFECT_LUCKY_CHANT 256 +#define EFFECT_SUCKER_PUNCH 257 +#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 258 +#define EFFECT_SIMPLE_BEAM 259 +#define EFFECT_ENTRAINMENT 260 +#define EFFECT_HEAL_PULSE 261 +#define EFFECT_QUASH 262 +#define EFFECT_ION_DELUGE 263 +#define EFFECT_FREEZE_DRY 264 +#define EFFECT_TOPSY_TURVY 265 +#define EFFECT_MISTY_TERRAIN 266 +#define EFFECT_GRASSY_TERRAIN 267 +#define EFFECT_ELECTRIC_TERRAIN 268 +#define EFFECT_PSYCHIC_TERRAIN 269 +#define EFFECT_ATTACK_ACCURACY_UP 270 +#define EFFECT_ATTACK_SPATK_UP 271 +#define EFFECT_HURRICANE 272 +#define EFFECT_TWO_TYPED_MOVE 273 +#define EFFECT_ME_FIRST 274 +#define EFFECT_SPEED_UP_HIT 275 +#define EFFECT_QUIVER_DANCE 276 +#define EFFECT_COIL 277 +#define EFFECT_ELECTRIFY 278 +#define EFFECT_SCALD 279 +#define EFFECT_REFLECT_TYPE 280 +#define EFFECT_SOAK 281 +#define EFFECT_GROWTH 282 +#define EFFECT_CLOSE_COMBAT 283 +#define EFFECT_LAST_RESORT 284 +#define EFFECT_RECOIL_33_STATUS 285 +#define EFFECT_FLINCH_STATUS 286 +#define EFFECT_RECOIL_50 287 +#define EFFECT_SHELL_SMASH 288 +#define EFFECT_SHIFT_GEAR 289 +#define EFFECT_DEFENSE_UP_3 290 +#define EFFECT_NOBLE_ROAR 291 +#define EFFECT_VENOM_DRENCH 292 +#define EFFECT_TOXIC_THREAD 293 +#define EFFECT_CLEAR_SMOG 294 +#define EFFECT_HIT_SWITCH_TARGET 295 +#define EFFECT_FINAL_GAMBIT 296 +#define EFFECT_CHANGE_TYPE_ON_ITEM 297 +#define EFFECT_AUTOTOMIZE 298 +#define EFFECT_COPYCAT 299 +#define EFFECT_DEFOG 300 +#define EFFECT_HIT_ENEMY_HEAL_ALLY 301 +#define EFFECT_SMACK_DOWN 302 +#define EFFECT_SYNCHRONOISE 303 +#define EFFECT_PSYCHO_SHIFT 304 +#define EFFECT_POWER_TRICK 305 +#define EFFECT_FLAME_BURST 306 +#define EFFECT_AFTER_YOU 307 +#define EFFECT_BESTOW 308 +#define EFFECT_ROTOTILLER 309 +#define EFFECT_FLOWER_SHIELD 310 +#define EFFECT_HIT_PREVENT_ESCAPE 311 +#define EFFECT_SPEED_SWAP 312 +#define EFFECT_DEFENSE_UP2_HIT 313 +#define EFFECT_REVELATION_DANCE 314 +#define EFFECT_AURORA_VEIL 315 +#define EFFECT_THIRD_TYPE 316 +#define EFFECT_FEINT 317 +#define EFFECT_SPARKLING_ARIA 318 +#define EFFECT_ACUPRESSURE 319 +#define EFFECT_AROMATIC_MIST 320 +#define EFFECT_POWDER 321 +#define EFFECT_SP_ATTACK_UP_HIT 322 +#define EFFECT_BELCH 323 +#define EFFECT_PARTING_SHOT 324 +#define EFFECT_SPECTRAL_THIEF 325 +#define EFFECT_V_CREATE 326 +#define EFFECT_MAT_BLOCK 327 +#define EFFECT_STOMPING_TANTRUM 328 +#define EFFECT_CORE_ENFORCER 329 +#define EFFECT_INSTRUCT 330 +#define EFFECT_THROAT_CHOP 331 +#define EFFECT_LASER_FOCUS 332 +#define EFFECT_MAGNETIC_FLUX 333 +#define EFFECT_GEAR_UP 334 +#define EFFECT_INCINERATE 335 +#define EFFECT_BUG_BITE 336 +#define EFFECT_STRENGTH_SAP 337 +#define EFFECT_MIND_BLOWN 338 +#define EFFECT_PURIFY 339 +#define EFFECT_BURN_UP 340 +#define EFFECT_SHORE_UP 341 +#define EFFECT_GEOMANCY 342 +#define EFFECT_FAIRY_LOCK 343 +#define EFFECT_ALLY_SWITCH 344 +#define EFFECT_RELIC_SONG 345 +#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 346 +#define EFFECT_BODY_PRESS 347 +#define EFFECT_EERIE_SPELL 348 +#define EFFECT_JUNGLE_HEALING 349 +#define EFFECT_COACHING 350 +#define EFFECT_LASH_OUT 351 +#define EFFECT_GRASSY_GLIDE 352 +#define EFFECT_REMOVE_TERRAIN 353 +#define EFFECT_DYNAMAX_DOUBLE_DMG 354 +#define EFFECT_DECORATE 355 +#define EFFECT_SNIPE_SHOT 356 +#define EFFECT_RECOIL_HP_25 357 +#define EFFECT_STUFF_CHEEKS 358 +#define EFFECT_GRAV_APPLE 359 +#define EFFECT_EVASION_UP_HIT 360 +#define EFFECT_GLITZY_GLOW 361 +#define EFFECT_BADDY_BAD 362 +#define EFFECT_SAPPY_SEED 363 +#define EFFECT_FREEZY_FROST 364 +#define EFFECT_SPARKLY_SWIRL 365 +#define EFFECT_PLASMA_FISTS 366 +#define EFFECT_HYPERSPACE_FURY 367 +#define EFFECT_AURA_WHEEL 368 +#define EFFECT_PHOTON_GEYSER 369 +#define EFFECT_SHELL_SIDE_ARM 370 +#define EFFECT_TERRAIN_PULSE 371 +#define EFFECT_JAW_LOCK 372 +#define EFFECT_NO_RETREAT 373 +#define EFFECT_TAR_SHOT 374 +#define EFFECT_POLTERGEIST 375 +#define EFFECT_OCTOLOCK 376 +#define EFFECT_CLANGOROUS_SOUL 377 +#define EFFECT_BOLT_BEAK 378 +#define EFFECT_SKY_DROP 379 +#define EFFECT_EXPANDING_FORCE 380 +#define EFFECT_SCALE_SHOT 381 +#define EFFECT_METEOR_BEAM 382 +#define EFFECT_RISING_VOLTAGE 383 +#define EFFECT_BEAK_BLAST 384 +#define EFFECT_COURT_CHANGE 385 +#define EFFECT_STEEL_BEAM 386 +#define EFFECT_EXTREME_EVOBOOST 387 +#define EFFECT_DAMAGE_SET_TERRAIN 388 // genesis supernova -#define NUM_BATTLE_MOVE_EFFECTS 393 +#define NUM_BATTLE_MOVE_EFFECTS 389 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 9550ea09b..06a09fc17 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -298,15 +298,15 @@ #define MOVEEND_ATTACKER_VISIBLE 10 #define MOVEEND_TARGET_VISIBLE 11 #define MOVEEND_ITEM_EFFECTS_TARGET 12 -#define MOVEEND_MOVE_EFFECTS2 13 -#define MOVEEND_ITEM_EFFECTS_ALL 14 -#define MOVEEND_KINGSROCK 15 // These item effects will occur each strike of a multi-hit move -#define MOVEEND_SUBSTITUTE 16 -#define MOVEEND_SKY_DROP_CONFUSE 17 -#define MOVEEND_UPDATE_LAST_MOVES 18 -#define MOVEEND_MIRROR_MOVE 19 -#define MOVEEND_NEXT_TARGET 20 // Everything up until here is handled for each strike of a multi-hit move -#define MOVEEND_MULTIHIT_MOVE 21 +#define MOVEEND_ITEM_EFFECTS_ALL 13 +#define MOVEEND_KINGSROCK 14 // These item effects will occur each strike of a multi-hit move +#define MOVEEND_SUBSTITUTE 15 +#define MOVEEND_SKY_DROP_CONFUSE 16 +#define MOVEEND_UPDATE_LAST_MOVES 17 +#define MOVEEND_MIRROR_MOVE 18 +#define MOVEEND_NEXT_TARGET 19 // Everything up until here is handled for each strike of a multi-hit move +#define MOVEEND_MULTIHIT_MOVE 20 +#define MOVEEND_DEFROST 21 #define MOVEEND_MOVE_EFFECTS2 22 #define MOVEEND_RECOIL 23 #define MOVEEND_MAGICIAN 24 // Occurs after final multi-hit strike, and after other items/abilities would activate From 1b056f904475317e2e2ed6891e09375476931dcc Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 23 Oct 2022 17:37:23 +1300 Subject: [PATCH 26/32] Fix various Parental Bond issues - Dragon Tail and Circle Throw strike twice and then switch the target - Z moves are unaffected by Parental Bond - Renamed parentalBondOn to parentalBondState - Added constants for possible values of parentalBondState - Fixed broken stat change animations and removed unused MOVE_EFFECT_SKY_DROP --- data/battle_scripts_1.s | 1 - include/battle.h | 2 +- include/constants/battle.h | 124 ++++++++++++++++++----------------- src/battle_main.c | 2 +- src/battle_script_commands.c | 39 ++++++----- src/battle_util.c | 2 +- 6 files changed, 91 insertions(+), 79 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 40ca3c091..7e94460ef 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1995,7 +1995,6 @@ BattleScript_EffectHitSwitchTarget: resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET - checkparentalbondcounter 2, BattleScript_EffectHitSwitchTargetMoveEnd moveendall jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted diff --git a/include/battle.h b/include/battle.h index b452f16cd..8e9f6c300 100644 --- a/include/battle.h +++ b/include/battle.h @@ -174,7 +174,7 @@ struct SpecialStatus u8 berryReduced:1; u8 gemBoost:1; u8 rototillerAffected:1; // to be affected by rototiller - u8 parentalBondOn:2; + u8 parentalBondState:2; u8 multiHitOn:1; // End of byte, two bits unused u8 gemParam; diff --git a/include/constants/battle.h b/include/constants/battle.h index 0cb022758..1592a7af4 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -307,66 +307,65 @@ #define MOVE_EFFECT_PAYDAY 0xB #define MOVE_EFFECT_CHARGING 0xC #define MOVE_EFFECT_WRAP 0xD -#define MOVE_EFFECT_ATK_PLUS_1 0xE -#define MOVE_EFFECT_DEF_PLUS_1 0xF -#define MOVE_EFFECT_SPD_PLUS_1 0x10 -#define MOVE_EFFECT_SP_ATK_PLUS_1 0x11 -#define MOVE_EFFECT_SP_DEF_PLUS_1 0x12 -#define MOVE_EFFECT_ACC_PLUS_1 0x13 -#define MOVE_EFFECT_EVS_PLUS_1 0x14 -#define MOVE_EFFECT_ATK_MINUS_1 0x15 -#define MOVE_EFFECT_DEF_MINUS_1 0x16 -#define MOVE_EFFECT_SPD_MINUS_1 0x17 -#define MOVE_EFFECT_SP_ATK_MINUS_1 0x18 -#define MOVE_EFFECT_SP_DEF_MINUS_1 0x19 -#define MOVE_EFFECT_ACC_MINUS_1 0x1A -#define MOVE_EFFECT_EVS_MINUS_1 0x1B -#define MOVE_EFFECT_RECHARGE 0x1C -#define MOVE_EFFECT_RAGE 0x1D -#define MOVE_EFFECT_STEAL_ITEM 0x1E -#define MOVE_EFFECT_PREVENT_ESCAPE 0x1F -#define MOVE_EFFECT_NIGHTMARE 0x20 -#define MOVE_EFFECT_ALL_STATS_UP 0x21 -#define MOVE_EFFECT_RAPIDSPIN 0x22 -#define MOVE_EFFECT_REMOVE_STATUS 0x23 -#define MOVE_EFFECT_ATK_DEF_DOWN 0x24 -#define MOVE_EFFECT_ATK_PLUS_2 0x25 -#define MOVE_EFFECT_DEF_PLUS_2 0x26 -#define MOVE_EFFECT_SPD_PLUS_2 0x27 -#define MOVE_EFFECT_SP_ATK_PLUS_2 0x28 -#define MOVE_EFFECT_SP_DEF_PLUS_2 0x29 -#define MOVE_EFFECT_ACC_PLUS_2 0x2A -#define MOVE_EFFECT_EVS_PLUS_2 0x2B -#define MOVE_EFFECT_ATK_MINUS_2 0x2C -#define MOVE_EFFECT_DEF_MINUS_2 0x2D -#define MOVE_EFFECT_SPD_MINUS_2 0x2E -#define MOVE_EFFECT_SP_ATK_MINUS_2 0x2F -#define MOVE_EFFECT_SP_DEF_MINUS_2 0x30 -#define MOVE_EFFECT_ACC_MINUS_2 0x31 -#define MOVE_EFFECT_EVS_MINUS_2 0x32 -#define MOVE_EFFECT_THRASH 0x33 -#define MOVE_EFFECT_KNOCK_OFF 0x34 -#define MOVE_EFFECT_DEF_SPDEF_DOWN 0x35 -#define MOVE_EFFECT_CLEAR_SMOG 0x36 -#define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x37 -#define MOVE_EFFECT_SMACK_DOWN 0x38 -#define MOVE_EFFECT_FLAME_BURST 0x39 -#define MOVE_EFFECT_FEINT 0x3A -#define MOVE_EFFECT_SPECTRAL_THIEF 0x3B -#define MOVE_EFFECT_V_CREATE 0x3C -#define MOVE_EFFECT_HAPPY_HOUR 0x3D -#define MOVE_EFFECT_CORE_ENFORCER 0x3E -#define MOVE_EFFECT_THROAT_CHOP 0x3F -#define MOVE_EFFECT_INCINERATE 0x40 -#define MOVE_EFFECT_BUG_BITE 0x41 -#define MOVE_EFFECT_RECOIL_HP_25 0x42 -#define MOVE_EFFECT_RELIC_SONG 0x43 -#define MOVE_EFFECT_TRAP_BOTH 0x44 -#define MOVE_EFFECT_SKY_DROP 0x45 -#define MOVE_EFFECT_SCALE_SHOT 0x46 -#define MOVE_EFFECT_BURN_UP 0x47 - -#define NUM_MOVE_EFFECTS 0x48 +#define MOVE_EFFECT_BURN_UP 0xE // MOVE_EFFECT_BURN_UP replaces unused MOVE_EFFECT_RECOIL_25 so that stat change animations don't break +#define MOVE_EFFECT_ATK_PLUS_1 0xF +#define MOVE_EFFECT_DEF_PLUS_1 0x10 +#define MOVE_EFFECT_SPD_PLUS_1 0x11 +#define MOVE_EFFECT_SP_ATK_PLUS_1 0x12 +#define MOVE_EFFECT_SP_DEF_PLUS_1 0x13 +#define MOVE_EFFECT_ACC_PLUS_1 0x14 +#define MOVE_EFFECT_EVS_PLUS_1 0x15 +#define MOVE_EFFECT_ATK_MINUS_1 0x16 +#define MOVE_EFFECT_DEF_MINUS_1 0x17 +#define MOVE_EFFECT_SPD_MINUS_1 0x18 +#define MOVE_EFFECT_SP_ATK_MINUS_1 0x19 +#define MOVE_EFFECT_SP_DEF_MINUS_1 0x1A +#define MOVE_EFFECT_ACC_MINUS_1 0x1B +#define MOVE_EFFECT_EVS_MINUS_1 0x1C +#define MOVE_EFFECT_RECHARGE 0x1D +#define MOVE_EFFECT_RAGE 0x1E +#define MOVE_EFFECT_STEAL_ITEM 0x1F +#define MOVE_EFFECT_PREVENT_ESCAPE 0x20 +#define MOVE_EFFECT_NIGHTMARE 0x21 +#define MOVE_EFFECT_ALL_STATS_UP 0x22 +#define MOVE_EFFECT_RAPIDSPIN 0x23 +#define MOVE_EFFECT_REMOVE_STATUS 0x24 +#define MOVE_EFFECT_ATK_DEF_DOWN 0x25 +#define MOVE_EFFECT_SCALE_SHOT 0x26 // MOVE_EFFECT_SCALE_SHOT replaces unused MOVE_EFFECT_RECOIL_33 so that stat change animations don't break +#define MOVE_EFFECT_ATK_PLUS_2 0x27 +#define MOVE_EFFECT_DEF_PLUS_2 0x28 +#define MOVE_EFFECT_SPD_PLUS_2 0x29 +#define MOVE_EFFECT_SP_ATK_PLUS_2 0x2A +#define MOVE_EFFECT_SP_DEF_PLUS_2 0x2B +#define MOVE_EFFECT_ACC_PLUS_2 0x2C +#define MOVE_EFFECT_EVS_PLUS_2 0x2D +#define MOVE_EFFECT_ATK_MINUS_2 0x2E +#define MOVE_EFFECT_DEF_MINUS_2 0x2F +#define MOVE_EFFECT_SPD_MINUS_2 0x30 +#define MOVE_EFFECT_SP_ATK_MINUS_2 0x31 +#define MOVE_EFFECT_SP_DEF_MINUS_2 0x32 +#define MOVE_EFFECT_ACC_MINUS_2 0x33 +#define MOVE_EFFECT_EVS_MINUS_2 0x34 +#define MOVE_EFFECT_THRASH 0x35 +#define MOVE_EFFECT_KNOCK_OFF 0x36 +#define MOVE_EFFECT_DEF_SPDEF_DOWN 0x37 +#define MOVE_EFFECT_CLEAR_SMOG 0x38 +#define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x39 +#define MOVE_EFFECT_SMACK_DOWN 0x3A +#define MOVE_EFFECT_FLAME_BURST 0x3B +#define MOVE_EFFECT_FEINT 0x3C +#define MOVE_EFFECT_SPECTRAL_THIEF 0x3D +#define MOVE_EFFECT_V_CREATE 0x3E +#define MOVE_EFFECT_HAPPY_HOUR 0x3F +#define MOVE_EFFECT_CORE_ENFORCER 0x40 +#define MOVE_EFFECT_THROAT_CHOP 0x41 +#define MOVE_EFFECT_INCINERATE 0x42 +#define MOVE_EFFECT_BUG_BITE 0x43 +#define MOVE_EFFECT_RECOIL_HP_25 0x44 +#define MOVE_EFFECT_RELIC_SONG 0x45 +#define MOVE_EFFECT_TRAP_BOTH 0x46 + +#define NUM_MOVE_EFFECTS 0x47 #define MOVE_EFFECT_AFFECTS_USER 0x4000 #define MOVE_EFFECT_CERTAIN 0x8000 @@ -480,4 +479,9 @@ // For the second argument of GetMoveTarget, when no target override is needed #define NO_TARGET_OVERRIDE 0 +// Constants for Parental Bond +#define PARENTAL_BOND_1ST_HIT 2 +#define PARENTAL_BOND_2ND_HIT 1 +#define PARENTAL_BOND_OFF 0 + #endif // GUARD_CONSTANTS_BATTLE_H diff --git a/src/battle_main.c b/src/battle_main.c index bf2c92fee..b47085248 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4843,7 +4843,7 @@ static void TurnValuesCleanUp(bool8 var0) if (gDisableStructs[gActiveBattler].substituteHP == 0) gBattleMons[gActiveBattler].status2 &= ~(STATUS2_SUBSTITUTE); - gSpecialStatuses[gActiveBattler].parentalBondOn = 0; + gSpecialStatuses[gActiveBattler].parentalBondState = PARENTAL_BOND_OFF; } gSideStatuses[0] &= ~(SIDE_STATUS_QUICK_GUARD | SIDE_STATUS_WIDE_GUARD | SIDE_STATUS_CRAFTY_SHIELD | SIDE_STATUS_MAT_BLOCK); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 24ec0426e..e6192700e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1138,6 +1138,7 @@ static const u16 sFinalStrikeOnlyEffects[] = EFFECT_HIT_ESCAPE, EFFECT_RECOIL_HP_25, EFFECT_HIT_PREVENT_ESCAPE, + EFFECT_HIT_SWITCH_TARGET, }; static const u16 sNaturePowerMoves[BATTLE_TERRAIN_COUNT] = @@ -1449,12 +1450,13 @@ static void Cmd_attackcanceler(void) if (AtkCanceller_UnableToUseMove()) return; - if (!gSpecialStatuses[gBattlerAttacker].parentalBondOn + if (!gSpecialStatuses[gBattlerAttacker].parentalBondState && GetBattlerAbility(gBattlerAttacker) == ABILITY_PARENTAL_BOND && IsMoveAffectedByParentalBond(gCurrentMove, gBattlerAttacker) - && !(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) + && !(gAbsentBattlerFlags & gBitTable[gBattlerTarget]) + && gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE) { - gSpecialStatuses[gBattlerAttacker].parentalBondOn = 2; + gSpecialStatuses[gBattlerAttacker].parentalBondState = PARENTAL_BOND_1ST_HIT; gMultiHitCounter = 2; PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) return; @@ -1591,6 +1593,13 @@ static void Cmd_attackcanceler(void) gMoveResultFlags |= MOVE_RESULT_MISSED; gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; + + if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT) + { + gSpecialStatuses[gBattlerAttacker].parentalBondState = PARENTAL_BOND_OFF; // No second hit if first hit was blocked + gSpecialStatuses[gBattlerAttacker].multiHitOn = 0; + gMultiHitCounter = 0; + } gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; gBattlescriptCurrInstr++; } @@ -1840,7 +1849,7 @@ static void Cmd_accuracycheck(void) else if (!JumpIfMoveAffectedByProtect(0)) gBattlescriptCurrInstr += 7; } - else if (gSpecialStatuses[gBattlerAttacker].parentalBondOn == 1 + else if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT || (gSpecialStatuses[gBattlerAttacker].multiHitOn && (gBattleMoves[move].effect != EFFECT_TRIPLE_KICK || GetBattlerAbility(gBattlerAttacker) == ABILITY_SKILL_LINK))) { @@ -1930,7 +1939,7 @@ static void Cmd_ppreduce(void) if (gCurrentMove == gLastResultingMoves[gBattlerAttacker] && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && !WasUnableToUseMove(gBattlerAttacker) - && gSpecialStatuses[gBattlerAttacker].parentalBondOn != 2) // Don't increment counter on first hit + && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT) // Don't increment counter on first hit gBattleStruct->sameMoveTurns[gBattlerAttacker]++; else gBattleStruct->sameMoveTurns[gBattlerAttacker] = 0; @@ -2247,7 +2256,7 @@ static void Cmd_attackanimation(void) } else { - if (gSpecialStatuses[gBattlerAttacker].parentalBondOn == 1) // No animation on second hit + if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT) // No animation on second hit { gBattlescriptCurrInstr++; return; @@ -2780,7 +2789,7 @@ void SetMoveEffect(bool32 primary, u32 certain) u32 flags = 0; u16 battlerAbility; - if (gSpecialStatuses[gBattlerAttacker].parentalBondOn == 2 + if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT && gBattleMons[gBattlerTarget].hp != 0 && IsFinalStrikeEffect(gCurrentMove)) { @@ -3156,7 +3165,7 @@ void SetMoveEffect(bool32 primary, u32 certain) break; case MOVE_EFFECT_PAYDAY: // Don't scatter coins on the second hit of Parental Bond - if (GET_BATTLER_SIDE(gBattlerAttacker) == B_SIDE_PLAYER && gSpecialStatuses[gBattlerAttacker].parentalBondOn != 1) + if (GET_BATTLER_SIDE(gBattlerAttacker) == B_SIDE_PLAYER && gSpecialStatuses[gBattlerAttacker].parentalBondState!= PARENTAL_BOND_2ND_HIT) { u16 payday = gPaydayMoney; gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 5); @@ -5682,8 +5691,8 @@ static void Cmd_moveend(void) && (gChosenMove == MOVE_SLEEP_TALK || !(gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)) && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE)) { - if (gSpecialStatuses[gBattlerAttacker].parentalBondOn) - gSpecialStatuses[gBattlerAttacker].parentalBondOn--; + if (gSpecialStatuses[gBattlerAttacker].parentalBondState) + gSpecialStatuses[gBattlerAttacker].parentalBondState--; gHitMarker |= (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING); gBattleScripting.animTargetsHit = 0; @@ -5706,7 +5715,7 @@ static void Cmd_moveend(void) } } gMultiHitCounter = 0; - gSpecialStatuses[gBattlerAttacker].parentalBondOn = 0; + gSpecialStatuses[gBattlerAttacker].parentalBondState = PARENTAL_BOND_OFF; gSpecialStatuses[gBattlerAttacker].multiHitOn = 0; gBattleScripting.moveendState++; break; @@ -10059,7 +10068,7 @@ static void Cmd_various(void) // Some effects should only happen on the first or second strike of Parental Bond, // so a way to check this in battle scripts is useful u8 counter = T1_READ_8(gBattlescriptCurrInstr + 3); - if (gSpecialStatuses[gBattlerAttacker].parentalBondOn == counter && gBattleMons[gBattlerTarget].hp != 0) + if (gSpecialStatuses[gBattlerAttacker].parentalBondState == counter && gBattleMons[gBattlerTarget].hp != 0) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 4); else gBattlescriptCurrInstr += 8; @@ -10540,7 +10549,7 @@ static void Cmd_stockpiletobasedamage(void) if (gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; - if (!(gSpecialStatuses[gBattlerAttacker].parentalBondOn == 2 && gBattleMons[gBattlerTarget].hp != 0)) + if (!(gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT && gBattleMons[gBattlerTarget].hp != 0)) { gDisableStructs[gBattlerAttacker].stockpileCounter = 0; // Restore stat changes from stockpile. @@ -12438,7 +12447,7 @@ static void Cmd_handlefurycutter(void) else { if (gDisableStructs[gBattlerAttacker].furyCutterCounter != 5 - && gSpecialStatuses[gBattlerAttacker].parentalBondOn != 2) // Don't increment counter on first hit + && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT) // Don't increment counter on first hit gDisableStructs[gBattlerAttacker].furyCutterCounter++; gBattlescriptCurrInstr++; @@ -12469,7 +12478,7 @@ static void Cmd_presentdamagecalculation(void) * damage, the second strike will always deal damage too. This is a simple way * to replicate that effect. */ - if (gSpecialStatuses[gBattlerAttacker].parentalBondOn != 1) + if (gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_2ND_HIT) { if (rand < 102) { diff --git a/src/battle_util.c b/src/battle_util.c index 698d676f1..1e99a2301 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9292,7 +9292,7 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move } // Parental Bond Second Strike - if (gSpecialStatuses[gBattlerAttacker].parentalBondOn == 1) + if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT) { if (B_PARENTAL_BOND_DAMAGE < GEN_7) MulModifier(&finalModifier, UQ_4_12(0.5)); From 9b076a9dcf278711af4769a5db140f05e413276d Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 23 Oct 2022 21:40:04 +1300 Subject: [PATCH 27/32] Fix spread moves, tidy up CANCELLER_MULTIHIT_MOVES - Parental Bond spread moves should now strike twice whenever there is a single target, even if the target is the user's ally. - Random chance to hit 2-5 times is now set in SetRandomMultiHitCounter(). --- include/constants/battle.h | 2 +- src/battle_script_commands.c | 8 +++-- src/battle_util.c | 62 ++++++++++++++++++++---------------- 3 files changed, 41 insertions(+), 31 deletions(-) diff --git a/include/constants/battle.h b/include/constants/battle.h index 1592a7af4..11a5a6a86 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -364,7 +364,7 @@ #define MOVE_EFFECT_RECOIL_HP_25 0x44 #define MOVE_EFFECT_RELIC_SONG 0x45 #define MOVE_EFFECT_TRAP_BOTH 0x46 - + #define NUM_MOVE_EFFECTS 0x47 #define MOVE_EFFECT_AFFECTS_USER 0x4000 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e6192700e..480b18a90 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -14844,12 +14844,16 @@ bool8 IsMoveAffectedByParentalBond(u16 move, u8 battlerId) { switch (GetBattlerMoveTargetType(battlerId, move)) { + // Both foes are alive, spread move strikes once case MOVE_TARGET_BOTH: - if (CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) >= 2) // Check for single target + if (IsBattlerAlive(gBattlerTarget) && IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget))) return FALSE; break; + // Either both foes or one foe and its ally are alive; spread move strikes once case MOVE_TARGET_FOES_AND_ALLY: - if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) >= 2) // Count mons on both sides; ignore attacker + if (IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget)) + || (IsBattlerAlive(BATTLE_PARTNER(battlerId)) + && (IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget)) || IsBattlerAlive(gBattlerTarget)))) return FALSE; break; default: diff --git a/src/battle_util.c b/src/battle_util.c index 1e99a2301..79a698eb7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -59,6 +59,7 @@ functions instead of at the top of the file with the other declarations. static bool32 TryRemoveScreens(u8 battler); static bool32 IsUnnerveAbilityOnOpposingSide(u8 battlerId); static u8 GetFlingPowerFromItemId(u16 itemId); +static void SetRandomMultiHitCounter(); extern const u8 *const gBattleScriptsForMoveEffects[]; extern const u8 *const gBattlescriptsForRunningByItem[]; @@ -3868,35 +3869,8 @@ u8 AtkCanceller_UnableToUseMove(void) } else { - if (B_MULTI_HIT_CHANCE >= GEN_5) - { - // Based on Gen 5's odds - // 35% for 2 hits - // 35% for 3 hits - // 15% for 4 hits - // 15% for 5 hits - gMultiHitCounter = Random() % 100; - if (gMultiHitCounter < 35) - gMultiHitCounter = 2; - else if (gMultiHitCounter < 35 + 35) - gMultiHitCounter = 3; - else if (gMultiHitCounter < 35 + 35 + 15) - gMultiHitCounter = 4; - else - gMultiHitCounter =5; - } - else - { - // 2 and 3 hits: 37.5% - // 4 and 5 hits: 12.5% - gMultiHitCounter = Random() % 4; - if (gMultiHitCounter > 1) - gMultiHitCounter = (Random() % 4) + 2; - else - gMultiHitCounter += 2; - } + SetRandomMultiHitCounter(); } - PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) } else if (gBattleMoves[gCurrentMove].flags & FLAG_TWO_STRIKES) @@ -10518,3 +10492,35 @@ bool32 CanTargetBattler(u8 battlerAtk, u8 battlerDef, u16 move) return FALSE; // Pokémon affected by Heal Block cannot target allies with Pollen Puff return TRUE; } + +static void SetRandomMultiHitCounter() +{ + #if (B_MULTI_HIT_CHANCE >= GEN_5) + { + // Based on Gen 5's odds + // 35% for 2 hits + // 35% for 3 hits + // 15% for 4 hits + // 15% for 5 hits + gMultiHitCounter = Random() % 100; + if (gMultiHitCounter < 35) + gMultiHitCounter = 2; + else if (gMultiHitCounter < 35 + 35) + gMultiHitCounter = 3; + else if (gMultiHitCounter < 35 + 35 + 15) + gMultiHitCounter = 4; + else + gMultiHitCounter = 5; + } + #else + { + // 2 and 3 hits: 37.5% + // 4 and 5 hits: 12.5% + gMultiHitCounter = Random() % 4; + if (gMultiHitCounter > 1) + gMultiHitCounter = (Random() % 4) + 2; + else + gMultiHitCounter += 2; + } + #endif +} From a5ede1ee90084c9d74656de1f696cd1b417e5dee Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 23 Oct 2022 21:41:42 +1300 Subject: [PATCH 28/32] Move B_PARENTAL_BOND_DAMAGE to damage settings Title. --- 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 815d5ae6d..cf1d748a8 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -30,6 +30,7 @@ #define B_SPORT_DMG_REDUCTION GEN_LATEST // In Gen5+, Water/Mud Sport reduce Fire/Electric Damage by 67% instead of 50%. #define B_EXPLOSION_DEFENSE GEN_LATEST // In Gen5+, Self-Destruct and Explosion don't halve the targets' defense. #define B_BEAT_UP_DMG GEN_LATEST // In Gen5+, Beat Up uses a different formula to calculate the damage of each hit, and deals Dark-type damage. +#define B_PARENTAL_BOND_DAMAGE GEN_LATEST // In Gen7+, Parental Bond's second hit does 25% of the initial hits damage. Before, it did 50%. // Type settings #define B_GHOSTS_ESCAPE GEN_LATEST // In Gen6+, abilities like Shadow Tag or moves like Mean Look fail on Ghost-type Pokémon. They can also escape any Wild Battle. @@ -107,7 +108,6 @@ #define B_PLUS_MINUS_INTERACTION GEN_LATEST // In Gen5+, Plus and Minus can be activated with themselves and the opposite ability. Before, only the opposing ability could activate it. #define B_WEATHER_FORMS GEN_LATEST // In Gen5+, Castform and Cherrim revert to their base form upon losing their respective ability. Cherrim needs Flower Gift to swap forms. #define B_SYMBIOSIS_GEMS GEN_LATEST // In Gen7+, Symbiosis passes an item after a gem-boosted attack. Previously, items are passed before the gem-boosted attack hits, making the item effect apply. -#define B_PARENTAL_BOND_DAMAGE GEN_LATEST // In Gen7+, Parental Bond's second hit does 25% of the initial hits damage. Before, it did 50%. // Item settings #define B_HP_BERRIES GEN_LATEST // In Gen4+, berries which restore hp activate immediately after HP drops to half. In Gen3, the effect occurs at the end of the turn. From 7bca475d7775a44b61e3d178393693ed17567073 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 23 Oct 2022 21:48:20 +1300 Subject: [PATCH 29/32] Add Misty Explosion to Parental Bond ban list Probably not needed, but just in case! --- src/battle_script_commands.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 480b18a90..607ad5a13 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1047,6 +1047,7 @@ static const u8 sForbiddenMoves[MOVES_COUNT] = [MOVE_MIND_BLOWN] = FORBIDDEN_METRONOME, [MOVE_MIRROR_COAT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_MIRROR_MOVE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_MISTY_EXPLOSION] = FORBIDDEN_PARENTAL_BOND, [MOVE_MOONGEIST_BEAM] = FORBIDDEN_METRONOME, [MOVE_NATURE_POWER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [MOVE_NATURES_MADNESS] = FORBIDDEN_METRONOME, From d9cc98a4feef36d291c1ef1f0cd66a4677209e13 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Mon, 24 Oct 2022 22:19:35 +1300 Subject: [PATCH 30/32] Suggested changes - Various style fixes - Add BATTLE_ALIVE_EXCEPT_ATTACKER case to CountAliveMonsInBattle --- include/constants/pokemon.h | 7 ++--- src/battle_main.c | 2 +- src/battle_script_commands.c | 8 +++--- src/battle_util.c | 52 +++++++++++++++++------------------- src/pokemon.c | 7 +++++ 5 files changed, 39 insertions(+), 37 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 5167f5f55..514c2bd26 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -329,9 +329,10 @@ #define MON_PIC_HEIGHT 64 #define MON_PIC_SIZE (MON_PIC_WIDTH * MON_PIC_HEIGHT / 2) -#define BATTLE_ALIVE_EXCEPT_ACTIVE 0 -#define BATTLE_ALIVE_ATK_SIDE 1 -#define BATTLE_ALIVE_DEF_SIDE 2 +#define BATTLE_ALIVE_EXCEPT_ACTIVE 0 +#define BATTLE_ALIVE_ATK_SIDE 1 +#define BATTLE_ALIVE_DEF_SIDE 2 +#define BATTLE_ALIVE_EXCEPT_ATTACKER 3 #define SKIP_FRONT_ANIM (1 << 7) diff --git a/src/battle_main.c b/src/battle_main.c index b47085248..22de8440d 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4841,7 +4841,7 @@ static void TurnValuesCleanUp(bool8 var0) } if (gDisableStructs[gActiveBattler].substituteHP == 0) - gBattleMons[gActiveBattler].status2 &= ~(STATUS2_SUBSTITUTE); + gBattleMons[gActiveBattler].status2 &= ~STATUS2_SUBSTITUTE; gSpecialStatuses[gActiveBattler].parentalBondState = PARENTAL_BOND_OFF; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 607ad5a13..686a44d6e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1451,7 +1451,7 @@ static void Cmd_attackcanceler(void) if (AtkCanceller_UnableToUseMove()) return; - if (!gSpecialStatuses[gBattlerAttacker].parentalBondState + if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_OFF && GetBattlerAbility(gBattlerAttacker) == ABILITY_PARENTAL_BOND && IsMoveAffectedByParentalBond(gCurrentMove, gBattlerAttacker) && !(gAbsentBattlerFlags & gBitTable[gBattlerTarget]) @@ -14847,14 +14847,12 @@ bool8 IsMoveAffectedByParentalBond(u16 move, u8 battlerId) { // Both foes are alive, spread move strikes once case MOVE_TARGET_BOTH: - if (IsBattlerAlive(gBattlerTarget) && IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget))) + if (CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) >= 2) return FALSE; break; // Either both foes or one foe and its ally are alive; spread move strikes once case MOVE_TARGET_FOES_AND_ALLY: - if (IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget)) - || (IsBattlerAlive(BATTLE_PARTNER(battlerId)) - && (IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget)) || IsBattlerAlive(gBattlerTarget)))) + if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ATTACKER) >= 2) return FALSE; break; default: diff --git a/src/battle_util.c b/src/battle_util.c index 79a698eb7..385790b8c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10495,32 +10495,28 @@ bool32 CanTargetBattler(u8 battlerAtk, u8 battlerDef, u16 move) static void SetRandomMultiHitCounter() { - #if (B_MULTI_HIT_CHANCE >= GEN_5) - { - // Based on Gen 5's odds - // 35% for 2 hits - // 35% for 3 hits - // 15% for 4 hits - // 15% for 5 hits - gMultiHitCounter = Random() % 100; - if (gMultiHitCounter < 35) - gMultiHitCounter = 2; - else if (gMultiHitCounter < 35 + 35) - gMultiHitCounter = 3; - else if (gMultiHitCounter < 35 + 35 + 15) - gMultiHitCounter = 4; - else - gMultiHitCounter = 5; - } - #else - { - // 2 and 3 hits: 37.5% - // 4 and 5 hits: 12.5% - gMultiHitCounter = Random() % 4; - if (gMultiHitCounter > 1) - gMultiHitCounter = (Random() % 4) + 2; - else - gMultiHitCounter += 2; - } - #endif +#if (B_MULTI_HIT_CHANCE >= GEN_5) + // Based on Gen 5's odds + // 35% for 2 hits + // 35% for 3 hits + // 15% for 4 hits + // 15% for 5 hits + gMultiHitCounter = Random() % 100; + if (gMultiHitCounter < 35) + gMultiHitCounter = 2; + else if (gMultiHitCounter < 35 + 35) + gMultiHitCounter = 3; + else if (gMultiHitCounter < 35 + 35 + 15) + gMultiHitCounter = 4; + else + gMultiHitCounter = 5; +#else + // 2 and 3 hits: 37.5% + // 4 and 5 hits: 12.5% + gMultiHitCounter = Random() % 4; + if (gMultiHitCounter > 1) + gMultiHitCounter = (Random() % 4) + 2; + else + gMultiHitCounter += 2; +#endif } diff --git a/src/pokemon.c b/src/pokemon.c index 98ac99256..2d2f88972 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4238,6 +4238,13 @@ u8 CountAliveMonsInBattle(u8 caseId) retVal++; } break; + case BATTLE_ALIVE_EXCEPT_ATTACKER: + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (i != gBattlerAttacker && !(gAbsentBattlerFlags & gBitTable[i])) + retVal++; + } + break; } return retVal; From 3327758cdbb32d569b8c6338f19b57e9e7b3131d Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Wed, 26 Oct 2022 23:29:09 +1300 Subject: [PATCH 31/32] Move B_BEAT_UP_DMG to other move settings This is more of a mechanical change like gen 8's change to Teleport, so it should go in the same block of settings. --- 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 cf1d748a8..a83da731c 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -29,7 +29,6 @@ #define B_KNOCK_OFF_DMG GEN_LATEST // In Gen6+, Knock Off deals 50% more damage when knocking off an item. #define B_SPORT_DMG_REDUCTION GEN_LATEST // In Gen5+, Water/Mud Sport reduce Fire/Electric Damage by 67% instead of 50%. #define B_EXPLOSION_DEFENSE GEN_LATEST // In Gen5+, Self-Destruct and Explosion don't halve the targets' defense. -#define B_BEAT_UP_DMG GEN_LATEST // In Gen5+, Beat Up uses a different formula to calculate the damage of each hit, and deals Dark-type damage. #define B_PARENTAL_BOND_DAMAGE GEN_LATEST // In Gen7+, Parental Bond's second hit does 25% of the initial hits damage. Before, it did 50%. // Type settings @@ -91,6 +90,7 @@ #define B_ROOTED_GROUNDING GEN_LATEST // In Gen4+, Ingrain causes the affected Pokémon to become grounded. #define B_METRONOME_MOVES GEN_LATEST // This config will determine up to which generation will Metronome pull moves from. #define B_TELEPORT_BEHAVIOR GEN_LATEST // In Gen7+, starting with Pokémon LGPE, Teleport allows the user to swap out with another party member. +#define B_BEAT_UP_DMG GEN_LATEST // In Gen5+, Beat Up uses a different formula to calculate the damage of each hit, and deals Dark-type damage. // Ability settings #define B_EXPANDED_ABILITY_NAMES TRUE // If TRUE, ability names are increased from 12 characters to 16 characters. From 224ca256cedb668e5b368b7851925f12c52b5871 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Thu, 27 Oct 2022 22:25:33 +1300 Subject: [PATCH 32/32] Requested clean up Rename constants, remove white space, improve B_BEAT_UP description. * Rename B_BEAT_UP_DMG to B_BEAT_UP * Shorten B_PARENTAL_BOND_DAMAGE to B_PARENTAL_BOND_DMG * Remove trailing whitespace * Replace boolean 1 with TRUE in MOVEEND_MULTIHIT_MOVE --- data/battle_scripts_1.s | 2 +- include/battle.h | 2 +- include/constants/battle_config.h | 4 ++-- src/battle_script_commands.c | 4 ++-- src/battle_util.c | 6 +++--- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7e94460ef..61eca0c01 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5117,7 +5117,7 @@ BattleScript_EffectTeleportNew: BattleScript_EffectTeleportNewEnd: goto BattleScript_MoveEnd -.if B_BEAT_UP_DMG < GEN_5 +.if B_BEAT_UP < GEN_5 BattleScript_EffectBeatUp:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE diff --git a/include/battle.h b/include/battle.h index 8e9f6c300..5d9f57e43 100644 --- a/include/battle.h +++ b/include/battle.h @@ -168,7 +168,7 @@ struct SpecialStatus u8 sturdied:1; u8 stormDrainRedirected:1; u8 switchInAbilityDone:1; - u8 switchInItemDone:1; + u8 switchInItemDone:1; u8 instructedChosenTarget:3; // End of byte u8 berryReduced:1; diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index a83da731c..aee3b78a0 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -29,7 +29,7 @@ #define B_KNOCK_OFF_DMG GEN_LATEST // In Gen6+, Knock Off deals 50% more damage when knocking off an item. #define B_SPORT_DMG_REDUCTION GEN_LATEST // In Gen5+, Water/Mud Sport reduce Fire/Electric Damage by 67% instead of 50%. #define B_EXPLOSION_DEFENSE GEN_LATEST // In Gen5+, Self-Destruct and Explosion don't halve the targets' defense. -#define B_PARENTAL_BOND_DAMAGE GEN_LATEST // In Gen7+, Parental Bond's second hit does 25% of the initial hits damage. Before, it did 50%. +#define B_PARENTAL_BOND_DMG GEN_LATEST // In Gen7+, Parental Bond's second hit does 25% of the initial hits damage. Before, it did 50%. // Type settings #define B_GHOSTS_ESCAPE GEN_LATEST // In Gen6+, abilities like Shadow Tag or moves like Mean Look fail on Ghost-type Pokémon. They can also escape any Wild Battle. @@ -90,7 +90,7 @@ #define B_ROOTED_GROUNDING GEN_LATEST // In Gen4+, Ingrain causes the affected Pokémon to become grounded. #define B_METRONOME_MOVES GEN_LATEST // This config will determine up to which generation will Metronome pull moves from. #define B_TELEPORT_BEHAVIOR GEN_LATEST // In Gen7+, starting with Pokémon LGPE, Teleport allows the user to swap out with another party member. -#define B_BEAT_UP_DMG GEN_LATEST // In Gen5+, Beat Up uses a different formula to calculate the damage of each hit, and deals Dark-type damage. +#define B_BEAT_UP GEN_LATEST // In Gen5+, Beat Up uses a different formula to calculate its damage, and deals Dark-type damage. Prior to Gen 5, each hit also announces the party member's name. // Ability settings #define B_EXPANDED_ABILITY_NAMES TRUE // If TRUE, ability names are increased from 12 characters to 16 characters. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 686a44d6e..fd2129dbb 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5678,7 +5678,7 @@ static void Cmd_moveend(void) { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; - effect = 1; + effect = TRUE; } else { @@ -5711,7 +5711,7 @@ static void Cmd_moveend(void) { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; - effect = 1; + effect = TRUE; } } } diff --git a/src/battle_util.c b/src/battle_util.c index 385790b8c..033571ab0 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3887,7 +3887,7 @@ u8 AtkCanceller_UnableToUseMove(void) gMultiHitCounter = 3; PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) } - #if B_BEAT_UP_DMG >= GEN_5 + #if B_BEAT_UP >= GEN_5 else if (gBattleMoves[gCurrentMove].effect == EFFECT_BEAT_UP) { struct Pokemon* party; @@ -8487,7 +8487,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) basePower *= 2; break; case EFFECT_BEAT_UP: - #if B_BEAT_UP_DMG >= GEN_5 + #if B_BEAT_UP >= GEN_5 basePower = CalcBeatUpPower(); #endif break; @@ -9268,7 +9268,7 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move // Parental Bond Second Strike if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT) { - if (B_PARENTAL_BOND_DAMAGE < GEN_7) + if (B_PARENTAL_BOND_DMG < GEN_7) MulModifier(&finalModifier, UQ_4_12(0.5)); else MulModifier(&finalModifier, UQ_4_12(0.25));