From 0a0687ae78ea2e71bca8b9f6e44fccc6f1907aae Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 27 Jul 2021 09:49:39 -0600 Subject: [PATCH 001/105] add smart wild AI --- include/battle_main.h | 1 + include/constants/battle_config.h | 4 ++++ src/battle_ai_main.c | 28 ++++++++++++++++++++++++++++ src/battle_controller_opponent.c | 3 ++- src/battle_main.c | 5 +++++ 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/include/battle_main.h b/include/battle_main.h index bf95ca1568..aa2c4c6056 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -70,6 +70,7 @@ void RunBattleScriptCommands(void); bool8 TryRunFromBattle(u8 battlerId); void SpecialStatusesClear(void); void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk); +bool32 IsWildMonSmart(void); extern struct UnknownPokemonStruct4 gMultiPartnerParty[MULTI_PARTY_SIZE]; diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index bf31c77b3b..b6c8b98e99 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -153,6 +153,10 @@ #define B_CRITICAL_CAPTURE TRUE // If set to TRUE, Critical Capture will be enabled. #define B_CATCHING_CHARM_BOOST 20 // % boost in Critical Capture odds if player has the Catching Charm. +// AI Settings +#define B_SMART_WILD_AI_FLAG 0x1DE // If not 0, you can set this flag in a script to enable smart wild pokemon +#define B_VAR_WILD_AI_FLAGS 0x40F7 // If not 0, you can use this var to add to default wild AI flags. NOT usable with flags above (1 << 15) + // Other #define B_DOUBLE_WILD_CHANCE 0 // % chance of encountering two Pokémon in a Wild Encounter. #define B_SLEEP_TURNS GEN_7 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 81d97fcab6..8909afed40 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -7,6 +7,7 @@ #include "battle_factory.h" #include "battle_setup.h" #include "data.h" +#include "event_data.h" #include "item.h" #include "pokemon.h" #include "random.h" @@ -123,6 +124,29 @@ void BattleAI_SetupItems(void) } } +static u32 GetWildAiFlags(void) +{ + u8 avgLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL); + u32 flags; + + if (IsDoubleBattle()) + avgLevel = (GetMonData(&gEnemyParty[0], MON_DATA_LEVEL) + GetMonData(&gEnemyParty[1], MON_DATA_LEVEL)) / 2; + + if (avgLevel < 20) + flags |= AI_FLAG_CHECK_BAD_MOVE; + if (avgLevel < 40) + flags |= AI_FLAG_CHECK_VIABILITY; + if (avgLevel < 60) + flags |= AI_FLAG_PREFER_STRONGEST_MOVE; + if (avgLevel < 100) + flags |= AI_FLAG_HP_AWARE; + + if (B_VAR_WILD_AI_FLAGS != 0 && VarGet(B_VAR_WILD_AI_FLAGS) != 0) + flags |= VarGet(B_VAR_WILD_AI_FLAGS); + + return flags; +} + void BattleAI_SetupFlags(void) { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) @@ -141,6 +165,10 @@ void BattleAI_SetupFlags(void) AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags | gTrainers[gTrainerBattleOpponent_B].aiFlags; else AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags; + + // check smart wild AI + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER)) && IsWildMonSmart()) + AI_THINKING_STRUCT->aiFlags |= GetWildAiFlags(); if (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS) || gTrainers[gTrainerBattleOpponent_A].doubleBattle) AI_THINKING_STRUCT->aiFlags |= AI_FLAG_DOUBLE_BATTLE; // Act smart in doubles and don't attack your partner. diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 4eeef55c3d..fdd650754c 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -1558,7 +1558,8 @@ static void OpponentHandleChooseMove(void) u8 chosenMoveId; struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleResources->bufferA[gActiveBattler][4]); - if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER)) + if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER) + || IsWildMonSmart()) { BattleAI_SetupAIData(0xF); chosenMoveId = BattleAI_ChooseMoveOrAction(); diff --git a/src/battle_main.c b/src/battle_main.c index 94700bf969..bb376c6656 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5130,3 +5130,8 @@ void SetTotemBoost(void) } } } + +bool32 IsWildMonSmart(void) +{ + return (B_SMART_WILD_AI_FLAG != 0 && FlagGet(B_SMART_WILD_AI_FLAG)); +} From 3dcfc0fc12f7f3e0112887c2257dca441eefa715 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 27 Jul 2021 09:53:47 -0600 Subject: [PATCH 002/105] fix default wild ai flag logic --- src/battle_ai_main.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 8909afed40..56c50c0096 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -132,13 +132,12 @@ static u32 GetWildAiFlags(void) if (IsDoubleBattle()) avgLevel = (GetMonData(&gEnemyParty[0], MON_DATA_LEVEL) + GetMonData(&gEnemyParty[1], MON_DATA_LEVEL)) / 2; - if (avgLevel < 20) - flags |= AI_FLAG_CHECK_BAD_MOVE; - if (avgLevel < 40) + flags |= AI_FLAG_CHECK_BAD_MOVE; + if (avgLevel >= 20) flags |= AI_FLAG_CHECK_VIABILITY; - if (avgLevel < 60) + if (avgLevel >= 60) flags |= AI_FLAG_PREFER_STRONGEST_MOVE; - if (avgLevel < 100) + if (avgLevel >= 80) flags |= AI_FLAG_HP_AWARE; if (B_VAR_WILD_AI_FLAGS != 0 && VarGet(B_VAR_WILD_AI_FLAGS) != 0) From 10317033092d3b42dd9c8280563a50ddecd6add6 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 6 Oct 2021 16:00:02 -0400 Subject: [PATCH 003/105] magician base functionality --- data/battle_scripts_1.s | 6 ++++++ include/battle_scripts.h | 1 + src/battle_script_commands.c | 20 ++++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0615e12398..8118c4ff5f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8426,3 +8426,9 @@ BattleScript_DarkTypePreventsPrankster:: waitmessage B_WAIT_TIME_LONG orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT goto BattleScript_MoveEnd + +BattleScript_MagicianActivates:: + call BattleScript_AbilityPopUp + call BattleScript_ItemSteal + return + diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 203be65198..9e4c058ebd 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -389,5 +389,6 @@ extern const u8 BattleScript_DarkTypePreventsPrankster[]; extern const u8 BattleScript_GulpMissileGorging[]; extern const u8 BattleScript_GulpMissileGulping[]; extern const u8 BattleScript_BattleBondActivatesOnMoveEndAttacker[]; +extern const u8 BattleScript_MagicianActivates[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 12f7763e3f..04d636426f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5071,6 +5071,26 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; + case MOVEEND_MAGICIAN: + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_MAGICIAN + && gCurrentMove != MOVE_FLING && gCurrentMove != MOVE_NATURAL_GIFT + && gBattleMons[gBattlerAttacker].item == ITEM_NONE + && IsBattlerAlive(gBattlerAttacker) + && TARGET_TURN_DAMAGED + && CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) + && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove) + && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && (GetBattlerAbility(gBattlerTarget) != ABILITY_STICKY_HOLD || !IsBattlerAlive(gBattlerTarget))) + { + StealTargetItem(gBattlerAttacker, gBattlerTarget); + gBattleScripting.battler = gBattlerAbility = gBattlerAttacker; + gEffectBattler = gBattlerTarget; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MagicianActivates; + effect = TRUE; + } + gBattleScripting.moveendState++; + break; case MOVEEND_NEXT_TARGET: // For moves hitting two opposing Pokemon. // Set a flag if move hits either target (for throat spray that can't check damage) if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) From 9a4e0cf75744b4dba85a78ec3f4dac529bb387ea Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 7 Oct 2021 17:37:47 -0400 Subject: [PATCH 004/105] magician fixes, handle edge cases --- data/battle_scripts_1.s | 1 + include/constants/battle_script_commands.h | 19 ++++++++++--------- src/battle_script_commands.c | 3 +++ 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 8118c4ff5f..c1efe80d67 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1249,6 +1249,7 @@ BattleScript_EffectHitSwitchTarget: resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET, FALSE, NULL + moveendcase MOVEEND_MAGICIAN @ possibly others? jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted tryhitswitchtarget BattleScript_EffectHitSwitchTargetMoveEnd diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 1f0db2a732..a8e61ad10e 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -243,15 +243,16 @@ #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_MAGICIAN 21 // Occurs after final multi-hit strike, and after other items/abilities would activate +#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_PICKPOCKET 26 +#define MOVEEND_DANCER 27 +#define MOVEEND_EMERGENCY_EXIT 28 +#define MOVEEND_CLEAR_BITS 29 +#define MOVEEND_COUNT 30 // switch cases #define B_SWITCH_NORMAL 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 04d636426f..9f836f264a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5075,9 +5075,12 @@ static void Cmd_moveend(void) if (GetBattlerAbility(gBattlerAttacker) == ABILITY_MAGICIAN && gCurrentMove != MOVE_FLING && gCurrentMove != MOVE_NATURAL_GIFT && gBattleMons[gBattlerAttacker].item == ITEM_NONE + && gBattleMons[gBattlerTarget].item != ITEM_NONE && IsBattlerAlive(gBattlerAttacker) && TARGET_TURN_DAMAGED && CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) + && !gSpecialStatuses[gBattlerAttacker].gemBoost // In base game, gems are consumed after magician would activate. + && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerTarget)] & gBitTable[gBattlerPartyIndexes[gBattlerTarget]]) && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && (GetBattlerAbility(gBattlerTarget) != ABILITY_STICKY_HOLD || !IsBattlerAlive(gBattlerTarget))) From 2fe015e5ce686a5e4ffa6441d46907f849e830b9 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 13 Nov 2021 09:46:34 -0300 Subject: [PATCH 005/105] Implemented Fling --- asm/macros/battle_script.inc | 19 ++++ data/battle_scripts_1.s | 74 ++++++++++++++- include/constants/battle_config.h | 1 + include/constants/battle_script_commands.h | 4 + include/constants/battle_string_ids.h | 3 +- src/battle_message.c | 2 + src/battle_script_commands.c | 100 +++++++++++++++++++++ src/battle_util.c | 4 +- 8 files changed, 204 insertions(+), 3 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index a15dd459f5..c49c43d9c7 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1921,6 +1921,25 @@ various BS_ATTACKER, VARIOUS_SHELL_SIDE_ARM_CHECK .endm + .macro jumpifflingfails battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_FLING_FAILS + .4byte \ptr + .endm + + .macro jumpifholdeffect battler:req, holdEffet:req, ptr:req + various \battler, VARIOUS_JUMP_IF_HOLD_EFFECT + .byte \holdEffet + .4byte \ptr + .endm + + .macro curecertainstatuses battler:req + various \battler, VARIOUS_CURE_CERTAIN_STATUSES + .endm + + .macro tryresetnegativestatstages battler:req + various \battler, VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES + .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 ee859f0e03..dd90c9bf41 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -235,7 +235,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectDragonDance @ EFFECT_DRAGON_DANCE .4byte BattleScript_EffectCamouflage @ EFFECT_CAMOUFLAGE .4byte BattleScript_EffectHit @ EFFECT_PLEDGE - .4byte BattleScript_EffectHit @ EFFECT_FLING + .4byte BattleScript_EffectFling @ EFFECT_FLING .4byte BattleScript_EffectNaturalGift @ EFFECT_NATURAL_GIFT .4byte BattleScript_EffectWakeUpSlap @ EFFECT_WAKE_UP_SLAP .4byte BattleScript_EffectHit @ EFFECT_WRING_OUT @@ -404,6 +404,78 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectClangorousSoul @ EFFECT_CLANGOROUS_SOUL .4byte BattleScript_EffectHit @ EFFECT_BOLT_BEAK +BattleScript_EffectFling: + jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_MAGIC_ROOM, BattleScript_ButItFailed + jumpifability BS_ATTACKER, ABILITY_KLUTZ, BattleScript_ButItFailedAtkStringPpReduce + jumpifability BS_ATTACKER, ABILITY_UNNERVE, BattleScript_ButItFailedAtkStringPpReduce + jumpifflingfails BS_ATTACKER, BattleScript_ButItFailedAtkStringPpReduce + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + pause B_WAIT_TIME_SHORT + setlastuseditem BS_ATTACKER + printstring STRINGID_PKMNFLUNG + waitmessage B_WAIT_TIME_SHORT + ppreduce + critcalc + damagecalc + adjustdamage + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage B_WAIT_TIME_MED + resultmessage + waitmessage B_WAIT_TIME_MED +.if B_FLING_EMBARGO_ITEM <= GEN_4 + jumpifstatus3 BS_TARGET, STATUS3_EMBARGO, BattleScript_FlingEnd +.endif + jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_FLAME_ORB, BattleScript_FlingFlameOrb + jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_FLINCH, BattleScript_FlingFlinch + jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_LIGHT_BALL, BattleScript_FlingLightBall + jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_MENTAL_HERB, BattleScript_FlingMentalHerb + jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_POISON_POWER, BattleScript_FlingPoisonBarb + jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_TOXIC_ORB, BattleScript_FlingToxicOrb + jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_RESTORE_STATS, BattleScript_FlingWhiteHerb +BattleScript_FlingFlameOrb: + setmoveeffect MOVE_EFFECT_BURN + seteffectprimary + goto BattleScript_FlingEnd +BattleScript_FlingFlinch: + setmoveeffect MOVE_EFFECT_FLINCH + seteffectprimary + goto BattleScript_FlingEnd +BattleScript_FlingLightBall: + setmoveeffect MOVE_EFFECT_PARALYSIS + seteffectprimary + goto BattleScript_FlingEnd +BattleScript_FlingMentalHerb: + curecertainstatuses BS_TARGET + goto BattleScript_FlingEnd +BattleScript_FlingPoisonBarb: + setmoveeffect MOVE_EFFECT_POISON + seteffectprimary + goto BattleScript_FlingEnd +BattleScript_FlingToxicOrb: + setmoveeffect MOVE_EFFECT_TOXIC + seteffectprimary + goto BattleScript_FlingEnd +BattleScript_FlingWhiteHerb: + tryresetnegativestatstages BS_TARGET + swapattackerwithtarget + printstring STRINGID_PKMNSTATUSNORMAL + waitmessage B_WAIT_TIME_MED + swapattackerwithtarget + goto BattleScript_FlingEnd +BattleScript_FlingEnd: + tryfaintmon BS_TARGET, FALSE, NULL + removeitem BS_ATTACKER + goto BattleScript_MoveEnd + BattleScript_EffectShellSideArm: shellsidearmcheck setmoveeffect MOVE_EFFECT_POISON diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 8e72b2c99d..793bfacf70 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -137,6 +137,7 @@ #define B_KINGS_SHIELD_LOWER_ATK GEN_7 // In Gen7+, it lowers Atk by 1 stage instead of 2 of oponents that hit it. #define B_SPEED_BUFFING_RAPID_SPIN GEN_8 // In Gen8, Rapid Spin raises the user's Speed by 1 stage. #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_FLING_EMBARGO_ITEM GEN_7 // In Gen4, if a target is under the effects of Embargo, the user's item's hold effect doesn't activate. // Move accuracy settings #define B_TOXIC_NEVER_MISS GEN_7 // In Gen6+, if Toxic is used by a Poison-type Pokémon, it will never miss. diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 7ceb1d64bf..6ace7458ea 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -207,6 +207,10 @@ #define VARIOUS_CHECK_POLTERGEIST 134 #define VARIOUS_SET_OCTOLOCK 135 #define VARIOUS_CUT_1_3_HP_RAISE_STATS 136 +#define VARIOUS_JUMP_IF_FLING_FAILS 137 +#define VARIOUS_JUMP_IF_HOLD_EFFECT 138 +#define VARIOUS_CURE_CERTAIN_STATUSES 139 +#define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 140 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index d439e3e7f1..89d3be8b86 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -607,8 +607,9 @@ #define STRINGID_PKMNBECAMEWEAKERTOFIRE 604 #define STRINGID_ABOUTTOUSEPOLTERGEIST 605 #define STRINGID_CANTESCAPEBECAUSEOFCURRENTMOVE 606 +#define STRINGID_TARGETGOTOVERINFATUATION 607 -#define BATTLESTRINGS_COUNT 607 +#define BATTLESTRINGS_COUNT 608 // The below IDs are all indexes into battle message tables, // used to determine which of a set of messages to print. diff --git a/src/battle_message.c b/src/battle_message.c index 30af20a784..728870d690 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -733,9 +733,11 @@ static const u8 sText_CantEscapeDueToUsedMove[] = _("{B_ATK_NAME_WITH_PREFIX} ca static const u8 sText_PkmnBecameWeakerToFire[] = _("{B_DEF_NAME_WITH_PREFIX} became\nweaker to fire!"); static const u8 sText_PkmnAboutToBeAttackedByItsItem[] = _("{B_DEF_NAME_WITH_PREFIX} is about\nto be attacked by its {B_BUFF1}!"); static const u8 sText_CantEscapeBecauseOfCurrentMove[] = _("{B_DEF_NAME_WITH_PREFIX} can no longer escape\nbecause of {B_CURRENT_MOVE}!"); +static const u8 sText_TargetGotOverInfatuation[] =_("{B_DEF_NAME_WITH_PREFIX} got over\nits infatuation!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_TARGETGOTOVERINFATUATION - 12] = sText_TargetGotOverInfatuation, [STRINGID_BATTLERTYPECHANGEDTO - 12] = sText_BattlerTypeChangedTo, [STRINGID_PASTELVEILENTERS - 12] = sText_PastelVeilEnters, [STRINGID_PASTELVEILPROTECTED -12] = sText_PastelVeilProtected, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 3f9ba388f7..88c3af2f05 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9287,6 +9287,106 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; return; } + case VARIOUS_JUMP_IF_FLING_FAILS: + #ifdef ITEM_EXPANSION + if (!ItemId_GetFlingPower(gBattleMons[gActiveBattler].item)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else if (!CanBattlerGetOrLoseItem(gActiveBattler, gBattleMons[gActiveBattler].item)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + #else + if (!CanBattlerGetOrLoseItem(gActiveBattler, gBattleMons[gActiveBattler].item)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + #endif + else + gBattlescriptCurrInstr += 7; + return; + case VARIOUS_JUMP_IF_HOLD_EFFECT: + if (GetBattlerHoldEffect(gActiveBattler, TRUE) == gBattlescriptCurrInstr[3]) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 4); + else + gBattlescriptCurrInstr += 8; + return; + case VARIOUS_CURE_CERTAIN_STATUSES: + if (gBattleMons[gActiveBattler].status2 & STATUS2_INFATUATION) + { + gBattleMons[gActiveBattler].status2 &= ~(STATUS2_INFATUATION); + gBattleMons[gActiveBattler].status2 = 0; + BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status2); + MarkBattlerForControllerExec(gActiveBattler); + PrepareStringBattle(STRINGID_TARGETGOTOVERINFATUATION, gActiveBattler); + gBattleCommunication[MSG_DISPLAY] = 1; + } + else if (gBattleMons[gActiveBattler].status2 & STATUS2_TORMENT) + { + gBattleMons[gActiveBattler].status2 &= ~(STATUS2_TORMENT); + gBattleMons[gActiveBattler].status2 = 0; + BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status2); + MarkBattlerForControllerExec(gActiveBattler); + // Swap gBattlerTarget and gBattlerAttacker so STRINGID_BUFFERENDS works correctly + gActiveBattler = gBattlerAttacker; + gBattlerAttacker = gBattlerTarget; + gBattlerTarget = gActiveBattler; + gHitMarker |= HITMARKER_SWAP_ATTACKER_TARGET; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TORMENT); + PrepareStringBattle(STRINGID_BUFFERENDS, gActiveBattler); + gBattleCommunication[MSG_DISPLAY] = 1; + // Swap gBattlerTarget and gBattlerAttacker back + if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET) + gHitMarker &= ~(HITMARKER_SWAP_ATTACKER_TARGET); + } + else if (gDisableStructs[gActiveBattler].tauntTimer != 0) + { + gDisableStructs[gActiveBattler].tauntTimer = 0; + // Swap gBattlerTarget and gBattlerAttacker so STRINGID_BUFFERENDS works correctly + gActiveBattler = gBattlerAttacker; + gBattlerAttacker = gBattlerTarget; + gBattlerTarget = gActiveBattler; + gHitMarker |= HITMARKER_SWAP_ATTACKER_TARGET; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT); + PrepareStringBattle(STRINGID_BUFFERENDS, gActiveBattler); + gBattleCommunication[MSG_DISPLAY] = 1; + // Swap gBattlerTarget and gBattlerAttacker back + if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET) + gHitMarker &= ~(HITMARKER_SWAP_ATTACKER_TARGET); + } + else if (gDisableStructs[gActiveBattler].encoreTimer) + { + gDisableStructs[gActiveBattler].encoredMove = 0; + gDisableStructs[gActiveBattler].encoreTimer = 0; + // Swap gBattlerTarget and gBattlerAttacker so STRINGID_BUFFERENDS works correctly + gActiveBattler = gBattlerAttacker; + gBattlerAttacker = gBattlerTarget; + gBattlerTarget = gActiveBattler; + gHitMarker |= HITMARKER_SWAP_ATTACKER_TARGET; + PrepareStringBattle(STRINGID_PKMNENCOREENDED, gActiveBattler); + gBattleCommunication[MSG_DISPLAY] = 1; + // Swap gBattlerTarget and gBattlerAttacker back + if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET) + gHitMarker &= ~(HITMARKER_SWAP_ATTACKER_TARGET); + } + else if (gDisableStructs[gActiveBattler].disableTimer) + { + gDisableStructs[gActiveBattler].disabledMove = 0; + // Swap gBattlerTarget and gBattlerAttacker so STRINGID_BUFFERENDS works correctly + gActiveBattler = gBattlerAttacker; + gBattlerAttacker = gBattlerTarget; + gBattlerTarget = gActiveBattler; + gHitMarker |= HITMARKER_SWAP_ATTACKER_TARGET; + PrepareStringBattle(STRINGID_PKMNMOVEDISABLEDNOMORE, gBattlerTarget); + gBattleCommunication[MSG_DISPLAY] = 1; + // Swap gBattlerTarget and gBattlerAttacker back + if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET) + gHitMarker &= ~(HITMARKER_SWAP_ATTACKER_TARGET); + } + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 7); + return; + case VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES: + gActiveBattler = gBattlerTarget; + for (i = 0; i < NUM_BATTLE_STATS; i++) + if (gBattleMons[gActiveBattler].statStages[i] < DEFAULT_STAT_STAGE) + gBattleMons[gActiveBattler].statStages[i] = DEFAULT_STAT_STAGE; + gBattlescriptCurrInstr += 3; + return; } // End of switch (gBattlescriptCurrInstr[2]) gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index 18847b8cce..0c8ff91b92 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7693,7 +7693,9 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) // todo break; case EFFECT_FLING: - // todo: program Fling + Unburden interaction + #ifdef ITEM_EXPANSION + basePower = ItemId_GetFlingPower(gBattleMons[battlerAtk].item); + #endif break; case EFFECT_ERUPTION: basePower = gBattleMons[battlerAtk].hp * basePower / gBattleMons[battlerAtk].maxHP; From cbb6639f8d367fdf6a7addcb4e1d643074ad286c Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 13 Nov 2021 10:53:04 -0300 Subject: [PATCH 006/105] Fling tweaks -Updated and renamed VARIOUS_JUMP_IF_FLING_FAILS (now VARIOUS_JUMP_IF_NO_FLING_POWER) -Updated BattleScript_EffectFling following Smogon's description of Fling's effect. -Refactored BattleScript_FlingMentalHerb thanks to GetMentalHerbEffect -No need to define flingPower when its value is 0 -Forced the target to eat a berry that was flung at them by overwriting their item with the berry thrown and restoring their original item after its effect finishes. -Added a preproc config for Klutz. --- asm/macros/battle_script.inc | 33 ++- data/battle_scripts_1.s | 53 ++-- include/battle.h | 1 + include/constants/battle_config.h | 2 +- include/constants/battle_script_commands.h | 279 +++++++++++---------- src/battle_script_commands.c | 138 +++++----- 6 files changed, 269 insertions(+), 237 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index c49c43d9c7..282fbb3068 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1921,14 +1921,8 @@ various BS_ATTACKER, VARIOUS_SHELL_SIDE_ARM_CHECK .endm - .macro jumpifflingfails battler:req, ptr:req - various \battler, VARIOUS_JUMP_IF_FLING_FAILS - .4byte \ptr - .endm - - .macro jumpifholdeffect battler:req, holdEffet:req, ptr:req - various \battler, VARIOUS_JUMP_IF_HOLD_EFFECT - .byte \holdEffet + .macro jumpifnoflingpower battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_NO_FLING_POWER .4byte \ptr .endm @@ -1940,6 +1934,29 @@ various \battler, VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES .endm + .macro jumpiflastuseditemberry ptr:req + various BS_ATTACKER, VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY + .4byte \ptr + .endm + + .macro jumpiflastuseditemholdeffect battler:req, holdEffect:req, ptr:req + various \battler, VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT + .byte \holdEffect + .4byte \ptr + .endm + + .macro savebattleritem battler:req + various \battler, VARIOUS_SAVE_BATTLER_ITEM + .endm + + .macro restorebattleritem battler:req + various \battler, VARIOUS_RESTORE_BATTLER_ITEM + .endm + + .macro battleritemtolastuseditem battler:req + various \battler, VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM + .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 dd90c9bf41..c395d9f7b3 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -405,15 +405,18 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_BOLT_BEAK BattleScript_EffectFling: - jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_MAGIC_ROOM, BattleScript_ButItFailed + jumpifnoflingpower BS_ATTACKER, BattleScript_ButItFailedAtkStringPpReduce + jumpifstatus3 BS_ATTACKER, STATUS3_EMBARGO, BattleScript_ButItFailedAtkStringPpReduce + jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_MAGIC_ROOM, BattleScript_ButItFailedAtkStringPpReduce +.if B_KLUTZ_FLING_INTERACTION >= GEN_5 jumpifability BS_ATTACKER, ABILITY_KLUTZ, BattleScript_ButItFailedAtkStringPpReduce - jumpifability BS_ATTACKER, ABILITY_UNNERVE, BattleScript_ButItFailedAtkStringPpReduce - jumpifflingfails BS_ATTACKER, BattleScript_ButItFailedAtkStringPpReduce +.endif + setlastuseditem BS_ATTACKER + removeitem BS_ATTACKER attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring pause B_WAIT_TIME_SHORT - setlastuseditem BS_ATTACKER printstring STRINGID_PKMNFLUNG waitmessage B_WAIT_TIME_SHORT ppreduce @@ -431,16 +434,27 @@ BattleScript_EffectFling: waitmessage B_WAIT_TIME_MED resultmessage waitmessage B_WAIT_TIME_MED -.if B_FLING_EMBARGO_ITEM <= GEN_4 - jumpifstatus3 BS_TARGET, STATUS3_EMBARGO, BattleScript_FlingEnd -.endif - jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_FLAME_ORB, BattleScript_FlingFlameOrb - jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_FLINCH, BattleScript_FlingFlinch - jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_LIGHT_BALL, BattleScript_FlingLightBall - jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_MENTAL_HERB, BattleScript_FlingMentalHerb - jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_POISON_POWER, BattleScript_FlingPoisonBarb - jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_TOXIC_ORB, BattleScript_FlingToxicOrb - jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_RESTORE_STATS, BattleScript_FlingWhiteHerb + jumpiflastuseditemberry BattleScript_EffectFlingConsumeBerry + jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_FLAME_ORB, BattleScript_FlingFlameOrb + jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_FLINCH, BattleScript_FlingFlinch + jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_LIGHT_BALL, BattleScript_FlingLightBall + jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_MENTAL_HERB, BattleScript_FlingMentalHerb + jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_POISON_POWER, BattleScript_FlingPoisonBarb + jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_TOXIC_ORB, BattleScript_FlingToxicOrb + jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_RESTORE_STATS, BattleScript_FlingWhiteHerb +BattleScript_EffectFlingConsumeBerry: + savebattleritem BS_TARGET + battleritemtolastuseditem BS_TARGET + setbyte sBERRY_OVERRIDE, TRUE @ override the requirements for eating berries + orword gHitMarker, HITMARKER_NO_ANIMATIONS + consumeberry BS_TARGET + bicword gHitMarker, HITMARKER_NO_ANIMATIONS + setbyte sBERRY_OVERRIDE, FALSE + restorebattleritem BS_TARGET +BattleScript_FlingEnd: + tryfaintmon BS_TARGET, FALSE, NULL + goto BattleScript_MoveEnd + BattleScript_FlingFlameOrb: setmoveeffect MOVE_EFFECT_BURN seteffectprimary @@ -455,6 +469,13 @@ BattleScript_FlingLightBall: goto BattleScript_FlingEnd BattleScript_FlingMentalHerb: curecertainstatuses BS_TARGET + savetarget + copybyte gBattlerAttacker, gBattlerTarget + playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL + printfromtable gMentalHerbCureStringIds + waitmessage B_WAIT_TIME_LONG + updatestatusicon BS_ATTACKER + restoretarget goto BattleScript_FlingEnd BattleScript_FlingPoisonBarb: setmoveeffect MOVE_EFFECT_POISON @@ -471,10 +492,6 @@ BattleScript_FlingWhiteHerb: waitmessage B_WAIT_TIME_MED swapattackerwithtarget goto BattleScript_FlingEnd -BattleScript_FlingEnd: - tryfaintmon BS_TARGET, FALSE, NULL - removeitem BS_ATTACKER - goto BattleScript_MoveEnd BattleScript_EffectShellSideArm: shellsidearmcheck diff --git a/include/battle.h b/include/battle.h index f1262b128e..5035aa5a0d 100644 --- a/include/battle.h +++ b/include/battle.h @@ -302,6 +302,7 @@ struct BattleHistory u8 moveHistoryIndex[MAX_BATTLERS_COUNT]; u16 trainerItems[MAX_BATTLERS_COUNT]; u8 itemsNo; + u16 heldItems[MAX_BATTLERS_COUNT]; }; struct BattleScriptsStack diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 793bfacf70..310815d486 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -137,7 +137,7 @@ #define B_KINGS_SHIELD_LOWER_ATK GEN_7 // In Gen7+, it lowers Atk by 1 stage instead of 2 of oponents that hit it. #define B_SPEED_BUFFING_RAPID_SPIN GEN_8 // In Gen8, Rapid Spin raises the user's Speed by 1 stage. #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_FLING_EMBARGO_ITEM GEN_7 // In Gen4, if a target is under the effects of Embargo, the user's item's hold effect doesn't activate. +#define B_KLUTZ_FLING_INTERACTION GEN_7 // In Gen5+, Pokémon with the Klutz ability can't use Fling. // Move accuracy settings #define B_TOXIC_NEVER_MISS GEN_7 // In Gen6+, if Toxic is used by a Poison-type Pokémon, it will never miss. diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 6ace7458ea..e09fb0155d 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -74,143 +74,148 @@ #define CMP_NO_COMMON_BITS 5 // Cmd_various -#define VARIOUS_CANCEL_MULTI_TURN_MOVES 0 -#define VARIOUS_SET_MAGIC_COAT_TARGET 1 -#define VARIOUS_IS_RUNNING_IMPOSSIBLE 2 -#define VARIOUS_GET_MOVE_TARGET 3 -#define VARIOUS_GET_BATTLER_FAINTED 4 -#define VARIOUS_RESET_INTIMIDATE_TRACE_BITS 5 -#define VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP 6 -#define VARIOUS_PALACE_FLAVOR_TEXT 8 -#define VARIOUS_ARENA_JUDGMENT_WINDOW 9 -#define VARIOUS_ARENA_OPPONENT_MON_LOST 10 -#define VARIOUS_ARENA_PLAYER_MON_LOST 11 -#define VARIOUS_ARENA_BOTH_MONS_LOST 12 -#define VARIOUS_EMIT_YESNOBOX 13 -#define VARIOUS_ARENA_JUDGMENT_STRING 16 -#define VARIOUS_ARENA_WAIT_STRING 17 -#define VARIOUS_WAIT_CRY 18 -#define VARIOUS_RETURN_OPPONENT_MON1 19 -#define VARIOUS_RETURN_OPPONENT_MON2 20 -#define VARIOUS_VOLUME_DOWN 21 -#define VARIOUS_VOLUME_UP 22 -#define VARIOUS_SET_ALREADY_STATUS_MOVE_ATTEMPT 23 -#define VARIOUS_SET_TELEPORT_OUTCOME 25 -#define VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC 26 -#define VARIOUS_STAT_TEXT_BUFFER 27 -#define VARIOUS_SWITCHIN_ABILITIES 28 -#define VARIOUS_SAVE_TARGET 29 -#define VARIOUS_RESTORE_TARGET 30 -#define VARIOUS_INSTANT_HP_DROP 31 -#define VARIOUS_CLEAR_STATUS 32 -#define VARIOUS_RESTORE_PP 33 -#define VARIOUS_TRY_ACTIVATE_MOXIE 34 -#define VARIOUS_TRY_ACTIVATE_FELL_STINGER 35 -#define VARIOUS_PLAY_MOVE_ANIMATION 36 -#define VARIOUS_SET_LUCKY_CHANT 37 -#define VARIOUS_SUCKER_PUNCH_CHECK 38 -#define VARIOUS_SET_SIMPLE_BEAM 39 -#define VARIOUS_TRY_ENTRAINMENT 40 -#define VARIOUS_SET_LAST_USED_ABILITY 41 -#define VARIOUS_TRY_HEAL_PULSE 42 -#define VARIOUS_TRY_QUASH 43 -#define VARIOUS_INVERT_STAT_STAGES 44 -#define VARIOUS_SET_TERRAIN 45 -#define VARIOUS_TRY_ME_FIRST 46 -#define VARIOUS_JUMP_IF_BATTLE_END 47 -#define VARIOUS_TRY_ELECTRIFY 48 -#define VARIOUS_TRY_REFLECT_TYPE 49 -#define VARIOUS_TRY_SOAK 50 -#define VARIOUS_HANDLE_MEGA_EVO 51 -#define VARIOUS_TRY_LAST_RESORT 52 -#define VARIOUS_ARGUMENT_STATUS_EFFECT 53 -#define VARIOUS_TRY_HIT_SWITCH_TARGET 54 -#define VARIOUS_TRY_AUTOTOMIZE 55 -#define VARIOUS_TRY_COPYCAT 56 -#define VARIOUS_ABILITY_POPUP 57 -#define VARIOUS_DEFOG 58 -#define VARIOUS_JUMP_IF_TARGET_ALLY 59 -#define VARIOUS_TRY_SYNCHRONOISE 60 -#define VARIOUS_PSYCHO_SHIFT 61 -#define VARIOUS_CURE_STATUS 62 -#define VARIOUS_POWER_TRICK 63 -#define VARIOUS_AFTER_YOU 64 -#define VARIOUS_BESTOW 65 -#define VARIOUS_ARGUMENT_TO_MOVE_EFFECT 66 -#define VARIOUS_JUMP_IF_NOT_GROUNDED 67 -#define VARIOUS_HANDLE_TRAINER_SLIDE_MSG 68 -#define VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF 69 -#define VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON 70 -#define VARIOUS_SET_AURORA_VEIL 71 -#define VARIOUS_TRY_THIRD_TYPE 72 -#define VARIOUS_ACUPRESSURE 73 -#define VARIOUS_SET_POWDER 74 -#define VARIOUS_SPECTRAL_THIEF 75 -#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 76 -#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 77 -#define VARIOUS_JUMP_IF_ROAR_FAILS 78 -#define VARIOUS_TRY_INSTRUCT 79 -#define VARIOUS_JUMP_IF_NOT_BERRY 80 -#define VARIOUS_TRACE_ABILITY 81 -#define VARIOUS_UPDATE_NICK 82 -#define VARIOUS_TRY_ILLUSION_OFF 83 -#define VARIOUS_SET_SPRITEIGNORE0HP 84 -#define VARIOUS_HANDLE_FORM_CHANGE 85 -#define VARIOUS_GET_STAT_VALUE 86 -#define VARIOUS_JUMP_IF_FULL_HP 87 -#define VARIOUS_LOSE_TYPE 88 -#define VARIOUS_TRY_ACTIVATE_SOULHEART 89 -#define VARIOUS_TRY_ACTIVATE_RECEIVER 90 -#define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 91 -#define VARIOUS_TRY_FRISK 92 -#define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 93 -#define VARIOUS_TRY_FAIRY_LOCK 94 -#define VARIOUS_JUMP_IF_NO_ALLY 95 -#define VARIOUS_POISON_TYPE_IMMUNITY 96 -#define VARIOUS_JUMP_IF_NO_HOLD_EFFECT 97 -#define VARIOUS_INFATUATE_WITH_BATTLER 98 -#define VARIOUS_SET_LAST_USED_ITEM 99 -#define VARIOUS_PARALYZE_TYPE_IMMUNITY 100 -#define VARIOUS_JUMP_IF_ABSENT 101 -#define VARIOUS_DESTROY_ABILITY_POPUP 102 -#define VARIOUS_TOTEM_BOOST 103 -#define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 104 -#define VARIOUS_MOVEEND_ITEM_EFFECTS 105 -#define VARIOUS_TERRAIN_SEED 106 -#define VARIOUS_MAKE_INVISIBLE 107 -#define VARIOUS_ROOM_SERVICE 108 -#define VARIOUS_JUMP_IF_TERRAIN_AFFECTED 109 -#define VARIOUS_EERIE_SPELL_PP_REDUCE 110 -#define VARIOUS_JUMP_IF_TEAM_HEALTHY 111 -#define VARIOUS_TRY_HEAL_QUARTER_HP 112 -#define VARIOUS_REMOVE_TERRAIN 113 -#define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 114 -#define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 115 -#define VARIOUS_GET_ROTOTILLER_TARGETS 116 -#define VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED 117 -#define VARIOUS_TRY_ACTIVATE_BATTLE_BOND 118 -#define VARIOUS_CONSUME_BERRY 119 -#define VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL 120 -#define VARIOUS_HANDLE_PRIMAL_REVERSION 121 -#define VARIOUS_APPLY_PLASMA_FISTS 122 -#define VARIOUS_JUMP_IF_SPECIES 123 -#define VARIOUS_UPDATE_ABILITY_POPUP 124 -#define VARIOUS_JUMP_IF_WEATHER_AFFECTED 125 -#define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 126 -#define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 127 -#define VARIOUS_TRY_TO_APPLY_MIMICRY 128 -#define VARIOUS_PHOTON_GEYSER_CHECK 129 -#define VARIOUS_SHELL_SIDE_ARM_CHECK 130 -#define VARIOUS_TRY_NO_RETREAT 131 -#define VARIOUS_TRY_TAR_SHOT 132 -#define VARIOUS_CAN_TAR_SHOT_WORK 133 -#define VARIOUS_CHECK_POLTERGEIST 134 -#define VARIOUS_SET_OCTOLOCK 135 -#define VARIOUS_CUT_1_3_HP_RAISE_STATS 136 -#define VARIOUS_JUMP_IF_FLING_FAILS 137 -#define VARIOUS_JUMP_IF_HOLD_EFFECT 138 -#define VARIOUS_CURE_CERTAIN_STATUSES 139 -#define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 140 +#define VARIOUS_CANCEL_MULTI_TURN_MOVES 0 +#define VARIOUS_SET_MAGIC_COAT_TARGET 1 +#define VARIOUS_IS_RUNNING_IMPOSSIBLE 2 +#define VARIOUS_GET_MOVE_TARGET 3 +#define VARIOUS_GET_BATTLER_FAINTED 4 +#define VARIOUS_RESET_INTIMIDATE_TRACE_BITS 5 +#define VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP 6 +#define VARIOUS_PALACE_FLAVOR_TEXT 8 +#define VARIOUS_ARENA_JUDGMENT_WINDOW 9 +#define VARIOUS_ARENA_OPPONENT_MON_LOST 10 +#define VARIOUS_ARENA_PLAYER_MON_LOST 11 +#define VARIOUS_ARENA_BOTH_MONS_LOST 12 +#define VARIOUS_EMIT_YESNOBOX 13 +#define VARIOUS_ARENA_JUDGMENT_STRING 16 +#define VARIOUS_ARENA_WAIT_STRING 17 +#define VARIOUS_WAIT_CRY 18 +#define VARIOUS_RETURN_OPPONENT_MON1 19 +#define VARIOUS_RETURN_OPPONENT_MON2 20 +#define VARIOUS_VOLUME_DOWN 21 +#define VARIOUS_VOLUME_UP 22 +#define VARIOUS_SET_ALREADY_STATUS_MOVE_ATTEMPT 23 +#define VARIOUS_SET_TELEPORT_OUTCOME 25 +#define VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC 26 +#define VARIOUS_STAT_TEXT_BUFFER 27 +#define VARIOUS_SWITCHIN_ABILITIES 28 +#define VARIOUS_SAVE_TARGET 29 +#define VARIOUS_RESTORE_TARGET 30 +#define VARIOUS_INSTANT_HP_DROP 31 +#define VARIOUS_CLEAR_STATUS 32 +#define VARIOUS_RESTORE_PP 33 +#define VARIOUS_TRY_ACTIVATE_MOXIE 34 +#define VARIOUS_TRY_ACTIVATE_FELL_STINGER 35 +#define VARIOUS_PLAY_MOVE_ANIMATION 36 +#define VARIOUS_SET_LUCKY_CHANT 37 +#define VARIOUS_SUCKER_PUNCH_CHECK 38 +#define VARIOUS_SET_SIMPLE_BEAM 39 +#define VARIOUS_TRY_ENTRAINMENT 40 +#define VARIOUS_SET_LAST_USED_ABILITY 41 +#define VARIOUS_TRY_HEAL_PULSE 42 +#define VARIOUS_TRY_QUASH 43 +#define VARIOUS_INVERT_STAT_STAGES 44 +#define VARIOUS_SET_TERRAIN 45 +#define VARIOUS_TRY_ME_FIRST 46 +#define VARIOUS_JUMP_IF_BATTLE_END 47 +#define VARIOUS_TRY_ELECTRIFY 48 +#define VARIOUS_TRY_REFLECT_TYPE 49 +#define VARIOUS_TRY_SOAK 50 +#define VARIOUS_HANDLE_MEGA_EVO 51 +#define VARIOUS_TRY_LAST_RESORT 52 +#define VARIOUS_ARGUMENT_STATUS_EFFECT 53 +#define VARIOUS_TRY_HIT_SWITCH_TARGET 54 +#define VARIOUS_TRY_AUTOTOMIZE 55 +#define VARIOUS_TRY_COPYCAT 56 +#define VARIOUS_ABILITY_POPUP 57 +#define VARIOUS_DEFOG 58 +#define VARIOUS_JUMP_IF_TARGET_ALLY 59 +#define VARIOUS_TRY_SYNCHRONOISE 60 +#define VARIOUS_PSYCHO_SHIFT 61 +#define VARIOUS_CURE_STATUS 62 +#define VARIOUS_POWER_TRICK 63 +#define VARIOUS_AFTER_YOU 64 +#define VARIOUS_BESTOW 65 +#define VARIOUS_ARGUMENT_TO_MOVE_EFFECT 66 +#define VARIOUS_JUMP_IF_NOT_GROUNDED 67 +#define VARIOUS_HANDLE_TRAINER_SLIDE_MSG 68 +#define VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF 69 +#define VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON 70 +#define VARIOUS_SET_AURORA_VEIL 71 +#define VARIOUS_TRY_THIRD_TYPE 72 +#define VARIOUS_ACUPRESSURE 73 +#define VARIOUS_SET_POWDER 74 +#define VARIOUS_SPECTRAL_THIEF 75 +#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 76 +#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 77 +#define VARIOUS_JUMP_IF_ROAR_FAILS 78 +#define VARIOUS_TRY_INSTRUCT 79 +#define VARIOUS_JUMP_IF_NOT_BERRY 80 +#define VARIOUS_TRACE_ABILITY 81 +#define VARIOUS_UPDATE_NICK 82 +#define VARIOUS_TRY_ILLUSION_OFF 83 +#define VARIOUS_SET_SPRITEIGNORE0HP 84 +#define VARIOUS_HANDLE_FORM_CHANGE 85 +#define VARIOUS_GET_STAT_VALUE 86 +#define VARIOUS_JUMP_IF_FULL_HP 87 +#define VARIOUS_LOSE_TYPE 88 +#define VARIOUS_TRY_ACTIVATE_SOULHEART 89 +#define VARIOUS_TRY_ACTIVATE_RECEIVER 90 +#define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 91 +#define VARIOUS_TRY_FRISK 92 +#define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 93 +#define VARIOUS_TRY_FAIRY_LOCK 94 +#define VARIOUS_JUMP_IF_NO_ALLY 95 +#define VARIOUS_POISON_TYPE_IMMUNITY 96 +#define VARIOUS_JUMP_IF_NO_HOLD_EFFECT 97 +#define VARIOUS_INFATUATE_WITH_BATTLER 98 +#define VARIOUS_SET_LAST_USED_ITEM 99 +#define VARIOUS_PARALYZE_TYPE_IMMUNITY 100 +#define VARIOUS_JUMP_IF_ABSENT 101 +#define VARIOUS_DESTROY_ABILITY_POPUP 102 +#define VARIOUS_TOTEM_BOOST 103 +#define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 104 +#define VARIOUS_MOVEEND_ITEM_EFFECTS 105 +#define VARIOUS_TERRAIN_SEED 106 +#define VARIOUS_MAKE_INVISIBLE 107 +#define VARIOUS_ROOM_SERVICE 108 +#define VARIOUS_JUMP_IF_TERRAIN_AFFECTED 109 +#define VARIOUS_EERIE_SPELL_PP_REDUCE 110 +#define VARIOUS_JUMP_IF_TEAM_HEALTHY 111 +#define VARIOUS_TRY_HEAL_QUARTER_HP 112 +#define VARIOUS_REMOVE_TERRAIN 113 +#define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 114 +#define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 115 +#define VARIOUS_GET_ROTOTILLER_TARGETS 116 +#define VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED 117 +#define VARIOUS_TRY_ACTIVATE_BATTLE_BOND 118 +#define VARIOUS_CONSUME_BERRY 119 +#define VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL 120 +#define VARIOUS_HANDLE_PRIMAL_REVERSION 121 +#define VARIOUS_APPLY_PLASMA_FISTS 122 +#define VARIOUS_JUMP_IF_SPECIES 123 +#define VARIOUS_UPDATE_ABILITY_POPUP 124 +#define VARIOUS_JUMP_IF_WEATHER_AFFECTED 125 +#define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 126 +#define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 127 +#define VARIOUS_TRY_TO_APPLY_MIMICRY 128 +#define VARIOUS_PHOTON_GEYSER_CHECK 129 +#define VARIOUS_SHELL_SIDE_ARM_CHECK 130 +#define VARIOUS_TRY_NO_RETREAT 131 +#define VARIOUS_TRY_TAR_SHOT 132 +#define VARIOUS_CAN_TAR_SHOT_WORK 133 +#define VARIOUS_CHECK_POLTERGEIST 134 +#define VARIOUS_SET_OCTOLOCK 135 +#define VARIOUS_CUT_1_3_HP_RAISE_STATS 136 +#define VARIOUS_JUMP_IF_NO_FLING_POWER 137 +#define VARIOUS_JUMP_IF_HOLD_EFFECT 138 +#define VARIOUS_CURE_CERTAIN_STATUSES 139 +#define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 140 +#define VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY 141 +#define VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT 142 +#define VARIOUS_SAVE_BATTLER_ITEM 143 +#define VARIOUS_RESTORE_BATTLER_ITEM 144 +#define VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM 145 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 88c3af2f05..83daafb29f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1414,6 +1414,19 @@ static void Cmd_attackcanceler(void) GET_MOVE_TYPE(gCurrentMove, moveType); + // Unnerve prevents a Pokémon holding a Berry from using Fling. + if (gCurrentMove == MOVE_FLING + && GetBattlerAbility(gBattlerAttacker) == ABILITY_UNNERVE + && ItemId_GetPocket(gLastUsedItem) == POCKET_BERRIES) + { + // Fling removes the item just before attackcanceler kicks in. + // This is done to work around an opponent using Protect/Detect. + gBattleMons[gBattlerAttacker].item = gLastUsedItem; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ButItFailedAtkStringPpReduce; + return; + } + if (moveType == TYPE_FIRE && (gBattleWeather & WEATHER_RAIN_PRIMAL) && WEATHER_HAS_EFFECT @@ -9287,98 +9300,56 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; return; } - case VARIOUS_JUMP_IF_FLING_FAILS: + case VARIOUS_JUMP_IF_NO_FLING_POWER: #ifdef ITEM_EXPANSION if (!ItemId_GetFlingPower(gBattleMons[gActiveBattler].item)) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); - else if (!CanBattlerGetOrLoseItem(gActiveBattler, gBattleMons[gActiveBattler].item)) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); - #else - if (!CanBattlerGetOrLoseItem(gActiveBattler, gBattleMons[gActiveBattler].item)) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); - #endif else + #endif gBattlescriptCurrInstr += 7; return; - case VARIOUS_JUMP_IF_HOLD_EFFECT: - if (GetBattlerHoldEffect(gActiveBattler, TRUE) == gBattlescriptCurrInstr[3]) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 4); - else - gBattlescriptCurrInstr += 8; - return; case VARIOUS_CURE_CERTAIN_STATUSES: + // Check infatuation if (gBattleMons[gActiveBattler].status2 & STATUS2_INFATUATION) { gBattleMons[gActiveBattler].status2 &= ~(STATUS2_INFATUATION); - gBattleMons[gActiveBattler].status2 = 0; - BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status2); - MarkBattlerForControllerExec(gActiveBattler); - PrepareStringBattle(STRINGID_TARGETGOTOVERINFATUATION, gActiveBattler); - gBattleCommunication[MSG_DISPLAY] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_INFATUATION; // STRINGID_TARGETGOTOVERINFATUATION + StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); } - else if (gBattleMons[gActiveBattler].status2 & STATUS2_TORMENT) + // Check taunt + if (gDisableStructs[gActiveBattler].tauntTimer != 0) { - gBattleMons[gActiveBattler].status2 &= ~(STATUS2_TORMENT); - gBattleMons[gActiveBattler].status2 = 0; - BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status2); - MarkBattlerForControllerExec(gActiveBattler); - // Swap gBattlerTarget and gBattlerAttacker so STRINGID_BUFFERENDS works correctly - gActiveBattler = gBattlerAttacker; - gBattlerAttacker = gBattlerTarget; - gBattlerTarget = gActiveBattler; - gHitMarker |= HITMARKER_SWAP_ATTACKER_TARGET; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TORMENT); - PrepareStringBattle(STRINGID_BUFFERENDS, gActiveBattler); - gBattleCommunication[MSG_DISPLAY] = 1; - // Swap gBattlerTarget and gBattlerAttacker back - if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET) - gHitMarker &= ~(HITMARKER_SWAP_ATTACKER_TARGET); - } - else if (gDisableStructs[gActiveBattler].tauntTimer != 0) - { - gDisableStructs[gActiveBattler].tauntTimer = 0; - // Swap gBattlerTarget and gBattlerAttacker so STRINGID_BUFFERENDS works correctly - gActiveBattler = gBattlerAttacker; - gBattlerAttacker = gBattlerTarget; - gBattlerTarget = gActiveBattler; - gHitMarker |= HITMARKER_SWAP_ATTACKER_TARGET; + gDisableStructs[gActiveBattler].tauntTimer = gDisableStructs[gActiveBattler].tauntTimer2 = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TAUNT; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT); - PrepareStringBattle(STRINGID_BUFFERENDS, gActiveBattler); - gBattleCommunication[MSG_DISPLAY] = 1; - // Swap gBattlerTarget and gBattlerAttacker back - if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET) - gHitMarker &= ~(HITMARKER_SWAP_ATTACKER_TARGET); } - else if (gDisableStructs[gActiveBattler].encoreTimer) + // Check encore + if (gDisableStructs[gActiveBattler].encoreTimer != 0) { gDisableStructs[gActiveBattler].encoredMove = 0; - gDisableStructs[gActiveBattler].encoreTimer = 0; - // Swap gBattlerTarget and gBattlerAttacker so STRINGID_BUFFERENDS works correctly - gActiveBattler = gBattlerAttacker; - gBattlerAttacker = gBattlerTarget; - gBattlerTarget = gActiveBattler; - gHitMarker |= HITMARKER_SWAP_ATTACKER_TARGET; - PrepareStringBattle(STRINGID_PKMNENCOREENDED, gActiveBattler); - gBattleCommunication[MSG_DISPLAY] = 1; - // Swap gBattlerTarget and gBattlerAttacker back - if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET) - gHitMarker &= ~(HITMARKER_SWAP_ATTACKER_TARGET); + gDisableStructs[gActiveBattler].encoreTimerStartValue = gDisableStructs[gActiveBattler].encoreTimer = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_ENCORE; // STRINGID_PKMNENCOREENDED } - else if (gDisableStructs[gActiveBattler].disableTimer) + // Check torment + if (gBattleMons[gActiveBattler].status2 & STATUS2_TORMENT) { - gDisableStructs[gActiveBattler].disabledMove = 0; - // Swap gBattlerTarget and gBattlerAttacker so STRINGID_BUFFERENDS works correctly - gActiveBattler = gBattlerAttacker; - gBattlerAttacker = gBattlerTarget; - gBattlerTarget = gActiveBattler; - gHitMarker |= HITMARKER_SWAP_ATTACKER_TARGET; - PrepareStringBattle(STRINGID_PKMNMOVEDISABLEDNOMORE, gBattlerTarget); - gBattleCommunication[MSG_DISPLAY] = 1; - // Swap gBattlerTarget and gBattlerAttacker back - if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET) - gHitMarker &= ~(HITMARKER_SWAP_ATTACKER_TARGET); + gBattleMons[gActiveBattler].status2 &= ~(STATUS2_TORMENT); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TORMENT; } - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 7); + // Check heal block + if (gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK) + { + gStatuses3[gActiveBattler] &= ~(STATUS3_HEAL_BLOCK); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_HEALBLOCK; + } + // Check disable + if (gDisableStructs[gActiveBattler].disableTimer != 0) + { + gDisableStructs[gActiveBattler].disableTimer = gDisableStructs[gActiveBattler].disableTimerStartValue = 0; + gDisableStructs[gActiveBattler].disabledMove = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_DISABLE; + } + gBattlescriptCurrInstr += 3; return; case VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES: gActiveBattler = gBattlerTarget; @@ -9387,6 +9358,27 @@ static void Cmd_various(void) gBattleMons[gActiveBattler].statStages[i] = DEFAULT_STAT_STAGE; gBattlescriptCurrInstr += 3; return; + case VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY: + if (ItemId_GetPocket(gLastUsedItem) == POCKET_BERRIES) + gBattlescriptCurrInstr += 7; + else + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + return; + case VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT: + if (ItemId_GetHoldEffect(gLastUsedItem) == gBattlescriptCurrInstr[3]) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 4); + else + gBattlescriptCurrInstr += 8; + return; + case VARIOUS_SAVE_BATTLER_ITEM: + gBattleResources->battleHistory->heldItems[gActiveBattler] = gBattleMons[gActiveBattler].item; + break; + case VARIOUS_RESTORE_BATTLER_ITEM: + gBattleMons[gActiveBattler].item = gBattleResources->battleHistory->heldItems[gActiveBattler]; + break; + case VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM: + gBattleMons[gActiveBattler].item = gLastUsedItem; + break; } // End of switch (gBattlescriptCurrInstr[2]) gBattlescriptCurrInstr += 3; From de7417796699a11f083b795b66063817ef9d30b7 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 15 Nov 2021 12:52:05 -0300 Subject: [PATCH 007/105] Oops --- include/constants/battle_string_ids.h | 3 +-- src/battle_message.c | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 6abfe20ff8..7846fa5218 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -609,9 +609,8 @@ #define STRINGID_CANTESCAPEBECAUSEOFCURRENTMOVE 606 #define STRINGID_NEUTRALIZINGGASENTERS 607 #define STRINGID_NEUTRALIZINGGASOVER 608 -#define STRINGID_TARGETGOTOVERINFATUATION 609 -#define BATTLESTRINGS_COUNT 610 +#define BATTLESTRINGS_COUNT 609 // The below IDs are all indexes into battle message tables, // used to determine which of a set of messages to print. diff --git a/src/battle_message.c b/src/battle_message.c index 1da9b61038..d64d02f902 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -735,11 +735,9 @@ static const u8 sText_PkmnAboutToBeAttackedByItsItem[] = _("{B_DEF_NAME_WITH_PRE static const u8 sText_CantEscapeBecauseOfCurrentMove[] = _("{B_DEF_NAME_WITH_PREFIX} can no longer escape\nbecause of {B_CURRENT_MOVE}!"); static const u8 sText_NeutralizingGasEnters[] = _("Neutralizing Gas filled the area!"); static const u8 sText_NeutralizingGasOver[] = _("The effects of Neutralizing\nGas wore off!"); -static const u8 sText_TargetGotOverInfatuation[] =_("{B_DEF_NAME_WITH_PREFIX} got over\nits infatuation!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { - [STRINGID_TARGETGOTOVERINFATUATION - 12] = sText_TargetGotOverInfatuation, [STRINGID_NEUTRALIZINGGASOVER - 12] = sText_NeutralizingGasOver, [STRINGID_NEUTRALIZINGGASENTERS - 12] = sText_NeutralizingGasEnters, [STRINGID_BATTLERTYPECHANGEDTO - 12] = sText_BattlerTypeChangedTo, From 5c485d9769d262dc16c01275524279cfd2fb3079 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 15 Nov 2021 14:02:33 -0300 Subject: [PATCH 008/105] Fixed Fling when gLastUsedItem is 0 Also renamed VARIOUS_JUMP_IF_NO_FLING_POWER to VARIOUS_JUMP_IF_FLING_FAILS. --- asm/macros/battle_script.inc | 4 ++-- data/battle_scripts_1.s | 2 +- include/constants/battle_script_commands.h | 2 +- src/battle_script_commands.c | 8 ++++++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 3999da4fcc..fef12b4d5c 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1925,8 +1925,8 @@ various BS_ATTACKER, VARIOUS_SHELL_SIDE_ARM_CHECK .endm - .macro jumpifnoflingpower battler:req, ptr:req - various \battler, VARIOUS_JUMP_IF_NO_FLING_POWER + .macro jumpifflingfails battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_FLING_FAILS .4byte \ptr .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 2019fe3883..c7d53ee551 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -405,7 +405,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_BOLT_BEAK BattleScript_EffectFling: - jumpifnoflingpower BS_ATTACKER, BattleScript_ButItFailedAtkStringPpReduce + jumpifflingfails BS_ATTACKER, BattleScript_ButItFailedAtkStringPpReduce jumpifstatus3 BS_ATTACKER, STATUS3_EMBARGO, BattleScript_ButItFailedAtkStringPpReduce jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_MAGIC_ROOM, BattleScript_ButItFailedAtkStringPpReduce .if B_KLUTZ_FLING_INTERACTION >= GEN_5 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 6f3620f574..0dd3fb0235 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -208,7 +208,7 @@ #define VARIOUS_SET_OCTOLOCK 135 #define VARIOUS_CUT_1_3_HP_RAISE_STATS 136 #define VARIOUS_TRY_END_NEUTRALIZING_GAS 137 -#define VARIOUS_JUMP_IF_NO_FLING_POWER 138 +#define VARIOUS_JUMP_IF_FLING_FAILS 138 #define VARIOUS_JUMP_IF_HOLD_EFFECT 139 #define VARIOUS_CURE_CERTAIN_STATUSES 140 #define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 141 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1cad382a8b..742bfdd76d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9285,12 +9285,16 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; return; } - case VARIOUS_JUMP_IF_NO_FLING_POWER: + case VARIOUS_JUMP_IF_FLING_FAILS: #ifdef ITEM_EXPANSION if (!ItemId_GetFlingPower(gBattleMons[gActiveBattler].item)) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); - else + else if (gLastUsedItem == ITEM_NONE) + #else + if (gLastUsedItem == ITEM_NONE) #endif + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else gBattlescriptCurrInstr += 7; return; case VARIOUS_CURE_CERTAIN_STATUSES: From c2f81cd5f52a7a0da113b33d4b5e4029b04c1d01 Mon Sep 17 00:00:00 2001 From: W1serV1ser <1prefertheaircauseimanairnomad@gmail.com> Date: Sat, 20 Nov 2021 11:44:48 -0800 Subject: [PATCH 009/105] Added Sky Drop --- asm/macros/battle_script.inc | 22 +++ data/battle_scripts_1.s | 65 ++++++++- include/battle.h | 1 + include/constants/battle.h | 5 +- include/constants/battle_move_effects.h | 3 +- include/constants/battle_script_commands.h | 29 ++-- include/constants/battle_string_ids.h | 39 +++--- src/battle_ai_switch_items.c | 4 +- src/battle_main.c | 66 ++++++++- src/battle_message.c | 5 + src/battle_script_commands.c | 154 +++++++++++++++++++-- src/battle_util.c | 140 ++++++++++++++++++- src/data/battle_moves.h | 2 +- 13 files changed, 484 insertions(+), 51 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 6ba63f916f..4ef2168fbf 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -2055,3 +2055,25 @@ 1: .endm + @ Will jump to script pointer if the target weighs less than 200 kg, or 441 lbs. + .macro jumpifunder200 battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_UNDER_200 + .4byte \ptr + .endm + + @ Sets the sky drop status and does all other necessary operations + .macro setskydrop + various 0, VARIOUS_SET_SKY_DROP + .endm + + @ Clears the sky drop status and does all other necessary operations. + @ If the target fainted in before this script is called, it goes to the given script. + .macro clearskydrop ptr:req + various 0, VARIOUS_CLEAR_SKY_DROP + .4byte \ptr + .endm + + @ Accounts for if the target of Sky Drop was in confuse_lock when the attacker falls asleep due to Yawn. + .macro skydropyawn + various 0, VARIOUS_SKY_DROP_YAWN + .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e9d019e430..39f184ed8d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -374,7 +374,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectJungleHealing @ EFFECT_JUNGLE_HEALING .4byte BattleScript_EffectCoaching @ EFFECT_COACHING .4byte BattleScript_EffectHit @ EFFECT_LASH_OUT - .4byte BattleScript_EffectHit @ EFFECT_GRASSY_GLIDE + .4byte BattleScript_EffectHit @ EFFECT_GRASSY_GLIDE .4byte BattleScript_EffectRemoveTerrain @ EFFECT_REMOVE_TERRAIN .4byte BattleScript_EffectHit @ EFFECT_DYNAMAX_DOUBLE_DMG .4byte BattleScript_EffectDecorate @ EFFECT_DECORATE @@ -403,6 +403,65 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectOctolock @ EFFECT_OCTOLOCK .4byte BattleScript_EffectClangorousSoul @ EFFECT_CLANGOROUS_SOUL .4byte BattleScript_EffectHit @ EFFECT_BOLT_BEAK + .4byte BattleScript_EffectSkyDrop @ EFFECT_SKY_DROP + +BattleScript_EffectSkyDrop: + jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_SkyDropTurn2 + attackcanceler + ppreduce + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + jumpifsubstituteblocks BattleScript_ButItFailed + jumpiftargetally BattleScript_ButItFailed + jumpifunder200 BS_TARGET, BattleScript_SkyDropWork + pause B_WAIT_TIME_SHORT + printstring STRINGID_TARGETTOOHEAVY + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd + +BattleScript_SkyDropWork: + setskydrop + setbyte sTWOTURN_STRINGID, B_MSG_TURN1_SKY_DROP + setsemiinvulnerablebit + call BattleScriptFirstChargingTurnAfterAttackString + goto BattleScript_MoveEnd +BattleScript_SkyDropTurn2: + attackcanceler + setmoveeffect MOVE_EFFECT_CHARGING + setbyte sB_ANIM_TURN, 0x1 + clearstatusfromeffect BS_ATTACKER + orword gHitMarker, HITMARKER_NO_PPDEDUCT + argumenttomoveeffect + clearsemiinvulnerablebit + attackstring + clearskydrop BattleScript_SkyDropChangedTarget + jumpiftype BS_TARGET, TYPE_FLYING, BattleScript_SkyDropFlyingType + goto BattleScript_HitFromCritCalc +BattleScript_SkyDropFlyingType: + makevisible BS_TARGET + printstring STRINGID_ITDOESNTAFFECT + waitmessage B_WAIT_TIME_LONG + makevisible BS_ATTACKER + jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_SkyDropFlyingAlreadyConfused + jumpifstatus2 BS_TARGET, STATUS2_LOCK_CONFUSE, BattleScript_SkyDropFlyingConfuseLock + goto BattleScript_MoveEnd +BattleScript_SkyDropChangedTarget: + pause B_WAIT_TIME_SHORT + orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + resultmessage + waitmessage B_WAIT_TIME_LONG + makevisible BS_ATTACKER + goto BattleScript_MoveEnd + +BattleScript_SkyDropFlyingConfuseLock: + setmoveeffect MOVE_EFFECT_CONFUSION + seteffectprimary +BattleScript_SkyDropFlyingAlreadyConfused: + setmoveeffect MOVE_EFFECT_THRASH + clearstatusfromeffect BS_TARGET + jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_MoveEnd + setbyte BS_ATTACKER, BS_TARGET + goto BattleScript_ThrashConfuses BattleScript_EffectShellSideArm: shellsidearmcheck @@ -3400,6 +3459,7 @@ BattleScriptFirstChargingTurn:: printstring STRINGID_EMPTYSTRING3 ppreduce attackstring +BattleScriptFirstChargingTurnAfterAttackString: pause B_WAIT_TIME_LONG copybyte cMULTISTRING_CHOOSER, sTWOTURN_STRINGID printfromtable gFirstTurnOfTwoStringIds @@ -7511,7 +7571,10 @@ BattleScript_YawnMakesAsleep:: waitmessage B_WAIT_TIME_LONG updatestatusicon BS_EFFECT_BATTLER waitstate + jumpifstatus3 BS_EFFECT_BATTLER, STATUS3_SKY_DROPPED, BattleScript_YawnEnd makevisible BS_EFFECT_BATTLER + skydropyawn +BattleScript_YawnEnd: end2 BattleScript_EmbargoEndTurn:: diff --git a/include/battle.h b/include/battle.h index b587e482db..4cb7e7e02c 100644 --- a/include/battle.h +++ b/include/battle.h @@ -616,6 +616,7 @@ struct BattleStruct u8 blunderPolicy:1; // should blunder policy activate u8 ballSpriteIds[2]; // item gfx, window gfx u8 stickyWebUser; + u8 skyDropTargets[MAX_BATTLERS_COUNT]; // For Sky Drop, to account for if multiple Pokemon use Sky Drop in a double battle. }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/constants/battle.h b/include/constants/battle.h index 28934abc25..86e5d14c9a 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -170,6 +170,7 @@ #define STATUS3_AQUA_RING (1 << 28) #define STATUS3_LASER_FOCUS (1 << 29) #define STATUS3_POWER_TRICK (1 << 30) +#define STATUS3_SKY_DROPPED (1 << 31) // Target of Sky Drop #define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER | STATUS3_PHANTOM_FORCE) #define STATUS4_ELECTRIFIED (1 << 0) @@ -359,7 +360,9 @@ #define MOVE_EFFECT_RECOIL_HP_25 0x46 #define MOVE_EFFECT_RELIC_SONG 0x47 #define MOVE_EFFECT_TRAP_BOTH 0x48 -#define NUM_MOVE_EFFECTS 0x49 +#define MOVE_EFFECT_SKY_DROP 0x49 + +#define NUM_MOVE_EFFECTS 0x50 #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 3f24caf5e5..82fc381a6a 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -386,7 +386,8 @@ #define EFFECT_OCTOLOCK 380 #define EFFECT_CLANGOROUS_SOUL 381 #define EFFECT_BOLT_BEAK 382 +#define EFFECT_SKY_DROP 383 -#define NUM_BATTLE_MOVE_EFFECTS 383 +#define NUM_BATTLE_MOVE_EFFECTS 384 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index bd16f741be..c191bc5e54 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -208,6 +208,10 @@ #define VARIOUS_SET_OCTOLOCK 135 #define VARIOUS_CUT_1_3_HP_RAISE_STATS 136 #define VARIOUS_TRY_END_NEUTRALIZING_GAS 137 +#define VARIOUS_JUMP_IF_UNDER_200 138 +#define VARIOUS_SET_SKY_DROP 139 +#define VARIOUS_CLEAR_SKY_DROP 140 +#define VARIOUS_SKY_DROP_YAWN 141 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 @@ -265,18 +269,19 @@ #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_SKY_DROP_CONFUSE 18 +#define MOVEEND_UPDATE_LAST_MOVES 19 +#define MOVEEND_MIRROR_MOVE 20 +#define MOVEEND_NEXT_TARGET 21 // Everything up until here is handled for each strike of a multi-hit move +#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_PICKPOCKET 26 +#define MOVEEND_DANCER 27 +#define MOVEEND_EMERGENCY_EXIT 28 +#define MOVEEND_CLEAR_BITS 29 +#define MOVEEND_COUNT 30 // switch cases #define B_SWITCH_NORMAL 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 7846fa5218..83e931c2ca 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -592,25 +592,27 @@ #define STRINGID_STRONGWINDSDISSIPATED 588 #define STRINGID_MYSTERIOUSAIRCURRENTBLOWSON 589 #define STRINGID_ATTACKWEAKENEDBSTRONGWINDS 590 -#define STRINGID_STUFFCHEEKSCANTSELECT 592 -#define STRINGID_PKMNREVERTEDTOPRIMAL 593 -#define STRINGID_BUTPOKEMONCANTUSETHEMOVE 594 -#define STRINGID_BUTHOOPACANTUSEIT 595 -#define STRINGID_BROKETHROUGHPROTECTION 596 -#define STRINGID_ABILITYALLOWSONLYMOVE 597 -#define STRINGID_SWAPPEDABILITIES 598 -#define STRINGID_PASTELVEILPROTECTED 599 -#define STRINGID_PASTELVEILENTERS 600 -#define STRINGID_BATTLERTYPECHANGEDTO 601 -#define STRINGID_BOTHCANNOLONGERESCAPE 602 -#define STRINGID_CANTESCAPEDUETOUSEDMOVE 603 -#define STRINGID_PKMNBECAMEWEAKERTOFIRE 604 -#define STRINGID_ABOUTTOUSEPOLTERGEIST 605 -#define STRINGID_CANTESCAPEBECAUSEOFCURRENTMOVE 606 -#define STRINGID_NEUTRALIZINGGASENTERS 607 -#define STRINGID_NEUTRALIZINGGASOVER 608 +#define STRINGID_STUFFCHEEKSCANTSELECT 591 +#define STRINGID_PKMNREVERTEDTOPRIMAL 592 +#define STRINGID_BUTPOKEMONCANTUSETHEMOVE 593 +#define STRINGID_BUTHOOPACANTUSEIT 594 +#define STRINGID_BROKETHROUGHPROTECTION 595 +#define STRINGID_ABILITYALLOWSONLYMOVE 596 +#define STRINGID_SWAPPEDABILITIES 597 +#define STRINGID_PASTELVEILPROTECTED 598 +#define STRINGID_PASTELVEILENTERS 599 +#define STRINGID_BATTLERTYPECHANGEDTO 600 +#define STRINGID_BOTHCANNOLONGERESCAPE 601 +#define STRINGID_CANTESCAPEDUETOUSEDMOVE 602 +#define STRINGID_PKMNBECAMEWEAKERTOFIRE 603 +#define STRINGID_ABOUTTOUSEPOLTERGEIST 604 +#define STRINGID_CANTESCAPEBECAUSEOFCURRENTMOVE 605 +#define STRINGID_NEUTRALIZINGGASENTERS 606 +#define STRINGID_NEUTRALIZINGGASOVER 607 +#define STRINGID_TARGETTOOHEAVY 608 +#define STRINGID_PKMNTOOKTARGETHIGH 609 -#define BATTLESTRINGS_COUNT 609 +#define BATTLESTRINGS_COUNT 610 // The below IDs are all indexes into battle message tables, // used to determine which of a set of messages to print. @@ -661,6 +663,7 @@ #define B_MSG_TURN1_PHANTOM_FORCE 8 #define B_MSG_TURN1_GEOMANCY 9 #define B_MSG_TURN1_FREEZE_SHOCK 10 +#define B_MSG_TURN1_SKY_DROP 11 // gMoveWeatherChangeStringIds #define B_MSG_STARTED_RAIN 0 diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 400876cc9b..f5d8901404 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -793,7 +793,9 @@ static bool8 ShouldUseItem(void) u8 validMons = 0; bool8 shouldUse = FALSE; - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT) + // If teaming up with player and Pokemon is on the right, or Pokemon is currently held by Sky Drop + if ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT) + || gStatuses3[gActiveBattler] & STATUS3_SKY_DROPPED) return FALSE; if (gStatuses3[gActiveBattler] & STATUS3_EMBARGO) diff --git a/src/battle_main.c b/src/battle_main.c index 5277ade1ea..c22a3f6133 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2945,6 +2945,12 @@ static void BattleStartClearSetData(void) } gSwapDamageCategory = FALSE; // Photon Geyser, Shell Side Arm, Light That Burns the Sky + + // Clear skyDropTargets data + for (i = 0; i < 4; i++) + { + gBattleStruct->skyDropTargets[i] = 0xFF; + } } void SwitchInClearSetData(void) @@ -3081,6 +3087,56 @@ void FaintClearSetData(void) gBattleMons[i].status2 &= ~(STATUS2_INFATUATED_WITH(gActiveBattler)); if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && *(gBattleStruct->wrappedBy + i) == gActiveBattler) gBattleMons[i].status2 &= ~(STATUS2_WRAPPED); + + // If the fainted mon was holding another Pokemon in Sky Drop, release the mon and clear Sky Drop data + if (gActiveBattler == gBattleStruct->skyDropTargets[0] && i == gBattleStruct->skyDropTargets[1]) + { + gBattleStruct->skyDropTargets[0] = 0xFF; + gBattleStruct->skyDropTargets[1] = 0xFF; + + gStatuses3[i] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + gSprites[gBattlerSpriteIds[i]].invisible = FALSE; + + // If the target was sky dropped in the middle of using Outrage/Petal Dance/Thrash, + // confuse them upon release and print "confused via fatigue" message and animation. + if (gBattleMons[i].status2 & STATUS2_LOCK_CONFUSE) + { + gBattleMons[i].status2 &= ~(STATUS2_LOCK_CONFUSE); + + // If the released mon can be confused, do so. + // Don't use CanBeConfused here, since it can cause issues in edge cases. + if (!(GetBattlerAbility(i) == ABILITY_OWN_TEMPO + || gBattleMons[i].status2 & STATUS2_CONFUSION + || IsBattlerTerrainAffected(i, STATUS_FIELD_MISTY_TERRAIN))) + { + gBattleMons[i].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + gBattlerAttacker = i; + gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 2; + } + } + } + else if (gActiveBattler == gBattleStruct->skyDropTargets[2] && i == gBattleStruct->skyDropTargets[3]) + { + gBattleStruct->skyDropTargets[2] = 0xFF; + gBattleStruct->skyDropTargets[3] = 0xFF; + + gStatuses3[i] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + gSprites[gBattlerSpriteIds[i]].invisible = FALSE; + + if (gBattleMons[i].status2 & STATUS2_LOCK_CONFUSE) + { + gBattleMons[i].status2 &= ~(STATUS2_LOCK_CONFUSE); + gEffectBattler = i; + if (!(GetBattlerAbility(i) == ABILITY_OWN_TEMPO + || gBattleMons[i].status2 & STATUS2_CONFUSION + || IsBattlerTerrainAffected(i, STATUS_FIELD_MISTY_TERRAIN))) + { + gBattleMons[i].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + gBattlerAttacker = i; + gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 2; + } + } + } } gActionSelectionCursor[gActiveBattler] = 0; @@ -3160,6 +3216,12 @@ void FaintClearSetData(void) UndoFormChange(gBattlerPartyIndexes[gActiveBattler], GET_BATTLER_SIDE(gActiveBattler), FALSE); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) UndoMegaEvolution(gBattlerPartyIndexes[gActiveBattler]); + + // If the fainted Pokemon was being held by Sky Drop, clear their Sky Drop data. + if (gActiveBattler == gBattleStruct->skyDropTargets[1]) + gBattleStruct->skyDropTargets[1] = 0xFF; + else if (gActiveBattler == gBattleStruct->skyDropTargets[3]) + gBattleStruct->skyDropTargets[3] = 0xFF; } static void DoBattleIntro(void) @@ -3897,10 +3959,12 @@ static void HandleTurnActionSelectionState(void) } break; case B_ACTION_USE_ITEM: - if (gBattleTypeFlags & (BATTLE_TYPE_LINK + if ((gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER_NO_PYRAMID | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_RECORDED_LINK)) + // Or if currently held by Sky Drop + || gStatuses3[gActiveBattler] & STATUS3_SKY_DROPPED) { RecordedBattle_ClearBattlerAction(gActiveBattler, 1); gSelectionBattleScripts[gActiveBattler] = BattleScript_ActionSelectionItemsCantBeUsed; diff --git a/src/battle_message.c b/src/battle_message.c index d64d02f902..9174d7c3bc 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -431,6 +431,8 @@ static const u8 sText_ExclamationMark4[] = _("!"); static const u8 sText_ExclamationMark5[] = _("!"); static const u8 sText_Accuracy[] = _("accuracy"); static const u8 sText_Evasiveness[] = _("evasiveness"); +static const u8 sText_PkmnTookTargetHigh[] = _("{B_ATK_NAME_WITH_PREFIX} took {B_DEF_NAME_WITH_PREFIX}\ninto the air!"); +static const u8 sText_TargetTooHeavy[] = _("But the target\nwas too heavy!"); const u8 * const gStatNamesTable[NUM_BATTLE_STATS] = { @@ -1334,6 +1336,8 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PKMNBECAMEWEAKERTOFIRE - 12] = sText_PkmnBecameWeakerToFire, [STRINGID_ABOUTTOUSEPOLTERGEIST - 12] = sText_PkmnAboutToBeAttackedByItsItem, [STRINGID_CANTESCAPEBECAUSEOFCURRENTMOVE - 12] = sText_CantEscapeBecauseOfCurrentMove, + [STRINGID_PKMNTOOKTARGETHIGH - 12] = sText_PkmnTookTargetHigh, + [STRINGID_TARGETTOOHEAVY - 12] = sText_TargetTooHeavy, }; const u16 gMentalHerbCureStringIds[] = @@ -1548,6 +1552,7 @@ const u16 gFirstTurnOfTwoStringIds[] = [B_MSG_TURN1_PHANTOM_FORCE] = STRINGID_VANISHEDINSTANTLY, [B_MSG_TURN1_GEOMANCY] = STRINGID_PKNMABSORBINGPOWER, [B_MSG_TURN1_FREEZE_SHOCK] = STRINGID_CLOAKEDINAFREEZINGLIGHT, + [B_MSG_TURN1_SKY_DROP] = STRINGID_PKMNTOOKTARGETHIGH, }; // Index copied from move's index in sTrappingMoves diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7923a67395..1b08f86a86 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1089,7 +1089,7 @@ static const u16 sMoveEffectsForbiddenToInstruct[] = EFFECT_SEMI_INVULNERABLE, //EFFECT_SHELL_TRAP, EFFECT_SKETCH, - //EFFECT_SKY_DROP, + EFFECT_SKY_DROP, EFFECT_SKULL_BASH, EFFECT_SLEEP_TALK, EFFECT_SOLARBEAM, @@ -1609,13 +1609,15 @@ static bool32 AccuracyCalcHelper(u16 move) JumpIfMoveFailed(7, move); return TRUE; } - else if (GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD) + // If the attacker has the ability No Guard and they aren't targeting a Pokemon involved in a Sky Drop with the move Sky Drop, move hits. + else if (GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD && (move != MOVE_SKY_DROP || (gBattlerTarget != gBattleStruct->skyDropTargets[0] && gBattlerTarget != gBattleStruct->skyDropTargets[1] && gBattlerTarget != gBattleStruct->skyDropTargets[2] && gBattlerTarget != gBattleStruct->skyDropTargets[3]))) { if (!JumpIfMoveFailed(7, move)) RecordAbilityBattle(gBattlerAttacker, ABILITY_NO_GUARD); return TRUE; } - else if (GetBattlerAbility(gBattlerTarget) == ABILITY_NO_GUARD) + // If the target has the ability No Guard and they aren't involved in a Sky Drop or the current move isn't Sky Drop, move hits. + else if (GetBattlerAbility(gBattlerTarget) == ABILITY_NO_GUARD && (move != MOVE_SKY_DROP || (gBattlerTarget != gBattleStruct->skyDropTargets[0] && gBattlerTarget != gBattleStruct->skyDropTargets[1] && gBattlerTarget != gBattleStruct->skyDropTargets[2] && gBattlerTarget != gBattleStruct->skyDropTargets[3]))) { if (!JumpIfMoveFailed(7, move)) RecordAbilityBattle(gBattlerTarget, ABILITY_NO_GUARD); @@ -1623,8 +1625,7 @@ static bool32 AccuracyCalcHelper(u16 move) } if ((gStatuses3[gBattlerTarget] & STATUS3_PHANTOM_FORCE) - || (!(gBattleMoves[move].flags & FLAG_DMG_IN_AIR) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR) - || (!(gBattleMoves[move].flags & FLAG_DMG_2X_IN_AIR) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR) + || (!(gBattleMoves[move].flags & FLAG_DMG_IN_AIR || gBattleMoves[move].flags & FLAG_DMG_2X_IN_AIR) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR) || (!(gBattleMoves[move].flags & FLAG_DMG_UNDERGROUND) && gStatuses3[gBattlerTarget] & STATUS3_UNDERGROUND) || (!(gBattleMoves[move].flags & FLAG_DMG_UNDERWATER) && gStatuses3[gBattlerTarget] & STATUS3_UNDERWATER)) { @@ -2929,9 +2930,20 @@ void SetMoveEffect(bool32 primary, u32 certain) else { gBattleMons[gEffectBattler].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); // 2-5 turns - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; + + // If the confusion is activating due to being released from Sky Drop, go to "confused due to fatigue" script. + // Otherwise, do normal confusion script. + if(gCurrentMove == MOVE_SKY_DROP) + { + gBattleMons[gEffectBattler].status2 &= ~(STATUS2_LOCK_CONFUSE); + gBattlerAttacker = gEffectBattler; + gBattlescriptCurrInstr = BattleScript_ThrashConfuses; + } + else + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; + } } break; case MOVE_EFFECT_FLINCH: @@ -5141,6 +5153,28 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; + case MOVEEND_SKY_DROP_CONFUSE: // If a Pokemon was released from Sky Drop and was in LOCK_CONFUSE, go to "confused due to fatigue scripts and clear Sky Drop data. + for (i = 0; i < gBattlersCount; i++) + { + if (gBattleStruct->skyDropTargets[0] == 0xFE - i) + { + gBattlerAttacker = gBattleStruct->skyDropTargets[1]; + gBattlescriptCurrInstr = BattleScript_ThrashConfuses; + gBattleStruct->skyDropTargets[0] = 0xFF; + gBattleStruct->skyDropTargets[1] = 0xFF; + return; + } + else if (gBattleStruct->skyDropTargets[2] == 0xFE - i) + { + gBattlerAttacker = gBattleStruct->skyDropTargets[3]; + gBattlescriptCurrInstr = BattleScript_ThrashConfuses; + gBattleStruct->skyDropTargets[2] = 0xFF; + gBattleStruct->skyDropTargets[3] = 0xFF; + return; + } + } + gBattleScripting.moveendState++; + break; case MOVEEND_UPDATE_LAST_MOVES: if (gMoveResultFlags & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE)) gBattleStruct->lastMoveFailed |= gBitTable[gBattlerAttacker]; @@ -7680,7 +7714,8 @@ static void Cmd_various(void) } return; case VARIOUS_GRAVITY_ON_AIRBORNE_MONS: - if (gStatuses3[gActiveBattler] & STATUS3_ON_AIR) + // Cancel all multiturn moves of IN_AIR Pokemon except those being targeted by Sky Drop. + if (gStatuses3[gActiveBattler] & STATUS3_ON_AIR && !(gActiveBattler == gBattleStruct->skyDropTargets[1] || gActiveBattler == gBattleStruct->skyDropTargets[3])) CancelMultiTurnMoves(gActiveBattler); gStatuses3[gActiveBattler] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR); @@ -8892,7 +8927,7 @@ static void Cmd_various(void) MarkBattlerForControllerExec(gActiveBattler); } - if (gBattleMons[gActiveBattler].pp[i] == 0) + if (gBattleMons[gActiveBattler].pp[i] == 0 && !(gActiveBattler == gBattleStruct->skyDropTargets[0] || gActiveBattler == gBattleStruct->skyDropTargets[2])) CancelMultiTurnMoves(gActiveBattler); gBattlescriptCurrInstr += 7; // continue @@ -8959,6 +8994,101 @@ static void Cmd_various(void) gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; // remove the terrain TryToRevertMimicry(); // restore the types of Pokémon with Mimicry break; + case VARIOUS_JUMP_IF_UNDER_200: + // If the Pokemon is less than 200 kg, or weighing less than 441 lbs, then Sky Drop will work. Otherwise, it will fail. + if (GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), 1) < 441) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; + case VARIOUS_SET_SKY_DROP: + gStatuses3[gBattlerTarget] |= (STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + /* skyDropTargets holds the information of who is the attacker and the target of Sky Drop. + This is needed in the case that multiple Pokemon use Sky Drop in the same turn or if + the target of a Sky Drop faints while in the air.*/ + if (gBattleStruct->skyDropTargets[0] == 0xFF) + { + gBattleStruct->skyDropTargets[0] = gBattlerAttacker; + gBattleStruct->skyDropTargets[1] = gBattlerTarget; + } + else + { + gBattleStruct->skyDropTargets[2] = gBattlerAttacker; + gBattleStruct->skyDropTargets[3] = gBattlerTarget; + } + + // End any multiturn effects caused by the target + gBattleMons[gBattlerTarget].status2 &= ~(STATUS2_MULTIPLETURNS); + gBattleMons[gBattlerTarget].status2 &= ~(STATUS2_UPROAR); + gBattleMons[gBattlerTarget].status2 &= ~(STATUS2_BIDE); + gDisableStructs[gBattlerTarget].rolloutTimer = 0; + gDisableStructs[gBattlerTarget].furyCutterCounter = 0; + break; + case VARIOUS_CLEAR_SKY_DROP: + if (gBattleStruct->skyDropTargets[0] == gBattlerAttacker) + { + // Check to see if the initial target of this Sky Drop fainted before the 2nd turn of Sky Drop. + // If so, make the move fail. If not, clear all of the statuses and continue the move. + if (gBattleStruct->skyDropTargets[1] == 0xFF) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + { + gStatuses3[gBattlerTarget] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + gBattlescriptCurrInstr += 7; + } + + // Clear skyDropTargets data + gBattleStruct->skyDropTargets[0] = 0xFF; + gBattleStruct->skyDropTargets[1] = 0xFF; + } + else + { + if (gBattleStruct->skyDropTargets[3] == 0xFF) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + { + gStatuses3[gBattlerTarget] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + gBattlescriptCurrInstr += 7; + } + + gBattleStruct->skyDropTargets[2] = 0xFF; + gBattleStruct->skyDropTargets[3] = 0xFF; + } + + // Confuse target if they were in the middle of Petal Dance/Outrage/Thrash when targeted. + if (gBattleMons[gBattlerTarget].status2 & STATUS2_LOCK_CONFUSE) + gBattleScripting.moveEffect = (MOVE_EFFECT_CONFUSION | MOVE_EFFECT_CERTAIN); + return; + case VARIOUS_SKY_DROP_YAWN: // If the mon that's sleeping due to Yawn was holding a Pokemon in Sky Drop, release the target and clear Sky Drop data. + if (gEffectBattler == gBattleStruct->skyDropTargets[0]) + { + gEffectBattler = gBattleStruct->skyDropTargets[1]; + gBattleStruct->skyDropTargets[0] = 0xFF; + gBattleStruct->skyDropTargets[1] = 0xFF; + gBattleMons[gEffectBattler].status2 &= ~(STATUS2_LOCK_CONFUSE); + if (CanBeConfused(gEffectBattler)) + { + gBattlerAttacker = gEffectBattler; + gBattleMons[gBattlerTarget].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + gBattlescriptCurrInstr = BattleScript_ThrashConfuses; + return; + } + } + else if (gEffectBattler == gBattleStruct->skyDropTargets[2]) + { + gEffectBattler = gBattleStruct->skyDropTargets[3]; + gBattleStruct->skyDropTargets[2] = 0xFF; + gBattleStruct->skyDropTargets[3] = 0xFF; + gBattleMons[gEffectBattler].status2 &= ~(STATUS2_LOCK_CONFUSE); + if (CanBeConfused(gEffectBattler)) + { + gBattlerAttacker = gEffectBattler; + gBattleMons[gBattlerTarget].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + gBattlescriptCurrInstr = BattleScript_ThrashConfuses; + return; + } + } + break; case VARIOUS_JUMP_IF_PRANKSTER_BLOCKED: if (BlocksPrankster(gCurrentMove, gBattlerAttacker, gActiveBattler, TRUE)) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); @@ -11351,7 +11481,8 @@ static void Cmd_tryspiteppreduce(void) gBattlescriptCurrInstr += 5; - if (gBattleMons[gBattlerTarget].pp[i] == 0) + // Don't cut off Sky Drop if pp is brought to zero. + if (gBattleMons[gBattlerTarget].pp[i] == 0 && !(gBattlerTarget == gBattleStruct->skyDropTargets[0] || gBattlerTarget == gBattleStruct->skyDropTargets[2])) CancelMultiTurnMoves(gBattlerTarget); } else @@ -11997,6 +12128,7 @@ static void Cmd_setsemiinvulnerablebit(void) { case MOVE_FLY: case MOVE_BOUNCE: + case MOVE_SKY_DROP: gStatuses3[gBattlerAttacker] |= STATUS3_ON_AIR; break; case MOVE_DIG: diff --git a/src/battle_util.c b/src/battle_util.c index cc619decf8..7cd7254d7d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -224,6 +224,7 @@ bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move) if (gSideTimers[defSide].followmeTimer == 0 || gBattleMons[gSideTimers[defSide].followmeTarget].hp == 0 || gBattleMoves[move].effect == EFFECT_SNIPE_SHOT + || gBattleMoves[move].effect == EFFECT_SKY_DROP || ability == ABILITY_PROPELLER_TAIL || ability == ABILITY_STALWART) return FALSE; @@ -1420,12 +1421,123 @@ void MarkBattlerReceivedLinkData(u8 battlerId) void CancelMultiTurnMoves(u8 battler) { + u8 i; gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS); gBattleMons[battler].status2 &= ~(STATUS2_LOCK_CONFUSE); gBattleMons[battler].status2 &= ~(STATUS2_UPROAR); gBattleMons[battler].status2 &= ~(STATUS2_BIDE); - gStatuses3[battler] &= ~(STATUS3_SEMI_INVULNERABLE); + // Don't clear battler's semi-invulnerable bits if they are held by Sky Drop. + if (gBattleStruct->skyDropTargets[1] != battler && gBattleStruct->skyDropTargets[3] != battler) + gStatuses3[battler] &= ~(STATUS3_SEMI_INVULNERABLE); + + // Check to see if this Pokemon was in the middle of using Sky Drop. If so, release the target. + if (gBattleStruct->skyDropTargets[0] == battler) + { + // Sets skyDropTargets[1] to be the battler id for the target + for(i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if(gBattleStruct->skyDropTargets[1] == i) + { + // Clears sky dropped and on_air statuses + gStatuses3[i] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + + // Makes both attacker and target's sprites visible + gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; + gSprites[gBattlerSpriteIds[i]].invisible = FALSE; + + // If target was sky dropped in the middle of Outrage/Thrash/Petal Dance, + // confuse them upon release and display "confused by fatigue" message & animation. + // Don't do this if this CancelMultiTurnMoves is caused by falling asleep via Yawn. + if (gBattleMons[i].status2 & STATUS2_LOCK_CONFUSE && gBattleStruct->turnEffectsTracker != 24) + { + gBattleMons[i].status2 &= ~(STATUS2_LOCK_CONFUSE); + + // If the target can be confused, confuse them. + // Don't use CanBeConfused, can cause issues in edge cases. + if (!(GetBattlerAbility(i) == ABILITY_OWN_TEMPO + || gBattleMons[i].status2 & STATUS2_CONFUSION + || IsBattlerTerrainAffected(i, STATUS_FIELD_MISTY_TERRAIN))) + { + gBattleMons[i].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + + // If this CancelMultiTurnMoves is occuring due to attackcanceller or VARIOUS_GRAVITY_ON_AIRBORNE_MONS + if (gBattlescriptCurrInstr[0] == 0x0 || (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 76)) + gBattleStruct->skyDropTargets[0] = 0xFE - battler; + + // If this CancelMultiTurnMoves is occuring due to cancelmultiturnmoves script + else if (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 0) + { + gBattlerAttacker = i; + gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 3; + } + + // If this CancelMultiTurnMoves is occuring due to receiving Sleep/Freeze status + else if (gBattleScripting.moveEffect <= PRIMARY_STATUS_MOVE_EFFECT) + { + gBattlerAttacker = i; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 1; + } + } + + } + break; + } + } + + // Clear skyDropTargets data, unless this CancelMultiTurnMoves is caused by Yawn, attackcanceler, or VARIOUS_GRAVITY_ON_AIRBORNE_MONS + if (!(gBattleMons[gBattleStruct->skyDropTargets[1]].status2 & STATUS2_LOCK_CONFUSE) && gBattleStruct->skyDropTargets[0] < 4) + { + gBattleStruct->skyDropTargets[0] = 0xFF; + gBattleStruct->skyDropTargets[1] = 0xFF; + } + } + else if (gBattleStruct->skyDropTargets[2] == battler) + { + for(i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if(gBattleStruct->skyDropTargets[3] == i) + { + gStatuses3[i] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + + gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; + gSprites[gBattlerSpriteIds[i]].invisible = FALSE; + + if (gBattleMons[i].status2 & STATUS2_LOCK_CONFUSE && gBattleStruct->turnEffectsTracker != 24) + { + gBattleMons[i].status2 &= ~(STATUS2_LOCK_CONFUSE); + if (!(GetBattlerAbility(i) == ABILITY_OWN_TEMPO + || gBattleMons[i].status2 & STATUS2_CONFUSION + || IsBattlerTerrainAffected(i, STATUS_FIELD_MISTY_TERRAIN))) + { + gBattleMons[i].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + + if (gBattlescriptCurrInstr[0] == 0x0 || (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 76)) + gBattleStruct->skyDropTargets[2] = 0xFE - battler; + else if (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 0) + { + gBattlerAttacker = i; + gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 3; + } + else if (gBattleScripting.moveEffect <= PRIMARY_STATUS_MOVE_EFFECT) + { + gBattlerAttacker = i; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 1; + } + } + } + break; + } + } + + if (!(gBattleMons[gBattleStruct->skyDropTargets[3]].status2 & STATUS2_LOCK_CONFUSE) && gBattleStruct->skyDropTargets[2] < 4) + { + gBattleStruct->skyDropTargets[2] = 0xFF; + gBattleStruct->skyDropTargets[3] = 0xFF; + } + } gDisableStructs[battler].rolloutTimer = 0; gDisableStructs[battler].furyCutterCounter = 0; @@ -2771,7 +2883,8 @@ u8 DoBattlerEndTurnEffects(void) gBattleStruct->turnEffectsTracker++; break; case ENDTURN_THRASH: // thrash - if (gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE) + // Don't decrement STATUS2_LOCK_CONFUSE if the target is held by Sky Drop + if (gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE && !(gStatuses3[gActiveBattler] & STATUS3_SKY_DROPPED)) { gBattleMons[gActiveBattler].status2 -= STATUS2_LOCK_CONFUSE_TURN(1); if (WasUnableToUseMove(gActiveBattler)) @@ -3211,6 +3324,7 @@ void TryClearRageAndFuryCutter(void) enum { CANCELLER_FLAGS, + CANCELLER_SKY_DROP, CANCELLER_ASLEEP, CANCELLER_FROZEN, CANCELLER_TRUANT, @@ -3247,6 +3361,16 @@ u8 AtkCanceller_UnableToUseMove(void) gStatuses3[gBattlerAttacker] &= ~(STATUS3_GRUDGE); gBattleStruct->atkCancellerTracker++; break; + case CANCELLER_SKY_DROP: + // If Pokemon is being held in Sky Drop + if (gStatuses3[gBattlerAttacker] & STATUS3_SKY_DROPPED) + { + gBattlescriptCurrInstr = BattleScript_MoveEnd; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + effect = 1; + } + gBattleStruct->atkCancellerTracker++; + break; case CANCELLER_ASLEEP: // check being asleep if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) { @@ -3438,7 +3562,7 @@ u8 AtkCanceller_UnableToUseMove(void) if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && (Random() % 4) == 0) { gProtectStructs[gBattlerAttacker].prlzImmobility = TRUE; - // This is removed in Emerald for some reason + // This is removed in Emerald because it is called in BattleScript_MoveUsedIsParalyzed. //CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; @@ -4886,7 +5010,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move && !(TestSheerForceFlag(gBattlerAttacker, gCurrentMove)) && (CanBattlerSwitch(battler) || !(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) && !(gBattleTypeFlags & BATTLE_TYPE_ARENA) - && CountUsablePartyMons(battler) > 0) + && CountUsablePartyMons(battler) > 0 + // Not currently held by Sky Drop + && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) { gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_EMERGENCY_EXIT; effect++; @@ -5748,6 +5874,8 @@ bool32 CanBattlerEscape(u32 battlerId) // no ability check return FALSE; else if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) return FALSE; + else if (gStatuses3[battlerId] & STATUS3_SKY_DROPPED) + return FALSE; else return TRUE; } @@ -9128,6 +9256,10 @@ bool32 CanMegaEvolve(u8 battlerId) && (mega->alreadyEvolved[partnerPosition] || (mega->toEvolve & gBitTable[BATTLE_PARTNER(battlerId)]))) return FALSE; } + + // Check if mon is currently held by Sky Drop + if (gStatuses3[battlerId] & STATUS3_SKY_DROPPED) + return FALSE; // Gets mon data. if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index a49cf5fd87..adcc40b82c 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -8009,7 +8009,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_SKY_DROP] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_SKY_DROP, .power = 60, .type = TYPE_FLYING, .accuracy = 100, From 844a0217f75e790f41d44aa25ba2987e0d68d391 Mon Sep 17 00:00:00 2001 From: W1serV1ser <1prefertheaircauseimanairnomad@gmail.com> Date: Sat, 20 Nov 2021 12:04:21 -0800 Subject: [PATCH 010/105] Fixed spacing, added braces, and reverted comment --- src/battle_util.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 7cd7254d7d..6bf0ee248d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1435,9 +1435,9 @@ void CancelMultiTurnMoves(u8 battler) if (gBattleStruct->skyDropTargets[0] == battler) { // Sets skyDropTargets[1] to be the battler id for the target - for(i = 0; i < MAX_BATTLERS_COUNT; i++) + for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - if(gBattleStruct->skyDropTargets[1] == i) + if (gBattleStruct->skyDropTargets[1] == i) { // Clears sky dropped and on_air statuses gStatuses3[i] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); @@ -1463,7 +1463,9 @@ void CancelMultiTurnMoves(u8 battler) // If this CancelMultiTurnMoves is occuring due to attackcanceller or VARIOUS_GRAVITY_ON_AIRBORNE_MONS if (gBattlescriptCurrInstr[0] == 0x0 || (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 76)) + { gBattleStruct->skyDropTargets[0] = 0xFE - battler; + } // If this CancelMultiTurnMoves is occuring due to cancelmultiturnmoves script else if (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 0) @@ -1472,7 +1474,7 @@ void CancelMultiTurnMoves(u8 battler) gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 3; } - // If this CancelMultiTurnMoves is occuring due to receiving Sleep/Freeze status + // If this CancelMultiTurnMoves is occuring due to receiving Sleep/Freeze status else if (gBattleScripting.moveEffect <= PRIMARY_STATUS_MOVE_EFFECT) { gBattlerAttacker = i; @@ -1495,9 +1497,9 @@ void CancelMultiTurnMoves(u8 battler) } else if (gBattleStruct->skyDropTargets[2] == battler) { - for(i = 0; i < MAX_BATTLERS_COUNT; i++) + for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - if(gBattleStruct->skyDropTargets[3] == i) + if (gBattleStruct->skyDropTargets[3] == i) { gStatuses3[i] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); @@ -1514,7 +1516,9 @@ void CancelMultiTurnMoves(u8 battler) gBattleMons[i].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); if (gBattlescriptCurrInstr[0] == 0x0 || (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 76)) + { gBattleStruct->skyDropTargets[2] = 0xFE - battler; + } else if (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 0) { gBattlerAttacker = i; @@ -3562,7 +3566,7 @@ u8 AtkCanceller_UnableToUseMove(void) if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && (Random() % 4) == 0) { gProtectStructs[gBattlerAttacker].prlzImmobility = TRUE; - // This is removed in Emerald because it is called in BattleScript_MoveUsedIsParalyzed. + // This is removed in Emerald for some reason //CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; @@ -9257,9 +9261,9 @@ bool32 CanMegaEvolve(u8 battlerId) return FALSE; } - // Check if mon is currently held by Sky Drop - if (gStatuses3[battlerId] & STATUS3_SKY_DROPPED) - return FALSE; + // Check if mon is currently held by Sky Drop + if (gStatuses3[battlerId] & STATUS3_SKY_DROPPED) + return FALSE; // Gets mon data. if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT) From 5d1228fc2ea920dfb628a0d7540c44d4fb8e3540 Mon Sep 17 00:00:00 2001 From: W1serV1ser <1prefertheaircauseimanairnomad@gmail.com> Date: Sun, 21 Nov 2021 15:42:31 -0800 Subject: [PATCH 011/105] More spacing and format fixes --- src/battle_script_commands.c | 10 +++++----- src/battle_util.c | 18 ++++++++---------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1b08f86a86..90ae0b1199 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1609,14 +1609,14 @@ static bool32 AccuracyCalcHelper(u16 move) JumpIfMoveFailed(7, move); return TRUE; } - // If the attacker has the ability No Guard and they aren't targeting a Pokemon involved in a Sky Drop with the move Sky Drop, move hits. + // If the attacker has the ability No Guard and they aren't targeting a Pokemon involved in a Sky Drop with the move Sky Drop, move hits. else if (GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD && (move != MOVE_SKY_DROP || (gBattlerTarget != gBattleStruct->skyDropTargets[0] && gBattlerTarget != gBattleStruct->skyDropTargets[1] && gBattlerTarget != gBattleStruct->skyDropTargets[2] && gBattlerTarget != gBattleStruct->skyDropTargets[3]))) { if (!JumpIfMoveFailed(7, move)) RecordAbilityBattle(gBattlerAttacker, ABILITY_NO_GUARD); return TRUE; } - // If the target has the ability No Guard and they aren't involved in a Sky Drop or the current move isn't Sky Drop, move hits. + // If the target has the ability No Guard and they aren't involved in a Sky Drop or the current move isn't Sky Drop, move hits. else if (GetBattlerAbility(gBattlerTarget) == ABILITY_NO_GUARD && (move != MOVE_SKY_DROP || (gBattlerTarget != gBattleStruct->skyDropTargets[0] && gBattlerTarget != gBattleStruct->skyDropTargets[1] && gBattlerTarget != gBattleStruct->skyDropTargets[2] && gBattlerTarget != gBattleStruct->skyDropTargets[3]))) { if (!JumpIfMoveFailed(7, move)) @@ -2931,8 +2931,8 @@ void SetMoveEffect(bool32 primary, u32 certain) { gBattleMons[gEffectBattler].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); // 2-5 turns - // If the confusion is activating due to being released from Sky Drop, go to "confused due to fatigue" script. - // Otherwise, do normal confusion script. + // If the confusion is activating due to being released from Sky Drop, go to "confused due to fatigue" script. + // Otherwise, do normal confusion script. if(gCurrentMove == MOVE_SKY_DROP) { gBattleMons[gEffectBattler].status2 &= ~(STATUS2_LOCK_CONFUSE); @@ -9061,7 +9061,7 @@ static void Cmd_various(void) return; case VARIOUS_SKY_DROP_YAWN: // If the mon that's sleeping due to Yawn was holding a Pokemon in Sky Drop, release the target and clear Sky Drop data. if (gEffectBattler == gBattleStruct->skyDropTargets[0]) - { + { gEffectBattler = gBattleStruct->skyDropTargets[1]; gBattleStruct->skyDropTargets[0] = 0xFF; gBattleStruct->skyDropTargets[1] = 0xFF; diff --git a/src/battle_util.c b/src/battle_util.c index 6bf0ee248d..7e40315492 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1460,20 +1460,18 @@ void CancelMultiTurnMoves(u8 battler) || IsBattlerTerrainAffected(i, STATUS_FIELD_MISTY_TERRAIN))) { gBattleMons[i].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); - + // If this CancelMultiTurnMoves is occuring due to attackcanceller or VARIOUS_GRAVITY_ON_AIRBORNE_MONS if (gBattlescriptCurrInstr[0] == 0x0 || (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 76)) { gBattleStruct->skyDropTargets[0] = 0xFE - battler; } - // If this CancelMultiTurnMoves is occuring due to cancelmultiturnmoves script else if (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 0) { gBattlerAttacker = i; gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 3; } - // If this CancelMultiTurnMoves is occuring due to receiving Sleep/Freeze status else if (gBattleScripting.moveEffect <= PRIMARY_STATUS_MOVE_EFFECT) { @@ -1482,12 +1480,11 @@ void CancelMultiTurnMoves(u8 battler) gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 1; } } - } break; } } - + // Clear skyDropTargets data, unless this CancelMultiTurnMoves is caused by Yawn, attackcanceler, or VARIOUS_GRAVITY_ON_AIRBORNE_MONS if (!(gBattleMons[gBattleStruct->skyDropTargets[1]].status2 & STATUS2_LOCK_CONFUSE) && gBattleStruct->skyDropTargets[0] < 4) { @@ -1502,19 +1499,20 @@ void CancelMultiTurnMoves(u8 battler) if (gBattleStruct->skyDropTargets[3] == i) { gStatuses3[i] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); - + gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; gSprites[gBattlerSpriteIds[i]].invisible = FALSE; - + if (gBattleMons[i].status2 & STATUS2_LOCK_CONFUSE && gBattleStruct->turnEffectsTracker != 24) { gBattleMons[i].status2 &= ~(STATUS2_LOCK_CONFUSE); + if (!(GetBattlerAbility(i) == ABILITY_OWN_TEMPO || gBattleMons[i].status2 & STATUS2_CONFUSION || IsBattlerTerrainAffected(i, STATUS_FIELD_MISTY_TERRAIN))) { gBattleMons[i].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); - + if (gBattlescriptCurrInstr[0] == 0x0 || (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 76)) { gBattleStruct->skyDropTargets[2] = 0xFE - battler; @@ -1535,7 +1533,7 @@ void CancelMultiTurnMoves(u8 battler) break; } } - + if (!(gBattleMons[gBattleStruct->skyDropTargets[3]].status2 & STATUS2_LOCK_CONFUSE) && gBattleStruct->skyDropTargets[2] < 4) { gBattleStruct->skyDropTargets[2] = 0xFF; @@ -9260,7 +9258,7 @@ bool32 CanMegaEvolve(u8 battlerId) && (mega->alreadyEvolved[partnerPosition] || (mega->toEvolve & gBitTable[BATTLE_PARTNER(battlerId)]))) return FALSE; } - + // Check if mon is currently held by Sky Drop if (gStatuses3[battlerId] & STATUS3_SKY_DROPPED) return FALSE; From 62f01e89d779abd60b79aa87211636bffb773a38 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Tue, 23 Nov 2021 00:46:43 +1300 Subject: [PATCH 012/105] Fix Burmy form change Wasn't properly tracking if Burmy had appeared in battle; gSentPokesToOpponent is used only for exp calculation and is cleared when an opponent faints, so a new var was needed. --- include/battle.h | 1 + src/battle_main.c | 4 ++++ src/battle_script_commands.c | 5 ++++- src/battle_util.c | 6 +++--- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/include/battle.h b/include/battle.h index 5658f603cf..9c04a24eb5 100644 --- a/include/battle.h +++ b/include/battle.h @@ -616,6 +616,7 @@ struct BattleStruct u8 blunderPolicy:1; // should blunder policy activate u8 ballSpriteIds[2]; // item gfx, window gfx u8 stickyWebUser; + u8 appearedInBattle; // Bitfield to track which Pokemon appeared in battle. Used for Burmy's form change }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/src/battle_main.c b/src/battle_main.c index 84f66d6ded..1a4117d4fe 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2937,6 +2937,7 @@ static void BattleStartClearSetData(void) gBattleStruct->mega.triggerSpriteId = 0xFF; gBattleStruct->stickyWebUser = 0xFF; + gBattleStruct->appearedInBattle = 0; for (i = 0; i < PARTY_SIZE; i++) { @@ -3577,6 +3578,9 @@ static void TryDoEventsBeforeFirstTurn(void) *(gBattleStruct->monToSwitchIntoId + i) = PARTY_SIZE; gChosenActionByBattler[i] = B_ACTION_NONE; gChosenMoveByBattler[i] = MOVE_NONE; + // Record party slots of player's mons that appeared in battle + if (!IsBattlerAIControlled(i)) + gBattleStruct->appearedInBattle |= gBitTable[gBattlerPartyIndexes[i]]; } TurnValuesCleanUp(FALSE); SpecialStatusesClear(); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4ae42cb487..116316b16f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6176,7 +6176,10 @@ static void Cmd_switchineffects(void) gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); gSpecialStatuses[gActiveBattler].flag40 = 0; - + + if (!IsBattlerAIControlled(gActiveBattler)) + gBattleStruct->appearedInBattle |= gBitTable[gBattlerPartyIndexes[gActiveBattler]]; + // Neutralizing Gas announces itself before hazards if (gBattleMons[gActiveBattler].ability == ABILITY_NEUTRALIZING_GAS && gSpecialStatuses[gActiveBattler].announceNeutralizingGas == 0) { diff --git a/src/battle_util.c b/src/battle_util.c index 7e2320500c..f7e72ae404 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9769,13 +9769,13 @@ bool32 TryRoomService(u8 battlerId) void DoBurmyFormChange(u32 monId) { u16 newSpecies, currSpecies; - s32 sentIn; struct Pokemon *party = gPlayerParty; - sentIn = gSentPokesToOpponent[(gBattlerFainted & 2) >> 1]; currSpecies = GetMonData(&party[monId], MON_DATA_SPECIES, NULL); - if ((GET_BASE_SPECIES_ID(currSpecies) == SPECIES_BURMY) && (gBitTable[monId] & sentIn)) + if ((GET_BASE_SPECIES_ID(currSpecies) == SPECIES_BURMY) + && (gBattleStruct->appearedInBattle & gBitTable[monId]) // Burmy appeared in battle + && GetMonData(&party[monId], MON_DATA_HP, NULL) != 0) // Burmy isn't fainted { switch (gBattleTerrain) { From 1a5d3191e239d1d97ce38005a73ed2c85dafba84 Mon Sep 17 00:00:00 2001 From: kleeenexfeu Date: Tue, 23 Nov 2021 13:38:36 +0100 Subject: [PATCH 013/105] battle_engine merge --- include/constants/battle_config.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 29b7b57503..3180212f88 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -92,9 +92,6 @@ #define GEN_8 5 #endif -// Mega Evolution settings -#define B_MEGA_EVO_TURN_ORDER GEN_7 // In Gen7, a Pokémon's Speed after Mega Evolution is used to determine turn order, not its Speed before. - // Calculation settings #define B_CRIT_CHANCE GEN_7 // Chances of a critical hit landing. See CalcCritChanceStage. #define B_CRIT_MULTIPLIER GEN_7 // In Gen6+, critical hits multiply damage by 1.5 instead of 2. @@ -127,13 +124,16 @@ #define B_STEEL_RESISTANCES GEN_7 // In Gen6+, Steel-type Pokémon are no longer resistant to Dark-type and Ghost-type moves. #define B_PRANKSTER_DARK_TYPES GEN_7 // In Gen7+, Prankster-elevated status moves do not affect Dark type Pokémon. -// Turn count settings +// Turn settings #define B_BINDING_TURNS GEN_7 // In Gen5+, binding moves last for 4-5 turns instead of 2-5 turns. (With Grip Claw, 7 and 5 turns respectively.) #define B_UPROAR_TURNS GEN_7 // In Gen5+, Uproar lasts for 3 turns instead of 2-5 turns. #define B_DISABLE_TURNS GEN_7 // Disable's turns. See Cmd_disablelastusedattack. #define B_TAILWIND_TURNS GEN_7 // In Gen5+, Tailwind lasts 4 turns instead of 3. #define B_SLEEP_TURNS GEN_7 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. #define B_TAUNT_TURNS GEN_7 // In Gen5+, Taunt lasts 3 turns if the user acts before the target, or 4 turns if the target acted before the user. In Gen3, taunt lasts 2 turns and in Gen 4, 3-5 turns. +#define B_MEGA_EVO_TURN_ORDER GEN_7 // In Gen7, a Pokémon's Speed after Mega Evolution is used to determine turn order, not its Speed before. +#define B_RECALC_TURN_AFTER_ACTIONS GEN_8 // In gen 8, switching/using a move have consequences for the turn order of the current turn. + // 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. From 6ceffaaf3e5c0e981c7e81b03de0bdc7c91cf0da Mon Sep 17 00:00:00 2001 From: kleeenexfeu Date: Tue, 23 Nov 2021 13:46:36 +0100 Subject: [PATCH 014/105] recalculate turn order after relevant actions --- include/constants/battle_config.h | 1 - src/battle_util.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 3180212f88..ac3da4dd4e 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -134,7 +134,6 @@ #define B_MEGA_EVO_TURN_ORDER GEN_7 // In Gen7, a Pokémon's Speed after Mega Evolution is used to determine turn order, not its Speed before. #define B_RECALC_TURN_AFTER_ACTIONS GEN_8 // In gen 8, switching/using a move have consequences for the turn order of the current turn. - // 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. #define B_PHYSICAL_SPECIAL_SPLIT GEN_7 // In Gen3, the move's type determines if it will do physical or special damage. The split icon in the summary will reflect this. diff --git a/src/battle_util.c b/src/battle_util.c index 7e2320500c..7953565a03 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -871,6 +871,11 @@ void HandleAction_NothingIsFainted(void) void HandleAction_ActionFinished(void) { + #if B_RECALC_TURN_AFTER_ACTIONS >= GEN_8 + u8 i, j; + u8 battler1 = 0; + u8 battler2 = 0; + #endif *(gBattleStruct->monToSwitchIntoId + gBattlerByTurnOrder[gCurrentTurnActionNumber]) = 6; gCurrentTurnActionNumber++; gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; @@ -894,6 +899,31 @@ void HandleAction_ActionFinished(void) gBattleCommunication[4] = 0; gBattleScripting.multihitMoveEffect = 0; gBattleResources->battleScriptsStack->size = 0; + + #if B_RECALC_TURN_AFTER_ACTIONS >= GEN_8 + // i starts at `gCurrentTurnActionNumber` because we don't want to recalculate turn order for mon that have already + // taken action. It's been previously increased, which we want in order to not recalculate the turn of the mon that just finished its action + for (i = gCurrentTurnActionNumber; i < gBattlersCount - 1; i++) + { + for (j = i + 1; j < gBattlersCount; j++) + { + u8 battler1 = gBattlerByTurnOrder[i]; + u8 battler2 = gBattlerByTurnOrder[j]; + // We recalculate order only for action of the same priority. If any action other than switch/move has been taken, they should + // have been executed before. The only recalculation needed is for moves/switch. Mega evolution is handled in src/battle_main.c/TryChangeOrder + if((gActionsByTurnOrder[i] == B_ACTION_USE_MOVE && gActionsByTurnOrder[j] == B_ACTION_USE_MOVE)) + { + if (GetWhoStrikesFirst(battler1, battler2, FALSE)) + SwapTurnOrder(i, j); + } + else if ((gActionsByTurnOrder[i] == B_ACTION_SWITCH && gActionsByTurnOrder[j] == B_ACTION_SWITCH)) + { + if (GetWhoStrikesFirst(battler1, battler2, TRUE)) // If the actions chosen are switching, we recalc order but ignoring the moves + SwapTurnOrder(i, j); + } + } + } + #endif } // rom const data From 1a3561bb0bf4bcb3aa57a8029a3684b2adcfe2c8 Mon Sep 17 00:00:00 2001 From: kleeenexfeu Date: Tue, 23 Nov 2021 13:48:03 +0100 Subject: [PATCH 015/105] space --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 7953565a03..ffe7c0b96f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -875,7 +875,7 @@ void HandleAction_ActionFinished(void) u8 i, j; u8 battler1 = 0; u8 battler2 = 0; - #endif + #endif *(gBattleStruct->monToSwitchIntoId + gBattlerByTurnOrder[gCurrentTurnActionNumber]) = 6; gCurrentTurnActionNumber++; gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; From 84e6e083f7d9d5830f000f07baf1bf7562c30ec1 Mon Sep 17 00:00:00 2001 From: kleeenexfeu <94004034+kleeenexfeu@users.noreply.github.com> Date: Tue, 23 Nov 2021 14:24:30 +0100 Subject: [PATCH 016/105] hate the explanations about turn order ._. Co-authored-by: Eduardo Quezada D'Ottone --- 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 ac3da4dd4e..b792a6f723 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -132,7 +132,7 @@ #define B_SLEEP_TURNS GEN_7 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. #define B_TAUNT_TURNS GEN_7 // In Gen5+, Taunt lasts 3 turns if the user acts before the target, or 4 turns if the target acted before the user. In Gen3, taunt lasts 2 turns and in Gen 4, 3-5 turns. #define B_MEGA_EVO_TURN_ORDER GEN_7 // In Gen7, a Pokémon's Speed after Mega Evolution is used to determine turn order, not its Speed before. -#define B_RECALC_TURN_AFTER_ACTIONS GEN_8 // In gen 8, switching/using a move have consequences for the turn order of the current turn. +#define B_RECALC_TURN_AFTER_ACTIONS GEN_8 // In Gen8, switching/using a move has consequences over the turn order of the rest of the current turn. // 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. From f2755ad97011672f482c7a0701c7a1853ea00eeb Mon Sep 17 00:00:00 2001 From: kleeenexfeu <94004034+kleeenexfeu@users.noreply.github.com> Date: Tue, 23 Nov 2021 14:28:52 +0100 Subject: [PATCH 017/105] reword B_RECALC_TURN_AFTER_ACTIONS explanation --- 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 b792a6f723..4c02605b1d 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -132,7 +132,7 @@ #define B_SLEEP_TURNS GEN_7 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. #define B_TAUNT_TURNS GEN_7 // In Gen5+, Taunt lasts 3 turns if the user acts before the target, or 4 turns if the target acted before the user. In Gen3, taunt lasts 2 turns and in Gen 4, 3-5 turns. #define B_MEGA_EVO_TURN_ORDER GEN_7 // In Gen7, a Pokémon's Speed after Mega Evolution is used to determine turn order, not its Speed before. -#define B_RECALC_TURN_AFTER_ACTIONS GEN_8 // In Gen8, switching/using a move has consequences over the turn order of the rest of the current turn. +#define B_RECALC_TURN_AFTER_ACTIONS GEN_8 // In Gen8, switching/using a move affects the current turn's order of switches/moves used. // 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. From 9b25e0147cc9f287a7b3505787cc40be1bc9042f Mon Sep 17 00:00:00 2001 From: kleeenexfeu <94004034+kleeenexfeu@users.noreply.github.com> Date: Tue, 23 Nov 2021 14:35:37 +0100 Subject: [PATCH 018/105] Update include/constants/battle_config.h Co-authored-by: LOuroboros --- 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 4c02605b1d..795fe30755 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -132,7 +132,7 @@ #define B_SLEEP_TURNS GEN_7 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. #define B_TAUNT_TURNS GEN_7 // In Gen5+, Taunt lasts 3 turns if the user acts before the target, or 4 turns if the target acted before the user. In Gen3, taunt lasts 2 turns and in Gen 4, 3-5 turns. #define B_MEGA_EVO_TURN_ORDER GEN_7 // In Gen7, a Pokémon's Speed after Mega Evolution is used to determine turn order, not its Speed before. -#define B_RECALC_TURN_AFTER_ACTIONS GEN_8 // In Gen8, switching/using a move affects the current turn's order of switches/moves used. +#define B_RECALC_TURN_AFTER_ACTIONS GEN_8 // In Gen8, switching/using a move affects the current turn's order of actions. // 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. From e3ddad2d11e0e8f46965ec218157c4b7d681e837 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 23 Nov 2021 18:36:10 -0500 Subject: [PATCH 019/105] add sport effects back --- include/constants/battle_config.h | 1 + src/battle_util.c | 3 +++ 2 files changed, 4 insertions(+) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 29b7b57503..89b6af3443 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -119,6 +119,7 @@ #define B_HIDDEN_POWER_DMG GEN_7 // In Gen6+, Hidden Power's base power was set to always be 60. Before, it was determined by the mon's IVs. #define B_ROUGH_SKIN_DMG GEN_7 // In Gen4+, Rough Skin contact damage is 1/8th of max HP instead of 1/16th. This will also affect Iron Barbs. #define B_KNOCK_OFF_DMG GEN_8 // In Gen6+, Knock Off deals 50% more damage when knocking off an item +#define B_SPORT_DMG_REDUCTION GEN_7 // In Gen5+, Water/Mud Sport reduce Fire/Electric Damage by 67% instead of 50% // Type settings #define B_GHOSTS_ESCAPE GEN_7 // In Gen6+, abilities like Shadow Tag or moves like Mean Look fail on Ghost-type Pokémon. They can also escape any Wild Battle. diff --git a/src/battle_util.c b/src/battle_util.c index 7e2320500c..52d24f7a6e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8321,6 +8321,9 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe MulModifier(&modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8) ? UQ_4_12(1.3) : UQ_4_12(1.5)); if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN && moveType == TYPE_PSYCHIC && IsBattlerGrounded(battlerAtk) && !(gStatuses3[battlerAtk] & STATUS3_SEMI_INVULNERABLE)) MulModifier(&modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8) ? UQ_4_12(1.3) : UQ_4_12(1.5)); + if ((gFieldStatuses & STATUS_FIELD_MUDSPORT && moveType == TYPE_ELECTRIC) + || (gFieldStatuses & STATUS_FIELD_WATERSPORT && moveType == TYPE_FIRE)) + MulModifier(&modifier, (B_SPORT_DMG_REDUCTION >= GEN_5) ? UQ_4_12(0.67) : UQ_4_12(0.5)); return ApplyModifier(modifier, basePower); } From b5bc8bb3465f175b0804d8554721dc217b9d85cd Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 23 Nov 2021 18:37:27 -0500 Subject: [PATCH 020/105] fix B_SPORT_DMG_REDUCTION --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 52d24f7a6e..5594ecf5a7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8323,7 +8323,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe MulModifier(&modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8) ? UQ_4_12(1.3) : UQ_4_12(1.5)); if ((gFieldStatuses & STATUS_FIELD_MUDSPORT && moveType == TYPE_ELECTRIC) || (gFieldStatuses & STATUS_FIELD_WATERSPORT && moveType == TYPE_FIRE)) - MulModifier(&modifier, (B_SPORT_DMG_REDUCTION >= GEN_5) ? UQ_4_12(0.67) : UQ_4_12(0.5)); + MulModifier(&modifier, (B_SPORT_DMG_REDUCTION >= GEN_5) ? UQ_4_12(0.23) : UQ_4_12(0.5)); return ApplyModifier(modifier, basePower); } From 5c52abd85602b8b349615cff37190acfc42a9b0d Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 23 Nov 2021 21:20:32 -0500 Subject: [PATCH 021/105] gen3 sport move functionality behind config --- include/battle_util.h | 3 ++ include/constants/battle.h | 2 + include/constants/battle_config.h | 5 ++- src/battle_ai_main.c | 2 + src/battle_script_commands.c | 46 +++++++++++++------- src/battle_util.c | 70 ++++++++++++++++++++++++------- 6 files changed, 96 insertions(+), 32 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index b1a2a15347..e4a99eb54d 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -24,7 +24,10 @@ #define ABILITYEFFECT_TRACE2 13 #define ABILITYEFFECT_MOVE_END_OTHER 14 #define ABILITYEFFECT_NEUTRALIZINGGAS 15 +#define ABILITYEFFECT_FIELD_SPORT 16 // Only used if B_SPORT_TURNS < GEN_6 // Special cases +#define ABILITYEFFECT_MUD_SPORT 0xFC // Only used if B_SPORT_TURNS < GEN_6 +#define ABILITYEFFECT_WATER_SPORT 0xFD // Only used if B_SPORT_TURNS < GEN_6 #define ABILITYEFFECT_SWITCH_IN_TERRAIN 0xFE #define ABILITYEFFECT_SWITCH_IN_WEATHER 0xFF diff --git a/include/constants/battle.h b/include/constants/battle.h index 28934abc25..69157fa78a 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -174,6 +174,8 @@ #define STATUS4_ELECTRIFIED (1 << 0) #define STATUS4_PLASMA_FISTS (1 << 1) +#define STATUS4_MUD_SPORT (1 << 2) // Only used if B_SPORT_TURNS < GEN_6 +#define STATUS4_WATER_SPORT (1 << 3) // Only used if B_SPORT_TURNS < GEN_6 #define HITMARKER_x10 (1 << 4) #define HITMARKER_SKIP_DMG_TRACK (1 << 5) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 89b6af3443..e583824e2b 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -118,8 +118,8 @@ #define B_PAYBACK_SWITCH_BOOST GEN_7 // In Gen5+, if the opponent switches out, Payback's damage will no longer be doubled. #define B_HIDDEN_POWER_DMG GEN_7 // In Gen6+, Hidden Power's base power was set to always be 60. Before, it was determined by the mon's IVs. #define B_ROUGH_SKIN_DMG GEN_7 // In Gen4+, Rough Skin contact damage is 1/8th of max HP instead of 1/16th. This will also affect Iron Barbs. -#define B_KNOCK_OFF_DMG GEN_8 // In Gen6+, Knock Off deals 50% more damage when knocking off an item -#define B_SPORT_DMG_REDUCTION GEN_7 // In Gen5+, Water/Mud Sport reduce Fire/Electric Damage by 67% instead of 50% +#define B_KNOCK_OFF_DMG GEN_8 // In Gen6+, Knock Off deals 50% more damage when knocking off an item. +#define B_SPORT_DMG_REDUCTION GEN_7 // In Gen5+, Water/Mud Sport reduce Fire/Electric Damage by 67% instead of 50%. // Type settings #define B_GHOSTS_ESCAPE GEN_7 // In Gen6+, abilities like Shadow Tag or moves like Mean Look fail on Ghost-type Pokémon. They can also escape any Wild Battle. @@ -135,6 +135,7 @@ #define B_TAILWIND_TURNS GEN_7 // In Gen5+, Tailwind lasts 4 turns instead of 3. #define B_SLEEP_TURNS GEN_7 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. #define B_TAUNT_TURNS GEN_7 // In Gen5+, Taunt lasts 3 turns if the user acts before the target, or 4 turns if the target acted before the user. In Gen3, taunt lasts 2 turns and in Gen 4, 3-5 turns. +#define B_SPORT_TURNS GEN_7 // In Gen6+, Water/Mud Sport last 5 turns, even if the user switches out. // 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. diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 86e5f40493..faf7a8d4b1 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1534,11 +1534,13 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) break; case EFFECT_MUD_SPORT: if (gFieldStatuses & STATUS_FIELD_MUDSPORT + || gStatuses4[battlerAtk] & STATUS4_MUD_SPORT || PartnerHasSameMoveEffectWithoutTarget(AI_DATA->battlerAtkPartner, move, AI_DATA->partnerMove)) score -= 10; break; case EFFECT_WATER_SPORT: if (gFieldStatuses & STATUS_FIELD_WATERSPORT + || gStatuses4[battlerAtk] & STATUS4_WATER_SPORT || PartnerHasSameMoveEffectWithoutTarget(AI_DATA->battlerAtkPartner, move, AI_DATA->partnerMove)) score -= 10; break; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4ae42cb487..d36b8b9d62 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12955,23 +12955,41 @@ static void Cmd_settypebasedhalvers(void) // water and mud sport if (gBattleMoves[gCurrentMove].effect == EFFECT_MUD_SPORT) { - if (!(gFieldStatuses & STATUS_FIELD_MUDSPORT)) - { - gFieldStatuses |= STATUS_FIELD_MUDSPORT; - gFieldTimers.mudSportTimer = 5; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; - worked = TRUE; - } + #if B_SPORT_TURNS >= GEN_6 + if (!(gFieldStatuses & STATUS_FIELD_MUDSPORT)) + { + gFieldStatuses |= STATUS_FIELD_MUDSPORT; + gFieldTimers.mudSportTimer = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; + worked = TRUE; + } + #else + if (!(gStatuses4[gBattlerAttacker] & STATUS4_MUD_SPORT)) + { + gStatuses4[gBattlerAttacker] |= STATUS4_MUD_SPORT; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; + worked = TRUE; + } + #endif } else // water sport { - if (!(gFieldStatuses & STATUS_FIELD_WATERSPORT)) - { - gFieldStatuses |= STATUS_FIELD_WATERSPORT; - gFieldTimers.waterSportTimer = 5; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; - worked = TRUE; - } + #if B_SPORT_TURNS >= GEN_6 + if (!(gFieldStatuses & STATUS_FIELD_WATERSPORT)) + { + gFieldStatuses |= STATUS_FIELD_WATERSPORT; + gFieldTimers.waterSportTimer = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; + worked = TRUE; + } + #else + if (!(gStatuses4[gBattlerAttacker] & STATUS4_WATER_SPORT)) + { + gStatuses4[gBattlerAttacker] |= v; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; + worked = TRUE; + } + #endif } if (worked) diff --git a/src/battle_util.c b/src/battle_util.c index 5594ecf5a7..18e05a6c7b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2372,21 +2372,25 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_WATER_SPORT: - if (gFieldStatuses & STATUS_FIELD_WATERSPORT && --gFieldTimers.waterSportTimer == 0) - { - gFieldStatuses &= ~(STATUS_FIELD_WATERSPORT); - BattleScriptExecute(BattleScript_WaterSportEnds); - effect++; - } + #if B_SPORT_TURNS >= GEN_6 + if (gFieldStatuses & STATUS_FIELD_WATERSPORT && --gFieldTimers.waterSportTimer == 0) + { + gFieldStatuses &= ~(STATUS_FIELD_WATERSPORT); + BattleScriptExecute(BattleScript_WaterSportEnds); + effect++; + } + #endif gBattleStruct->turnCountersTracker++; break; case ENDTURN_MUD_SPORT: - if (gFieldStatuses & STATUS_FIELD_MUDSPORT && --gFieldTimers.mudSportTimer == 0) - { - gFieldStatuses &= ~(STATUS_FIELD_MUDSPORT); - BattleScriptExecute(BattleScript_MudSportEnds); - effect++; - } + #if B_SPORT_TURNS >= GEN_6 + if (gFieldStatuses & STATUS_FIELD_MUDSPORT && --gFieldTimers.mudSportTimer == 0) + { + gFieldStatuses &= ~(STATUS_FIELD_MUDSPORT); + BattleScriptExecute(BattleScript_MudSportEnds); + effect++; + } + #endif gBattleStruct->turnCountersTracker++; break; case ENDTURN_GRAVITY: @@ -5609,6 +5613,35 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move break; } break; + case ABILITYEFFECT_FIELD_SPORT: + switch (gLastUsedAbility) + { + case ABILITYEFFECT_MUD_SPORT: + for (i = 0; i < gBattlersCount; i++) + { + if (gStatuses4[i] & STATUS4_MUD_SPORT) + effect = i + 1; + } + break; + case ABILITYEFFECT_WATER_SPORT: + for (i = 0; i < gBattlersCount; i++) + { + if (gStatuses4[i] & STATUS4_WATER_SPORT) + effect = i + 1; + } + break; + default: + for (i = 0; i < gBattlersCount; i++) + { + if (gBattleMons[i].ability == ability) + { + gLastUsedAbility = ability; + effect = i + 1; + } + } + break; + } + break; } if (effect && gLastUsedAbility != 0xFF) @@ -8321,10 +8354,15 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe MulModifier(&modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8) ? UQ_4_12(1.3) : UQ_4_12(1.5)); if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN && moveType == TYPE_PSYCHIC && IsBattlerGrounded(battlerAtk) && !(gStatuses3[battlerAtk] & STATUS3_SEMI_INVULNERABLE)) MulModifier(&modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8) ? UQ_4_12(1.3) : UQ_4_12(1.5)); - if ((gFieldStatuses & STATUS_FIELD_MUDSPORT && moveType == TYPE_ELECTRIC) - || (gFieldStatuses & STATUS_FIELD_WATERSPORT && moveType == TYPE_FIRE)) - MulModifier(&modifier, (B_SPORT_DMG_REDUCTION >= GEN_5) ? UQ_4_12(0.23) : UQ_4_12(0.5)); - + #if B_SPORT_TURNS >= GEN_6 + if ((gFieldStatuses & STATUS_FIELD_MUDSPORT && moveType == TYPE_ELECTRIC) + || (gFieldStatuses & STATUS_FIELD_WATERSPORT && moveType == TYPE_FIRE)) + MulModifier(&modifier, (B_SPORT_DMG_REDUCTION >= GEN_5) ? UQ_4_12(0.23) : UQ_4_12(0.5)); + #else + if ((moveType == TYPE_ELECTRIC && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, ABILITYEFFECT_MUD_SPORT, 0)) + || (moveType == TYPE_FIRE && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, ABILITYEFFECT_WATER_SPORT, 0))) + MulModifier(&modifier, (B_SPORT_DMG_REDUCTION >= GEN_5) ? UQ_4_12(0.23) : UQ_4_12(0.5)); + #endif return ApplyModifier(modifier, basePower); } From 95ad508868ab0bd5ff993c206b51a2f9f4350d94 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 23 Nov 2021 21:25:03 -0500 Subject: [PATCH 022/105] baton pass status4_xx_sport --- src/battle_main.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index 84f66d6ded..b81862faaf 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2975,7 +2975,7 @@ void SwitchInClearSetData(void) gStatuses3[gActiveBattler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_GASTRO_ACID | STATUS3_EMBARGO | STATUS3_TELEKINESIS | STATUS3_MAGNET_RISE | STATUS3_HEAL_BLOCK | STATUS3_AQUA_RING | STATUS3_POWER_TRICK); - + gStatuses4[gActiveBattler] &= (STATUS4_MUD_SPORT | STATUS4_WATER_SPORT); for (i = 0; i < gBattlersCount; i++) { if (GetBattlerSide(gActiveBattler) != GetBattlerSide(i) @@ -2993,9 +2993,8 @@ void SwitchInClearSetData(void) { gBattleMons[gActiveBattler].status2 = 0; gStatuses3[gActiveBattler] = 0; + gStatuses4[gActiveBattler] = 0; } - - gStatuses4[gActiveBattler] = 0; for (i = 0; i < gBattlersCount; i++) { From 68c557fd461bbc6b6f92bdf59b20e0f1f5924e14 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 24 Nov 2021 18:54:15 -0300 Subject: [PATCH 023/105] Updated Light Ball's effect and improved readability --- src/battle_util.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 7e2320500c..c10bbce1f0 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8330,6 +8330,9 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b u8 atkStage; u32 atkStat; u16 modifier; + u16 atkBaseSpeciesId; + + atkBaseSpeciesId = GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species); if (gBattleMoves[move].effect == EFFECT_FOUL_PLAY) { @@ -8476,9 +8479,7 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b switch (GetBattlerHoldEffect(battlerAtk, TRUE)) { case HOLD_EFFECT_THICK_CLUB: - if ((GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_CUBONE - || GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_MAROWAK) - && IS_MOVE_PHYSICAL(move)) + if ((atkBaseSpeciesId == SPECIES_CUBONE || atkBaseSpeciesId == SPECIES_MAROWAK) && IS_MOVE_PHYSICAL(move)) MulModifier(&modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_DEEP_SEA_TOOTH: @@ -8486,7 +8487,7 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b MulModifier(&modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_LIGHT_BALL: - if (gBattleMons[battlerAtk].species == SPECIES_PIKACHU) + if (atkBaseSpeciesId == SPECIES_PIKACHU) MulModifier(&modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_CHOICE_BAND: From 7a7c6afc39796f4d056ca81a7539aff5fa542e8c Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Mon, 29 Nov 2021 12:42:01 -0500 Subject: [PATCH 024/105] larger ability popup, fix ability name printing/clearing, and config for longer ability names --- graphics/battle_interface/ability_pop_up.png | Bin 365 -> 275 bytes include/battle_main.h | 5 + include/constants/battle_config.h | 1 + src/battle_interface.c | 296 ++++++++++--------- src/data/text/abilities.h | 274 +++++++++++++++++ 5 files changed, 441 insertions(+), 135 deletions(-) diff --git a/graphics/battle_interface/ability_pop_up.png b/graphics/battle_interface/ability_pop_up.png index 4b549b1b5380aa3dae7759e635044ff58ea47d3d..92971a7a51f0a79e0b4ef940ed09c3960cdc35e0 100644 GIT binary patch delta 190 zcmV;v073ul0+RxeB$0kRf1XK1K~zYIV_;wqQo;v-@+L0$00X0mksv<6z~mH)7cdB$ z5>TL`N=Sj|$WVYcpn*ZHl7=5JsFdReqY7XO(g`R~HX{(!1o90qpK spo~yZCmUf?;6f`sfBTiW^2Cl1>6E86^Fo>79MwA5SrUO>lu^0-Ch1K zW&d;(C_B;9#WAE}&f6c- z_dV-LW2QF_E)hJ8EazrUY1pZhVDgGnVn4$d?gI|*g_!rgk+)&CUR||PaYK&fFV+VS a_b90U*7V=+nkCi)@`I 0) - { - do - { - if (arg3) - CpuCopy32(windowTileData + 16, dest + 16, 16); - else - CpuCopy32(windowTileData + 20, dest + 20, 12); - dest += 32, windowTileData += 32; - arg2--; - } while (arg2 != 0); - } + CpuCopy32(windowTileData + 256, dest + 256, arg2 * 32); + if (arg2 > 0) + { + do + { + if (arg3) + CpuCopy32(windowTileData + 16, dest + 16, 16); + else + CpuCopy32(windowTileData + 20, dest + 20, 12); + dest += 32, windowTileData += 32; + arg2--; + } while (arg2 != 0); + } } #define MAX_CHARS_PRINTED 12 static void PrintOnAbilityPopUp(const u8 *str, u8 *spriteTileData1, u8 *spriteTileData2, u32 x1, u32 x2, u32 y, u32 color1, u32 color2, u32 color3) { - u32 windowId, i; - u8 *windowTileData; - u8 text1[MAX_CHARS_PRINTED + 2]; - u8 text2[MAX_CHARS_PRINTED + 2]; + u32 windowId, i; + u8 *windowTileData; + u8 text1[MAX_CHARS_PRINTED]; + u8 text2[MAX_CHARS_PRINTED]; - for (i = 0; i < MAX_CHARS_PRINTED + 1; i++) - { - text1[i] = str[i]; - if (text1[i] == EOS) - break; - } - text1[i] = EOS; + for (i = 0; i < MAX_CHARS_PRINTED; i++) + { + text1[i] = str[i]; + if (text1[i] == EOS) + break; + } + text1[i] = EOS; - windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(text1, x1, y, color1, color2, color3, &windowId); - TextIntoAbilityPopUp(spriteTileData1, windowTileData, 8, (y == 0)); - RemoveWindow(windowId); + windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(text1, x1, y, color1, color2, color3, &windowId); + TextIntoAbilityPopUp(spriteTileData1, windowTileData, 8, (y == 0)); + RemoveWindow(windowId); - if (i == MAX_CHARS_PRINTED + 1) - { - for (i = 0; i < MAX_CHARS_PRINTED; i++) - { - text2[i] = str[MAX_CHARS_PRINTED + i]; - if (text2[i] == EOS) - break; - } - text2[i] = EOS; + if (i == MAX_CHARS_PRINTED) + { + for (i = 0; i < MAX_CHARS_PRINTED; i++) + { + text2[i] = str[MAX_CHARS_PRINTED + i]; + if (text2[i] == EOS) + break; + } + text2[i] = EOS; - windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(text2, x2, y, color1, color2, color3, &windowId); - TextIntoAbilityPopUp(spriteTileData2, windowTileData, 1, (y == 0)); - RemoveWindow(windowId); - } + windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(text2, x2, y, color1, color2, color3, &windowId); + TextIntoAbilityPopUp(spriteTileData2, windowTileData, 3, (y == 0)); + RemoveWindow(windowId); + } +} + +static const u8 sText_Space16[]= _(" "); +static void ClearAbilityName(u8 spriteId1, u8 spriteId2) +{ + PrintOnAbilityPopUp(sText_Space16, + (void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32) + 256, + (void*)(OBJ_VRAM0) + (gSprites[spriteId2].oam.tileNum * 32) + 256, + 6, 1, + 4, + 7, 9, 1); } static void PrintBattlerOnAbilityPopUp(u8 battlerId, u8 spriteId1, u8 spriteId2) @@ -2976,111 +2987,125 @@ static void PrintAbilityOnAbilityPopUp(u32 ability, u8 spriteId1, u8 spriteId2) PrintOnAbilityPopUp(gAbilityNames[ability], (void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32) + 256, (void*)(OBJ_VRAM0) + (gSprites[spriteId2].oam.tileNum * 32) + 256, - 7, 1, + 6, 1, 4, 7, 9, 1); } -#define PIXEL_COORDS_TO_OFFSET(x, y)( \ -/*Add tiles by X*/ \ -((y / 8) * 32 * 8) \ -/*Add tiles by X*/ \ -+ ((x / 8) * 32) \ -/*Add pixels by Y*/ \ -+ ((((y) - ((y / 8) * 8))) * 4) \ -/*Add pixels by X*/ \ +#define PIXEL_COORDS_TO_OFFSET(x, y)( \ +/*Add tiles by X*/ \ +((y / 8) * 32 * 8) \ +/*Add tiles by X*/ \ ++ ((x / 8) * 32) \ +/*Add pixels by Y*/ \ ++ ((((y) - ((y / 8) * 8))) * 4) \ +/*Add pixels by X*/ \ + ((((x) - ((x / 8) * 8)) / 2))) static const u16 sOverwrittenPixelsTable[][2] = { - {PIXEL_COORDS_TO_OFFSET(0, 0), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 1), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 2), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 3), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 4), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 5), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 6), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 7), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 8), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 9), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 10), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 11), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 12), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(0, 0), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 1), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 2), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 3), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 4), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 5), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 6), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 7), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 8), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 9), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 10), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 11), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 12), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(8, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(24, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(32, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(40, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(48, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(56, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(8, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(16, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(24, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(32, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(40, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(48, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(56, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(0, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(8, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(24, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(32, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(40, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(48, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(56, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(0, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(8, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(16, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(24, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(32, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(40, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(48, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(56, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(0, 15), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 16), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 17), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 18), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 19), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 20), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 21), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 22), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 23), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 24), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 25), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 26), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 15), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 16), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 17), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 18), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 19), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 20), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 21), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 22), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 23), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 24), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 25), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 26), 3}, + +//Second Row Of Image + {PIXEL_COORDS_TO_OFFSET(0, 45), 8}, + {PIXEL_COORDS_TO_OFFSET(0, 46), 8}, + {PIXEL_COORDS_TO_OFFSET(0, 47), 8}, + //{PIXEL_COORDS_TO_OFFSET(0, 48), 8}, // cuts off the top of the 'G' in Neutralizing Gas + {PIXEL_COORDS_TO_OFFSET(8, 45), 8}, + {PIXEL_COORDS_TO_OFFSET(8, 46), 8}, + {PIXEL_COORDS_TO_OFFSET(8, 47), 8}, + {PIXEL_COORDS_TO_OFFSET(8, 48), 8}, + {PIXEL_COORDS_TO_OFFSET(16, 45), 8}, + {PIXEL_COORDS_TO_OFFSET(16, 46), 8}, + {PIXEL_COORDS_TO_OFFSET(16, 47), 8}, + {PIXEL_COORDS_TO_OFFSET(16, 48), 8}, }; static inline void CopyPixels(u8 *dest, const u8 *src, u32 pixelCount) { - u32 i = 0; + u32 i = 0; - if (pixelCount & 1) - { - while (pixelCount != 0) - { - dest[i] &= ~(0xF); - dest[i] |= (src[i] & 0xF); - if (--pixelCount != 0) - { - dest[i] &= ~(0xF0); - dest[i] |= (src[i] & 0xF0); - pixelCount--; - } - i++; - } - } - else - { - for (i = 0; i < pixelCount / 2; i++) - dest[i] = src[i]; - } + if (pixelCount & 1) + { + while (pixelCount != 0) + { + dest[i] &= ~(0xF); + dest[i] |= (src[i] & 0xF); + if (--pixelCount != 0) + { + dest[i] &= ~(0xF0); + dest[i] |= (src[i] & 0xF0); + pixelCount--; + } + i++; + } + } + else + { + for (i = 0; i < pixelCount / 2; i++) + dest[i] = src[i]; + } } static void RestoreOverwrittenPixels(u8 *tiles) { - u32 i; - u8 *buffer = Alloc(sizeof(sAbilityPopUpGfx) * 2); + u32 i; + u8 *buffer = Alloc(sizeof(sAbilityPopUpGfx) * 2); - CpuCopy32(tiles, buffer, sizeof(sAbilityPopUpGfx)); + CpuCopy32(tiles, buffer, sizeof(sAbilityPopUpGfx)); - for (i = 0; i < ARRAY_COUNT(sOverwrittenPixelsTable); i++) - { - CopyPixels(buffer + sOverwrittenPixelsTable[i][0], - sAbilityPopUpGfx + sOverwrittenPixelsTable[i][0], - sOverwrittenPixelsTable[i][1]); - } + for (i = 0; i < ARRAY_COUNT(sOverwrittenPixelsTable); i++) + { + CopyPixels(buffer + sOverwrittenPixelsTable[i][0], + sAbilityPopUpGfx + sOverwrittenPixelsTable[i][0], + sOverwrittenPixelsTable[i][1]); + } - CpuCopy32(buffer, tiles, sizeof(sAbilityPopUpGfx)); - Free(buffer); + CpuCopy32(buffer, tiles, sizeof(sAbilityPopUpGfx)); + Free(buffer); } void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle) @@ -3163,6 +3188,7 @@ void UpdateAbilityPopup(u8 battlerId) u8 spriteId2 = gBattleStruct->abilityPopUpSpriteIds[battlerId][1]; u16 ability = (gBattleScripting.abilityPopupOverwrite != 0) ? gBattleScripting.abilityPopupOverwrite : gBattleMons[battlerId].ability; + ClearAbilityName(spriteId1, spriteId2); PrintAbilityOnAbilityPopUp(ability, spriteId1, spriteId2); RestoreOverwrittenPixels((void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32)); } diff --git a/src/data/text/abilities.h b/src/data/text/abilities.h index c2c17b7371..76fad45982 100644 --- a/src/data/text/abilities.h +++ b/src/data/text/abilities.h @@ -255,6 +255,279 @@ static const u8 sGrimNeighDescription[] = _("KOs boost Sp. Atk stat."); static const u8 sAsOneIceRiderDescription[] = _("Unnerve and Chilling Neigh."); static const u8 sAsOneShadowRiderDescription[] = _("Unnerve and Grim Neigh."); +#if B_EXPANDED_ABILITY_NAMES == TRUE +const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] = +{ + [ABILITY_NONE] = _("-------"), + [ABILITY_STENCH] = _("Stench"), + [ABILITY_DRIZZLE] = _("Drizzle"), + [ABILITY_SPEED_BOOST] = _("Speed Boost"), + [ABILITY_BATTLE_ARMOR] = _("Battle Armor"), + [ABILITY_STURDY] = _("Sturdy"), + [ABILITY_DAMP] = _("Damp"), + [ABILITY_LIMBER] = _("Limber"), + [ABILITY_SAND_VEIL] = _("Sand Veil"), + [ABILITY_STATIC] = _("Static"), + [ABILITY_VOLT_ABSORB] = _("Volt Absorb"), + [ABILITY_WATER_ABSORB] = _("Water Absorb"), + [ABILITY_OBLIVIOUS] = _("Oblivious"), + [ABILITY_CLOUD_NINE] = _("Cloud Nine"), + [ABILITY_COMPOUND_EYES] = _("CompoundEyes"), + [ABILITY_INSOMNIA] = _("Insomnia"), + [ABILITY_COLOR_CHANGE] = _("Color Change"), + [ABILITY_IMMUNITY] = _("Immunity"), + [ABILITY_FLASH_FIRE] = _("Flash Fire"), + [ABILITY_SHIELD_DUST] = _("Shield Dust"), + [ABILITY_OWN_TEMPO] = _("Own Tempo"), + [ABILITY_SUCTION_CUPS] = _("Suction Cups"), + [ABILITY_INTIMIDATE] = _("Intimidate"), + [ABILITY_SHADOW_TAG] = _("Shadow Tag"), + [ABILITY_ROUGH_SKIN] = _("Rough Skin"), + [ABILITY_WONDER_GUARD] = _("Wonder Guard"), + [ABILITY_LEVITATE] = _("Levitate"), + [ABILITY_EFFECT_SPORE] = _("Effect Spore"), + [ABILITY_SYNCHRONIZE] = _("Synchronize"), + [ABILITY_CLEAR_BODY] = _("Clear Body"), + [ABILITY_NATURAL_CURE] = _("Natural Cure"), + [ABILITY_LIGHTNING_ROD] = _("LightningRod"), + [ABILITY_SERENE_GRACE] = _("Serene Grace"), + [ABILITY_SWIFT_SWIM] = _("Swift Swim"), + [ABILITY_CHLOROPHYLL] = _("Chlorophyll"), + [ABILITY_ILLUMINATE] = _("Illuminate"), + [ABILITY_TRACE] = _("Trace"), + [ABILITY_HUGE_POWER] = _("Huge Power"), + [ABILITY_POISON_POINT] = _("Poison Point"), + [ABILITY_INNER_FOCUS] = _("Inner Focus"), + [ABILITY_MAGMA_ARMOR] = _("Magma Armor"), + [ABILITY_WATER_VEIL] = _("Water Veil"), + [ABILITY_MAGNET_PULL] = _("Magnet Pull"), + [ABILITY_SOUNDPROOF] = _("Soundproof"), + [ABILITY_RAIN_DISH] = _("Rain Dish"), + [ABILITY_SAND_STREAM] = _("Sand Stream"), + [ABILITY_PRESSURE] = _("Pressure"), + [ABILITY_THICK_FAT] = _("Thick Fat"), + [ABILITY_EARLY_BIRD] = _("Early Bird"), + [ABILITY_FLAME_BODY] = _("Flame Body"), + [ABILITY_RUN_AWAY] = _("Run Away"), + [ABILITY_KEEN_EYE] = _("Keen Eye"), + [ABILITY_HYPER_CUTTER] = _("Hyper Cutter"), + [ABILITY_PICKUP] = _("Pickup"), + [ABILITY_TRUANT] = _("Truant"), + [ABILITY_HUSTLE] = _("Hustle"), + [ABILITY_CUTE_CHARM] = _("Cute Charm"), + [ABILITY_PLUS] = _("Plus"), + [ABILITY_MINUS] = _("Minus"), + [ABILITY_FORECAST] = _("Forecast"), + [ABILITY_STICKY_HOLD] = _("Sticky Hold"), + [ABILITY_SHED_SKIN] = _("Shed Skin"), + [ABILITY_GUTS] = _("Guts"), + [ABILITY_MARVEL_SCALE] = _("Marvel Scale"), + [ABILITY_LIQUID_OOZE] = _("Liquid Ooze"), + [ABILITY_OVERGROW] = _("Overgrow"), + [ABILITY_BLAZE] = _("Blaze"), + [ABILITY_TORRENT] = _("Torrent"), + [ABILITY_SWARM] = _("Swarm"), + [ABILITY_ROCK_HEAD] = _("Rock Head"), + [ABILITY_DROUGHT] = _("Drought"), + [ABILITY_ARENA_TRAP] = _("Arena Trap"), + [ABILITY_VITAL_SPIRIT] = _("Vital Spirit"), + [ABILITY_WHITE_SMOKE] = _("White Smoke"), + [ABILITY_PURE_POWER] = _("Pure Power"), + [ABILITY_SHELL_ARMOR] = _("Shell Armor"), + [ABILITY_AIR_LOCK] = _("Air Lock"), + [ABILITY_TANGLED_FEET] = _("Tangled Feet"), + [ABILITY_MOTOR_DRIVE] = _("Motor Drive"), + [ABILITY_RIVALRY] = _("Rivalry"), + [ABILITY_STEADFAST] = _("Steadfast"), + [ABILITY_SNOW_CLOAK] = _("Snow Cloak"), + [ABILITY_GLUTTONY] = _("Gluttony"), + [ABILITY_ANGER_POINT] = _("Anger Point"), + [ABILITY_UNBURDEN] = _("Unburden"), + [ABILITY_HEATPROOF] = _("Heatproof"), + [ABILITY_SIMPLE] = _("Simple"), + [ABILITY_DRY_SKIN] = _("Dry Skin"), + [ABILITY_DOWNLOAD] = _("Download"), + [ABILITY_IRON_FIST] = _("Iron Fist"), + [ABILITY_POISON_HEAL] = _("Poison Heal"), + [ABILITY_ADAPTABILITY] = _("Adaptability"), + [ABILITY_SKILL_LINK] = _("Skill Link"), + [ABILITY_HYDRATION] = _("Hydration"), + [ABILITY_SOLAR_POWER] = _("Solar Power"), + [ABILITY_QUICK_FEET] = _("Quick Feet"), + [ABILITY_NORMALIZE] = _("Normalize"), + [ABILITY_SNIPER] = _("Sniper"), + [ABILITY_MAGIC_GUARD] = _("Magic Guard"), + [ABILITY_NO_GUARD] = _("No Guard"), + [ABILITY_STALL] = _("Stall"), + [ABILITY_TECHNICIAN] = _("Technician"), + [ABILITY_LEAF_GUARD] = _("Leaf Guard"), + [ABILITY_KLUTZ] = _("Klutz"), + [ABILITY_MOLD_BREAKER] = _("Mold Breaker"), + [ABILITY_SUPER_LUCK] = _("Super Luck"), + [ABILITY_AFTERMATH] = _("Aftermath"), + [ABILITY_ANTICIPATION] = _("Anticipation"), + [ABILITY_FOREWARN] = _("Forewarn"), + [ABILITY_UNAWARE] = _("Unaware"), + [ABILITY_TINTED_LENS] = _("Tinted Lens"), + [ABILITY_FILTER] = _("Filter"), + [ABILITY_SLOW_START] = _("Slow Start"), + [ABILITY_SCRAPPY] = _("Scrappy"), + [ABILITY_STORM_DRAIN] = _("Storm Drain"), + [ABILITY_ICE_BODY] = _("Ice Body"), + [ABILITY_SOLID_ROCK] = _("Solid Rock"), + [ABILITY_SNOW_WARNING] = _("Snow Warning"), + [ABILITY_HONEY_GATHER] = _("Honey Gather"), + [ABILITY_FRISK] = _("Frisk"), + [ABILITY_RECKLESS] = _("Reckless"), + [ABILITY_MULTITYPE] = _("Multitype"), + [ABILITY_FLOWER_GIFT] = _("Flower Gift"), + [ABILITY_BAD_DREAMS] = _("Bad Dreams"), + [ABILITY_PICKPOCKET] = _("Pickpocket"), + [ABILITY_SHEER_FORCE] = _("Sheer Force"), + [ABILITY_CONTRARY] = _("Contrary"), + [ABILITY_UNNERVE] = _("Unnerve"), + [ABILITY_DEFIANT] = _("Defiant"), + [ABILITY_DEFEATIST] = _("Defeatist"), + [ABILITY_CURSED_BODY] = _("Cursed Body"), + [ABILITY_HEALER] = _("Healer"), + [ABILITY_FRIEND_GUARD] = _("Friend Guard"), + [ABILITY_WEAK_ARMOR] = _("Weak Armor"), + [ABILITY_HEAVY_METAL] = _("Heavy Metal"), + [ABILITY_LIGHT_METAL] = _("Light Metal"), + [ABILITY_MULTISCALE] = _("Multiscale"), + [ABILITY_TOXIC_BOOST] = _("Toxic Boost"), + [ABILITY_FLARE_BOOST] = _("Flare Boost"), + [ABILITY_HARVEST] = _("Harvest"), + [ABILITY_TELEPATHY] = _("Telepathy"), + [ABILITY_MOODY] = _("Moody"), + [ABILITY_OVERCOAT] = _("Overcoat"), + [ABILITY_POISON_TOUCH] = _("Poison Touch"), + [ABILITY_REGENERATOR] = _("Regenerator"), + [ABILITY_BIG_PECKS] = _("Big Pecks"), + [ABILITY_SAND_RUSH] = _("Sand Rush"), + [ABILITY_WONDER_SKIN] = _("Wonder Skin"), + [ABILITY_ANALYTIC] = _("Analytic"), + [ABILITY_ILLUSION] = _("Illusion"), + [ABILITY_IMPOSTER] = _("Imposter"), + [ABILITY_INFILTRATOR] = _("Infiltrator"), + [ABILITY_MUMMY] = _("Mummy"), + [ABILITY_MOXIE] = _("Moxie"), + [ABILITY_JUSTIFIED] = _("Justified"), + [ABILITY_RATTLED] = _("Rattled"), + [ABILITY_MAGIC_BOUNCE] = _("Magic Bounce"), + [ABILITY_SAP_SIPPER] = _("Sap Sipper"), + [ABILITY_PRANKSTER] = _("Prankster"), + [ABILITY_SAND_FORCE] = _("Sand Force"), + [ABILITY_IRON_BARBS] = _("Iron Barbs"), + [ABILITY_ZEN_MODE] = _("Zen Mode"), + [ABILITY_VICTORY_STAR] = _("Victory Star"), + [ABILITY_TURBOBLAZE] = _("Turboblaze"), + [ABILITY_TERAVOLT] = _("Teravolt"), + [ABILITY_AROMA_VEIL] = _("Aroma Veil"), + [ABILITY_FLOWER_VEIL] = _("Flower Veil"), + [ABILITY_CHEEK_POUCH] = _("Cheek Pouch"), + [ABILITY_PROTEAN] = _("Protean"), + [ABILITY_FUR_COAT] = _("Fur Coat"), + [ABILITY_MAGICIAN] = _("Magician"), + [ABILITY_BULLETPROOF] = _("Bulletproof"), + [ABILITY_COMPETITIVE] = _("Competitive"), + [ABILITY_STRONG_JAW] = _("Strong Jaw"), + [ABILITY_REFRIGERATE] = _("Refrigerate"), + [ABILITY_SWEET_VEIL] = _("Sweet Veil"), + [ABILITY_STANCE_CHANGE] = _("Stance Change"), + [ABILITY_GALE_WINGS] = _("Gale Wings"), + [ABILITY_MEGA_LAUNCHER] = _("Mega Launcher"), + [ABILITY_GRASS_PELT] = _("Grass Pelt"), + [ABILITY_SYMBIOSIS] = _("Symbiosis"), + [ABILITY_TOUGH_CLAWS] = _("Tough Claws"), + [ABILITY_PIXILATE] = _("Pixilate"), + [ABILITY_GOOEY] = _("Gooey"), + [ABILITY_AERILATE] = _("Aerilate"), + [ABILITY_PARENTAL_BOND] = _("Parental Bond"), + [ABILITY_DARK_AURA] = _("Dark Aura"), + [ABILITY_FAIRY_AURA] = _("Fairy Aura"), + [ABILITY_AURA_BREAK] = _("Aura Break"), + [ABILITY_PRIMORDIAL_SEA] = _("Primordial Sea"), + [ABILITY_DESOLATE_LAND] = _("Desolate Land"), + [ABILITY_DELTA_STREAM] = _("Delta Stream"), + [ABILITY_STAMINA] = _("Stamina"), + [ABILITY_WIMP_OUT] = _("Wimp Out"), + [ABILITY_EMERGENCY_EXIT] = _("Emergency Exit"), + [ABILITY_WATER_COMPACTION] = _("Water Compaction"), + [ABILITY_MERCILESS] = _("Merciless"), + [ABILITY_SHIELDS_DOWN] = _("Shields Down"), + [ABILITY_STAKEOUT] = _("Stakeout"), + [ABILITY_WATER_BUBBLE] = _("Water Bubble"), + [ABILITY_STEELWORKER] = _("Steelworker"), + [ABILITY_BERSERK] = _("Berserk"), + [ABILITY_SLUSH_RUSH] = _("Slush Rush"), + [ABILITY_LONG_REACH] = _("Long Reach"), + [ABILITY_LIQUID_VOICE] = _("Liquid Voice"), + [ABILITY_TRIAGE] = _("Triage"), + [ABILITY_GALVANIZE] = _("Galvanize"), + [ABILITY_SURGE_SURFER] = _("Surge Surfer"), + [ABILITY_SCHOOLING] = _("Schooling"), + [ABILITY_DISGUISE] = _("Disguise"), + [ABILITY_BATTLE_BOND] = _("Battle Bond"), + [ABILITY_POWER_CONSTRUCT] = _("Power Construct"), + [ABILITY_CORROSION] = _("Corrosion"), + [ABILITY_COMATOSE] = _("Comatose"), + [ABILITY_QUEENLY_MAJESTY] = _("Queenly Majesty"), + [ABILITY_INNARDS_OUT] = _("Innards Out"), + [ABILITY_DANCER] = _("Dancer"), + [ABILITY_BATTERY] = _("Battery"), + [ABILITY_FLUFFY] = _("Fluffy"), + [ABILITY_DAZZLING] = _("Dazzling"), + [ABILITY_SOUL_HEART] = _("Soul-Heart"), + [ABILITY_TANGLING_HAIR] = _("Tangling Hair"), + [ABILITY_RECEIVER] = _("Receiver"), + [ABILITY_POWER_OF_ALCHEMY] = _("Power Of Alchemy"), + [ABILITY_BEAST_BOOST] = _("Beast Boost"), + [ABILITY_RKS_SYSTEM] = _("RKS System"), + [ABILITY_ELECTRIC_SURGE] = _("Electric Surge"), + [ABILITY_PSYCHIC_SURGE] = _("Psychic Surge"), + [ABILITY_MISTY_SURGE] = _("Misty Surge"), + [ABILITY_GRASSY_SURGE] = _("Grassy Surge"), + [ABILITY_FULL_METAL_BODY] = _("Full Metal Body"), + [ABILITY_SHADOW_SHIELD] = _("Shadow Shield"), + [ABILITY_PRISM_ARMOR] = _("Prism Armor"), + [ABILITY_NEUROFORCE] = _("Neuroforce"), + [ABILITY_INTREPID_SWORD] = _("Intrepid Sword"), + [ABILITY_DAUNTLESS_SHIELD] = _("Dauntless Shield"), + [ABILITY_LIBERO] = _("Libero"), + [ABILITY_BALL_FETCH] = _("Ball Fetch"), + [ABILITY_COTTON_DOWN] = _("Cotton Down"), + [ABILITY_PROPELLER_TAIL] = _("Propeller Tail"), + [ABILITY_MIRROR_ARMOR] = _("Mirror Armor"), + [ABILITY_GULP_MISSILE] = _("Gulp Missile"), + [ABILITY_STALWART] = _("Stalwart"), + [ABILITY_STEAM_ENGINE] = _("Steam Engine"), + [ABILITY_PUNK_ROCK] = _("Punk Rock"), + [ABILITY_SAND_SPIT] = _("Sand Spit"), + [ABILITY_ICE_SCALES] = _("Ice Scales"), + [ABILITY_RIPEN] = _("Ripen"), + [ABILITY_ICE_FACE] = _("Ice Face"), + [ABILITY_POWER_SPOT] = _("Power Spot"), + [ABILITY_MIMICRY] = _("Mimicry"), + [ABILITY_SCREEN_CLEANER] = _("Screen Cleaner"), + [ABILITY_STEELY_SPIRIT] = _("Steely Spirit"), + [ABILITY_PERISH_BODY] = _("Perish Body"), + [ABILITY_WANDERING_SPIRIT] = _("Wandering Spirit"), + [ABILITY_GORILLA_TACTICS] = _("Gorilla Tactics"), + [ABILITY_NEUTRALIZING_GAS] = _("Neutralizing Gas"), + [ABILITY_PASTEL_VEIL] = _("Pastel Veil"), + [ABILITY_HUNGER_SWITCH] = _("Hunger Switch"), + [ABILITY_QUICK_DRAW] = _("Quick Draw"), + [ABILITY_UNSEEN_FIST] = _("Unseen Fist"), + [ABILITY_CURIOUS_MEDICINE] = _("Curious Medicine"), + [ABILITY_TRANSISTOR] = _("Transistor"), + [ABILITY_DRAGONS_MAW] = _("Dragon's Maw"), + [ABILITY_CHILLING_NEIGH] = _("Chilling Neigh"), + [ABILITY_GRIM_NEIGH] = _("Grim Neigh"), + [ABILITY_AS_ONE_ICE_RIDER] = _("As One"), + [ABILITY_AS_ONE_SHADOW_RIDER] = _("As One"), +}; +#else // 12 characters const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] = { [ABILITY_NONE] = _("-------"), @@ -526,6 +799,7 @@ const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] = [ABILITY_AS_ONE_ICE_RIDER] = _("As One"), [ABILITY_AS_ONE_SHADOW_RIDER] = _("As One"), }; +#endif const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT] = { From e731d93c0b54ea71ebfa5bd9ab8b4e8fb7e2fb3b Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Mon, 29 Nov 2021 12:46:14 -0500 Subject: [PATCH 025/105] update a couple gen 3 ability names --- src/data/text/abilities.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/text/abilities.h b/src/data/text/abilities.h index 76fad45982..cdc3276082 100644 --- a/src/data/text/abilities.h +++ b/src/data/text/abilities.h @@ -272,7 +272,7 @@ const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] = [ABILITY_WATER_ABSORB] = _("Water Absorb"), [ABILITY_OBLIVIOUS] = _("Oblivious"), [ABILITY_CLOUD_NINE] = _("Cloud Nine"), - [ABILITY_COMPOUND_EYES] = _("CompoundEyes"), + [ABILITY_COMPOUND_EYES] = _("Compound Eyes"), [ABILITY_INSOMNIA] = _("Insomnia"), [ABILITY_COLOR_CHANGE] = _("Color Change"), [ABILITY_IMMUNITY] = _("Immunity"), @@ -289,7 +289,7 @@ const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] = [ABILITY_SYNCHRONIZE] = _("Synchronize"), [ABILITY_CLEAR_BODY] = _("Clear Body"), [ABILITY_NATURAL_CURE] = _("Natural Cure"), - [ABILITY_LIGHTNING_ROD] = _("LightningRod"), + [ABILITY_LIGHTNING_ROD] = _("Lightning Rod"), [ABILITY_SERENE_GRACE] = _("Serene Grace"), [ABILITY_SWIFT_SWIM] = _("Swift Swim"), [ABILITY_CHLOROPHYLL] = _("Chlorophyll"), From e7321c22f2bb4737a3ec141c5ea461e9d7c553be Mon Sep 17 00:00:00 2001 From: kleeenexfeu <94004034+kleeenexfeu@users.noreply.github.com> Date: Sat, 4 Dec 2021 17:38:26 +0100 Subject: [PATCH 026/105] Moxie spread move fix --- 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 fcac028945..b2bd75d53a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5245,7 +5245,7 @@ static void Cmd_moveend(void) if (IsBattlerAlive(battlerId)) { - gBattlerTarget = battlerId; + gBattleStruct->moveTarget[gBattlerAttacker] = gBattlerTarget = battlerId; // Fix for moxie spread moves gBattleScripting.moveendState = 0; MoveValuesCleanUp(); gBattleScripting.moveEffect = gBattleScripting.savedMoveEffect; From 340d505116e987eeb8fef3b0cabffacf6cfdee9c Mon Sep 17 00:00:00 2001 From: kleeenexfeu <94004034+kleeenexfeu@users.noreply.github.com> Date: Sat, 4 Dec 2021 17:41:31 +0100 Subject: [PATCH 027/105] Moxie/follow me fix --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 7e2320500c..45d7399a0d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -312,7 +312,7 @@ void HandleAction_UseMove(void) && gBattleMoves[gCurrentMove].target == MOVE_TARGET_SELECTED && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gSideTimers[side].followmeTarget)) { - gBattlerTarget = gSideTimers[side].followmeTarget; + gBattleStruct->moveTarget[gBattlerAttacker] = gBattlerTarget = gSideTimers[side].followmeTarget; // follow me moxie fix } else if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gSideTimers[side].followmeTimer == 0 From 1708ac4b1b23de381fdc6ebdcde09f8e374d63dd Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sat, 4 Dec 2021 22:13:29 -0300 Subject: [PATCH 028/105] Wild mon that have a natural enemy or preys on other mon will attack them whem partnered in double wild battles. --- include/constants/battle_config.h | 7 +++++- src/battle_controller_opponent.c | 37 ++++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 29b7b57503..146ce8948e 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -52,6 +52,10 @@ #define SPECIES_MORPEKO 0 #define SPECIES_MORPEKO_HANGRY 10020 #define SPECIES_SIRFETCHD 10021 + #define SPECIES_HEATMOR 0 + #define SPECIES_DURANT 0 + #define SPECIES_CARBINK 0 + #define SPECIES_MAREANIE 0 #endif // Items with peculiar battle effects. @@ -227,7 +231,8 @@ #define B_LAST_USED_BALL_BUTTON R_BUTTON // If last used ball is implemented, this button (or button combo) will trigger throwing the last used ball. // Other -#define B_DOUBLE_WILD_CHANCE 0 // % chance of encountering two Pokémon in a Wild Encounter. +#define B_DOUBLE_WILD_CHANCE 0 // % chance of encountering two Pokémon in a Wild Encounter. +#define B_WILD_NATURAL_ENEMIES TRUE // Certain wild mon species will attack other species when partnered in double wild battles (eg. Zangoose vs Seviper) // Animation Settings #define B_NEW_SWORD_PARTICLE FALSE // If set to TRUE, it updates Swords Dance's particle. diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index f4982b8043..212894d402 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -1617,7 +1617,42 @@ static void OpponentHandleChooseMove(void) if (gBattleMoves[move].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER)) BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (gActiveBattler << 8)); else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8)); + { + #if B_WILD_NATURAL_ENEMIES == TRUE + // Don't bother to loop through table if the move can't attack ally + if (!(gBattleMoves[move].target & MOVE_TARGET_BOTH)) + { + u16 i, speciesAttacker, speciesTarget, isPartnerEnemy = FALSE; + static const u16 naturalEnemies[][2] = + { + // Attacker Target + {SPECIES_ZANGOOSE, SPECIES_SEVIPER}, + {SPECIES_SEVIPER, SPECIES_ZANGOOSE}, + {SPECIES_HEATMOR, SPECIES_DURANT}, + {SPECIES_DURANT, SPECIES_HEATMOR}, + {SPECIES_SABLEYE, SPECIES_CARBINK}, + {SPECIES_MAREANIE, SPECIES_CORSOLA}, + }; + speciesAttacker = gBattleMons[gActiveBattler].species; + speciesTarget = gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(gActiveBattler))].species; + + for (i = 0; i < ARRAY_COUNT(naturalEnemies); i++) + { + if (speciesAttacker == naturalEnemies[i][0] && speciesTarget == naturalEnemies[i][1]) + { + isPartnerEnemy = TRUE; + break; + } + } + if (isPartnerEnemy) + BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (GetBattlerAtPosition(BATTLE_PARTNER(gActiveBattler)) << 8)); + else + BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8)); + } + else + #endif + BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8)); + } else BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8)); From a5659f3339e0836ba90ff4f05bcdd0462f684521 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 4 Dec 2021 23:00:57 -0300 Subject: [PATCH 029/105] AI partners no longer get exp. --- 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 fcac028945..f5fb72e687 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3920,7 +3920,8 @@ static void Cmd_getexp(void) gBattleScripting.getexpState = 5; gBattleMoveDamage = 0; // used for exp } - else if (GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL) == MAX_LEVEL) + else if ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gBattleStruct->expGetterMonId >= 3) + || GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL) == MAX_LEVEL) { *(&gBattleStruct->sentInPokes) >>= 1; gBattleScripting.getexpState = 5; From c0e408bfab77c7e6014521af25fd9c749dc3c9ca Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sun, 5 Dec 2021 14:44:22 -0500 Subject: [PATCH 030/105] fix aqua ring heal anim --- data/battle_anim_scripts.s | 6 +++--- data/battle_scripts_1.s | 2 +- include/constants/battle_anim.h | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 350ba2cc04..ce6026d51c 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -827,6 +827,7 @@ gBattleAnims_General:: .4byte General_GulpMissile @ B_ANIM_GULP_MISSILE .4byte General_StrongWinds @ B_ANIM_STRONG_WINDS .4byte General_PrimalReversion @ B_ANIM_PRIMAL_REVERSION + .4byte General_AquaRingHeal @ B_ANIM_AQUA_RING_HEAL .align 2 gBattleAnims_Special:: @@ -1707,10 +1708,12 @@ Move_HEART_SWAP: end Move_AQUA_RING: +General_AquaRingHeal: loadspritegfx ANIM_TAG_BLUE_STAR loadspritegfx ANIM_TAG_SMALL_BUBBLES loadspritegfx ANIM_TAG_ICE_CRYSTALS loadspritegfx ANIM_TAG_GUARD_RING + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_GUARD_RING, 0, 14, 14, RGB_BLUE monbg ANIM_ATK_PARTNER setalpha 12, 8 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 23, 1 @@ -1751,9 +1754,6 @@ Move_AQUA_RING: waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff - delay 1 - call HealingEffect - waitforvisualfinish end Move_MAGNET_RISE: diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e9d019e430..45762eae20 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6959,7 +6959,7 @@ BattleScript_TurnHeal: end2 BattleScript_AquaRingHeal:: - playanimation BS_ATTACKER, B_ANIM_INGRAIN_HEAL, NULL + playanimation BS_ATTACKER, B_ANIM_AQUA_RING_HEAL, NULL printstring STRINGID_AQUARINGHEAL goto BattleScript_TurnHeal diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 7df75794e2..b91295b5cc 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -532,6 +532,7 @@ #define B_ANIM_GULP_MISSILE 29 #define B_ANIM_STRONG_WINDS 30 #define B_ANIM_PRIMAL_REVERSION 31 +#define B_ANIM_AQUA_RING_HEAL 32 // special animations table (gBattleAnims_Special) #define B_ANIM_LVL_UP 0 From 1e644c9d4c5a4fca9912d58b83c4d47e3a581cb6 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sun, 5 Dec 2021 14:45:48 -0500 Subject: [PATCH 031/105] fix spacing --- data/battle_anim_scripts.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index ce6026d51c..27a7e92e6e 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -827,7 +827,7 @@ gBattleAnims_General:: .4byte General_GulpMissile @ B_ANIM_GULP_MISSILE .4byte General_StrongWinds @ B_ANIM_STRONG_WINDS .4byte General_PrimalReversion @ B_ANIM_PRIMAL_REVERSION - .4byte General_AquaRingHeal @ B_ANIM_AQUA_RING_HEAL + .4byte General_AquaRingHeal @ B_ANIM_AQUA_RING_HEAL .align 2 gBattleAnims_Special:: From 3db871c49a212e17e7275cacf387f9bdbb19c9b3 Mon Sep 17 00:00:00 2001 From: sphericalice Date: Sun, 5 Dec 2021 23:10:05 +0000 Subject: [PATCH 032/105] Refactor CanThrowLastUsedBall and related functions --- include/item_use.h | 10 +++++++++- src/battle_interface.c | 45 +++++++++++++++++++++--------------------- src/item_use.c | 39 ++++++++++++++++++------------------ 3 files changed, 51 insertions(+), 43 deletions(-) diff --git a/include/item_use.h b/include/item_use.h index 42db6ff104..ed9f7fdd4c 100644 --- a/include/item_use.h +++ b/include/item_use.h @@ -33,6 +33,14 @@ void ItemUseInBattle_EnigmaBerry(u8); void Task_UseDigEscapeRopeOnField(u8 taskId); u8 CanUseDigOrEscapeRopeOnCurMap(void); u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId); -u32 CanThrowBall(void); + +enum { + BALL_FAIL_TWO_PRESENT_MONS, + BALL_FAIL_NO_ROOM, + BALL_FAIL_SEMI_INVULNERABLE, + BALL_SUCCESS, +}; + +bool32 CanThrowBall(void); #endif // GUARD_ITEM_USE_H diff --git a/src/battle_interface.c b/src/battle_interface.c index 180874eb0b..73b90912db 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -3276,19 +3276,23 @@ static const struct SpriteSheet sSpriteSheet_LastUsedBallWindow = bool32 CanThrowLastUsedBall(void) { - #if B_LAST_USED_BALL == FALSE +#if B_LAST_USED_BALL == FALSE + return FALSE; +#else + if (!CanThrowBall()) + return FALSE; + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + return FALSE; + if (!CheckBagHasItem(gLastThrownBall, 1)) return FALSE; - #else - return (!(CanThrowBall() != 0 - || (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - || !CheckBagHasItem(gLastThrownBall, 1))); - #endif -} + return TRUE; +#endif +} void TryAddLastUsedBallItemSprites(void) { - #if B_LAST_USED_BALL == TRUE +#if B_LAST_USED_BALL == TRUE if (gLastThrownBall == 0 || (gLastThrownBall != 0 && !CheckBagHasItem(gLastThrownBall, 1))) { @@ -3297,10 +3301,8 @@ void TryAddLastUsedBallItemSprites(void) CompactItemsInBagPocket(&gBagPockets[BALLS_POCKET]); gLastThrownBall = gBagPockets[BALLS_POCKET].itemSlots[0].itemId; } - - if (CanThrowBall() != 0 - || (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - || !CheckBagHasItem(gLastThrownBall, 1)) + + if (!CanThrowLastUsedBall()) return; // ball @@ -3321,11 +3323,11 @@ void TryAddLastUsedBallItemSprites(void) if (gBattleStruct->ballSpriteIds[1] == MAX_SPRITES) { gBattleStruct->ballSpriteIds[1] = CreateSprite(&sSpriteTemplate_LastUsedBallWindow, - LAST_BALL_WIN_X_0, - LAST_USED_WIN_Y, 5); + LAST_BALL_WIN_X_0, + LAST_USED_WIN_Y, 5); gSprites[gBattleStruct->ballSpriteIds[0]].sHide = FALSE; // restore } - #endif +#endif } static void DestroyLastUsedBallWinGfx(struct Sprite *sprite) @@ -3380,7 +3382,7 @@ static void SpriteCB_LastUsedBall(struct Sprite *sprite) static void TryHideOrRestoreLastUsedBall(u8 caseId) { - #if B_LAST_USED_BALL == TRUE +#if B_LAST_USED_BALL == TRUE if (gBattleStruct->ballSpriteIds[0] == MAX_SPRITES) return; @@ -3399,23 +3401,22 @@ static void TryHideOrRestoreLastUsedBall(u8 caseId) gSprites[gBattleStruct->ballSpriteIds[1]].sHide = FALSE; // restore break; } - #endif +#endif } void TryHideLastUsedBall(void) { - #if B_LAST_USED_BALL == TRUE +#if B_LAST_USED_BALL == TRUE TryHideOrRestoreLastUsedBall(0); - #endif +#endif } void TryRestoreLastUsedBall(void) { - #if B_LAST_USED_BALL == TRUE +#if B_LAST_USED_BALL == TRUE if (gBattleStruct->ballSpriteIds[0] != MAX_SPRITES) TryHideOrRestoreLastUsedBall(1); else TryAddLastUsedBallItemSprites(); - #endif +#endif } - diff --git a/src/item_use.c b/src/item_use.c index 9a1fd2478a..d56795cd07 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -936,34 +936,33 @@ void ItemUseOutOfBattle_EvolutionStone(u8 taskId) SetUpItemUseCallback(taskId); } -u32 CanThrowBall(void) +static u32 GetBallThrowFailState(void) { if (IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) - && IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) - { - return 1; // There are two present pokemon. - } + && IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) + return BALL_FAIL_TWO_PRESENT_MONS; else if (IsPlayerPartyAndPokemonStorageFull() == TRUE) - { - return 2; // No room for mon - } - #if B_SEMI_INVULNERABLE_CATCH >= GEN_4 + return BALL_FAIL_NO_ROOM; +#if B_SEMI_INVULNERABLE_CATCH >= GEN_4 else if (gStatuses3[GetCatchingBattler()] & STATUS3_SEMI_INVULNERABLE) - { - return 3; // in semi-invulnerable state - } - #endif - - return 0; // usable + return BALL_FAIL_SEMI_INVULNERABLE; +#endif + + return BALL_SUCCESS; +} + +bool32 CanThrowBall(void) +{ + return (GetBallThrowFailState() == BALL_SUCCESS); } static const u8 sText_CantThrowPokeBall_TwoMons[] = _("Cannot throw a ball!\nThere are two Pokémon out there!\p"); static const u8 sText_CantThrowPokeBall_SemiInvulnerable[] = _("Cannot throw a ball!\nThere's no Pokémon in sight!\p"); void ItemUseInBattle_PokeBall(u8 taskId) { - switch (CanThrowBall()) + switch (GetBallThrowFailState()) { - case 0: // usable + case BALL_SUCCESS: default: RemoveBagItem(gSpecialVar_ItemId, 1); if (!InBattlePyramid()) @@ -971,20 +970,20 @@ void ItemUseInBattle_PokeBall(u8 taskId) else CloseBattlePyramidBag(taskId); break; - case 1: // There are two present pokemon. + case BALL_FAIL_TWO_PRESENT_MONS: if (!InBattlePyramid()) DisplayItemMessage(taskId, 1, sText_CantThrowPokeBall_TwoMons, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, sText_CantThrowPokeBall_TwoMons, Task_CloseBattlePyramidBagMessage); break; - case 2: // No room for mon + case BALL_FAIL_NO_ROOM: if (!InBattlePyramid()) DisplayItemMessage(taskId, 1, gText_BoxFull, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, gText_BoxFull, Task_CloseBattlePyramidBagMessage); break; #if B_SEMI_INVULNERABLE_CATCH >= GEN_4 - case 3: // Semi-Invulnerable + case BALL_FAIL_SEMI_INVULNERABLE: if (!InBattlePyramid()) DisplayItemMessage(taskId, 1, sText_CantThrowPokeBall_SemiInvulnerable, CloseItemMessage); else From 5c02facde462ae7f984f3b1998082ce81cbc3c76 Mon Sep 17 00:00:00 2001 From: sphericalice Date: Sun, 5 Dec 2021 23:17:44 +0000 Subject: [PATCH 033/105] Use more specific enum names for throwable Balls --- include/item_use.h | 8 ++++---- src/item_use.c | 22 +++++++++++----------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/include/item_use.h b/include/item_use.h index ed9f7fdd4c..1b36f9ea84 100644 --- a/include/item_use.h +++ b/include/item_use.h @@ -35,10 +35,10 @@ u8 CanUseDigOrEscapeRopeOnCurMap(void); u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId); enum { - BALL_FAIL_TWO_PRESENT_MONS, - BALL_FAIL_NO_ROOM, - BALL_FAIL_SEMI_INVULNERABLE, - BALL_SUCCESS, + BALL_THROW_UNABLE_TWO_MONS, + BALL_THROW_UNABLE_NO_ROOM, + BALL_THROW_UNABLE_SEMI_INVULNERABLE, + BALL_THROW_ABLE, }; bool32 CanThrowBall(void); diff --git a/src/item_use.c b/src/item_use.c index d56795cd07..0a6194e8c4 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -936,33 +936,33 @@ void ItemUseOutOfBattle_EvolutionStone(u8 taskId) SetUpItemUseCallback(taskId); } -static u32 GetBallThrowFailState(void) +static u32 GetBallThrowableState(void) { if (IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) && IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) - return BALL_FAIL_TWO_PRESENT_MONS; + return BALL_THROW_UNABLE_TWO_MONS; else if (IsPlayerPartyAndPokemonStorageFull() == TRUE) - return BALL_FAIL_NO_ROOM; + return BALL_THROW_UNABLE_NO_ROOM; #if B_SEMI_INVULNERABLE_CATCH >= GEN_4 else if (gStatuses3[GetCatchingBattler()] & STATUS3_SEMI_INVULNERABLE) - return BALL_FAIL_SEMI_INVULNERABLE; + return BALL_THROW_UNABLE_SEMI_INVULNERABLE; #endif - return BALL_SUCCESS; + return BALL_THROW_ABLE; } bool32 CanThrowBall(void) { - return (GetBallThrowFailState() == BALL_SUCCESS); + return (GetBallThrowableState() == BALL_THROW_ABLE); } static const u8 sText_CantThrowPokeBall_TwoMons[] = _("Cannot throw a ball!\nThere are two Pokémon out there!\p"); static const u8 sText_CantThrowPokeBall_SemiInvulnerable[] = _("Cannot throw a ball!\nThere's no Pokémon in sight!\p"); void ItemUseInBattle_PokeBall(u8 taskId) { - switch (GetBallThrowFailState()) + switch (GetBallThrowableState()) { - case BALL_SUCCESS: + case BALL_THROW_ABLE: default: RemoveBagItem(gSpecialVar_ItemId, 1); if (!InBattlePyramid()) @@ -970,20 +970,20 @@ void ItemUseInBattle_PokeBall(u8 taskId) else CloseBattlePyramidBag(taskId); break; - case BALL_FAIL_TWO_PRESENT_MONS: + case BALL_THROW_UNABLE_TWO_MONS: if (!InBattlePyramid()) DisplayItemMessage(taskId, 1, sText_CantThrowPokeBall_TwoMons, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, sText_CantThrowPokeBall_TwoMons, Task_CloseBattlePyramidBagMessage); break; - case BALL_FAIL_NO_ROOM: + case BALL_THROW_UNABLE_NO_ROOM: if (!InBattlePyramid()) DisplayItemMessage(taskId, 1, gText_BoxFull, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, gText_BoxFull, Task_CloseBattlePyramidBagMessage); break; #if B_SEMI_INVULNERABLE_CATCH >= GEN_4 - case BALL_FAIL_SEMI_INVULNERABLE: + case BALL_THROW_UNABLE_SEMI_INVULNERABLE: if (!InBattlePyramid()) DisplayItemMessage(taskId, 1, sText_CantThrowPokeBall_SemiInvulnerable, CloseItemMessage); else From 0a7dd2edd6afdb06345d13de6d05ff7d4664af6f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 7 Dec 2021 12:19:27 +0100 Subject: [PATCH 034/105] Fix Intimidate affecting fainted mons --- src/battle_util.c | 65 ++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 736e654ac5..f92efd65a3 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1731,7 +1731,7 @@ u8 TrySetCantSelectMoveBattleScript(void) limitations++; } } - + if (move == MOVE_STUFF_CHEEKS && ItemId_GetPocket(gBattleMons[gActiveBattler].item) != POCKET_BERRIES) { gCurrentMove = move; @@ -1776,7 +1776,7 @@ u8 TrySetCantSelectMoveBattleScript(void) limitations++; } } - if ((GetBattlerAbility(gActiveBattler) == ABILITY_GORILLA_TACTICS) && *choicedMove != 0 + if ((GetBattlerAbility(gActiveBattler) == ABILITY_GORILLA_TACTICS) && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != move) { gCurrentMove = *choicedMove; @@ -2710,9 +2710,9 @@ u8 DoBattlerEndTurnEffects(void) gBattleStruct->turnEffectsTracker++; break; case ENDTURN_OCTOLOCK: - if (gDisableStructs[gActiveBattler].octolock - && !(GetBattlerAbility(gActiveBattler) == ABILITY_CLEAR_BODY - || GetBattlerAbility(gActiveBattler) == ABILITY_FULL_METAL_BODY + if (gDisableStructs[gActiveBattler].octolock + && !(GetBattlerAbility(gActiveBattler) == ABILITY_CLEAR_BODY + || GetBattlerAbility(gActiveBattler) == ABILITY_FULL_METAL_BODY || GetBattlerAbility(gActiveBattler) == ABILITY_WHITE_SMOKE)) { gBattlerTarget = gActiveBattler; @@ -3750,7 +3750,7 @@ u8 TryWeatherFormChange(u8 battler) u8 ret = 0; bool32 weatherEffect = WEATHER_HAS_EFFECT; u16 holdEffect = GetBattlerHoldEffect(battler, TRUE); - + if (gBattleMons[battler].species == SPECIES_CASTFORM) { if (GetBattlerAbility(battler) != ABILITY_FORECAST || gBattleMons[battler].hp == 0) @@ -4698,7 +4698,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move gBattlescriptCurrInstr = BattleScript_DarkTypePreventsPrankster; effect = 1; } - + break; case ABILITYEFFECT_ABSORBING: // 3 if (move != MOVE_NONE) @@ -5525,10 +5525,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move case ABILITYEFFECT_INTIMIDATE2: for (i = 0; i < gBattlersCount; i++) { - if (GetBattlerAbility(i) == ABILITY_INTIMIDATE && gBattleResources->flags->flags[i] & RESOURCE_FLAG_INTIMIDATED) + if (GetBattlerAbility(i) == ABILITY_INTIMIDATE && gBattleResources->flags->flags[i] & RESOURCE_FLAG_INTIMIDATED + && (IsBattlerAlive(BATTLE_OPPOSITE(i)) || IsBattlerAlive(BATTLE_PARTNER(BATTLE_OPPOSITE(i))))) // At least one opposing mon has to be alive. { - gLastUsedAbility = ABILITY_INTIMIDATE; gBattleResources->flags->flags[i] &= ~(RESOURCE_FLAG_INTIMIDATED); + gLastUsedAbility = ABILITY_INTIMIDATE; if (caseID == ABILITYEFFECT_INTIMIDATE1) { BattleScriptPushCursorAndCallback(BattleScript_IntimidateActivatesEnd3); @@ -5604,7 +5605,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); effect++; } - + if (effect) break; } @@ -5659,10 +5660,10 @@ u32 GetBattlerAbility(u8 battlerId) { if (gStatuses3[battlerId] & STATUS3_GASTRO_ACID) return ABILITY_NONE; - + if (IsNeutralizingGasOnField() && !IsNeutralizingGasBannedAbility(gBattleMons[battlerId].ability)) return ABILITY_NONE; - + if ((((gBattleMons[gBattlerAttacker].ability == ABILITY_MOLD_BREAKER || gBattleMons[gBattlerAttacker].ability == ABILITY_TERAVOLT || gBattleMons[gBattlerAttacker].ability == ABILITY_TURBOBLAZE) @@ -5673,7 +5674,7 @@ u32 GetBattlerAbility(u8 battlerId) && gActionsByTurnOrder[gBattlerByTurnOrder[gBattlerAttacker]] == B_ACTION_USE_MOVE && gCurrentTurnActionNumber < gBattlersCount) return ABILITY_NONE; - + return gBattleMons[battlerId].ability; } @@ -5785,7 +5786,7 @@ bool32 IsBattlerTerrainAffected(u8 battlerId, u32 terrainFlag) return FALSE; else if (gStatuses3[battlerId] & STATUS3_SEMI_INVULNERABLE) return FALSE; - + return IsBattlerGrounded(battlerId); } @@ -5807,7 +5808,7 @@ bool32 CanSleep(u8 battlerId) bool32 CanBePoisoned(u8 battlerAttacker, u8 battlerTarget) { u16 ability = GetBattlerAbility(battlerTarget); - + if (!(CanPoisonType(battlerAttacker, battlerTarget)) || gSideStatuses[GetBattlerSide(battlerTarget)] & SIDE_STATUS_SAFEGUARD || gBattleMons[battlerTarget].status1 & STATUS1_ANY @@ -6009,7 +6010,7 @@ static u8 RandomStatRaiseBerry(u32 battlerId, u32 itemId, bool32 end2) BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryStatRaiseRet; } - + return ITEM_STATS_CHANGE; } return 0; @@ -6123,7 +6124,7 @@ static bool32 UnnerveOn(u32 battlerId, u32 itemId) static bool32 GetMentalHerbEffect(u8 battlerId) { bool32 ret = FALSE; - + // Check infatuation if (gBattleMons[battlerId].status2 & STATUS2_INFATUATION) { @@ -7259,11 +7260,11 @@ u32 GetMoveTarget(u16 move, u8 setTarget) moveTarget = setTarget - 1; else moveTarget = gBattleMoves[move].target; - + // Special cases if (move == MOVE_CURSE && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) moveTarget = MOVE_TARGET_USER; - + switch (moveTarget) { case MOVE_TARGET_SELECTED: @@ -9266,7 +9267,7 @@ bool32 CanBattlerGetOrLoseItem(u8 battlerId, u16 itemId) { u16 species = gBattleMons[battlerId].species; u16 holdEffect = ItemId_GetHoldEffect(itemId); - + // Mail can be stolen now if (itemId == ITEM_ENIGMA_BERRY) return FALSE; @@ -9546,7 +9547,7 @@ void SortBattlersBySpeed(u8 *battlers, bool8 slowToFast) { int i, j, currSpeed, currBattler; u16 speeds[4] = {0}; - + for (i = 0; i < gBattlersCount; i++) speeds[i] = GetBattlerTotalSpeedStat(battlers[i]); @@ -9584,7 +9585,7 @@ void TryRestoreStolenItems(void) { u32 i; u16 stolenItem = ITEM_NONE; - + for (i = 0; i < PARTY_SIZE; i++) { if (gBattleStruct->itemStolen[i].stolen) @@ -9599,10 +9600,10 @@ void TryRestoreStolenItems(void) bool32 CanStealItem(u8 battlerStealing, u8 battlerItem, u16 item) { u8 stealerSide = GetBattlerSide(battlerStealing); - + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) return FALSE; - + // Check if the battler trying to steal should be able to if (stealerSide == B_SIDE_OPPONENT && !(gBattleTypeFlags & @@ -9628,11 +9629,11 @@ bool32 CanStealItem(u8 battlerStealing, u8 battlerItem, u16 item) { return FALSE; } - + if (!CanBattlerGetOrLoseItem(battlerItem, item) // Battler with item cannot have it stolen ||!CanBattlerGetOrLoseItem(battlerStealing, item)) // Stealer cannot take the item return FALSE; - + return TRUE; } @@ -9680,7 +9681,7 @@ bool32 CompareStat(u8 battlerId, u8 statId, u8 cmpTo, u8 cmpKind) { bool8 ret = FALSE; u8 statValue = gBattleMons[battlerId].statStages[statId]; - + // Because this command is used as a way of checking if a stat can be lowered/raised, // we need to do some modification at run-time. if (GetBattlerAbility(battlerId) == ABILITY_CONTRARY) @@ -9723,7 +9724,7 @@ bool32 CompareStat(u8 battlerId, u8 statId, u8 cmpTo, u8 cmpKind) ret = TRUE; break; } - + return ret; } @@ -9782,7 +9783,7 @@ void DoBurmyFormChange(u32 monId) if ((GET_BASE_SPECIES_ID(currSpecies) == SPECIES_BURMY) && (gBitTable[monId] & sentIn)) { switch (gBattleTerrain) - { + { case BATTLE_TERRAIN_GRASS: case BATTLE_TERRAIN_LONG_GRASS: case BATTLE_TERRAIN_POND: @@ -9823,7 +9824,7 @@ bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef, bool32 chec return FALSE; if (gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE) return FALSE; - + return TRUE; #endif return FALSE; @@ -9838,13 +9839,13 @@ bool32 IsBattlerWeatherAffected(u8 battlerId, u32 weatherFlags) { if (!WEATHER_HAS_EFFECT) return FALSE; - + if (gBattleWeather & weatherFlags) { // given weather is active -> check if its sun, rain against utility umbrella ( since only 1 weather can be active at once) if (gBattleWeather & (WEATHER_SUN_ANY | WEATHER_RAIN_ANY) && GetBattlerHoldEffect(battlerId, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) return FALSE; // utility umbrella blocks sun, rain effects - + return TRUE; } return FALSE; From 2773b14de53aa677d11988f40a94062aaa927c2f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sat, 11 Dec 2021 00:09:47 -0300 Subject: [PATCH 035/105] Updated AI debug hold effect name display. --- src/battle_debug.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/battle_debug.c b/src/battle_debug.c index 2b12037d5a..9e6efba40a 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1997,11 +1997,13 @@ static const u8 sText_HoldEffectSafetyGoggles[] = _("Safety Goggles"); static const u8 sText_HoldEffectLuminousMoss[] = _("Luminous Moss"); static const u8 sText_HoldEffectSnowball[] = _("Snowball"); static const u8 sText_HoldEffectWeaknessPolicy[] = _("Weakness Policy"); +static const u8 sText_HoldEffectPrimalOrb[] = _("Primal Orb"); static const u8 sText_HoldEffectProtectivePads[] = _("Protective Pads"); static const u8 sText_HoldEffectTerrainExtender[] = _("Terrain Extender"); static const u8 sText_HoldEffectSeeds[] = _("Seeds"); static const u8 sText_HoldEffectAdrenalineOrb[] = _("Adrenaline Orb"); static const u8 sText_HoldEffectMemory[] = _("Memory"); +static const u8 sText_HoldEffectZCrystal[] = _("Z-Crystal"); static const u8 sText_HoldEffectPlate[] = _("Plate"); static const u8 sText_HoldEffectUtilityUmbrella[] = _("Utility Umbrella"); static const u8 sText_HoldEffectEjectPack[] = _("Eject Pack"); @@ -2039,7 +2041,7 @@ static const u8 *const sHoldEffectNames[] = [HOLD_EFFECT_EXP_SHARE] = sText_HoldEffectExpShare, [HOLD_EFFECT_QUICK_CLAW] = sText_HoldEffectQuickClaw, [HOLD_EFFECT_FRIENDSHIP_UP] = sText_HoldEffectFriendshipUp, - //[HOLD_EFFECT_MENTAL_HERB] = sText_HoldEffectMentalHerb, + [HOLD_EFFECT_MENTAL_HERB] = sText_HoldEffectMentalHerb, [HOLD_EFFECT_CHOICE_BAND] = sText_HoldEffectChoiceBand, [HOLD_EFFECT_FLINCH] = sText_HoldEffectFlinch, [HOLD_EFFECT_BUG_POWER] = sText_HoldEffectBugPower, @@ -2112,12 +2114,13 @@ static const u8 *const sHoldEffectNames[] = [HOLD_EFFECT_RESIST_BERRY] = sText_HoldEffectResistBerry, [HOLD_EFFECT_POWER_ITEM] = sText_HoldEffectPowerItem, [HOLD_EFFECT_RESTORE_PCT_HP] = sText_HoldEffectRestorePctHp, - //[HOLD_EFFECT_MICLE_BERRY] = sText_HoldEffectMicleBerry, - //[HOLD_EFFECT_CUSTAP_BERRY] = sText_HoldEffectCustapBerry, - //[HOLD_EFFECT_JABOCA_BERRY] = sText_HoldEffectJabocaBerry, - //[HOLD_EFFECT_ROWAP_BERRY] = sText_HoldEffectRowapBerry, - //[HOLD_EFFECT_KEE_BERRY] = sText_HoldEffectKeeBerry, - //[HOLD_EFFECT_MARANGA_BERRY] = sText_HoldEffectMarangaBerry, + [HOLD_EFFECT_MICLE_BERRY] = sText_HoldEffectMicleBerry, + [HOLD_EFFECT_CUSTAP_BERRY] = sText_HoldEffectCustapBerry, + [HOLD_EFFECT_JABOCA_BERRY] = sText_HoldEffectJabocaBerry, + [HOLD_EFFECT_ROWAP_BERRY] = sText_HoldEffectRowapBerry, + [HOLD_EFFECT_KEE_BERRY] = sText_HoldEffectKeeBerry, + [HOLD_EFFECT_MARANGA_BERRY] = sText_HoldEffectMarangaBerry, + [HOLD_EFFECT_PLATE] = sText_HoldEffectPlate, [HOLD_EFFECT_FLOAT_STONE] = sText_HoldEffectFloatStone, [HOLD_EFFECT_EVIOLITE] = sText_HoldEffectEviolite, [HOLD_EFFECT_ASSAULT_VEST] = sText_HoldEffectAssaultVest, @@ -2137,12 +2140,13 @@ static const u8 *const sHoldEffectNames[] = [HOLD_EFFECT_LUMINOUS_MOSS] = sText_HoldEffectLuminousMoss, [HOLD_EFFECT_SNOWBALL] = sText_HoldEffectSnowball, [HOLD_EFFECT_WEAKNESS_POLICY] = sText_HoldEffectWeaknessPolicy, + [HOLD_EFFECT_PRIMAL_ORB] = sText_HoldEffectPrimalOrb, [HOLD_EFFECT_PROTECTIVE_PADS] = sText_HoldEffectProtectivePads, [HOLD_EFFECT_TERRAIN_EXTENDER] = sText_HoldEffectTerrainExtender, [HOLD_EFFECT_SEEDS] = sText_HoldEffectSeeds, [HOLD_EFFECT_ADRENALINE_ORB] = sText_HoldEffectAdrenalineOrb, [HOLD_EFFECT_MEMORY] = sText_HoldEffectMemory, - [HOLD_EFFECT_PLATE] = sText_HoldEffectPlate, + [HOLD_EFFECT_Z_CRYSTAL] = sText_HoldEffectZCrystal, [HOLD_EFFECT_UTILITY_UMBRELLA] = sText_HoldEffectUtilityUmbrella, [HOLD_EFFECT_EJECT_PACK] = sText_HoldEffectEjectPack, [HOLD_EFFECT_ROOM_SERVICE] = sText_HoldEffectRoomService, From 7ca07527faeb5d8f3c5aae355ecfd33a554acca6 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sun, 12 Dec 2021 12:33:49 -0300 Subject: [PATCH 036/105] Config for HP bars moving faster for higher HP amounts. Credit to Dat.H --- include/constants/battle_config.h | 1 + src/battle_interface.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 8f8d30b568..9563e6b50e 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -216,6 +216,7 @@ // Interface settings #define B_ABILITY_POP_UP TRUE // In Gen5+, the Pokémon abilities are displayed in a pop-up, when they activate in battle. #define B_FAST_INTRO TRUE // If set to TRUE, battle intro texts print at the same time as animation of a Pokémon, as opposing to waiting for the animation to end. +#define B_FAST_HP_DRAIN TRUE // If set to TRUE, HP bars will move faster to accomodate higher max HP amounts. #define B_SHOW_TARGETS TRUE // If set to TRUE, all available targets, for moves hitting 2 or 3 Pokémon, will be shown before selecting a move. #define B_SHOW_SPLIT_ICON TRUE // If set to TRUE, it will show an icon in the summary showing the move's category split. #define B_HIDE_HEALTHBOX_IN_ANIMS TRUE // If set to TRUE, hides healthboxes during move animations. diff --git a/src/battle_interface.c b/src/battle_interface.c index f1d2d1d590..c35e9f974b 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -2438,7 +2438,11 @@ s32 MoveBattleBar(u8 battlerId, u8 healthboxSpriteId, u8 whichBar, u8 unused) gBattleSpritesDataPtr->battleBars[battlerId].oldValue, gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, &gBattleSpritesDataPtr->battleBars[battlerId].currValue, + #if B_FAST_HP_DRAIN == TRUE + B_HEALTHBAR_PIXELS / 8, max(gBattleSpritesDataPtr->battleBars[battlerId].maxValue / 64, 1)); + #else B_HEALTHBAR_PIXELS / 8, 1); + #endif } else // exp bar { From abe99102511b7b3a6d9f85e84124f33321c3c95b Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sun, 12 Dec 2021 12:42:14 -0300 Subject: [PATCH 037/105] Fixed speed to be more like vanilla's --- src/battle_interface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_interface.c b/src/battle_interface.c index c35e9f974b..2ac611f832 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -2439,7 +2439,7 @@ s32 MoveBattleBar(u8 battlerId, u8 healthboxSpriteId, u8 whichBar, u8 unused) gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, &gBattleSpritesDataPtr->battleBars[battlerId].currValue, #if B_FAST_HP_DRAIN == TRUE - B_HEALTHBAR_PIXELS / 8, max(gBattleSpritesDataPtr->battleBars[battlerId].maxValue / 64, 1)); + B_HEALTHBAR_PIXELS / 8, max(gBattleSpritesDataPtr->battleBars[battlerId].maxValue / B_HEALTHBAR_PIXELS, 1)); #else B_HEALTHBAR_PIXELS / 8, 1); #endif From 31bbc4ddde1fcfe1218d41a9b35743d0ef37a036 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Fri, 17 Dec 2021 10:24:07 -0500 Subject: [PATCH 038/105] prevent stat-raising damage effects if battle will end --- data/battle_scripts_1.s | 12 ++--- src/battle_script_commands.c | 100 ++++++++++++++++++++--------------- 2 files changed, 62 insertions(+), 50 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 24a3d16eda..be77907b82 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1089,20 +1089,20 @@ BattleScript_VCreateStatAnim: playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_DEF, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VCreateTrySpDef - printfromtable gStatUpStringIds + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateTrySpDef + printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateTrySpDef: setstatchanger STAT_SPDEF, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpeed - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VCreateTrySpeed - printfromtable gStatUpStringIds + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateTrySpeed + printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateTrySpeed: setstatchanger STAT_SPEED, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateStatLossRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VCreateStatLossRet - printfromtable gStatUpStringIds + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateStatLossRet + printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateStatLossRet: return diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b46331be18..e342ca236e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3205,11 +3205,7 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattlescriptCurrInstr++; break; case MOVE_EFFECT_ALL_STATS_UP: - if (NoAliveMonsForEitherParty()) - { - gBattlescriptCurrInstr++; - } - else + if (!NoAliveMonsForEitherParty()) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_AllStatsUp; @@ -3248,12 +3244,18 @@ void SetMoveEffect(bool32 primary, u32 certain) } break; case MOVE_EFFECT_ATK_DEF_DOWN: // SuperPower - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_AtkDefDown; + if (!NoAliveMonsForEitherParty()) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_AtkDefDown; + } break; case MOVE_EFFECT_DEF_SPDEF_DOWN: // Close Combat - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_DefSpDefDown; + if (!NoAliveMonsForEitherParty()) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_DefSpDefDown; + } break; case MOVE_EFFECT_RECOIL_25: // Take Down, 25% recoil gBattleMoveDamage = (gHpDealt) / 4; @@ -3308,8 +3310,11 @@ void SetMoveEffect(bool32 primary, u32 certain) } break; case MOVE_EFFECT_SP_ATK_TWO_DOWN: // Overheat - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_SAtkDown2; + if (!NoAliveMonsForEitherParty()) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_SAtkDown2; + } break; case MOVE_EFFECT_CLEAR_SMOG: for (i = 0; i < NUM_BATTLE_STATS; i++) @@ -3369,51 +3374,58 @@ void SetMoveEffect(bool32 primary, u32 certain) } break; case MOVE_EFFECT_SPECTRAL_THIEF: - gBattleStruct->stolenStats[0] = 0; // Stats to steal. - gBattleScripting.animArg1 = 0; - for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) + if (!NoAliveMonsForEitherParty()) { - if (gBattleMons[gBattlerTarget].statStages[i] > DEFAULT_STAT_STAGE && gBattleMons[gBattlerAttacker].statStages[i] != MAX_STAT_STAGE) + gBattleStruct->stolenStats[0] = 0; // Stats to steal. + gBattleScripting.animArg1 = 0; + for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) { - gBattleStruct->stolenStats[0] |= gBitTable[i]; - // Store by how many stages to raise the stat. - gBattleStruct->stolenStats[i] = gBattleMons[gBattlerTarget].statStages[i] - DEFAULT_STAT_STAGE; - while (gBattleMons[gBattlerAttacker].statStages[i] + gBattleStruct->stolenStats[i] > MAX_STAT_STAGE) - gBattleStruct->stolenStats[i]--; - gBattleMons[gBattlerTarget].statStages[i] = DEFAULT_STAT_STAGE; - - if (gBattleStruct->stolenStats[i] >= 2) - byTwo++; - - if (gBattleScripting.animArg1 == 0) + if (gBattleMons[gBattlerTarget].statStages[i] > DEFAULT_STAT_STAGE && gBattleMons[gBattlerAttacker].statStages[i] != MAX_STAT_STAGE) { - if (byTwo) - gBattleScripting.animArg1 = STAT_ANIM_PLUS2 - 1 + i; + gBattleStruct->stolenStats[0] |= gBitTable[i]; + // Store by how many stages to raise the stat. + gBattleStruct->stolenStats[i] = gBattleMons[gBattlerTarget].statStages[i] - DEFAULT_STAT_STAGE; + while (gBattleMons[gBattlerAttacker].statStages[i] + gBattleStruct->stolenStats[i] > MAX_STAT_STAGE) + gBattleStruct->stolenStats[i]--; + gBattleMons[gBattlerTarget].statStages[i] = DEFAULT_STAT_STAGE; + + if (gBattleStruct->stolenStats[i] >= 2) + byTwo++; + + if (gBattleScripting.animArg1 == 0) + { + if (byTwo) + gBattleScripting.animArg1 = STAT_ANIM_PLUS2 - 1 + i; + else + gBattleScripting.animArg1 = STAT_ANIM_PLUS1 - 1 + i; + } else - gBattleScripting.animArg1 = STAT_ANIM_PLUS1 - 1 + i; - } - else - { - if (byTwo) - gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS2; - else - gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS1; + { + if (byTwo) + gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS2; + else + gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS1; + } } } - } - if (gBattleStruct->stolenStats[0] != 0) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_SpectralThiefSteal; + if (gBattleStruct->stolenStats[0] != 0) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_SpectralThiefSteal; + } } break; case MOVE_EFFECT_V_CREATE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_VCreateStatLoss; + if (!NoAliveMonsForEitherParty()) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_VCreateStatLoss; + } break; case MOVE_EFFECT_CORE_ENFORCER: - if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) + if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget) + && !NoAliveMonsForEitherParty()) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectCoreEnforcer; From bd75ee96882eae5b7efb0a8917a63fb3775ebd29 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sat, 18 Dec 2021 10:55:04 -0300 Subject: [PATCH 039/105] Using TAG_NONE in battle debug --- src/battle_debug.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/battle_debug.c b/src/battle_debug.c index 075ef93072..8834db0e6f 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -792,13 +792,13 @@ static void Task_ShowAiPoints(u8 taskId) gBattleMons[data->aiBattlerId].otId, gBattleMons[data->aiBattlerId].personality, TRUE, - 39, 130, 15, 0xFFFF); + 39, 130, 15, TAG_NONE); #else data->aiMonSpriteId = CreateMonPicSprite(gBattleMons[data->aiBattlerId].species, gBattleMons[data->aiBattlerId].otId, gBattleMons[data->aiBattlerId].personality, TRUE, - 39, 130, 15, 0xFFFF); + 39, 130, 15, TAG_NONE); #endif data->aiViewState++; break; @@ -915,13 +915,13 @@ static void Task_ShowAiKnowledge(u8 taskId) gBattleMons[data->aiBattlerId].otId, gBattleMons[data->aiBattlerId].personality, TRUE, - 39, 130, 15, 0xFFFF); + 39, 130, 15, TAG_NONE); #else data->aiMonSpriteId = CreateMonPicSprite(gBattleMons[data->aiBattlerId].species, gBattleMons[data->aiBattlerId].otId, gBattleMons[data->aiBattlerId].personality, TRUE, - 39, 130, 15, 0xFFFF); + 39, 130, 15, TAG_NONE); #endif data->aiViewState++; break; From ffe35fbb069c4afe7789a31b83a59a2c839487ee Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 5 Dec 2021 10:34:18 -0300 Subject: [PATCH 040/105] Updated defeat condition on multi battles --- data/battle_scripts_1.s | 1 + include/constants/battle_config.h | 5 +++-- src/battle_script_commands.c | 28 +++++++++++++++++++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e9d019e430..e4c628d76c 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5925,6 +5925,7 @@ BattleScript_PayDayMoneyAndPickUpItems:: end2 BattleScript_LocalBattleLost:: + jumpifbattletype BATTLE_TYPE_INGAME_PARTNER, BattleScript_LocalBattleLostPrintWhiteOut jumpifbattletype BATTLE_TYPE_DOME, BattleScript_CheckDomeDrew jumpifbattletype BATTLE_TYPE_FRONTIER, BattleScript_LocalBattleLostPrintTrainersWinText jumpifbattletype BATTLE_TYPE_TRAINER_HILL, BattleScript_LocalBattleLostPrintTrainersWinText diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 29b7b57503..65f85af957 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -226,8 +226,9 @@ #define B_LAST_USED_BALL TRUE // If TRUE, the "last used ball" feature from Gen 7 will be implemented #define B_LAST_USED_BALL_BUTTON R_BUTTON // If last used ball is implemented, this button (or button combo) will trigger throwing the last used ball. -// Other -#define B_DOUBLE_WILD_CHANCE 0 // % chance of encountering two Pokémon in a Wild Encounter. +// Other settings +#define B_DOUBLE_WILD_CHANCE 0 // % chance of encountering two Pokémon in a Wild Encounter. +#define B_NEW_MULTI_BATTLE_DEFEAT_CONDITION TRUE // In Gen5+, multi battles end when the Player and also their Partner don't have any more Pokémon to fight. // Animation Settings #define B_NEW_SWORD_PARTICLE FALSE // If set to TRUE, it updates Swords Dance's particle. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f5fb72e687..6b1f5a6ff2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4113,6 +4113,28 @@ static void Cmd_getexp(void) } } +#ifdef B_NEW_MULTI_BATTLE_DEFEAT_CONDITION == TRUE +static bool32 NoAliveMonsForPlayerAndPartner(void) +{ + u32 i; + u32 HP_count = 0; + + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && (gPartnerTrainerId == TRAINER_STEVEN_PARTNER || gPartnerTrainerId >= TRAINER_CUSTOM_PARTNER)) + { + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) + && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->arenaLostPlayerMons & gBitTable[i]))) + { + HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP); + } + } + } + + return (HP_count == 0); +} +#endif + static bool32 NoAliveMonsForPlayer(void) { u32 i; @@ -4168,7 +4190,11 @@ static void Cmd_unknown_24(void) if (gBattleControllerExecFlags) return; - if (NoAliveMonsForPlayer()) + #ifdef B_NEW_MULTI_BATTLE_DEFEAT_CONDITION == TRUE + if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER) && NoAliveMonsForPlayerAndPartner()) + gBattleOutcome |= B_OUTCOME_LOST; + #endif + if (!(gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER)) && NoAliveMonsForPlayer()) gBattleOutcome |= B_OUTCOME_LOST; if (NoAliveMonsForOpponent()) gBattleOutcome |= B_OUTCOME_WON; From cb44de13b3a524ee054730a6f1f322d8610d30c5 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 19 Dec 2021 20:53:57 -0300 Subject: [PATCH 041/105] B_NEW_MULTI_BATTLE_DEFEAT_CONDITION -> B_MULTI_BATTLE_WHITEOUT --- include/constants/battle_config.h | 4 ++-- src/battle_script_commands.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 65f85af957..f68646bb81 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -227,8 +227,8 @@ #define B_LAST_USED_BALL_BUTTON R_BUTTON // If last used ball is implemented, this button (or button combo) will trigger throwing the last used ball. // Other settings -#define B_DOUBLE_WILD_CHANCE 0 // % chance of encountering two Pokémon in a Wild Encounter. -#define B_NEW_MULTI_BATTLE_DEFEAT_CONDITION TRUE // In Gen5+, multi battles end when the Player and also their Partner don't have any more Pokémon to fight. +#define B_DOUBLE_WILD_CHANCE 0 // % chance of encountering two Pokémon in a Wild Encounter. +#define B_MULTI_BATTLE_WHITEOUT GEN_8 // In Gen4+, multi battles end when the Player and also their Partner don't have any more Pokémon to fight. // Animation Settings #define B_NEW_SWORD_PARTICLE FALSE // If set to TRUE, it updates Swords Dance's particle. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6b1f5a6ff2..d41084ca7a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4113,7 +4113,7 @@ static void Cmd_getexp(void) } } -#ifdef B_NEW_MULTI_BATTLE_DEFEAT_CONDITION == TRUE +#ifdef B_MULTI_BATTLE_WHITEOUT >= GEN_4 static bool32 NoAliveMonsForPlayerAndPartner(void) { u32 i; @@ -4190,7 +4190,7 @@ static void Cmd_unknown_24(void) if (gBattleControllerExecFlags) return; - #ifdef B_NEW_MULTI_BATTLE_DEFEAT_CONDITION == TRUE + #ifdef B_MULTI_BATTLE_WHITEOUT >= GEN_4 if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER) && NoAliveMonsForPlayerAndPartner()) gBattleOutcome |= B_OUTCOME_LOST; #endif From 02fe96cc0815db17bc3660eee31d64ead7211428 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Mon, 20 Dec 2021 13:06:23 -0500 Subject: [PATCH 042/105] fix config settings --- include/constants/battle_config.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 4076b3ed09..08f6988f37 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -176,11 +176,13 @@ // Eg: Replace with FLAG_UNUSED_0x264 so you can use that flag to toggle the feature. #define B_FLAG_INVERSE_BATTLE 0 // If this flag is set, the battle's type effectiveness are inversed. For example, fire is super effective against water. #define B_FLAG_FORCE_DOUBLE_WILD 0 // If this flag is set, all land and surfing wild battles will be double battles. +#define B_SMART_WILD_AI_FLAG 0 // If not 0, you can set this flag in a script to enable smart wild pokemon // Var Settings // To use the following features in scripting, replace the 0s with the var ID you're assigning it to. // Eg: Replace with VAR_UNUSED_0x40F7 so you can use VAR_TERRAIN for that feature. #define VAR_TERRAIN 0 // If this var has a value, assigning a STATUS_FIELD_xx_TERRAIN to it before battle causes the battle to start with that terrain active +#define B_VAR_WILD_AI_FLAGS 0 // If not 0, you can use this var to add to default wild AI flags. NOT usable with flags above (1 << 15) // Interface settings #define B_ABILITY_POP_UP TRUE // In Gen5+, the Pokémon abilities are displayed in a pop-up, when they activate in battle. @@ -198,10 +200,6 @@ #define B_LAST_USED_BALL TRUE // If TRUE, the "last used ball" feature from Gen 7 will be implemented #define B_LAST_USED_BALL_BUTTON R_BUTTON // If last used ball is implemented, this button (or button combo) will trigger throwing the last used ball. -// AI Settings -#define B_SMART_WILD_AI_FLAG 0x1DE // If not 0, you can set this flag in a script to enable smart wild pokemon -#define B_VAR_WILD_AI_FLAGS 0x40F7 // If not 0, you can use this var to add to default wild AI flags. NOT usable with flags above (1 << 15) - // Other #define B_DOUBLE_WILD_CHANCE 0 // % chance of encountering two Pokémon in a Wild Encounter. #define B_THUNDERSTORM_TERRAIN TRUE // If TRUE, overworld Thunderstorm generates Rain and Electric Terrain as in Gen 8. From 05f91bc24347909d81347470af1baf0577ae5f4b Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Mon, 20 Dec 2021 14:06:32 -0500 Subject: [PATCH 043/105] Update include/constants/battle_config.h Co-authored-by: LOuroboros --- 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 08f6988f37..bdcf871b8a 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -176,7 +176,7 @@ // Eg: Replace with FLAG_UNUSED_0x264 so you can use that flag to toggle the feature. #define B_FLAG_INVERSE_BATTLE 0 // If this flag is set, the battle's type effectiveness are inversed. For example, fire is super effective against water. #define B_FLAG_FORCE_DOUBLE_WILD 0 // If this flag is set, all land and surfing wild battles will be double battles. -#define B_SMART_WILD_AI_FLAG 0 // If not 0, you can set this flag in a script to enable smart wild pokemon +#define B_SMART_WILD_AI_FLAG 0 // If not 0, you can set this flag in a script to enable smart wild pokemon // Var Settings // To use the following features in scripting, replace the 0s with the var ID you're assigning it to. From 713d97891f4db7ac06959192e552cacbdaf7970d Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 22 Dec 2021 21:32:10 -0300 Subject: [PATCH 044/105] Update include/constants/battle_config.h Co-authored-by: Eduardo Quezada D'Ottone --- include/constants/battle_config.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index f68646bb81..041a3ddc84 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -227,8 +227,8 @@ #define B_LAST_USED_BALL_BUTTON R_BUTTON // If last used ball is implemented, this button (or button combo) will trigger throwing the last used ball. // Other settings -#define B_DOUBLE_WILD_CHANCE 0 // % chance of encountering two Pokémon in a Wild Encounter. -#define B_MULTI_BATTLE_WHITEOUT GEN_8 // In Gen4+, multi battles end when the Player and also their Partner don't have any more Pokémon to fight. +#define B_DOUBLE_WILD_CHANCE 0 // % chance of encountering two Pokémon in a Wild Encounter. +#define B_MULTI_BATTLE_WHITEOUT GEN_8 // In Gen4+, multi battles end when the Player and also their Partner don't have any more Pokémon to fight. // Animation Settings #define B_NEW_SWORD_PARTICLE FALSE // If set to TRUE, it updates Swords Dance's particle. From b6b5d862f4410566f8bba22fc3fb15404ffbc0bf Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 23 Dec 2021 08:37:11 -0500 Subject: [PATCH 045/105] update role play mechanics --- data/battle_scripts_1.s | 11 +++++++++++ src/battle_script_commands.c | 1 + 2 files changed, 12 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 24a3d16eda..77e790a1d1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5285,8 +5285,19 @@ BattleScript_EffectRolePlay:: trycopyability BattleScript_ButItFailed attackanimation waitanimation +.if B_ABILITY_POP_UP == TRUE + setbyte sFIXED_ABILITY_POPUP, TRUE + showabilitypopup BS_ATTACKER + pause 60 + sethword sABILITY_OVERWRITE, 0 + updateabilitypopup BS_ATTACKER + pause 20 + destroyabilitypopup + pause 40 +.endif printstring STRINGID_PKMNCOPIEDFOE waitmessage B_WAIT_TIME_LONG + switchinabilities BS_ATTACKER goto BattleScript_MoveEnd BattleScript_EffectWish:: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 175fe6a679..3987177fa2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12344,6 +12344,7 @@ static void Cmd_trycopyability(void) // role play } else { + gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerAttacker].ability; gBattleMons[gBattlerAttacker].ability = defAbility; gLastUsedAbility = defAbility; gBattlescriptCurrInstr += 5; From 0a95a31ee9ac550d5e5b0c2ca514fb7f3b214e68 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 23 Dec 2021 08:44:54 -0500 Subject: [PATCH 046/105] fix formatting --- include/battle_main.h | 2 +- src/battle_interface.c | 316 ++++++++++++++++++++--------------------- 2 files changed, 159 insertions(+), 159 deletions(-) diff --git a/include/battle_main.h b/include/battle_main.h index 759774888a..d0d3e38fb9 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -29,7 +29,7 @@ struct ChooseMoveStruct; #define ABILITY_NAME_LENGTH 16 #else #define ABILITY_NAME_LENGTH 12 -#endif +#endif // defines for the 'DoBounceEffect' function #define BOUNCE_MON 0x0 diff --git a/src/battle_interface.c b/src/battle_interface.c index 265349f2e6..e512e8d177 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -2855,83 +2855,83 @@ static const struct SpriteTemplate sSpriteTemplate_AbilityPopUp2 = static const s16 sAbilityPopUpCoordsDoubles[MAX_BATTLERS_COUNT][2] = { {29, 80}, // player left - {186, 19}, // opponent left - {29, 97}, // player right - {186, 36}, // opponent right + {186, 19}, // opponent left + {29, 97}, // player right + {186, 36}, // opponent right }; static const s16 sAbilityPopUpCoordsSingles[MAX_BATTLERS_COUNT][2] = { {29, 97}, // player - {186, 57}, // opponent + {186, 57}, // opponent }; static u8* AddTextPrinterAndCreateWindowOnAbilityPopUp(const u8 *str, u32 x, u32 y, u32 color1, u32 color2, u32 color3, u32 *windowId) { - u8 color[3] = {color1, color2, color3}; - struct WindowTemplate winTemplate = {0}; - winTemplate.width = 8; - winTemplate.height = 2; + u8 color[3] = {color1, color2, color3}; + struct WindowTemplate winTemplate = {0}; + winTemplate.width = 8; + winTemplate.height = 2; - *windowId = AddWindow(&winTemplate); - FillWindowPixelBuffer(*windowId, PIXEL_FILL(color1)); + *windowId = AddWindow(&winTemplate); + FillWindowPixelBuffer(*windowId, PIXEL_FILL(color1)); - AddTextPrinterParameterized4(*windowId, 0, x, y, 0, 0, color, -1, str); - return (u8*)(GetWindowAttribute(*windowId, WINDOW_TILE_DATA)); + AddTextPrinterParameterized4(*windowId, 0, x, y, 0, 0, color, -1, str); + return (u8*)(GetWindowAttribute(*windowId, WINDOW_TILE_DATA)); } static void TextIntoAbilityPopUp(void *dest, u8 *windowTileData, s32 arg2, bool32 arg3) { - CpuCopy32(windowTileData + 256, dest + 256, arg2 * 32); - if (arg2 > 0) - { - do - { - if (arg3) - CpuCopy32(windowTileData + 16, dest + 16, 16); - else - CpuCopy32(windowTileData + 20, dest + 20, 12); - dest += 32, windowTileData += 32; - arg2--; - } while (arg2 != 0); - } + CpuCopy32(windowTileData + 256, dest + 256, arg2 * 32); + if (arg2 > 0) + { + do + { + if (arg3) + CpuCopy32(windowTileData + 16, dest + 16, 16); + else + CpuCopy32(windowTileData + 20, dest + 20, 12); + dest += 32, windowTileData += 32; + arg2--; + } while (arg2 != 0); + } } #define MAX_CHARS_PRINTED 12 static void PrintOnAbilityPopUp(const u8 *str, u8 *spriteTileData1, u8 *spriteTileData2, u32 x1, u32 x2, u32 y, u32 color1, u32 color2, u32 color3) { - u32 windowId, i; - u8 *windowTileData; - u8 text1[MAX_CHARS_PRINTED]; - u8 text2[MAX_CHARS_PRINTED]; + u32 windowId, i; + u8 *windowTileData; + u8 text1[MAX_CHARS_PRINTED]; + u8 text2[MAX_CHARS_PRINTED]; - for (i = 0; i < MAX_CHARS_PRINTED; i++) - { - text1[i] = str[i]; - if (text1[i] == EOS) - break; - } - text1[i] = EOS; + for (i = 0; i < MAX_CHARS_PRINTED; i++) + { + text1[i] = str[i]; + if (text1[i] == EOS) + break; + } + text1[i] = EOS; - windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(text1, x1, y, color1, color2, color3, &windowId); - TextIntoAbilityPopUp(spriteTileData1, windowTileData, 8, (y == 0)); - RemoveWindow(windowId); + windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(text1, x1, y, color1, color2, color3, &windowId); + TextIntoAbilityPopUp(spriteTileData1, windowTileData, 8, (y == 0)); + RemoveWindow(windowId); - if (i == MAX_CHARS_PRINTED) - { - for (i = 0; i < MAX_CHARS_PRINTED; i++) - { - text2[i] = str[MAX_CHARS_PRINTED + i]; - if (text2[i] == EOS) - break; - } - text2[i] = EOS; + if (i == MAX_CHARS_PRINTED) + { + for (i = 0; i < MAX_CHARS_PRINTED; i++) + { + text2[i] = str[MAX_CHARS_PRINTED + i]; + if (text2[i] == EOS) + break; + } + text2[i] = EOS; - windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(text2, x2, y, color1, color2, color3, &windowId); - TextIntoAbilityPopUp(spriteTileData2, windowTileData, 3, (y == 0)); - RemoveWindow(windowId); - } + windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(text2, x2, y, color1, color2, color3, &windowId); + TextIntoAbilityPopUp(spriteTileData2, windowTileData, 3, (y == 0)); + RemoveWindow(windowId); + } } static const u8 sText_Space16[]= _(" "); @@ -2992,120 +2992,120 @@ static void PrintAbilityOnAbilityPopUp(u32 ability, u8 spriteId1, u8 spriteId2) 7, 9, 1); } -#define PIXEL_COORDS_TO_OFFSET(x, y)( \ -/*Add tiles by X*/ \ -((y / 8) * 32 * 8) \ -/*Add tiles by X*/ \ -+ ((x / 8) * 32) \ -/*Add pixels by Y*/ \ -+ ((((y) - ((y / 8) * 8))) * 4) \ -/*Add pixels by X*/ \ +#define PIXEL_COORDS_TO_OFFSET(x, y)( \ +/*Add tiles by X*/ \ +((y / 8) * 32 * 8) \ +/*Add tiles by X*/ \ ++ ((x / 8) * 32) \ +/*Add pixels by Y*/ \ ++ ((((y) - ((y / 8) * 8))) * 4) \ +/*Add pixels by X*/ \ + ((((x) - ((x / 8) * 8)) / 2))) static const u16 sOverwrittenPixelsTable[][2] = { - {PIXEL_COORDS_TO_OFFSET(0, 0), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 1), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 2), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 3), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 4), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 5), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 6), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 7), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 8), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 9), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 10), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 11), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 12), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(0, 0), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 1), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 2), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 3), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 4), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 5), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 6), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 7), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 8), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 9), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 10), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 11), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 12), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(8, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(24, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(32, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(40, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(48, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(56, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(8, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(16, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(24, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(32, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(40, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(48, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(56, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(0, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(8, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(24, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(32, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(40, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(48, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(56, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(0, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(8, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(16, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(24, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(32, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(40, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(48, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(56, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(0, 15), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 16), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 17), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 18), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 19), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 20), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 21), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 22), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 23), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 24), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 25), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 26), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 15), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 16), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 17), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 18), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 19), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 20), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 21), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 22), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 23), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 24), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 25), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 26), 3}, //Second Row Of Image - {PIXEL_COORDS_TO_OFFSET(0, 45), 8}, - {PIXEL_COORDS_TO_OFFSET(0, 46), 8}, - {PIXEL_COORDS_TO_OFFSET(0, 47), 8}, - //{PIXEL_COORDS_TO_OFFSET(0, 48), 8}, // cuts off the top of the 'G' in Neutralizing Gas - {PIXEL_COORDS_TO_OFFSET(8, 45), 8}, - {PIXEL_COORDS_TO_OFFSET(8, 46), 8}, - {PIXEL_COORDS_TO_OFFSET(8, 47), 8}, - {PIXEL_COORDS_TO_OFFSET(8, 48), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 45), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 46), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 47), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 48), 8}, + {PIXEL_COORDS_TO_OFFSET(0, 45), 8}, + {PIXEL_COORDS_TO_OFFSET(0, 46), 8}, + {PIXEL_COORDS_TO_OFFSET(0, 47), 8}, + //{PIXEL_COORDS_TO_OFFSET(0, 48), 8}, // cuts off the top of the 'G' in Neutralizing Gas + {PIXEL_COORDS_TO_OFFSET(8, 45), 8}, + {PIXEL_COORDS_TO_OFFSET(8, 46), 8}, + {PIXEL_COORDS_TO_OFFSET(8, 47), 8}, + {PIXEL_COORDS_TO_OFFSET(8, 48), 8}, + {PIXEL_COORDS_TO_OFFSET(16, 45), 8}, + {PIXEL_COORDS_TO_OFFSET(16, 46), 8}, + {PIXEL_COORDS_TO_OFFSET(16, 47), 8}, + {PIXEL_COORDS_TO_OFFSET(16, 48), 8}, }; static inline void CopyPixels(u8 *dest, const u8 *src, u32 pixelCount) { - u32 i = 0; + u32 i = 0; - if (pixelCount & 1) - { - while (pixelCount != 0) - { - dest[i] &= ~(0xF); - dest[i] |= (src[i] & 0xF); - if (--pixelCount != 0) - { - dest[i] &= ~(0xF0); - dest[i] |= (src[i] & 0xF0); - pixelCount--; - } - i++; - } - } - else - { - for (i = 0; i < pixelCount / 2; i++) - dest[i] = src[i]; - } + if (pixelCount & 1) + { + while (pixelCount != 0) + { + dest[i] &= ~(0xF); + dest[i] |= (src[i] & 0xF); + if (--pixelCount != 0) + { + dest[i] &= ~(0xF0); + dest[i] |= (src[i] & 0xF0); + pixelCount--; + } + i++; + } + } + else + { + for (i = 0; i < pixelCount / 2; i++) + dest[i] = src[i]; + } } static void RestoreOverwrittenPixels(u8 *tiles) { - u32 i; - u8 *buffer = Alloc(sizeof(sAbilityPopUpGfx) * 2); + u32 i; + u8 *buffer = Alloc(sizeof(sAbilityPopUpGfx) * 2); - CpuCopy32(tiles, buffer, sizeof(sAbilityPopUpGfx)); + CpuCopy32(tiles, buffer, sizeof(sAbilityPopUpGfx)); - for (i = 0; i < ARRAY_COUNT(sOverwrittenPixelsTable); i++) - { - CopyPixels(buffer + sOverwrittenPixelsTable[i][0], - sAbilityPopUpGfx + sOverwrittenPixelsTable[i][0], - sOverwrittenPixelsTable[i][1]); - } + for (i = 0; i < ARRAY_COUNT(sOverwrittenPixelsTable); i++) + { + CopyPixels(buffer + sOverwrittenPixelsTable[i][0], + sAbilityPopUpGfx + sOverwrittenPixelsTable[i][0], + sOverwrittenPixelsTable[i][1]); + } - CpuCopy32(buffer, tiles, sizeof(sAbilityPopUpGfx)); - Free(buffer); + CpuCopy32(buffer, tiles, sizeof(sAbilityPopUpGfx)); + Free(buffer); } void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle) @@ -3254,19 +3254,19 @@ static void Task_FreeAbilityPopUpGfx(u8 taskId) static const struct OamData sOamData_LastUsedBall = { - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = SPRITE_SHAPE(32x32), - .x = 0, - .matrixNum = 0, - .size = SPRITE_SIZE(32x32), - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = SPRITE_SHAPE(32x32), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(32x32), + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, }; static const struct SpriteTemplate sSpriteTemplate_LastUsedBallWindow = From 58a5a9cbec6a7324089b3307743fab514efcaaa2 Mon Sep 17 00:00:00 2001 From: W1serV1ser <1prefertheaircauseimanairnomad@gmail.com> Date: Thu, 23 Dec 2021 15:27:11 -0800 Subject: [PATCH 047/105] Simplified skyDropTargets storage and made other minor improvements A lot of these changes are based on ghoulslash's version of Sky Drop. --- src/battle_main.c | 102 ++++++++++------------- src/battle_script_commands.c | 125 +++++++++++------------------ src/battle_util.c | 151 ++++++++++++----------------------- 3 files changed, 140 insertions(+), 238 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index c22a3f6133..c9ee8b724b 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2871,6 +2871,7 @@ static void BattleStartClearSetData(void) gBattleStruct->lastTakenMoveFrom[i][2] = 0; gBattleStruct->lastTakenMoveFrom[i][3] = 0; gBattleStruct->AI_monToSwitchIntoId[i] = PARTY_SIZE; + gBattleStruct->skyDropTargets[i] = 0xFF; } gLastUsedMove = 0; @@ -2945,12 +2946,6 @@ static void BattleStartClearSetData(void) } gSwapDamageCategory = FALSE; // Photon Geyser, Shell Side Arm, Light That Burns the Sky - - // Clear skyDropTargets data - for (i = 0; i < 4; i++) - { - gBattleStruct->skyDropTargets[i] = 0xFF; - } } void SwitchInClearSetData(void) @@ -3087,56 +3082,6 @@ void FaintClearSetData(void) gBattleMons[i].status2 &= ~(STATUS2_INFATUATED_WITH(gActiveBattler)); if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && *(gBattleStruct->wrappedBy + i) == gActiveBattler) gBattleMons[i].status2 &= ~(STATUS2_WRAPPED); - - // If the fainted mon was holding another Pokemon in Sky Drop, release the mon and clear Sky Drop data - if (gActiveBattler == gBattleStruct->skyDropTargets[0] && i == gBattleStruct->skyDropTargets[1]) - { - gBattleStruct->skyDropTargets[0] = 0xFF; - gBattleStruct->skyDropTargets[1] = 0xFF; - - gStatuses3[i] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); - gSprites[gBattlerSpriteIds[i]].invisible = FALSE; - - // If the target was sky dropped in the middle of using Outrage/Petal Dance/Thrash, - // confuse them upon release and print "confused via fatigue" message and animation. - if (gBattleMons[i].status2 & STATUS2_LOCK_CONFUSE) - { - gBattleMons[i].status2 &= ~(STATUS2_LOCK_CONFUSE); - - // If the released mon can be confused, do so. - // Don't use CanBeConfused here, since it can cause issues in edge cases. - if (!(GetBattlerAbility(i) == ABILITY_OWN_TEMPO - || gBattleMons[i].status2 & STATUS2_CONFUSION - || IsBattlerTerrainAffected(i, STATUS_FIELD_MISTY_TERRAIN))) - { - gBattleMons[i].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); - gBattlerAttacker = i; - gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 2; - } - } - } - else if (gActiveBattler == gBattleStruct->skyDropTargets[2] && i == gBattleStruct->skyDropTargets[3]) - { - gBattleStruct->skyDropTargets[2] = 0xFF; - gBattleStruct->skyDropTargets[3] = 0xFF; - - gStatuses3[i] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); - gSprites[gBattlerSpriteIds[i]].invisible = FALSE; - - if (gBattleMons[i].status2 & STATUS2_LOCK_CONFUSE) - { - gBattleMons[i].status2 &= ~(STATUS2_LOCK_CONFUSE); - gEffectBattler = i; - if (!(GetBattlerAbility(i) == ABILITY_OWN_TEMPO - || gBattleMons[i].status2 & STATUS2_CONFUSION - || IsBattlerTerrainAffected(i, STATUS_FIELD_MISTY_TERRAIN))) - { - gBattleMons[i].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); - gBattlerAttacker = i; - gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 2; - } - } - } } gActionSelectionCursor[gActiveBattler] = 0; @@ -3216,12 +3161,45 @@ void FaintClearSetData(void) UndoFormChange(gBattlerPartyIndexes[gActiveBattler], GET_BATTLER_SIDE(gActiveBattler), FALSE); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) UndoMegaEvolution(gBattlerPartyIndexes[gActiveBattler]); - - // If the fainted Pokemon was being held by Sky Drop, clear their Sky Drop data. - if (gActiveBattler == gBattleStruct->skyDropTargets[1]) - gBattleStruct->skyDropTargets[1] = 0xFF; - else if (gActiveBattler == gBattleStruct->skyDropTargets[3]) - gBattleStruct->skyDropTargets[3] = 0xFF; + + // If the fainted mon was involved in a Sky Drop + if (gBattleStruct->skyDropTargets[gActiveBattler] != 0xFF) + { + // Get battler id of the other Pokemon involved in this Sky Drop + u8 otherSkyDropper = gBattleStruct->skyDropTargets[gActiveBattler]; + + // Clear Sky Drop data + gBattleStruct->skyDropTargets[gActiveBattler] = 0xFF; + gBattleStruct->skyDropTargets[otherSkyDropper] = 0xFF; + + // If the other Pokemon involved in this Sky Drop was the target, not the attacker + if (gStatuses3[otherSkyDropper] & STATUS3_SKY_DROPPED) + { + // Release the target and take them out of the semi-invulnerable state + gStatuses3[otherSkyDropper] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + + // Make the target's sprite visible + gSprites[gBattlerSpriteIds[otherSkyDropper]].invisible = FALSE; + + // If the target was sky dropped in the middle of using Outrage/Petal Dance/Thrash, + // confuse them upon release and print "confused via fatigue" message and animation. + if (gBattleMons[otherSkyDropper].status2 & STATUS2_LOCK_CONFUSE) + { + gBattleMons[otherSkyDropper].status2 &= ~(STATUS2_LOCK_CONFUSE); + + // If the released mon can be confused, do so. + // Don't use CanBeConfused here, since it can cause issues in edge cases. + if (!(GetBattlerAbility(otherSkyDropper) == ABILITY_OWN_TEMPO + || gBattleMons[otherSkyDropper].status2 & STATUS2_CONFUSION + || IsBattlerTerrainAffected(otherSkyDropper, STATUS_FIELD_MISTY_TERRAIN))) + { + gBattleMons[otherSkyDropper].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + gBattlerAttacker = otherSkyDropper; + gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 2; + } + } + } + } } static void DoBattleIntro(void) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 90ae0b1199..9663afa9c2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1610,14 +1610,14 @@ static bool32 AccuracyCalcHelper(u16 move) return TRUE; } // If the attacker has the ability No Guard and they aren't targeting a Pokemon involved in a Sky Drop with the move Sky Drop, move hits. - else if (GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD && (move != MOVE_SKY_DROP || (gBattlerTarget != gBattleStruct->skyDropTargets[0] && gBattlerTarget != gBattleStruct->skyDropTargets[1] && gBattlerTarget != gBattleStruct->skyDropTargets[2] && gBattlerTarget != gBattleStruct->skyDropTargets[3]))) + else if (GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD && (move != MOVE_SKY_DROP || gBattleStruct->skyDropTargets[gBattlerTarget] == 0xFF)) { if (!JumpIfMoveFailed(7, move)) RecordAbilityBattle(gBattlerAttacker, ABILITY_NO_GUARD); return TRUE; } // If the target has the ability No Guard and they aren't involved in a Sky Drop or the current move isn't Sky Drop, move hits. - else if (GetBattlerAbility(gBattlerTarget) == ABILITY_NO_GUARD && (move != MOVE_SKY_DROP || (gBattlerTarget != gBattleStruct->skyDropTargets[0] && gBattlerTarget != gBattleStruct->skyDropTargets[1] && gBattlerTarget != gBattleStruct->skyDropTargets[2] && gBattlerTarget != gBattleStruct->skyDropTargets[3]))) + else if (GetBattlerAbility(gBattlerTarget) == ABILITY_NO_GUARD && (move != MOVE_SKY_DROP || gBattleStruct->skyDropTargets[gBattlerTarget] == 0xFF)) { if (!JumpIfMoveFailed(7, move)) RecordAbilityBattle(gBattlerTarget, ABILITY_NO_GUARD); @@ -1625,7 +1625,7 @@ static bool32 AccuracyCalcHelper(u16 move) } if ((gStatuses3[gBattlerTarget] & STATUS3_PHANTOM_FORCE) - || (!(gBattleMoves[move].flags & FLAG_DMG_IN_AIR || gBattleMoves[move].flags & FLAG_DMG_2X_IN_AIR) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR) + || (!(gBattleMoves[move].flags & (FLAG_DMG_IN_AIR | FLAG_DMG_2X_IN_AIR)) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR) || (!(gBattleMoves[move].flags & FLAG_DMG_UNDERGROUND) && gStatuses3[gBattlerTarget] & STATUS3_UNDERGROUND) || (!(gBattleMoves[move].flags & FLAG_DMG_UNDERWATER) && gStatuses3[gBattlerTarget] & STATUS3_UNDERWATER)) { @@ -5153,23 +5153,27 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; - case MOVEEND_SKY_DROP_CONFUSE: // If a Pokemon was released from Sky Drop and was in LOCK_CONFUSE, go to "confused due to fatigue scripts and clear Sky Drop data. + case MOVEEND_SKY_DROP_CONFUSE: // If a Pokemon was released from Sky Drop and was in LOCK_CONFUSE, go to "confused due to fatigue" scripts and clear Sky Drop data. for (i = 0; i < gBattlersCount; i++) { - if (gBattleStruct->skyDropTargets[0] == 0xFE - i) + if (gBattleStruct->skyDropTargets[i] == 0xFE) { - gBattlerAttacker = gBattleStruct->skyDropTargets[1]; + // Find the battler id of the Pokemon that was held by Sky Drop + for (arg1 = 0; arg1 < gBattlersCount; arg1++) + { + if (gBattleStruct->skyDropTargets[arg1] == i) + break; + } + + // Set gBattlerAttacker to the battler id of the target + gBattlerAttacker = arg1; + + // Jump to "confused due to fatigue" script gBattlescriptCurrInstr = BattleScript_ThrashConfuses; - gBattleStruct->skyDropTargets[0] = 0xFF; - gBattleStruct->skyDropTargets[1] = 0xFF; - return; - } - else if (gBattleStruct->skyDropTargets[2] == 0xFE - i) - { - gBattlerAttacker = gBattleStruct->skyDropTargets[3]; - gBattlescriptCurrInstr = BattleScript_ThrashConfuses; - gBattleStruct->skyDropTargets[2] = 0xFF; - gBattleStruct->skyDropTargets[3] = 0xFF; + + // Clear skyDropTargets data + gBattleStruct->skyDropTargets[i] = 0xFF; + gBattleStruct->skyDropTargets[arg1] = 0xFF; return; } } @@ -7715,10 +7719,10 @@ static void Cmd_various(void) return; case VARIOUS_GRAVITY_ON_AIRBORNE_MONS: // Cancel all multiturn moves of IN_AIR Pokemon except those being targeted by Sky Drop. - if (gStatuses3[gActiveBattler] & STATUS3_ON_AIR && !(gActiveBattler == gBattleStruct->skyDropTargets[1] || gActiveBattler == gBattleStruct->skyDropTargets[3])) + if (gStatuses3[gActiveBattler] & STATUS3_ON_AIR && !(gStatuses3[gActiveBattler] & STATUS3_SKY_DROPPED)) CancelMultiTurnMoves(gActiveBattler); - gStatuses3[gActiveBattler] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR); + gStatuses3[gActiveBattler] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR | STATUS3_SKY_DROPPED); break; case VARIOUS_SPECTRAL_THIEF: // Raise stats @@ -8927,7 +8931,7 @@ static void Cmd_various(void) MarkBattlerForControllerExec(gActiveBattler); } - if (gBattleMons[gActiveBattler].pp[i] == 0 && !(gActiveBattler == gBattleStruct->skyDropTargets[0] || gActiveBattler == gBattleStruct->skyDropTargets[2])) + if (gBattleMons[gActiveBattler].pp[i] == 0 && gBattleStruct->skyDropTargets[gActiveBattler] == 0xFF) CancelMultiTurnMoves(gActiveBattler); gBattlescriptCurrInstr += 7; // continue @@ -9003,21 +9007,13 @@ static void Cmd_various(void) return; case VARIOUS_SET_SKY_DROP: gStatuses3[gBattlerTarget] |= (STATUS3_SKY_DROPPED | STATUS3_ON_AIR); - /* skyDropTargets holds the information of who is the attacker and the target of Sky Drop. + /* skyDropTargets holds the information of who is in a particular instance of Sky Drop. This is needed in the case that multiple Pokemon use Sky Drop in the same turn or if the target of a Sky Drop faints while in the air.*/ - if (gBattleStruct->skyDropTargets[0] == 0xFF) - { - gBattleStruct->skyDropTargets[0] = gBattlerAttacker; - gBattleStruct->skyDropTargets[1] = gBattlerTarget; - } - else - { - gBattleStruct->skyDropTargets[2] = gBattlerAttacker; - gBattleStruct->skyDropTargets[3] = gBattlerTarget; - } + gBattleStruct->skyDropTargets[gBattlerAttacker] = gBattlerTarget; + gBattleStruct->skyDropTargets[gBattlerTarget] = gBattlerAttacker; - // End any multiturn effects caused by the target + // End any multiturn effects caused by the target except STATUS2_LOCK_CONFUSE gBattleMons[gBattlerTarget].status2 &= ~(STATUS2_MULTIPLETURNS); gBattleMons[gBattlerTarget].status2 &= ~(STATUS2_UPROAR); gBattleMons[gBattlerTarget].status2 &= ~(STATUS2_BIDE); @@ -9025,34 +9021,16 @@ static void Cmd_various(void) gDisableStructs[gBattlerTarget].furyCutterCounter = 0; break; case VARIOUS_CLEAR_SKY_DROP: - if (gBattleStruct->skyDropTargets[0] == gBattlerAttacker) - { - // Check to see if the initial target of this Sky Drop fainted before the 2nd turn of Sky Drop. - // If so, make the move fail. If not, clear all of the statuses and continue the move. - if (gBattleStruct->skyDropTargets[1] == 0xFF) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); - else - { - gStatuses3[gBattlerTarget] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); - gBattlescriptCurrInstr += 7; - } - - // Clear skyDropTargets data - gBattleStruct->skyDropTargets[0] = 0xFF; - gBattleStruct->skyDropTargets[1] = 0xFF; - } + // Check to see if the initial target of this Sky Drop fainted before the 2nd turn of Sky Drop. + // If so, make the move fail. If not, clear all of the statuses and continue the move. + if (gBattleStruct->skyDropTargets[gBattlerAttacker] == 0xFF) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); else { - if (gBattleStruct->skyDropTargets[3] == 0xFF) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); - else - { - gStatuses3[gBattlerTarget] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); - gBattlescriptCurrInstr += 7; - } - - gBattleStruct->skyDropTargets[2] = 0xFF; - gBattleStruct->skyDropTargets[3] = 0xFF; + gBattleStruct->skyDropTargets[gBattlerAttacker] = 0xFF; + gBattleStruct->skyDropTargets[gBattlerTarget] = 0xFF; + gStatuses3[gBattlerTarget] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + gBattlescriptCurrInstr += 7; } // Confuse target if they were in the middle of Petal Dance/Outrage/Thrash when targeted. @@ -9060,28 +9038,19 @@ static void Cmd_various(void) gBattleScripting.moveEffect = (MOVE_EFFECT_CONFUSION | MOVE_EFFECT_CERTAIN); return; case VARIOUS_SKY_DROP_YAWN: // If the mon that's sleeping due to Yawn was holding a Pokemon in Sky Drop, release the target and clear Sky Drop data. - if (gEffectBattler == gBattleStruct->skyDropTargets[0]) + if (gBattleStruct->skyDropTargets[gEffectBattler] != 0xFF && !(gStatuses3[gEffectBattler] & STATUS3_SKY_DROPPED)) { - gEffectBattler = gBattleStruct->skyDropTargets[1]; - gBattleStruct->skyDropTargets[0] = 0xFF; - gBattleStruct->skyDropTargets[1] = 0xFF; - gBattleMons[gEffectBattler].status2 &= ~(STATUS2_LOCK_CONFUSE); - if (CanBeConfused(gEffectBattler)) - { - gBattlerAttacker = gEffectBattler; - gBattleMons[gBattlerTarget].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); - gBattlescriptCurrInstr = BattleScript_ThrashConfuses; - return; - } - } - else if (gEffectBattler == gBattleStruct->skyDropTargets[2]) - { - gEffectBattler = gBattleStruct->skyDropTargets[3]; - gBattleStruct->skyDropTargets[2] = 0xFF; - gBattleStruct->skyDropTargets[3] = 0xFF; - gBattleMons[gEffectBattler].status2 &= ~(STATUS2_LOCK_CONFUSE); - if (CanBeConfused(gEffectBattler)) + // Set the target of Sky Drop as gEffectBattler + gEffectBattler = gBattleStruct->skyDropTargets[gEffectBattler]; + + // Clear skyDropTargets data + gBattleStruct->skyDropTargets[gBattleStruct->skyDropTargets[gEffectBattler]] = 0xFF; + gBattleStruct->skyDropTargets[gEffectBattler] = 0xFF; + + // If the target was in the middle of Outrage/Thrash/etc. when targeted by Sky Drop, confuse them on release and do proper animation + if (gBattleMons[gEffectBattler].status2 & STATUS2_LOCK_CONFUSE && CanBeConfused(gEffectBattler)) { + gBattleMons[gEffectBattler].status2 &= ~(STATUS2_LOCK_CONFUSE); gBattlerAttacker = gEffectBattler; gBattleMons[gBattlerTarget].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); gBattlescriptCurrInstr = BattleScript_ThrashConfuses; @@ -11482,7 +11451,7 @@ static void Cmd_tryspiteppreduce(void) gBattlescriptCurrInstr += 5; // Don't cut off Sky Drop if pp is brought to zero. - if (gBattleMons[gBattlerTarget].pp[i] == 0 && !(gBattlerTarget == gBattleStruct->skyDropTargets[0] || gBattlerTarget == gBattleStruct->skyDropTargets[2])) + if (gBattleMons[gBattlerTarget].pp[i] == 0 && gBattleStruct->skyDropTargets[gBattlerTarget] == 0xFF) CancelMultiTurnMoves(gBattlerTarget); } else diff --git a/src/battle_util.c b/src/battle_util.c index 7e40315492..c223f3ec7e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1427,117 +1427,72 @@ void CancelMultiTurnMoves(u8 battler) gBattleMons[battler].status2 &= ~(STATUS2_UPROAR); gBattleMons[battler].status2 &= ~(STATUS2_BIDE); - // Don't clear battler's semi-invulnerable bits if they are held by Sky Drop. - if (gBattleStruct->skyDropTargets[1] != battler && gBattleStruct->skyDropTargets[3] != battler) + // Clear battler's semi-invulnerable bits if they are not held by Sky Drop. + if (!(gStatuses3[battler] & STATUS3_SKY_DROPPED)) gStatuses3[battler] &= ~(STATUS3_SEMI_INVULNERABLE); // Check to see if this Pokemon was in the middle of using Sky Drop. If so, release the target. - if (gBattleStruct->skyDropTargets[0] == battler) + if (gBattleStruct->skyDropTargets[battler] != 0xFF && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) { - // Sets skyDropTargets[1] to be the battler id for the target - for (i = 0; i < MAX_BATTLERS_COUNT; i++) + // Get the target's battler id + u8 otherSkyDropper = gBattleStruct->skyDropTargets[battler]; + + // Clears sky_dropped and on_air statuses + gStatuses3[otherSkyDropper] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + + // Makes both attacker and target's sprites visible + gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; + gSprites[gBattlerSpriteIds[otherSkyDropper]].invisible = FALSE; + + // If target was sky dropped in the middle of Outrage/Thrash/Petal Dance, + // confuse them upon release and display "confused by fatigue" message & animation. + // Don't do this if this CancelMultiTurnMoves is caused by falling asleep via Yawn. + if (gBattleMons[otherSkyDropper].status2 & STATUS2_LOCK_CONFUSE && gBattleStruct->turnEffectsTracker != 24) { - if (gBattleStruct->skyDropTargets[1] == i) + gBattleMons[otherSkyDropper].status2 &= ~(STATUS2_LOCK_CONFUSE); + + // If the target can be confused, confuse them. + // Don't use CanBeConfused, can cause issues in edge cases. + if (!(GetBattlerAbility(otherSkyDropper) == ABILITY_OWN_TEMPO + || gBattleMons[otherSkyDropper].status2 & STATUS2_CONFUSION + || IsBattlerTerrainAffected(otherSkyDropper, STATUS_FIELD_MISTY_TERRAIN))) { - // Clears sky dropped and on_air statuses - gStatuses3[i] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); - - // Makes both attacker and target's sprites visible - gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; - gSprites[gBattlerSpriteIds[i]].invisible = FALSE; - - // If target was sky dropped in the middle of Outrage/Thrash/Petal Dance, - // confuse them upon release and display "confused by fatigue" message & animation. - // Don't do this if this CancelMultiTurnMoves is caused by falling asleep via Yawn. - if (gBattleMons[i].status2 & STATUS2_LOCK_CONFUSE && gBattleStruct->turnEffectsTracker != 24) + // Set confused status + gBattleMons[otherSkyDropper].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + + // If this CancelMultiTurnMoves is occuring due to attackcanceller + if (gBattlescriptCurrInstr[0] == 0x0) { - gBattleMons[i].status2 &= ~(STATUS2_LOCK_CONFUSE); - - // If the target can be confused, confuse them. - // Don't use CanBeConfused, can cause issues in edge cases. - if (!(GetBattlerAbility(i) == ABILITY_OWN_TEMPO - || gBattleMons[i].status2 & STATUS2_CONFUSION - || IsBattlerTerrainAffected(i, STATUS_FIELD_MISTY_TERRAIN))) - { - gBattleMons[i].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); - - // If this CancelMultiTurnMoves is occuring due to attackcanceller or VARIOUS_GRAVITY_ON_AIRBORNE_MONS - if (gBattlescriptCurrInstr[0] == 0x0 || (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 76)) - { - gBattleStruct->skyDropTargets[0] = 0xFE - battler; - } - // If this CancelMultiTurnMoves is occuring due to cancelmultiturnmoves script - else if (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 0) - { - gBattlerAttacker = i; - gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 3; - } - // If this CancelMultiTurnMoves is occuring due to receiving Sleep/Freeze status - else if (gBattleScripting.moveEffect <= PRIMARY_STATUS_MOVE_EFFECT) - { - gBattlerAttacker = i; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 1; - } - } + gBattleStruct->skyDropTargets[battler] = 0xFE; + } + // If this CancelMultiTurnMoves is occuring due to VARIOUS_GRAVITY_ON_AIRBORNE_MONS + // Reapplying STATUS3_SKY_DROPPED allows for avoiding unecessary messages when Gravity is applied to the target. + else if (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 76) + { + gBattleStruct->skyDropTargets[battler] = 0xFE; + gStatuses3[otherSkyDropper] |= STATUS3_SKY_DROPPED; + } + // If this CancelMultiTurnMoves is occuring due to cancelmultiturnmoves script + else if (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 0) + { + gBattlerAttacker = otherSkyDropper; + gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 3; + } + // If this CancelMultiTurnMoves is occuring due to receiving Sleep/Freeze status + else if (gBattleScripting.moveEffect <= PRIMARY_STATUS_MOVE_EFFECT) + { + gBattlerAttacker = otherSkyDropper; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 1; } - break; } } // Clear skyDropTargets data, unless this CancelMultiTurnMoves is caused by Yawn, attackcanceler, or VARIOUS_GRAVITY_ON_AIRBORNE_MONS - if (!(gBattleMons[gBattleStruct->skyDropTargets[1]].status2 & STATUS2_LOCK_CONFUSE) && gBattleStruct->skyDropTargets[0] < 4) + if (!(gBattleMons[otherSkyDropper].status2 & STATUS2_LOCK_CONFUSE) && gBattleStruct->skyDropTargets[battler] < 4) { - gBattleStruct->skyDropTargets[0] = 0xFF; - gBattleStruct->skyDropTargets[1] = 0xFF; - } - } - else if (gBattleStruct->skyDropTargets[2] == battler) - { - for (i = 0; i < MAX_BATTLERS_COUNT; i++) - { - if (gBattleStruct->skyDropTargets[3] == i) - { - gStatuses3[i] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); - - gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; - gSprites[gBattlerSpriteIds[i]].invisible = FALSE; - - if (gBattleMons[i].status2 & STATUS2_LOCK_CONFUSE && gBattleStruct->turnEffectsTracker != 24) - { - gBattleMons[i].status2 &= ~(STATUS2_LOCK_CONFUSE); - - if (!(GetBattlerAbility(i) == ABILITY_OWN_TEMPO - || gBattleMons[i].status2 & STATUS2_CONFUSION - || IsBattlerTerrainAffected(i, STATUS_FIELD_MISTY_TERRAIN))) - { - gBattleMons[i].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); - - if (gBattlescriptCurrInstr[0] == 0x0 || (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 76)) - { - gBattleStruct->skyDropTargets[2] = 0xFE - battler; - } - else if (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 0) - { - gBattlerAttacker = i; - gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 3; - } - else if (gBattleScripting.moveEffect <= PRIMARY_STATUS_MOVE_EFFECT) - { - gBattlerAttacker = i; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 1; - } - } - } - break; - } - } - - if (!(gBattleMons[gBattleStruct->skyDropTargets[3]].status2 & STATUS2_LOCK_CONFUSE) && gBattleStruct->skyDropTargets[2] < 4) - { - gBattleStruct->skyDropTargets[2] = 0xFF; - gBattleStruct->skyDropTargets[3] = 0xFF; + gBattleStruct->skyDropTargets[battler] = 0xFF; + gBattleStruct->skyDropTargets[otherSkyDropper] = 0xFF; } } From 770224d34129c7a2bb0561a5012757e1b2630a11 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 23 Dec 2021 18:58:15 -0500 Subject: [PATCH 048/105] increase TEXT_BUFF_ARRAY_COUNT for expanded ability names --- include/battle_message.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/include/battle_message.h b/include/battle_message.h index 5c10f9e04a..09ee27c081 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -1,7 +1,13 @@ #ifndef GUARD_BATTLE_MESSAGE_H #define GUARD_BATTLE_MESSAGE_H -#define TEXT_BUFF_ARRAY_COUNT 16 +#include "constants/battle_config.h" + +#if B_EXPANDED_ABILITY_NAMES == TRUE + #define TEXT_BUFF_ARRAY_COUNT 17 +#else + #define TEXT_BUFF_ARRAY_COUNT 16 +#endif // for 0xFD #define B_TXT_BUFF1 0x0 From e0f7e7a2d970df7e28884f9e8c73b2771355312e Mon Sep 17 00:00:00 2001 From: W1serV1ser <1prefertheaircauseimanairnomad@gmail.com> Date: Mon, 27 Dec 2021 12:10:38 -0800 Subject: [PATCH 049/105] Updated variable name in MOVEEND_SKY_DROP_CONFUSE --- src/battle_script_commands.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 47d5b4fa26..d71c93bcaa 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5179,22 +5179,23 @@ static void Cmd_moveend(void) { if (gBattleStruct->skyDropTargets[i] == 0xFE) { + u8 targetId; // Find the battler id of the Pokemon that was held by Sky Drop - for (arg1 = 0; arg1 < gBattlersCount; arg1++) + for (targetId = 0; targetId < gBattlersCount; targetId++) { - if (gBattleStruct->skyDropTargets[arg1] == i) + if (gBattleStruct->skyDropTargets[targetId] == i) break; } // Set gBattlerAttacker to the battler id of the target - gBattlerAttacker = arg1; + gBattlerAttacker = targetId; // Jump to "confused due to fatigue" script gBattlescriptCurrInstr = BattleScript_ThrashConfuses; // Clear skyDropTargets data gBattleStruct->skyDropTargets[i] = 0xFF; - gBattleStruct->skyDropTargets[arg1] = 0xFF; + gBattleStruct->skyDropTargets[targetId] = 0xFF; return; } } From cc1a2431452403d36f6997d96092c14cfc7b233a Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 28 Dec 2021 12:18:44 -0300 Subject: [PATCH 050/105] Update src/battle_script_commands.c Co-authored-by: Eduardo Quezada D'Ottone --- src/battle_script_commands.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d41084ca7a..07e68e5bc3 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4190,12 +4190,21 @@ static void Cmd_unknown_24(void) if (gBattleControllerExecFlags) return; - #ifdef B_MULTI_BATTLE_WHITEOUT >= GEN_4 - if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER) && NoAliveMonsForPlayerAndPartner()) - gBattleOutcome |= B_OUTCOME_LOST; - #endif - if (!(gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER)) && NoAliveMonsForPlayer()) +#ifdef B_MULTI_BATTLE_WHITEOUT >= GEN_4 + if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER)) + { + if (NoAliveMonsForPlayerAndPartner()) + gBattleOutcome |= B_OUTCOME_LOST; + } + else + { + if (NoAliveMonsForPlayer()) + gBattleOutcome |= B_OUTCOME_LOST; + } +#else + if (NoAliveMonsForPlayer()) gBattleOutcome |= B_OUTCOME_LOST; +#endif if (NoAliveMonsForOpponent()) gBattleOutcome |= B_OUTCOME_WON; From ce7815ebcc749f18209f9ed9c23a1f2ff9ede2a7 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 28 Dec 2021 15:11:52 -0300 Subject: [PATCH 051/105] Update pokemon.h --- include/constants/pokemon.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 342f995425..963a5d8d31 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -375,6 +375,8 @@ #define EVO_LEVEL_DARK_TYPE_MON_IN_PARTY 30 // Pokémon reaches the specified level with a Dark Type Pokémon in party #define EVO_TRADE_SPECIFIC_MON 31 // Pokémon is traded for a specified Pokémon #define EVO_SPECIFIC_MAP 32 // Pokémon levels up on specified map +#define EVO_LEVEL_NATURE_AMPED 33 // Pokémon reaches the specified level, it has a Hardy, Brave, Adamant, Naughty, Docile, Impish, Lax, Hasty, Jolly, Naive, Rash, Sassy, or Quirky nature. +#define EVO_LEVEL_NATURE_LOW_KEY 34 // Pokémon reaches the specified level, it has a Lonely, Bold, Relaxed, Timid, Serious, Modest, Mild, Quiet, Bashful, Calm, Gentle, or Careful nature. #define EVOS_PER_MON 10 From ba43280a7c8b63437a733180db95f2de3aad5071 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Wed, 29 Dec 2021 21:04:15 -0300 Subject: [PATCH 052/105] Refactored Instruct to use the regular forbidden move lookup table --- src/battle_script_commands.c | 155 ++++++++++++++--------------------- 1 file changed, 63 insertions(+), 92 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 857a4d819c..626676ab03 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -919,13 +919,12 @@ static const struct SpriteTemplate sSpriteTemplate_MonIconOnLvlUpBanner = static const u16 sProtectSuccessRates[] = {USHRT_MAX, USHRT_MAX / 2, USHRT_MAX / 4, USHRT_MAX / 8}; -#define FORBIDDEN_MIMIC 0x1 -#define FORBIDDEN_METRONOME 0x2 -#define FORBIDDEN_ASSIST 0x4 -#define FORBIDDEN_COPYCAT 0x8 -#define FORBIDDEN_SLEEP_TALK 0x10 - -#define FORBIDDEN_INSTRUCT_END 0xFFFF +#define FORBIDDEN_MIMIC (1 << 0) +#define FORBIDDEN_METRONOME (1 << 1) +#define FORBIDDEN_ASSIST (1 << 2) +#define FORBIDDEN_COPYCAT (1 << 3) +#define FORBIDDEN_SLEEP_TALK (1 << 4) +#define FORBIDDEN_INSTRUCT (1 << 5) static const u8 sForbiddenMoves[MOVES_COUNT] = { @@ -933,28 +932,29 @@ static const u8 sForbiddenMoves[MOVES_COUNT] = [MOVE_STRUGGLE] = 0xFF, // Neither Struggle [MOVE_AFTER_YOU] = FORBIDDEN_METRONOME, [MOVE_APPLE_ACID] = FORBIDDEN_METRONOME, - [MOVE_ASSIST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_ASSIST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [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_BEAK_BLAST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_BEAK_BLAST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [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_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, + [MOVE_BIDE] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_BLAST_BURN] = FORBIDDEN_INSTRUCT, [MOVE_BODY_PRESS] = FORBIDDEN_METRONOME, - [MOVE_BOUNCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK, + [MOVE_BOUNCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [MOVE_BOUNCY_BUBBLE] = FORBIDDEN_METRONOME, [MOVE_BRANCH_POKE] = FORBIDDEN_METRONOME, [MOVE_BREAKING_SWIPE] = FORBIDDEN_METRONOME, [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_CELEBRATE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_CHATTER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [MOVE_CIRCLE_THROW] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_CLANGOROUS_SOUL] = FORBIDDEN_METRONOME, - [MOVE_COPYCAT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_COPYCAT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [MOVE_COUNTER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_COVET] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_CRAFTY_SHIELD] = FORBIDDEN_METRONOME, @@ -962,84 +962,96 @@ 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_DIG] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_DIVE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [MOVE_DOUBLE_IRON_BASH] = FORBIDDEN_METRONOME, [MOVE_DRAGON_ASCENT] = FORBIDDEN_METRONOME, [MOVE_DRAGON_ENERGY] = FORBIDDEN_METRONOME, [MOVE_DRAGON_TAIL] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_DRUM_BEATING] = FORBIDDEN_METRONOME, - [MOVE_DYNAMAX_CANNON] = FORBIDDEN_METRONOME | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_DYNAMAX_CANNON] = FORBIDDEN_METRONOME | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [MOVE_ENDURE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, - [MOVE_ETERNABEAM] = FORBIDDEN_METRONOME, + [MOVE_ETERNABEAM] = FORBIDDEN_METRONOME | FORBIDDEN_INSTRUCT, [MOVE_FALSE_SURRENDER] = FORBIDDEN_METRONOME, [MOVE_FEINT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_FIERY_WRATH] = FORBIDDEN_METRONOME, [MOVE_FLEUR_CANNON] = FORBIDDEN_METRONOME, [MOVE_FLOATY_FALL] = FORBIDDEN_METRONOME, - [MOVE_FLY] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK, - [MOVE_FOCUS_PUNCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_FLY] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_FOCUS_PUNCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [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_INSTRUCT, [MOVE_FREEZING_GLARE] = FORBIDDEN_METRONOME, [MOVE_FREEZY_FROST] = FORBIDDEN_METRONOME, - [MOVE_GEOMANCY] = FORBIDDEN_SLEEP_TALK, + [MOVE_FRENZY_PLANT] = FORBIDDEN_INSTRUCT, + [MOVE_GEOMANCY] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_GIGA_IMPACT] = FORBIDDEN_INSTRUCT, [MOVE_GLACIAL_LANCE] = FORBIDDEN_METRONOME, [MOVE_GLITZY_GLOW] = FORBIDDEN_METRONOME, [MOVE_GRAV_APPLE] = FORBIDDEN_METRONOME, [MOVE_HELPING_HAND] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, - [MOVE_HOLD_HANDS] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_HOLD_HANDS] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_HYDRO_CANNON] = FORBIDDEN_INSTRUCT, + [MOVE_HYPER_BEAM] = FORBIDDEN_INSTRUCT, [MOVE_HYPERSPACE_FURY] = FORBIDDEN_METRONOME, [MOVE_HYPERSPACE_HOLE] = FORBIDDEN_METRONOME, - [MOVE_ICE_BURN] = FORBIDDEN_METRONOME | FORBIDDEN_SLEEP_TALK, - [MOVE_INSTRUCT] = FORBIDDEN_METRONOME, + [MOVE_ICE_BALL] = FORBIDDEN_INSTRUCT, + [MOVE_ICE_BURN] = FORBIDDEN_METRONOME | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_INSTRUCT] = FORBIDDEN_METRONOME | FORBIDDEN_INSTRUCT, [MOVE_JUNGLE_HEALING] = FORBIDDEN_METRONOME, - [MOVE_KINGS_SHIELD] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_KINGS_SHIELD] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_INSTRUCT, [MOVE_LIFE_DEW] = FORBIDDEN_METRONOME, [MOVE_LIGHT_OF_RUIN] = FORBIDDEN_METRONOME, [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_METRONOME] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, - [MOVE_MIMIC] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK, + [MOVE_ME_FIRST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_METEOR_ASSAULT] = FORBIDDEN_METRONOME | FORBIDDEN_INSTRUCT, + [MOVE_METEOR_BEAM] = FORBIDDEN_INSTRUCT, + [MOVE_METRONOME] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_MIMIC] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [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, + [MOVE_MIRROR_MOVE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [MOVE_MOONGEIST_BEAM] = FORBIDDEN_METRONOME, - [MOVE_NATURE_POWER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_NATURE_POWER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [MOVE_NATURES_MADNESS] = FORBIDDEN_METRONOME, - [MOVE_OBSTRUCT] = FORBIDDEN_METRONOME | FORBIDDEN_COPYCAT, + [MOVE_OBSTRUCT] = FORBIDDEN_METRONOME | FORBIDDEN_COPYCAT | FORBIDDEN_INSTRUCT, [MOVE_ORIGIN_PULSE] = FORBIDDEN_METRONOME, + [MOVE_OUTRAGE] = FORBIDDEN_INSTRUCT, [MOVE_OVERDRIVE] = FORBIDDEN_METRONOME, - [MOVE_PHANTOM_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK, + [MOVE_PETAL_DANCE] = FORBIDDEN_INSTRUCT, + [MOVE_PHANTOM_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [MOVE_PHOTON_GEYSER] = FORBIDDEN_METRONOME, [MOVE_PIKA_PAPOW] = FORBIDDEN_METRONOME, [MOVE_PLASMA_FISTS] = FORBIDDEN_METRONOME, [MOVE_PRECIPICE_BLADES] = FORBIDDEN_METRONOME, + [MOVE_PRISMATIC_LASER] = FORBIDDEN_INSTRUCT, [MOVE_PROTECT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_PYRO_BALL] = FORBIDDEN_METRONOME, [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_INSTRUCT, [MOVE_RELIC_SONG] = FORBIDDEN_METRONOME, [MOVE_ROAR] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_ROAR_OF_TIME] = FORBIDDEN_INSTRUCT, + [MOVE_ROCK_WRECKER] = FORBIDDEN_INSTRUCT, + [MOVE_ROLLOUT] = FORBIDDEN_INSTRUCT, [MOVE_SAPPY_SEED] = FORBIDDEN_METRONOME, [MOVE_SECRET_SWORD] = FORBIDDEN_METRONOME, - [MOVE_SHADOW_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK, - [MOVE_SHELL_TRAP] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_SHADOW_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_SHELL_TRAP] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [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_SLEEP_TALK] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_SKETCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_SKULL_BASH] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_SKY_ATTACK] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_SKY_DROP] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_SLEEP_TALK] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [MOVE_SNAP_TRAP] = FORBIDDEN_METRONOME, [MOVE_SNARL] = FORBIDDEN_METRONOME, - [MOVE_SNATCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_SNATCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_INSTRUCT, [MOVE_SNORE] = FORBIDDEN_METRONOME, - [MOVE_SOLAR_BEAM] = FORBIDDEN_SLEEP_TALK, - [MOVE_SOLAR_BLADE] = FORBIDDEN_SLEEP_TALK, + [MOVE_SOLAR_BEAM] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, + [MOVE_SOLAR_BLADE] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [MOVE_SPARKLY_SWIRL] = FORBIDDEN_METRONOME, [MOVE_SPECTRAL_THIEF] = FORBIDDEN_METRONOME, [MOVE_SPIKY_SHIELD] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, @@ -1056,11 +1068,12 @@ static const u8 sForbiddenMoves[MOVES_COUNT] = [MOVE_THIEF] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_THOUSAND_ARROWS] = FORBIDDEN_METRONOME, [MOVE_THOUSAND_WAVES] = FORBIDDEN_METRONOME, + [MOVE_THRASH] = FORBIDDEN_INSTRUCT, [MOVE_THUNDER_CAGE] = FORBIDDEN_METRONOME, [MOVE_THUNDEROUS_KICK] = FORBIDDEN_METRONOME, - [MOVE_TRANSFORM] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC, + [MOVE_TRANSFORM] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_INSTRUCT, [MOVE_TRICK] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, - [MOVE_UPROAR] = FORBIDDEN_SLEEP_TALK, + [MOVE_UPROAR] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT, [MOVE_V_CREATE] = FORBIDDEN_METRONOME, [MOVE_VEEVEE_VOLLEY] = FORBIDDEN_METRONOME, [MOVE_WHIRLWIND] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, @@ -1069,43 +1082,6 @@ static const u8 sForbiddenMoves[MOVES_COUNT] = [MOVE_ZIPPY_ZAP] = FORBIDDEN_METRONOME, }; -static const u16 sMoveEffectsForbiddenToInstruct[] = -{ - EFFECT_ASSIST, - //EFFECT_BEAK_BLAST, - EFFECT_BELCH, - EFFECT_BIDE, - //EFFECT_CELEBRATE, - //EFFECT_CHATTER, - EFFECT_COPYCAT, - //EFFECT_DYNAMAX_CANNON, - EFFECT_FOCUS_PUNCH, - EFFECT_GEOMANCY, - //EFFECT_HOLD_HANDS, - EFFECT_INSTRUCT, - EFFECT_ME_FIRST, - EFFECT_METRONOME, - EFFECT_MIMIC, - EFFECT_MIRROR_MOVE, - EFFECT_NATURE_POWER, - //EFFECT_OBSTRUCT, - EFFECT_RAMPAGE, - EFFECT_RECHARGE, - EFFECT_RECOIL_25, - EFFECT_ROLLOUT, - EFFECT_SEMI_INVULNERABLE, - //EFFECT_SHELL_TRAP, - EFFECT_SKETCH, - //EFFECT_SKY_DROP, - EFFECT_SKULL_BASH, - EFFECT_SLEEP_TALK, - EFFECT_SOLAR_BEAM, - EFFECT_TRANSFORM, - EFFECT_TWO_TURNS_ATTACK, - EFFECT_UPROAR, - FORBIDDEN_INSTRUCT_END -}; - static const u16 sNaturePowerMoves[BATTLE_TERRAIN_COUNT] = { #if B_NATURE_POWER_MOVES >= GEN_7 @@ -8494,13 +8470,8 @@ static void Cmd_various(void) } return; case VARIOUS_TRY_INSTRUCT: - for (i = 0; sMoveEffectsForbiddenToInstruct[i] != FORBIDDEN_INSTRUCT_END; i++) - { - if (sMoveEffectsForbiddenToInstruct[i] == gBattleMoves[gLastMoves[gBattlerTarget]].effect) - break; - } - if (gLastMoves[gBattlerTarget] == 0 || gLastMoves[gBattlerTarget] == 0xFFFF || sMoveEffectsForbiddenToInstruct[i] != FORBIDDEN_INSTRUCT_END - || gLastMoves[gBattlerTarget] == MOVE_STRUGGLE || gLastMoves[gBattlerTarget] == MOVE_KINGS_SHIELD) + if ((sForbiddenMoves[gLastMoves[gBattlerTarget]] & FORBIDDEN_INSTRUCT) + || gLastMoves[gBattlerTarget] == 0xFFFF) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); } From 34c6e6ca3175f4491671ded55d3aa144b1de43c9 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 30 Dec 2021 01:48:56 -0300 Subject: [PATCH 053/105] Update battle_ai_util.c --- src/battle_ai_util.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 63f5385fd2..fb53bb8013 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -157,7 +157,6 @@ static const s8 sAiAbilityRatings[ABILITIES_COUNT] = [ABILITY_POISON_HEAL] = 8, [ABILITY_POISON_POINT] = 4, [ABILITY_POISON_TOUCH] = 4, - //[ABILITY_PORTAL_POWER] = 8, [ABILITY_POWER_CONSTRUCT] = 10, [ABILITY_POWER_OF_ALCHEMY] = 0, [ABILITY_PRANKSTER] = 8, From d433d6755874a27285eaafd7f1f3fab3eb1f6adc Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sat, 1 Jan 2022 20:21:29 -0300 Subject: [PATCH 054/105] Extrapolated Assist forbidden flags to Gen 8 moves --- src/battle_script_commands.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index eee5ccf03f..c170f7be46 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -939,8 +939,8 @@ static const u8 sForbiddenMoves[MOVES_COUNT] = [MOVE_BADDY_BAD] = FORBIDDEN_METRONOME, [MOVE_BANEFUL_BUNKER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_BEAK_BLAST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, - [MOVE_BEHEMOTH_BASH] = FORBIDDEN_METRONOME | FORBIDDEN_COPYCAT, - [MOVE_BEHEMOTH_BLADE] = FORBIDDEN_METRONOME | FORBIDDEN_COPYCAT, + [MOVE_BEHEMOTH_BASH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_BEHEMOTH_BLADE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | 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, @@ -969,7 +969,7 @@ static const u8 sForbiddenMoves[MOVES_COUNT] = [MOVE_DRAGON_ENERGY] = FORBIDDEN_METRONOME, [MOVE_DRAGON_TAIL] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_DRUM_BEATING] = FORBIDDEN_METRONOME, - [MOVE_DYNAMAX_CANNON] = FORBIDDEN_METRONOME | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_DYNAMAX_CANNON] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, [MOVE_ENDURE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_ETERNABEAM] = FORBIDDEN_METRONOME, [MOVE_FALSE_SURRENDER] = FORBIDDEN_METRONOME, @@ -1008,7 +1008,7 @@ static const u8 sForbiddenMoves[MOVES_COUNT] = [MOVE_MOONGEIST_BEAM] = FORBIDDEN_METRONOME, [MOVE_NATURE_POWER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, [MOVE_NATURES_MADNESS] = FORBIDDEN_METRONOME, - [MOVE_OBSTRUCT] = FORBIDDEN_METRONOME | FORBIDDEN_COPYCAT, + [MOVE_OBSTRUCT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, [MOVE_ORIGIN_PULSE] = FORBIDDEN_METRONOME, [MOVE_OVERDRIVE] = FORBIDDEN_METRONOME, [MOVE_PHANTOM_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK, From 66faa6aa1575736cfd91b4a33a0f4d92322001c9 Mon Sep 17 00:00:00 2001 From: W1serV1ser <1prefertheaircauseimanairnomad@gmail.com> Date: Tue, 4 Jan 2022 12:33:31 -0800 Subject: [PATCH 055/105] Follow Me/Rage Powder effect on target goes away once affected by Sky Drop --- src/battle_script_commands.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d71c93bcaa..748d6d9822 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9060,6 +9060,11 @@ static void Cmd_various(void) gBattleMons[gBattlerTarget].status2 &= ~(STATUS2_BIDE); gDisableStructs[gBattlerTarget].rolloutTimer = 0; gDisableStructs[gBattlerTarget].furyCutterCounter = 0; + + // End any Follow Me/Rage Powder effects caused by the target + if (gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer != 0 && gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTarget == gBattlerTarget) + SideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer = 0; + break; case VARIOUS_CLEAR_SKY_DROP: // Check to see if the initial target of this Sky Drop fainted before the 2nd turn of Sky Drop. From 178c4c66bab600e9d5650c42cc7f01fecc51ca25 Mon Sep 17 00:00:00 2001 From: W1serV1ser <1prefertheaircauseimanairnomad@gmail.com> Date: Tue, 4 Jan 2022 12:38:50 -0800 Subject: [PATCH 056/105] Fixed gSideTimers typo --- 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 748d6d9822..5243c0029b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9063,7 +9063,7 @@ static void Cmd_various(void) // End any Follow Me/Rage Powder effects caused by the target if (gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer != 0 && gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTarget == gBattlerTarget) - SideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer = 0; + gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer = 0; break; case VARIOUS_CLEAR_SKY_DROP: From 9733f92c7f9a52761e716fc723bbf2d27ae59e85 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Wed, 5 Jan 2022 18:48:01 +0100 Subject: [PATCH 057/105] Yawn now uses B_SLEEP_TURNS, resolves #1873 --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index fd32cefaa2..36e8b0a126 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2892,7 +2892,7 @@ u8 DoBattlerEndTurnEffects(void) } else { - gBattleMons[gActiveBattler].status1 |= (Random() & 3) + 2; + gBattleMons[gEffectBattler].status1 |= (B_SLEEP_TURNS >= GEN_5) ? ((Random() % 3) + 2) : ((Random() % 4) + 3); BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); BattleScriptExecute(BattleScript_YawnMakesAsleep); From 328b5013946a76c06f8ae42323bf9d40ae04e9c4 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Wed, 5 Jan 2022 18:54:42 +0100 Subject: [PATCH 058/105] Update src/battle_util.c Co-authored-by: LOuroboros --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 36e8b0a126..e76a4fba55 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2892,7 +2892,7 @@ u8 DoBattlerEndTurnEffects(void) } else { - gBattleMons[gEffectBattler].status1 |= (B_SLEEP_TURNS >= GEN_5) ? ((Random() % 3) + 2) : ((Random() % 4) + 3); + gBattleMons[gActiveBattler].status1 |= (B_SLEEP_TURNS >= GEN_5) ? ((Random() % 3) + 2) : ((Random() % 4) + 3); BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); BattleScriptExecute(BattleScript_YawnMakesAsleep); From f6b32c8d176ddac0538a8f5ee78e9eb328bc10e1 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sat, 8 Jan 2022 20:19:53 -0300 Subject: [PATCH 059/105] Fixed Anchor Shot description. --- src/data/text/move_descriptions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index 037261e321..2678062e82 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -2479,7 +2479,7 @@ static const u8 sPOLLEN_PUFFDescription[] = _( static const u8 sANCHOR_SHOTDescription[] = _( "Strangles the foe with a\n" - "chain. The foe can't flinch."); + "chain. The foe can't escape."); static const u8 sPSYCHIC_TERRAINDescription[] = _( "The ground turns weird for\n" From 352523403a78a46d7caf5483384106a2d30911b4 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 9 Jan 2022 14:57:45 -0300 Subject: [PATCH 060/105] Fixed usage of B_MULTI_BATTLE_WHITEOUT --- src/battle_script_commands.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 35c7cfeb9e..c624130a6c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4147,7 +4147,7 @@ static void Cmd_getexp(void) } } -#ifdef B_MULTI_BATTLE_WHITEOUT >= GEN_4 +#if B_MULTI_BATTLE_WHITEOUT >= GEN_4 static bool32 NoAliveMonsForPlayerAndPartner(void) { u32 i; @@ -4230,7 +4230,7 @@ static void Cmd_checkteamslost(void) if (gBattleControllerExecFlags) return; -#ifdef B_MULTI_BATTLE_WHITEOUT >= GEN_4 +#if B_MULTI_BATTLE_WHITEOUT >= GEN_4 if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER)) { if (NoAliveMonsForPlayerAndPartner()) From 24b5a5709a999facdfd7e10cd97f737fd1a72905 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 10 Jan 2022 23:01:18 -0300 Subject: [PATCH 061/105] Allow Galarian Darmanitan's Zen Mode to work --- include/constants/battle_config.h | 96 ++++++++++++++++--------------- src/battle_util.c | 36 ++++++------ 2 files changed, 68 insertions(+), 64 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 6662f261f4..8f56ac8719 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -5,53 +5,55 @@ // Species with peculiar battle effects. #ifndef POKEMON_EXPANSION - #define SPECIES_DIALGA 0 - #define SPECIES_PALKIA 0 - #define SPECIES_GIRATINA 0 - #define SPECIES_CHERRIM 0 - #define SPECIES_ARCEUS 0 - #define SPECIES_SILVALLY 0 - #define SPECIES_GENESECT 0 - #define SPECIES_AEGISLASH 0 - #define SPECIES_AEGISLASH_BLADE 10000 - #define SPECIES_MIMIKYU 0 - #define SPECIES_MIMIKYU_BUSTED 10001 - #define SPECIES_DARMANITAN 0 - #define SPECIES_DARMANITAN_ZEN_MODE 10002 - #define SPECIES_MINIOR_CORE_RED 0 - #define SPECIES_MINIOR 10003 - #define SPECIES_MINIOR_CORE_BLUE 0 - #define SPECIES_MINIOR_METEOR_BLUE 10004 - #define SPECIES_MINIOR_CORE_GREEN 0 - #define SPECIES_MINIOR_METEOR_GREEN 10005 - #define SPECIES_MINIOR_CORE_INDIGO 0 - #define SPECIES_MINIOR_METEOR_INDIGO 10006 - #define SPECIES_MINIOR_CORE_ORANGE 0 - #define SPECIES_MINIOR_METEOR_ORANGE 10007 - #define SPECIES_MINIOR_CORE_VIOLET 0 - #define SPECIES_MINIOR_METEOR_VIOLET 10008 - #define SPECIES_MINIOR_CORE_YELLOW 0 - #define SPECIES_MINIOR_METEOR_YELLOW 10009 - #define SPECIES_WISHIWASHI 0 - #define SPECIES_WISHIWASHI_SCHOOL 10010 - #define SPECIES_ZYGARDE 0 // 50% - #define SPECIES_ZYGARDE_10 10011 // 10 % - #define SPECIES_ZYGARDE_COMPLETE 10012 // 100 % - #define SPECIES_BURMY 0 - #define SPECIES_BURMY_SANDY_CLOAK 10013 - #define SPECIES_BURMY_TRASH_CLOAK 10014 - #define SPECIES_CRAMORANT 0 - #define SPECIES_CRAMORANT_GORGING 10015 - #define SPECIES_CRAMORANT_GULPING 10016 - #define SPECIES_GRENINJA_BATTLE_BOND 0 - #define SPECIES_GRENINJA_ASH 10017 - #define SPECIES_HOOPA 0 - #define SPECIES_HOOPA_UNBOUND 10018 - #define SPECIES_MELOETTA 0 - #define SPECIES_MELOETTA_PIROUETTE 10019 - #define SPECIES_MORPEKO 0 - #define SPECIES_MORPEKO_HANGRY 10020 - #define SPECIES_SIRFETCHD 10021 + #define SPECIES_DIALGA 0 + #define SPECIES_PALKIA 0 + #define SPECIES_GIRATINA 0 + #define SPECIES_CHERRIM 0 + #define SPECIES_ARCEUS 0 + #define SPECIES_SILVALLY 0 + #define SPECIES_GENESECT 0 + #define SPECIES_AEGISLASH 0 + #define SPECIES_AEGISLASH_BLADE 10000 + #define SPECIES_MIMIKYU 0 + #define SPECIES_MIMIKYU_BUSTED 10001 + #define SPECIES_DARMANITAN 0 + #define SPECIES_DARMANITAN_ZEN_MODE 10002 + #define SPECIES_MINIOR_CORE_RED 0 + #define SPECIES_MINIOR 10003 + #define SPECIES_MINIOR_CORE_BLUE 0 + #define SPECIES_MINIOR_METEOR_BLUE 10004 + #define SPECIES_MINIOR_CORE_GREEN 0 + #define SPECIES_MINIOR_METEOR_GREEN 10005 + #define SPECIES_MINIOR_CORE_INDIGO 0 + #define SPECIES_MINIOR_METEOR_INDIGO 10006 + #define SPECIES_MINIOR_CORE_ORANGE 0 + #define SPECIES_MINIOR_METEOR_ORANGE 10007 + #define SPECIES_MINIOR_CORE_VIOLET 0 + #define SPECIES_MINIOR_METEOR_VIOLET 10008 + #define SPECIES_MINIOR_CORE_YELLOW 0 + #define SPECIES_MINIOR_METEOR_YELLOW 10009 + #define SPECIES_WISHIWASHI 0 + #define SPECIES_WISHIWASHI_SCHOOL 10010 + #define SPECIES_ZYGARDE 0 // 50% + #define SPECIES_ZYGARDE_10 10011 // 10 % + #define SPECIES_ZYGARDE_COMPLETE 10012 // 100 % + #define SPECIES_BURMY 0 + #define SPECIES_BURMY_SANDY_CLOAK 10013 + #define SPECIES_BURMY_TRASH_CLOAK 10014 + #define SPECIES_CRAMORANT 0 + #define SPECIES_CRAMORANT_GORGING 10015 + #define SPECIES_CRAMORANT_GULPING 10016 + #define SPECIES_GRENINJA_BATTLE_BOND 0 + #define SPECIES_GRENINJA_ASH 10017 + #define SPECIES_HOOPA 0 + #define SPECIES_HOOPA_UNBOUND 10018 + #define SPECIES_MELOETTA 0 + #define SPECIES_MELOETTA_PIROUETTE 10019 + #define SPECIES_MORPEKO 0 + #define SPECIES_MORPEKO_HANGRY 10020 + #define SPECIES_SIRFETCHD 10021 + #define SPECIES_DARMANITAN_GALARIAN 0 + #define SPECIES_DARMANITAN_ZEN_MODE_GALARIAN 10022 #endif // Items with peculiar battle effects. diff --git a/src/battle_util.c b/src/battle_util.c index b293b9a5e6..491c117aba 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3969,6 +3969,7 @@ static bool32 ShouldChangeFormHpBased(u32 battler) {ABILITY_SCHOOLING, SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI, 4}, {ABILITY_GULP_MISSILE, SPECIES_CRAMORANT, SPECIES_CRAMORANT_GORGING, 2}, {ABILITY_GULP_MISSILE, SPECIES_CRAMORANT, SPECIES_CRAMORANT_GULPING, 1}, + {ABILITY_ZEN_MODE, SPECIES_DARMANITAN_GALARIAN, SPECIES_DARMANITAN_ZEN_MODE_GALARIAN, 2}, }; u32 i; @@ -9350,23 +9351,24 @@ void UndoFormChange(u32 monId, u32 side, bool32 isSwitchingOut) struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; static const u16 species[][3] = { - // Changed Form ID Default Form ID Should change on switch - {SPECIES_MIMIKYU_BUSTED, SPECIES_MIMIKYU, FALSE}, - {SPECIES_GRENINJA_ASH, SPECIES_GRENINJA_BATTLE_BOND, FALSE}, - {SPECIES_MELOETTA_PIROUETTE, SPECIES_MELOETTA, FALSE}, - {SPECIES_AEGISLASH_BLADE, SPECIES_AEGISLASH, TRUE}, - {SPECIES_DARMANITAN_ZEN_MODE, SPECIES_DARMANITAN, TRUE}, - {SPECIES_MINIOR, SPECIES_MINIOR_CORE_RED, TRUE}, - {SPECIES_MINIOR_METEOR_BLUE, SPECIES_MINIOR_CORE_BLUE, TRUE}, - {SPECIES_MINIOR_METEOR_GREEN, SPECIES_MINIOR_CORE_GREEN, TRUE}, - {SPECIES_MINIOR_METEOR_INDIGO, SPECIES_MINIOR_CORE_INDIGO, TRUE}, - {SPECIES_MINIOR_METEOR_ORANGE, SPECIES_MINIOR_CORE_ORANGE, TRUE}, - {SPECIES_MINIOR_METEOR_VIOLET, SPECIES_MINIOR_CORE_VIOLET, TRUE}, - {SPECIES_MINIOR_METEOR_YELLOW, SPECIES_MINIOR_CORE_YELLOW, TRUE}, - {SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI, TRUE}, - {SPECIES_CRAMORANT_GORGING, SPECIES_CRAMORANT, TRUE}, - {SPECIES_CRAMORANT_GULPING, SPECIES_CRAMORANT, TRUE}, - {SPECIES_MORPEKO_HANGRY, SPECIES_MORPEKO, TRUE}, + // Changed Form ID Default Form ID Should change on switch + {SPECIES_MIMIKYU_BUSTED, SPECIES_MIMIKYU, FALSE}, + {SPECIES_GRENINJA_ASH, SPECIES_GRENINJA_BATTLE_BOND, FALSE}, + {SPECIES_MELOETTA_PIROUETTE, SPECIES_MELOETTA, FALSE}, + {SPECIES_AEGISLASH_BLADE, SPECIES_AEGISLASH, TRUE}, + {SPECIES_DARMANITAN_ZEN_MODE, SPECIES_DARMANITAN, TRUE}, + {SPECIES_MINIOR, SPECIES_MINIOR_CORE_RED, TRUE}, + {SPECIES_MINIOR_METEOR_BLUE, SPECIES_MINIOR_CORE_BLUE, TRUE}, + {SPECIES_MINIOR_METEOR_GREEN, SPECIES_MINIOR_CORE_GREEN, TRUE}, + {SPECIES_MINIOR_METEOR_INDIGO, SPECIES_MINIOR_CORE_INDIGO, TRUE}, + {SPECIES_MINIOR_METEOR_ORANGE, SPECIES_MINIOR_CORE_ORANGE, TRUE}, + {SPECIES_MINIOR_METEOR_VIOLET, SPECIES_MINIOR_CORE_VIOLET, TRUE}, + {SPECIES_MINIOR_METEOR_YELLOW, SPECIES_MINIOR_CORE_YELLOW, TRUE}, + {SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI, TRUE}, + {SPECIES_CRAMORANT_GORGING, SPECIES_CRAMORANT, TRUE}, + {SPECIES_CRAMORANT_GULPING, SPECIES_CRAMORANT, TRUE}, + {SPECIES_MORPEKO_HANGRY, SPECIES_MORPEKO, TRUE}, + {SPECIES_DARMANITAN_ZEN_MODE_GALARIAN, SPECIES_DARMANITAN_GALARIAN, TRUE}, }; currSpecies = GetMonData(&party[monId], MON_DATA_SPECIES, NULL); From bee4019d224f2139538b0787375bfc339cc5b809 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 11 Jan 2022 19:52:51 -0300 Subject: [PATCH 062/105] Tweaked Protean's effect's InGame appearance --- src/battle_script_commands.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c624130a6c..3230e2ec5d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1428,6 +1428,8 @@ static void Cmd_attackcanceler(void) SET_BATTLER_TYPE(gBattlerAttacker, moveType); gBattlerAbility = gBattlerAttacker; BattleScriptPushCursor(); + PrepareStringBattle(STRINGID_EMPTYSTRING3, gBattlerAttacker); + gBattleCommunication[MSG_DISPLAY] = 1; gBattlescriptCurrInstr = BattleScript_ProteanActivates; return; } From b2965e5522d14f2aa17f265d1447f76c16af4141 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 11 Jan 2022 20:15:47 -0300 Subject: [PATCH 063/105] Added a pause to BattleScript_ProteanActivates --- data/battle_scripts_1.s | 1 + include/constants/battle.h | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index ba775a1a06..eb8d53a157 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8299,6 +8299,7 @@ BattleScript_MimicryActivatesEnd3:: end3 BattleScript_ProteanActivates:: + pause B_WAIT_TIME_SHORTEST call BattleScript_AbilityPopUp printstring STRINGID_PKMNCHANGEDTYPE waitmessage B_WAIT_TIME_LONG diff --git a/include/constants/battle.h b/include/constants/battle.h index bdb570b7ca..3eaa79a402 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -396,9 +396,10 @@ #define BATTLE_TERRAIN_COUNT 22 -#define B_WAIT_TIME_LONG 64 -#define B_WAIT_TIME_MED 48 -#define B_WAIT_TIME_SHORT 32 +#define B_WAIT_TIME_LONG 64 +#define B_WAIT_TIME_MED 48 +#define B_WAIT_TIME_SHORT 32 +#define B_WAIT_TIME_SHORTEST 16 #define CHERRIM_OVERCAST 0 #define CHERRIM_SUNSHINE 1 From 69f678b3fca25ac1ff87c3bcf133d1b144680226 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 11 Jan 2022 20:21:12 -0300 Subject: [PATCH 064/105] Put the new B_WAIT_TIME_SHORTEST to use --- data/battle_scripts_1.s | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index eb8d53a157..f4735f7792 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1251,7 +1251,7 @@ BattleScript_EffectAromaticMistWorks: setstatchanger STAT_SPDEF, 1, FALSE statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_EffectAromaticMistEnd jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AromaticMistAnim - pause 16 + pause B_WAIT_TIME_SHORTEST printstring STRINGID_TARGETSTATWONTGOHIGHER waitmessage B_WAIT_TIME_LONG goto BattleScript_EffectAromaticMistEnd @@ -7147,7 +7147,7 @@ BattleScript_EnduredMsg:: BattleScript_SturdiedMsg:: copybyte gBattlerAbility, gBattlerTarget - pause 16 + pause B_WAIT_TIME_SHORTEST call BattleScript_AbilityPopUp printstring STRINGID_ENDUREDSTURDY waitmessage B_WAIT_TIME_LONG @@ -8395,7 +8395,7 @@ BattleScript_WeakArmorActivates:: statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_WeakArmorActivatesSpeed jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_WeakArmorDefAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_WeakArmorActivatesSpeed - pause 16 + pause B_WAIT_TIME_SHORTEST printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_WeakArmorActivatesSpeed @@ -8409,7 +8409,7 @@ BattleScript_WeakArmorActivatesSpeed: statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_WeakArmorActivatesEnd jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeakArmorSpeedAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_EMPTY, BattleScript_WeakArmorActivatesEnd - pause 16 + pause B_WAIT_TIME_SHORTEST printstring STRINGID_TARGETSTATWONTGOHIGHER waitmessage B_WAIT_TIME_LONG goto BattleScript_WeakArmorActivatesEnd From a4f0de5106d24e4bf945a722efdc448acc7bae26 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 12 Jan 2022 01:54:29 -0300 Subject: [PATCH 065/105] Removed the last bits of HOLD_EFFECT_GRACIDEA --- include/constants/hold_effects.h | 2 +- src/battle_debug.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index d15e50d5ff..e0361795d7 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -100,7 +100,7 @@ #define HOLD_EFFECT_ADAMANT_ORB 94 #define HOLD_EFFECT_LUSTROUS_ORB 95 #define HOLD_EFFECT_GRISEOUS_ORB 96 -#define HOLD_EFFECT_GRACIDEA 97 +#define HOLD_EFFECT_ENIGMA_BERRY 97 #define HOLD_EFFECT_RESIST_BERRY 98 #define HOLD_EFFECT_POWER_ITEM 99 #define HOLD_EFFECT_RESTORE_PCT_HP 100 diff --git a/src/battle_debug.c b/src/battle_debug.c index e672145c51..2ea46321df 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1996,7 +1996,7 @@ static const u8 sText_HoldEffectQuickPowder[] = _("Quick Powder"); static const u8 sText_HoldEffectAdamantOrb[] = _("Adamant Orb"); static const u8 sText_HoldEffectLustrousOrb[] = _("Lustrous Orb"); static const u8 sText_HoldEffectGriseousOrb[] = _("Griseous Orb"); -static const u8 sText_HoldEffectGracidea[] = _("Gracidea"); +static const u8 sText_HoldEffectEnigmaBerry[] = _("Enigma Berry"); static const u8 sText_HoldEffectResistBerry[] = _("Resist Berry"); static const u8 sText_HoldEffectPowerItem[] = _("Power Item"); static const u8 sText_HoldEffectRestorePctHp[] = _("Restore Pct Hp"); @@ -2138,7 +2138,7 @@ static const u8 *const sHoldEffectNames[] = [HOLD_EFFECT_ADAMANT_ORB] = sText_HoldEffectAdamantOrb, [HOLD_EFFECT_LUSTROUS_ORB] = sText_HoldEffectLustrousOrb, [HOLD_EFFECT_GRISEOUS_ORB] = sText_HoldEffectGriseousOrb, - [HOLD_EFFECT_GRACIDEA] = sText_HoldEffectGracidea, + [HOLD_EFFECT_ENIGMA_BERRY] = sText_HoldEffectEnigmaBerry, [HOLD_EFFECT_RESIST_BERRY] = sText_HoldEffectResistBerry, [HOLD_EFFECT_POWER_ITEM] = sText_HoldEffectPowerItem, [HOLD_EFFECT_RESTORE_PCT_HP] = sText_HoldEffectRestorePctHp, From 7182f290c1683ec71ff96e34cbfa30004d429245 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sun, 16 Jan 2022 12:39:08 -0500 Subject: [PATCH 066/105] fix harvest activation msg --- src/battle_util.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_util.c b/src/battle_util.c index 8bfbe79e02..d65dbcfb27 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4577,6 +4577,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move && gBattleStruct->changedItems[battler] == ITEM_NONE // Will not inherit an item && ItemId_GetPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES) { + gLastUsedItem = GetUsedHeldItem(battler); BattleScriptPushCursorAndCallback(BattleScript_HarvestActivates); effect++; } From ddfc3502f7206ad5673b826eef1a581f57d0f6c0 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sun, 16 Jan 2022 17:21:05 -0300 Subject: [PATCH 067/105] =?UTF-8?q?Fixed=20Pok=C3=A9mon=20Expansion=20flag?= =?UTF-8?q?=20name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 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 aa6c36dc79..3cf660a814 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -13375,7 +13375,7 @@ static void Cmd_handleballthrow(void) catchRate = gBaseStats[gBattleMons[gBattlerTarget].species].catchRate; #ifdef POKEMON_EXPANSION - if (gBaseStats[gBattleMons[gBattlerTarget].species].flags & F_ULTRA_BEAST) + if (gBaseStats[gBattleMons[gBattlerTarget].species].flags & FLAG_ULTRA_BEAST) { if (gLastUsedItem == ITEM_BEAST_BALL) ballMultiplier = 50; From 925f65c450cc56be251e0d5c51dae67f04505b31 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sun, 16 Jan 2022 21:10:09 -0300 Subject: [PATCH 068/105] Realigned config to previous state --- include/constants/battle_config.h | 106 +++++++++++++++--------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index d2c25dd2cd..5f37c39416 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -5,59 +5,59 @@ // Species with peculiar battle effects. #ifndef POKEMON_EXPANSION - #define SPECIES_DIALGA 0 - #define SPECIES_PALKIA 0 - #define SPECIES_GIRATINA 0 - #define SPECIES_CHERRIM 0 - #define SPECIES_ARCEUS 0 - #define SPECIES_SILVALLY 0 - #define SPECIES_GENESECT 0 - #define SPECIES_AEGISLASH 0 - #define SPECIES_AEGISLASH_BLADE 10000 - #define SPECIES_MIMIKYU 0 - #define SPECIES_MIMIKYU_BUSTED 10001 - #define SPECIES_DARMANITAN 0 - #define SPECIES_DARMANITAN_ZEN_MODE 10002 - #define SPECIES_MINIOR_CORE_RED 0 - #define SPECIES_MINIOR 10003 - #define SPECIES_MINIOR_CORE_BLUE 0 - #define SPECIES_MINIOR_METEOR_BLUE 10004 - #define SPECIES_MINIOR_CORE_GREEN 0 - #define SPECIES_MINIOR_METEOR_GREEN 10005 - #define SPECIES_MINIOR_CORE_INDIGO 0 - #define SPECIES_MINIOR_METEOR_INDIGO 10006 - #define SPECIES_MINIOR_CORE_ORANGE 0 - #define SPECIES_MINIOR_METEOR_ORANGE 10007 - #define SPECIES_MINIOR_CORE_VIOLET 0 - #define SPECIES_MINIOR_METEOR_VIOLET 10008 - #define SPECIES_MINIOR_CORE_YELLOW 0 - #define SPECIES_MINIOR_METEOR_YELLOW 10009 - #define SPECIES_WISHIWASHI 0 - #define SPECIES_WISHIWASHI_SCHOOL 10010 - #define SPECIES_ZYGARDE 0 // 50% - #define SPECIES_ZYGARDE_10 10011 // 10 % - #define SPECIES_ZYGARDE_COMPLETE 10012 // 100 % - #define SPECIES_BURMY 0 - #define SPECIES_BURMY_SANDY_CLOAK 10013 - #define SPECIES_BURMY_TRASH_CLOAK 10014 - #define SPECIES_CRAMORANT 0 - #define SPECIES_CRAMORANT_GORGING 10015 - #define SPECIES_CRAMORANT_GULPING 10016 - #define SPECIES_GRENINJA_BATTLE_BOND 0 - #define SPECIES_GRENINJA_ASH 10017 - #define SPECIES_HOOPA 0 - #define SPECIES_HOOPA_UNBOUND 10018 - #define SPECIES_MELOETTA 0 - #define SPECIES_MELOETTA_PIROUETTE 10019 - #define SPECIES_MORPEKO 0 - #define SPECIES_MORPEKO_HANGRY 10020 - #define SPECIES_SIRFETCHD 10021 - #define SPECIES_DARMANITAN_GALARIAN 0 - #define SPECIES_DARMANITAN_ZEN_MODE_GALARIAN 10022 - #define SPECIES_HEATMOR 0 - #define SPECIES_DURANT 0 - #define SPECIES_CARBINK 0 - #define SPECIES_MAREANIE 0 + #define SPECIES_DIALGA 0 + #define SPECIES_PALKIA 0 + #define SPECIES_GIRATINA 0 + #define SPECIES_CHERRIM 0 + #define SPECIES_ARCEUS 0 + #define SPECIES_SILVALLY 0 + #define SPECIES_GENESECT 0 + #define SPECIES_AEGISLASH 0 + #define SPECIES_AEGISLASH_BLADE 10000 + #define SPECIES_MIMIKYU 0 + #define SPECIES_MIMIKYU_BUSTED 10001 + #define SPECIES_DARMANITAN 0 + #define SPECIES_DARMANITAN_ZEN_MODE 10002 + #define SPECIES_MINIOR_CORE_RED 0 + #define SPECIES_MINIOR 10003 + #define SPECIES_MINIOR_CORE_BLUE 0 + #define SPECIES_MINIOR_METEOR_BLUE 10004 + #define SPECIES_MINIOR_CORE_GREEN 0 + #define SPECIES_MINIOR_METEOR_GREEN 10005 + #define SPECIES_MINIOR_CORE_INDIGO 0 + #define SPECIES_MINIOR_METEOR_INDIGO 10006 + #define SPECIES_MINIOR_CORE_ORANGE 0 + #define SPECIES_MINIOR_METEOR_ORANGE 10007 + #define SPECIES_MINIOR_CORE_VIOLET 0 + #define SPECIES_MINIOR_METEOR_VIOLET 10008 + #define SPECIES_MINIOR_CORE_YELLOW 0 + #define SPECIES_MINIOR_METEOR_YELLOW 10009 + #define SPECIES_WISHIWASHI 0 + #define SPECIES_WISHIWASHI_SCHOOL 10010 + #define SPECIES_ZYGARDE 0 // 50% + #define SPECIES_ZYGARDE_10 10011 // 10 % + #define SPECIES_ZYGARDE_COMPLETE 10012 // 100 % + #define SPECIES_BURMY 0 + #define SPECIES_BURMY_SANDY_CLOAK 10013 + #define SPECIES_BURMY_TRASH_CLOAK 10014 + #define SPECIES_CRAMORANT 0 + #define SPECIES_CRAMORANT_GORGING 10015 + #define SPECIES_CRAMORANT_GULPING 10016 + #define SPECIES_GRENINJA_BATTLE_BOND 0 + #define SPECIES_GRENINJA_ASH 10017 + #define SPECIES_HOOPA 0 + #define SPECIES_HOOPA_UNBOUND 10018 + #define SPECIES_MELOETTA 0 + #define SPECIES_MELOETTA_PIROUETTE 10019 + #define SPECIES_MORPEKO 0 + #define SPECIES_MORPEKO_HANGRY 10020 + #define SPECIES_SIRFETCHD 10021 + #define SPECIES_DARMANITAN_GALARIAN 0 + #define SPECIES_DARMANITAN_ZEN_MODE_GALARIAN 10022 + #define SPECIES_HEATMOR 0 + #define SPECIES_DURANT 0 + #define SPECIES_CARBINK 0 + #define SPECIES_MAREANIE 0 #endif // Items with peculiar battle effects. From b7df21b263bd2ea2ba673578e10057aa25f4727e Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sat, 22 Jan 2022 20:25:51 -0300 Subject: [PATCH 069/105] Optimized use of GetBattlerAbility --- src/battle_main.c | 16 +++--- src/battle_script_commands.c | 97 +++++++++++++++++++++--------------- src/battle_util.c | 75 +++++++++++++++++----------- 3 files changed, 114 insertions(+), 74 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index 37845472ac..21ad731cef 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4468,15 +4468,16 @@ s8 GetChosenMovePriority(u32 battlerId) s8 GetMovePriority(u32 battlerId, u16 move) { s8 priority; + u16 ability = GetBattlerAbility(battlerId); priority = gBattleMoves[move].priority; - if (GetBattlerAbility(battlerId) == ABILITY_GALE_WINGS + if (ability == ABILITY_GALE_WINGS && gBattleMoves[move].type == TYPE_FLYING && (B_GALE_WINGS <= GEN_6 || BATTLER_MAX_HP(battlerId))) { priority++; } - else if (GetBattlerAbility(battlerId) == ABILITY_PRANKSTER && IS_MOVE_STATUS(move)) + else if (ability == ABILITY_PRANKSTER && IS_MOVE_STATUS(move)) { gProtectStructs[battlerId].pranksterElevated = 1; priority++; @@ -4485,7 +4486,7 @@ s8 GetMovePriority(u32 battlerId, u16 move) { priority++; } - else if (GetBattlerAbility(battlerId) == ABILITY_TRIAGE) + else if (ability == ABILITY_TRIAGE) { switch (gBattleMoves[move].effect) { @@ -4515,12 +4516,13 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) u32 speedBattler1 = 0, speedBattler2 = 0; u32 holdEffectBattler1 = 0, holdEffectBattler2 = 0; s8 priority1 = 0, priority2 = 0; + u16 ability1 = GetBattlerAbility(battler1), ability2 = GetBattlerAbility(battler2); // Battler 1 speedBattler1 = GetBattlerTotalSpeedStat(battler1); holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); // Quick Draw - if (!ignoreChosenMoves && GetBattlerAbility(battler1) == ABILITY_QUICK_DRAW && !IS_MOVE_STATUS(gChosenMoveByBattler[battler1]) && Random() % 100 < 30) + if (!ignoreChosenMoves && ability1 == ABILITY_QUICK_DRAW && !IS_MOVE_STATUS(gChosenMoveByBattler[battler1]) && Random() % 100 < 30) gProtectStructs[battler1].quickDraw = TRUE; // Quick Claw and Custap Berry if (!gProtectStructs[battler1].quickDraw @@ -4534,7 +4536,7 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) speedBattler2 = GetBattlerTotalSpeedStat(battler2); holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); // Quick Draw - if (!ignoreChosenMoves && GetBattlerAbility(battler2) == ABILITY_QUICK_DRAW && !IS_MOVE_STATUS(gChosenMoveByBattler[battler2]) && Random() % 100 < 30) + if (!ignoreChosenMoves && ability2 == ABILITY_QUICK_DRAW && !IS_MOVE_STATUS(gChosenMoveByBattler[battler2]) && Random() % 100 < 30) gProtectStructs[battler2].quickDraw = TRUE; // Quick Claw and Custap Berry if (!gProtectStructs[battler2].quickDraw @@ -4570,9 +4572,9 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) strikesFirst = 1; else if (holdEffectBattler2 == HOLD_EFFECT_LAGGING_TAIL && holdEffectBattler1 != HOLD_EFFECT_LAGGING_TAIL) strikesFirst = 0; - else if (GetBattlerAbility(battler1) == ABILITY_STALL && GetBattlerAbility(battler2) != ABILITY_STALL) + else if (ability1 == ABILITY_STALL && ability2 != ABILITY_STALL) strikesFirst = 1; - else if (GetBattlerAbility(battler2) == ABILITY_STALL && GetBattlerAbility(battler1) != ABILITY_STALL) + else if (ability2 == ABILITY_STALL && ability1 != ABILITY_STALL) strikesFirst = 0; else { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b088d16a72..478dba5d22 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1353,6 +1353,7 @@ static bool32 TryAegiFormChange(void) static void Cmd_attackcanceler(void) { s32 i, moveType; + u16 attackerAbility = GetBattlerAbility(gBattlerAttacker); GET_MOVE_TYPE(gCurrentMove, moveType); @@ -1395,7 +1396,7 @@ static void Cmd_attackcanceler(void) return; // Check Protean activation. - if ((GetBattlerAbility(gBattlerAttacker) == ABILITY_PROTEAN || GetBattlerAbility(gBattlerAttacker) == ABILITY_LIBERO) + if ((attackerAbility == ABILITY_PROTEAN || attackerAbility == ABILITY_LIBERO) && (gBattleMons[gBattlerAttacker].type1 != moveType || gBattleMons[gBattlerAttacker].type2 != moveType || (gBattleMons[gBattlerAttacker].type3 != moveType && gBattleMons[gBattlerAttacker].type3 != TYPE_MYSTERY)) && gCurrentMove != MOVE_STRUGGLE) @@ -2616,6 +2617,7 @@ void SetMoveEffect(bool32 primary, u32 certain) bool32 statusChanged = FALSE; bool32 mirrorArmorReflected = (GetBattlerAbility(gBattlerTarget) == ABILITY_MIRROR_ARMOR); u32 flags = 0; + u16 battlerAbility; switch (gBattleScripting.moveEffect) // Set move effects which happen later on { @@ -2638,10 +2640,12 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattleScripting.battler = gBattlerAttacker; } + battlerAbility = GetBattlerAbility(gEffectBattler); + // Just in case this flag is still set gBattleScripting.moveEffect &= ~MOVE_EFFECT_CERTAIN; - if (GetBattlerAbility(gEffectBattler) == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + if (battlerAbility == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && !primary && gBattleScripting.moveEffect <= 9) INCREMENT_RESET_RETURN @@ -2666,7 +2670,7 @@ void SetMoveEffect(bool32 primary, u32 certain) { case STATUS1_SLEEP: // check active uproar - if (GetBattlerAbility(gEffectBattler) != ABILITY_SOUNDPROOF) + if (battlerAbility != ABILITY_SOUNDPROOF) { for (gActiveBattler = 0; gActiveBattler < gBattlersCount && !(gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR); @@ -2685,7 +2689,7 @@ void SetMoveEffect(bool32 primary, u32 certain) statusChanged = TRUE; break; case STATUS1_POISON: - if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY + if (battlerAbility == ABILITY_IMMUNITY && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { gLastUsedAbility = ABILITY_IMMUNITY; @@ -2724,11 +2728,11 @@ void SetMoveEffect(bool32 primary, u32 certain) if (gCurrentMove == MOVE_BURNING_JEALOUSY && !gProtectStructs[gEffectBattler].statRaised) break; - if ((GetBattlerAbility(gEffectBattler) == ABILITY_WATER_VEIL || GetBattlerAbility(gEffectBattler) == ABILITY_WATER_BUBBLE) + if ((battlerAbility == ABILITY_WATER_VEIL || battlerAbility == ABILITY_WATER_BUBBLE) && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { - gLastUsedAbility = GetBattlerAbility(gEffectBattler); - RecordAbilityBattle(gEffectBattler, GetBattlerAbility(gEffectBattler)); + gLastUsedAbility = battlerAbility; + RecordAbilityBattle(gEffectBattler, battlerAbility); BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_BRNPrevention; @@ -2767,7 +2771,7 @@ void SetMoveEffect(bool32 primary, u32 certain) statusChanged = TRUE; break; case STATUS1_PARALYSIS: - if (GetBattlerAbility(gEffectBattler) == ABILITY_LIMBER) + if (battlerAbility == ABILITY_LIMBER) { if (primary == TRUE || certain == MOVE_EFFECT_CERTAIN) { @@ -2809,7 +2813,7 @@ void SetMoveEffect(bool32 primary, u32 certain) statusChanged = TRUE; break; case STATUS1_TOXIC_POISON: - if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + if (battlerAbility == ABILITY_IMMUNITY && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { gLastUsedAbility = ABILITY_IMMUNITY; RecordAbilityBattle(gEffectBattler, ABILITY_IMMUNITY); @@ -2935,7 +2939,7 @@ void SetMoveEffect(bool32 primary, u32 certain) } break; case MOVE_EFFECT_FLINCH: - if (GetBattlerAbility(gEffectBattler) == ABILITY_INNER_FOCUS) + if (battlerAbility == ABILITY_INNER_FOCUS) { gBattlescriptCurrInstr++; } @@ -3442,7 +3446,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) + && battlerAbility != ABILITY_STICKY_HOLD) { // target loses their berry gLastUsedItem = gBattleMons[gEffectBattler].item; @@ -8059,9 +8063,12 @@ static void Cmd_various(void) MarkBattlerForControllerExec(gActiveBattler); break; case VARIOUS_TRY_ACTIVATE_MOXIE: // and chilling neigh + as one ice rider - if ((GetBattlerAbility(gActiveBattler) == ABILITY_MOXIE - || GetBattlerAbility(gActiveBattler) == ABILITY_CHILLING_NEIGH - || GetBattlerAbility(gActiveBattler) == ABILITY_AS_ONE_ICE_RIDER) + { + u16 battlerAbility = GetBattlerAbility(gActiveBattler); + + if ((battlerAbility == ABILITY_MOXIE + || battlerAbility == ABILITY_CHILLING_NEIGH + || battlerAbility == ABILITY_AS_ONE_ICE_RIDER) && HasAttackerFaintedTarget() && !NoAliveMonsForEitherParty() && CompareStat(gBattlerAttacker, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) @@ -8070,16 +8077,20 @@ static void Cmd_various(void) SET_STATCHANGER(STAT_ATK, 1, FALSE); PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); BattleScriptPush(gBattlescriptCurrInstr + 3); - gLastUsedAbility = GetBattlerAbility(gActiveBattler); - if (GetBattlerAbility(gActiveBattler) == ABILITY_AS_ONE_ICE_RIDER) + gLastUsedAbility = battlerAbility; + if (battlerAbility == ABILITY_AS_ONE_ICE_RIDER) gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_CHILLING_NEIGH; gBattlescriptCurrInstr = BattleScript_RaiseStatOnFaintingTarget; return; } + } break; case VARIOUS_TRY_ACTIVATE_GRIM_NEIGH: // and as one shadow rider - if ((GetBattlerAbility(gActiveBattler) == ABILITY_GRIM_NEIGH - || GetBattlerAbility(gActiveBattler) == ABILITY_AS_ONE_SHADOW_RIDER) + { + u16 battlerAbility = GetBattlerAbility(gActiveBattler); + + if ((battlerAbility == ABILITY_GRIM_NEIGH + || battlerAbility == ABILITY_AS_ONE_SHADOW_RIDER) && HasAttackerFaintedTarget() && !NoAliveMonsForEitherParty() && CompareStat(gBattlerAttacker, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)) @@ -8088,12 +8099,13 @@ static void Cmd_various(void) SET_STATCHANGER(STAT_SPATK, 1, FALSE); PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); BattleScriptPush(gBattlescriptCurrInstr + 3); - gLastUsedAbility = GetBattlerAbility(gActiveBattler); - if (GetBattlerAbility(gActiveBattler) == ABILITY_AS_ONE_SHADOW_RIDER) + gLastUsedAbility = battlerAbility; + if (battlerAbility == ABILITY_AS_ONE_SHADOW_RIDER) gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_GRIM_NEIGH; gBattlescriptCurrInstr = BattleScript_RaiseStatOnFaintingTarget; return; } + } break; case VARIOUS_TRY_ACTIVATE_RECEIVER: // Partner gets fainted's ally ability gBattlerAbility = BATTLE_PARTNER(gActiveBattler); @@ -8644,10 +8656,12 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 4; return; case VARIOUS_PSYCHO_SHIFT: + { + u16 targetAbility = GetBattlerAbility(gBattlerTarget); i = TRUE; if (gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) { - if (GetBattlerAbility(gBattlerTarget) == ABILITY_LIMBER) + if (targetAbility == ABILITY_LIMBER) { gBattlerAbility = gBattlerTarget; BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); @@ -8667,7 +8681,7 @@ static void Cmd_various(void) } else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_PSN_ANY) { - if (GetBattlerAbility(gBattlerTarget) == ABILITY_IMMUNITY) + if (targetAbility == ABILITY_IMMUNITY) { gBattlerAbility = gBattlerTarget; BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); @@ -8690,8 +8704,8 @@ static void Cmd_various(void) } else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_BURN) { - if (GetBattlerAbility(gBattlerTarget) == ABILITY_WATER_VEIL - || GetBattlerAbility(gBattlerTarget) == ABILITY_WATER_BUBBLE) + if (targetAbility == ABILITY_WATER_VEIL + || targetAbility == ABILITY_WATER_BUBBLE) { gBattlerAbility = gBattlerTarget; BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); @@ -8711,7 +8725,7 @@ static void Cmd_various(void) } else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) { - if (GetBattlerAbility(gBattlerTarget) == ABILITY_INSOMNIA || GetBattlerAbility(gBattlerTarget) == ABILITY_VITAL_SPIRIT) + if (targetAbility == ABILITY_INSOMNIA || targetAbility == ABILITY_VITAL_SPIRIT) { gBattlerAbility = gBattlerTarget; // BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); @@ -8732,6 +8746,7 @@ static void Cmd_various(void) MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 7; } + } return; case VARIOUS_CURE_STATUS: gBattleMons[gActiveBattler].status1 = 0; @@ -10054,11 +10069,14 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr bool32 notProtectAffected = FALSE; u32 index; bool32 affectsUser = (flags & MOVE_EFFECT_AFFECTS_USER); + u16 activeBattlerAbility; if (affectsUser) gActiveBattler = gBattlerAttacker; else gActiveBattler = gBattlerTarget; + + activeBattlerAbility = GetBattlerAbility(gActiveBattler); gSpecialStatuses[gActiveBattler].changedStatsBattlerId = gBattlerAttacker; @@ -10072,7 +10090,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr notProtectAffected++; flags &= ~STAT_BUFF_NOT_PROTECT_AFFECTED; - if (GetBattlerAbility(gActiveBattler) == ABILITY_CONTRARY) + if (activeBattlerAbility == ABILITY_CONTRARY) { statValue ^= STAT_BUFF_NEGATIVE; gBattleScripting.statChanger ^= STAT_BUFF_NEGATIVE; @@ -10082,7 +10100,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr gBattleScripting.moveEffect = ReverseStatChangeMoveEffect(gBattleScripting.moveEffect); } } - else if (GetBattlerAbility(gActiveBattler) == ABILITY_SIMPLE) + else if (activeBattlerAbility == ABILITY_SIMPLE) { statValue = (SET_STAT_BUFF_VALUE(GET_STAT_BUFF_VALUE(statValue) * 2)) | ((statValue <= -1) ? STAT_BUFF_NEGATIVE : 0); } @@ -10117,9 +10135,9 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr gBattlescriptCurrInstr = BattleScript_ButItFailed; return STAT_CHANGE_DIDNT_WORK; } - else if ((GetBattlerAbility(gActiveBattler) == ABILITY_CLEAR_BODY - || GetBattlerAbility(gActiveBattler) == ABILITY_FULL_METAL_BODY - || GetBattlerAbility(gActiveBattler) == ABILITY_WHITE_SMOKE) + else if ((activeBattlerAbility == ABILITY_CLEAR_BODY + || activeBattlerAbility == ABILITY_FULL_METAL_BODY + || activeBattlerAbility == ABILITY_WHITE_SMOKE) && !certain && gCurrentMove != MOVE_CURSE) { if (flags == STAT_BUFF_ALLOW_PTR) @@ -10134,7 +10152,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr gBattleScripting.battler = gActiveBattler; gBattlerAbility = gActiveBattler; gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss; - gLastUsedAbility = GetBattlerAbility(gActiveBattler); + gLastUsedAbility = activeBattlerAbility; RecordAbilityBattle(gActiveBattler, gLastUsedAbility); gSpecialStatuses[gActiveBattler].statLowered = TRUE; } @@ -10162,9 +10180,9 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr return STAT_CHANGE_DIDNT_WORK; } else if (!certain - && ((GetBattlerAbility(gActiveBattler) == ABILITY_KEEN_EYE && statId == STAT_ACC) - || (GetBattlerAbility(gActiveBattler) == ABILITY_HYPER_CUTTER && statId == STAT_ATK) - || (GetBattlerAbility(gActiveBattler) == ABILITY_BIG_PECKS && statId == STAT_DEF))) + && ((activeBattlerAbility == ABILITY_KEEN_EYE && statId == STAT_ACC) + || (activeBattlerAbility == ABILITY_HYPER_CUTTER && statId == STAT_ATK) + || (activeBattlerAbility == ABILITY_BIG_PECKS && statId == STAT_DEF))) { if (flags == STAT_BUFF_ALLOW_PTR) { @@ -10172,12 +10190,12 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr gBattleScripting.battler = gActiveBattler; gBattlerAbility = gActiveBattler; gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; - gLastUsedAbility = GetBattlerAbility(gActiveBattler); + gLastUsedAbility = activeBattlerAbility; RecordAbilityBattle(gActiveBattler, gLastUsedAbility); } return STAT_CHANGE_DIDNT_WORK; } - else if (GetBattlerAbility(gActiveBattler) == ABILITY_MIRROR_ARMOR && !affectsUser && gBattlerAttacker != gBattlerTarget && gActiveBattler == gBattlerTarget) + else if (activeBattlerAbility == ABILITY_MIRROR_ARMOR && !affectsUser && gBattlerAttacker != gBattlerTarget && gActiveBattler == gBattlerTarget) { if (flags == STAT_BUFF_ALLOW_PTR) { @@ -10190,7 +10208,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr } return STAT_CHANGE_DIDNT_WORK; } - else if (GetBattlerAbility(gActiveBattler) == ABILITY_SHIELD_DUST && flags == 0) + else if (activeBattlerAbility == ABILITY_SHIELD_DUST && flags == 0) { return STAT_CHANGE_DIDNT_WORK; } @@ -10724,6 +10742,7 @@ static void Cmd_tryKO(void) { bool32 lands = FALSE; u32 holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); + u16 targetAbility = GetBattlerAbility(gBattlerTarget); gPotentialItemEffectBattler = gBattlerTarget; if (holdEffect == HOLD_EFFECT_FOCUS_BAND @@ -10738,7 +10757,7 @@ static void Cmd_tryKO(void) RecordItemEffectBattle(gBattlerTarget, holdEffect); } - if (GetBattlerAbility(gBattlerTarget) == ABILITY_STURDY) + if (targetAbility == ABILITY_STURDY) { gMoveResultFlags |= MOVE_RESULT_MISSED; gLastUsedAbility = ABILITY_STURDY; @@ -10750,7 +10769,7 @@ static void Cmd_tryKO(void) if ((((gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS) && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) || GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD - || GetBattlerAbility(gBattlerTarget) == ABILITY_NO_GUARD) + || targetAbility == ABILITY_NO_GUARD) && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) { lands = TRUE; diff --git a/src/battle_util.c b/src/battle_util.c index 0d4f83fc84..4127b9bd41 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -386,11 +386,14 @@ void HandleAction_UseMove(void) } else { + u16 battlerAbility; gActiveBattler = gBattlerByTurnOrder[var]; + battlerAbility = GetBattlerAbility(gActiveBattler); + RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); - if (GetBattlerAbility(gActiveBattler) == ABILITY_LIGHTNING_ROD) + if (battlerAbility == ABILITY_LIGHTNING_ROD) gSpecialStatuses[gActiveBattler].lightningRodRedirected = TRUE; - else if (GetBattlerAbility(gActiveBattler) == ABILITY_STORM_DRAIN) + else if (battlerAbility == ABILITY_STORM_DRAIN) gSpecialStatuses[gActiveBattler].stormDrainRedirected = TRUE; gBattlerTarget = gActiveBattler; } @@ -1544,6 +1547,8 @@ bool8 WasUnableToUseMove(u8 battler) void PrepareStringBattle(u16 stringId, u8 battler) { + u16 battlerAbility = GetBattlerAbility(battler); + u16 targetAbility = GetBattlerAbility(gBattlerTarget); // Support for Contrary ability. // If a move attempted to raise stat - print "won't increase". // If a move attempted to lower stat - print "won't decrease". @@ -1552,22 +1557,22 @@ void PrepareStringBattle(u16 stringId, u8 battler) else if (stringId == STRINGID_STATSWONTINCREASE && gBattleScripting.statChanger & STAT_BUFF_NEGATIVE) stringId = STRINGID_STATSWONTDECREASE; - else if (stringId == STRINGID_STATSWONTDECREASE2 && GetBattlerAbility(battler) == ABILITY_CONTRARY) + else if (stringId == STRINGID_STATSWONTDECREASE2 && battlerAbility == ABILITY_CONTRARY) stringId = STRINGID_STATSWONTINCREASE2; - else if (stringId == STRINGID_STATSWONTINCREASE2 && GetBattlerAbility(battler) == ABILITY_CONTRARY) + else if (stringId == STRINGID_STATSWONTINCREASE2 && battlerAbility == ABILITY_CONTRARY) stringId = STRINGID_STATSWONTDECREASE2; // Check Defiant and Competitive stat raise whenever a stat is lowered. else if ((stringId == STRINGID_DEFENDERSSTATFELL || stringId == STRINGID_PKMNCUTSATTACKWITH) - && ((GetBattlerAbility(gBattlerTarget) == ABILITY_DEFIANT && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) - || (GetBattlerAbility(gBattlerTarget) == ABILITY_COMPETITIVE && CompareStat(gBattlerTarget, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN))) + && ((targetAbility == ABILITY_DEFIANT && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) + || (targetAbility == ABILITY_COMPETITIVE && CompareStat(gBattlerTarget, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN))) && gSpecialStatuses[gBattlerTarget].changedStatsBattlerId != BATTLE_PARTNER(gBattlerTarget) && gSpecialStatuses[gBattlerTarget].changedStatsBattlerId != gBattlerTarget) { gBattlerAbility = gBattlerTarget; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_DefiantActivates; - if (GetBattlerAbility(gBattlerTarget) == ABILITY_DEFIANT) + if (targetAbility == ABILITY_DEFIANT) SET_STATCHANGER(STAT_ATK, 2, FALSE); else SET_STATCHANGER(STAT_SPATK, 2, FALSE); @@ -2822,16 +2827,19 @@ u8 DoBattlerEndTurnEffects(void) gBattleStruct->turnEffectsTracker++; break; case ENDTURN_OCTOLOCK: + { + u16 battlerAbility = GetBattlerAbility(gActiveBattler); if (gDisableStructs[gActiveBattler].octolock - && !(GetBattlerAbility(gActiveBattler) == ABILITY_CLEAR_BODY - || GetBattlerAbility(gActiveBattler) == ABILITY_FULL_METAL_BODY - || GetBattlerAbility(gActiveBattler) == ABILITY_WHITE_SMOKE)) + && !(battlerAbility == ABILITY_CLEAR_BODY + || battlerAbility == ABILITY_FULL_METAL_BODY + || battlerAbility == ABILITY_WHITE_SMOKE)) { gBattlerTarget = gActiveBattler; BattleScriptExecute(BattleScript_OctolockEndTurn); effect++; } gBattleStruct->turnEffectsTracker++; + } break; case ENDTURN_UPROAR: // uproar if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR) @@ -2972,10 +2980,11 @@ u8 DoBattlerEndTurnEffects(void) case ENDTURN_YAWN: // yawn if (gStatuses3[gActiveBattler] & STATUS3_YAWN) { + u16 battlerAbility = GetBattlerAbility(gActiveBattler); gStatuses3[gActiveBattler] -= STATUS3_YAWN_TURN(1); if (!(gStatuses3[gActiveBattler] & STATUS3_YAWN) && !(gBattleMons[gActiveBattler].status1 & STATUS1_ANY) - && GetBattlerAbility(gActiveBattler) != ABILITY_VITAL_SPIRIT - && GetBattlerAbility(gActiveBattler) != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBattler) + && battlerAbility != ABILITY_VITAL_SPIRIT + && battlerAbility != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBattler) && !IsLeafGuardProtected(gActiveBattler)) { CancelMultiTurnMoves(gActiveBattler); @@ -3937,6 +3946,8 @@ static const u16 sWeatherFlagsInfo[][3] = bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility) { + u16 battlerAbility = GetBattlerAbility(battler); + if (viaAbility && B_ABILITY_WEATHER <= GEN_5 && !(gBattleWeather & sWeatherFlagsInfo[weatherEnumId][1])) { @@ -3944,9 +3955,9 @@ bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility) return TRUE; } else if (gBattleWeather & B_WEATHER_PRIMAL_ANY - && GetBattlerAbility(battler) != ABILITY_DESOLATE_LAND - && GetBattlerAbility(battler) != ABILITY_PRIMORDIAL_SEA - && GetBattlerAbility(battler) != ABILITY_DELTA_STREAM) + && battlerAbility != ABILITY_DESOLATE_LAND + && battlerAbility != ABILITY_PRIMORDIAL_SEA + && battlerAbility != ABILITY_DELTA_STREAM) { return FALSE; } @@ -4002,10 +4013,11 @@ static bool32 ShouldChangeFormHpBased(u32 battler) {ABILITY_ZEN_MODE, SPECIES_DARMANITAN_GALARIAN, SPECIES_DARMANITAN_ZEN_MODE_GALARIAN, 2}, }; u32 i; + u16 battlerAbility = GetBattlerAbility(battler); for (i = 0; i < ARRAY_COUNT(forms); i++) { - if (GetBattlerAbility(battler) == forms[i][0]) + if (battlerAbility == forms[i][0]) { if (gBattleMons[battler].species == forms[i][2] && gBattleMons[battler].hp > gBattleMons[battler].maxHP / forms[i][3]) @@ -5593,7 +5605,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move case ABILITYEFFECT_FORECAST: // 6 for (battler = 0; battler < gBattlersCount; battler++) { - if (GetBattlerAbility(battler) == ABILITY_FORECAST || GetBattlerAbility(battler) == ABILITY_FLOWER_GIFT) + u16 battlerAbility = GetBattlerAbility(battler); + if (battlerAbility == ABILITY_FORECAST || battlerAbility == ABILITY_FLOWER_GIFT) { effect = TryWeatherFormChange(battler); if (effect) @@ -6138,13 +6151,14 @@ static u8 RandomStatRaiseBerry(u32 battlerId, u32 itemId, bool32 end2) } if (i != NUM_STATS - 1 && HasEnoughHpToEatBerry(battlerId, GetBattlerHoldEffectParam(battlerId), itemId)) { + u16 battlerAbility = GetBattlerAbility(battlerId); do { i = Random() % (NUM_STATS - 1); } while (!CompareStat(battlerId, STAT_ATK + i, MAX_STAT_STAGE, CMP_LESS_THAN)); PREPARE_STAT_BUFFER(gBattleTextBuff1, i + 1); - stringId = (GetBattlerAbility(battlerId) == ABILITY_CONTRARY) ? STRINGID_STATFELL : STRINGID_STATROSE; + stringId = (battlerAbility == ABILITY_CONTRARY) ? STRINGID_STATFELL : STRINGID_STATROSE; gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; gBattleTextBuff2[1] = B_BUFF_STRING; gBattleTextBuff2[2] = STRINGID_STATSHARPLY; @@ -6154,7 +6168,7 @@ static u8 RandomStatRaiseBerry(u32 battlerId, u32 itemId, bool32 end2) gBattleTextBuff2[6] = stringId >> 8; gBattleTextBuff2[7] = EOS; gEffectBattler = battlerId; - if (GetBattlerAbility(battlerId) == ABILITY_RIPEN) + if (battlerAbility == ABILITY_RIPEN) SET_STATCHANGER(i + 1, 4, FALSE); else SET_STATCHANGER(i + 1, 2, FALSE); @@ -7313,13 +7327,15 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case ITEMEFFECT_ORBS: + { + u16 battlerAbility = GetBattlerAbility(battlerId); switch (battlerHoldEffect) { case HOLD_EFFECT_TOXIC_ORB: if (!gBattleMons[battlerId].status1 && CanPoisonType(battlerId, battlerId) - && GetBattlerAbility(battlerId) != ABILITY_IMMUNITY - && GetBattlerAbility(battlerId) != ABILITY_COMATOSE + && battlerAbility != ABILITY_IMMUNITY + && battlerAbility != ABILITY_COMATOSE && IsBattlerAlive) { effect = ITEM_STATUS_CHANGE; @@ -7331,9 +7347,9 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_FLAME_ORB: if (!gBattleMons[battlerId].status1 && !IS_BATTLER_OF_TYPE(battlerId, TYPE_FIRE) - && GetBattlerAbility(battlerId) != ABILITY_WATER_VEIL - && GetBattlerAbility(battlerId) != ABILITY_WATER_BUBBLE - && GetBattlerAbility(battlerId) != ABILITY_COMATOSE + && battlerAbility != ABILITY_WATER_VEIL + && battlerAbility != ABILITY_WATER_BUBBLE + && battlerAbility != ABILITY_COMATOSE && IsBattlerAlive) { effect = ITEM_STATUS_CHANGE; @@ -7343,7 +7359,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_STICKY_BARB: // Not an orb per se, but similar effect, and needs to NOT activate with pickpocket - if (GetBattlerAbility(battlerId) != ABILITY_MAGIC_GUARD) + if (battlerAbility != ABILITY_MAGIC_GUARD) { gBattleMoveDamage = gBattleMons[battlerId].maxHP / 8; if (gBattleMoveDamage == 0) @@ -7362,6 +7378,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battlerId].status1); MarkBattlerForControllerExec(gActiveBattler); } + } break; } @@ -9093,6 +9110,8 @@ static void UpdateMoveResultFlags(u16 modifier) static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities, u16 modifier) { + u16 defAbility = GetBattlerAbility(battlerDef); + MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type1, battlerAtk, recordAbilities); if (gBattleMons[battlerDef].type2 != gBattleMons[battlerDef].type1) MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type2, battlerAtk, recordAbilities); @@ -9103,7 +9122,7 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat if (moveType == TYPE_GROUND && !IsBattlerGrounded(battlerDef) && !(gBattleMoves[move].flags & FLAG_DMG_UNGROUNDED_IGNORE_TYPE_IF_FLYING)) { modifier = UQ_4_12(0.0); - if (recordAbilities && GetBattlerAbility(battlerDef) == ABILITY_LEVITATE) + if (recordAbilities && defAbility == ABILITY_LEVITATE) { gLastUsedAbility = ABILITY_LEVITATE; gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); @@ -9124,8 +9143,8 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat modifier = UQ_4_12(1.0); } - if (((GetBattlerAbility(battlerDef) == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0)) - || (GetBattlerAbility(battlerDef) == ABILITY_TELEPATHY && battlerDef == BATTLE_PARTNER(battlerAtk))) + if (((defAbility == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0)) + || (defAbility == ABILITY_TELEPATHY && battlerDef == BATTLE_PARTNER(battlerAtk))) && gBattleMoves[move].power) { modifier = UQ_4_12(0.0); From 60f46a710c1769c4b3287f3c928d5c0e95a49870 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sat, 22 Jan 2022 21:04:59 -0300 Subject: [PATCH 070/105] Removed redundant checks for Unnerve --- src/battle_main.c | 8 ++------ src/item.c | 4 ---- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index 37845472ac..e128f7a153 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4525,9 +4525,7 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) // Quick Claw and Custap Berry if (!gProtectStructs[battler1].quickDraw && ((holdEffectBattler1 == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler1)) / 100) - || (!IsAbilityOnOpposingSide(battler1, ABILITY_UNNERVE) - && holdEffectBattler1 == HOLD_EFFECT_CUSTAP_BERRY - && HasEnoughHpToEatBerry(battler1, 4, gBattleMons[battler1].item)))) + || (holdEffectBattler1 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler1, 4, gBattleMons[battler1].item)))) gProtectStructs[battler1].usedCustapBerry = TRUE; // Battler 2 @@ -4539,9 +4537,7 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) // Quick Claw and Custap Berry if (!gProtectStructs[battler2].quickDraw && ((holdEffectBattler2 == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler2)) / 100) - || (!IsAbilityOnOpposingSide(battler2, ABILITY_UNNERVE) - && holdEffectBattler2 == HOLD_EFFECT_CUSTAP_BERRY - && HasEnoughHpToEatBerry(battler2, 4, gBattleMons[battler2].item)))) + || (holdEffectBattler2 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler2, 4, gBattleMons[battler2].item)))) gProtectStructs[battler2].usedCustapBerry = TRUE; if (!ignoreChosenMoves) diff --git a/src/item.c b/src/item.c index e9b94ae6f1..f88ee72479 100644 --- a/src/item.c +++ b/src/item.c @@ -959,12 +959,8 @@ bool32 IsPinchBerryItemEffect(u16 holdEffect) case HOLD_EFFECT_SP_DEFENSE_UP: case HOLD_EFFECT_CRITICAL_UP: case HOLD_EFFECT_RANDOM_STAT_UP: - #ifdef HOLD_EFFECT_CUSTAP_BERRY case HOLD_EFFECT_CUSTAP_BERRY: - #endif - #ifdef HOLD_EFFECT_MICLE_BERRY case HOLD_EFFECT_MICLE_BERRY: - #endif return TRUE; } From a165f9926d430ab7866d5faebcdc09a87a5257b6 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sun, 23 Jan 2022 13:46:30 -0500 Subject: [PATCH 071/105] canbestatused for psycho shift --- src/battle_script_commands.c | 27 ++++----------------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 478dba5d22..43280a7294 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8661,19 +8661,13 @@ static void Cmd_various(void) i = TRUE; if (gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) { - if (targetAbility == ABILITY_LIMBER) + if (!(CanBeParalyzed(gBattlerTarget))) { gBattlerAbility = gBattlerTarget; BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); gBattlescriptCurrInstr = BattleScript_PRLZPrevention; i = FALSE; } - else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_ELECTRIC)) - { - BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); - gBattlescriptCurrInstr = BattleScript_PRLZPrevention; - i = FALSE; - } else { gBattleCommunication[MULTISTRING_CHOOSER] = 3; @@ -8681,19 +8675,13 @@ static void Cmd_various(void) } else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_PSN_ANY) { - if (targetAbility == ABILITY_IMMUNITY) + if (!CanBePoisoned(gBattlerTarget, targetAbility)) { gBattlerAbility = gBattlerTarget; BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); gBattlescriptCurrInstr = BattleScript_PSNPrevention; i = FALSE; } - else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_POISON) || IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_STEEL)) - { - BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); - gBattlescriptCurrInstr = BattleScript_PSNPrevention; - i = FALSE; - } else { if (gBattleMons[gBattlerAttacker].status1 & STATUS1_POISON) @@ -8704,20 +8692,13 @@ static void Cmd_various(void) } else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_BURN) { - if (targetAbility == ABILITY_WATER_VEIL - || targetAbility == ABILITY_WATER_BUBBLE) + if (!CanBeBurned(gBattlerTarget)) { gBattlerAbility = gBattlerTarget; BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); gBattlescriptCurrInstr = BattleScript_BRNPrevention; i = FALSE; } - else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_FIRE)) - { - BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); - gBattlescriptCurrInstr = BattleScript_BRNPrevention; - i = FALSE; - } else { gBattleCommunication[MULTISTRING_CHOOSER] = 2; @@ -8725,7 +8706,7 @@ static void Cmd_various(void) } else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) { - if (targetAbility == ABILITY_INSOMNIA || targetAbility == ABILITY_VITAL_SPIRIT) + if (!CanSleep(gBattlerTarget)) { gBattlerAbility = gBattlerTarget; // BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); From 8eaf0718ec3adc4d1b51358f99b65dda0dc7d4da Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 23 Jan 2022 02:50:39 -0300 Subject: [PATCH 072/105] Review changes Also updated tryfaintmon call in BattleScript_FlingEnd, and updated CanFling. --- asm/macros/battle_script.inc | 4 ++-- data/battle_scripts_1.s | 7 ++----- include/constants/battle_script_commands.h | 2 +- src/battle_script_commands.c | 23 ++-------------------- src/battle_util.c | 3 ++- 5 files changed, 9 insertions(+), 30 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index b7cdeec933..0aeb7309ce 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1932,8 +1932,8 @@ various BS_ATTACKER, VARIOUS_SHELL_SIDE_ARM_CHECK .endm - .macro jumpifflingfails battler:req, ptr:req - various \battler, VARIOUS_JUMP_IF_FLING_FAILS + .macro jumpifcantfling battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_CANT_FLING .4byte \ptr .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7bd93c9db4..7aa3c28b78 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -464,12 +464,9 @@ BattleScript_SkyDropFlyingAlreadyConfused: goto BattleScript_ThrashConfuses BattleScript_EffectFling: - jumpifflingfails BS_ATTACKER, BattleScript_ButItFailedAtkStringPpReduce + jumpifcantfling BS_ATTACKER, BattleScript_ButItFailedAtkStringPpReduce jumpifstatus3 BS_ATTACKER, STATUS3_EMBARGO, BattleScript_ButItFailedAtkStringPpReduce jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_MAGIC_ROOM, BattleScript_ButItFailedAtkStringPpReduce -.if B_KLUTZ_FLING_INTERACTION >= GEN_5 - jumpifability BS_ATTACKER, ABILITY_KLUTZ, BattleScript_ButItFailedAtkStringPpReduce -.endif setlastuseditem BS_ATTACKER removeitem BS_ATTACKER attackcanceler @@ -511,7 +508,7 @@ BattleScript_EffectFlingConsumeBerry: setbyte sBERRY_OVERRIDE, FALSE restorebattleritem BS_TARGET BattleScript_FlingEnd: - tryfaintmon BS_TARGET, FALSE, NULL + tryfaintmon BS_TARGET goto BattleScript_MoveEnd BattleScript_FlingFlameOrb: diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 819184c3b8..594de9ef74 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -229,7 +229,7 @@ #define VARIOUS_SET_SKY_DROP 139 #define VARIOUS_CLEAR_SKY_DROP 140 #define VARIOUS_SKY_DROP_YAWN 141 -#define VARIOUS_JUMP_IF_FLING_FAILS 142 +#define VARIOUS_JUMP_IF_CANT_FLING 142 #define VARIOUS_JUMP_IF_HOLD_EFFECT 143 #define VARIOUS_CURE_CERTAIN_STATUSES 144 #define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 145 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index cef2da350f..17ea3eaa88 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1356,19 +1356,6 @@ static void Cmd_attackcanceler(void) GET_MOVE_TYPE(gCurrentMove, moveType); - // Unnerve prevents a Pokémon holding a Berry from using Fling. - if (gCurrentMove == MOVE_FLING - && GetBattlerAbility(gBattlerAttacker) == ABILITY_UNNERVE - && ItemId_GetPocket(gLastUsedItem) == POCKET_BERRIES) - { - // Fling removes the item just before attackcanceler kicks in. - // This is done to work around an opponent using Protect/Detect. - gBattleMons[gBattlerAttacker].item = gLastUsedItem; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ButItFailedAtkStringPpReduce; - return; - } - if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL) && WEATHER_HAS_EFFECT @@ -9467,14 +9454,8 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; return; } - case VARIOUS_JUMP_IF_FLING_FAILS: - #ifdef ITEM_EXPANSION - if (!ItemId_GetFlingPower(gBattleMons[gActiveBattler].item)) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); - else if (gLastUsedItem == ITEM_NONE) - #else - if (gLastUsedItem == ITEM_NONE) - #endif + case VARIOUS_JUMP_IF_CANT_FLING: + if (!CanFling(gActiveBattler)) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); else gBattlescriptCurrInstr += 7; diff --git a/src/battle_util.c b/src/battle_util.c index 23f2a35000..b531d56795 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9620,7 +9620,9 @@ bool32 CanFling(u8 battlerId) u16 itemEffect = ItemId_GetHoldEffect(item); if (item == ITEM_NONE + #if B_KLUTZ_FLING_INTERACTION >= GEN_5 || GetBattlerAbility(battlerId) == ABILITY_KLUTZ + #endif || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM || gDisableStructs[battlerId].embargoTimer != 0 || !CanBattlerGetOrLoseItem(battlerId, item) @@ -9629,7 +9631,6 @@ bool32 CanFling(u8 battlerId) #ifdef ITEM_ABILITY_CAPSULE || item == ITEM_ABILITY_CAPSULE #endif - || (ItemId_GetPocket(item) == POCKET_BERRIES && IsAbilityOnSide(battlerId, ABILITY_UNNERVE)) || GetPocketByItemId(item) == POCKET_POKE_BALLS) return FALSE; From 7916ff5f47dddb10fd7f4bd2c6ef7e5a0f10ce19 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 25 Jan 2022 21:02:26 -0300 Subject: [PATCH 073/105] Further updated CanFling --- src/battle_util.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index b531d56795..999ced6752 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9625,13 +9625,8 @@ bool32 CanFling(u8 battlerId) #endif || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM || gDisableStructs[battlerId].embargoTimer != 0 - || !CanBattlerGetOrLoseItem(battlerId, item) - //|| itemEffect == HOLD_EFFECT_PRIMAL_ORB - || itemEffect == HOLD_EFFECT_GEMS - #ifdef ITEM_ABILITY_CAPSULE - || item == ITEM_ABILITY_CAPSULE - #endif - || GetPocketByItemId(item) == POCKET_POKE_BALLS) + || ItemId_GetFlingPower(item) != 0 + || !CanBattlerGetOrLoseItem(battlerId, item)) return FALSE; return TRUE; From b33f7aed8df4c0e6d33d2ef7d71a9bda217361cc Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 25 Jan 2022 23:31:23 -0300 Subject: [PATCH 074/105] Oopsie --- src/battle_util.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index 999ced6752..e785de2c26 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9625,7 +9625,9 @@ bool32 CanFling(u8 battlerId) #endif || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM || gDisableStructs[battlerId].embargoTimer != 0 + #ifdef ITEM_EXPANSION || ItemId_GetFlingPower(item) != 0 + #endif || !CanBattlerGetOrLoseItem(battlerId, item)) return FALSE; From 21244d63935b7974c4179f24e4d5de7871c16dcf Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 26 Jan 2022 21:45:24 -0300 Subject: [PATCH 075/105] Modified and moved IsPinchBerryItemEffect --- include/item.h | 1 - src/battle_ai_main.c | 24 ++++++++++++++++++++++++ src/item.c | 23 ----------------------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/include/item.h b/include/item.h index f0c58c6ab6..ceca83bd5f 100644 --- a/include/item.h +++ b/include/item.h @@ -75,6 +75,5 @@ ItemUseFunc ItemId_GetFieldFunc(u16 itemId); u8 ItemId_GetBattleUsage(u16 itemId); ItemUseFunc ItemId_GetBattleFunc(u16 itemId); u8 ItemId_GetSecondaryId(u16 itemId); -bool32 IsPinchBerryItemEffect(u16 holdEffect); #endif // GUARD_ITEM_H diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index d5815ad701..f28cb4fe84 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -41,6 +41,7 @@ enum static u8 ChooseMoveOrAction_Singles(void); static u8 ChooseMoveOrAction_Doubles(void); static void BattleAI_DoAIProcessing(void); +static bool32 IsPinchBerryItemEffect(u16 holdEffect); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; // Still used in contests @@ -2928,6 +2929,29 @@ static s16 AI_DoubleBattle(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) return score; } +static bool32 IsPinchBerryItemEffect(u16 holdEffect) +{ + switch (holdEffect) + { + case HOLD_EFFECT_ATTACK_UP: + case HOLD_EFFECT_DEFENSE_UP: + case HOLD_EFFECT_SPEED_UP: + case HOLD_EFFECT_SP_ATTACK_UP: + case HOLD_EFFECT_SP_DEFENSE_UP: + case HOLD_EFFECT_CRITICAL_UP: + case HOLD_EFFECT_RANDOM_STAT_UP: + #ifdef HOLD_EFFECT_CUSTAP_BERRY + case HOLD_EFFECT_CUSTAP_BERRY: + #endif + #ifdef HOLD_EFFECT_MICLE_BERRY + case HOLD_EFFECT_MICLE_BERRY: + #endif + return TRUE; + } + + return FALSE; +} + // AI_FLAG_CHECK_VIABILITY - a weird mix of increasing and decreasing scores static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) { diff --git a/src/item.c b/src/item.c index e9b94ae6f1..1560342629 100644 --- a/src/item.c +++ b/src/item.c @@ -947,26 +947,3 @@ u8 ItemId_GetSecondaryId(u16 itemId) { return gItems[SanitizeItemId(itemId)].secondaryId; } - -bool32 IsPinchBerryItemEffect(u16 holdEffect) -{ - switch (holdEffect) - { - case HOLD_EFFECT_ATTACK_UP: - case HOLD_EFFECT_DEFENSE_UP: - case HOLD_EFFECT_SPEED_UP: - case HOLD_EFFECT_SP_ATTACK_UP: - case HOLD_EFFECT_SP_DEFENSE_UP: - case HOLD_EFFECT_CRITICAL_UP: - case HOLD_EFFECT_RANDOM_STAT_UP: - #ifdef HOLD_EFFECT_CUSTAP_BERRY - case HOLD_EFFECT_CUSTAP_BERRY: - #endif - #ifdef HOLD_EFFECT_MICLE_BERRY - case HOLD_EFFECT_MICLE_BERRY: - #endif - return TRUE; - } - - return FALSE; -} From 88b732632538795a5194ce5b100c37f58f47ecb3 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 26 Jan 2022 21:46:35 -0300 Subject: [PATCH 076/105] Ported the IE's flingPower item field and ItemId_GetFlingPower --- include/item.h | 2 ++ src/item.c | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/include/item.h b/include/item.h index ceca83bd5f..a1d8324bbc 100644 --- a/include/item.h +++ b/include/item.h @@ -21,6 +21,7 @@ struct Item u8 battleUsage; ItemUseFunc battleUseFunc; u8 secondaryId; + u8 flingPower; }; struct BagPocket @@ -75,5 +76,6 @@ ItemUseFunc ItemId_GetFieldFunc(u16 itemId); u8 ItemId_GetBattleUsage(u16 itemId); ItemUseFunc ItemId_GetBattleFunc(u16 itemId); u8 ItemId_GetSecondaryId(u16 itemId); +u8 ItemId_GetFlingPower(u16 itemId); #endif // GUARD_ITEM_H diff --git a/src/item.c b/src/item.c index 1560342629..f1320a7acd 100644 --- a/src/item.c +++ b/src/item.c @@ -947,3 +947,8 @@ u8 ItemId_GetSecondaryId(u16 itemId) { return gItems[SanitizeItemId(itemId)].secondaryId; } + +u8 ItemId_GetFlingPower(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].flingPower; +} From 5f33989c421a1d19bbc8641c447913f178562dbf Mon Sep 17 00:00:00 2001 From: SubzeroEclipse <64367060+SubzeroEclipse@users.noreply.github.com> Date: Thu, 27 Jan 2022 21:50:12 +0100 Subject: [PATCH 077/105] Fixed format of move descriptions' labels --- src/data/text/move_descriptions.h | 1550 ++++++++++++++--------------- 1 file changed, 775 insertions(+), 775 deletions(-) diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index 2678062e82..4704af3fd5 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -1417,1227 +1417,1227 @@ static const u8 sPsychoBoostDescription[] = _( "Allows a full-power attack,\n" "but sharply lowers Sp. Atk."); -static const u8 sROOSTDescription[] = _( +static const u8 sRoostDescription[] = _( "Restores the user's HP by\n" "half of its max HP."); -static const u8 sGRAVITYDescription[] = _( +static const u8 sGravityDescription[] = _( "Gravity is intensified\n" "negating levitation."); -static const u8 sMIRACLE_EYEDescription[] = _( +static const u8 sMiracleEyeDescription[] = _( "Negate evasiveness and\n" "Dark-type's immunities."); -static const u8 sWAKE_UP_SLAPDescription[] = _( +static const u8 sWakeUpSlapDescription[] = _( "Powerful against sleeping\n" "foes, but also heals them."); -static const u8 sHAMMER_ARMDescription[] = _( +static const u8 sHammerArmDescription[] = _( "A swinging fist attack\n" "that also lowers Speed."); -static const u8 sGYRO_BALLDescription[] = _( +static const u8 sGyroBallDescription[] = _( "A high-speed spin that does\n" "more damage to faster foes."); -static const u8 sHEALING_WISHDescription[] = _( +static const u8 sHealingWishDescription[] = _( "The user faints to heal up\n" "the recipient."); -static const u8 sBRINEDescription[] = _( +static const u8 sBrineDescription[] = _( "Does double damage to foes\n" "with half HP."); -static const u8 sNATURAL_GIFTDescription[] = _( +static const u8 sNaturalGiftDescription[] = _( "The effectiveness varies\n" "with the held Berry."); -static const u8 sFEINTDescription[] = _( +static const u8 sFeintDescription[] = _( "An attack that hits foes\n" "using moves like Protect."); -static const u8 sPLUCKDescription[] = _( +static const u8 sPluckDescription[] = _( "Eats the foe's held Berry\n" "gaining its effect."); -static const u8 sTAILWINDDescription[] = _( +static const u8 sTailwindDescription[] = _( "Whips up a turbulent breeze\n" "that raises Speed."); -static const u8 sACUPRESSUREDescription[] = _( +static const u8 sAcupressureDescription[] = _( "The user sharply raises\n" "one of its stats."); -static const u8 sMETAL_BURSTDescription[] = _( +static const u8 sMetalBurstDescription[] = _( "Retaliates any hit with\n" "greater power."); -static const u8 sU_TURNDescription[] = _( +static const u8 sUTurnDescription[] = _( "Does damage then switches\n" "out the user."); -static const u8 sCLOSE_COMBATDescription[] = _( +static const u8 sCloseCombatDescription[] = _( "A strong attack but lowers\n" "the defensive stats."); -static const u8 sPAYBACKDescription[] = _( +static const u8 sPaybackDescription[] = _( "An attack that gains power\n" "if the user moves last."); -static const u8 sASSURANCEDescription[] = _( +static const u8 sAssuranceDescription[] = _( "An attack that gains power\n" "if the foe has been hurt."); -static const u8 sEMBARGODescription[] = _( +static const u8 sEmbargoDescription[] = _( "Prevents the foe from\n" "using any items."); -static const u8 sFLINGDescription[] = _( +static const u8 sFlingDescription[] = _( "The effectiveness varies\n" "with the held item."); -static const u8 sPSYCHO_SHIFTDescription[] = _( +static const u8 sPsychoShiftDescription[] = _( "Transfers status problems\n" "to the foe."); -static const u8 sTRUMP_CARDDescription[] = _( +static const u8 sTrumpCardDescription[] = _( "The less PP the move has\n" "the more damage it does."); -static const u8 sHEAL_BLOCKDescription[] = _( +static const u8 sHealBlockDescription[] = _( "Prevents the foe from\n" "recovering any HP."); -static const u8 sWRING_OUTDescription[] = _( +static const u8 sWringOutDescription[] = _( "The higher the foe's HP\n" "the more damage caused."); -static const u8 sPOWER_TRICKDescription[] = _( +static const u8 sPowerTrickDescription[] = _( "The user swaps its Attack\n" "and Defense stats."); -static const u8 sGASTRO_ACIDDescription[] = _( +static const u8 sGastroAcidDescription[] = _( "Stomach acid suppresses\n" "the foe's ability."); -static const u8 sLUCKY_CHANTDescription[] = _( +static const u8 sLuckyChantDescription[] = _( "Prevents the foe from\n" "landing critical hits."); -static const u8 sME_FIRSTDescription[] = _( +static const u8 sMeFirstDescription[] = _( "Executes the foe's attack\n" "with greater power."); -static const u8 sCOPYCATDescription[] = _( +static const u8 sCopycatDescription[] = _( "The user mimics the last\n" "move used by a foe."); -static const u8 sPOWER_SWAPDescription[] = _( +static const u8 sPowerSwapDescription[] = _( "Swaps changes to Attack\n" "and Sp. Atk with the foe."); -static const u8 sGUARD_SWAPDescription[] = _( +static const u8 sGuardSwapDescription[] = _( "Swaps changes to Defense\n" "and Sp. Def with the foe."); -static const u8 sPUNISHMENTDescription[] = _( +static const u8 sPunishmentDescription[] = _( "Does more damage if the\n" "foe has powered up."); -static const u8 sLAST_RESORTDescription[] = _( +static const u8 sLastResortDescription[] = _( "Can only be used if every\n" "other move has been used."); -static const u8 sWORRY_SEEDDescription[] = _( +static const u8 sWorrySeedDescription[] = _( "Plants a seed on the foe\n" "giving it Insomnia."); -static const u8 sSUCKER_PUNCHDescription[] = _( +static const u8 sSuckerPunchDescription[] = _( "Strikes first if the foe\n" "is preparing an attack."); -static const u8 sTOXIC_SPIKESDescription[] = _( +static const u8 sToxicSpikesDescription[] = _( "Sets spikes that poison a\n" "foe switching in."); -static const u8 sHEART_SWAPDescription[] = _( +static const u8 sHeartSwapDescription[] = _( "Swaps any stat changes\n" "with the foe."); -static const u8 sAQUA_RINGDescription[] = _( +static const u8 sAquaRingDescription[] = _( "Forms a veil of water\n" "that restores HP."); -static const u8 sMAGNET_RISEDescription[] = _( +static const u8 sMagnetRiseDescription[] = _( "The user levitates with\n" "electromagnetism."); -static const u8 sFLARE_BLITZDescription[] = _( +static const u8 sFlareBlitzDescription[] = _( "A charge that may burn the\n" "foe. Also hurts the user."); -static const u8 sFORCE_PALMDescription[] = _( +static const u8 sForcePalmDescription[] = _( "A shock wave attack that\n" "may paralyze the foe."); -static const u8 sAURA_SPHEREDescription[] = _( +static const u8 sAuraSphereDescription[] = _( "Attacks with an aura blast\n" "that cannot be evaded."); -static const u8 sROCK_POLISHDescription[] = _( +static const u8 sRockPolishDescription[] = _( "Polishes the body to\n" "sharply raise Speed."); -static const u8 sPOISON_JABDescription[] = _( +static const u8 sPoisonJabDescription[] = _( "A stabbing attack that\n" "may poison the foe."); -static const u8 sDARK_PULSEDescription[] = _( +static const u8 sDarkPulseDescription[] = _( "Attacks with a horrible\n" "aura. May cause flinching."); -static const u8 sNIGHT_SLASHDescription[] = _( +static const u8 sNightSlashDescription[] = _( "Hits as soon as possible.\n" "High critical-hit ratio."); -static const u8 sAQUA_TAILDescription[] = _( +static const u8 sAquaTailDescription[] = _( "The user swings its tail\n" "like a wave to attack."); -static const u8 sSEED_BOMBDescription[] = _( +static const u8 sSeedBombDescription[] = _( "A barrage of hard seeds\n" "is fired at the foe."); -static const u8 sAIR_SLASHDescription[] = _( +static const u8 sAirSlashDescription[] = _( "Attacks with a blade of\n" "air. May cause flinching."); -static const u8 sX_SCISSORDescription[] = _( +static const u8 sXScissorDescription[] = _( "Slashes the foe with crossed\n" "scythes, claws, etc."); -static const u8 sBUG_BUZZDescription[] = _( +static const u8 sBugBuzzDescription[] = _( "A damaging sound wave that\n" "may lower Sp. Def."); -static const u8 sDRAGON_PULSEDescription[] = _( +static const u8 sDragonPulseDescription[] = _( "Generates a shock wave to\n" "damage the foe."); -static const u8 sDRAGON_RUSHDescription[] = _( +static const u8 sDragonRushDescription[] = _( "Tackles the foe with menace.\n" "May cause flinching."); -static const u8 sPOWER_GEMDescription[] = _( +static const u8 sPowerGemDescription[] = _( "Attacks with rays of light\n" "that sparkle like diamonds."); -static const u8 sVACUUM_WAVEDescription[] = _( +static const u8 sVacuumWaveDescription[] = _( "Whirls its fists to send\n" "a wave that strikes first."); -static const u8 sFOCUS_BLASTDescription[] = _( +static const u8 sFocusBlastDescription[] = _( "Attacks at full power.\n" "May lower Sp. Def."); -static const u8 sENERGY_BALLDescription[] = _( +static const u8 sEnergyBallDescription[] = _( "Draws power from nature to\n" "attack. May lower Sp. Def."); -static const u8 sBRAVE_BIRDDescription[] = _( +static const u8 sBraveBirdDescription[] = _( "A low altitude charge that\n" "also hurts the user."); -static const u8 sEARTH_POWERDescription[] = _( +static const u8 sEarthPowerDescription[] = _( "Makes the ground erupt with\n" "power. May lower Sp. Def."); -static const u8 sSWITCHEROODescription[] = _( +static const u8 sSwitcherooDescription[] = _( "Swaps items with the foe\n" "faster than the eye can see."); -static const u8 sNASTY_PLOTDescription[] = _( +static const u8 sNastyPlotDescription[] = _( "Thinks bad thoughts to\n" "sharply boost Sp. Atk."); -static const u8 sBULLET_PUNCHDescription[] = _( +static const u8 sBulletPunchDescription[] = _( "Punches as fast as a bul-\n" "let. It always hits first."); -static const u8 sICE_SHARDDescription[] = _( +static const u8 sIceShardDescription[] = _( "Hurls a chunk of ice that\n" "always strike first."); -static const u8 sSHADOW_CLAWDescription[] = _( +static const u8 sShadowClawDescription[] = _( "Strikes with a shadow claw.\n" "High critical-hit ratio."); -static const u8 sTHUNDER_FANGDescription[] = _( +static const u8 sThunderFangDescription[] = _( "May cause flinching or\n" "leave the foe paralyzed."); -static const u8 sICE_FANGDescription[] = _( +static const u8 sIceFangDescription[] = _( "May cause flinching or\n" "leave the foe frozen."); -static const u8 sFIRE_FANGDescription[] = _( +static const u8 sFireFangDescription[] = _( "May cause flinching or\n" "leave the foe with a burn."); -static const u8 sSHADOW_SNEAKDescription[] = _( +static const u8 sShadowSneakDescription[] = _( "Extends the user's shadow\n" "to strike first."); -static const u8 sMUD_BOMBDescription[] = _( +static const u8 sMudBombDescription[] = _( "Throws a blob of mud to\n" "damage and cut accuracy."); -static const u8 sPSYCHO_CUTDescription[] = _( +static const u8 sPsychoCutDescription[] = _( "Tears with psychic blades.\n" "High critical-hit ratio."); -static const u8 sZEN_HEADBUTTDescription[] = _( +static const u8 sZenHeadbuttDescription[] = _( "Hits with a strong head-\n" "butt. May cause flinching."); -static const u8 sMIRROR_SHOTDescription[] = _( +static const u8 sMirrorShotDescription[] = _( "Emits a flash of energy to\n" "damage and cut accuracy."); -static const u8 sFLASH_CANNONDescription[] = _( +static const u8 sFlashCannonDescription[] = _( "Releases a blast of light\n" "that may lower Sp. Def."); -static const u8 sROCK_CLIMBDescription[] = _( +static const u8 sRockClimbDescription[] = _( "A charging attack that may\n" "confuse the foe."); -static const u8 sDEFOGDescription[] = _( +static const u8 sDefogDescription[] = _( "Removes obstacles and\n" "lowers evasion."); -static const u8 sTRICK_ROOMDescription[] = _( +static const u8 sTrickRoomDescription[] = _( "Slower Pokémon get to move\n" "first for 5 turns."); -static const u8 sDRACO_METEORDescription[] = _( +static const u8 sDracoMeteorDescription[] = _( "Casts comets onto the foe.\n" "Harshly lowers the Sp. Atk."); -static const u8 sDISCHARGEDescription[] = _( +static const u8 sDischargeDescription[] = _( "Zaps the foes with electri-\n" "city. May paralyze them."); -static const u8 sPOWER_WHIPDescription[] = _( +static const u8 sPowerWhipDescription[] = _( "Violently lashes the foe\n" "with vines or tentacles."); -static const u8 sCROSS_POISONDescription[] = _( +static const u8 sCrossPoisonDescription[] = _( "A slash that may poison a\n" "foe and do critical damage."); -static const u8 sGUNK_SHOTDescription[] = _( +static const u8 sGunkShotDescription[] = _( "Shoots filthy garbage at\n" "the foe. May also poison."); -static const u8 sIRON_HEADDescription[] = _( +static const u8 sIronHeadDescription[] = _( "Slams the foe with a hard\n" "head. May cause flinching."); -static const u8 sMAGNET_BOMBDescription[] = _( +static const u8 sMagnetBombDescription[] = _( "Launches a magnet that\n" "strikes without fail."); -static const u8 sSTONE_EDGEDescription[] = _( +static const u8 sStoneEdgeDescription[] = _( "Stabs the foe with stones.\n" "High critical-hit ratio."); -static const u8 sCAPTIVATEDescription[] = _( +static const u8 sCaptivateDescription[] = _( "Makes the opposite gender\n" "sharply reduce its Sp. Atk."); -static const u8 sSTEALTH_ROCKDescription[] = _( +static const u8 sStealthRockDescription[] = _( "Sets floating stones that\n" "hurt a foe switching in."); -static const u8 sGRASS_KNOTDescription[] = _( +static const u8 sGrassKnotDescription[] = _( "A snare attack that does\n" "more damage to heavier foes."); -static const u8 sCHATTERDescription[] = _( +static const u8 sChatterDescription[] = _( "Attacks with a sound wave\n" "that causes confusion."); -static const u8 sJUDGMENTDescription[] = _( +static const u8 sJudgmentDescription[] = _( "The type varies with the\n" "kind of Plate held."); -static const u8 sCHARGE_BEAMDescription[] = _( +static const u8 sChargeBeamDescription[] = _( "Fires a beam of electricity.\n" "May raise Sp. Atk."); -static const u8 sWOOD_HAMMERDescription[] = _( +static const u8 sWoodHammerDescription[] = _( "Slams the body into a foe\n" "The user gets hurt too."); -static const u8 sAQUA_JETDescription[] = _( +static const u8 sAquaJetDescription[] = _( "Strikes first by dashing\n" "at the foe at a high speed."); -static const u8 sATTACK_ORDERDescription[] = _( +static const u8 sAttackOrderDescription[] = _( "Underlings pummel the foe.\n" "High critical-hit ratio."); -static const u8 sDEFEND_ORDERDescription[] = _( +static const u8 sDefendOrderDescription[] = _( "Raises Defense and Sp. Def\n" "with a living shield."); -static const u8 sHEAL_ORDERDescription[] = _( +static const u8 sHealOrderDescription[] = _( "The user's underlings show\n" "up to heal half its max HP."); -static const u8 sHEAD_SMASHDescription[] = _( +static const u8 sHeadSmashDescription[] = _( "A life-risking headbutt that\n" "seriously hurts the user."); -static const u8 sDOUBLE_HITDescription[] = _( +static const u8 sDoubleHitDescription[] = _( "Slams the foe with a tail\n" "etc. Strikes twice."); -static const u8 sROAR_OF_TIMEDescription[] = _( +static const u8 sRoarOfTimeDescription[] = _( "Powerful, but leaves the\n" "user immobile the next turn."); -static const u8 sSPACIAL_RENDDescription[] = _( +static const u8 sSpacialRendDescription[] = _( "Tears the foe, and space.\n" "High critical-hit ratio."); -static const u8 sMAGMA_STORMDescription[] = _( +static const u8 sMagmaStormDescription[] = _( "Traps the foe in a vortex\n" "of fire for 2 to 5 turns."); -static const u8 sDARK_VOIDDescription[] = _( +static const u8 sDarkVoidDescription[] = _( "Drags the foe into total\n" "darkness, inducing Sleep."); -static const u8 sSEED_FLAREDescription[] = _( +static const u8 sSeedFlareDescription[] = _( "Generates a shock wave that\n" "sharply reduces Sp. Def."); -static const u8 sOMINOUS_WINDDescription[] = _( +static const u8 sOminousWindDescription[] = _( "A repulsive attack that may\n" "raise all stats."); -static const u8 sSHADOW_FORCEDescription[] = _( +static const u8 sShadowForceDescription[] = _( "Vanishes on the first turn\n" "then strikes the next turn."); -static const u8 sHONE_CLAWSDescription[] = _( +static const u8 sHoneClawsDescription[] = _( "Sharpens its claws to raise\n" "Attack and Accuracy."); -static const u8 sWIDE_GUARDDescription[] = _( +static const u8 sWideGuardDescription[] = _( "Evades wide-ranging attacks\n" "for one turn."); -static const u8 sGUARD_SPLITDescription[] = _( +static const u8 sGuardSplitDescription[] = _( "Averages changes to Defense\n" "and Sp. Def with the foe."); -static const u8 sPOWER_SPLITDescription[] = _( +static const u8 sPowerSplitDescription[] = _( "Averages changes to Attack\n" "and Sp. Atk with the foe."); -static const u8 sWONDER_ROOMDescription[] = _( +static const u8 sWonderRoomDescription[] = _( "Defense and Sp. Def stats\n" "are swapped for 5 turns."); -static const u8 sPSYSHOCKDescription[] = _( +static const u8 sPsyshockDescription[] = _( "Attacks with a psychic wave\n" "that does physical damage."); -static const u8 sTAIL_SLAPDescription[] = _( +static const u8 sTailSlapDescription[] = _( "Strikes the foe with its\n" "tail 2 to 5 times."); -static const u8 sVENOSHOCKDescription[] = _( +static const u8 sVenoshockDescription[] = _( "Does double damage if the\n" "foe is poisoned."); -static const u8 sAUTOTOMIZEDescription[] = _( +static const u8 sAutotomizeDescription[] = _( "Sheds additional weight to\n" "sharply boost Speed."); -static const u8 sRAGE_POWDERDescription[] = _( +static const u8 sRagePowderDescription[] = _( "Scatters powder to make\n" "foes attack only the user."); -static const u8 sTELEKINESISDescription[] = _( +static const u8 sTelekinesisDescription[] = _( "Makes the foe float. It is\n" "easier to hit for 3 turns."); -static const u8 sMAGIC_ROOMDescription[] = _( +static const u8 sMagicRoomDescription[] = _( "Hold items lose their\n" "effects for 5 turns."); -static const u8 sSMACK_DOWNDescription[] = _( +static const u8 sSmackDownDescription[] = _( "Throws a rock to knock the\n" "foe down to the ground."); -static const u8 sSTORM_THROWDescription[] = _( +static const u8 sStormThrowDescription[] = _( "This attack always results\n" "in a critical hit."); -static const u8 sFLAME_BURSTDescription[] = _( +static const u8 sFlameBurstDescription[] = _( "A bursting flame that does\n" "damage to all foes."); -static const u8 sSLUDGE_WAVEDescription[] = _( +static const u8 sSludgeWaveDescription[] = _( "Swamps the foe with a wave\n" "of sludge. May also poison."); -static const u8 sQUIVER_DANCEDescription[] = _( +static const u8 sQuiverDanceDescription[] = _( "Dances to raise Sp. Atk\n" "Sp. Def and Speed."); -static const u8 sHEAVY_SLAMDescription[] = _( +static const u8 sHeavySlamDescription[] = _( "Does more damage if the\n" "user outweighs the foe."); -static const u8 sSYNCHRONOISEDescription[] = _( +static const u8 sSynchronoiseDescription[] = _( "An odd shock wave that only\n" "damages same-type foes."); -static const u8 sELECTRO_BALLDescription[] = _( +static const u8 sElectroBallDescription[] = _( "Hurls an orb that does more\n" "damage to slower foes."); -static const u8 sSOAKDescription[] = _( +static const u8 sSoakDescription[] = _( "Sprays water at the foe\n" "making it Water-type."); -static const u8 sFLAME_CHARGEDescription[] = _( +static const u8 sFlameChargeDescription[] = _( "Attacks in a cloak of\n" "flames. Raises Speed."); -static const u8 sCOILDescription[] = _( +static const u8 sCoilDescription[] = _( "Coils up to raise Attack\n" "Defense and Accuracy."); -static const u8 sLOW_SWEEPDescription[] = _( +static const u8 sLowSweepDescription[] = _( "Attacks the foe's legs\n" "lowering its Speed."); -static const u8 sACID_SPRAYDescription[] = _( +static const u8 sAcidSprayDescription[] = _( "Sprays a hide-melting acid.\n" "Sharply reduces Sp. Def."); -static const u8 sFOUL_PLAYDescription[] = _( +static const u8 sFoulPlayDescription[] = _( "The higher the foe's Attack\n" "the more damage caused."); -static const u8 sSIMPLE_BEAMDescription[] = _( +static const u8 sSimpleBeamDescription[] = _( "A beam that changes the\n" "foe's ability to Simple."); -static const u8 sENTRAINMENTDescription[] = _( +static const u8 sEntrainmentDescription[] = _( "Makes the foe mimic the\n" "user, gaining its ability."); -static const u8 sAFTER_YOUDescription[] = _( +static const u8 sAfterYouDescription[] = _( "Helps out the foe, letting\n" "it move next."); -static const u8 sROUNDDescription[] = _( +static const u8 sRoundDescription[] = _( "A song that inflicts damage.\n" "Others can join in too."); -static const u8 sECHOED_VOICEDescription[] = _( +static const u8 sEchoedVoiceDescription[] = _( "Does more damage every turn\n" "it is used."); -static const u8 sCHIP_AWAYDescription[] = _( +static const u8 sChipAwayDescription[] = _( "Strikes through the foe's\n" "stat changes."); -static const u8 sCLEAR_SMOGDescription[] = _( +static const u8 sClearSmogDescription[] = _( "Attacks with white haze that\n" "eliminates all stat changes."); -static const u8 sSTORED_POWERDescription[] = _( +static const u8 sStoredPowerDescription[] = _( "The higher the user's stats\n" "the more damage caused."); -static const u8 sQUICK_GUARDDescription[] = _( +static const u8 sQuickGuardDescription[] = _( "Evades priority attacks\n" "for one turn."); -static const u8 sALLY_SWITCHDescription[] = _( +static const u8 sAllySwitchDescription[] = _( "The user switches places\n" "with its partner."); -static const u8 sSCALDDescription[] = _( +static const u8 sScaldDescription[] = _( "Shoots boiling water at the\n" "foe. May inflict a burn."); -static const u8 sSHELL_SMASHDescription[] = _( +static const u8 sShellSmashDescription[] = _( "Raises offensive stats, but\n" "lowers defensive stats."); -static const u8 sHEAL_PULSEDescription[] = _( +static const u8 sHealPulseDescription[] = _( "Recovers up to half the\n" "target's maximum HP."); -static const u8 sHEXDescription[] = _( +static const u8 sHexDescription[] = _( "Does double damage if the\n" "foe has a status problem."); -static const u8 sSKY_DROPDescription[] = _( +static const u8 sSkyDropDescription[] = _( "Takes the foe into the sky\n" "then drops it the next turn."); -static const u8 sSHIFT_GEARDescription[] = _( +static const u8 sShiftGearDescription[] = _( "Rotates its gears to raise\n" "Attack and Speed."); -static const u8 sCIRCLE_THROWDescription[] = _( +static const u8 sCircleThrowDescription[] = _( "Knocks the foe away to end\n" "the battle."); -static const u8 sINCINERATEDescription[] = _( +static const u8 sIncinerateDescription[] = _( "Burns up Berries and Gems\n" "preventing their use."); -static const u8 sQUASHDescription[] = _( +static const u8 sQuashDescription[] = _( "Suppresses the foe, making\n" "it move last."); -static const u8 sACROBATICSDescription[] = _( +static const u8 sAcrobaticsDescription[] = _( "Does double damage if the\n" "user has no item."); -static const u8 sREFLECT_TYPEDescription[] = _( +static const u8 sReflectTypeDescription[] = _( "The user reflects the foe's\n" "type, copying it."); -static const u8 sRETALIATEDescription[] = _( +static const u8 sRetaliateDescription[] = _( "An attack that does more\n" "damage if an ally fainted."); -static const u8 sFINAL_GAMBITDescription[] = _( +static const u8 sFinalGambitDescription[] = _( "The user faints to damage\n" "the foe equal to its HP."); -static const u8 sBESTOWDescription[] = _( +static const u8 sBestowDescription[] = _( "The user gives its held\n" "item to the foe."); -static const u8 sINFERNODescription[] = _( +static const u8 sInfernoDescription[] = _( "Powerful and sure to inflict\n" "a burn, but inaccurate."); -static const u8 sWATER_PLEDGEDescription[] = _( +static const u8 sWaterPledgeDescription[] = _( "Attacks with a column of\n" "water. May make a rainbow."); -static const u8 sFIRE_PLEDGEDescription[] = _( +static const u8 sFirePledgeDescription[] = _( "Attacks with a column of\n" "fire. May burn the grass."); -static const u8 sGRASS_PLEDGEDescription[] = _( +static const u8 sGrassPledgeDescription[] = _( "Attacks with a column of\n" "grass. May create a swamp."); -static const u8 sSTRUGGLE_BUGDescription[] = _( +static const u8 sStruggleBugDescription[] = _( "Resisting, the user attacks\n" "the foe. Lowers Sp. Atk."); -static const u8 sBULLDOZEDescription[] = _( +static const u8 sBulldozeDescription[] = _( "Stomps down on the ground.\n" "Lowers Speed."); -static const u8 sWORK_UPDescription[] = _( +static const u8 sWorkUpDescription[] = _( "The user is roused.\n" "Ups Attack and Sp. Atk."); -static const u8 sELECTROWEBDescription[] = _( +static const u8 sElectrowebDescription[] = _( "Snares the foe with an\n" "electric net. Lowers Speed."); -static const u8 sWILD_CHARGEDescription[] = _( +static const u8 sWildChargeDescription[] = _( "An electrical tackle that\n" "also hurts the user."); -static const u8 sDRILL_RUNDescription[] = _( +static const u8 sDrillRunDescription[] = _( "Spins its body like a drill.\n" "High critical-hit ratio."); -static const u8 sDUAL_CHOPDescription[] = _( +static const u8 sDualChopDescription[] = _( "Attacks with brutal hits\n" "that strike twice."); -static const u8 sHEART_STAMPDescription[] = _( +static const u8 sHeartStampDescription[] = _( "A sudden blow after a cute\n" "act. May cause flinching."); -static const u8 sRAZOR_SHELLDescription[] = _( +static const u8 sRazorShellDescription[] = _( "Tears at the foe with sharp\n" "shells. May lower Defense."); -static const u8 sLEAF_TORNADODescription[] = _( +static const u8 sLeafTornadoDescription[] = _( "Circles the foe with leaves\n" "to damage and cut accuracy."); -static const u8 sSTEAMROLLERDescription[] = _( +static const u8 sSteamrollerDescription[] = _( "Crushes the foe with its\n" "body. May cause flinching."); -static const u8 sCOTTON_GUARDDescription[] = _( +static const u8 sCottonGuardDescription[] = _( "Wraps its body in cotton.\n" "Drastically raises Defense."); -static const u8 sNIGHT_DAZEDescription[] = _( +static const u8 sNightDazeDescription[] = _( "Looses a pitch-black shock\n" "wave. May lower accuracy."); -static const u8 sHURRICANEDescription[] = _( +static const u8 sHurricaneDescription[] = _( "Traps the foe in a fierce\n" "wind. May cause confusion."); -static const u8 sHEAD_CHARGEDescription[] = _( +static const u8 sHeadChargeDescription[] = _( "A charge using guard hair.\n" "It hurts the user a little."); -static const u8 sGEAR_GRINDDescription[] = _( +static const u8 sGearGrindDescription[] = _( "Throws two steel gears\n" "that strike twice."); -static const u8 sTECHNO_BLASTDescription[] = _( +static const u8 sTechnoBlastDescription[] = _( "The type varies with the\n" "kind of Drive held."); -static const u8 sRELIC_SONGDescription[] = _( +static const u8 sRelicSongDescription[] = _( "Attacks with an ancient\n" "song. May induce sleep."); -static const u8 sSECRET_SWORDDescription[] = _( +static const u8 sSecretSwordDescription[] = _( "Cuts with a long horn that\n" "does physical damage."); -static const u8 sGLACIATEDescription[] = _( +static const u8 sGlaciateDescription[] = _( "Blows very cold air at the\n" "foe. It lowers their Speed."); -static const u8 sBOLT_STRIKEDescription[] = _( +static const u8 sBoltStrikeDescription[] = _( "Strikes with a great amount\n" "of lightning. May paralyze."); -static const u8 sBLUE_FLAREDescription[] = _( +static const u8 sBlueFlareDescription[] = _( "Engulfs the foe in a blue\n" "flame. May inflict a burn."); -static const u8 sFIERY_DANCEDescription[] = _( +static const u8 sFieryDanceDescription[] = _( "Dances cloaked in flames.\n" "May raise Sp. Atk."); -static const u8 sFREEZE_SHOCKDescription[] = _( +static const u8 sFreezeShockDescription[] = _( "A powerful 2-turn move that\n" "may paralyze the foe."); -static const u8 sICE_BURNDescription[] = _( +static const u8 sIceBurnDescription[] = _( "A powerful 2-turn move that\n" "may inflict a burn."); -static const u8 sSNARLDescription[] = _( +static const u8 sSnarlDescription[] = _( "Yells and rants at the foe\n" "lowering its Sp. Atk."); -static const u8 sICICLE_CRASHDescription[] = _( +static const u8 sIcicleCrashDescription[] = _( "Drops large icicles on the\n" "foe. May cause flinching."); -static const u8 sV_CREATEDescription[] = _( +static const u8 sVCreateDescription[] = _( "Very powerful, but lowers\n" "Defense, Sp. Def and Speed."); -static const u8 sFUSION_FLAREDescription[] = _( +static const u8 sFusionFlareDescription[] = _( "Summons a fireball. Works\n" "well with a thunderbolt."); -static const u8 sFUSION_BOLTDescription[] = _( +static const u8 sFusionBoltDescription[] = _( "Summons a thunderbolt.\n" "Works well with a fireball."); -static const u8 sFLYING_PRESSDescription[] = _( +static const u8 sFlyingPressDescription[] = _( "This attack does Fighting\n" "and Flying-type damage."); -static const u8 sMAT_BLOCKDescription[] = _( +static const u8 sMatBlockDescription[] = _( "Evades damaging moves\n" "for one turn."); -static const u8 sBELCHDescription[] = _( +static const u8 sBelchDescription[] = _( "Lets out a loud belch.\n" "Must eat a Berry to use it."); -static const u8 sROTOTILLERDescription[] = _( +static const u8 sRototillerDescription[] = _( "Ups the Attack and Sp. Atk\n" "of Grass-type Pokémon."); -static const u8 sSTICKY_WEBDescription[] = _( +static const u8 sStickyWebDescription[] = _( "Weaves a sticky net that\n" "slows foes switching in."); -static const u8 sFELL_STINGERDescription[] = _( +static const u8 sFellStingerDescription[] = _( "If it knocks out a foe\n" "the Attack stat is raised."); -static const u8 sTRICK_OR_TREATDescription[] = _( +static const u8 sTrickOrTreatDescription[] = _( "Goes trick-or-treating\n" "making the foe Ghost-type."); -static const u8 sNOBLE_ROARDescription[] = _( +static const u8 sNobleRoarDescription[] = _( "Intimidates the foe, to cut\n" "Attack and Sp. Atk."); -static const u8 sION_DELUGEDescription[] = _( +static const u8 sIonDelugeDescription[] = _( "Electrifies Normal-type\n" "moves with charged atoms."); -static const u8 sPARABOLIC_CHARGEDescription[] = _( +static const u8 sParabolicChargeDescription[] = _( "Damages adjacent Pokémon and\n" "heals up by half of it."); -static const u8 sFORESTS_CURSEDescription[] = _( +static const u8 sForestsCurseDescription[] = _( "Puts a curse on the foe\n" "making the foe Grass-type."); -static const u8 sPETAL_BLIZZARDDescription[] = _( +static const u8 sPetalBlizzardDescription[] = _( "Stirs up a violent storm\n" "of petals to attack."); -static const u8 sFREEZE_DRYDescription[] = _( +static const u8 sFreezeDryDescription[] = _( "Super effective on Water-\n" "types. May cause freezing."); -static const u8 sDISARMING_VOICEDescription[] = _( +static const u8 sDisarmingVoiceDescription[] = _( "Lets out a charming cry\n" "that cannot be evaded."); -static const u8 sPARTING_SHOTDescription[] = _( +static const u8 sPartingShotDescription[] = _( "Lowers the foe's Attack and\n" "Sp. Atk, then switches out."); -static const u8 sTOPSY_TURVYDescription[] = _( +static const u8 sTopsyTurvyDescription[] = _( "Swaps all stat changes that\n" "affect the target."); -static const u8 sDRAINING_KISSDescription[] = _( +static const u8 sDrainingKissDescription[] = _( "An attack that absorbs over\n" "half the damage inflicted."); -static const u8 sCRAFTY_SHIELDDescription[] = _( +static const u8 sCraftyShieldDescription[] = _( "Evades status moves for\n" "one turn."); -static const u8 sFLOWER_SHIELDDescription[] = _( +static const u8 sFlowerShieldDescription[] = _( "Raises the Defense of\n" "Grass-type Pokémon."); -static const u8 sGRASSY_TERRAINDescription[] = _( +static const u8 sGrassyTerrainDescription[] = _( "The ground turns to grass\n" "for 5 turns. Restores HP."); -static const u8 sMISTY_TERRAINDescription[] = _( +static const u8 sMistyTerrainDescription[] = _( "Covers the ground with mist\n" "for 5 turns. Blocks status."); -static const u8 sELECTRIFYDescription[] = _( +static const u8 sElectrifyDescription[] = _( "Electrifies the foe, making\n" "its next move Electric-type."); -static const u8 sPLAY_ROUGHDescription[] = _( +static const u8 sPlayRoughDescription[] = _( "Plays rough with the foe.\n" "May lower Attack."); -static const u8 sFAIRY_WINDDescription[] = _( +static const u8 sFairyWindDescription[] = _( "Stirs up a fairy wind to\n" "strike the foe."); -static const u8 sMOONBLASTDescription[] = _( +static const u8 sMoonblastDescription[] = _( "Attacks with the power of\n" "the moon. May lower Sp. Atk."); -static const u8 sBOOMBURSTDescription[] = _( +static const u8 sBoomburstDescription[] = _( "Attacks everything with a\n" "destructive sound wave."); -static const u8 sFAIRY_LOCKDescription[] = _( +static const u8 sFairyLockDescription[] = _( "Locks down the battlefield\n" "preventing escape next turn."); -static const u8 sKINGS_SHIELDDescription[] = _( +static const u8 sKingsShieldDescription[] = _( "Evades damage, and sharply\n" "reduces Attack if struck."); -static const u8 sPLAY_NICEDescription[] = _( +static const u8 sPlayNiceDescription[] = _( "Befriend the foe, lowering\n" "its Attack without fail."); -static const u8 sCONFIDEDescription[] = _( +static const u8 sConfideDescription[] = _( "Shares a secret with the\n" "foe, lowering Sp. Atk."); -static const u8 sDIAMOND_STORMDescription[] = _( +static const u8 sDiamondStormDescription[] = _( "Whips up a storm of\n" "diamonds. May up Defense."); -static const u8 sSTEAM_ERUPTIONDescription[] = _( +static const u8 sSteamEruptionDescription[] = _( "Immerses the foe in heated\n" "steam. May inflict a burn."); -static const u8 sHYPERSPACE_HOLEDescription[] = _( +static const u8 sHyperspaceHoleDescription[] = _( "Uses a warp hole to attack.\n" "Can't be evaded."); -static const u8 sWATER_SHURIKENDescription[] = _( +static const u8 sWaterShurikenDescription[] = _( "Throws 2 to 5 stars that\n" "are sure to strike first."); -static const u8 sMYSTICAL_FIREDescription[] = _( +static const u8 sMysticalFireDescription[] = _( "Breathes a special, hot\n" "fire. May lower Sp. Atk."); -static const u8 sSPIKY_SHIELDDescription[] = _( +static const u8 sSpikyShieldDescription[] = _( "Evades attack, and damages\n" "the foe if struck."); -static const u8 sAROMATIC_MISTDescription[] = _( +static const u8 sAromaticMistDescription[] = _( "Raises the Sp. Def of a\n" "partner Pokémon."); -static const u8 sEERIE_IMPULSEDescription[] = _( +static const u8 sEerieImpulseDescription[] = _( "Exposes the foe to a pulse\n" "that sharply cuts Sp. Atk."); -static const u8 sVENOM_DRENCHDescription[] = _( +static const u8 sVenomDrenchDescription[] = _( "Lowers the Attack, Sp. Atk\n" "and Speed of a poisoned foe."); -static const u8 sPOWDERDescription[] = _( +static const u8 sPowderDescription[] = _( "Damages the foe if it uses\n" "a Fire-type move."); -static const u8 sGEOMANCYDescription[] = _( +static const u8 sGeomancyDescription[] = _( "Raises Sp. Atk, Sp. Def and\n" "Speed on the 2nd turn."); -static const u8 sMAGNETIC_FLUXDescription[] = _( +static const u8 sMagneticFluxDescription[] = _( "Boosts the defenses of\n" "those with Plus or Minus."); -static const u8 sHAPPY_HOURDescription[] = _( +static const u8 sHappyHourDescription[] = _( "Doubles the amount of\n" "Prize Money received."); -static const u8 sELECTRIC_TERRAINDescription[] = _( +static const u8 sElectricTerrainDescription[] = _( "Electrifies the ground for\n" "5 turns. Prevents sleep."); -static const u8 sDAZZLING_GLEAMDescription[] = _( +static const u8 sDazzlingGleamDescription[] = _( "Damages foes by emitting\n" "a bright flash."); -static const u8 sCELEBRATEDescription[] = _( +static const u8 sCelebrateDescription[] = _( "Congratulates you on your\n" "special day."); -static const u8 sHOLD_HANDSDescription[] = _( +static const u8 sHoldHandsDescription[] = _( "The user and ally hold hands\n" "making them happy."); -static const u8 sBABYDOLL_EYESDescription[] = _( +static const u8 sBabyDollEyesDescription[] = _( "Lowers the foe's Attack\n" "before it can move."); -static const u8 sNUZZLEDescription[] = _( +static const u8 sNuzzleDescription[] = _( "Rubs its cheecks against\n" "the foe, paralyzing it."); -static const u8 sINFESTATIONDescription[] = _( +static const u8 sInfestationDescription[] = _( "The foe is infested and\n" "attacked for 2 to 5 turns."); -static const u8 sPOWER_UP_PUNCHDescription[] = _( +static const u8 sPowerUpPunchDescription[] = _( "A hard punch that raises\n" "the user's Attack."); -static const u8 sTHOUSAND_ARROWSDescription[] = _( +static const u8 sThousandArrowsDescription[] = _( "Can hit Flying foes, then\n" "knocks them to the ground."); -static const u8 sTHOUSAND_WAVESDescription[] = _( +static const u8 sThousandWavesDescription[] = _( "Those hit by the wave can\n" "no longer escape."); -static const u8 sLANDS_WRATHDescription[] = _( +static const u8 sLandsWrathDescription[] = _( "Gathers the energy of the\n" "land to attack every foe."); -static const u8 sLIGHT_OF_RUINDescription[] = _( +static const u8 sLightOfRuinDescription[] = _( "Fires a great beam of light\n" "that also hurts the user."); -static const u8 sORIGIN_PULSEDescription[] = _( +static const u8 sOriginPulseDescription[] = _( "Beams of glowing blue light\n" "blast both foes."); -static const u8 sPRECIPICE_BLADESDescription[] = _( +static const u8 sPrecipiceBladesDescription[] = _( "Fearsome blades of stone\n" "attack both foes."); -static const u8 sLAVA_PLUMEDescription[] = _( +static const u8 sLavaPlumeDescription[] = _( "Scarlet flames torch\n" "everything around the user."); -static const u8 sLEAF_STORMDescription[] = _( +static const u8 sLeafStormDescription[] = _( "Whips up a storm of leaves.\n" "Harshly lowers the Sp. Atk."); -static const u8 sSHORE_UPDescription[] = _( +static const u8 sShoreUpDescription[] = _( "Restores the user's HP.\n" "More HP in a sandstorm."); -static const u8 sFIRST_IMPRESSIONDescription[] = _( +static const u8 sFirstImpressionDescription[] = _( "Hits hard and first.\n" "Only works first turn."); -static const u8 sBANEFUL_BUNKERDescription[] = _( +static const u8 sBanefulBunkerDescription[] = _( "Protects user and poisons\n" "foes on contact."); -static const u8 sSPIRIT_SHACKLEDescription[] = _( +static const u8 sSpiritShackleDescription[] = _( "After being hit, foes can\n" "no longer escape."); -static const u8 sDARKEST_LARIATDescription[] = _( +static const u8 sDarkestLariatDescription[] = _( "Swings the arms to strike\n" "It ignores stat changes."); -static const u8 sSPARKLING_ARIADescription[] = _( +static const u8 sSparklingAriaDescription[] = _( "Sings with bubbles. Cures\n" "burns on contact."); -static const u8 sICE_HAMMERDescription[] = _( +static const u8 sIceHammerDescription[] = _( "Swings the fist to strike.\n" "Lowers the user's Speed."); -static const u8 sFLORAL_HEALINGDescription[] = _( +static const u8 sFloralHealingDescription[] = _( "Restores an ally's HP.\n" "Heals more on grass."); -static const u8 sHIGH_HORSEPOWERDescription[] = _( +static const u8 sHighHorsepowerDescription[] = _( "Slams hard into the foe with\n" "its entire body."); -static const u8 sSTRENGTH_SAPDescription[] = _( +static const u8 sStrengthSapDescription[] = _( "Saps the foe's Attack to\n" "heal HP, then drops Attack."); -static const u8 sSOLAR_BLADEDescription[] = _( +static const u8 sSolarBladeDescription[] = _( "Charges first turn, then\n" "chops with a blade of light."); -static const u8 sLEAFAGEDescription[] = _( +static const u8 sLeafageDescription[] = _( "Attacks with a flurry of\n" "small leaves."); -static const u8 sSPOTLIGHTDescription[] = _( +static const u8 sSpotlightDescription[] = _( "Makes the foe attack the\n" "spotlighted Pokémon."); -static const u8 sTOXIC_THREADDescription[] = _( +static const u8 sToxicThreadDescription[] = _( "Attacks with a thread that\n" "poisons and drops Speed."); -static const u8 sLASER_FOCUSDescription[] = _( +static const u8 sLaserFocusDescription[] = _( "Guarantees the next move\n" "will be a critical hit."); -static const u8 sGEAR_UPDescription[] = _( +static const u8 sGearUpDescription[] = _( "Boosts the attacks of\n" "those with Plus or Minus."); -static const u8 sTHROAT_CHOPDescription[] = _( +static const u8 sThroatChopDescription[] = _( "Chops the throat to disable\n" "sound moves for a while."); -static const u8 sPOLLEN_PUFFDescription[] = _( +static const u8 sPollenPuffDescription[] = _( "Explodes on foes, but\n" "restores ally's HP."); -static const u8 sANCHOR_SHOTDescription[] = _( +static const u8 sAnchorShotDescription[] = _( "Strangles the foe with a\n" "chain. The foe can't escape."); -static const u8 sPSYCHIC_TERRAINDescription[] = _( +static const u8 sPsychicTerrainDescription[] = _( "The ground turns weird for\n" "5 turns. Blocks priority."); -static const u8 sLUNGEDescription[] = _( +static const u8 sLungeDescription[] = _( "Lunges at the foe to lower\n" "its Attack stat."); -static const u8 sFIRE_LASHDescription[] = _( +static const u8 sFireLashDescription[] = _( "Whips the foe with fire\n" "lowering its Defense."); -static const u8 sPOWER_TRIPDescription[] = _( +static const u8 sPowerTripDescription[] = _( "It hits harder the more\n" "stat boosts the user has."); -static const u8 sBURN_UPDescription[] = _( +static const u8 sBurnUpDescription[] = _( "Burns out the user fully\n" "removing the Fire type."); -static const u8 sSPEED_SWAPDescription[] = _( +static const u8 sSpeedSwapDescription[] = _( "Swaps user's Speed with\n" "the target's."); -static const u8 sSMART_STRIKEDescription[] = _( +static const u8 sSmartStrikeDescription[] = _( "Hits with an accurate\n" "horn that never misses."); -static const u8 sPURIFYDescription[] = _( +static const u8 sPurifyDescription[] = _( "Cures the foe's status\n" "to restore HP."); -static const u8 sREVELATION_DANCEDescription[] = _( +static const u8 sRevelationDanceDescription[] = _( "Dances with mystical power.\n" "Matches user's first type."); -static const u8 sCORE_ENFORCERDescription[] = _( +static const u8 sCoreEnforcerDescription[] = _( "Hits with a ray that\n" "nullifies the foe's ability."); -static const u8 sTROP_KICKDescription[] = _( +static const u8 sTropKickDescription[] = _( "An intense kick from the\n" "tropics. Lowers Attack."); -static const u8 sINSTRUCTDescription[] = _( +static const u8 sInstructDescription[] = _( "Orders the target to use\n" "its last move again."); -static const u8 sBEAK_BLASTDescription[] = _( +static const u8 sBeakBlastDescription[] = _( "Heats up beak to attack.\n" "Burns foe on contact."); -static const u8 sCLANGING_SCALESDescription[] = _( +static const u8 sClangingScalesDescription[] = _( "Makes a big noise with\n" "its scales. Drops Defense."); -static const u8 sDRAGON_HAMMERDescription[] = _( +static const u8 sDragonHammerDescription[] = _( "Swings its whole body\n" "like a hammer to damage."); -static const u8 sBRUTAL_SWINGDescription[] = _( +static const u8 sBrutalSwingDescription[] = _( "Violently swings around\n" "to hurt everyone nearby."); -static const u8 sAURORA_VEILDescription[] = _( +static const u8 sAuroraVeilDescription[] = _( "Weakens all attacks, but\n" "only usable with hail."); -static const u8 sSHELL_TRAPDescription[] = _( +static const u8 sShellTrapDescription[] = _( "Sets a shell trap that\n" "damages on contact."); -static const u8 sFLEUR_CANNONDescription[] = _( +static const u8 sFleurCannonDescription[] = _( "A strong ray that harshly\n" "lowers Sp. Attack."); -static const u8 sPSYCHIC_FANGSDescription[] = _( +static const u8 sPsychicFangsDescription[] = _( "Chomps with psychic fangs.\n" "Destroys any barriers."); -static const u8 sSTOMPING_TANTRUMDescription[] = _( +static const u8 sStompingTantrumDescription[] = _( "Stomps around angrily.\n" "Stronger after a failure."); -static const u8 sSHADOW_BONEDescription[] = _( +static const u8 sShadowBoneDescription[] = _( "Strikes with a haunted\n" "bone. Might drop Defense."); -static const u8 sACCELEROCKDescription[] = _( +static const u8 sAccelerockDescription[] = _( "Hits with a high-speed\n" "rock that always goes first."); -static const u8 sLIQUIDATIONDescription[] = _( +static const u8 sLiquidationDescription[] = _( "Slams the foe with water.\n" "Can lower Defense."); -static const u8 sPRISMATIC_LASERDescription[] = _( +static const u8 sPrismaticLaserDescription[] = _( "A high power laser that\n" "forces recharge next turn."); -static const u8 sSPECTRAL_THIEFDescription[] = _( +static const u8 sSpectralThiefDescription[] = _( "Steals the target's stat\n" "boosts, then attacks."); -static const u8 sSUNSTEEL_STRIKEDescription[] = _( +static const u8 sSunsteelStrikeDescription[] = _( "A sun-fueled strike that\n" "ignores abilities."); -static const u8 sMOONGEIST_BEAMDescription[] = _( +static const u8 sMoongeistBeamDescription[] = _( "A moon-powered beam that\n" "ignores abilities."); -static const u8 sTEARFUL_LOOKDescription[] = _( +static const u8 sTearfulLookDescription[] = _( "The user tears up, dropping\n" "Attack and Sp. Attack."); -static const u8 sZING_ZAPDescription[] = _( +static const u8 sZingZapDescription[] = _( "An electrified impact that\n" "can cause flinching."); -static const u8 sNATURES_MADNESSDescription[] = _( +static const u8 sNaturesMadnessDescription[] = _( "Halves the foe's HP with\n" "the power of nature."); -static const u8 sMULTI_ATTACKDescription[] = _( +static const u8 sMultiAttackDescription[] = _( "An attack that changes\n" "with Memories."); -static const u8 sMIND_BLOWNDescription[] = _( +static const u8 sMindBlownDescription[] = _( "It explodes the user's head\n" "to damage everything around."); -static const u8 sPLASMA_FISTSDescription[] = _( +static const u8 sPlasmaFistsDescription[] = _( "Hits with electrical fists.\n" "Normal moves become Electric."); -static const u8 sPHOTON_GEYSERDescription[] = _( +static const u8 sPhotonGeyserDescription[] = _( "User's highest attack stat\n" "determines its category."); -static const u8 sZIPPY_ZAPDescription[] = _( +static const u8 sZippyZapDescription[] = _( "Electric bursts always go\n" "first and land a critical hit."); -static const u8 sSPLISHY_SPLASHDescription[] = _( +static const u8 sSplishySplashDescription[] = _( "A huge electrified wave that\n" "may paralyze the foe."); -static const u8 sFLOATY_FALLDescription[] = _( +static const u8 sFloatyFallDescription[] = _( "Floats in air and dives at\n" "angle. May cause flinching."); -static const u8 sPIKA_PAPOWDescription[] = _( +static const u8 sPikaPapowDescription[] = _( "Pikachu's love increases its\n" "power. It never misses."); -static const u8 sBOUNCY_BUBBLEDescription[] = _( +static const u8 sBouncyBubbleDescription[] = _( "An attack that absorbs\n" #if B_UPDATED_MOVE_DATA >= GEN_8 "all the damage inflicted."); @@ -2645,300 +2645,300 @@ static const u8 sBOUNCY_BUBBLEDescription[] = _( "half the damage inflicted."); #endif -static const u8 sBUZZY_BUZZDescription[] = _( +static const u8 sBuzzyBuzzDescription[] = _( "Shoots a jolt of electricity\n" "that always paralyzes."); -static const u8 sSIZZLY_SLIDEDescription[] = _( +static const u8 sSizzlySlideDescription[] = _( "User cloaked in fire charges.\n" "Leaves the foe with a burn."); -static const u8 sGLITZY_GLOWDescription[] = _( +static const u8 sGlitzyGlowDescription[] = _( "Telekinetic force that sets\n" "wall, lowering Sp. Atk damage."); -static const u8 sBADDY_BADDescription[] = _( +static const u8 sBaddyBadDescription[] = _( "Acting badly, attacks. Sets\n" "wall, lowering Attack damage."); -static const u8 sSAPPY_SEEDDescription[] = _( +static const u8 sSappySeedDescription[] = _( "Giant stalk scatters seeds\n" "that drain HP every turn."); -static const u8 sFREEZY_FROSTDescription[] = _( +static const u8 sFreezyFrostDescription[] = _( "Crystal from cold haze hits.\n" "Eliminates all stat changes."); -static const u8 sSPARKLY_SWIRLDescription[] = _( +static const u8 sSparklySwirlDescription[] = _( "Wrap foe with whirlwind of\n" "scent. Heals party's status."); -static const u8 sVEEVEE_VOLLEYDescription[] = _( +static const u8 sVeeveeVolleyDescription[] = _( "Eevee's love increases its\n" "power. It never misses."); -static const u8 sDOUBLE_IRON_BASHDescription[] = _( +static const u8 sDoubleIronBashDescription[] = _( "The user spins and hits with\n" "its arms. May cause flinch."); // GEN 8 -static const u8 sDYNAMAX_CANNONDescription[] = _( +static const u8 sDynamaxCannonDescription[] = _( "Fires a strong beam. Deals\n" "2x damage to Dynamaxed foes."); -static const u8 sSNIPE_SHOTDescription[] = _( +static const u8 sSnipeShotDescription[] = _( "The user ignores effects\n" "that draw in moves."); -static const u8 sJAW_LOCKDescription[] = _( +static const u8 sJawLockDescription[] = _( "Prevents the user and\n" "the target from escaping."); -static const u8 sSTUFF_CHEEKSDescription[] = _( +static const u8 sStuffCheeksDescription[] = _( "Consumes the user's Berry,\n" "then sharply raises Def."); -static const u8 sNO_RETREATDescription[] = _( +static const u8 sNoRetreatDescription[] = _( "Raises all of the user's\n" "stats but prevents escape."); -static const u8 sTAR_SHOTDescription[] = _( +static const u8 sTarShotDescription[] = _( "Lowers the foe's Speed and\n" "makes it weak to Fire."); -static const u8 sMAGIC_POWDERDescription[] = _( +static const u8 sMagicPowderDescription[] = _( "Magic powder changes the\n" "target into a Psychic-type."); -static const u8 sDRAGON_DARTSDescription[] = _( +static const u8 sDragonDartsDescription[] = _( "The user attacks twice. Two\n" "targets are hit once each."); -static const u8 sTEATIMEDescription[] = _( +static const u8 sTeatimeDescription[] = _( "All Pokémon have teatime\n" "and eat their Berries."); -static const u8 sOCTOLOCKDescription[] = _( +static const u8 sOctolockDescription[] = _( "Traps the foe to lower Def\n" "and Sp. Def fall each turn."); -static const u8 sBOLT_BEAKDescription[] = _( +static const u8 sBoltBeakDescription[] = _( "Double power if the user\n" "moves before the target."); -static const u8 sFISHIOUS_RENDDescription[] = _( +static const u8 sFishiousRendDescription[] = _( "Double power if the user\n" "moves before the target."); -static const u8 sCOURT_CHANGEDescription[] = _( +static const u8 sCourtChangeDescription[] = _( "The user swaps effects on\n" "either side of the field."); -static const u8 sCLANGOROUS_SOULDescription[] = _( +static const u8 sClangorousSoulDescription[] = _( "The user uses some of its\n" "HP to raise all its stats."); -static const u8 sBODY_PRESSDescription[] = _( +static const u8 sBodyPressDescription[] = _( "Does more damage the\n" "higher the user's Def."); -static const u8 sDECORATEDescription[] = _( +static const u8 sDecorateDescription[] = _( "The user sharply raises\n" "the target's Atk and Sp.Atk"); -static const u8 sDRUM_BEATINGDescription[] = _( +static const u8 sDrumBeatingDescription[] = _( "Plays a drum to attack.\n" "The foe's Speed is lowered."); -static const u8 sSNAP_TRAPDescription[] = _( +static const u8 sSnapTrapDescription[] = _( "Snares the target in a snap\n" "trap for four to five turns."); -static const u8 sPYRO_BALLDescription[] = _( +static const u8 sPyroBallDescription[] = _( "Launches a fiery ball at the\n" "target. It may cause a burn."); -static const u8 sBEHEMOTH_BLADEDescription[] = _( +static const u8 sBehemothBladeDescription[] = _( "Strikes as a sword. It deals\n" "2x damage to Dynamaxed foes."); -static const u8 sBEHEMOTH_BASHDescription[] = _( +static const u8 sBehemothBashDescription[] = _( "Attacks as a sheild. Deals\n" "2x damage to Dynamaxed foes."); -static const u8 sAURA_WHEELDescription[] = _( +static const u8 sAuraWheelDescription[] = _( "Raises Speed to attack. The\n" "Type is based on its form."); -static const u8 sBREAKING_SWIPEDescription[] = _( +static const u8 sBreakingSwipeDescription[] = _( "Swings its tail to attack.\n" "Lowers the Atk of those hit."); -static const u8 sBRANCH_POKEDescription[] = _( +static const u8 sBranchPokeDescription[] = _( "The user pokes the target\n" "with a pointed branch."); -static const u8 sOVERDRIVEDescription[] = _( +static const u8 sOverdriveDescription[] = _( "The user twangs its guitar,\n" "causing strong vibrations."); -static const u8 sAPPLE_ACIDDescription[] = _( +static const u8 sAppleAcidDescription[] = _( "Attacks with tart apple acid\n" "to lower the foe's Sp. Def."); -static const u8 sGRAV_APPLEDescription[] = _( +static const u8 sGravAppleDescription[] = _( "Drops an apple from above.\n" "Lowers the foe's Defense."); -static const u8 sSPIRIT_BREAKDescription[] = _( +static const u8 sSpiritBreakDescription[] = _( "Attacks with spirit-breaking\n" "force. Lowers Sp. Atk."); -static const u8 sSTRANGE_STEAMDescription[] = _( +static const u8 sStrangeSteamDescription[] = _( "Emits a strange steam to\n" "potentially confuse the foe."); -static const u8 sLIFE_DEWDescription[] = _( +static const u8 sLifeDewDescription[] = _( "Scatters water to restore\n" "the HP of itself and allies."); -static const u8 sOBSTRUCTDescription[] = _( +static const u8 sObstructDescription[] = _( "Protects itself, harshly\n" "lowering Def on contact."); -static const u8 sFALSE_SURRENDERDescription[] = _( +static const u8 sFalseSurrenderDescription[] = _( "Bows to stab the foe\n" "with hair. It never misses."); -static const u8 sMETEOR_ASSAULTDescription[] = _( +static const u8 sMeteorAssaultDescription[] = _( "Attacks with a thick leek.\n" "The user must then rest."); -static const u8 sETERNABEAMDescription[] = _( +static const u8 sEternabeamDescription[] = _( "Eternatus' strongest move.\n" "The user rests next turn."); -static const u8 sSTEEL_BEAMDescription[] = _( +static const u8 sSteelBeamDescription[] = _( "Fires a beam of steel from\n" "its body. It hurts the user."); -static const u8 sEXPANDING_FORCEDescription[] = _( +static const u8 sExpandingForceDescription[] = _( "Power goes up and damages\n" "all foes on Psychic Terrain."); -static const u8 sSTEEL_ROLLERDescription[] = _( +static const u8 sSteelRollerDescription[] = _( "Destroys terrain. Fails if\n" "ground isn't terrain."); -static const u8 sSCALE_SHOTDescription[] = _( +static const u8 sScaleShotDescription[] = _( "Shoots scales 2 to 5 times.\n" "Ups Speed, lowers defense."); -static const u8 sMETEOR_BEAMDescription[] = _( +static const u8 sMeteorBeamDescription[] = _( "A 2-turn move that raises\n" "Sp. Attack before attacking."); -static const u8 sSHELL_SIDE_ARMDescription[] = _( +static const u8 sShellSideArmDescription[] = _( "Deals better of physical and\n" "special damage. May poison."); -static const u8 sMISTY_EXPLOSIONDescription[] = _( +static const u8 sMistyExplosionDescription[] = _( "Hit everything and faint.\n" "Powers up on Misty Terrain."); -static const u8 sGRASSY_GLIDEDescription[] = _( +static const u8 sGrassyGlideDescription[] = _( "Gliding on ground, hits. Goes\n" "first on Grassy Terrain."); -static const u8 sRISING_VOLTAGEDescription[] = _( +static const u8 sRisingVoltageDescription[] = _( "This move's power doubles\n" "when on Electric Terrain."); -static const u8 sTERRAIN_PULSEDescription[] = _( +static const u8 sTerrainPulseDescription[] = _( "Type and power changes\n" "depending on the terrain."); -static const u8 sSKITTER_SMACKDescription[] = _( +static const u8 sSkitterSmackDescription[] = _( "User skitters behind foe to\n" "attack. Lowers foe's Sp. Atk."); -static const u8 sBURNING_JEALOUSYDescription[] = _( +static const u8 sBurningJealousyDescription[] = _( "Foes that have stats upped\n" "during the turn get burned."); -static const u8 sLASH_OUTDescription[] = _( +static const u8 sLashOutDescription[] = _( "If stats lowered during this\n" "turn, power is doubled."); -static const u8 sPOLTERGEISTDescription[] = _( +static const u8 sPoltergeistDescription[] = _( "Control foe's item to attack.\n" "Fails if foe has no item."); -static const u8 sCORROSIVE_GASDescription[] = _( +static const u8 sCorrosiveGasDescription[] = _( "Highly acidic gas melts items\n" "held by surrounding Pokémon."); -static const u8 sCOACHINGDescription[] = _( +static const u8 sCoachingDescription[] = _( "Properly coaches allies to\n" "up their Attack and Defense."); -static const u8 sFLIP_TURNDescription[] = _( +static const u8 sFlipTurnDescription[] = _( "Attacks and rushes back to\n" "switch with a party Pokémon."); -static const u8 sTRIPLE_AXELDescription[] = _( +static const u8 sTripleAxelDescription[] = _( "A 3-kick attack that gets\n" "more powerful with each hit."); -static const u8 sDUAL_WINGBEATDescription[] = _( +static const u8 sDualWingbeatDescription[] = _( "User slams the target with\n" "wings and hits twice in a row."); -static const u8 sSCORCHING_SANDSDescription[] = _( +static const u8 sScorchingSandsDescription[] = _( "Throws scorching sand at\n" "the target. May leave a burn."); -static const u8 sJUNGLE_HEALINGDescription[] = _( +static const u8 sJungleHealingDescription[] = _( "Heals HP and status of\n" "itself and allies in battle."); -static const u8 sWICKED_BLOWDescription[] = _( +static const u8 sWickedBlowDescription[] = _( "Mastering the Dark style,\n" "strikes with a critical hit."); -static const u8 sSURGING_STRIKESDescription[] = _( +static const u8 sSurgingStrikesDescription[] = _( "Mastering the Water style,\n" "strikes with 3 critical hits."); -static const u8 sTHUNDER_CAGEDescription[] = _( +static const u8 sThunderCageDescription[] = _( "Traps the foe in a cage of\n" "electricity for 2 to 5 turns."); -static const u8 sDRAGON_ENERGYDescription[] = _( +static const u8 sDragonEnergyDescription[] = _( "The higher the user's HP\n" "the more damage caused."); -static const u8 sFREEZING_GLAREDescription[] = _( +static const u8 sFreezingGlareDescription[] = _( "Shoots psychic power from\n" "the eyes. May freeze the foe."); -static const u8 sFIERY_WRATHDescription[] = _( +static const u8 sFieryWrathDescription[] = _( "An attack fueled by your\n" "wrath. May cause flinching."); -static const u8 sTHUNDEROUS_KICKDescription[] = _( +static const u8 sThunderousKickDescription[] = _( "Uses a lightning-like kick\n" "to hit. Lowers foe's Defense."); -static const u8 sGLACIAL_LANCEDescription[] = _( +static const u8 sGlacialLanceDescription[] = _( "Strikes by hurling a blizzard-\n" "cloaked icicle lance at a foe."); -static const u8 sASTRAL_BARRAGEDescription[] = _( +static const u8 sAstralBarrageDescription[] = _( "Strikes by sending a frightful\n" "amount of ghosts at a foe."); -static const u8 sEERIE_SPELLDescription[] = _( +static const u8 sEerieSpellDescription[] = _( "Attacks with psychic power.\n" "Foe's last move has 3 PP cut."); @@ -3302,406 +3302,406 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_WATER_PULSE - 1] = sWaterPulseDescription, [MOVE_DOOM_DESIRE - 1] = sDoomDesireDescription, [MOVE_PSYCHO_BOOST - 1] = sPsychoBoostDescription, - [MOVE_ROOST - 1] = sROOSTDescription, - [MOVE_GRAVITY - 1] = sGRAVITYDescription, - [MOVE_MIRACLE_EYE - 1] = sMIRACLE_EYEDescription, - [MOVE_WAKE_UP_SLAP - 1] = sWAKE_UP_SLAPDescription, - [MOVE_HAMMER_ARM - 1] = sHAMMER_ARMDescription, - [MOVE_GYRO_BALL - 1] = sGYRO_BALLDescription, - [MOVE_HEALING_WISH - 1] = sHEALING_WISHDescription, - [MOVE_BRINE - 1] = sBRINEDescription, - [MOVE_NATURAL_GIFT - 1] = sNATURAL_GIFTDescription, - [MOVE_FEINT - 1] = sFEINTDescription, - [MOVE_PLUCK - 1] = sPLUCKDescription, - [MOVE_TAILWIND - 1] = sTAILWINDDescription, - [MOVE_ACUPRESSURE - 1] = sACUPRESSUREDescription, - [MOVE_METAL_BURST - 1] = sMETAL_BURSTDescription, - [MOVE_U_TURN - 1] = sU_TURNDescription, - [MOVE_CLOSE_COMBAT - 1] = sCLOSE_COMBATDescription, - [MOVE_PAYBACK - 1] = sPAYBACKDescription, - [MOVE_ASSURANCE - 1] = sASSURANCEDescription, - [MOVE_EMBARGO - 1] = sEMBARGODescription, - [MOVE_FLING - 1] = sFLINGDescription, - [MOVE_PSYCHO_SHIFT - 1] = sPSYCHO_SHIFTDescription, - [MOVE_TRUMP_CARD - 1] = sTRUMP_CARDDescription, - [MOVE_HEAL_BLOCK - 1] = sHEAL_BLOCKDescription, - [MOVE_WRING_OUT - 1] = sWRING_OUTDescription, - [MOVE_POWER_TRICK - 1] = sPOWER_TRICKDescription, - [MOVE_GASTRO_ACID - 1] = sGASTRO_ACIDDescription, - [MOVE_LUCKY_CHANT - 1] = sLUCKY_CHANTDescription, - [MOVE_ME_FIRST - 1] = sME_FIRSTDescription, - [MOVE_COPYCAT - 1] = sCOPYCATDescription, - [MOVE_POWER_SWAP - 1] = sPOWER_SWAPDescription, - [MOVE_GUARD_SWAP - 1] = sGUARD_SWAPDescription, - [MOVE_PUNISHMENT - 1] = sPUNISHMENTDescription, - [MOVE_LAST_RESORT - 1] = sLAST_RESORTDescription, - [MOVE_WORRY_SEED - 1] = sWORRY_SEEDDescription, - [MOVE_SUCKER_PUNCH - 1] = sSUCKER_PUNCHDescription, - [MOVE_TOXIC_SPIKES - 1] = sTOXIC_SPIKESDescription, - [MOVE_HEART_SWAP - 1] = sHEART_SWAPDescription, - [MOVE_AQUA_RING - 1] = sAQUA_RINGDescription, - [MOVE_MAGNET_RISE - 1] = sMAGNET_RISEDescription, - [MOVE_FLARE_BLITZ - 1] = sFLARE_BLITZDescription, - [MOVE_FORCE_PALM - 1] = sFORCE_PALMDescription, - [MOVE_AURA_SPHERE - 1] = sAURA_SPHEREDescription, - [MOVE_ROCK_POLISH - 1] = sROCK_POLISHDescription, - [MOVE_POISON_JAB - 1] = sPOISON_JABDescription, - [MOVE_DARK_PULSE - 1] = sDARK_PULSEDescription, - [MOVE_NIGHT_SLASH - 1] = sNIGHT_SLASHDescription, - [MOVE_AQUA_TAIL - 1] = sAQUA_TAILDescription, - [MOVE_SEED_BOMB - 1] = sSEED_BOMBDescription, - [MOVE_AIR_SLASH - 1] = sAIR_SLASHDescription, - [MOVE_X_SCISSOR - 1] = sX_SCISSORDescription, - [MOVE_BUG_BUZZ - 1] = sBUG_BUZZDescription, - [MOVE_DRAGON_PULSE - 1] = sDRAGON_PULSEDescription, - [MOVE_DRAGON_RUSH - 1] = sDRAGON_RUSHDescription, - [MOVE_POWER_GEM - 1] = sPOWER_GEMDescription, - [MOVE_DRAIN_PUNCH - 1] = sDRAINING_KISSDescription, - [MOVE_VACUUM_WAVE - 1] = sVACUUM_WAVEDescription, - [MOVE_FOCUS_BLAST - 1] = sFOCUS_BLASTDescription, - [MOVE_ENERGY_BALL - 1] = sENERGY_BALLDescription, - [MOVE_BRAVE_BIRD - 1] = sBRAVE_BIRDDescription, - [MOVE_EARTH_POWER - 1] = sEARTH_POWERDescription, - [MOVE_SWITCHEROO - 1] = sSWITCHEROODescription, + [MOVE_ROOST - 1] = sRoostDescription, + [MOVE_GRAVITY - 1] = sGravityDescription, + [MOVE_MIRACLE_EYE - 1] = sMiracleEyeDescription, + [MOVE_WAKE_UP_SLAP - 1] = sWakeUpSlapDescription, + [MOVE_HAMMER_ARM - 1] = sHammerArmDescription, + [MOVE_GYRO_BALL - 1] = sGyroBallDescription, + [MOVE_HEALING_WISH - 1] = sHealingWishDescription, + [MOVE_BRINE - 1] = sBrineDescription, + [MOVE_NATURAL_GIFT - 1] = sNaturalGiftDescription, + [MOVE_FEINT - 1] = sFeintDescription, + [MOVE_PLUCK - 1] = sPluckDescription, + [MOVE_TAILWIND - 1] = sTailwindDescription, + [MOVE_ACUPRESSURE - 1] = sAcupressureDescription, + [MOVE_METAL_BURST - 1] = sMetalBurstDescription, + [MOVE_U_TURN - 1] = sUTurnDescription, + [MOVE_CLOSE_COMBAT - 1] = sCloseCombatDescription, + [MOVE_PAYBACK - 1] = sPaybackDescription, + [MOVE_ASSURANCE - 1] = sAssuranceDescription, + [MOVE_EMBARGO - 1] = sEmbargoDescription, + [MOVE_FLING - 1] = sFlingDescription, + [MOVE_PSYCHO_SHIFT - 1] = sPsychoShiftDescription, + [MOVE_TRUMP_CARD - 1] = sTrumpCardDescription, + [MOVE_HEAL_BLOCK - 1] = sHealBlockDescription, + [MOVE_WRING_OUT - 1] = sWringOutDescription, + [MOVE_POWER_TRICK - 1] = sPowerTrickDescription, + [MOVE_GASTRO_ACID - 1] = sGastroAcidDescription, + [MOVE_LUCKY_CHANT - 1] = sLuckyChantDescription, + [MOVE_ME_FIRST - 1] = sMeFirstDescription, + [MOVE_COPYCAT - 1] = sCopycatDescription, + [MOVE_POWER_SWAP - 1] = sPowerSwapDescription, + [MOVE_GUARD_SWAP - 1] = sGuardSwapDescription, + [MOVE_PUNISHMENT - 1] = sPunishmentDescription, + [MOVE_LAST_RESORT - 1] = sLastResortDescription, + [MOVE_WORRY_SEED - 1] = sWorrySeedDescription, + [MOVE_SUCKER_PUNCH - 1] = sSuckerPunchDescription, + [MOVE_TOXIC_SPIKES - 1] = sToxicSpikesDescription, + [MOVE_HEART_SWAP - 1] = sHeartSwapDescription, + [MOVE_AQUA_RING - 1] = sAquaRingDescription, + [MOVE_MAGNET_RISE - 1] = sMagnetRiseDescription, + [MOVE_FLARE_BLITZ - 1] = sFlareBlitzDescription, + [MOVE_FORCE_PALM - 1] = sForcePalmDescription, + [MOVE_AURA_SPHERE - 1] = sAuraSphereDescription, + [MOVE_ROCK_POLISH - 1] = sRockPolishDescription, + [MOVE_POISON_JAB - 1] = sPoisonJabDescription, + [MOVE_DARK_PULSE - 1] = sDarkPulseDescription, + [MOVE_NIGHT_SLASH - 1] = sNightSlashDescription, + [MOVE_AQUA_TAIL - 1] = sAquaTailDescription, + [MOVE_SEED_BOMB - 1] = sSeedBombDescription, + [MOVE_AIR_SLASH - 1] = sAirSlashDescription, + [MOVE_X_SCISSOR - 1] = sXScissorDescription, + [MOVE_BUG_BUZZ - 1] = sBugBuzzDescription, + [MOVE_DRAGON_PULSE - 1] = sDragonPulseDescription, + [MOVE_DRAGON_RUSH - 1] = sDragonRushDescription, + [MOVE_POWER_GEM - 1] = sPowerGemDescription, + [MOVE_DRAIN_PUNCH - 1] = sDrainingKissDescription, + [MOVE_VACUUM_WAVE - 1] = sVacuumWaveDescription, + [MOVE_FOCUS_BLAST - 1] = sFocusBlastDescription, + [MOVE_ENERGY_BALL - 1] = sEnergyBallDescription, + [MOVE_BRAVE_BIRD - 1] = sBraveBirdDescription, + [MOVE_EARTH_POWER - 1] = sEarthPowerDescription, + [MOVE_SWITCHEROO - 1] = sSwitcherooDescription, [MOVE_GIGA_IMPACT - 1] = sHyperBeamDescription, - [MOVE_NASTY_PLOT - 1] = sNASTY_PLOTDescription, - [MOVE_BULLET_PUNCH - 1] = sBULLET_PUNCHDescription, + [MOVE_NASTY_PLOT - 1] = sNastyPlotDescription, + [MOVE_BULLET_PUNCH - 1] = sBulletPunchDescription, [MOVE_AVALANCHE - 1] = sRevengeDescription, - [MOVE_ICE_SHARD - 1] = sICE_SHARDDescription, - [MOVE_SHADOW_CLAW - 1] = sSHADOW_CLAWDescription, - [MOVE_THUNDER_FANG - 1] = sTHUNDER_FANGDescription, - [MOVE_ICE_FANG - 1] = sICE_FANGDescription, - [MOVE_FIRE_FANG - 1] = sFIRE_FANGDescription, - [MOVE_SHADOW_SNEAK - 1] = sSHADOW_SNEAKDescription, - [MOVE_MUD_BOMB - 1] = sMUD_BOMBDescription, - [MOVE_PSYCHO_CUT - 1] = sPSYCHO_CUTDescription, - [MOVE_ZEN_HEADBUTT - 1] = sZEN_HEADBUTTDescription, - [MOVE_MIRROR_SHOT - 1] = sMIRROR_SHOTDescription, - [MOVE_FLASH_CANNON - 1] = sFLASH_CANNONDescription, - [MOVE_ROCK_CLIMB - 1] = sROCK_CLIMBDescription, - [MOVE_DEFOG - 1] = sDEFOGDescription, - [MOVE_TRICK_ROOM - 1] = sTRICK_ROOMDescription, - [MOVE_DRACO_METEOR - 1] = sDRACO_METEORDescription, - [MOVE_DISCHARGE - 1] = sDISCHARGEDescription, - [MOVE_LAVA_PLUME - 1] = sLAVA_PLUMEDescription, - [MOVE_LEAF_STORM - 1] = sLEAF_STORMDescription, - [MOVE_POWER_WHIP - 1] = sPOWER_WHIPDescription, + [MOVE_ICE_SHARD - 1] = sIceShardDescription, + [MOVE_SHADOW_CLAW - 1] = sShadowClawDescription, + [MOVE_THUNDER_FANG - 1] = sThunderFangDescription, + [MOVE_ICE_FANG - 1] = sIceFangDescription, + [MOVE_FIRE_FANG - 1] = sFireFangDescription, + [MOVE_SHADOW_SNEAK - 1] = sShadowSneakDescription, + [MOVE_MUD_BOMB - 1] = sMudBombDescription, + [MOVE_PSYCHO_CUT - 1] = sPsychoCutDescription, + [MOVE_ZEN_HEADBUTT - 1] = sZenHeadbuttDescription, + [MOVE_MIRROR_SHOT - 1] = sMirrorShotDescription, + [MOVE_FLASH_CANNON - 1] = sFlashCannonDescription, + [MOVE_ROCK_CLIMB - 1] = sRockClimbDescription, + [MOVE_DEFOG - 1] = sDefogDescription, + [MOVE_TRICK_ROOM - 1] = sTrickRoomDescription, + [MOVE_DRACO_METEOR - 1] = sDracoMeteorDescription, + [MOVE_DISCHARGE - 1] = sDischargeDescription, + [MOVE_LAVA_PLUME - 1] = sLavaPlumeDescription, + [MOVE_LEAF_STORM - 1] = sLeafStormDescription, + [MOVE_POWER_WHIP - 1] = sPowerWhipDescription, [MOVE_ROCK_WRECKER - 1] = sHyperBeamDescription, - [MOVE_CROSS_POISON - 1] = sCROSS_POISONDescription, - [MOVE_GUNK_SHOT - 1] = sGUNK_SHOTDescription, - [MOVE_IRON_HEAD - 1] = sIRON_HEADDescription, - [MOVE_MAGNET_BOMB - 1] = sMAGNET_BOMBDescription, - [MOVE_STONE_EDGE - 1] = sSTONE_EDGEDescription, - [MOVE_CAPTIVATE - 1] = sCAPTIVATEDescription, - [MOVE_STEALTH_ROCK - 1] = sSTEALTH_ROCKDescription, - [MOVE_GRASS_KNOT - 1] = sGRASS_KNOTDescription, - [MOVE_CHATTER - 1] = sCHATTERDescription, - [MOVE_JUDGMENT - 1] = sJUDGMENTDescription, - [MOVE_BUG_BITE - 1] = sPLUCKDescription, - [MOVE_CHARGE_BEAM - 1] = sCHARGE_BEAMDescription, - [MOVE_WOOD_HAMMER - 1] = sWOOD_HAMMERDescription, - [MOVE_AQUA_JET - 1] = sAQUA_JETDescription, - [MOVE_ATTACK_ORDER - 1] = sATTACK_ORDERDescription, - [MOVE_DEFEND_ORDER - 1] = sDEFEND_ORDERDescription, - [MOVE_HEAL_ORDER - 1] = sHEAL_ORDERDescription, - [MOVE_HEAD_SMASH - 1] = sHEAD_SMASHDescription, - [MOVE_DOUBLE_HIT - 1] = sDOUBLE_HITDescription, - [MOVE_ROAR_OF_TIME - 1] = sROAR_OF_TIMEDescription, - [MOVE_SPACIAL_REND - 1] = sSPACIAL_RENDDescription, - [MOVE_LUNAR_DANCE - 1] = sHEALING_WISHDescription, - [MOVE_CRUSH_GRIP - 1] = sWRING_OUTDescription, - [MOVE_MAGMA_STORM - 1] = sMAGMA_STORMDescription, - [MOVE_DARK_VOID - 1] = sDARK_VOIDDescription, - [MOVE_SEED_FLARE - 1] = sSEED_FLAREDescription, - [MOVE_OMINOUS_WIND - 1] = sOMINOUS_WINDDescription, - [MOVE_SHADOW_FORCE - 1] = sSHADOW_FORCEDescription, - [MOVE_HONE_CLAWS - 1] = sHONE_CLAWSDescription, - [MOVE_WIDE_GUARD - 1] = sWIDE_GUARDDescription, - [MOVE_GUARD_SPLIT - 1] = sGUARD_SPLITDescription, - [MOVE_POWER_SPLIT - 1] = sPOWER_SPLITDescription, - [MOVE_WONDER_ROOM - 1] = sWONDER_ROOMDescription, - [MOVE_PSYSHOCK - 1] = sPSYSHOCKDescription, - [MOVE_VENOSHOCK - 1] = sVENOSHOCKDescription, - [MOVE_AUTOTOMIZE - 1] = sAUTOTOMIZEDescription, - [MOVE_RAGE_POWDER - 1] = sRAGE_POWDERDescription, - [MOVE_TELEKINESIS - 1] = sTELEKINESISDescription, - [MOVE_MAGIC_ROOM - 1] = sMAGIC_ROOMDescription, - [MOVE_SMACK_DOWN - 1] = sSMACK_DOWNDescription, - [MOVE_STORM_THROW - 1] = sSTORM_THROWDescription, - [MOVE_FLAME_BURST - 1] = sFLAME_BURSTDescription, - [MOVE_SLUDGE_WAVE - 1] = sSLUDGE_WAVEDescription, - [MOVE_QUIVER_DANCE - 1] = sQUIVER_DANCEDescription, - [MOVE_HEAVY_SLAM - 1] = sHEAVY_SLAMDescription, - [MOVE_SYNCHRONOISE - 1] = sSYNCHRONOISEDescription, - [MOVE_ELECTRO_BALL - 1] = sELECTRO_BALLDescription, - [MOVE_SOAK - 1] = sSOAKDescription, - [MOVE_FLAME_CHARGE - 1] = sFLAME_CHARGEDescription, - [MOVE_COIL - 1] = sCOILDescription, - [MOVE_LOW_SWEEP - 1] = sLOW_SWEEPDescription, - [MOVE_ACID_SPRAY - 1] = sACID_SPRAYDescription, - [MOVE_FOUL_PLAY - 1] = sFOUL_PLAYDescription, - [MOVE_SIMPLE_BEAM - 1] = sSIMPLE_BEAMDescription, - [MOVE_ENTRAINMENT - 1] = sENTRAINMENTDescription, - [MOVE_AFTER_YOU - 1] = sAFTER_YOUDescription, - [MOVE_ROUND - 1] = sROUNDDescription, - [MOVE_ECHOED_VOICE - 1] = sECHOED_VOICEDescription, - [MOVE_CHIP_AWAY - 1] = sCHIP_AWAYDescription, - [MOVE_CLEAR_SMOG - 1] = sCLEAR_SMOGDescription, - [MOVE_STORED_POWER - 1] = sSTORED_POWERDescription, - [MOVE_QUICK_GUARD - 1] = sQUICK_GUARDDescription, - [MOVE_ALLY_SWITCH - 1] = sALLY_SWITCHDescription, - [MOVE_SCALD - 1] = sSCALDDescription, - [MOVE_SHELL_SMASH - 1] = sSHELL_SMASHDescription, - [MOVE_HEAL_PULSE - 1] = sHEAL_PULSEDescription, - [MOVE_HEX - 1] = sHEXDescription, - [MOVE_SKY_DROP - 1] = sSKY_DROPDescription, - [MOVE_SHIFT_GEAR - 1] = sSHIFT_GEARDescription, - [MOVE_CIRCLE_THROW - 1] = sCIRCLE_THROWDescription, - [MOVE_INCINERATE - 1] = sINCINERATEDescription, - [MOVE_QUASH - 1] = sQUASHDescription, - [MOVE_ACROBATICS - 1] = sACROBATICSDescription, - [MOVE_REFLECT_TYPE - 1] = sREFLECT_TYPEDescription, - [MOVE_RETALIATE - 1] = sRETALIATEDescription, - [MOVE_FINAL_GAMBIT - 1] = sFINAL_GAMBITDescription, - [MOVE_BESTOW - 1] = sBESTOWDescription, - [MOVE_INFERNO - 1] = sINFERNODescription, - [MOVE_WATER_PLEDGE - 1] = sWATER_PLEDGEDescription, - [MOVE_FIRE_PLEDGE - 1] = sFIRE_PLEDGEDescription, - [MOVE_GRASS_PLEDGE - 1] = sGRASS_PLEDGEDescription, - [MOVE_VOLT_SWITCH - 1] = sU_TURNDescription, - [MOVE_STRUGGLE_BUG - 1] = sSTRUGGLE_BUGDescription, - [MOVE_BULLDOZE - 1] = sBULLDOZEDescription, - [MOVE_FROST_BREATH - 1] = sSTORM_THROWDescription, - [MOVE_DRAGON_TAIL - 1] = sCIRCLE_THROWDescription, - [MOVE_WORK_UP - 1] = sWORK_UPDescription, - [MOVE_ELECTROWEB - 1] = sELECTROWEBDescription, - [MOVE_WILD_CHARGE - 1] = sWILD_CHARGEDescription, - [MOVE_DRILL_RUN - 1] = sDRILL_RUNDescription, - [MOVE_DUAL_CHOP - 1] = sDUAL_CHOPDescription, - [MOVE_HEART_STAMP - 1] = sHEART_STAMPDescription, + [MOVE_CROSS_POISON - 1] = sCrossPoisonDescription, + [MOVE_GUNK_SHOT - 1] = sGunkShotDescription, + [MOVE_IRON_HEAD - 1] = sIronHeadDescription, + [MOVE_MAGNET_BOMB - 1] = sMagnetBombDescription, + [MOVE_STONE_EDGE - 1] = sStoneEdgeDescription, + [MOVE_CAPTIVATE - 1] = sCaptivateDescription, + [MOVE_STEALTH_ROCK - 1] = sStealthRockDescription, + [MOVE_GRASS_KNOT - 1] = sGrassKnotDescription, + [MOVE_CHATTER - 1] = sChatterDescription, + [MOVE_JUDGMENT - 1] = sJudgmentDescription, + [MOVE_BUG_BITE - 1] = sPluckDescription, + [MOVE_CHARGE_BEAM - 1] = sChargeBeamDescription, + [MOVE_WOOD_HAMMER - 1] = sWoodHammerDescription, + [MOVE_AQUA_JET - 1] = sAquaJetDescription, + [MOVE_ATTACK_ORDER - 1] = sAttackOrderDescription, + [MOVE_DEFEND_ORDER - 1] = sDefendOrderDescription, + [MOVE_HEAL_ORDER - 1] = sHealOrderDescription, + [MOVE_HEAD_SMASH - 1] = sHeadSmashDescription, + [MOVE_DOUBLE_HIT - 1] = sDoubleHitDescription, + [MOVE_ROAR_OF_TIME - 1] = sRoarOfTimeDescription, + [MOVE_SPACIAL_REND - 1] = sSpacialRendDescription, + [MOVE_LUNAR_DANCE - 1] = sHealingWishDescription, + [MOVE_CRUSH_GRIP - 1] = sWringOutDescription, + [MOVE_MAGMA_STORM - 1] = sMagmaStormDescription, + [MOVE_DARK_VOID - 1] = sDarkVoidDescription, + [MOVE_SEED_FLARE - 1] = sSeedFlareDescription, + [MOVE_OMINOUS_WIND - 1] = sOminousWindDescription, + [MOVE_SHADOW_FORCE - 1] = sShadowForceDescription, + [MOVE_HONE_CLAWS - 1] = sHoneClawsDescription, + [MOVE_WIDE_GUARD - 1] = sWideGuardDescription, + [MOVE_GUARD_SPLIT - 1] = sGuardSplitDescription, + [MOVE_POWER_SPLIT - 1] = sPowerSplitDescription, + [MOVE_WONDER_ROOM - 1] = sWonderRoomDescription, + [MOVE_PSYSHOCK - 1] = sPsyshockDescription, + [MOVE_VENOSHOCK - 1] = sVenoshockDescription, + [MOVE_AUTOTOMIZE - 1] = sAutotomizeDescription, + [MOVE_RAGE_POWDER - 1] = sRagePowderDescription, + [MOVE_TELEKINESIS - 1] = sTelekinesisDescription, + [MOVE_MAGIC_ROOM - 1] = sMagicRoomDescription, + [MOVE_SMACK_DOWN - 1] = sSmackDownDescription, + [MOVE_STORM_THROW - 1] = sStormThrowDescription, + [MOVE_FLAME_BURST - 1] = sFlameBurstDescription, + [MOVE_SLUDGE_WAVE - 1] = sSludgeWaveDescription, + [MOVE_QUIVER_DANCE - 1] = sQuiverDanceDescription, + [MOVE_HEAVY_SLAM - 1] = sHeavySlamDescription, + [MOVE_SYNCHRONOISE - 1] = sSynchronoiseDescription, + [MOVE_ELECTRO_BALL - 1] = sElectroBallDescription, + [MOVE_SOAK - 1] = sSoakDescription, + [MOVE_FLAME_CHARGE - 1] = sFlameChargeDescription, + [MOVE_COIL - 1] = sCoilDescription, + [MOVE_LOW_SWEEP - 1] = sLowSweepDescription, + [MOVE_ACID_SPRAY - 1] = sAcidSprayDescription, + [MOVE_FOUL_PLAY - 1] = sFoulPlayDescription, + [MOVE_SIMPLE_BEAM - 1] = sSimpleBeamDescription, + [MOVE_ENTRAINMENT - 1] = sEntrainmentDescription, + [MOVE_AFTER_YOU - 1] = sAfterYouDescription, + [MOVE_ROUND - 1] = sRoundDescription, + [MOVE_ECHOED_VOICE - 1] = sEchoedVoiceDescription, + [MOVE_CHIP_AWAY - 1] = sChipAwayDescription, + [MOVE_CLEAR_SMOG - 1] = sClearSmogDescription, + [MOVE_STORED_POWER - 1] = sStoredPowerDescription, + [MOVE_QUICK_GUARD - 1] = sQuickGuardDescription, + [MOVE_ALLY_SWITCH - 1] = sAllySwitchDescription, + [MOVE_SCALD - 1] = sScaldDescription, + [MOVE_SHELL_SMASH - 1] = sShellSmashDescription, + [MOVE_HEAL_PULSE - 1] = sHealPulseDescription, + [MOVE_HEX - 1] = sHexDescription, + [MOVE_SKY_DROP - 1] = sSkyDropDescription, + [MOVE_SHIFT_GEAR - 1] = sShiftGearDescription, + [MOVE_CIRCLE_THROW - 1] = sCircleThrowDescription, + [MOVE_INCINERATE - 1] = sIncinerateDescription, + [MOVE_QUASH - 1] = sQuashDescription, + [MOVE_ACROBATICS - 1] = sAcrobaticsDescription, + [MOVE_REFLECT_TYPE - 1] = sReflectTypeDescription, + [MOVE_RETALIATE - 1] = sRetaliateDescription, + [MOVE_FINAL_GAMBIT - 1] = sFinalGambitDescription, + [MOVE_BESTOW - 1] = sBestowDescription, + [MOVE_INFERNO - 1] = sInfernoDescription, + [MOVE_WATER_PLEDGE - 1] = sWaterPledgeDescription, + [MOVE_FIRE_PLEDGE - 1] = sFirePledgeDescription, + [MOVE_GRASS_PLEDGE - 1] = sGrassPledgeDescription, + [MOVE_VOLT_SWITCH - 1] = sUTurnDescription, + [MOVE_STRUGGLE_BUG - 1] = sStruggleBugDescription, + [MOVE_BULLDOZE - 1] = sBulldozeDescription, + [MOVE_FROST_BREATH - 1] = sStormThrowDescription, + [MOVE_DRAGON_TAIL - 1] = sCircleThrowDescription, + [MOVE_WORK_UP - 1] = sWorkUpDescription, + [MOVE_ELECTROWEB - 1] = sElectrowebDescription, + [MOVE_WILD_CHARGE - 1] = sWildChargeDescription, + [MOVE_DRILL_RUN - 1] = sDrillRunDescription, + [MOVE_DUAL_CHOP - 1] = sDualChopDescription, + [MOVE_HEART_STAMP - 1] = sHeartStampDescription, [MOVE_HORN_LEECH - 1] = sMegaDrainDescription, - [MOVE_SACRED_SWORD - 1] = sCHIP_AWAYDescription, - [MOVE_RAZOR_SHELL - 1] = sRAZOR_SHELLDescription, - [MOVE_HEAT_CRASH - 1] = sHEAVY_SLAMDescription, - [MOVE_LEAF_TORNADO - 1] = sLEAF_TORNADODescription, - [MOVE_STEAMROLLER - 1] = sSTEAMROLLERDescription, - [MOVE_COTTON_GUARD - 1] = sCOTTON_GUARDDescription, - [MOVE_NIGHT_DAZE - 1] = sNIGHT_DAZEDescription, - [MOVE_PSYSTRIKE - 1] = sPSYSHOCKDescription, - [MOVE_TAIL_SLAP - 1] = sTAIL_SLAPDescription, - [MOVE_HURRICANE - 1] = sHURRICANEDescription, - [MOVE_HEAD_CHARGE - 1] = sHEAD_CHARGEDescription, - [MOVE_GEAR_GRIND - 1] = sGEAR_GRINDDescription, - [MOVE_SEARING_SHOT - 1] = sLAVA_PLUMEDescription, - [MOVE_TECHNO_BLAST - 1] = sTECHNO_BLASTDescription, - [MOVE_RELIC_SONG - 1] = sRELIC_SONGDescription, - [MOVE_SECRET_SWORD - 1] = sSECRET_SWORDDescription, - [MOVE_GLACIATE - 1] = sGLACIATEDescription, - [MOVE_BOLT_STRIKE - 1] = sBOLT_STRIKEDescription, - [MOVE_BLUE_FLARE - 1] = sBLUE_FLAREDescription, - [MOVE_FIERY_DANCE - 1] = sFIERY_DANCEDescription, - [MOVE_FREEZE_SHOCK - 1] = sFREEZE_SHOCKDescription, - [MOVE_ICE_BURN - 1] = sICE_BURNDescription, - [MOVE_SNARL - 1] = sSNARLDescription, - [MOVE_ICICLE_CRASH - 1] = sICICLE_CRASHDescription, - [MOVE_V_CREATE - 1] = sV_CREATEDescription, - [MOVE_FUSION_FLARE - 1] = sFUSION_FLAREDescription, - [MOVE_FUSION_BOLT - 1] = sFUSION_BOLTDescription, - [MOVE_FLYING_PRESS - 1] = sFLYING_PRESSDescription, - [MOVE_MAT_BLOCK - 1] = sMAT_BLOCKDescription, - [MOVE_BELCH - 1] = sBELCHDescription, - [MOVE_ROTOTILLER - 1] = sROTOTILLERDescription, - [MOVE_STICKY_WEB - 1] = sSTICKY_WEBDescription, - [MOVE_FELL_STINGER - 1] = sFELL_STINGERDescription, - [MOVE_PHANTOM_FORCE - 1] = sSHADOW_FORCEDescription, - [MOVE_TRICK_OR_TREAT - 1] = sTRICK_OR_TREATDescription, - [MOVE_NOBLE_ROAR - 1] = sNOBLE_ROARDescription, - [MOVE_ION_DELUGE - 1] = sION_DELUGEDescription, - [MOVE_PARABOLIC_CHARGE - 1] = sPARABOLIC_CHARGEDescription, - [MOVE_FORESTS_CURSE - 1] = sFORESTS_CURSEDescription, - [MOVE_PETAL_BLIZZARD - 1] = sPETAL_BLIZZARDDescription, - [MOVE_FREEZE_DRY - 1] = sFREEZE_DRYDescription, - [MOVE_DISARMING_VOICE - 1] = sDISARMING_VOICEDescription, - [MOVE_PARTING_SHOT - 1] = sPARTING_SHOTDescription, - [MOVE_TOPSY_TURVY - 1] = sTOPSY_TURVYDescription, - [MOVE_DRAINING_KISS - 1] = sDRAINING_KISSDescription, - [MOVE_CRAFTY_SHIELD - 1] = sCRAFTY_SHIELDDescription, - [MOVE_FLOWER_SHIELD - 1] = sFLOWER_SHIELDDescription, - [MOVE_GRASSY_TERRAIN - 1] = sGRASSY_TERRAINDescription, - [MOVE_MISTY_TERRAIN - 1] = sMISTY_TERRAINDescription, - [MOVE_ELECTRIFY - 1] = sELECTRIFYDescription, - [MOVE_PLAY_ROUGH - 1] = sPLAY_ROUGHDescription, - [MOVE_FAIRY_WIND - 1] = sFAIRY_WINDDescription, - [MOVE_MOONBLAST - 1] = sMOONBLASTDescription, - [MOVE_BOOMBURST - 1] = sBOOMBURSTDescription, - [MOVE_FAIRY_LOCK - 1] = sFAIRY_LOCKDescription, - [MOVE_KINGS_SHIELD - 1] = sKINGS_SHIELDDescription, - [MOVE_PLAY_NICE - 1] = sPLAY_NICEDescription, - [MOVE_CONFIDE - 1] = sCONFIDEDescription, - [MOVE_DIAMOND_STORM - 1] = sDIAMOND_STORMDescription, - [MOVE_STEAM_ERUPTION - 1] = sSTEAM_ERUPTIONDescription, - [MOVE_HYPERSPACE_HOLE - 1] = sHYPERSPACE_HOLEDescription, - [MOVE_WATER_SHURIKEN - 1] = sWATER_SHURIKENDescription, - [MOVE_MYSTICAL_FIRE - 1] = sMYSTICAL_FIREDescription, - [MOVE_SPIKY_SHIELD - 1] = sSPIKY_SHIELDDescription, - [MOVE_AROMATIC_MIST - 1] = sAROMATIC_MISTDescription, - [MOVE_EERIE_IMPULSE - 1] = sEERIE_IMPULSEDescription, - [MOVE_VENOM_DRENCH - 1] = sVENOM_DRENCHDescription, - [MOVE_POWDER - 1] = sPOWDERDescription, - [MOVE_GEOMANCY - 1] = sGEOMANCYDescription, - [MOVE_MAGNETIC_FLUX - 1] = sMAGNETIC_FLUXDescription, - [MOVE_HAPPY_HOUR - 1] = sHAPPY_HOURDescription, - [MOVE_ELECTRIC_TERRAIN - 1] = sELECTRIC_TERRAINDescription, - [MOVE_DAZZLING_GLEAM - 1] = sDAZZLING_GLEAMDescription, - [MOVE_CELEBRATE - 1] = sCELEBRATEDescription, - [MOVE_HOLD_HANDS - 1] = sHOLD_HANDSDescription, - [MOVE_BABY_DOLL_EYES - 1] = sBABYDOLL_EYESDescription, - [MOVE_NUZZLE - 1] = sNUZZLEDescription, + [MOVE_SACRED_SWORD - 1] = sChipAwayDescription, + [MOVE_RAZOR_SHELL - 1] = sRazorShellDescription, + [MOVE_HEAT_CRASH - 1] = sHeavySlamDescription, + [MOVE_LEAF_TORNADO - 1] = sLeafTornadoDescription, + [MOVE_STEAMROLLER - 1] = sSteamrollerDescription, + [MOVE_COTTON_GUARD - 1] = sCottonGuardDescription, + [MOVE_NIGHT_DAZE - 1] = sNightDazeDescription, + [MOVE_PSYSTRIKE - 1] = sPsyshockDescription, + [MOVE_TAIL_SLAP - 1] = sTailSlapDescription, + [MOVE_HURRICANE - 1] = sHurricaneDescription, + [MOVE_HEAD_CHARGE - 1] = sHeadChargeDescription, + [MOVE_GEAR_GRIND - 1] = sGearGrindDescription, + [MOVE_SEARING_SHOT - 1] = sLavaPlumeDescription, + [MOVE_TECHNO_BLAST - 1] = sTechnoBlastDescription, + [MOVE_RELIC_SONG - 1] = sRelicSongDescription, + [MOVE_SECRET_SWORD - 1] = sSecretSwordDescription, + [MOVE_GLACIATE - 1] = sGlaciateDescription, + [MOVE_BOLT_STRIKE - 1] = sBoltStrikeDescription, + [MOVE_BLUE_FLARE - 1] = sBlueFlareDescription, + [MOVE_FIERY_DANCE - 1] = sFieryDanceDescription, + [MOVE_FREEZE_SHOCK - 1] = sFreezeShockDescription, + [MOVE_ICE_BURN - 1] = sIceBurnDescription, + [MOVE_SNARL - 1] = sSnarlDescription, + [MOVE_ICICLE_CRASH - 1] = sIcicleCrashDescription, + [MOVE_V_CREATE - 1] = sVCreateDescription, + [MOVE_FUSION_FLARE - 1] = sFusionFlareDescription, + [MOVE_FUSION_BOLT - 1] = sFusionBoltDescription, + [MOVE_FLYING_PRESS - 1] = sFlyingPressDescription, + [MOVE_MAT_BLOCK - 1] = sMatBlockDescription, + [MOVE_BELCH - 1] = sBelchDescription, + [MOVE_ROTOTILLER - 1] = sRototillerDescription, + [MOVE_STICKY_WEB - 1] = sStickyWebDescription, + [MOVE_FELL_STINGER - 1] = sFellStingerDescription, + [MOVE_PHANTOM_FORCE - 1] = sShadowForceDescription, + [MOVE_TRICK_OR_TREAT - 1] = sTrickOrTreatDescription, + [MOVE_NOBLE_ROAR - 1] = sNobleRoarDescription, + [MOVE_ION_DELUGE - 1] = sIonDelugeDescription, + [MOVE_PARABOLIC_CHARGE - 1] = sParabolicChargeDescription, + [MOVE_FORESTS_CURSE - 1] = sForestsCurseDescription, + [MOVE_PETAL_BLIZZARD - 1] = sPetalBlizzardDescription, + [MOVE_FREEZE_DRY - 1] = sFreezeDryDescription, + [MOVE_DISARMING_VOICE - 1] = sDisarmingVoiceDescription, + [MOVE_PARTING_SHOT - 1] = sPartingShotDescription, + [MOVE_TOPSY_TURVY - 1] = sTopsyTurvyDescription, + [MOVE_DRAINING_KISS - 1] = sDrainingKissDescription, + [MOVE_CRAFTY_SHIELD - 1] = sCraftyShieldDescription, + [MOVE_FLOWER_SHIELD - 1] = sFlowerShieldDescription, + [MOVE_GRASSY_TERRAIN - 1] = sGrassyTerrainDescription, + [MOVE_MISTY_TERRAIN - 1] = sMistyTerrainDescription, + [MOVE_ELECTRIFY - 1] = sElectrifyDescription, + [MOVE_PLAY_ROUGH - 1] = sPlayRoughDescription, + [MOVE_FAIRY_WIND - 1] = sFairyWindDescription, + [MOVE_MOONBLAST - 1] = sMoonblastDescription, + [MOVE_BOOMBURST - 1] = sBoomburstDescription, + [MOVE_FAIRY_LOCK - 1] = sFairyLockDescription, + [MOVE_KINGS_SHIELD - 1] = sKingsShieldDescription, + [MOVE_PLAY_NICE - 1] = sPlayNiceDescription, + [MOVE_CONFIDE - 1] = sConfideDescription, + [MOVE_DIAMOND_STORM - 1] = sDiamondStormDescription, + [MOVE_STEAM_ERUPTION - 1] = sSteamEruptionDescription, + [MOVE_HYPERSPACE_HOLE - 1] = sHyperspaceHoleDescription, + [MOVE_WATER_SHURIKEN - 1] = sWaterShurikenDescription, + [MOVE_MYSTICAL_FIRE - 1] = sMysticalFireDescription, + [MOVE_SPIKY_SHIELD - 1] = sSpikyShieldDescription, + [MOVE_AROMATIC_MIST - 1] = sAromaticMistDescription, + [MOVE_EERIE_IMPULSE - 1] = sEerieImpulseDescription, + [MOVE_VENOM_DRENCH - 1] = sVenomDrenchDescription, + [MOVE_POWDER - 1] = sPowderDescription, + [MOVE_GEOMANCY - 1] = sGeomancyDescription, + [MOVE_MAGNETIC_FLUX - 1] = sMagneticFluxDescription, + [MOVE_HAPPY_HOUR - 1] = sHappyHourDescription, + [MOVE_ELECTRIC_TERRAIN - 1] = sElectricTerrainDescription, + [MOVE_DAZZLING_GLEAM - 1] = sDazzlingGleamDescription, + [MOVE_CELEBRATE - 1] = sCelebrateDescription, + [MOVE_HOLD_HANDS - 1] = sHoldHandsDescription, + [MOVE_BABY_DOLL_EYES - 1] = sBabyDollEyesDescription, + [MOVE_NUZZLE - 1] = sNuzzleDescription, [MOVE_HOLD_BACK - 1] = sFalseSwipeDescription, - [MOVE_INFESTATION - 1] = sINFESTATIONDescription, - [MOVE_POWER_UP_PUNCH - 1] = sPOWER_UP_PUNCHDescription, - [MOVE_OBLIVION_WING - 1] = sDRAINING_KISSDescription, - [MOVE_THOUSAND_ARROWS - 1] = sTHOUSAND_ARROWSDescription, - [MOVE_THOUSAND_WAVES - 1] = sTHOUSAND_WAVESDescription, - [MOVE_LANDS_WRATH - 1] = sLANDS_WRATHDescription, - [MOVE_LIGHT_OF_RUIN - 1] = sLIGHT_OF_RUINDescription, - [MOVE_ORIGIN_PULSE - 1] = sORIGIN_PULSEDescription, - [MOVE_PRECIPICE_BLADES - 1] = sPRECIPICE_BLADESDescription, - [MOVE_DRAGON_ASCENT - 1] = sCLOSE_COMBATDescription, - [MOVE_HYPERSPACE_FURY - 1] = sHYPERSPACE_HOLEDescription, - [MOVE_SHORE_UP - 1] = sSHORE_UPDescription, - [MOVE_FIRST_IMPRESSION - 1] = sFIRST_IMPRESSIONDescription, - [MOVE_BANEFUL_BUNKER - 1] = sBANEFUL_BUNKERDescription, - [MOVE_SPIRIT_SHACKLE - 1] = sSPIRIT_SHACKLEDescription, - [MOVE_DARKEST_LARIAT - 1] = sDARKEST_LARIATDescription, - [MOVE_SPARKLING_ARIA - 1] = sSPARKLING_ARIADescription, - [MOVE_ICE_HAMMER - 1] = sICE_HAMMERDescription, - [MOVE_FLORAL_HEALING - 1] = sFLORAL_HEALINGDescription, - [MOVE_HIGH_HORSEPOWER - 1] = sHIGH_HORSEPOWERDescription, - [MOVE_STRENGTH_SAP - 1] = sSTRENGTH_SAPDescription, - [MOVE_SOLAR_BLADE - 1] = sSOLAR_BLADEDescription, - [MOVE_LEAFAGE - 1] = sLEAFAGEDescription, - [MOVE_SPOTLIGHT - 1] = sSPOTLIGHTDescription, - [MOVE_TOXIC_THREAD - 1] = sTOXIC_THREADDescription, - [MOVE_LASER_FOCUS - 1] = sLASER_FOCUSDescription, - [MOVE_GEAR_UP - 1] = sGEAR_UPDescription, - [MOVE_THROAT_CHOP - 1] = sTHROAT_CHOPDescription, - [MOVE_POLLEN_PUFF - 1] = sPOLLEN_PUFFDescription, - [MOVE_ANCHOR_SHOT - 1] = sANCHOR_SHOTDescription, - [MOVE_PSYCHIC_TERRAIN - 1] = sPSYCHIC_TERRAINDescription, - [MOVE_LUNGE - 1] = sLUNGEDescription, - [MOVE_FIRE_LASH - 1] = sFIRE_LASHDescription, - [MOVE_POWER_TRIP - 1] = sPOWER_TRIPDescription, - [MOVE_BURN_UP - 1] = sBURN_UPDescription, - [MOVE_SPEED_SWAP - 1] = sSPEED_SWAPDescription, - [MOVE_SMART_STRIKE - 1] = sSMART_STRIKEDescription, - [MOVE_PURIFY - 1] = sPURIFYDescription, - [MOVE_REVELATION_DANCE - 1] = sREVELATION_DANCEDescription, - [MOVE_CORE_ENFORCER - 1] = sCORE_ENFORCERDescription, - [MOVE_TROP_KICK - 1] = sTROP_KICKDescription, - [MOVE_INSTRUCT - 1] = sINSTRUCTDescription, - [MOVE_BEAK_BLAST - 1] = sBEAK_BLASTDescription, - [MOVE_CLANGING_SCALES - 1] = sCLANGING_SCALESDescription, - [MOVE_DRAGON_HAMMER - 1] = sDRAGON_HAMMERDescription, - [MOVE_BRUTAL_SWING - 1] = sBRUTAL_SWINGDescription, - [MOVE_AURORA_VEIL - 1] = sAURORA_VEILDescription, - [MOVE_SHELL_TRAP - 1] = sSHELL_TRAPDescription, - [MOVE_FLEUR_CANNON - 1] = sFLEUR_CANNONDescription, - [MOVE_PSYCHIC_FANGS - 1] = sPSYCHIC_FANGSDescription, - [MOVE_STOMPING_TANTRUM - 1] = sSTOMPING_TANTRUMDescription, - [MOVE_SHADOW_BONE - 1] = sSHADOW_BONEDescription, - [MOVE_ACCELEROCK - 1] = sACCELEROCKDescription, - [MOVE_LIQUIDATION - 1] = sLIQUIDATIONDescription, - [MOVE_PRISMATIC_LASER - 1] = sPRISMATIC_LASERDescription, - [MOVE_SPECTRAL_THIEF - 1] = sSPECTRAL_THIEFDescription, - [MOVE_SUNSTEEL_STRIKE - 1] = sSUNSTEEL_STRIKEDescription, - [MOVE_MOONGEIST_BEAM - 1] = sMOONGEIST_BEAMDescription, - [MOVE_TEARFUL_LOOK - 1] = sTEARFUL_LOOKDescription, - [MOVE_ZING_ZAP - 1] = sZING_ZAPDescription, - [MOVE_NATURES_MADNESS - 1] = sNATURES_MADNESSDescription, - [MOVE_MULTI_ATTACK - 1] = sMULTI_ATTACKDescription, - [MOVE_MIND_BLOWN - 1] = sMIND_BLOWNDescription, - [MOVE_PLASMA_FISTS - 1] = sPLASMA_FISTSDescription, - [MOVE_PHOTON_GEYSER - 1] = sPHOTON_GEYSERDescription, - [MOVE_ZIPPY_ZAP - 1] = sZIPPY_ZAPDescription, - [MOVE_SPLISHY_SPLASH - 1] = sSPLISHY_SPLASHDescription, - [MOVE_FLOATY_FALL - 1] = sFLOATY_FALLDescription, - [MOVE_PIKA_PAPOW - 1] = sPIKA_PAPOWDescription, - [MOVE_BOUNCY_BUBBLE - 1] = sBOUNCY_BUBBLEDescription, - [MOVE_BUZZY_BUZZ - 1] = sBUZZY_BUZZDescription, - [MOVE_SIZZLY_SLIDE - 1] = sSIZZLY_SLIDEDescription, - [MOVE_GLITZY_GLOW - 1] = sGLITZY_GLOWDescription, - [MOVE_BADDY_BAD - 1] = sBADDY_BADDescription, - [MOVE_SAPPY_SEED - 1] = sSAPPY_SEEDDescription, - [MOVE_FREEZY_FROST - 1] = sFREEZY_FROSTDescription, - [MOVE_SPARKLY_SWIRL - 1] = sSPARKLY_SWIRLDescription, - [MOVE_VEEVEE_VOLLEY - 1] = sVEEVEE_VOLLEYDescription, - [MOVE_DOUBLE_IRON_BASH - 1] = sDOUBLE_IRON_BASHDescription, + [MOVE_INFESTATION - 1] = sInfestationDescription, + [MOVE_POWER_UP_PUNCH - 1] = sPowerUpPunchDescription, + [MOVE_OBLIVION_WING - 1] = sDrainingKissDescription, + [MOVE_THOUSAND_ARROWS - 1] = sThousandArrowsDescription, + [MOVE_THOUSAND_WAVES - 1] = sThousandWavesDescription, + [MOVE_LANDS_WRATH - 1] = sLandsWrathDescription, + [MOVE_LIGHT_OF_RUIN - 1] = sLightOfRuinDescription, + [MOVE_ORIGIN_PULSE - 1] = sOriginPulseDescription, + [MOVE_PRECIPICE_BLADES - 1] = sPrecipiceBladesDescription, + [MOVE_DRAGON_ASCENT - 1] = sCloseCombatDescription, + [MOVE_HYPERSPACE_FURY - 1] = sHyperspaceHoleDescription, + [MOVE_SHORE_UP - 1] = sShoreUpDescription, + [MOVE_FIRST_IMPRESSION - 1] = sFirstImpressionDescription, + [MOVE_BANEFUL_BUNKER - 1] = sBanefulBunkerDescription, + [MOVE_SPIRIT_SHACKLE - 1] = sSpiritShackleDescription, + [MOVE_DARKEST_LARIAT - 1] = sDarkestLariatDescription, + [MOVE_SPARKLING_ARIA - 1] = sSparklingAriaDescription, + [MOVE_ICE_HAMMER - 1] = sIceHammerDescription, + [MOVE_FLORAL_HEALING - 1] = sFloralHealingDescription, + [MOVE_HIGH_HORSEPOWER - 1] = sHighHorsepowerDescription, + [MOVE_STRENGTH_SAP - 1] = sStrengthSapDescription, + [MOVE_SOLAR_BLADE - 1] = sSolarBladeDescription, + [MOVE_LEAFAGE - 1] = sLeafageDescription, + [MOVE_SPOTLIGHT - 1] = sSpotlightDescription, + [MOVE_TOXIC_THREAD - 1] = sToxicThreadDescription, + [MOVE_LASER_FOCUS - 1] = sLaserFocusDescription, + [MOVE_GEAR_UP - 1] = sGearUpDescription, + [MOVE_THROAT_CHOP - 1] = sThroatChopDescription, + [MOVE_POLLEN_PUFF - 1] = sPollenPuffDescription, + [MOVE_ANCHOR_SHOT - 1] = sAnchorShotDescription, + [MOVE_PSYCHIC_TERRAIN - 1] = sPsychicTerrainDescription, + [MOVE_LUNGE - 1] = sLungeDescription, + [MOVE_FIRE_LASH - 1] = sFireLashDescription, + [MOVE_POWER_TRIP - 1] = sPowerTripDescription, + [MOVE_BURN_UP - 1] = sBurnUpDescription, + [MOVE_SPEED_SWAP - 1] = sSpeedSwapDescription, + [MOVE_SMART_STRIKE - 1] = sSmartStrikeDescription, + [MOVE_PURIFY - 1] = sPurifyDescription, + [MOVE_REVELATION_DANCE - 1] = sRevelationDanceDescription, + [MOVE_CORE_ENFORCER - 1] = sCoreEnforcerDescription, + [MOVE_TROP_KICK - 1] = sTropKickDescription, + [MOVE_INSTRUCT - 1] = sInstructDescription, + [MOVE_BEAK_BLAST - 1] = sBeakBlastDescription, + [MOVE_CLANGING_SCALES - 1] = sClangingScalesDescription, + [MOVE_DRAGON_HAMMER - 1] = sDragonHammerDescription, + [MOVE_BRUTAL_SWING - 1] = sBrutalSwingDescription, + [MOVE_AURORA_VEIL - 1] = sAuroraVeilDescription, + [MOVE_SHELL_TRAP - 1] = sShellTrapDescription, + [MOVE_FLEUR_CANNON - 1] = sFleurCannonDescription, + [MOVE_PSYCHIC_FANGS - 1] = sPsychicFangsDescription, + [MOVE_STOMPING_TANTRUM - 1] = sStompingTantrumDescription, + [MOVE_SHADOW_BONE - 1] = sShadowBoneDescription, + [MOVE_ACCELEROCK - 1] = sAccelerockDescription, + [MOVE_LIQUIDATION - 1] = sLiquidationDescription, + [MOVE_PRISMATIC_LASER - 1] = sPrismaticLaserDescription, + [MOVE_SPECTRAL_THIEF - 1] = sSpectralThiefDescription, + [MOVE_SUNSTEEL_STRIKE - 1] = sSunsteelStrikeDescription, + [MOVE_MOONGEIST_BEAM - 1] = sMoongeistBeamDescription, + [MOVE_TEARFUL_LOOK - 1] = sTearfulLookDescription, + [MOVE_ZING_ZAP - 1] = sZingZapDescription, + [MOVE_NATURES_MADNESS - 1] = sNaturesMadnessDescription, + [MOVE_MULTI_ATTACK - 1] = sMultiAttackDescription, + [MOVE_MIND_BLOWN - 1] = sMindBlownDescription, + [MOVE_PLASMA_FISTS - 1] = sPlasmaFistsDescription, + [MOVE_PHOTON_GEYSER - 1] = sPhotonGeyserDescription, + [MOVE_ZIPPY_ZAP - 1] = sZippyZapDescription, + [MOVE_SPLISHY_SPLASH - 1] = sSplishySplashDescription, + [MOVE_FLOATY_FALL - 1] = sFloatyFallDescription, + [MOVE_PIKA_PAPOW - 1] = sPikaPapowDescription, + [MOVE_BOUNCY_BUBBLE - 1] = sBouncyBubbleDescription, + [MOVE_BUZZY_BUZZ - 1] = sBuzzyBuzzDescription, + [MOVE_SIZZLY_SLIDE - 1] = sSizzlySlideDescription, + [MOVE_GLITZY_GLOW - 1] = sGlitzyGlowDescription, + [MOVE_BADDY_BAD - 1] = sBaddyBadDescription, + [MOVE_SAPPY_SEED - 1] = sSappySeedDescription, + [MOVE_FREEZY_FROST - 1] = sFreezyFrostDescription, + [MOVE_SPARKLY_SWIRL - 1] = sSparklySwirlDescription, + [MOVE_VEEVEE_VOLLEY - 1] = sVeeveeVolleyDescription, + [MOVE_DOUBLE_IRON_BASH - 1] = sDoubleIronBashDescription, //GEN 8 - [MOVE_DYNAMAX_CANNON - 1] = sDYNAMAX_CANNONDescription, - [MOVE_SNIPE_SHOT - 1] = sSNIPE_SHOTDescription, - [MOVE_JAW_LOCK - 1] = sJAW_LOCKDescription, - [MOVE_STUFF_CHEEKS - 1] = sSTUFF_CHEEKSDescription, - [MOVE_NO_RETREAT - 1] = sNO_RETREATDescription, - [MOVE_TAR_SHOT - 1] = sTAR_SHOTDescription, - [MOVE_MAGIC_POWDER - 1] = sMAGIC_POWDERDescription, - [MOVE_DRAGON_DARTS - 1] = sDRAGON_DARTSDescription, - [MOVE_TEATIME - 1] = sTEATIMEDescription, - [MOVE_OCTOLOCK - 1] = sOCTOLOCKDescription, - [MOVE_BOLT_BEAK - 1] = sBOLT_BEAKDescription, - [MOVE_FISHIOUS_REND - 1] = sFISHIOUS_RENDDescription, - [MOVE_COURT_CHANGE - 1] = sCOURT_CHANGEDescription, - [MOVE_CLANGOROUS_SOUL - 1] = sCLANGOROUS_SOULDescription, - [MOVE_BODY_PRESS - 1] = sBODY_PRESSDescription, - [MOVE_DECORATE - 1] = sDECORATEDescription, - [MOVE_DRUM_BEATING - 1] = sDRUM_BEATINGDescription, - [MOVE_SNAP_TRAP - 1] = sSNAP_TRAPDescription, - [MOVE_PYRO_BALL - 1] = sPYRO_BALLDescription, - [MOVE_BEHEMOTH_BLADE - 1] = sBEHEMOTH_BLADEDescription, - [MOVE_BEHEMOTH_BASH - 1] = sBEHEMOTH_BASHDescription, - [MOVE_AURA_WHEEL - 1] = sAURA_WHEELDescription, - [MOVE_BREAKING_SWIPE - 1] = sBREAKING_SWIPEDescription, - [MOVE_BRANCH_POKE - 1] = sBRANCH_POKEDescription, - [MOVE_OVERDRIVE - 1] = sOVERDRIVEDescription, - [MOVE_APPLE_ACID - 1] = sAPPLE_ACIDDescription, - [MOVE_GRAV_APPLE - 1] = sGRAV_APPLEDescription, - [MOVE_SPIRIT_BREAK - 1] = sSPIRIT_BREAKDescription, - [MOVE_STRANGE_STEAM - 1] = sSTRANGE_STEAMDescription, - [MOVE_LIFE_DEW - 1] = sLIFE_DEWDescription, - [MOVE_OBSTRUCT - 1] = sOBSTRUCTDescription, - [MOVE_FALSE_SURRENDER - 1] = sFALSE_SURRENDERDescription, - [MOVE_METEOR_ASSAULT - 1] = sMETEOR_ASSAULTDescription, - [MOVE_ETERNABEAM - 1] = sETERNABEAMDescription, - [MOVE_STEEL_BEAM - 1] = sSTEEL_BEAMDescription, - [MOVE_EXPANDING_FORCE - 1] = sEXPANDING_FORCEDescription, - [MOVE_STEEL_ROLLER - 1] = sSTEEL_ROLLERDescription, - [MOVE_SCALE_SHOT - 1] = sSCALE_SHOTDescription, - [MOVE_METEOR_BEAM - 1] = sMETEOR_BEAMDescription, - [MOVE_SHELL_SIDE_ARM - 1] = sSHELL_SIDE_ARMDescription, - [MOVE_MISTY_EXPLOSION - 1] = sMISTY_EXPLOSIONDescription, - [MOVE_GRASSY_GLIDE - 1] = sGRASSY_GLIDEDescription, - [MOVE_RISING_VOLTAGE - 1] = sRISING_VOLTAGEDescription, - [MOVE_TERRAIN_PULSE - 1] = sTERRAIN_PULSEDescription, - [MOVE_SKITTER_SMACK - 1] = sSKITTER_SMACKDescription, - [MOVE_BURNING_JEALOUSY - 1] = sBURNING_JEALOUSYDescription, - [MOVE_LASH_OUT - 1] = sLASH_OUTDescription, - [MOVE_POLTERGEIST - 1] = sPOLTERGEISTDescription, - [MOVE_CORROSIVE_GAS - 1] = sCORROSIVE_GASDescription, - [MOVE_COACHING - 1] = sCOACHINGDescription, - [MOVE_FLIP_TURN - 1] = sFLIP_TURNDescription, - [MOVE_TRIPLE_AXEL - 1] = sTRIPLE_AXELDescription, - [MOVE_DUAL_WINGBEAT - 1] = sDUAL_WINGBEATDescription, - [MOVE_SCORCHING_SANDS - 1] = sSCORCHING_SANDSDescription, - [MOVE_JUNGLE_HEALING - 1] = sJUNGLE_HEALINGDescription, - [MOVE_WICKED_BLOW - 1] = sWICKED_BLOWDescription, - [MOVE_SURGING_STRIKES - 1] = sSURGING_STRIKESDescription, - [MOVE_THUNDER_CAGE - 1] = sTHUNDER_CAGEDescription, - [MOVE_DRAGON_ENERGY - 1] = sDRAGON_ENERGYDescription, - [MOVE_FREEZING_GLARE - 1] = sFREEZING_GLAREDescription, - [MOVE_FIERY_WRATH - 1] = sFIERY_WRATHDescription, - [MOVE_THUNDEROUS_KICK - 1] = sTHUNDEROUS_KICKDescription, - [MOVE_GLACIAL_LANCE - 1] = sGLACIAL_LANCEDescription, - [MOVE_ASTRAL_BARRAGE - 1] = sASTRAL_BARRAGEDescription, - [MOVE_EERIE_SPELL - 1] = sEERIE_SPELLDescription, + [MOVE_DYNAMAX_CANNON - 1] = sDynamaxCannonDescription, + [MOVE_SNIPE_SHOT - 1] = sSnipeShotDescription, + [MOVE_JAW_LOCK - 1] = sJawLockDescription, + [MOVE_STUFF_CHEEKS - 1] = sStuffCheeksDescription, + [MOVE_NO_RETREAT - 1] = sNoRetreatDescription, + [MOVE_TAR_SHOT - 1] = sTarShotDescription, + [MOVE_MAGIC_POWDER - 1] = sMagicPowderDescription, + [MOVE_DRAGON_DARTS - 1] = sDragonDartsDescription, + [MOVE_TEATIME - 1] = sTeatimeDescription, + [MOVE_OCTOLOCK - 1] = sOctolockDescription, + [MOVE_BOLT_BEAK - 1] = sBoltBeakDescription, + [MOVE_FISHIOUS_REND - 1] = sFishiousRendDescription, + [MOVE_COURT_CHANGE - 1] = sCourtChangeDescription, + [MOVE_CLANGOROUS_SOUL - 1] = sClangorousSoulDescription, + [MOVE_BODY_PRESS - 1] = sBodyPressDescription, + [MOVE_DECORATE - 1] = sDecorateDescription, + [MOVE_DRUM_BEATING - 1] = sDrumBeatingDescription, + [MOVE_SNAP_TRAP - 1] = sSnapTrapDescription, + [MOVE_PYRO_BALL - 1] = sPyroBallDescription, + [MOVE_BEHEMOTH_BLADE - 1] = sBehemothBladeDescription, + [MOVE_BEHEMOTH_BASH - 1] = sBehemothBashDescription, + [MOVE_AURA_WHEEL - 1] = sAuraWheelDescription, + [MOVE_BREAKING_SWIPE - 1] = sBreakingSwipeDescription, + [MOVE_BRANCH_POKE - 1] = sBranchPokeDescription, + [MOVE_OVERDRIVE - 1] = sOverdriveDescription, + [MOVE_APPLE_ACID - 1] = sAppleAcidDescription, + [MOVE_GRAV_APPLE - 1] = sGravAppleDescription, + [MOVE_SPIRIT_BREAK - 1] = sSpiritBreakDescription, + [MOVE_STRANGE_STEAM - 1] = sStrangeSteamDescription, + [MOVE_LIFE_DEW - 1] = sLifeDewDescription, + [MOVE_OBSTRUCT - 1] = sObstructDescription, + [MOVE_FALSE_SURRENDER - 1] = sFalseSurrenderDescription, + [MOVE_METEOR_ASSAULT - 1] = sMeteorAssaultDescription, + [MOVE_ETERNABEAM - 1] = sEternabeamDescription, + [MOVE_STEEL_BEAM - 1] = sSteelBeamDescription, + [MOVE_EXPANDING_FORCE - 1] = sExpandingForceDescription, + [MOVE_STEEL_ROLLER - 1] = sSteelRollerDescription, + [MOVE_SCALE_SHOT - 1] = sScaleShotDescription, + [MOVE_METEOR_BEAM - 1] = sMeteorBeamDescription, + [MOVE_SHELL_SIDE_ARM - 1] = sShellSideArmDescription, + [MOVE_MISTY_EXPLOSION - 1] = sMistyExplosionDescription, + [MOVE_GRASSY_GLIDE - 1] = sGrassyGlideDescription, + [MOVE_RISING_VOLTAGE - 1] = sRisingVoltageDescription, + [MOVE_TERRAIN_PULSE - 1] = sTerrainPulseDescription, + [MOVE_SKITTER_SMACK - 1] = sSkitterSmackDescription, + [MOVE_BURNING_JEALOUSY - 1] = sBurningJealousyDescription, + [MOVE_LASH_OUT - 1] = sLashOutDescription, + [MOVE_POLTERGEIST - 1] = sPoltergeistDescription, + [MOVE_CORROSIVE_GAS - 1] = sCorrosiveGasDescription, + [MOVE_COACHING - 1] = sCoachingDescription, + [MOVE_FLIP_TURN - 1] = sFlipTurnDescription, + [MOVE_TRIPLE_AXEL - 1] = sTripleAxelDescription, + [MOVE_DUAL_WINGBEAT - 1] = sDualWingbeatDescription, + [MOVE_SCORCHING_SANDS - 1] = sScorchingSandsDescription, + [MOVE_JUNGLE_HEALING - 1] = sJungleHealingDescription, + [MOVE_WICKED_BLOW - 1] = sWickedBlowDescription, + [MOVE_SURGING_STRIKES - 1] = sSurgingStrikesDescription, + [MOVE_THUNDER_CAGE - 1] = sThunderCageDescription, + [MOVE_DRAGON_ENERGY - 1] = sDragonEnergyDescription, + [MOVE_FREEZING_GLARE - 1] = sFreezingGlareDescription, + [MOVE_FIERY_WRATH - 1] = sFieryWrathDescription, + [MOVE_THUNDEROUS_KICK - 1] = sThunderousKickDescription, + [MOVE_GLACIAL_LANCE - 1] = sGlacialLanceDescription, + [MOVE_ASTRAL_BARRAGE - 1] = sAstralBarrageDescription, + [MOVE_EERIE_SPELL - 1] = sEerieSpellDescription, }; From ef3db02c22437725be41d9e34bd3df46a656bd12 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 29 Jan 2022 12:30:40 -0300 Subject: [PATCH 078/105] Updated GetBallThrowableState --- src/item_use.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/item_use.c b/src/item_use.c index e9ac58e63f..cf38a70a6e 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -943,7 +943,7 @@ void ItemUseOutOfBattle_EvolutionStone(u8 taskId) static u32 GetBallThrowableState(void) { if (IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) - && IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) + && IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) return BALL_THROW_UNABLE_TWO_MONS; else if (IsPlayerPartyAndPokemonStorageFull() == TRUE) return BALL_THROW_UNABLE_NO_ROOM; From b946775e5099de69642c4f02966d13bc9fb2e70d Mon Sep 17 00:00:00 2001 From: SubzeroEclipse <64367060+SubzeroEclipse@users.noreply.github.com> Date: Tue, 1 Feb 2022 13:19:07 +0100 Subject: [PATCH 079/105] Fixed some new battle strings --- src/battle_message.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/battle_message.c b/src/battle_message.c index 1e97de1886..34b258e63f 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -509,13 +509,13 @@ static const u8 sText_TwoInGameTrainersDefeated[]; static const u8 sText_Trainer2LoseText[]; // New battle strings. -static const s8 sText_EnduredViaSturdy[] = _("{B_DEF_NAME_WITH_PREFIX} ENDURED\nthe hit using {B_DEF_ABILITY}!"); +static const s8 sText_EnduredViaSturdy[] = _("{B_DEF_NAME_WITH_PREFIX} Endured\nthe hit using {B_DEF_ABILITY}!"); static const s8 sText_PowerHerbActivation[] = _("{B_ATK_NAME_WITH_PREFIX} became fully charged\ndue to its {B_LAST_ITEM}!"); static const s8 sText_HurtByItem[] = _("{B_ATK_NAME_WITH_PREFIX} was hurt\nby its {B_LAST_ITEM}!"); static const s8 sText_BadlyPoisonedByItem[] = _("{B_EFF_NAME_WITH_PREFIX} was badly \npoisoned by the {B_LAST_ITEM}!"); static const s8 sText_BurnedByItem[] = _("{B_EFF_NAME_WITH_PREFIX} was burned\nby the {B_LAST_ITEM}!"); static const s8 sText_TargetAbilityActivates[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} activates!"); -static const u8 sText_GravityIntensified[] = _("GRAVITY intensified!"); +static const u8 sText_GravityIntensified[] = _("Gravity intensified!"); static const u8 sText_TargetIdentified[] = _("{B_DEF_NAME_WITH_PREFIX} was \nidentified!"); static const u8 sText_TargetWokeUp[] = _("{B_DEF_NAME_WITH_PREFIX} woke up!"); static const u8 sText_PkmnStoleAndAteItem[] = _("{B_ATK_NAME_WITH_PREFIX} stole and\nate {B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ITEM}!"); @@ -615,9 +615,9 @@ static const u8 sText_TargetStatWontGoHigher[] = _("{B_DEF_NAME_WITH_PREFIX}'s { static const u8 sText_PkmnMoveBouncedViaAbility[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE} was\nbounced back by {B_DEF_NAME_WITH_PREFIX}'s\l{B_DEF_ABILITY}!"); static const u8 sText_ImposterTransform[] = _("{B_ATK_NAME_WITH_PREFIX} transformed into\n{B_DEF_NAME_WITH_PREFIX} using {B_LAST_ABILITY}!"); static const u8 sText_NotDoneYet[] = _("This move effect is not done yet!\p"); -static const u8 sText_PkmnBlewAwayToxicSpikes[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nTOXIC SPIKES!"); -static const u8 sText_PkmnBlewAwayStickyWeb[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nSTICKY WEB!"); -static const u8 sText_PkmnBlewAwayStealthRock[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nSTEALTH ROCK!"); +static const u8 sText_PkmnBlewAwayToxicSpikes[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nToxic Spikes!"); +static const u8 sText_PkmnBlewAwayStickyWeb[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nSticky Web!"); +static const u8 sText_PkmnBlewAwayStealthRock[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nStealth Rock!"); static const u8 sText_StickyWebUsed[] = _("A sticky web spreads out on the\nground around {B_DEF_TEAM2} team!"); static const u8 sText_QuashSuccess[] = _("The opposing {B_ATK_NAME_WITH_PREFIX}'s move was postponed!"); static const u8 sText_IonDelugeOn[] = _("A deluge of ions showers\nthe battlefield!"); @@ -680,7 +680,7 @@ static const u8 sText_AirLockActivates[] = _("The effects of weather\ndisappeare static const u8 sText_PressureActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is exerting its\npressure!"); static const u8 sText_DarkAuraActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating\na dark aura!"); static const u8 sText_FairyAuraActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating\na fairy aura!"); -static const u8 sText_AuraBreakActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} reversed all\nother POKéMON's auras!"); +static const u8 sText_AuraBreakActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} reversed all\nother Pokémon's auras!"); static const u8 sText_ComatoseActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is drowsing!"); static const u8 sText_ScreenCleanerActivates[] = _("All screens on the field were\ncleansed!"); static const u8 sText_FetchedPokeBall[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} found\na {B_LAST_ITEM}!"); @@ -726,7 +726,7 @@ static const u8 sText_SwappedAbilities[] = _("{B_DEF_NAME_WITH_PREFIX} swapped A static const u8 sText_PastelVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} is protected\nby a pastel veil!"); static const u8 sText_PastelVeilEnters[] = _("{B_DEF_NAME_WITH_PREFIX} was cured\nof its poisoning!"); static const u8 sText_BattlerTypeChangedTo[] = _("{B_BUFF1}'s type\nchanged to {B_BUFF2}!"); -static const u8 sText_BothCanNoLongerEscape[] = _("Neither POKéMON can run away!"); +static const u8 sText_BothCanNoLongerEscape[] = _("Neither Pokémon can run away!"); static const u8 sText_CantEscapeDueToUsedMove[] = _("{B_ATK_NAME_WITH_PREFIX} can no longer escape\nbecause it used {B_CURRENT_MOVE}!"); static const u8 sText_PkmnBecameWeakerToFire[] = _("{B_DEF_NAME_WITH_PREFIX} became\nweaker to fire!"); static const u8 sText_PkmnAboutToBeAttackedByItsItem[] = _("{B_DEF_NAME_WITH_PREFIX} is about\nto be attacked by its {B_BUFF1}!"); From 36a824d8ab5af45ad9495e36109c80763676b1d3 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 3 Feb 2022 17:30:32 -0500 Subject: [PATCH 080/105] fix ability pop up for quick draw --- src/battle_main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_main.c b/src/battle_main.c index e6d19fe49e..d92aa150a6 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4870,6 +4870,7 @@ static void CheckQuickClaw_CustapBerryActivation(void) } else if (gProtectStructs[gActiveBattler].quickDraw) { + gBattlerAbility = gActiveBattler; gProtectStructs[gActiveBattler].quickDraw = FALSE; gLastUsedAbility = gBattleMons[gActiveBattler].ability; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); From fcc85e8c17b0cd75f178491279412d7a9d8f1be3 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 9 Feb 2022 11:23:30 -0500 Subject: [PATCH 081/105] fix AI_WhoStrikesFirst --- src/battle_ai_util.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index fb53bb8013..62d831b201 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1022,9 +1022,9 @@ u8 AI_WhoStrikesFirst(u8 battlerAI, u8 battler2) { // Priorities are the same(at least comparing to moves the AI is aware of), decide by speed. if (GetWhoStrikesFirst(battlerAI, battler2, TRUE) == 0) - return TRUE; + return AI_IS_FASTER; else - return FALSE; + return AI_IS_SLOWER; } } From 209279c207f0dfbd62e9d5b96c2d69a81657cd98 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Wed, 9 Feb 2022 14:30:30 -0500 Subject: [PATCH 082/105] fix psycho shift string printing --- data/battle_scripts_1.s | 2 +- src/battle_script_commands.c | 69 +++++------------------------------- 2 files changed, 9 insertions(+), 62 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index ad31bb4e36..624e911bcf 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1532,7 +1532,7 @@ BattleScript_EffectPsychoShift: BattleScript_EffectPsychoShiftCanWork: jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed jumpifsafeguard BattleScript_SafeguardProtected - trypsychoshift BattleScript_MoveEnd + trypsychoshift BattleScript_ButItFailed attackanimation waitanimation copybyte gEffectBattler, gBattlerTarget diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 43280a7294..a078122b2d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8657,70 +8657,17 @@ static void Cmd_various(void) return; case VARIOUS_PSYCHO_SHIFT: { - u16 targetAbility = GetBattlerAbility(gBattlerTarget); - i = TRUE; - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) + if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS && !CanBeParalyzed(gBattlerTarget)) + || (gBattleMons[gBattlerAttacker].status1 & STATUS1_PSN_ANY && !CanBePoisoned(gBattlerAttacker, gBattlerTarget)) + || (gBattleMons[gBattlerAttacker].status1 & STATUS1_BURN && !CanBeBurned(gBattlerTarget)) + || (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && !CanSleep(gBattlerTarget))) { - if (!(CanBeParalyzed(gBattlerTarget))) - { - gBattlerAbility = gBattlerTarget; - BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); - gBattlescriptCurrInstr = BattleScript_PRLZPrevention; - i = FALSE; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - } + // fails + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); } - else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_PSN_ANY) - { - if (!CanBePoisoned(gBattlerTarget, targetAbility)) - { - gBattlerAbility = gBattlerTarget; - BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); - gBattlescriptCurrInstr = BattleScript_PSNPrevention; - i = FALSE; - } - else - { - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_POISON) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - } - else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_BURN) - { - if (!CanBeBurned(gBattlerTarget)) - { - gBattlerAbility = gBattlerTarget; - BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); - gBattlescriptCurrInstr = BattleScript_BRNPrevention; - i = FALSE; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - } - else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) - { - if (!CanSleep(gBattlerTarget)) - { - gBattlerAbility = gBattlerTarget; - // BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); - // gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); - i = FALSE; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - } - } - - if (i == TRUE) + else { + // Psycho shift works gBattleMons[gBattlerTarget].status1 = gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY; gActiveBattler = gBattlerTarget; BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); From b52233ec3105a45404d261f1697d0128d953e396 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 11 Feb 2022 21:30:27 -0300 Subject: [PATCH 083/105] Updated Conversion's effect --- include/constants/battle_config.h | 1 + src/battle_script_commands.c | 25 ++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 11cf51770f..47a373f477 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -150,6 +150,7 @@ #define B_KINGS_SHIELD_LOWER_ATK GEN_7 // In Gen7+, it lowers Atk by 1 stage instead of 2 of oponents that hit it. #define B_SPEED_BUFFING_RAPID_SPIN GEN_8 // In Gen8, Rapid Spin raises the user's Speed by 1 stage. #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_UPDATED_CONVERSION GEN_7 // In Gen6+, Conversion changes the user's type to match their first move's. // Move accuracy settings #define B_TOXIC_NEVER_MISS GEN_7 // In Gen6+, if Toxic is used by a Poison-type Pokémon, it will never miss. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a078122b2d..e67eb917b2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10560,12 +10560,34 @@ static void Cmd_forcerandomswitch(void) } } -static void Cmd_tryconversiontypechange(void) // randomly changes user's type to one of its moves' type +static void Cmd_tryconversiontypechange(void) { u8 validMoves = 0; u8 moveChecked; u8 moveType; +#if B_UPDATED_CONVERSION >= GEN_6 + // changes user's type to its first move's type + for (moveChecked = 0; moveChecked < MAX_MON_MOVES; moveChecked++) + { + if (gBattleMons[gBattlerAttacker].moves[moveChecked] != MOVE_NONE) + { + moveType = gBattleMoves[gBattleMons[gBattlerAttacker].moves[moveChecked]].type; + break; + } + } + if (IS_BATTLER_OF_TYPE(gBattlerAttacker, moveType)) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } + else + { + SET_BATTLER_TYPE(gBattlerAttacker, moveType); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); + gBattlescriptCurrInstr += 5; + } +#else + // randomly changes user's type to one of its moves' type while (validMoves < MAX_MON_MOVES) { if (gBattleMons[gBattlerAttacker].moves[validMoves] == 0) @@ -10621,6 +10643,7 @@ static void Cmd_tryconversiontypechange(void) // randomly changes user's type to gBattlescriptCurrInstr += 5; } +#endif } static void Cmd_givepaydaymoney(void) From 92d826860387098ee48d0721c9095f9061f9ae29 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 12 Feb 2022 00:18:24 -0300 Subject: [PATCH 084/105] Update include/constants/battle_config.h Co-authored-by: Eduardo Quezada D'Ottone --- 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 47a373f477..6306ca687c 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -150,7 +150,7 @@ #define B_KINGS_SHIELD_LOWER_ATK GEN_7 // In Gen7+, it lowers Atk by 1 stage instead of 2 of oponents that hit it. #define B_SPEED_BUFFING_RAPID_SPIN GEN_8 // In Gen8, Rapid Spin raises the user's Speed by 1 stage. #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_UPDATED_CONVERSION GEN_7 // In Gen6+, Conversion changes the user's type to match their first move's. +#define B_UPDATED_CONVERSION GEN_7 // In Gen6+, Conversion changes the user's type to match their first move's. Before, it would choose a move at random. // Move accuracy settings #define B_TOXIC_NEVER_MISS GEN_7 // In Gen6+, if Toxic is used by a Poison-type Pokémon, it will never miss. From 9a88021448dd8d9c8e1f23ea385dab90f1fb8651 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Thu, 17 Feb 2022 21:39:15 -0300 Subject: [PATCH 085/105] Remove repeated ability check in battle_ai_util.c --- src/battle_ai_util.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 62d831b201..fe37f31ec4 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1505,7 +1505,6 @@ bool32 ShouldSetSandstorm(u8 battler, u16 ability, u16 holdEffect) if (ability == ABILITY_SAND_VEIL || ability == ABILITY_SAND_RUSH || ability == ABILITY_SAND_FORCE - || ability == ABILITY_SAND_FORCE || ability == ABILITY_OVERCOAT || ability == ABILITY_MAGIC_GUARD || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES From e4ef3cc3b4732885c6c783f06c9e52bd529c14a1 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 24 Feb 2022 22:06:18 -0500 Subject: [PATCH 086/105] move glare effectiveness exception to code --- data/battle_scripts_1.s | 3 --- src/battle_util.c | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 624e911bcf..c85a47d8bb 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3735,9 +3735,6 @@ BattleScript_EffectParalyze: jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed -.if B_GLARE_GHOST >= GEN_4 - jumpifmove MOVE_GLARE, BattleScript_BattleScript_EffectParalyzeNoTypeCalc -.endif typecalc BattleScript_BattleScript_EffectParalyzeNoTypeCalc: jumpifmovehadnoeffect BattleScript_ButItFailed diff --git a/src/battle_util.c b/src/battle_util.c index 4127b9bd41..fd06b2cd25 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9135,6 +9135,10 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat { modifier = UQ_4_12(0.0); } + else if (move == MOVE_GLARE && IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST)) + { + modifier = UQ_4_12(1.0); + } // Thousand Arrows ignores type modifiers for flying mons if (!IsBattlerGrounded(battlerDef) && (gBattleMoves[move].flags & FLAG_DMG_UNGROUNDED_IGNORE_TYPE_IF_FLYING) From 92487db4709e495f8424b8b7eb1092b515d5b8c4 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Fri, 25 Feb 2022 08:20:56 -0500 Subject: [PATCH 087/105] add config check for B_GLARE_GHOST --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index fd06b2cd25..7143c4864a 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9135,7 +9135,7 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat { modifier = UQ_4_12(0.0); } - else if (move == MOVE_GLARE && IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST)) + else if (B_GLARE_GHOST >= GEN_4 && move == MOVE_GLARE && IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST)) { modifier = UQ_4_12(1.0); } From 7c2bbf1df3130e7018400d3e3baf08cfc3126eb4 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Fri, 25 Feb 2022 08:54:35 -0500 Subject: [PATCH 088/105] fix struggle bug anim --- data/battle_anim_scripts.s | 19 ++++++++++++------- include/battle_anim.h | 1 + src/battle_anim_mon_movement.c | 15 +++++++++++++-- src/battle_anim_new.c | 3 +-- src/battle_anim_normal.c | 2 +- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index d7710631dd..c44172bc69 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -6134,17 +6134,22 @@ Move_STRUGGLE_BUG: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x0 0x9 0x0a1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_ATK, 2, 0, 9, 0x0a1f waitforvisualfinish - launchtask AnimTask_FlailMovement 0x2 0x1 0x0 - launchtemplate gMovementWavesSpriteTemplate 0x2 0x3 0x0 0x0 0x2 - launchtemplate gMovementWavesSpriteTemplate 0x2 0x3 0x0 0x1 0x2 + createvisualtask AnimTask_FlailMovement, 2, 0 + createsprite gMovementWavesSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 2 + createsprite gMovementWavesSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 2 loopsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER, 0x8, 0x2 waitforvisualfinish - launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3 - launchtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg 0x2 0x5 0x0 0x1 0x1e 0x1 0x0 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 1 + createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 0x1e, 1, 0 + createvisualtask AnimTask_ShakeTargetPartnerBasedOnMovePowerOrDmg, 2, FALSE, 1, 0x1e, 1, 0 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x9 0x0 0x0a1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_ATK, 2, 9, 0, 0x0a1f + delay 5 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 1 + delay 5 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff diff --git a/include/battle_anim.h b/include/battle_anim.h index 9d9c61b6f8..f9327292a3 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -492,5 +492,6 @@ void AnimOverheatFlame(struct Sprite *sprite); // battle_anim_new.c void CoreEnforcerLoadBeamTarget(struct Sprite* sprite); +void SpriteCB_RandomCentredHits(struct Sprite* sprite); #endif // GUARD_BATTLE_ANIM_H diff --git a/src/battle_anim_mon_movement.c b/src/battle_anim_mon_movement.c index d15cf63425..c5c35ef6fa 100644 --- a/src/battle_anim_mon_movement.c +++ b/src/battle_anim_mon_movement.c @@ -992,7 +992,7 @@ static void AnimTask_RotateMonSpriteToSide_Step(u8 taskId) } } -void AnimTask_ShakeTargetBasedOnMovePowerOrDmg(u8 taskId) +void SetupShakeBattlerBasedOnMovePowerOrDmg(u8 taskId, u8 animBattlerId) { if (!gBattleAnimArgs[0]) { @@ -1023,12 +1023,23 @@ void AnimTask_ShakeTargetBasedOnMovePowerOrDmg(u8 taskId) gTasks[taskId].data[12] = 0; gTasks[taskId].data[10] = gBattleAnimArgs[3]; gTasks[taskId].data[11] = gBattleAnimArgs[4]; - gTasks[taskId].data[7] = GetAnimBattlerSpriteId(ANIM_TARGET); + gTasks[taskId].data[7] = GetAnimBattlerSpriteId(animBattlerId); gTasks[taskId].data[8] = gSprites[gTasks[taskId].data[7]].x2; gTasks[taskId].data[9] = gSprites[gTasks[taskId].data[7]].y2; gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].data[2] = gBattleAnimArgs[2]; +} + +void AnimTask_ShakeTargetPartnerBasedOnMovePowerOrDmg(u8 taskId) +{ + SetupShakeBattlerBasedOnMovePowerOrDmg(taskId, ANIM_DEF_PARTNER); + gTasks[taskId].func = AnimTask_ShakeTargetBasedOnMovePowerOrDmg_Step; +} + +void AnimTask_ShakeTargetBasedOnMovePowerOrDmg(u8 taskId) +{ + SetupShakeBattlerBasedOnMovePowerOrDmg(taskId, ANIM_TARGET); gTasks[taskId].func = AnimTask_ShakeTargetBasedOnMovePowerOrDmg_Step; } diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 450ab35245..1392fc626d 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -33,7 +33,6 @@ static void SpriteCB_MoongeistCharge(struct Sprite *sprite); static void SpriteCB_MindBlownBall(struct Sprite *sprite); static void AnimMindBlownBallStep(struct Sprite *sprite); static void SpriteCB_MindBlownExplosion(struct Sprite* sprite); -static void SpriteCB_RandomCentredHits(struct Sprite* sprite); static void SpriteCB_LockingJaw(struct Sprite *sprite); static void SpriteCB_LockingJawStep(struct Sprite *sprite); static void SpriteCB_LockingJawFinish(struct Sprite *sprite); @@ -4585,7 +4584,7 @@ static void SpriteCB_MindBlownExplosion(struct Sprite* sprite) } } -static void SpriteCB_RandomCentredHits(struct Sprite* sprite) +void SpriteCB_RandomCentredHits(struct Sprite* sprite) { if (gBattleAnimArgs[1] == -1) gBattleAnimArgs[1] = Random() & 3; diff --git a/src/battle_anim_normal.c b/src/battle_anim_normal.c index 8bbfc58456..524abccb1f 100644 --- a/src/battle_anim_normal.c +++ b/src/battle_anim_normal.c @@ -258,7 +258,7 @@ const struct SpriteTemplate gRandomPosHitSplatSpriteTemplate = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, - .callback = AnimHitSplatRandom, + .callback = SpriteCB_RandomCentredHits, }; const struct SpriteTemplate gMonEdgeHitSplatSpriteTemplate = From 5d58cdd2971b8644e60bc65bd79177d4f5bf4d93 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Mon, 28 Feb 2022 13:34:39 -0500 Subject: [PATCH 089/105] Fix bunny hoppy typo --- include/constants/event_object_movement.h | 16 ++++----- src/data/object_events/object_event_anims.h | 32 +++++++++--------- src/event_object_movement.c | 36 ++++++++++----------- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/include/constants/event_object_movement.h b/include/constants/event_object_movement.h index 2c42735248..a9d59935ec 100755 --- a/include/constants/event_object_movement.h +++ b/include/constants/event_object_movement.h @@ -273,14 +273,14 @@ #define ANIM_RUN_WEST (ANIM_STD_COUNT + 2) #define ANIM_RUN_EAST (ANIM_STD_COUNT + 3) -#define ANIM_BUNNY_HOPPY_BACK_WHEEL_SOUTH (ANIM_STD_COUNT + 0) -#define ANIM_BUNNY_HOPPY_BACK_WHEEL_NORTH (ANIM_STD_COUNT + 1) -#define ANIM_BUNNY_HOPPY_BACK_WHEEL_WEST (ANIM_STD_COUNT + 2) -#define ANIM_BUNNY_HOPPY_BACK_WHEEL_EAST (ANIM_STD_COUNT + 3) -#define ANIM_BUNNY_HOPPY_FRONT_WHEEL_SOUTH (ANIM_STD_COUNT + 4) -#define ANIM_BUNNY_HOPPY_FRONT_WHEEL_NORTH (ANIM_STD_COUNT + 5) -#define ANIM_BUNNY_HOPPY_FRONT_WHEEL_WEST (ANIM_STD_COUNT + 6) -#define ANIM_BUNNY_HOPPY_FRONT_WHEEL_EAST (ANIM_STD_COUNT + 7) +#define ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH (ANIM_STD_COUNT + 0) +#define ANIM_BUNNY_HOP_BACK_WHEEL_NORTH (ANIM_STD_COUNT + 1) +#define ANIM_BUNNY_HOP_BACK_WHEEL_WEST (ANIM_STD_COUNT + 2) +#define ANIM_BUNNY_HOP_BACK_WHEEL_EAST (ANIM_STD_COUNT + 3) +#define ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH (ANIM_STD_COUNT + 4) +#define ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH (ANIM_STD_COUNT + 5) +#define ANIM_BUNNY_HOP_FRONT_WHEEL_WEST (ANIM_STD_COUNT + 6) +#define ANIM_BUNNY_HOP_FRONT_WHEEL_EAST (ANIM_STD_COUNT + 7) #define ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH (ANIM_STD_COUNT + 8) #define ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH (ANIM_STD_COUNT + 9) #define ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST (ANIM_STD_COUNT + 10) diff --git a/src/data/object_events/object_event_anims.h b/src/data/object_events/object_event_anims.h index a5fb414628..f96e52de53 100755 --- a/src/data/object_events/object_event_anims.h +++ b/src/data/object_events/object_event_anims.h @@ -413,56 +413,56 @@ static const union AnimCmd sAnim_GetOnOffSurfBlobEast[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd sAnim_BunnyHoppyBackWheelSouth[] = +static const union AnimCmd sAnim_BunnyHopBackWheelSouth[] = { ANIMCMD_FRAME(9, 4), ANIMCMD_FRAME(10, 4), ANIMCMD_END, }; -static const union AnimCmd sAnim_BunnyHoppyBackWheelNorth[] = +static const union AnimCmd sAnim_BunnyHopBackWheelNorth[] = { ANIMCMD_FRAME(13, 4), ANIMCMD_FRAME(14, 4), ANIMCMD_END, }; -static const union AnimCmd sAnim_BunnyHoppyBackWheelWest[] = +static const union AnimCmd sAnim_BunnyHopBackWheelWest[] = { ANIMCMD_FRAME(17, 4), ANIMCMD_FRAME(18, 4), ANIMCMD_END, }; -static const union AnimCmd sAnim_BunnyHoppyBackWheelEast[] = +static const union AnimCmd sAnim_BunnyHopBackWheelEast[] = { ANIMCMD_FRAME(17, 4, .hFlip = TRUE), ANIMCMD_FRAME(18, 4, .hFlip = TRUE), ANIMCMD_END, }; -static const union AnimCmd sAnim_BunnyHoppyFrontWheelSouth[] = +static const union AnimCmd sAnim_BunnyHopFrontWheelSouth[] = { ANIMCMD_FRAME(11, 4), ANIMCMD_FRAME(12, 4), ANIMCMD_END, }; -static const union AnimCmd sAnim_BunnyHoppyFrontWheelNorth[] = +static const union AnimCmd sAnim_BunnyHopFrontWheelNorth[] = { ANIMCMD_FRAME(15, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_END, }; -static const union AnimCmd sAnim_BunnyHoppyFrontWheelWest[] = +static const union AnimCmd sAnim_BunnyHopFrontWheelWest[] = { ANIMCMD_FRAME(19, 4), ANIMCMD_FRAME(20, 4), ANIMCMD_END, }; -static const union AnimCmd sAnim_BunnyHoppyFrontWheelEast[] = +static const union AnimCmd sAnim_BunnyHopFrontWheelEast[] = { ANIMCMD_FRAME(19, 4, .hFlip = TRUE), ANIMCMD_FRAME(20, 4, .hFlip = TRUE), @@ -1024,14 +1024,14 @@ static const union AnimCmd *const sAnimTable_AcroBike[] = { [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth, [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest, [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast, - [ANIM_BUNNY_HOPPY_BACK_WHEEL_SOUTH] = sAnim_BunnyHoppyBackWheelSouth, - [ANIM_BUNNY_HOPPY_BACK_WHEEL_NORTH] = sAnim_BunnyHoppyBackWheelNorth, - [ANIM_BUNNY_HOPPY_BACK_WHEEL_WEST] = sAnim_BunnyHoppyBackWheelWest, - [ANIM_BUNNY_HOPPY_BACK_WHEEL_EAST] = sAnim_BunnyHoppyBackWheelEast, - [ANIM_BUNNY_HOPPY_FRONT_WHEEL_SOUTH] = sAnim_BunnyHoppyFrontWheelSouth, - [ANIM_BUNNY_HOPPY_FRONT_WHEEL_NORTH] = sAnim_BunnyHoppyFrontWheelNorth, - [ANIM_BUNNY_HOPPY_FRONT_WHEEL_WEST] = sAnim_BunnyHoppyFrontWheelWest, - [ANIM_BUNNY_HOPPY_FRONT_WHEEL_EAST] = sAnim_BunnyHoppyFrontWheelEast, + [ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH] = sAnim_BunnyHopBackWheelSouth, + [ANIM_BUNNY_HOP_BACK_WHEEL_NORTH] = sAnim_BunnyHopBackWheelNorth, + [ANIM_BUNNY_HOP_BACK_WHEEL_WEST] = sAnim_BunnyHopBackWheelWest, + [ANIM_BUNNY_HOP_BACK_WHEEL_EAST] = sAnim_BunnyHopBackWheelEast, + [ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH] = sAnim_BunnyHopFrontWheelSouth, + [ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH] = sAnim_BunnyHopFrontWheelNorth, + [ANIM_BUNNY_HOP_FRONT_WHEEL_WEST] = sAnim_BunnyHopFrontWheelWest, + [ANIM_BUNNY_HOP_FRONT_WHEEL_EAST] = sAnim_BunnyHopFrontWheelEast, [ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH] = sAnim_StandingWheelieBackWheelSouth, [ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH] = sAnim_StandingWheelieBackWheelNorth, [ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST] = sAnim_StandingWheelieBackWheelWest, diff --git a/src/event_object_movement.c b/src/event_object_movement.c index df79a1d62a..eb699e89f8 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -744,26 +744,26 @@ static const u8 sJumpSpecialDirectionAnimNums[] = { // used for jumping onto sur [DIR_NORTHEAST] = ANIM_GET_ON_OFF_POKEMON_NORTH, }; static const u8 sAcroWheelieDirectionAnimNums[] = { - [DIR_NONE] = ANIM_BUNNY_HOPPY_BACK_WHEEL_SOUTH, - [DIR_SOUTH] = ANIM_BUNNY_HOPPY_BACK_WHEEL_SOUTH, - [DIR_NORTH] = ANIM_BUNNY_HOPPY_BACK_WHEEL_NORTH, - [DIR_WEST] = ANIM_BUNNY_HOPPY_BACK_WHEEL_WEST, - [DIR_EAST] = ANIM_BUNNY_HOPPY_BACK_WHEEL_EAST, - [DIR_SOUTHWEST] = ANIM_BUNNY_HOPPY_BACK_WHEEL_SOUTH, - [DIR_SOUTHEAST] = ANIM_BUNNY_HOPPY_BACK_WHEEL_SOUTH, - [DIR_NORTHWEST] = ANIM_BUNNY_HOPPY_BACK_WHEEL_NORTH, - [DIR_NORTHEAST] = ANIM_BUNNY_HOPPY_BACK_WHEEL_NORTH, + [DIR_NONE] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH, + [DIR_SOUTH] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH, + [DIR_NORTH] = ANIM_BUNNY_HOP_BACK_WHEEL_NORTH, + [DIR_WEST] = ANIM_BUNNY_HOP_BACK_WHEEL_WEST, + [DIR_EAST] = ANIM_BUNNY_HOP_BACK_WHEEL_EAST, + [DIR_SOUTHWEST] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH, + [DIR_SOUTHEAST] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH, + [DIR_NORTHWEST] = ANIM_BUNNY_HOP_BACK_WHEEL_NORTH, + [DIR_NORTHEAST] = ANIM_BUNNY_HOP_BACK_WHEEL_NORTH, }; static const u8 sAcroUnusedDirectionAnimNums[] = { - [DIR_NONE] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_SOUTH, - [DIR_SOUTH] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_SOUTH, - [DIR_NORTH] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_NORTH, - [DIR_WEST] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_WEST, - [DIR_EAST] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_EAST, - [DIR_SOUTHWEST] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_SOUTH, - [DIR_SOUTHEAST] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_SOUTH, - [DIR_NORTHWEST] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_NORTH, - [DIR_NORTHEAST] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_NORTH, + [DIR_NONE] = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH, + [DIR_SOUTH] = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH, + [DIR_NORTH] = ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH, + [DIR_WEST] = ANIM_BUNNY_HOP_FRONT_WHEEL_WEST, + [DIR_EAST] = ANIM_BUNNY_HOP_FRONT_WHEEL_EAST, + [DIR_SOUTHWEST] = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH, + [DIR_SOUTHEAST] = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH, + [DIR_NORTHWEST] = ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH, + [DIR_NORTHEAST] = ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH, }; static const u8 sAcroEndWheelieDirectionAnimNums[] = { [DIR_NONE] = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH, From 8bf7e7b6f5abad1a4f0772a88ed415079edb7df8 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Wed, 2 Mar 2022 19:45:28 -0500 Subject: [PATCH 090/105] Improve egg hatch documentation --- .../egg_hatch.png => pokemon/egg/hatch.png} | Bin .../egg_shard.png => pokemon/egg/shard.png} | Bin src/egg_hatch.c | 476 ++++++++++-------- 3 files changed, 265 insertions(+), 211 deletions(-) rename graphics/{misc/egg_hatch.png => pokemon/egg/hatch.png} (100%) rename graphics/{misc/egg_shard.png => pokemon/egg/shard.png} (100%) diff --git a/graphics/misc/egg_hatch.png b/graphics/pokemon/egg/hatch.png similarity index 100% rename from graphics/misc/egg_hatch.png rename to graphics/pokemon/egg/hatch.png diff --git a/graphics/misc/egg_shard.png b/graphics/pokemon/egg/shard.png similarity index 100% rename from graphics/misc/egg_shard.png rename to graphics/pokemon/egg/shard.png diff --git a/src/egg_hatch.c b/src/egg_hatch.c index 283ec753af..5dd83c9b1f 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -37,16 +37,24 @@ #include "battle.h" // to get rid of later #include "constants/rgb.h" +#define GFXTAG_EGG 12345 +#define GFXTAG_EGG_SHARD 23456 + +#define PALTAG_EGG 54321 + +#define EGG_X (DISPLAY_WIDTH / 2) +#define EGG_Y (DISPLAY_HEIGHT / 2 - 5) + struct EggHatchData { - u8 eggSpriteID; - u8 pokeSpriteID; - u8 CB2_state; - u8 CB2_PalCounter; - u8 eggPartyID; + u8 eggSpriteId; + u8 monSpriteId; + u8 state; + u8 delayTimer; + u8 eggPartyId; u8 unused_5; u8 unused_6; - u8 eggShardVelocityID; + u8 eggShardVelocityId; u8 windowId; u8 unused_9; u8 unused_A; @@ -58,29 +66,27 @@ extern const u32 gTradePlatform_Tilemap[]; extern const u8 gText_HatchedFromEgg[]; extern const u8 gText_NicknameHatchPrompt[]; -static void Task_EggHatch(u8 taskID); -static void CB2_EggHatch_0(void); -static void CB2_EggHatch_1(void); -static void SpriteCB_Egg_0(struct Sprite* sprite); -static void SpriteCB_Egg_1(struct Sprite* sprite); -static void SpriteCB_Egg_2(struct Sprite* sprite); -static void SpriteCB_Egg_3(struct Sprite* sprite); -static void SpriteCB_Egg_4(struct Sprite* sprite); -static void SpriteCB_Egg_5(struct Sprite* sprite); -static void SpriteCB_EggShard(struct Sprite* sprite); -static void EggHatchPrintMessage(u8 windowId, u8* string, u8 x, u8 y, u8 speed); +static void Task_EggHatch(u8); +static void CB2_LoadEggHatch(void); +static void CB2_EggHatch(void); +static void SpriteCB_Egg_Shake1(struct Sprite*); +static void SpriteCB_Egg_Shake2(struct Sprite*); +static void SpriteCB_Egg_Shake3(struct Sprite*); +static void SpriteCB_Egg_WaitHatch(struct Sprite*); +static void SpriteCB_Egg_Hatch(struct Sprite*); +static void SpriteCB_Egg_Reveal(struct Sprite*); +static void SpriteCB_EggShard(struct Sprite*); +static void EggHatchPrintMessage(u8, u8*, u8, u8, u8); static void CreateRandomEggShardSprite(void); -static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex); +static void CreateEggShardSprite(u8, u8, s16, s16, s16, u8); -// IWRAM bss static struct EggHatchData *sEggHatchData; -// rom data -static const u16 sEggPalette[] = INCBIN_U16("graphics/pokemon/egg/normal.gbapal"); -static const u8 sEggHatchTiles[] = INCBIN_U8("graphics/misc/egg_hatch.4bpp"); -static const u8 sEggShardTiles[] = INCBIN_U8("graphics/misc/egg_shard.4bpp"); +static const u16 sEggPalette[] = INCBIN_U16("graphics/pokemon/egg/normal.gbapal"); +static const u8 sEggHatchTiles[] = INCBIN_U8("graphics/pokemon/egg/hatch.4bpp"); +static const u8 sEggShardTiles[] = INCBIN_U8("graphics/pokemon/egg/shard.4bpp"); -static const struct OamData sOamData_EggHatch = +static const struct OamData sOamData_Egg = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -97,64 +103,71 @@ static const struct OamData sOamData_EggHatch = .affineParam = 0, }; -static const union AnimCmd sSpriteAnim_EggHatch0[] = +static const union AnimCmd sSpriteAnim_Egg_Normal[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_EggHatch1[] = +static const union AnimCmd sSpriteAnim_Egg_Cracked1[] = { ANIMCMD_FRAME(16, 5), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_EggHatch2[] = +static const union AnimCmd sSpriteAnim_Egg_Cracked2[] = { ANIMCMD_FRAME(32, 5), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_EggHatch3[] = +static const union AnimCmd sSpriteAnim_Egg_Cracked3[] = { ANIMCMD_FRAME(48, 5), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_EggHatch[] = +enum { + EGG_ANIM_NORMAL, + EGG_ANIM_CRACKED_1, + EGG_ANIM_CRACKED_2, + EGG_ANIM_CRACKED_3, +}; + +static const union AnimCmd *const sSpriteAnimTable_Egg[] = { - sSpriteAnim_EggHatch0, - sSpriteAnim_EggHatch1, - sSpriteAnim_EggHatch2, - sSpriteAnim_EggHatch3, + [EGG_ANIM_NORMAL] = sSpriteAnim_Egg_Normal, + [EGG_ANIM_CRACKED_1] = sSpriteAnim_Egg_Cracked1, + [EGG_ANIM_CRACKED_2] = sSpriteAnim_Egg_Cracked2, + [EGG_ANIM_CRACKED_3] = sSpriteAnim_Egg_Cracked3, }; static const struct SpriteSheet sEggHatch_Sheet = { .data = sEggHatchTiles, - .size = 2048, - .tag = 12345, + .size = 0x800, + .tag = GFXTAG_EGG, }; static const struct SpriteSheet sEggShards_Sheet = { .data = sEggShardTiles, - .size = 128, - .tag = 23456, + .size = 0x80, + .tag = GFXTAG_EGG_SHARD, }; static const struct SpritePalette sEgg_SpritePalette = { .data = sEggPalette, - .tag = 54321 + .tag = PALTAG_EGG }; -static const struct SpriteTemplate sSpriteTemplate_EggHatch = +static const struct SpriteTemplate sSpriteTemplate_Egg = { - .tileTag = 12345, - .paletteTag = 54321, - .oam = &sOamData_EggHatch, - .anims = sSpriteAnimTable_EggHatch, + .tileTag = GFXTAG_EGG, + .paletteTag = PALTAG_EGG, + .oam = &sOamData_Egg, + .anims = sSpriteAnimTable_Egg, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy @@ -211,8 +224,8 @@ static const union AnimCmd *const sSpriteAnimTable_EggShard[] = static const struct SpriteTemplate sSpriteTemplate_EggShard = { - .tileTag = 23456, - .paletteTag = 54321, + .tileTag = GFXTAG_EGG_SHARD, + .paletteTag = PALTAG_EGG, .oam = &sOamData_EggShard, .anims = sSpriteAnimTable_EggShard, .images = NULL, @@ -220,7 +233,7 @@ static const struct SpriteTemplate sSpriteTemplate_EggShard = .callback = SpriteCB_EggShard }; -static const struct BgTemplate sBgTemplates_EggHatch[2] = +static const struct BgTemplate sBgTemplates_EggHatch[] = { { .bg = 0, @@ -243,7 +256,7 @@ static const struct BgTemplate sBgTemplates_EggHatch[2] = }, }; -static const struct WindowTemplate sWinTemplates_EggHatch[2] = +static const struct WindowTemplate sWinTemplates_EggHatch[] = { { .bg = 0, @@ -270,9 +283,14 @@ static const struct WindowTemplate sYesNoWinTemplate = static const s16 sEggShardVelocities[][2] = { + // First shake {Q_8_8(-1.5), Q_8_8(-3.75)}, + + // Third shake {Q_8_8(-5), Q_8_8(-3)}, {Q_8_8(3.5), Q_8_8(-3)}, + + // Hatching {Q_8_8(-4), Q_8_8(-3.75)}, {Q_8_8(2), Q_8_8(-1.5)}, {Q_8_8(-0.5), Q_8_8(-6.75)}, @@ -291,8 +309,6 @@ static const s16 sEggShardVelocities[][2] = {Q_8_8(2.5), Q_8_8(-7.5)}, }; -// code - static void CreateHatchedMon(struct Pokemon *egg, struct Pokemon *temp) { u16 species; @@ -301,21 +317,17 @@ static void CreateHatchedMon(struct Pokemon *egg, struct Pokemon *temp) u16 moves[MAX_MON_MOVES]; u32 ivs[NUM_STATS]; - species = GetMonData(egg, MON_DATA_SPECIES); for (i = 0; i < MAX_MON_MOVES; i++) - { moves[i] = GetMonData(egg, MON_DATA_MOVE1 + i); - } personality = GetMonData(egg, MON_DATA_PERSONALITY); for (i = 0; i < NUM_STATS; i++) - { ivs[i] = GetMonData(egg, MON_DATA_HP_IV + i); - } + // The language is initially read from the Egg but is later overwritten below language = GetMonData(egg, MON_DATA_LANGUAGE); gameMet = GetMonData(egg, MON_DATA_MET_GAME); markings = GetMonData(egg, MON_DATA_MARKINGS); @@ -325,14 +337,10 @@ static void CreateHatchedMon(struct Pokemon *egg, struct Pokemon *temp) CreateMon(temp, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, TRUE, personality, OT_ID_PLAYER_ID, 0); for (i = 0; i < MAX_MON_MOVES; i++) - { SetMonData(temp, MON_DATA_MOVE1 + i, &moves[i]); - } for (i = 0; i < NUM_STATS; i++) - { SetMonData(temp, MON_DATA_HP_IV + i, &ivs[i]); - } language = GAME_LANGUAGE; SetMonData(temp, MON_DATA_LANGUAGE, &language); @@ -350,34 +358,35 @@ static void CreateHatchedMon(struct Pokemon *egg, struct Pokemon *temp) static void AddHatchedMonToParty(u8 id) { u8 isEgg = 0x46; // ? - u16 pokeNum; - u8 name[12]; + u16 species; + u8 name[POKEMON_NAME_LENGTH + 1]; u16 ball; - u16 caughtLvl; - u8 mapNameID; + u16 metLevel; + u8 metLocation; struct Pokemon* mon = &gPlayerParty[id]; CreateHatchedMon(mon, &gEnemyParty[0]); SetMonData(mon, MON_DATA_IS_EGG, &isEgg); - pokeNum = GetMonData(mon, MON_DATA_SPECIES); - GetSpeciesName(name, pokeNum); + species = GetMonData(mon, MON_DATA_SPECIES); + GetSpeciesName(name, species); SetMonData(mon, MON_DATA_NICKNAME, name); - pokeNum = SpeciesToNationalPokedexNum(pokeNum); - GetSetPokedexFlag(pokeNum, FLAG_SET_SEEN); - GetSetPokedexFlag(pokeNum, FLAG_SET_CAUGHT); + species = SpeciesToNationalPokedexNum(species); + GetSetPokedexFlag(species, FLAG_SET_SEEN); + GetSetPokedexFlag(species, FLAG_SET_CAUGHT); GetMonNickname2(mon, gStringVar1); ball = ITEM_POKE_BALL; SetMonData(mon, MON_DATA_POKEBALL, &ball); - caughtLvl = 0; - SetMonData(mon, MON_DATA_MET_LEVEL, &caughtLvl); + // A met level of 0 is interpreted on the summary screen as "hatched at" + metLevel = 0; + SetMonData(mon, MON_DATA_MET_LEVEL, &metLevel); - mapNameID = GetCurrentRegionMapSectionId(); - SetMonData(mon, MON_DATA_MET_LOCATION, &mapNameID); + metLocation = GetCurrentRegionMapSectionId(); + SetMonData(mon, MON_DATA_MET_LOCATION, &metLocation); MonRestorePP(mon); CalculateMonStats(mon); @@ -396,7 +405,7 @@ static bool8 _CheckDaycareMonReceivedMail(struct DayCare *daycare, u8 daycareId) GetBoxMonNickname(&daycareMon->mon, nickname); if (daycareMon->mail.message.itemId != ITEM_NONE && (StringCompareWithoutExtCtrlCodes(nickname, daycareMon->mail.monName) != 0 - || StringCompareWithoutExtCtrlCodes(gSaveBlock2Ptr->playerName, daycareMon->mail.otName) != 0)) + || StringCompareWithoutExtCtrlCodes(gSaveBlock2Ptr->playerName, daycareMon->mail.otName) != 0)) { StringCopy(gStringVar1, nickname); TVShowConvertInternationalString(gStringVar2, daycareMon->mail.otName, daycareMon->mail.gameLanguage); @@ -411,26 +420,27 @@ bool8 CheckDaycareMonReceivedMail(void) return _CheckDaycareMonReceivedMail(&gSaveBlock1Ptr->daycare, gSpecialVar_0x8004); } -static u8 EggHatchCreateMonSprite(u8 useAlt, u8 switchID, u8 pokeID, u16* speciesLoc) +static u8 EggHatchCreateMonSprite(u8 useAlt, u8 state, u8 partyId, u16* speciesLoc) { u8 position = 0; - u8 spriteID = 0; + u8 spriteId = 0; struct Pokemon* mon = NULL; if (useAlt == FALSE) { - mon = &gPlayerParty[pokeID]; + mon = &gPlayerParty[partyId]; position = B_POSITION_OPPONENT_LEFT; } if (useAlt == TRUE) { // Alternate sprite allocation position. Never reached. - mon = &gPlayerParty[pokeID]; + mon = &gPlayerParty[partyId]; position = B_POSITION_OPPONENT_RIGHT; } - switch (switchID) + switch (state) { case 0: + // Load mon sprite gfx { u16 species = GetMonData(mon, MON_DATA_SPECIES); u32 pid = GetMonData(mon, MON_DATA_PERSONALITY); @@ -442,13 +452,14 @@ static u8 EggHatchCreateMonSprite(u8 useAlt, u8 switchID, u8 pokeID, u16* specie } break; case 1: + // Create mon sprite SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, position); - spriteID = CreateSprite(&gMultiuseSpriteTemplate, 120, 75, 6); - gSprites[spriteID].invisible = TRUE; - gSprites[spriteID].callback = SpriteCallbackDummy; + spriteId = CreateSprite(&gMultiuseSpriteTemplate, EGG_X, EGG_Y, 6); + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].callback = SpriteCallbackDummy; break; } - return spriteID; + return spriteId; } static void VBlankCB_EggHatch(void) @@ -465,28 +476,28 @@ void EggHatch(void) FadeScreen(FADE_TO_BLACK, 0); } -static void Task_EggHatch(u8 taskID) +static void Task_EggHatch(u8 taskId) { if (!gPaletteFade.active) { CleanupOverworldWindowsAndTilemaps(); - SetMainCallback2(CB2_EggHatch_0); + SetMainCallback2(CB2_LoadEggHatch); gFieldCallback = FieldCB_ContinueScriptHandleMusic; - DestroyTask(taskID); + DestroyTask(taskId); } } -static void CB2_EggHatch_0(void) +static void CB2_LoadEggHatch(void) { switch (gMain.state) { case 0: SetGpuReg(REG_OFFSET_DISPCNT, 0); - sEggHatchData = Alloc(sizeof(struct EggHatchData)); + sEggHatchData = Alloc(sizeof(*sEggHatchData)); AllocateMonSpritesGfx(); - sEggHatchData->eggPartyID = gSpecialVar_0x8004; - sEggHatchData->eggShardVelocityID = 0; + sEggHatchData->eggPartyId = gSpecialVar_0x8004; + sEggHatchData->eggShardVelocityId = 0; SetVBlankCallback(VBlankCB_EggHatch); gSpecialVar_0x8005 = GetCurrentMapMusic(); @@ -532,15 +543,15 @@ static void CB2_EggHatch_0(void) break; case 4: CopyBgTilemapBufferToVram(0); - AddHatchedMonToParty(sEggHatchData->eggPartyID); + AddHatchedMonToParty(sEggHatchData->eggPartyId); gMain.state++; break; case 5: - EggHatchCreateMonSprite(FALSE, 0, sEggHatchData->eggPartyID, &sEggHatchData->species); + EggHatchCreateMonSprite(FALSE, 0, sEggHatchData->eggPartyId, &sEggHatchData->species); gMain.state++; break; case 6: - sEggHatchData->pokeSpriteID = EggHatchCreateMonSprite(FALSE, 1, sEggHatchData->eggPartyID, &sEggHatchData->species); + sEggHatchData->monSpriteId = EggHatchCreateMonSprite(FALSE, 1, sEggHatchData->eggPartyId, &sEggHatchData->species); gMain.state++; break; case 7: @@ -552,8 +563,8 @@ static void CB2_EggHatch_0(void) gMain.state++; break; case 8: - SetMainCallback2(CB2_EggHatch_1); - sEggHatchData->CB2_state = 0; + SetMainCallback2(CB2_EggHatch); + sEggHatchData->state = 0; break; } RunTasks(); @@ -571,121 +582,127 @@ static void EggHatchSetMonNickname(void) SetMainCallback2(CB2_ReturnToField); } -static void Task_EggHatchPlayBGM(u8 taskID) +#define tTimer data[0] + +static void Task_EggHatchPlayBGM(u8 taskId) { - if (gTasks[taskID].data[0] == 0) + if (gTasks[taskId].tTimer == 0) { StopMapMusic(); PlayRainStoppingSoundEffect(); } - if (gTasks[taskID].data[0] == 1) + + if (gTasks[taskId].tTimer == 1) PlayBGM(MUS_EVOLUTION_INTRO); - if (gTasks[taskID].data[0] > 60) + + if (gTasks[taskId].tTimer > 60) { PlayBGM(MUS_EVOLUTION); - DestroyTask(taskID); - // UB: task is destroyed, yet the value is incremented - #ifdef UBFIX - return; - #endif + DestroyTask(taskId); } - gTasks[taskID].data[0]++; + gTasks[taskId].tTimer++; } -static void CB2_EggHatch_1(void) +static void CB2_EggHatch(void) { u16 species; u8 gender; u32 personality; - switch (sEggHatchData->CB2_state) + switch (sEggHatchData->state) { case 0: - BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); - sEggHatchData->eggSpriteID = CreateSprite(&sSpriteTemplate_EggHatch, 120, 75, 5); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); + sEggHatchData->eggSpriteId = CreateSprite(&sSpriteTemplate_Egg, EGG_X, EGG_Y, 5); ShowBg(0); ShowBg(1); - sEggHatchData->CB2_state++; + sEggHatchData->state++; CreateTask(Task_EggHatchPlayBGM, 5); break; case 1: if (!gPaletteFade.active) { FillWindowPixelBuffer(sEggHatchData->windowId, PIXEL_FILL(0)); - sEggHatchData->CB2_PalCounter = 0; - sEggHatchData->CB2_state++; + sEggHatchData->delayTimer = 0; + sEggHatchData->state++; } break; case 2: - if (++sEggHatchData->CB2_PalCounter > 30) + if (++sEggHatchData->delayTimer > 30) { - sEggHatchData->CB2_state++; - gSprites[sEggHatchData->eggSpriteID].callback = SpriteCB_Egg_0; + // Start hatching animation + sEggHatchData->state++; + gSprites[sEggHatchData->eggSpriteId].callback = SpriteCB_Egg_Shake1; } break; case 3: - if (gSprites[sEggHatchData->eggSpriteID].callback == SpriteCallbackDummy) + // Wait for hatching animation to finish + if (gSprites[sEggHatchData->eggSpriteId].callback == SpriteCallbackDummy) { - species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES); - DoMonFrontSpriteAnimation(&gSprites[sEggHatchData->pokeSpriteID], species, FALSE, 1); - sEggHatchData->CB2_state++; + species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyId], MON_DATA_SPECIES); + DoMonFrontSpriteAnimation(&gSprites[sEggHatchData->monSpriteId], species, FALSE, 1); + sEggHatchData->state++; } break; case 4: - if (gSprites[sEggHatchData->pokeSpriteID].callback == SpriteCallbackDummy) - { - sEggHatchData->CB2_state++; - } + // Wait for Pokémon's front sprite animation + if (gSprites[sEggHatchData->monSpriteId].callback == SpriteCallbackDummy) + sEggHatchData->state++; break; case 5: - GetMonNickname2(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1); + // "{mon} hatched from egg" message/fanfare + GetMonNickname2(&gPlayerParty[sEggHatchData->eggPartyId], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_HatchedFromEgg); EggHatchPrintMessage(sEggHatchData->windowId, gStringVar4, 0, 3, TEXT_SKIP_DRAW); PlayFanfare(MUS_EVOLVED); - sEggHatchData->CB2_state++; + sEggHatchData->state++; PutWindowTilemap(sEggHatchData->windowId); CopyWindowToVram(sEggHatchData->windowId, COPYWIN_FULL); break; case 6: if (IsFanfareTaskInactive()) - sEggHatchData->CB2_state++; + sEggHatchData->state++; break; - case 7: + case 7: // Twice? if (IsFanfareTaskInactive()) - sEggHatchData->CB2_state++; + sEggHatchData->state++; break; case 8: - GetMonNickname2(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1); + // Ready the nickname prompt + GetMonNickname2(&gPlayerParty[sEggHatchData->eggPartyId], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_NicknameHatchPrompt); EggHatchPrintMessage(sEggHatchData->windowId, gStringVar4, 0, 2, 1); - sEggHatchData->CB2_state++; + sEggHatchData->state++; break; case 9: + // Print the nickname prompt if (!IsTextPrinterActive(sEggHatchData->windowId)) { LoadUserWindowBorderGfx(sEggHatchData->windowId, 0x140, 0xE0); CreateYesNoMenu(&sYesNoWinTemplate, 0x140, 0xE, 0); - sEggHatchData->CB2_state++; + sEggHatchData->state++; } break; case 10: + // Handle the nickname prompt input switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case 0: - GetMonNickname2(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar3); - species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES); - gender = GetMonGender(&gPlayerParty[sEggHatchData->eggPartyID]); - personality = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_PERSONALITY, 0); + case 0: // Yes + GetMonNickname2(&gPlayerParty[sEggHatchData->eggPartyId], gStringVar3); + species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyId], MON_DATA_SPECIES); + gender = GetMonGender(&gPlayerParty[sEggHatchData->eggPartyId]); + personality = GetMonData(&gPlayerParty[sEggHatchData->eggPartyId], MON_DATA_PERSONALITY, 0); DoNamingScreen(NAMING_SCREEN_NICKNAME, gStringVar3, species, gender, personality, EggHatchSetMonNickname); break; - case 1: - case -1: - sEggHatchData->CB2_state++; + case 1: // No + case MENU_B_PRESSED: + sEggHatchData->state++; + break; } break; case 11: - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); - sEggHatchData->CB2_state++; + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + sEggHatchData->state++; break; case 12: if (!gPaletteFade.active) @@ -707,136 +724,170 @@ static void CB2_EggHatch_1(void) UpdatePaletteFade(); } -static void SpriteCB_Egg_0(struct Sprite* sprite) +#define sTimer data[0] +#define sSinIdx data[1] +#define sDelayTimer data[2] + +static void SpriteCB_Egg_Shake1(struct Sprite* sprite) { - if (++sprite->data[0] > 20) + if (++sprite->sTimer > 20) { - sprite->callback = SpriteCB_Egg_1; - sprite->data[0] = 0; + sprite->callback = SpriteCB_Egg_Shake2; + sprite->sTimer = 0; } else { - sprite->data[1] = (sprite->data[1] + 20) & 0xFF; - sprite->x2 = Sin(sprite->data[1], 1); - if (sprite->data[0] == 15) + // Shake egg + sprite->sSinIdx = (sprite->sSinIdx + 20) & 0xFF; + sprite->x2 = Sin(sprite->sSinIdx, 1); + if (sprite->sTimer == 15) { + // First egg crack PlaySE(SE_BALL); - StartSpriteAnim(sprite, 1); + StartSpriteAnim(sprite, EGG_ANIM_CRACKED_1); CreateRandomEggShardSprite(); } } } -static void SpriteCB_Egg_1(struct Sprite* sprite) +static void SpriteCB_Egg_Shake2(struct Sprite* sprite) { - if (++sprite->data[2] > 30) + if (++sprite->sDelayTimer > 30) { - if (++sprite->data[0] > 20) + if (++sprite->sTimer > 20) { - sprite->callback = SpriteCB_Egg_2; - sprite->data[0] = 0; - sprite->data[2] = 0; + sprite->callback = SpriteCB_Egg_Shake3; + sprite->sTimer = 0; + sprite->sDelayTimer = 0; } else { - sprite->data[1] = (sprite->data[1] + 20) & 0xFF; - sprite->x2 = Sin(sprite->data[1], 2); - if (sprite->data[0] == 15) + // Shake egg + sprite->sSinIdx = (sprite->sSinIdx + 20) & 0xFF; + sprite->x2 = Sin(sprite->sSinIdx, 2); + if (sprite->sTimer == 15) { + // Second egg crack PlaySE(SE_BALL); - StartSpriteAnim(sprite, 2); + StartSpriteAnim(sprite, EGG_ANIM_CRACKED_2); } } } } -static void SpriteCB_Egg_2(struct Sprite* sprite) +static void SpriteCB_Egg_Shake3(struct Sprite* sprite) { - if (++sprite->data[2] > 30) + if (++sprite->sDelayTimer > 30) { - if (++sprite->data[0] > 38) + if (++sprite->sTimer > 38) { u16 species; - - sprite->callback = SpriteCB_Egg_3; - sprite->data[0] = 0; - species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES); - gSprites[sEggHatchData->pokeSpriteID].x2 = 0; - gSprites[sEggHatchData->pokeSpriteID].y2 = 0; + sprite->callback = SpriteCB_Egg_WaitHatch; + sprite->sTimer = 0; + species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyId], MON_DATA_SPECIES); + gSprites[sEggHatchData->monSpriteId].x2 = 0; + gSprites[sEggHatchData->monSpriteId].y2 = 0; } else { - sprite->data[1] = (sprite->data[1] + 20) & 0xFF; - sprite->x2 = Sin(sprite->data[1], 2); - if (sprite->data[0] == 15) + // Shake egg + sprite->sSinIdx = (sprite->sSinIdx + 20) & 0xFF; + sprite->x2 = Sin(sprite->sSinIdx, 2); + if (sprite->sTimer == 15) { + // Third egg crack + // This ineffectually sets the animation to the frame it's already using. + // They likely meant to use the 3rd and final cracked frame of the egg, which goes unused as a result. PlaySE(SE_BALL); - StartSpriteAnim(sprite, 2); + #ifdef BUGFIX + StartSpriteAnim(sprite, EGG_ANIM_CRACKED_3); + #else + StartSpriteAnim(sprite, EGG_ANIM_CRACKED_2); + #endif CreateRandomEggShardSprite(); CreateRandomEggShardSprite(); } - if (sprite->data[0] == 30) + if (sprite->sTimer == 30) PlaySE(SE_BALL); } } } -static void SpriteCB_Egg_3(struct Sprite* sprite) +static void SpriteCB_Egg_WaitHatch(struct Sprite* sprite) { - if (++sprite->data[0] > 50) + if (++sprite->sTimer > 50) { - sprite->callback = SpriteCB_Egg_4; - sprite->data[0] = 0; + sprite->callback = SpriteCB_Egg_Hatch; + sprite->sTimer = 0; } } -static void SpriteCB_Egg_4(struct Sprite* sprite) +static void SpriteCB_Egg_Hatch(struct Sprite* sprite) { s16 i; - if (sprite->data[0] == 0) - BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 0x10, RGB_WHITEALPHA); - if (sprite->data[0] < 4u) + + // Fade to white to hide transition from egg to Pokémon + if (sprite->sTimer == 0) + BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_WHITEALPHA); + + // Create a shower of 16 egg shards in 4 groups of 4 + if ((u32)sprite->sTimer < 4) { - for (i = 0; i <= 3; i++) + for (i = 0; i < 4; i++) CreateRandomEggShardSprite(); } - sprite->data[0]++; + + sprite->sTimer++; + if (!gPaletteFade.active) { + // Screen is hidden by the fade to white, hide egg PlaySE(SE_EGG_HATCH); sprite->invisible = TRUE; - sprite->callback = SpriteCB_Egg_5; - sprite->data[0] = 0; + sprite->callback = SpriteCB_Egg_Reveal; + sprite->sTimer = 0; } } -static void SpriteCB_Egg_5(struct Sprite* sprite) +static void SpriteCB_Egg_Reveal(struct Sprite* sprite) { - if (sprite->data[0] == 0) + if (sprite->sTimer == 0) { - gSprites[sEggHatchData->pokeSpriteID].invisible = FALSE; - StartSpriteAffineAnim(&gSprites[sEggHatchData->pokeSpriteID], BATTLER_AFFINE_EMERGE); + // Reveal hatched Pokémon + gSprites[sEggHatchData->monSpriteId].invisible = FALSE; + StartSpriteAffineAnim(&gSprites[sEggHatchData->monSpriteId], BATTLER_AFFINE_EMERGE); } - if (sprite->data[0] == 8) - BeginNormalPaletteFade(PALETTES_ALL, -1, 0x10, 0, RGB_WHITEALPHA); - if (sprite->data[0] <= 9) - gSprites[sEggHatchData->pokeSpriteID].y -= 1; - if (sprite->data[0] > 40) - sprite->callback = SpriteCallbackDummy; - sprite->data[0]++; + + // Fade back from white for reveal + if (sprite->sTimer == 8) + BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_WHITEALPHA); + + if (sprite->sTimer <= 9) + gSprites[sEggHatchData->monSpriteId].y--; + + if (sprite->sTimer > 40) + sprite->callback = SpriteCallbackDummy; // Finished + + sprite->sTimer++; } +#define sVelocX data[1] +#define sVelocY data[2] +#define sAccelY data[3] +#define sDeltaX data[4] +#define sDeltaY data[5] + static void SpriteCB_EggShard(struct Sprite* sprite) { - sprite->data[4] += sprite->data[1]; - sprite->data[5] += sprite->data[2]; + sprite->sDeltaX += sprite->sVelocX; + sprite->sDeltaY += sprite->sVelocY; - sprite->x2 = sprite->data[4] / 256; - sprite->y2 = sprite->data[5] / 256; + sprite->x2 = sprite->sDeltaX / 256; + sprite->y2 = sprite->sDeltaY / 256; - sprite->data[2] += sprite->data[3]; + sprite->sVelocY += sprite->sAccelY; - if (sprite->y + sprite->y2 > sprite->y + 20 && sprite->data[2] > 0) + if (sprite->y + sprite->y2 > sprite->y + 20 && sprite->sVelocY > 0) DestroySprite(sprite); } @@ -844,20 +895,23 @@ static void CreateRandomEggShardSprite(void) { u16 spriteAnimIndex; - s16 velocity1 = sEggShardVelocities[sEggHatchData->eggShardVelocityID][0]; - s16 velocity2 = sEggShardVelocities[sEggHatchData->eggShardVelocityID][1]; - sEggHatchData->eggShardVelocityID++; - spriteAnimIndex = Random() % 4; - CreateEggShardSprite(120, 60, velocity1, velocity2, 100, spriteAnimIndex); + s16 velocityX = sEggShardVelocities[sEggHatchData->eggShardVelocityId][0]; + s16 velocityY = sEggShardVelocities[sEggHatchData->eggShardVelocityId][1]; + sEggHatchData->eggShardVelocityId++; + + // Randomly choose one of the 4 shard images + spriteAnimIndex = Random() % ARRAY_COUNT(sSpriteAnimTable_EggShard); + + CreateEggShardSprite(EGG_X, EGG_Y - 15, velocityX, velocityY, 100, spriteAnimIndex); } -static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex) +static void CreateEggShardSprite(u8 x, u8 y, s16 velocityX, s16 velocityY, s16 acceleration, u8 spriteAnimIndex) { - u8 spriteID = CreateSprite(&sSpriteTemplate_EggShard, x, y, 4); - gSprites[spriteID].data[1] = data1; - gSprites[spriteID].data[2] = data2; - gSprites[spriteID].data[3] = data3; - StartSpriteAnim(&gSprites[spriteID], spriteAnimIndex); + u8 spriteId = CreateSprite(&sSpriteTemplate_EggShard, x, y, 4); + gSprites[spriteId].sVelocX = velocityX; + gSprites[spriteId].sVelocY = velocityY; + gSprites[spriteId].sAccelY = acceleration; + StartSpriteAnim(&gSprites[spriteId], spriteAnimIndex); } static void EggHatchPrintMessage(u8 windowId, u8* string, u8 x, u8 y, u8 speed) From f78f46a1e28667632bf25c968ffb97aea84bdb15 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Thu, 3 Mar 2022 14:54:05 -0500 Subject: [PATCH 091/105] Use ARRAY_COUNT for obj event subsprite tables --- .../object_events/object_event_subsprites.h | 96 +++++++++---------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/src/data/object_events/object_event_subsprites.h b/src/data/object_events/object_event_subsprites.h index b508509cad..8084919927 100755 --- a/src/data/object_events/object_event_subsprites.h +++ b/src/data/object_events/object_event_subsprites.h @@ -78,12 +78,12 @@ static const struct Subsprite sOamTable_16x16_4[] = { }; static const struct SubspriteTable sOamTables_16x16[] = { - {0, NULL}, - {1, sOamTable_16x16_0}, - {1, sOamTable_16x16_1}, - {2, sOamTable_16x16_2}, - {2, sOamTable_16x16_3}, - {2, sOamTable_16x16_4} + {}, + {ARRAY_COUNT(sOamTable_16x16_0), sOamTable_16x16_0}, + {ARRAY_COUNT(sOamTable_16x16_1), sOamTable_16x16_1}, + {ARRAY_COUNT(sOamTable_16x16_2), sOamTable_16x16_2}, + {ARRAY_COUNT(sOamTable_16x16_3), sOamTable_16x16_3}, + {ARRAY_COUNT(sOamTable_16x16_4), sOamTable_16x16_4} }; static const struct Subsprite sOamTable_16x32_0[] = { @@ -174,12 +174,12 @@ static const struct Subsprite sOamTable_16x32_4[] = { }; static const struct SubspriteTable sOamTables_16x32[] = { - {0, NULL}, - {1, sOamTable_16x32_0}, - {1, sOamTable_16x32_1}, - {3, sOamTable_16x32_2}, - {2, sOamTable_16x32_3}, - {2, sOamTable_16x32_4} + {}, + {ARRAY_COUNT(sOamTable_16x32_0), sOamTable_16x32_0}, + {ARRAY_COUNT(sOamTable_16x32_1), sOamTable_16x32_1}, + {ARRAY_COUNT(sOamTable_16x32_2), sOamTable_16x32_2}, + {ARRAY_COUNT(sOamTable_16x32_3), sOamTable_16x32_3}, + {ARRAY_COUNT(sOamTable_16x32_4), sOamTable_16x32_4} }; static const struct Subsprite sOamTable_32x32_0[] = { @@ -270,12 +270,12 @@ static const struct Subsprite sOamTable_32x32_4[] = { }; static const struct SubspriteTable sOamTables_32x32[] = { - {0, NULL}, - {1, sOamTable_32x32_0}, - {1, sOamTable_32x32_1}, - {3, sOamTable_32x32_2}, - {2, sOamTable_32x32_3}, - {2, sOamTable_32x32_4} + {}, + {ARRAY_COUNT(sOamTable_32x32_0), sOamTable_32x32_0}, + {ARRAY_COUNT(sOamTable_32x32_1), sOamTable_32x32_1}, + {ARRAY_COUNT(sOamTable_32x32_2), sOamTable_32x32_2}, + {ARRAY_COUNT(sOamTable_32x32_3), sOamTable_32x32_3}, + {ARRAY_COUNT(sOamTable_32x32_4), sOamTable_32x32_4} }; static const struct Subsprite sOamTable_48x48[] = { @@ -378,12 +378,12 @@ static const struct Subsprite sOamTable_48x48[] = { }; static const struct SubspriteTable sOamTables_48x48[] = { - {12, sOamTable_48x48}, - {12, sOamTable_48x48}, - {12, sOamTable_48x48}, - {12, sOamTable_48x48}, - {12, sOamTable_48x48}, - {12, sOamTable_48x48} + {ARRAY_COUNT(sOamTable_48x48), sOamTable_48x48}, + {ARRAY_COUNT(sOamTable_48x48), sOamTable_48x48}, + {ARRAY_COUNT(sOamTable_48x48), sOamTable_48x48}, + {ARRAY_COUNT(sOamTable_48x48), sOamTable_48x48}, + {ARRAY_COUNT(sOamTable_48x48), sOamTable_48x48}, + {ARRAY_COUNT(sOamTable_48x48), sOamTable_48x48} }; static const struct Subsprite sOamTable_64x32_0[] = { @@ -432,12 +432,12 @@ static const struct Subsprite sOamTable_64x32_3[] = { // Unused static const struct SubspriteTable sOamTables_64x32[] = { - {0, NULL}, - {1, sOamTable_64x32_0}, - {1, sOamTable_64x32_1}, - {1, sOamTable_64x32_2}, - {1, sOamTable_64x32_3}, - {1, sOamTable_64x32_3} + {}, + {ARRAY_COUNT(sOamTable_64x32_0), sOamTable_64x32_0}, + {ARRAY_COUNT(sOamTable_64x32_1), sOamTable_64x32_1}, + {ARRAY_COUNT(sOamTable_64x32_2), sOamTable_64x32_2}, + {ARRAY_COUNT(sOamTable_64x32_3), sOamTable_64x32_3}, + {ARRAY_COUNT(sOamTable_64x32_3), sOamTable_64x32_3} }; static const struct Subsprite sOamTable_64x64_0[] = { @@ -485,12 +485,12 @@ static const struct Subsprite sOamTable_64x64_3[] = { }; static const struct SubspriteTable sOamTables_64x64[] = { - {0, NULL}, - {1, sOamTable_64x64_0}, - {1, sOamTable_64x64_1}, - {1, sOamTable_64x64_2}, - {1, sOamTable_64x64_3}, - {1, sOamTable_64x64_3} + {}, + {ARRAY_COUNT(sOamTable_64x64_0), sOamTable_64x64_0}, + {ARRAY_COUNT(sOamTable_64x64_1), sOamTable_64x64_1}, + {ARRAY_COUNT(sOamTable_64x64_2), sOamTable_64x64_2}, + {ARRAY_COUNT(sOamTable_64x64_3), sOamTable_64x64_3}, + {ARRAY_COUNT(sOamTable_64x64_3), sOamTable_64x64_3} }; static const struct Subsprite sOamTable_96x40_0[] = { @@ -987,12 +987,12 @@ static const struct Subsprite sOamTable_96x40_3[] = { // Used by SS Tidal static const struct SubspriteTable sOamTables_96x40[] = { - {15, sOamTable_96x40_0}, - {15, sOamTable_96x40_0}, - {15, sOamTable_96x40_1}, - {15, sOamTable_96x40_2}, - {15, sOamTable_96x40_3}, - {15, sOamTable_96x40_3} + {ARRAY_COUNT(sOamTable_96x40_0), sOamTable_96x40_0}, + {ARRAY_COUNT(sOamTable_96x40_0), sOamTable_96x40_0}, + {ARRAY_COUNT(sOamTable_96x40_1), sOamTable_96x40_1}, + {ARRAY_COUNT(sOamTable_96x40_2), sOamTable_96x40_2}, + {ARRAY_COUNT(sOamTable_96x40_3), sOamTable_96x40_3}, + {ARRAY_COUNT(sOamTable_96x40_3), sOamTable_96x40_3} }; static const struct Subsprite sOamTable_88x32_0[] = { @@ -1521,10 +1521,10 @@ static const struct Subsprite sOamTable_88x32_3[] = { // Used by Submarine Shadow static const struct SubspriteTable sOamTables_88x32[] = { - {16, sOamTable_88x32_0}, - {16, sOamTable_88x32_0}, - {16, sOamTable_88x32_1}, - {16, sOamTable_88x32_2}, - {16, sOamTable_88x32_3}, - {16, sOamTable_88x32_3} + {ARRAY_COUNT(sOamTable_88x32_0), sOamTable_88x32_0}, + {ARRAY_COUNT(sOamTable_88x32_0), sOamTable_88x32_0}, + {ARRAY_COUNT(sOamTable_88x32_1), sOamTable_88x32_1}, + {ARRAY_COUNT(sOamTable_88x32_2), sOamTable_88x32_2}, + {ARRAY_COUNT(sOamTable_88x32_3), sOamTable_88x32_3}, + {ARRAY_COUNT(sOamTable_88x32_3), sOamTable_88x32_3} }; From f53de6ae8702a405486d17b06e1e90be26877ff4 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Tue, 8 Mar 2022 15:16:17 -0500 Subject: [PATCH 092/105] fix toxic/flame orb. use CanBeX'ed functions --- src/battle_util.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 7143c4864a..763a910ac2 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7332,11 +7332,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) switch (battlerHoldEffect) { case HOLD_EFFECT_TOXIC_ORB: - if (!gBattleMons[battlerId].status1 - && CanPoisonType(battlerId, battlerId) - && battlerAbility != ABILITY_IMMUNITY - && battlerAbility != ABILITY_COMATOSE - && IsBattlerAlive) + if (IsBattlerAlive(battlerId) && CanBePoisoned(battlerId, battlerId)) { effect = ITEM_STATUS_CHANGE; gBattleMons[battlerId].status1 = STATUS1_TOXIC_POISON; @@ -7345,12 +7341,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_FLAME_ORB: - if (!gBattleMons[battlerId].status1 - && !IS_BATTLER_OF_TYPE(battlerId, TYPE_FIRE) - && battlerAbility != ABILITY_WATER_VEIL - && battlerAbility != ABILITY_WATER_BUBBLE - && battlerAbility != ABILITY_COMATOSE - && IsBattlerAlive) + if (IsBattlerAlive(battlerId) && CanBeBurned(battlerId)) { effect = ITEM_STATUS_CHANGE; gBattleMons[battlerId].status1 = STATUS1_BURN; From d3589103b304a1d51d7095298595e0ff6721f9a6 Mon Sep 17 00:00:00 2001 From: SubzeroEclipse <64367060+SubzeroEclipse@users.noreply.github.com> Date: Wed, 9 Mar 2022 15:23:08 +0100 Subject: [PATCH 093/105] Fixed some move descriptions --- src/data/text/move_descriptions.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index 4704af3fd5..f3b9827566 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -1778,7 +1778,7 @@ static const u8 sChargeBeamDescription[] = _( "May raise Sp. Atk."); static const u8 sWoodHammerDescription[] = _( - "Slams the body into a foe\n" + "Slams the body into a foe.\n" "The user gets hurt too."); static const u8 sAquaJetDescription[] = _( @@ -2307,7 +2307,7 @@ static const u8 sWaterShurikenDescription[] = _( static const u8 sMysticalFireDescription[] = _( "Breathes a special, hot\n" - "fire. May lower Sp. Atk."); + "fire. Lowers Sp. Atk."); static const u8 sSpikyShieldDescription[] = _( "Evades attack, and damages\n" @@ -2763,7 +2763,7 @@ static const u8 sBehemothBladeDescription[] = _( "2x damage to Dynamaxed foes."); static const u8 sBehemothBashDescription[] = _( - "Attacks as a sheild. Deals\n" + "Attacks as a shield. Deals\n" "2x damage to Dynamaxed foes."); static const u8 sAuraWheelDescription[] = _( @@ -3356,7 +3356,7 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_DRAGON_PULSE - 1] = sDragonPulseDescription, [MOVE_DRAGON_RUSH - 1] = sDragonRushDescription, [MOVE_POWER_GEM - 1] = sPowerGemDescription, - [MOVE_DRAIN_PUNCH - 1] = sDrainingKissDescription, + [MOVE_DRAIN_PUNCH - 1] = sMegaDrainDescription, [MOVE_VACUUM_WAVE - 1] = sVacuumWaveDescription, [MOVE_FOCUS_BLAST - 1] = sFocusBlastDescription, [MOVE_ENERGY_BALL - 1] = sEnergyBallDescription, From d66413557288082f0b553b209b51fede7d8810c8 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Thu, 10 Mar 2022 10:33:23 -0500 Subject: [PATCH 094/105] Add usage of battle strings table offset constant --- include/battle_arena.h | 2 +- include/constants/battle_string_ids.h | 10 +- src/battle_arena.c | 2 +- src/battle_controller_opponent.c | 2 +- src/battle_controller_player.c | 2 +- src/battle_message.c | 746 +++++++++++++------------- src/battle_tv.c | 2 +- src/evolution_scene.c | 44 +- 8 files changed, 406 insertions(+), 404 deletions(-) diff --git a/include/battle_arena.h b/include/battle_arena.h index c9a18ef618..cc0e72c0c1 100644 --- a/include/battle_arena.h +++ b/include/battle_arena.h @@ -6,7 +6,7 @@ u8 BattleArena_ShowJudgmentWindow(u8 *state); void BattleArena_InitPoints(void); void BattleArena_AddMindPoints(u8 battler); void BattleArena_AddSkillPoints(u8 battler); -void BattleArena_DeductMindPoints(u8 battler, u16 stringId); +void BattleArena_DeductSkillPoints(u8 battler, u16 stringId); void DrawArenaRefereeTextBox(void); void EraseArenaRefereeTextBox(void); diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index c8d37aac61..d5d0698b91 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -1,10 +1,6 @@ #ifndef GUARD_CONSTANTS_BATTLE_STRING_IDS_H #define GUARD_CONSTANTS_BATTLE_STRING_IDS_H -#define BATTLESTRINGS_COUNT 369 - -#define BATTLESTRINGS_ID_ADDER 12 // all battlestrings have its ID + 12, because first 5 are reserved - #define STRINGID_INTROMSG 0 #define STRINGID_INTROSENDOUT 1 #define STRINGID_RETURNMON 2 @@ -383,6 +379,12 @@ #define STRINGID_TRAINER1WINTEXT 379 #define STRINGID_TRAINER2WINTEXT 380 +#define BATTLESTRINGS_COUNT 381 + +// This is the string id that gBattleStringsTable starts with. +// String ids before this (e.g. STRINGID_INTROMSG) are not in the table, +// and are instead handled explicitly by BufferStringBattle. +#define BATTLESTRINGS_TABLE_START STRINGID_TRAINER1LOSETEXT // The below IDs are all indexes into battle message tables, // used to determine which of a set of messages to print. diff --git a/src/battle_arena.c b/src/battle_arena.c index f744a3b2b5..a7c74366b5 100644 --- a/src/battle_arena.c +++ b/src/battle_arena.c @@ -741,7 +741,7 @@ void BattleArena_AddSkillPoints(u8 battler) } } -void BattleArena_DeductMindPoints(u8 battler, u16 stringId) +void BattleArena_DeductSkillPoints(u8 battler, u16 stringId) { s8 *skillPoints = gBattleStruct->arenaSkillPoints; diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index c3830780b3..ead5a8768a 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -1523,7 +1523,7 @@ static void OpponentHandlePrintString(void) BufferStringBattle(*stringId); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; - BattleArena_DeductMindPoints(gActiveBattler, *stringId); + BattleArena_DeductSkillPoints(gActiveBattler, *stringId); } static void OpponentHandlePrintSelectionString(void) diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 2133d5b6f4..5b69030dfc 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -2551,7 +2551,7 @@ static void PlayerHandlePrintString(void) BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter2; BattleTv_SetDataBasedOnString(*stringId); - BattleArena_DeductMindPoints(gActiveBattler, *stringId); + BattleArena_DeductSkillPoints(gActiveBattler, *stringId); } static void PlayerHandlePrintSelectionString(void) diff --git a/src/battle_message.c b/src/battle_message.c index 1df9356945..9d1b88ba7f 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -514,377 +514,377 @@ static const u8 sText_Trainer2WinText[]; static const u8 sText_TwoInGameTrainersDefeated[]; static const u8 sText_Trainer2LoseText[]; -const u8 * const gBattleStringsTable[BATTLESTRINGS_COUNT] = +const u8 * const gBattleStringsTable[BATTLESTRINGS_COUNT - BATTLESTRINGS_TABLE_START] = { - [STRINGID_TRAINER1LOSETEXT - 12] = sText_Trainer1LoseText, - [STRINGID_PKMNGAINEDEXP - 12] = sText_PkmnGainedEXP, - [STRINGID_PKMNGREWTOLV - 12] = sText_PkmnGrewToLv, - [STRINGID_PKMNLEARNEDMOVE - 12] = sText_PkmnLearnedMove, - [STRINGID_TRYTOLEARNMOVE1 - 12] = sText_TryToLearnMove1, - [STRINGID_TRYTOLEARNMOVE2 - 12] = sText_TryToLearnMove2, - [STRINGID_TRYTOLEARNMOVE3 - 12] = sText_TryToLearnMove3, - [STRINGID_PKMNFORGOTMOVE - 12] = sText_PkmnForgotMove, - [STRINGID_STOPLEARNINGMOVE - 12] = sText_StopLearningMove, - [STRINGID_DIDNOTLEARNMOVE - 12] = sText_DidNotLearnMove, - [STRINGID_PKMNLEARNEDMOVE2 - 12] = sText_PkmnLearnedMove2, - [STRINGID_ATTACKMISSED - 12] = sText_AttackMissed, - [STRINGID_PKMNPROTECTEDITSELF - 12] = sText_PkmnProtectedItself, - [STRINGID_STATSWONTINCREASE2 - 12] = sText_StatsWontIncrease2, - [STRINGID_AVOIDEDDAMAGE - 12] = sText_AvoidedDamage, - [STRINGID_ITDOESNTAFFECT - 12] = sText_ItDoesntAffect, - [STRINGID_ATTACKERFAINTED - 12] = sText_AttackerFainted, - [STRINGID_TARGETFAINTED - 12] = sText_TargetFainted, - [STRINGID_PLAYERGOTMONEY - 12] = sText_PlayerGotMoney, - [STRINGID_PLAYERWHITEOUT - 12] = sText_PlayerWhiteout, - [STRINGID_PLAYERWHITEOUT2 - 12] = sText_PlayerWhiteout2, - [STRINGID_PREVENTSESCAPE - 12] = sText_PreventsEscape, - [STRINGID_HITXTIMES - 12] = sText_HitXTimes, - [STRINGID_PKMNFELLASLEEP - 12] = sText_PkmnFellAsleep, - [STRINGID_PKMNMADESLEEP - 12] = sText_PkmnMadeSleep, - [STRINGID_PKMNALREADYASLEEP - 12] = sText_PkmnAlreadyAsleep, - [STRINGID_PKMNALREADYASLEEP2 - 12] = sText_PkmnAlreadyAsleep2, - [STRINGID_PKMNWASNTAFFECTED - 12] = sText_PkmnWasntAffected, - [STRINGID_PKMNWASPOISONED - 12] = sText_PkmnWasPoisoned, - [STRINGID_PKMNPOISONEDBY - 12] = sText_PkmnPoisonedBy, - [STRINGID_PKMNHURTBYPOISON - 12] = sText_PkmnHurtByPoison, - [STRINGID_PKMNALREADYPOISONED - 12] = sText_PkmnAlreadyPoisoned, - [STRINGID_PKMNBADLYPOISONED - 12] = sText_PkmnBadlyPoisoned, - [STRINGID_PKMNENERGYDRAINED - 12] = sText_PkmnEnergyDrained, - [STRINGID_PKMNWASBURNED - 12] = sText_PkmnWasBurned, - [STRINGID_PKMNBURNEDBY - 12] = sText_PkmnBurnedBy, - [STRINGID_PKMNHURTBYBURN - 12] = sText_PkmnHurtByBurn, - [STRINGID_PKMNWASFROZEN - 12] = sText_PkmnWasFrozen, - [STRINGID_PKMNFROZENBY - 12] = sText_PkmnFrozenBy, - [STRINGID_PKMNISFROZEN - 12] = sText_PkmnIsFrozen, - [STRINGID_PKMNWASDEFROSTED - 12] = sText_PkmnWasDefrosted, - [STRINGID_PKMNWASDEFROSTED2 - 12] = sText_PkmnWasDefrosted2, - [STRINGID_PKMNWASDEFROSTEDBY - 12] = sText_PkmnWasDefrostedBy, - [STRINGID_PKMNWASPARALYZED - 12] = sText_PkmnWasParalyzed, - [STRINGID_PKMNWASPARALYZEDBY - 12] = sText_PkmnWasParalyzedBy, - [STRINGID_PKMNISPARALYZED - 12] = sText_PkmnIsParalyzed, - [STRINGID_PKMNISALREADYPARALYZED - 12] = sText_PkmnIsAlreadyParalyzed, - [STRINGID_PKMNHEALEDPARALYSIS - 12] = sText_PkmnHealedParalysis, - [STRINGID_PKMNDREAMEATEN - 12] = sText_PkmnDreamEaten, - [STRINGID_STATSWONTINCREASE - 12] = sText_StatsWontIncrease, - [STRINGID_STATSWONTDECREASE - 12] = sText_StatsWontDecrease, - [STRINGID_TEAMSTOPPEDWORKING - 12] = sText_TeamStoppedWorking, - [STRINGID_FOESTOPPEDWORKING - 12] = sText_FoeStoppedWorking, - [STRINGID_PKMNISCONFUSED - 12] = sText_PkmnIsConfused, - [STRINGID_PKMNHEALEDCONFUSION - 12] = sText_PkmnHealedConfusion, - [STRINGID_PKMNWASCONFUSED - 12] = sText_PkmnWasConfused, - [STRINGID_PKMNALREADYCONFUSED - 12] = sText_PkmnAlreadyConfused, - [STRINGID_PKMNFELLINLOVE - 12] = sText_PkmnFellInLove, - [STRINGID_PKMNINLOVE - 12] = sText_PkmnInLove, - [STRINGID_PKMNIMMOBILIZEDBYLOVE - 12] = sText_PkmnImmobilizedByLove, - [STRINGID_PKMNBLOWNAWAY - 12] = sText_PkmnBlownAway, - [STRINGID_PKMNCHANGEDTYPE - 12] = sText_PkmnChangedType, - [STRINGID_PKMNFLINCHED - 12] = sText_PkmnFlinched, - [STRINGID_PKMNREGAINEDHEALTH - 12] = sText_PkmnRegainedHealth, - [STRINGID_PKMNHPFULL - 12] = sText_PkmnHPFull, - [STRINGID_PKMNRAISEDSPDEF - 12] = sText_PkmnRaisedSpDef, - [STRINGID_PKMNRAISEDDEF - 12] = sText_PkmnRaisedDef, - [STRINGID_PKMNCOVEREDBYVEIL - 12] = sText_PkmnCoveredByVeil, - [STRINGID_PKMNUSEDSAFEGUARD - 12] = sText_PkmnUsedSafeguard, - [STRINGID_PKMNSAFEGUARDEXPIRED - 12] = sText_PkmnSafeguardExpired, - [STRINGID_PKMNWENTTOSLEEP - 12] = sText_PkmnWentToSleep, - [STRINGID_PKMNSLEPTHEALTHY - 12] = sText_PkmnSleptHealthy, - [STRINGID_PKMNWHIPPEDWHIRLWIND - 12] = sText_PkmnWhippedWhirlwind, - [STRINGID_PKMNTOOKSUNLIGHT - 12] = sText_PkmnTookSunlight, - [STRINGID_PKMNLOWEREDHEAD - 12] = sText_PkmnLoweredHead, - [STRINGID_PKMNISGLOWING - 12] = sText_PkmnIsGlowing, - [STRINGID_PKMNFLEWHIGH - 12] = sText_PkmnFlewHigh, - [STRINGID_PKMNDUGHOLE - 12] = sText_PkmnDugHole, - [STRINGID_PKMNSQUEEZEDBYBIND - 12] = sText_PkmnSqueezedByBind, - [STRINGID_PKMNTRAPPEDINVORTEX - 12] = sText_PkmnTrappedInVortex, - [STRINGID_PKMNWRAPPEDBY - 12] = sText_PkmnWrappedBy, - [STRINGID_PKMNCLAMPED - 12] = sText_PkmnClamped, - [STRINGID_PKMNHURTBY - 12] = sText_PkmnHurtBy, - [STRINGID_PKMNFREEDFROM - 12] = sText_PkmnFreedFrom, - [STRINGID_PKMNCRASHED - 12] = sText_PkmnCrashed, - [STRINGID_PKMNSHROUDEDINMIST - 12] = gText_PkmnShroudedInMist, - [STRINGID_PKMNPROTECTEDBYMIST - 12] = sText_PkmnProtectedByMist, - [STRINGID_PKMNGETTINGPUMPED - 12] = gText_PkmnGettingPumped, - [STRINGID_PKMNHITWITHRECOIL - 12] = sText_PkmnHitWithRecoil, - [STRINGID_PKMNPROTECTEDITSELF2 - 12] = sText_PkmnProtectedItself2, - [STRINGID_PKMNBUFFETEDBYSANDSTORM - 12] = sText_PkmnBuffetedBySandstorm, - [STRINGID_PKMNPELTEDBYHAIL - 12] = sText_PkmnPeltedByHail, - [STRINGID_PKMNSEEDED - 12] = sText_PkmnSeeded, - [STRINGID_PKMNEVADEDATTACK - 12] = sText_PkmnEvadedAttack, - [STRINGID_PKMNSAPPEDBYLEECHSEED - 12] = sText_PkmnSappedByLeechSeed, - [STRINGID_PKMNFASTASLEEP - 12] = sText_PkmnFastAsleep, - [STRINGID_PKMNWOKEUP - 12] = sText_PkmnWokeUp, - [STRINGID_PKMNUPROARKEPTAWAKE - 12] = sText_PkmnUproarKeptAwake, - [STRINGID_PKMNWOKEUPINUPROAR - 12] = sText_PkmnWokeUpInUproar, - [STRINGID_PKMNCAUSEDUPROAR - 12] = sText_PkmnCausedUproar, - [STRINGID_PKMNMAKINGUPROAR - 12] = sText_PkmnMakingUproar, - [STRINGID_PKMNCALMEDDOWN - 12] = sText_PkmnCalmedDown, - [STRINGID_PKMNCANTSLEEPINUPROAR - 12] = sText_PkmnCantSleepInUproar, - [STRINGID_PKMNSTOCKPILED - 12] = sText_PkmnStockpiled, - [STRINGID_PKMNCANTSTOCKPILE - 12] = sText_PkmnCantStockpile, - [STRINGID_PKMNCANTSLEEPINUPROAR2 - 12] = sText_PkmnCantSleepInUproar2, - [STRINGID_UPROARKEPTPKMNAWAKE - 12] = sText_UproarKeptPkmnAwake, - [STRINGID_PKMNSTAYEDAWAKEUSING - 12] = sText_PkmnStayedAwakeUsing, - [STRINGID_PKMNSTORINGENERGY - 12] = sText_PkmnStoringEnergy, - [STRINGID_PKMNUNLEASHEDENERGY - 12] = sText_PkmnUnleashedEnergy, - [STRINGID_PKMNFATIGUECONFUSION - 12] = sText_PkmnFatigueConfusion, - [STRINGID_PLAYERPICKEDUPMONEY - 12] = sText_PlayerPickedUpMoney, - [STRINGID_PKMNUNAFFECTED - 12] = sText_PkmnUnaffected, - [STRINGID_PKMNTRANSFORMEDINTO - 12] = sText_PkmnTransformedInto, - [STRINGID_PKMNMADESUBSTITUTE - 12] = sText_PkmnMadeSubstitute, - [STRINGID_PKMNHASSUBSTITUTE - 12] = sText_PkmnHasSubstitute, - [STRINGID_SUBSTITUTEDAMAGED - 12] = sText_SubstituteDamaged, - [STRINGID_PKMNSUBSTITUTEFADED - 12] = sText_PkmnSubstituteFaded, - [STRINGID_PKMNMUSTRECHARGE - 12] = sText_PkmnMustRecharge, - [STRINGID_PKMNRAGEBUILDING - 12] = sText_PkmnRageBuilding, - [STRINGID_PKMNMOVEWASDISABLED - 12] = sText_PkmnMoveWasDisabled, - [STRINGID_PKMNMOVEISDISABLED - 12] = sText_PkmnMoveIsDisabled, - [STRINGID_PKMNMOVEDISABLEDNOMORE - 12] = sText_PkmnMoveDisabledNoMore, - [STRINGID_PKMNGOTENCORE - 12] = sText_PkmnGotEncore, - [STRINGID_PKMNENCOREENDED - 12] = sText_PkmnEncoreEnded, - [STRINGID_PKMNTOOKAIM - 12] = sText_PkmnTookAim, - [STRINGID_PKMNSKETCHEDMOVE - 12] = sText_PkmnSketchedMove, - [STRINGID_PKMNTRYINGTOTAKEFOE - 12] = sText_PkmnTryingToTakeFoe, - [STRINGID_PKMNTOOKFOE - 12] = sText_PkmnTookFoe, - [STRINGID_PKMNREDUCEDPP - 12] = sText_PkmnReducedPP, - [STRINGID_PKMNSTOLEITEM - 12] = sText_PkmnStoleItem, - [STRINGID_TARGETCANTESCAPENOW - 12] = sText_TargetCantEscapeNow, - [STRINGID_PKMNFELLINTONIGHTMARE - 12] = sText_PkmnFellIntoNightmare, - [STRINGID_PKMNLOCKEDINNIGHTMARE - 12] = sText_PkmnLockedInNightmare, - [STRINGID_PKMNLAIDCURSE - 12] = sText_PkmnLaidCurse, - [STRINGID_PKMNAFFLICTEDBYCURSE - 12] = sText_PkmnAfflictedByCurse, - [STRINGID_SPIKESSCATTERED - 12] = sText_SpikesScattered, - [STRINGID_PKMNHURTBYSPIKES - 12] = sText_PkmnHurtBySpikes, - [STRINGID_PKMNIDENTIFIED - 12] = sText_PkmnIdentified, - [STRINGID_PKMNPERISHCOUNTFELL - 12] = sText_PkmnPerishCountFell, - [STRINGID_PKMNBRACEDITSELF - 12] = sText_PkmnBracedItself, - [STRINGID_PKMNENDUREDHIT - 12] = sText_PkmnEnduredHit, - [STRINGID_MAGNITUDESTRENGTH - 12] = sText_MagnitudeStrength, - [STRINGID_PKMNCUTHPMAXEDATTACK - 12] = sText_PkmnCutHPMaxedAttack, - [STRINGID_PKMNCOPIEDSTATCHANGES - 12] = sText_PkmnCopiedStatChanges, - [STRINGID_PKMNGOTFREE - 12] = sText_PkmnGotFree, - [STRINGID_PKMNSHEDLEECHSEED - 12] = sText_PkmnShedLeechSeed, - [STRINGID_PKMNBLEWAWAYSPIKES - 12] = sText_PkmnBlewAwaySpikes, - [STRINGID_PKMNFLEDFROMBATTLE - 12] = sText_PkmnFledFromBattle, - [STRINGID_PKMNFORESAWATTACK - 12] = sText_PkmnForesawAttack, - [STRINGID_PKMNTOOKATTACK - 12] = sText_PkmnTookAttack, - [STRINGID_PKMNATTACK - 12] = sText_PkmnAttack, - [STRINGID_PKMNCENTERATTENTION - 12] = sText_PkmnCenterAttention, - [STRINGID_PKMNCHARGINGPOWER - 12] = sText_PkmnChargingPower, - [STRINGID_NATUREPOWERTURNEDINTO - 12] = sText_NaturePowerTurnedInto, - [STRINGID_PKMNSTATUSNORMAL - 12] = sText_PkmnStatusNormal, - [STRINGID_PKMNHASNOMOVESLEFT - 12] = sText_PkmnHasNoMovesLeft, - [STRINGID_PKMNSUBJECTEDTOTORMENT - 12] = sText_PkmnSubjectedToTorment, - [STRINGID_PKMNCANTUSEMOVETORMENT - 12] = sText_PkmnCantUseMoveTorment, - [STRINGID_PKMNTIGHTENINGFOCUS - 12] = sText_PkmnTighteningFocus, - [STRINGID_PKMNFELLFORTAUNT - 12] = sText_PkmnFellForTaunt, - [STRINGID_PKMNCANTUSEMOVETAUNT - 12] = sText_PkmnCantUseMoveTaunt, - [STRINGID_PKMNREADYTOHELP - 12] = sText_PkmnReadyToHelp, - [STRINGID_PKMNSWITCHEDITEMS - 12] = sText_PkmnSwitchedItems, - [STRINGID_PKMNCOPIEDFOE - 12] = sText_PkmnCopiedFoe, - [STRINGID_PKMNMADEWISH - 12] = sText_PkmnMadeWish, - [STRINGID_PKMNWISHCAMETRUE - 12] = sText_PkmnWishCameTrue, - [STRINGID_PKMNPLANTEDROOTS - 12] = sText_PkmnPlantedRoots, - [STRINGID_PKMNABSORBEDNUTRIENTS - 12] = sText_PkmnAbsorbedNutrients, - [STRINGID_PKMNANCHOREDITSELF - 12] = sText_PkmnAnchoredItself, - [STRINGID_PKMNWASMADEDROWSY - 12] = sText_PkmnWasMadeDrowsy, - [STRINGID_PKMNKNOCKEDOFF - 12] = sText_PkmnKnockedOff, - [STRINGID_PKMNSWAPPEDABILITIES - 12] = sText_PkmnSwappedAbilities, - [STRINGID_PKMNSEALEDOPPONENTMOVE - 12] = sText_PkmnSealedOpponentMove, - [STRINGID_PKMNCANTUSEMOVESEALED - 12] = sText_PkmnCantUseMoveSealed, - [STRINGID_PKMNWANTSGRUDGE - 12] = sText_PkmnWantsGrudge, - [STRINGID_PKMNLOSTPPGRUDGE - 12] = sText_PkmnLostPPGrudge, - [STRINGID_PKMNSHROUDEDITSELF - 12] = sText_PkmnShroudedItself, - [STRINGID_PKMNMOVEBOUNCED - 12] = sText_PkmnMoveBounced, - [STRINGID_PKMNWAITSFORTARGET - 12] = sText_PkmnWaitsForTarget, - [STRINGID_PKMNSNATCHEDMOVE - 12] = sText_PkmnSnatchedMove, - [STRINGID_PKMNMADEITRAIN - 12] = sText_PkmnMadeItRain, - [STRINGID_PKMNRAISEDSPEED - 12] = sText_PkmnRaisedSpeed, - [STRINGID_PKMNPROTECTEDBY - 12] = sText_PkmnProtectedBy, - [STRINGID_PKMNPREVENTSUSAGE - 12] = sText_PkmnPreventsUsage, - [STRINGID_PKMNRESTOREDHPUSING - 12] = sText_PkmnRestoredHPUsing, - [STRINGID_PKMNCHANGEDTYPEWITH - 12] = sText_PkmnChangedTypeWith, - [STRINGID_PKMNPREVENTSPARALYSISWITH - 12] = sText_PkmnPreventsParalysisWith, - [STRINGID_PKMNPREVENTSROMANCEWITH - 12] = sText_PkmnPreventsRomanceWith, - [STRINGID_PKMNPREVENTSPOISONINGWITH - 12] = sText_PkmnPreventsPoisoningWith, - [STRINGID_PKMNPREVENTSCONFUSIONWITH - 12] = sText_PkmnPreventsConfusionWith, - [STRINGID_PKMNRAISEDFIREPOWERWITH - 12] = sText_PkmnRaisedFirePowerWith, - [STRINGID_PKMNANCHORSITSELFWITH - 12] = sText_PkmnAnchorsItselfWith, - [STRINGID_PKMNCUTSATTACKWITH - 12] = sText_PkmnCutsAttackWith, - [STRINGID_PKMNPREVENTSSTATLOSSWITH - 12] = sText_PkmnPreventsStatLossWith, - [STRINGID_PKMNHURTSWITH - 12] = sText_PkmnHurtsWith, - [STRINGID_PKMNTRACED - 12] = sText_PkmnTraced, - [STRINGID_STATSHARPLY - 12] = sText_StatSharply, - [STRINGID_STATROSE - 12] = gText_StatRose, - [STRINGID_STATHARSHLY - 12] = sText_StatHarshly, - [STRINGID_STATFELL - 12] = sText_StatFell, - [STRINGID_ATTACKERSSTATROSE - 12] = sText_AttackersStatRose, - [STRINGID_DEFENDERSSTATROSE - 12] = gText_DefendersStatRose, - [STRINGID_ATTACKERSSTATFELL - 12] = sText_AttackersStatFell, - [STRINGID_DEFENDERSSTATFELL - 12] = sText_DefendersStatFell, - [STRINGID_CRITICALHIT - 12] = sText_CriticalHit, - [STRINGID_ONEHITKO - 12] = sText_OneHitKO, - [STRINGID_123POOF - 12] = sText_123Poof, - [STRINGID_ANDELLIPSIS - 12] = sText_AndEllipsis, - [STRINGID_NOTVERYEFFECTIVE - 12] = sText_NotVeryEffective, - [STRINGID_SUPEREFFECTIVE - 12] = sText_SuperEffective, - [STRINGID_GOTAWAYSAFELY - 12] = sText_GotAwaySafely, - [STRINGID_WILDPKMNFLED - 12] = sText_WildPkmnFled, - [STRINGID_NORUNNINGFROMTRAINERS - 12] = sText_NoRunningFromTrainers, - [STRINGID_CANTESCAPE - 12] = sText_CantEscape, - [STRINGID_DONTLEAVEBIRCH - 12] = sText_DontLeaveBirch, - [STRINGID_BUTNOTHINGHAPPENED - 12] = sText_ButNothingHappened, - [STRINGID_BUTITFAILED - 12] = sText_ButItFailed, - [STRINGID_ITHURTCONFUSION - 12] = sText_ItHurtConfusion, - [STRINGID_MIRRORMOVEFAILED - 12] = sText_MirrorMoveFailed, - [STRINGID_STARTEDTORAIN - 12] = sText_StartedToRain, - [STRINGID_DOWNPOURSTARTED - 12] = sText_DownpourStarted, - [STRINGID_RAINCONTINUES - 12] = sText_RainContinues, - [STRINGID_DOWNPOURCONTINUES - 12] = sText_DownpourContinues, - [STRINGID_RAINSTOPPED - 12] = sText_RainStopped, - [STRINGID_SANDSTORMBREWED - 12] = sText_SandstormBrewed, - [STRINGID_SANDSTORMRAGES - 12] = sText_SandstormRages, - [STRINGID_SANDSTORMSUBSIDED - 12] = sText_SandstormSubsided, - [STRINGID_SUNLIGHTGOTBRIGHT - 12] = sText_SunlightGotBright, - [STRINGID_SUNLIGHTSTRONG - 12] = sText_SunlightStrong, - [STRINGID_SUNLIGHTFADED - 12] = sText_SunlightFaded, - [STRINGID_STARTEDHAIL - 12] = sText_StartedHail, - [STRINGID_HAILCONTINUES - 12] = sText_HailContinues, - [STRINGID_HAILSTOPPED - 12] = sText_HailStopped, - [STRINGID_FAILEDTOSPITUP - 12] = sText_FailedToSpitUp, - [STRINGID_FAILEDTOSWALLOW - 12] = sText_FailedToSwallow, - [STRINGID_WINDBECAMEHEATWAVE - 12] = sText_WindBecameHeatWave, - [STRINGID_STATCHANGESGONE - 12] = sText_StatChangesGone, - [STRINGID_COINSSCATTERED - 12] = sText_CoinsScattered, - [STRINGID_TOOWEAKFORSUBSTITUTE - 12] = sText_TooWeakForSubstitute, - [STRINGID_SHAREDPAIN - 12] = sText_SharedPain, - [STRINGID_BELLCHIMED - 12] = sText_BellChimed, - [STRINGID_FAINTINTHREE - 12] = sText_FaintInThree, - [STRINGID_NOPPLEFT - 12] = sText_NoPPLeft, - [STRINGID_BUTNOPPLEFT - 12] = sText_ButNoPPLeft, - [STRINGID_PLAYERUSEDITEM - 12] = sText_PlayerUsedItem, - [STRINGID_WALLYUSEDITEM - 12] = sText_WallyUsedItem, - [STRINGID_TRAINERBLOCKEDBALL - 12] = sText_TrainerBlockedBall, - [STRINGID_DONTBEATHIEF - 12] = sText_DontBeAThief, - [STRINGID_ITDODGEDBALL - 12] = sText_ItDodgedBall, - [STRINGID_YOUMISSEDPKMN - 12] = sText_YouMissedPkmn, - [STRINGID_PKMNBROKEFREE - 12] = sText_PkmnBrokeFree, - [STRINGID_ITAPPEAREDCAUGHT - 12] = sText_ItAppearedCaught, - [STRINGID_AARGHALMOSTHADIT - 12] = sText_AarghAlmostHadIt, - [STRINGID_SHOOTSOCLOSE - 12] = sText_ShootSoClose, - [STRINGID_GOTCHAPKMNCAUGHT - 12] = sText_GotchaPkmnCaught, - [STRINGID_GOTCHAPKMNCAUGHT2 - 12] = sText_GotchaPkmnCaught2, - [STRINGID_GIVENICKNAMECAPTURED - 12] = sText_GiveNicknameCaptured, - [STRINGID_PKMNSENTTOPC - 12] = sText_PkmnSentToPC, - [STRINGID_PKMNDATAADDEDTODEX - 12] = sText_PkmnDataAddedToDex, - [STRINGID_ITISRAINING - 12] = sText_ItIsRaining, - [STRINGID_SANDSTORMISRAGING - 12] = sText_SandstormIsRaging, - [STRINGID_CANTESCAPE2 - 12] = sText_CantEscape2, - [STRINGID_PKMNIGNORESASLEEP - 12] = sText_PkmnIgnoresAsleep, - [STRINGID_PKMNIGNOREDORDERS - 12] = sText_PkmnIgnoredOrders, - [STRINGID_PKMNBEGANTONAP - 12] = sText_PkmnBeganToNap, - [STRINGID_PKMNLOAFING - 12] = sText_PkmnLoafing, - [STRINGID_PKMNWONTOBEY - 12] = sText_PkmnWontObey, - [STRINGID_PKMNTURNEDAWAY - 12] = sText_PkmnTurnedAway, - [STRINGID_PKMNPRETENDNOTNOTICE - 12] = sText_PkmnPretendNotNotice, - [STRINGID_ENEMYABOUTTOSWITCHPKMN - 12] = sText_EnemyAboutToSwitchPkmn, - [STRINGID_CREPTCLOSER - 12] = sText_CreptCloser, - [STRINGID_CANTGETCLOSER - 12] = sText_CantGetCloser, - [STRINGID_PKMNWATCHINGCAREFULLY - 12] = sText_PkmnWatchingCarefully, - [STRINGID_PKMNCURIOUSABOUTX - 12] = sText_PkmnCuriousAboutX, - [STRINGID_PKMNENTHRALLEDBYX - 12] = sText_PkmnEnthralledByX, - [STRINGID_PKMNIGNOREDX - 12] = sText_PkmnIgnoredX, - [STRINGID_THREWPOKEBLOCKATPKMN - 12] = sText_ThrewPokeblockAtPkmn, - [STRINGID_OUTOFSAFARIBALLS - 12] = sText_OutOfSafariBalls, - [STRINGID_PKMNSITEMCUREDPARALYSIS - 12] = sText_PkmnsItemCuredParalysis, - [STRINGID_PKMNSITEMCUREDPOISON - 12] = sText_PkmnsItemCuredPoison, - [STRINGID_PKMNSITEMHEALEDBURN - 12] = sText_PkmnsItemHealedBurn, - [STRINGID_PKMNSITEMDEFROSTEDIT - 12] = sText_PkmnsItemDefrostedIt, - [STRINGID_PKMNSITEMWOKEIT - 12] = sText_PkmnsItemWokeIt, - [STRINGID_PKMNSITEMSNAPPEDOUT - 12] = sText_PkmnsItemSnappedOut, - [STRINGID_PKMNSITEMCUREDPROBLEM - 12] = sText_PkmnsItemCuredProblem, - [STRINGID_PKMNSITEMRESTOREDHEALTH - 12] = sText_PkmnsItemRestoredHealth, - [STRINGID_PKMNSITEMRESTOREDPP - 12] = sText_PkmnsItemRestoredPP, - [STRINGID_PKMNSITEMRESTOREDSTATUS - 12] = sText_PkmnsItemRestoredStatus, - [STRINGID_PKMNSITEMRESTOREDHPALITTLE - 12] = sText_PkmnsItemRestoredHPALittle, - [STRINGID_ITEMALLOWSONLYYMOVE - 12] = sText_ItemAllowsOnlyYMove, - [STRINGID_PKMNHUNGONWITHX - 12] = sText_PkmnHungOnWithX, - [STRINGID_EMPTYSTRING3 - 12] = gText_EmptyString3, - [STRINGID_PKMNSXPREVENTSBURNS - 12] = sText_PkmnsXPreventsBurns, - [STRINGID_PKMNSXBLOCKSY - 12] = sText_PkmnsXBlocksY, - [STRINGID_PKMNSXRESTOREDHPALITTLE2 - 12] = sText_PkmnsXRestoredHPALittle2, - [STRINGID_PKMNSXWHIPPEDUPSANDSTORM - 12] = sText_PkmnsXWhippedUpSandstorm, - [STRINGID_PKMNSXPREVENTSYLOSS - 12] = sText_PkmnsXPreventsYLoss, - [STRINGID_PKMNSXINFATUATEDY - 12] = sText_PkmnsXInfatuatedY, - [STRINGID_PKMNSXMADEYINEFFECTIVE - 12] = sText_PkmnsXMadeYIneffective, - [STRINGID_PKMNSXCUREDYPROBLEM - 12] = sText_PkmnsXCuredYProblem, - [STRINGID_ITSUCKEDLIQUIDOOZE - 12] = sText_ItSuckedLiquidOoze, - [STRINGID_PKMNTRANSFORMED - 12] = sText_PkmnTransformed, - [STRINGID_ELECTRICITYWEAKENED - 12] = sText_ElectricityWeakened, - [STRINGID_FIREWEAKENED - 12] = sText_FireWeakened, - [STRINGID_PKMNHIDUNDERWATER - 12] = sText_PkmnHidUnderwater, - [STRINGID_PKMNSPRANGUP - 12] = sText_PkmnSprangUp, - [STRINGID_HMMOVESCANTBEFORGOTTEN - 12] = sText_HMMovesCantBeForgotten, - [STRINGID_XFOUNDONEY - 12] = sText_XFoundOneY, - [STRINGID_PLAYERDEFEATEDTRAINER1 - 12] = sText_PlayerDefeatedLinkTrainerTrainer1, - [STRINGID_SOOTHINGAROMA - 12] = sText_SoothingAroma, - [STRINGID_ITEMSCANTBEUSEDNOW - 12] = sText_ItemsCantBeUsedNow, - [STRINGID_FORXCOMMAYZ - 12] = sText_ForXCommaYZ, - [STRINGID_USINGITEMSTATOFPKMNROSE - 12] = sText_UsingItemTheStatOfPkmnRose, - [STRINGID_PKMNUSEDXTOGETPUMPED - 12] = sText_PkmnUsedXToGetPumped, - [STRINGID_PKMNSXMADEYUSELESS - 12] = sText_PkmnsXMadeYUseless, - [STRINGID_PKMNTRAPPEDBYSANDTOMB - 12] = sText_PkmnTrappedBySandTomb, - [STRINGID_EMPTYSTRING4 - 12] = sText_EmptyString4, - [STRINGID_ABOOSTED - 12] = sText_ABoosted, - [STRINGID_PKMNSXINTENSIFIEDSUN - 12] = sText_PkmnsXIntensifiedSun, - [STRINGID_PKMNMAKESGROUNDMISS - 12] = sText_PkmnMakesGroundMiss, - [STRINGID_YOUTHROWABALLNOWRIGHT - 12] = sText_YouThrowABallNowRight, - [STRINGID_PKMNSXTOOKATTACK - 12] = sText_PkmnsXTookAttack, - [STRINGID_PKMNCHOSEXASDESTINY - 12] = sText_PkmnChoseXAsDestiny, - [STRINGID_PKMNLOSTFOCUS - 12] = sText_PkmnLostFocus, - [STRINGID_USENEXTPKMN - 12] = sText_UseNextPkmn, - [STRINGID_PKMNFLEDUSINGITS - 12] = sText_PkmnFledUsingIts, - [STRINGID_PKMNFLEDUSING - 12] = sText_PkmnFledUsing, - [STRINGID_PKMNWASDRAGGEDOUT - 12] = sText_PkmnWasDraggedOut, - [STRINGID_PREVENTEDFROMWORKING - 12] = sText_PreventedFromWorking, - [STRINGID_PKMNSITEMNORMALIZEDSTATUS - 12] = sText_PkmnsItemNormalizedStatus, - [STRINGID_TRAINER1USEDITEM - 12] = sText_Trainer1UsedItem, - [STRINGID_BOXISFULL - 12] = sText_BoxIsFull, - [STRINGID_PKMNAVOIDEDATTACK - 12] = sText_PkmnAvoidedAttack, - [STRINGID_PKMNSXMADEITINEFFECTIVE - 12] = sText_PkmnsXMadeItIneffective, - [STRINGID_PKMNSXPREVENTSFLINCHING - 12] = sText_PkmnsXPreventsFlinching, - [STRINGID_PKMNALREADYHASBURN - 12] = sText_PkmnAlreadyHasBurn, - [STRINGID_STATSWONTDECREASE2 - 12] = sText_StatsWontDecrease2, - [STRINGID_PKMNSXBLOCKSY2 - 12] = sText_PkmnsXBlocksY2, - [STRINGID_PKMNSXWOREOFF - 12] = sText_PkmnsXWoreOff, - [STRINGID_PKMNRAISEDDEFALITTLE - 12] = sText_PkmnRaisedDefALittle, - [STRINGID_PKMNRAISEDSPDEFALITTLE - 12] = sText_PkmnRaisedSpDefALittle, - [STRINGID_THEWALLSHATTERED - 12] = sText_TheWallShattered, - [STRINGID_PKMNSXPREVENTSYSZ - 12] = sText_PkmnsXPreventsYsZ, - [STRINGID_PKMNSXCUREDITSYPROBLEM - 12] = sText_PkmnsXCuredItsYProblem, - [STRINGID_ATTACKERCANTESCAPE - 12] = sText_AttackerCantEscape, - [STRINGID_PKMNOBTAINEDX - 12] = sText_PkmnObtainedX, - [STRINGID_PKMNOBTAINEDX2 - 12] = sText_PkmnObtainedX2, - [STRINGID_PKMNOBTAINEDXYOBTAINEDZ - 12] = sText_PkmnObtainedXYObtainedZ, - [STRINGID_BUTNOEFFECT - 12] = sText_ButNoEffect, - [STRINGID_PKMNSXHADNOEFFECTONY - 12] = sText_PkmnsXHadNoEffectOnY, - [STRINGID_TWOENEMIESDEFEATED - 12] = sText_TwoInGameTrainersDefeated, - [STRINGID_TRAINER2LOSETEXT - 12] = sText_Trainer2LoseText, - [STRINGID_PKMNINCAPABLEOFPOWER - 12] = sText_PkmnIncapableOfPower, - [STRINGID_GLINTAPPEARSINEYE - 12] = sText_GlintAppearsInEye, - [STRINGID_PKMNGETTINGINTOPOSITION - 12] = sText_PkmnGettingIntoPosition, - [STRINGID_PKMNBEGANGROWLINGDEEPLY - 12] = sText_PkmnBeganGrowlingDeeply, - [STRINGID_PKMNEAGERFORMORE - 12] = sText_PkmnEagerForMore, - [STRINGID_DEFEATEDOPPONENTBYREFEREE - 12] = sText_DefeatedOpponentByReferee, - [STRINGID_LOSTTOOPPONENTBYREFEREE - 12] = sText_LostToOpponentByReferee, - [STRINGID_TIEDOPPONENTBYREFEREE - 12] = sText_TiedOpponentByReferee, - [STRINGID_QUESTIONFORFEITMATCH - 12] = sText_QuestionForfeitMatch, - [STRINGID_FORFEITEDMATCH - 12] = sText_ForfeitedMatch, - [STRINGID_PKMNTRANSFERREDSOMEONESPC - 12] = gText_PkmnTransferredSomeonesPC, - [STRINGID_PKMNTRANSFERREDLANETTESPC - 12] = gText_PkmnTransferredLanettesPC, - [STRINGID_PKMNBOXSOMEONESPCFULL - 12] = gText_PkmnTransferredSomeonesPCBoxFull, - [STRINGID_PKMNBOXLANETTESPCFULL - 12] = gText_PkmnTransferredLanettesPCBoxFull, - [STRINGID_TRAINER1WINTEXT - 12] = sText_Trainer1WinText, - [STRINGID_TRAINER2WINTEXT - 12] = sText_Trainer2WinText, + [STRINGID_TRAINER1LOSETEXT - BATTLESTRINGS_TABLE_START] = sText_Trainer1LoseText, + [STRINGID_PKMNGAINEDEXP - BATTLESTRINGS_TABLE_START] = sText_PkmnGainedEXP, + [STRINGID_PKMNGREWTOLV - BATTLESTRINGS_TABLE_START] = sText_PkmnGrewToLv, + [STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_TABLE_START] = sText_PkmnLearnedMove, + [STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_TABLE_START] = sText_TryToLearnMove1, + [STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_TABLE_START] = sText_TryToLearnMove2, + [STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_TABLE_START] = sText_TryToLearnMove3, + [STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_TABLE_START] = sText_PkmnForgotMove, + [STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_TABLE_START] = sText_StopLearningMove, + [STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_TABLE_START] = sText_DidNotLearnMove, + [STRINGID_PKMNLEARNEDMOVE2 - BATTLESTRINGS_TABLE_START] = sText_PkmnLearnedMove2, + [STRINGID_ATTACKMISSED - BATTLESTRINGS_TABLE_START] = sText_AttackMissed, + [STRINGID_PKMNPROTECTEDITSELF - BATTLESTRINGS_TABLE_START] = sText_PkmnProtectedItself, + [STRINGID_STATSWONTINCREASE2 - BATTLESTRINGS_TABLE_START] = sText_StatsWontIncrease2, + [STRINGID_AVOIDEDDAMAGE - BATTLESTRINGS_TABLE_START] = sText_AvoidedDamage, + [STRINGID_ITDOESNTAFFECT - BATTLESTRINGS_TABLE_START] = sText_ItDoesntAffect, + [STRINGID_ATTACKERFAINTED - BATTLESTRINGS_TABLE_START] = sText_AttackerFainted, + [STRINGID_TARGETFAINTED - BATTLESTRINGS_TABLE_START] = sText_TargetFainted, + [STRINGID_PLAYERGOTMONEY - BATTLESTRINGS_TABLE_START] = sText_PlayerGotMoney, + [STRINGID_PLAYERWHITEOUT - BATTLESTRINGS_TABLE_START] = sText_PlayerWhiteout, + [STRINGID_PLAYERWHITEOUT2 - BATTLESTRINGS_TABLE_START] = sText_PlayerWhiteout2, + [STRINGID_PREVENTSESCAPE - BATTLESTRINGS_TABLE_START] = sText_PreventsEscape, + [STRINGID_HITXTIMES - BATTLESTRINGS_TABLE_START] = sText_HitXTimes, + [STRINGID_PKMNFELLASLEEP - BATTLESTRINGS_TABLE_START] = sText_PkmnFellAsleep, + [STRINGID_PKMNMADESLEEP - BATTLESTRINGS_TABLE_START] = sText_PkmnMadeSleep, + [STRINGID_PKMNALREADYASLEEP - BATTLESTRINGS_TABLE_START] = sText_PkmnAlreadyAsleep, + [STRINGID_PKMNALREADYASLEEP2 - BATTLESTRINGS_TABLE_START] = sText_PkmnAlreadyAsleep2, + [STRINGID_PKMNWASNTAFFECTED - BATTLESTRINGS_TABLE_START] = sText_PkmnWasntAffected, + [STRINGID_PKMNWASPOISONED - BATTLESTRINGS_TABLE_START] = sText_PkmnWasPoisoned, + [STRINGID_PKMNPOISONEDBY - BATTLESTRINGS_TABLE_START] = sText_PkmnPoisonedBy, + [STRINGID_PKMNHURTBYPOISON - BATTLESTRINGS_TABLE_START] = sText_PkmnHurtByPoison, + [STRINGID_PKMNALREADYPOISONED - BATTLESTRINGS_TABLE_START] = sText_PkmnAlreadyPoisoned, + [STRINGID_PKMNBADLYPOISONED - BATTLESTRINGS_TABLE_START] = sText_PkmnBadlyPoisoned, + [STRINGID_PKMNENERGYDRAINED - BATTLESTRINGS_TABLE_START] = sText_PkmnEnergyDrained, + [STRINGID_PKMNWASBURNED - BATTLESTRINGS_TABLE_START] = sText_PkmnWasBurned, + [STRINGID_PKMNBURNEDBY - BATTLESTRINGS_TABLE_START] = sText_PkmnBurnedBy, + [STRINGID_PKMNHURTBYBURN - BATTLESTRINGS_TABLE_START] = sText_PkmnHurtByBurn, + [STRINGID_PKMNWASFROZEN - BATTLESTRINGS_TABLE_START] = sText_PkmnWasFrozen, + [STRINGID_PKMNFROZENBY - BATTLESTRINGS_TABLE_START] = sText_PkmnFrozenBy, + [STRINGID_PKMNISFROZEN - BATTLESTRINGS_TABLE_START] = sText_PkmnIsFrozen, + [STRINGID_PKMNWASDEFROSTED - BATTLESTRINGS_TABLE_START] = sText_PkmnWasDefrosted, + [STRINGID_PKMNWASDEFROSTED2 - BATTLESTRINGS_TABLE_START] = sText_PkmnWasDefrosted2, + [STRINGID_PKMNWASDEFROSTEDBY - BATTLESTRINGS_TABLE_START] = sText_PkmnWasDefrostedBy, + [STRINGID_PKMNWASPARALYZED - BATTLESTRINGS_TABLE_START] = sText_PkmnWasParalyzed, + [STRINGID_PKMNWASPARALYZEDBY - BATTLESTRINGS_TABLE_START] = sText_PkmnWasParalyzedBy, + [STRINGID_PKMNISPARALYZED - BATTLESTRINGS_TABLE_START] = sText_PkmnIsParalyzed, + [STRINGID_PKMNISALREADYPARALYZED - BATTLESTRINGS_TABLE_START] = sText_PkmnIsAlreadyParalyzed, + [STRINGID_PKMNHEALEDPARALYSIS - BATTLESTRINGS_TABLE_START] = sText_PkmnHealedParalysis, + [STRINGID_PKMNDREAMEATEN - BATTLESTRINGS_TABLE_START] = sText_PkmnDreamEaten, + [STRINGID_STATSWONTINCREASE - BATTLESTRINGS_TABLE_START] = sText_StatsWontIncrease, + [STRINGID_STATSWONTDECREASE - BATTLESTRINGS_TABLE_START] = sText_StatsWontDecrease, + [STRINGID_TEAMSTOPPEDWORKING - BATTLESTRINGS_TABLE_START] = sText_TeamStoppedWorking, + [STRINGID_FOESTOPPEDWORKING - BATTLESTRINGS_TABLE_START] = sText_FoeStoppedWorking, + [STRINGID_PKMNISCONFUSED - BATTLESTRINGS_TABLE_START] = sText_PkmnIsConfused, + [STRINGID_PKMNHEALEDCONFUSION - BATTLESTRINGS_TABLE_START] = sText_PkmnHealedConfusion, + [STRINGID_PKMNWASCONFUSED - BATTLESTRINGS_TABLE_START] = sText_PkmnWasConfused, + [STRINGID_PKMNALREADYCONFUSED - BATTLESTRINGS_TABLE_START] = sText_PkmnAlreadyConfused, + [STRINGID_PKMNFELLINLOVE - BATTLESTRINGS_TABLE_START] = sText_PkmnFellInLove, + [STRINGID_PKMNINLOVE - BATTLESTRINGS_TABLE_START] = sText_PkmnInLove, + [STRINGID_PKMNIMMOBILIZEDBYLOVE - BATTLESTRINGS_TABLE_START] = sText_PkmnImmobilizedByLove, + [STRINGID_PKMNBLOWNAWAY - BATTLESTRINGS_TABLE_START] = sText_PkmnBlownAway, + [STRINGID_PKMNCHANGEDTYPE - BATTLESTRINGS_TABLE_START] = sText_PkmnChangedType, + [STRINGID_PKMNFLINCHED - BATTLESTRINGS_TABLE_START] = sText_PkmnFlinched, + [STRINGID_PKMNREGAINEDHEALTH - BATTLESTRINGS_TABLE_START] = sText_PkmnRegainedHealth, + [STRINGID_PKMNHPFULL - BATTLESTRINGS_TABLE_START] = sText_PkmnHPFull, + [STRINGID_PKMNRAISEDSPDEF - BATTLESTRINGS_TABLE_START] = sText_PkmnRaisedSpDef, + [STRINGID_PKMNRAISEDDEF - BATTLESTRINGS_TABLE_START] = sText_PkmnRaisedDef, + [STRINGID_PKMNCOVEREDBYVEIL - BATTLESTRINGS_TABLE_START] = sText_PkmnCoveredByVeil, + [STRINGID_PKMNUSEDSAFEGUARD - BATTLESTRINGS_TABLE_START] = sText_PkmnUsedSafeguard, + [STRINGID_PKMNSAFEGUARDEXPIRED - BATTLESTRINGS_TABLE_START] = sText_PkmnSafeguardExpired, + [STRINGID_PKMNWENTTOSLEEP - BATTLESTRINGS_TABLE_START] = sText_PkmnWentToSleep, + [STRINGID_PKMNSLEPTHEALTHY - BATTLESTRINGS_TABLE_START] = sText_PkmnSleptHealthy, + [STRINGID_PKMNWHIPPEDWHIRLWIND - BATTLESTRINGS_TABLE_START] = sText_PkmnWhippedWhirlwind, + [STRINGID_PKMNTOOKSUNLIGHT - BATTLESTRINGS_TABLE_START] = sText_PkmnTookSunlight, + [STRINGID_PKMNLOWEREDHEAD - BATTLESTRINGS_TABLE_START] = sText_PkmnLoweredHead, + [STRINGID_PKMNISGLOWING - BATTLESTRINGS_TABLE_START] = sText_PkmnIsGlowing, + [STRINGID_PKMNFLEWHIGH - BATTLESTRINGS_TABLE_START] = sText_PkmnFlewHigh, + [STRINGID_PKMNDUGHOLE - BATTLESTRINGS_TABLE_START] = sText_PkmnDugHole, + [STRINGID_PKMNSQUEEZEDBYBIND - BATTLESTRINGS_TABLE_START] = sText_PkmnSqueezedByBind, + [STRINGID_PKMNTRAPPEDINVORTEX - BATTLESTRINGS_TABLE_START] = sText_PkmnTrappedInVortex, + [STRINGID_PKMNWRAPPEDBY - BATTLESTRINGS_TABLE_START] = sText_PkmnWrappedBy, + [STRINGID_PKMNCLAMPED - BATTLESTRINGS_TABLE_START] = sText_PkmnClamped, + [STRINGID_PKMNHURTBY - BATTLESTRINGS_TABLE_START] = sText_PkmnHurtBy, + [STRINGID_PKMNFREEDFROM - BATTLESTRINGS_TABLE_START] = sText_PkmnFreedFrom, + [STRINGID_PKMNCRASHED - BATTLESTRINGS_TABLE_START] = sText_PkmnCrashed, + [STRINGID_PKMNSHROUDEDINMIST - BATTLESTRINGS_TABLE_START] = gText_PkmnShroudedInMist, + [STRINGID_PKMNPROTECTEDBYMIST - BATTLESTRINGS_TABLE_START] = sText_PkmnProtectedByMist, + [STRINGID_PKMNGETTINGPUMPED - BATTLESTRINGS_TABLE_START] = gText_PkmnGettingPumped, + [STRINGID_PKMNHITWITHRECOIL - BATTLESTRINGS_TABLE_START] = sText_PkmnHitWithRecoil, + [STRINGID_PKMNPROTECTEDITSELF2 - BATTLESTRINGS_TABLE_START] = sText_PkmnProtectedItself2, + [STRINGID_PKMNBUFFETEDBYSANDSTORM - BATTLESTRINGS_TABLE_START] = sText_PkmnBuffetedBySandstorm, + [STRINGID_PKMNPELTEDBYHAIL - BATTLESTRINGS_TABLE_START] = sText_PkmnPeltedByHail, + [STRINGID_PKMNSEEDED - BATTLESTRINGS_TABLE_START] = sText_PkmnSeeded, + [STRINGID_PKMNEVADEDATTACK - BATTLESTRINGS_TABLE_START] = sText_PkmnEvadedAttack, + [STRINGID_PKMNSAPPEDBYLEECHSEED - BATTLESTRINGS_TABLE_START] = sText_PkmnSappedByLeechSeed, + [STRINGID_PKMNFASTASLEEP - BATTLESTRINGS_TABLE_START] = sText_PkmnFastAsleep, + [STRINGID_PKMNWOKEUP - BATTLESTRINGS_TABLE_START] = sText_PkmnWokeUp, + [STRINGID_PKMNUPROARKEPTAWAKE - BATTLESTRINGS_TABLE_START] = sText_PkmnUproarKeptAwake, + [STRINGID_PKMNWOKEUPINUPROAR - BATTLESTRINGS_TABLE_START] = sText_PkmnWokeUpInUproar, + [STRINGID_PKMNCAUSEDUPROAR - BATTLESTRINGS_TABLE_START] = sText_PkmnCausedUproar, + [STRINGID_PKMNMAKINGUPROAR - BATTLESTRINGS_TABLE_START] = sText_PkmnMakingUproar, + [STRINGID_PKMNCALMEDDOWN - BATTLESTRINGS_TABLE_START] = sText_PkmnCalmedDown, + [STRINGID_PKMNCANTSLEEPINUPROAR - BATTLESTRINGS_TABLE_START] = sText_PkmnCantSleepInUproar, + [STRINGID_PKMNSTOCKPILED - BATTLESTRINGS_TABLE_START] = sText_PkmnStockpiled, + [STRINGID_PKMNCANTSTOCKPILE - BATTLESTRINGS_TABLE_START] = sText_PkmnCantStockpile, + [STRINGID_PKMNCANTSLEEPINUPROAR2 - BATTLESTRINGS_TABLE_START] = sText_PkmnCantSleepInUproar2, + [STRINGID_UPROARKEPTPKMNAWAKE - BATTLESTRINGS_TABLE_START] = sText_UproarKeptPkmnAwake, + [STRINGID_PKMNSTAYEDAWAKEUSING - BATTLESTRINGS_TABLE_START] = sText_PkmnStayedAwakeUsing, + [STRINGID_PKMNSTORINGENERGY - BATTLESTRINGS_TABLE_START] = sText_PkmnStoringEnergy, + [STRINGID_PKMNUNLEASHEDENERGY - BATTLESTRINGS_TABLE_START] = sText_PkmnUnleashedEnergy, + [STRINGID_PKMNFATIGUECONFUSION - BATTLESTRINGS_TABLE_START] = sText_PkmnFatigueConfusion, + [STRINGID_PLAYERPICKEDUPMONEY - BATTLESTRINGS_TABLE_START] = sText_PlayerPickedUpMoney, + [STRINGID_PKMNUNAFFECTED - BATTLESTRINGS_TABLE_START] = sText_PkmnUnaffected, + [STRINGID_PKMNTRANSFORMEDINTO - BATTLESTRINGS_TABLE_START] = sText_PkmnTransformedInto, + [STRINGID_PKMNMADESUBSTITUTE - BATTLESTRINGS_TABLE_START] = sText_PkmnMadeSubstitute, + [STRINGID_PKMNHASSUBSTITUTE - BATTLESTRINGS_TABLE_START] = sText_PkmnHasSubstitute, + [STRINGID_SUBSTITUTEDAMAGED - BATTLESTRINGS_TABLE_START] = sText_SubstituteDamaged, + [STRINGID_PKMNSUBSTITUTEFADED - BATTLESTRINGS_TABLE_START] = sText_PkmnSubstituteFaded, + [STRINGID_PKMNMUSTRECHARGE - BATTLESTRINGS_TABLE_START] = sText_PkmnMustRecharge, + [STRINGID_PKMNRAGEBUILDING - BATTLESTRINGS_TABLE_START] = sText_PkmnRageBuilding, + [STRINGID_PKMNMOVEWASDISABLED - BATTLESTRINGS_TABLE_START] = sText_PkmnMoveWasDisabled, + [STRINGID_PKMNMOVEISDISABLED - BATTLESTRINGS_TABLE_START] = sText_PkmnMoveIsDisabled, + [STRINGID_PKMNMOVEDISABLEDNOMORE - BATTLESTRINGS_TABLE_START] = sText_PkmnMoveDisabledNoMore, + [STRINGID_PKMNGOTENCORE - BATTLESTRINGS_TABLE_START] = sText_PkmnGotEncore, + [STRINGID_PKMNENCOREENDED - BATTLESTRINGS_TABLE_START] = sText_PkmnEncoreEnded, + [STRINGID_PKMNTOOKAIM - BATTLESTRINGS_TABLE_START] = sText_PkmnTookAim, + [STRINGID_PKMNSKETCHEDMOVE - BATTLESTRINGS_TABLE_START] = sText_PkmnSketchedMove, + [STRINGID_PKMNTRYINGTOTAKEFOE - BATTLESTRINGS_TABLE_START] = sText_PkmnTryingToTakeFoe, + [STRINGID_PKMNTOOKFOE - BATTLESTRINGS_TABLE_START] = sText_PkmnTookFoe, + [STRINGID_PKMNREDUCEDPP - BATTLESTRINGS_TABLE_START] = sText_PkmnReducedPP, + [STRINGID_PKMNSTOLEITEM - BATTLESTRINGS_TABLE_START] = sText_PkmnStoleItem, + [STRINGID_TARGETCANTESCAPENOW - BATTLESTRINGS_TABLE_START] = sText_TargetCantEscapeNow, + [STRINGID_PKMNFELLINTONIGHTMARE - BATTLESTRINGS_TABLE_START] = sText_PkmnFellIntoNightmare, + [STRINGID_PKMNLOCKEDINNIGHTMARE - BATTLESTRINGS_TABLE_START] = sText_PkmnLockedInNightmare, + [STRINGID_PKMNLAIDCURSE - BATTLESTRINGS_TABLE_START] = sText_PkmnLaidCurse, + [STRINGID_PKMNAFFLICTEDBYCURSE - BATTLESTRINGS_TABLE_START] = sText_PkmnAfflictedByCurse, + [STRINGID_SPIKESSCATTERED - BATTLESTRINGS_TABLE_START] = sText_SpikesScattered, + [STRINGID_PKMNHURTBYSPIKES - BATTLESTRINGS_TABLE_START] = sText_PkmnHurtBySpikes, + [STRINGID_PKMNIDENTIFIED - BATTLESTRINGS_TABLE_START] = sText_PkmnIdentified, + [STRINGID_PKMNPERISHCOUNTFELL - BATTLESTRINGS_TABLE_START] = sText_PkmnPerishCountFell, + [STRINGID_PKMNBRACEDITSELF - BATTLESTRINGS_TABLE_START] = sText_PkmnBracedItself, + [STRINGID_PKMNENDUREDHIT - BATTLESTRINGS_TABLE_START] = sText_PkmnEnduredHit, + [STRINGID_MAGNITUDESTRENGTH - BATTLESTRINGS_TABLE_START] = sText_MagnitudeStrength, + [STRINGID_PKMNCUTHPMAXEDATTACK - BATTLESTRINGS_TABLE_START] = sText_PkmnCutHPMaxedAttack, + [STRINGID_PKMNCOPIEDSTATCHANGES - BATTLESTRINGS_TABLE_START] = sText_PkmnCopiedStatChanges, + [STRINGID_PKMNGOTFREE - BATTLESTRINGS_TABLE_START] = sText_PkmnGotFree, + [STRINGID_PKMNSHEDLEECHSEED - BATTLESTRINGS_TABLE_START] = sText_PkmnShedLeechSeed, + [STRINGID_PKMNBLEWAWAYSPIKES - BATTLESTRINGS_TABLE_START] = sText_PkmnBlewAwaySpikes, + [STRINGID_PKMNFLEDFROMBATTLE - BATTLESTRINGS_TABLE_START] = sText_PkmnFledFromBattle, + [STRINGID_PKMNFORESAWATTACK - BATTLESTRINGS_TABLE_START] = sText_PkmnForesawAttack, + [STRINGID_PKMNTOOKATTACK - BATTLESTRINGS_TABLE_START] = sText_PkmnTookAttack, + [STRINGID_PKMNATTACK - BATTLESTRINGS_TABLE_START] = sText_PkmnAttack, + [STRINGID_PKMNCENTERATTENTION - BATTLESTRINGS_TABLE_START] = sText_PkmnCenterAttention, + [STRINGID_PKMNCHARGINGPOWER - BATTLESTRINGS_TABLE_START] = sText_PkmnChargingPower, + [STRINGID_NATUREPOWERTURNEDINTO - BATTLESTRINGS_TABLE_START] = sText_NaturePowerTurnedInto, + [STRINGID_PKMNSTATUSNORMAL - BATTLESTRINGS_TABLE_START] = sText_PkmnStatusNormal, + [STRINGID_PKMNHASNOMOVESLEFT - BATTLESTRINGS_TABLE_START] = sText_PkmnHasNoMovesLeft, + [STRINGID_PKMNSUBJECTEDTOTORMENT - BATTLESTRINGS_TABLE_START] = sText_PkmnSubjectedToTorment, + [STRINGID_PKMNCANTUSEMOVETORMENT - BATTLESTRINGS_TABLE_START] = sText_PkmnCantUseMoveTorment, + [STRINGID_PKMNTIGHTENINGFOCUS - BATTLESTRINGS_TABLE_START] = sText_PkmnTighteningFocus, + [STRINGID_PKMNFELLFORTAUNT - BATTLESTRINGS_TABLE_START] = sText_PkmnFellForTaunt, + [STRINGID_PKMNCANTUSEMOVETAUNT - BATTLESTRINGS_TABLE_START] = sText_PkmnCantUseMoveTaunt, + [STRINGID_PKMNREADYTOHELP - BATTLESTRINGS_TABLE_START] = sText_PkmnReadyToHelp, + [STRINGID_PKMNSWITCHEDITEMS - BATTLESTRINGS_TABLE_START] = sText_PkmnSwitchedItems, + [STRINGID_PKMNCOPIEDFOE - BATTLESTRINGS_TABLE_START] = sText_PkmnCopiedFoe, + [STRINGID_PKMNMADEWISH - BATTLESTRINGS_TABLE_START] = sText_PkmnMadeWish, + [STRINGID_PKMNWISHCAMETRUE - BATTLESTRINGS_TABLE_START] = sText_PkmnWishCameTrue, + [STRINGID_PKMNPLANTEDROOTS - BATTLESTRINGS_TABLE_START] = sText_PkmnPlantedRoots, + [STRINGID_PKMNABSORBEDNUTRIENTS - BATTLESTRINGS_TABLE_START] = sText_PkmnAbsorbedNutrients, + [STRINGID_PKMNANCHOREDITSELF - BATTLESTRINGS_TABLE_START] = sText_PkmnAnchoredItself, + [STRINGID_PKMNWASMADEDROWSY - BATTLESTRINGS_TABLE_START] = sText_PkmnWasMadeDrowsy, + [STRINGID_PKMNKNOCKEDOFF - BATTLESTRINGS_TABLE_START] = sText_PkmnKnockedOff, + [STRINGID_PKMNSWAPPEDABILITIES - BATTLESTRINGS_TABLE_START] = sText_PkmnSwappedAbilities, + [STRINGID_PKMNSEALEDOPPONENTMOVE - BATTLESTRINGS_TABLE_START] = sText_PkmnSealedOpponentMove, + [STRINGID_PKMNCANTUSEMOVESEALED - BATTLESTRINGS_TABLE_START] = sText_PkmnCantUseMoveSealed, + [STRINGID_PKMNWANTSGRUDGE - BATTLESTRINGS_TABLE_START] = sText_PkmnWantsGrudge, + [STRINGID_PKMNLOSTPPGRUDGE - BATTLESTRINGS_TABLE_START] = sText_PkmnLostPPGrudge, + [STRINGID_PKMNSHROUDEDITSELF - BATTLESTRINGS_TABLE_START] = sText_PkmnShroudedItself, + [STRINGID_PKMNMOVEBOUNCED - BATTLESTRINGS_TABLE_START] = sText_PkmnMoveBounced, + [STRINGID_PKMNWAITSFORTARGET - BATTLESTRINGS_TABLE_START] = sText_PkmnWaitsForTarget, + [STRINGID_PKMNSNATCHEDMOVE - BATTLESTRINGS_TABLE_START] = sText_PkmnSnatchedMove, + [STRINGID_PKMNMADEITRAIN - BATTLESTRINGS_TABLE_START] = sText_PkmnMadeItRain, + [STRINGID_PKMNRAISEDSPEED - BATTLESTRINGS_TABLE_START] = sText_PkmnRaisedSpeed, + [STRINGID_PKMNPROTECTEDBY - BATTLESTRINGS_TABLE_START] = sText_PkmnProtectedBy, + [STRINGID_PKMNPREVENTSUSAGE - BATTLESTRINGS_TABLE_START] = sText_PkmnPreventsUsage, + [STRINGID_PKMNRESTOREDHPUSING - BATTLESTRINGS_TABLE_START] = sText_PkmnRestoredHPUsing, + [STRINGID_PKMNCHANGEDTYPEWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnChangedTypeWith, + [STRINGID_PKMNPREVENTSPARALYSISWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnPreventsParalysisWith, + [STRINGID_PKMNPREVENTSROMANCEWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnPreventsRomanceWith, + [STRINGID_PKMNPREVENTSPOISONINGWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnPreventsPoisoningWith, + [STRINGID_PKMNPREVENTSCONFUSIONWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnPreventsConfusionWith, + [STRINGID_PKMNRAISEDFIREPOWERWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnRaisedFirePowerWith, + [STRINGID_PKMNANCHORSITSELFWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnAnchorsItselfWith, + [STRINGID_PKMNCUTSATTACKWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnCutsAttackWith, + [STRINGID_PKMNPREVENTSSTATLOSSWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnPreventsStatLossWith, + [STRINGID_PKMNHURTSWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnHurtsWith, + [STRINGID_PKMNTRACED - BATTLESTRINGS_TABLE_START] = sText_PkmnTraced, + [STRINGID_STATSHARPLY - BATTLESTRINGS_TABLE_START] = sText_StatSharply, + [STRINGID_STATROSE - BATTLESTRINGS_TABLE_START] = gText_StatRose, + [STRINGID_STATHARSHLY - BATTLESTRINGS_TABLE_START] = sText_StatHarshly, + [STRINGID_STATFELL - BATTLESTRINGS_TABLE_START] = sText_StatFell, + [STRINGID_ATTACKERSSTATROSE - BATTLESTRINGS_TABLE_START] = sText_AttackersStatRose, + [STRINGID_DEFENDERSSTATROSE - BATTLESTRINGS_TABLE_START] = gText_DefendersStatRose, + [STRINGID_ATTACKERSSTATFELL - BATTLESTRINGS_TABLE_START] = sText_AttackersStatFell, + [STRINGID_DEFENDERSSTATFELL - BATTLESTRINGS_TABLE_START] = sText_DefendersStatFell, + [STRINGID_CRITICALHIT - BATTLESTRINGS_TABLE_START] = sText_CriticalHit, + [STRINGID_ONEHITKO - BATTLESTRINGS_TABLE_START] = sText_OneHitKO, + [STRINGID_123POOF - BATTLESTRINGS_TABLE_START] = sText_123Poof, + [STRINGID_ANDELLIPSIS - BATTLESTRINGS_TABLE_START] = sText_AndEllipsis, + [STRINGID_NOTVERYEFFECTIVE - BATTLESTRINGS_TABLE_START] = sText_NotVeryEffective, + [STRINGID_SUPEREFFECTIVE - BATTLESTRINGS_TABLE_START] = sText_SuperEffective, + [STRINGID_GOTAWAYSAFELY - BATTLESTRINGS_TABLE_START] = sText_GotAwaySafely, + [STRINGID_WILDPKMNFLED - BATTLESTRINGS_TABLE_START] = sText_WildPkmnFled, + [STRINGID_NORUNNINGFROMTRAINERS - BATTLESTRINGS_TABLE_START] = sText_NoRunningFromTrainers, + [STRINGID_CANTESCAPE - BATTLESTRINGS_TABLE_START] = sText_CantEscape, + [STRINGID_DONTLEAVEBIRCH - BATTLESTRINGS_TABLE_START] = sText_DontLeaveBirch, + [STRINGID_BUTNOTHINGHAPPENED - BATTLESTRINGS_TABLE_START] = sText_ButNothingHappened, + [STRINGID_BUTITFAILED - BATTLESTRINGS_TABLE_START] = sText_ButItFailed, + [STRINGID_ITHURTCONFUSION - BATTLESTRINGS_TABLE_START] = sText_ItHurtConfusion, + [STRINGID_MIRRORMOVEFAILED - BATTLESTRINGS_TABLE_START] = sText_MirrorMoveFailed, + [STRINGID_STARTEDTORAIN - BATTLESTRINGS_TABLE_START] = sText_StartedToRain, + [STRINGID_DOWNPOURSTARTED - BATTLESTRINGS_TABLE_START] = sText_DownpourStarted, + [STRINGID_RAINCONTINUES - BATTLESTRINGS_TABLE_START] = sText_RainContinues, + [STRINGID_DOWNPOURCONTINUES - BATTLESTRINGS_TABLE_START] = sText_DownpourContinues, + [STRINGID_RAINSTOPPED - BATTLESTRINGS_TABLE_START] = sText_RainStopped, + [STRINGID_SANDSTORMBREWED - BATTLESTRINGS_TABLE_START] = sText_SandstormBrewed, + [STRINGID_SANDSTORMRAGES - BATTLESTRINGS_TABLE_START] = sText_SandstormRages, + [STRINGID_SANDSTORMSUBSIDED - BATTLESTRINGS_TABLE_START] = sText_SandstormSubsided, + [STRINGID_SUNLIGHTGOTBRIGHT - BATTLESTRINGS_TABLE_START] = sText_SunlightGotBright, + [STRINGID_SUNLIGHTSTRONG - BATTLESTRINGS_TABLE_START] = sText_SunlightStrong, + [STRINGID_SUNLIGHTFADED - BATTLESTRINGS_TABLE_START] = sText_SunlightFaded, + [STRINGID_STARTEDHAIL - BATTLESTRINGS_TABLE_START] = sText_StartedHail, + [STRINGID_HAILCONTINUES - BATTLESTRINGS_TABLE_START] = sText_HailContinues, + [STRINGID_HAILSTOPPED - BATTLESTRINGS_TABLE_START] = sText_HailStopped, + [STRINGID_FAILEDTOSPITUP - BATTLESTRINGS_TABLE_START] = sText_FailedToSpitUp, + [STRINGID_FAILEDTOSWALLOW - BATTLESTRINGS_TABLE_START] = sText_FailedToSwallow, + [STRINGID_WINDBECAMEHEATWAVE - BATTLESTRINGS_TABLE_START] = sText_WindBecameHeatWave, + [STRINGID_STATCHANGESGONE - BATTLESTRINGS_TABLE_START] = sText_StatChangesGone, + [STRINGID_COINSSCATTERED - BATTLESTRINGS_TABLE_START] = sText_CoinsScattered, + [STRINGID_TOOWEAKFORSUBSTITUTE - BATTLESTRINGS_TABLE_START] = sText_TooWeakForSubstitute, + [STRINGID_SHAREDPAIN - BATTLESTRINGS_TABLE_START] = sText_SharedPain, + [STRINGID_BELLCHIMED - BATTLESTRINGS_TABLE_START] = sText_BellChimed, + [STRINGID_FAINTINTHREE - BATTLESTRINGS_TABLE_START] = sText_FaintInThree, + [STRINGID_NOPPLEFT - BATTLESTRINGS_TABLE_START] = sText_NoPPLeft, + [STRINGID_BUTNOPPLEFT - BATTLESTRINGS_TABLE_START] = sText_ButNoPPLeft, + [STRINGID_PLAYERUSEDITEM - BATTLESTRINGS_TABLE_START] = sText_PlayerUsedItem, + [STRINGID_WALLYUSEDITEM - BATTLESTRINGS_TABLE_START] = sText_WallyUsedItem, + [STRINGID_TRAINERBLOCKEDBALL - BATTLESTRINGS_TABLE_START] = sText_TrainerBlockedBall, + [STRINGID_DONTBEATHIEF - BATTLESTRINGS_TABLE_START] = sText_DontBeAThief, + [STRINGID_ITDODGEDBALL - BATTLESTRINGS_TABLE_START] = sText_ItDodgedBall, + [STRINGID_YOUMISSEDPKMN - BATTLESTRINGS_TABLE_START] = sText_YouMissedPkmn, + [STRINGID_PKMNBROKEFREE - BATTLESTRINGS_TABLE_START] = sText_PkmnBrokeFree, + [STRINGID_ITAPPEAREDCAUGHT - BATTLESTRINGS_TABLE_START] = sText_ItAppearedCaught, + [STRINGID_AARGHALMOSTHADIT - BATTLESTRINGS_TABLE_START] = sText_AarghAlmostHadIt, + [STRINGID_SHOOTSOCLOSE - BATTLESTRINGS_TABLE_START] = sText_ShootSoClose, + [STRINGID_GOTCHAPKMNCAUGHT - BATTLESTRINGS_TABLE_START] = sText_GotchaPkmnCaught, + [STRINGID_GOTCHAPKMNCAUGHT2 - BATTLESTRINGS_TABLE_START] = sText_GotchaPkmnCaught2, + [STRINGID_GIVENICKNAMECAPTURED - BATTLESTRINGS_TABLE_START] = sText_GiveNicknameCaptured, + [STRINGID_PKMNSENTTOPC - BATTLESTRINGS_TABLE_START] = sText_PkmnSentToPC, + [STRINGID_PKMNDATAADDEDTODEX - BATTLESTRINGS_TABLE_START] = sText_PkmnDataAddedToDex, + [STRINGID_ITISRAINING - BATTLESTRINGS_TABLE_START] = sText_ItIsRaining, + [STRINGID_SANDSTORMISRAGING - BATTLESTRINGS_TABLE_START] = sText_SandstormIsRaging, + [STRINGID_CANTESCAPE2 - BATTLESTRINGS_TABLE_START] = sText_CantEscape2, + [STRINGID_PKMNIGNORESASLEEP - BATTLESTRINGS_TABLE_START] = sText_PkmnIgnoresAsleep, + [STRINGID_PKMNIGNOREDORDERS - BATTLESTRINGS_TABLE_START] = sText_PkmnIgnoredOrders, + [STRINGID_PKMNBEGANTONAP - BATTLESTRINGS_TABLE_START] = sText_PkmnBeganToNap, + [STRINGID_PKMNLOAFING - BATTLESTRINGS_TABLE_START] = sText_PkmnLoafing, + [STRINGID_PKMNWONTOBEY - BATTLESTRINGS_TABLE_START] = sText_PkmnWontObey, + [STRINGID_PKMNTURNEDAWAY - BATTLESTRINGS_TABLE_START] = sText_PkmnTurnedAway, + [STRINGID_PKMNPRETENDNOTNOTICE - BATTLESTRINGS_TABLE_START] = sText_PkmnPretendNotNotice, + [STRINGID_ENEMYABOUTTOSWITCHPKMN - BATTLESTRINGS_TABLE_START] = sText_EnemyAboutToSwitchPkmn, + [STRINGID_CREPTCLOSER - BATTLESTRINGS_TABLE_START] = sText_CreptCloser, + [STRINGID_CANTGETCLOSER - BATTLESTRINGS_TABLE_START] = sText_CantGetCloser, + [STRINGID_PKMNWATCHINGCAREFULLY - BATTLESTRINGS_TABLE_START] = sText_PkmnWatchingCarefully, + [STRINGID_PKMNCURIOUSABOUTX - BATTLESTRINGS_TABLE_START] = sText_PkmnCuriousAboutX, + [STRINGID_PKMNENTHRALLEDBYX - BATTLESTRINGS_TABLE_START] = sText_PkmnEnthralledByX, + [STRINGID_PKMNIGNOREDX - BATTLESTRINGS_TABLE_START] = sText_PkmnIgnoredX, + [STRINGID_THREWPOKEBLOCKATPKMN - BATTLESTRINGS_TABLE_START] = sText_ThrewPokeblockAtPkmn, + [STRINGID_OUTOFSAFARIBALLS - BATTLESTRINGS_TABLE_START] = sText_OutOfSafariBalls, + [STRINGID_PKMNSITEMCUREDPARALYSIS - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemCuredParalysis, + [STRINGID_PKMNSITEMCUREDPOISON - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemCuredPoison, + [STRINGID_PKMNSITEMHEALEDBURN - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemHealedBurn, + [STRINGID_PKMNSITEMDEFROSTEDIT - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemDefrostedIt, + [STRINGID_PKMNSITEMWOKEIT - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemWokeIt, + [STRINGID_PKMNSITEMSNAPPEDOUT - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemSnappedOut, + [STRINGID_PKMNSITEMCUREDPROBLEM - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemCuredProblem, + [STRINGID_PKMNSITEMRESTOREDHEALTH - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemRestoredHealth, + [STRINGID_PKMNSITEMRESTOREDPP - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemRestoredPP, + [STRINGID_PKMNSITEMRESTOREDSTATUS - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemRestoredStatus, + [STRINGID_PKMNSITEMRESTOREDHPALITTLE - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemRestoredHPALittle, + [STRINGID_ITEMALLOWSONLYYMOVE - BATTLESTRINGS_TABLE_START] = sText_ItemAllowsOnlyYMove, + [STRINGID_PKMNHUNGONWITHX - BATTLESTRINGS_TABLE_START] = sText_PkmnHungOnWithX, + [STRINGID_EMPTYSTRING3 - BATTLESTRINGS_TABLE_START] = gText_EmptyString3, + [STRINGID_PKMNSXPREVENTSBURNS - BATTLESTRINGS_TABLE_START] = sText_PkmnsXPreventsBurns, + [STRINGID_PKMNSXBLOCKSY - BATTLESTRINGS_TABLE_START] = sText_PkmnsXBlocksY, + [STRINGID_PKMNSXRESTOREDHPALITTLE2 - BATTLESTRINGS_TABLE_START] = sText_PkmnsXRestoredHPALittle2, + [STRINGID_PKMNSXWHIPPEDUPSANDSTORM - BATTLESTRINGS_TABLE_START] = sText_PkmnsXWhippedUpSandstorm, + [STRINGID_PKMNSXPREVENTSYLOSS - BATTLESTRINGS_TABLE_START] = sText_PkmnsXPreventsYLoss, + [STRINGID_PKMNSXINFATUATEDY - BATTLESTRINGS_TABLE_START] = sText_PkmnsXInfatuatedY, + [STRINGID_PKMNSXMADEYINEFFECTIVE - BATTLESTRINGS_TABLE_START] = sText_PkmnsXMadeYIneffective, + [STRINGID_PKMNSXCUREDYPROBLEM - BATTLESTRINGS_TABLE_START] = sText_PkmnsXCuredYProblem, + [STRINGID_ITSUCKEDLIQUIDOOZE - BATTLESTRINGS_TABLE_START] = sText_ItSuckedLiquidOoze, + [STRINGID_PKMNTRANSFORMED - BATTLESTRINGS_TABLE_START] = sText_PkmnTransformed, + [STRINGID_ELECTRICITYWEAKENED - BATTLESTRINGS_TABLE_START] = sText_ElectricityWeakened, + [STRINGID_FIREWEAKENED - BATTLESTRINGS_TABLE_START] = sText_FireWeakened, + [STRINGID_PKMNHIDUNDERWATER - BATTLESTRINGS_TABLE_START] = sText_PkmnHidUnderwater, + [STRINGID_PKMNSPRANGUP - BATTLESTRINGS_TABLE_START] = sText_PkmnSprangUp, + [STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_TABLE_START] = sText_HMMovesCantBeForgotten, + [STRINGID_XFOUNDONEY - BATTLESTRINGS_TABLE_START] = sText_XFoundOneY, + [STRINGID_PLAYERDEFEATEDTRAINER1 - BATTLESTRINGS_TABLE_START] = sText_PlayerDefeatedLinkTrainerTrainer1, + [STRINGID_SOOTHINGAROMA - BATTLESTRINGS_TABLE_START] = sText_SoothingAroma, + [STRINGID_ITEMSCANTBEUSEDNOW - BATTLESTRINGS_TABLE_START] = sText_ItemsCantBeUsedNow, + [STRINGID_FORXCOMMAYZ - BATTLESTRINGS_TABLE_START] = sText_ForXCommaYZ, + [STRINGID_USINGITEMSTATOFPKMNROSE - BATTLESTRINGS_TABLE_START] = sText_UsingItemTheStatOfPkmnRose, + [STRINGID_PKMNUSEDXTOGETPUMPED - BATTLESTRINGS_TABLE_START] = sText_PkmnUsedXToGetPumped, + [STRINGID_PKMNSXMADEYUSELESS - BATTLESTRINGS_TABLE_START] = sText_PkmnsXMadeYUseless, + [STRINGID_PKMNTRAPPEDBYSANDTOMB - BATTLESTRINGS_TABLE_START] = sText_PkmnTrappedBySandTomb, + [STRINGID_EMPTYSTRING4 - BATTLESTRINGS_TABLE_START] = sText_EmptyString4, + [STRINGID_ABOOSTED - BATTLESTRINGS_TABLE_START] = sText_ABoosted, + [STRINGID_PKMNSXINTENSIFIEDSUN - BATTLESTRINGS_TABLE_START] = sText_PkmnsXIntensifiedSun, + [STRINGID_PKMNMAKESGROUNDMISS - BATTLESTRINGS_TABLE_START] = sText_PkmnMakesGroundMiss, + [STRINGID_YOUTHROWABALLNOWRIGHT - BATTLESTRINGS_TABLE_START] = sText_YouThrowABallNowRight, + [STRINGID_PKMNSXTOOKATTACK - BATTLESTRINGS_TABLE_START] = sText_PkmnsXTookAttack, + [STRINGID_PKMNCHOSEXASDESTINY - BATTLESTRINGS_TABLE_START] = sText_PkmnChoseXAsDestiny, + [STRINGID_PKMNLOSTFOCUS - BATTLESTRINGS_TABLE_START] = sText_PkmnLostFocus, + [STRINGID_USENEXTPKMN - BATTLESTRINGS_TABLE_START] = sText_UseNextPkmn, + [STRINGID_PKMNFLEDUSINGITS - BATTLESTRINGS_TABLE_START] = sText_PkmnFledUsingIts, + [STRINGID_PKMNFLEDUSING - BATTLESTRINGS_TABLE_START] = sText_PkmnFledUsing, + [STRINGID_PKMNWASDRAGGEDOUT - BATTLESTRINGS_TABLE_START] = sText_PkmnWasDraggedOut, + [STRINGID_PREVENTEDFROMWORKING - BATTLESTRINGS_TABLE_START] = sText_PreventedFromWorking, + [STRINGID_PKMNSITEMNORMALIZEDSTATUS - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemNormalizedStatus, + [STRINGID_TRAINER1USEDITEM - BATTLESTRINGS_TABLE_START] = sText_Trainer1UsedItem, + [STRINGID_BOXISFULL - BATTLESTRINGS_TABLE_START] = sText_BoxIsFull, + [STRINGID_PKMNAVOIDEDATTACK - BATTLESTRINGS_TABLE_START] = sText_PkmnAvoidedAttack, + [STRINGID_PKMNSXMADEITINEFFECTIVE - BATTLESTRINGS_TABLE_START] = sText_PkmnsXMadeItIneffective, + [STRINGID_PKMNSXPREVENTSFLINCHING - BATTLESTRINGS_TABLE_START] = sText_PkmnsXPreventsFlinching, + [STRINGID_PKMNALREADYHASBURN - BATTLESTRINGS_TABLE_START] = sText_PkmnAlreadyHasBurn, + [STRINGID_STATSWONTDECREASE2 - BATTLESTRINGS_TABLE_START] = sText_StatsWontDecrease2, + [STRINGID_PKMNSXBLOCKSY2 - BATTLESTRINGS_TABLE_START] = sText_PkmnsXBlocksY2, + [STRINGID_PKMNSXWOREOFF - BATTLESTRINGS_TABLE_START] = sText_PkmnsXWoreOff, + [STRINGID_PKMNRAISEDDEFALITTLE - BATTLESTRINGS_TABLE_START] = sText_PkmnRaisedDefALittle, + [STRINGID_PKMNRAISEDSPDEFALITTLE - BATTLESTRINGS_TABLE_START] = sText_PkmnRaisedSpDefALittle, + [STRINGID_THEWALLSHATTERED - BATTLESTRINGS_TABLE_START] = sText_TheWallShattered, + [STRINGID_PKMNSXPREVENTSYSZ - BATTLESTRINGS_TABLE_START] = sText_PkmnsXPreventsYsZ, + [STRINGID_PKMNSXCUREDITSYPROBLEM - BATTLESTRINGS_TABLE_START] = sText_PkmnsXCuredItsYProblem, + [STRINGID_ATTACKERCANTESCAPE - BATTLESTRINGS_TABLE_START] = sText_AttackerCantEscape, + [STRINGID_PKMNOBTAINEDX - BATTLESTRINGS_TABLE_START] = sText_PkmnObtainedX, + [STRINGID_PKMNOBTAINEDX2 - BATTLESTRINGS_TABLE_START] = sText_PkmnObtainedX2, + [STRINGID_PKMNOBTAINEDXYOBTAINEDZ - BATTLESTRINGS_TABLE_START] = sText_PkmnObtainedXYObtainedZ, + [STRINGID_BUTNOEFFECT - BATTLESTRINGS_TABLE_START] = sText_ButNoEffect, + [STRINGID_PKMNSXHADNOEFFECTONY - BATTLESTRINGS_TABLE_START] = sText_PkmnsXHadNoEffectOnY, + [STRINGID_TWOENEMIESDEFEATED - BATTLESTRINGS_TABLE_START] = sText_TwoInGameTrainersDefeated, + [STRINGID_TRAINER2LOSETEXT - BATTLESTRINGS_TABLE_START] = sText_Trainer2LoseText, + [STRINGID_PKMNINCAPABLEOFPOWER - BATTLESTRINGS_TABLE_START] = sText_PkmnIncapableOfPower, + [STRINGID_GLINTAPPEARSINEYE - BATTLESTRINGS_TABLE_START] = sText_GlintAppearsInEye, + [STRINGID_PKMNGETTINGINTOPOSITION - BATTLESTRINGS_TABLE_START] = sText_PkmnGettingIntoPosition, + [STRINGID_PKMNBEGANGROWLINGDEEPLY - BATTLESTRINGS_TABLE_START] = sText_PkmnBeganGrowlingDeeply, + [STRINGID_PKMNEAGERFORMORE - BATTLESTRINGS_TABLE_START] = sText_PkmnEagerForMore, + [STRINGID_DEFEATEDOPPONENTBYREFEREE - BATTLESTRINGS_TABLE_START] = sText_DefeatedOpponentByReferee, + [STRINGID_LOSTTOOPPONENTBYREFEREE - BATTLESTRINGS_TABLE_START] = sText_LostToOpponentByReferee, + [STRINGID_TIEDOPPONENTBYREFEREE - BATTLESTRINGS_TABLE_START] = sText_TiedOpponentByReferee, + [STRINGID_QUESTIONFORFEITMATCH - BATTLESTRINGS_TABLE_START] = sText_QuestionForfeitMatch, + [STRINGID_FORFEITEDMATCH - BATTLESTRINGS_TABLE_START] = sText_ForfeitedMatch, + [STRINGID_PKMNTRANSFERREDSOMEONESPC - BATTLESTRINGS_TABLE_START] = gText_PkmnTransferredSomeonesPC, + [STRINGID_PKMNTRANSFERREDLANETTESPC - BATTLESTRINGS_TABLE_START] = gText_PkmnTransferredLanettesPC, + [STRINGID_PKMNBOXSOMEONESPCFULL - BATTLESTRINGS_TABLE_START] = gText_PkmnTransferredSomeonesPCBoxFull, + [STRINGID_PKMNBOXLANETTESPCFULL - BATTLESTRINGS_TABLE_START] = gText_PkmnTransferredLanettesPCBoxFull, + [STRINGID_TRAINER1WINTEXT - BATTLESTRINGS_TABLE_START] = sText_Trainer1WinText, + [STRINGID_TRAINER2WINTEXT - BATTLESTRINGS_TABLE_START] = sText_Trainer2WinText, }; const u16 gMissStringIds[] = @@ -2331,14 +2331,14 @@ void BufferStringBattle(u16 stringID) } break; default: // load a string from the table - if (stringID >= BATTLESTRINGS_COUNT + BATTLESTRINGS_ID_ADDER) + if (stringID >= BATTLESTRINGS_COUNT) { gDisplayedStringBattle[0] = EOS; return; } else { - stringPtr = gBattleStringsTable[stringID - BATTLESTRINGS_ID_ADDER]; + stringPtr = gBattleStringsTable[stringID - BATTLESTRINGS_TABLE_START]; } break; } @@ -2862,7 +2862,7 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) { case B_BUFF_STRING: // battle string hword = T1_READ_16(&src[srcID + 1]); - StringAppend(dst, gBattleStringsTable[hword - BATTLESTRINGS_ID_ADDER]); + StringAppend(dst, gBattleStringsTable[hword - BATTLESTRINGS_TABLE_START]); srcID += 3; break; case B_BUFF_NUMBER: // int to string diff --git a/src/battle_tv.c b/src/battle_tv.c index f65bf73ea0..b9008b47a7 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -570,7 +570,7 @@ void BattleTv_SetDataBasedOnString(u16 stringId) moveSlot = GetBattlerMoveSlotId(gBattlerAttacker, gBattleMsgDataPtr->currentMove); - if (moveSlot >= MAX_MON_MOVES && IsNotSpecialBattleString(stringId) && stringId > BATTLESTRINGS_ID_ADDER) + if (moveSlot >= MAX_MON_MOVES && IsNotSpecialBattleString(stringId) && stringId > BATTLESTRINGS_TABLE_START) { tvPtr->side[atkSide].faintCause = FNT_OTHER; return; diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 327e48d195..bde11ddb5e 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -855,7 +855,7 @@ static void Task_EvolutionScene(u8 taskId) { BufferMoveToLearnIntoBattleTextBuff2(); PlayFanfare(MUS_LEVEL_UP); - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnsFirstMove = 0x40; // re-used as a counter gTasks[taskId].tState++; @@ -873,7 +873,7 @@ static void Task_EvolutionScene(u8 taskId) { // "{mon} is trying to learn {move}" BufferMoveToLearnIntoBattleTextBuff2(); - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnMoveState++; } @@ -882,7 +882,7 @@ static void Task_EvolutionScene(u8 taskId) if (!IsTextPrinterActive(0) && !IsSEPlaying()) { // "But, {mon} can't learn more than four moves" - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnMoveState++; } @@ -891,7 +891,7 @@ static void Task_EvolutionScene(u8 taskId) if (!IsTextPrinterActive(0) && !IsSEPlaying()) { // "Delete a move to make room for {move}?" - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnMoveYesState = MVSTATE_SHOW_MOVE_SELECT; gTasks[taskId].tLearnMoveNoState = MVSTATE_ASK_CANCEL; @@ -979,7 +979,7 @@ static void Task_EvolutionScene(u8 taskId) if (IsHMMove2(move)) { // Can't forget HMs - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnMoveState = MVSTATE_RETRY_AFTER_HM; } @@ -996,14 +996,14 @@ static void Task_EvolutionScene(u8 taskId) } break; case MVSTATE_FORGET_MSG_1: - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnMoveState++; break; case MVSTATE_FORGET_MSG_2: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnMoveState++; } @@ -1011,20 +1011,20 @@ static void Task_EvolutionScene(u8 taskId) case MVSTATE_LEARNED_MOVE: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tState = EVOSTATE_LEARNED_MOVE; } break; case MVSTATE_ASK_CANCEL: - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnMoveYesState = MVSTATE_CANCEL; gTasks[taskId].tLearnMoveNoState = MVSTATE_INTRO_MSG_1; gTasks[taskId].tLearnMoveState = MVSTATE_PRINT_YES_NO; break; case MVSTATE_CANCEL: - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tState = EVOSTATE_TRY_LEARN_MOVE; break; @@ -1258,7 +1258,7 @@ static void Task_TradeEvolutionScene(u8 taskId) { BufferMoveToLearnIntoBattleTextBuff2(); PlayFanfare(MUS_LEVEL_UP); - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnsFirstMove = 0x40; // re-used as a counter gTasks[taskId].tState++; @@ -1276,7 +1276,7 @@ static void Task_TradeEvolutionScene(u8 taskId) { // "{mon} is trying to learn {move}" BufferMoveToLearnIntoBattleTextBuff2(); - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveState++; } @@ -1285,7 +1285,7 @@ static void Task_TradeEvolutionScene(u8 taskId) if (!IsTextPrinterActive(0) && !IsSEPlaying()) { // "But, {mon} can't learn more than four moves" - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveState++; } @@ -1294,7 +1294,7 @@ static void Task_TradeEvolutionScene(u8 taskId) if (!IsTextPrinterActive(0) && !IsSEPlaying()) { // "Delete a move to make room for {move}?" - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveYesState = T_MVSTATE_SHOW_MOVE_SELECT; gTasks[taskId].tLearnMoveNoState = T_MVSTATE_ASK_CANCEL; @@ -1315,7 +1315,7 @@ static void Task_TradeEvolutionScene(u8 taskId) { case 0: // YES sEvoCursorPos = 0; - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveYesState; if (gTasks[taskId].tLearnMoveState == T_MVSTATE_SHOW_MOVE_SELECT) @@ -1324,7 +1324,7 @@ static void Task_TradeEvolutionScene(u8 taskId) case 1: // NO case MENU_B_PRESSED: sEvoCursorPos = 1; - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveNoState; break; @@ -1363,7 +1363,7 @@ static void Task_TradeEvolutionScene(u8 taskId) if (IsHMMove2(move)) { // Can't forget HMs - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveState = T_MVSTATE_RETRY_AFTER_HM; } @@ -1374,7 +1374,7 @@ static void Task_TradeEvolutionScene(u8 taskId) RemoveMonPPBonus(mon, var); SetMonMoveSlot(mon, gMoveToLearn, var); - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveState++; } @@ -1384,7 +1384,7 @@ static void Task_TradeEvolutionScene(u8 taskId) case T_MVSTATE_FORGET_MSG: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveState++; } @@ -1392,20 +1392,20 @@ static void Task_TradeEvolutionScene(u8 taskId) case T_MVSTATE_LEARNED_MOVE: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tState = T_EVOSTATE_LEARNED_MOVE; } break; case T_MVSTATE_ASK_CANCEL: - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveYesState = T_MVSTATE_CANCEL; gTasks[taskId].tLearnMoveNoState = T_MVSTATE_INTRO_MSG_1; gTasks[taskId].tLearnMoveState = T_MVSTATE_PRINT_YES_NO; break; case T_MVSTATE_CANCEL: - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_ID_ADDER]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tState = T_EVOSTATE_TRY_LEARN_MOVE; break; From bb91b1b0d1cf70fa49cb0b1f2a309ad541927164 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Thu, 10 Mar 2022 16:36:41 -0500 Subject: [PATCH 095/105] Update generic macro argument names --- asm/macros/event.inc | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 58e37d0a6a..661e675c97 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -828,10 +828,10 @@ .endm @ Sets the movement type (MOVEMENT_TYPE_*) for an object's template. - .macro setobjectmovementtype word:req, byte:req + .macro setobjectmovementtype localId:req, movementType:req .byte 0x65 - .2byte \word - .byte \byte + .2byte \localId + .byte \movementType .endm @ If a standard message box (or its text) is being drawn on-screen, this command blocks script execution until the @@ -1451,48 +1451,48 @@ .endm @ Equivalent to goto using the relative address set by setvaddress. - .macro vgoto pointer:req + .macro vgoto destination:req .byte 0xb9 - .4byte \pointer + .4byte \destination .endm @ Equivalent to call using the relative address set by setvaddress. - .macro vcall pointer:req + .macro vcall destination:req .byte 0xba - .4byte \pointer + .4byte \destination .endm @ Equivalent to goto_if using the relative address set by setvaddress. - .macro vgoto_if byte:req, pointer:req + .macro vgoto_if condition:req, destination:req .byte 0xbb - .byte \byte - .4byte \pointer + .byte \condition + .4byte \destination .endm @ Equivalent to call_if using the relative address set by setvaddress. - .macro vcall_if byte:req, pointer:req + .macro vcall_if condition:req, destination:req .byte 0xbc - .byte \byte - .4byte \pointer + .byte \condition + .4byte \destination .endm @ Equivalent to message using the relative address set by setvaddress. - .macro vmessage pointer:req + .macro vmessage text:req .byte 0xbd - .4byte \pointer + .4byte \text .endm @ Expands the given text at the pointer (- the relative address set by setvaddress) into gStringVar4 - .macro vbuffermessage ptr:req + .macro vbuffermessage text:req .byte 0xbe - .4byte \ptr + .4byte \text .endm @ Equivalent to bufferstring using the relative address set by setvaddress. - .macro vbufferstring stringVarIndex:req, pointer:req + .macro vbufferstring stringVarIndex:req, text:req .byte 0xbf stringvar \stringVarIndex - .4byte \pointer + .4byte \text .endm @ Create a window showing how many Coins the player has. @@ -1549,9 +1549,9 @@ .endm @ Used only in FireRed/LeafGreen, does nothing in Emerald. - .macro loadhelp pointer:req + .macro loadhelp text:req .byte 0xc8 - .4byte \pointer + .4byte \text .endm @ Used only in FireRed/LeafGreen, does nothing in Emerald. From aca51e843e45879efbca07c0c28e63b44f1a7e17 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 14 Mar 2022 16:14:32 -0300 Subject: [PATCH 096/105] Update battle_scripts_1.s --- data/battle_scripts_1.s | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c85a47d8bb..08227363a6 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -308,7 +308,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectCloseCombat @ EFFECT_CLOSE_COMBAT .4byte BattleScript_EffectLastResort @ EFFECT_LAST_RESORT .4byte BattleScript_EffectRecoil33WithStatus @ EFFECT_RECOIL_33_STATUS - .4byte BattleScript_EffectFlinchWithStatus @ EFFECT_FLINCH_STATUS + .4byte BattleScript_EffectFlinchStatus @ EFFECT_FLINCH_STATUS .4byte BattleScript_EffectRecoil50 @ EFFECT_RECOIL_50 .4byte BattleScript_EffectShellSmash @ EFFECT_SHELL_SMASH .4byte BattleScript_EffectShiftGear @ EFFECT_SHIFT_GEAR @@ -3301,7 +3301,7 @@ BattleScript_EffectFlinchHit:: setmoveeffect MOVE_EFFECT_FLINCH goto BattleScript_EffectHit -BattleScript_EffectFlinchWithStatus: +BattleScript_EffectFlinchStatus: setmoveeffect MOVE_EFFECT_FLINCH attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE From 0a0157b62c29172eabd07f0c0eb02d6567957c2c Mon Sep 17 00:00:00 2001 From: GriffinR Date: Mon, 14 Mar 2022 15:54:47 -0400 Subject: [PATCH 097/105] Name unknown_16.png --- .../pics/{unknown_16.png => jump_long_grass.png} | Bin spritesheet_rules.mk | 2 +- src/data/object_events/object_event_graphics.h | 2 +- src/field_effect_helpers.c | 2 ++ 4 files changed, 4 insertions(+), 2 deletions(-) rename graphics/field_effects/pics/{unknown_16.png => jump_long_grass.png} (100%) diff --git a/graphics/field_effects/pics/unknown_16.png b/graphics/field_effects/pics/jump_long_grass.png similarity index 100% rename from graphics/field_effects/pics/unknown_16.png rename to graphics/field_effects/pics/jump_long_grass.png diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index ae79719602..9fb184638a 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -636,7 +636,7 @@ $(FLDEFFGFXDIR)/tall_grass.4bpp: %.4bpp: %.png $(FLDEFFGFXDIR)/tree_disguise.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 -$(FLDEFFGFXDIR)/unknown_16.4bpp: %.4bpp: %.png +$(FLDEFFGFXDIR)/jump_long_grass.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(FLDEFFGFXDIR)/unknown_17.4bpp: %.4bpp: %.png diff --git a/src/data/object_events/object_event_graphics.h b/src/data/object_events/object_event_graphics.h index 81d83a8563..6ee56cc78e 100755 --- a/src/data/object_events/object_event_graphics.h +++ b/src/data/object_events/object_event_graphics.h @@ -305,7 +305,7 @@ const u16 gFieldEffectObjectPalette1[] = INCBIN_U16("graphics/field_effects/pale const u32 gFieldEffectObjectPic_GroundImpactDust[] = INCBIN_U32("graphics/field_effects/pics/ground_impact_dust.4bpp"); const u32 gFieldEffectObjectPic_JumpTallGrass[] = INCBIN_U32("graphics/field_effects/pics/jump_tall_grass.4bpp"); const u32 gUnusedGrass3[] = INCBIN_U32("graphics/field_effects/pics/unused_grass_3.4bpp"); -const u32 gFieldEffectObjectPic_JumpLongGrass[] = INCBIN_U32("graphics/field_effects/pics/unknown_16.4bpp"); +const u32 gFieldEffectObjectPic_JumpLongGrass[] = INCBIN_U32("graphics/field_effects/pics/jump_long_grass.4bpp"); const u32 gFieldEffectObjectPic_Unknown17[] = INCBIN_U32("graphics/field_effects/pics/unknown_17.4bpp"); const u32 gFieldEffectObjectPic_UnusedGrass2[] = INCBIN_U32("graphics/field_effects/pics/unused_grass_2.4bpp"); const u32 gFieldEffectObjectPic_LongGrass[] = INCBIN_U32("graphics/field_effects/pics/long_grass.4bpp"); diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 65617038d1..036ff33f2c 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -487,6 +487,8 @@ void UpdateLongGrassFieldEffect(struct Sprite *sprite) #undef sCurrentMap #undef sObjectMoved +// Effectively unused as it's not possible in vanilla to jump onto long grass (no adjacent ledges, and can't ride the Acro Bike in it). +// The graphics for this effect do not visually correspond to tall grass either. Perhaps these graphics were its original design? u32 FldEff_JumpLongGrass(void) { u8 spriteId; From 058783c14841b87dab93b114f216ed1417b27db3 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Mon, 14 Mar 2022 16:01:17 -0400 Subject: [PATCH 098/105] Fix comment mistake --- src/field_effect_helpers.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 036ff33f2c..c3332c7fc6 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -488,7 +488,7 @@ void UpdateLongGrassFieldEffect(struct Sprite *sprite) #undef sObjectMoved // Effectively unused as it's not possible in vanilla to jump onto long grass (no adjacent ledges, and can't ride the Acro Bike in it). -// The graphics for this effect do not visually correspond to tall grass either. Perhaps these graphics were its original design? +// The graphics for this effect do not visually correspond to long grass either. Perhaps these graphics were its original design? u32 FldEff_JumpLongGrass(void) { u8 spriteId; From 0a65fd316cd9208e4f21dbfc0b4b913885c29c20 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 20 Mar 2022 12:17:03 -0300 Subject: [PATCH 099/105] Fixed Enigma Berry check in CanMegaEvolve --- src/battle_util.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index 763a910ac2..b1534a3ec3 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9333,8 +9333,13 @@ bool32 CanMegaEvolve(u8 battlerId) { if (B_ENABLE_DEBUG && gBattleStruct->debugHoldEffects[battlerId]) holdEffect = gBattleStruct->debugHoldEffects[battlerId]; +#ifdef ITEM_EXPANSION + else if (itemId == ITEM_ENIGMA_BERRY_E_READER) + holdEffect = gEnigmaBerries[battlerId].holdEffect; +#else else if (itemId == ITEM_ENIGMA_BERRY) holdEffect = gEnigmaBerries[battlerId].holdEffect; +#endif else holdEffect = ItemId_GetHoldEffect(itemId); From 387bf07e3c375097482ec89ac143c93bf3cae1e7 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 20 Mar 2022 19:00:21 -0300 Subject: [PATCH 100/105] Update battle_scripts_1.s --- data/battle_scripts_1.s | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 08227363a6..28a310c5bf 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -307,7 +307,7 @@ 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_EffectRecoil33Status @ EFFECT_RECOIL_33_STATUS .4byte BattleScript_EffectFlinchStatus @ EFFECT_FLINCH_STATUS .4byte BattleScript_EffectRecoil50 @ EFFECT_RECOIL_50 .4byte BattleScript_EffectShellSmash @ EFFECT_SHELL_SMASH @@ -5579,7 +5579,7 @@ BattleScript_EffectRecoil33:: setmoveeffect MOVE_EFFECT_RECOIL_33 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit -BattleScript_EffectRecoil33WithStatus: +BattleScript_EffectRecoil33Status: setmoveeffect MOVE_EFFECT_RECOIL_33_STATUS | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit From a127cb32bb95410b5b417bbcb2b89271ba3f1539 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 30 Mar 2022 02:05:54 -0300 Subject: [PATCH 101/105] Removed pointless use of preproc directives --- src/battle_util.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 93206b5264..3b2d9e2cac 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7964,9 +7964,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) // todo break; case EFFECT_FLING: - #ifdef ITEM_EXPANSION basePower = ItemId_GetFlingPower(gBattleMons[battlerAtk].item); - #endif break; case EFFECT_ERUPTION: basePower = gBattleMons[battlerAtk].hp * basePower / gBattleMons[battlerAtk].maxHP; @@ -9644,9 +9642,7 @@ bool32 CanFling(u8 battlerId) #endif || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM || gDisableStructs[battlerId].embargoTimer != 0 - #ifdef ITEM_EXPANSION || ItemId_GetFlingPower(item) != 0 - #endif || !CanBattlerGetOrLoseItem(battlerId, item)) return FALSE; From 66cbe29c1408feef07772ba0b8a5b89995fa3056 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Wed, 30 Mar 2022 09:37:03 -0400 Subject: [PATCH 102/105] Add bugfix for Battle Factory trainer IVs --- include/battle_factory.h | 2 +- src/battle_factory.c | 24 ++++++++++++++++-------- src/battle_tower.c | 11 ++++++++--- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/include/battle_factory.h b/include/battle_factory.h index 5606d60d1e..d414bdb3b1 100644 --- a/include/battle_factory.h +++ b/include/battle_factory.h @@ -3,7 +3,7 @@ void CallBattleFactoryFunction(void); bool8 InBattleFactory(void); -u8 GetFactoryMonFixedIV(u8 arg0, u8 arg1); +u8 GetFactoryMonFixedIV(u8 challengeNum, bool8 isLastBattle); void FillFactoryBrainParty(void); u8 GetNumPastRentalsRank(u8 battleMode, u8 lvlMode); u32 GetAiScriptsInBattleFactory(void); diff --git a/src/battle_factory.c b/src/battle_factory.c index 23fa664f33..d88ed37f95 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -720,17 +720,25 @@ static void RestorePlayerPartyHeldItems(void) } } -u8 GetFactoryMonFixedIV(u8 arg0, u8 arg1) +// Get the IV to use for the opponent's pokémon. +// The IVs get higher for each subsequent challenge and for +// the last trainer in each challenge. Noland is an exception +// to this, as he uses the IVs that would be used by the regular +// trainers 2 challenges ahead of the current one. +// Due to a mistake in FillFactoryFrontierTrainerParty, the +// challenge number used to determine the IVs for regular trainers +// is Battle Tower's instead of Battle Factory's. +u8 GetFactoryMonFixedIV(u8 challengeNum, bool8 isLastBattle) { - u8 a1; - u8 a2 = (arg1 != 0) ? 1 : 0; + u8 ivSet; + bool8 useHigherIV = isLastBattle ? TRUE : FALSE; - if (arg0 > 8) - a1 = 7; + if (challengeNum > 8) + ivSet = 7; else - a1 = arg0; + ivSet = challengeNum; - return sFixedIVTable[a1][a2]; + return sFixedIVTable[ivSet][useHigherIV]; } void FillFactoryBrainParty(void) @@ -746,7 +754,7 @@ void FillFactoryBrainParty(void) u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); u8 challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7; - fixedIV = GetFactoryMonFixedIV(challengeNum + 2, 0); + fixedIV = GetFactoryMonFixedIV(challengeNum + 2, FALSE); monLevel = SetFacilityPtrsGetLevel(); i = 0; otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId); diff --git a/src/battle_tower.c b/src/battle_tower.c index b747a3dc0d..989412e9e6 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -1827,13 +1827,18 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId) if (trainerId < FRONTIER_TRAINERS_COUNT) { - u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; // Unused variable. + u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + // By mistake Battle Tower's Level 50 challenge number is used to determine the IVs for Battle Factory. + #ifdef BUGFIX + u8 challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7; + #else u8 challengeNum = gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][FRONTIER_LVL_50] / 7; + #endif if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 6) - fixedIV = GetFactoryMonFixedIV(challengeNum, 0); + fixedIV = GetFactoryMonFixedIV(challengeNum, FALSE); else - fixedIV = GetFactoryMonFixedIV(challengeNum, 1); + fixedIV = GetFactoryMonFixedIV(challengeNum, TRUE); // Last trainer in challenge uses higher IVs } else if (trainerId == TRAINER_EREADER) { From e1f89c70d9c0f1d34fa5d3eb45c6baf0d7a42287 Mon Sep 17 00:00:00 2001 From: Eldred Habert Date: Sat, 2 Apr 2022 00:22:36 +0200 Subject: [PATCH 103/105] Add Arch Linux install instructions I didn't test the devkitARM install instructions, but they are pretty much transcribed from the Ubuntu/Deb ones, so that should be fine. --- INSTALL.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/INSTALL.md b/INSTALL.md index 1f1e1164be..f6434c07be 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -305,6 +305,20 @@ Then proceed to [Choosing where to store pokeemerald (Linux)](#choosing-where-to > then you will have to install devkitARM. Install all the above packages except binutils-arm-none-eabi, and follow the instructions to > [install devkitARM on Debian/Ubuntu-based distributions](#installing-devkitarm-on-debianubuntu-based-distributions). + +### Arch Linux +Run this command as root to install the necessary packages: +```bash +pacman -S base-devel arm-none-eabi-binutils git libpng +``` +Then proceed to [Choosing where to store pokeemerald (Linux)](#choosing-where-to-store-pokeemerald-linux). +
+ Note for legacy repos... + +> If the repository you plan to build has an **[older revision of the INSTALL.md](https://github.com/pret/pokeemerald/blob/571c598/INSTALL.md)**, +> then you will have to install devkitARM. Install all the above packages except binutils-arm-none-eabi, and follow the instructions to +> [install devkitARM on Arch Linux](#installing-devkitarm-on-arch-linux). +
### Other distributions _(Specific instructions for other distributions would be greatly appreciated!)_ @@ -520,6 +534,24 @@ devkitARM is now installed. devkitARM is now installed. +## Installing devkitARM on Arch Linux + +1. Follow [devkitPro's instructions](https://devkitpro.org/wiki/devkitPro_pacman#Customising_Existing_Pacman_Install) to configure `pacman` to download devkitPro packages. +2. Install `gba-dev`: run the following command as root. + + ```console + pacman -S gba-dev + ``` + This will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation. + +3. Run the following command to set devkitPro related environment variables (alternatively, close and re-open the Terminal): + + ```bash + source /etc/profile.d/devkit-env.sh + ``` + +devkitARM is now installed. + ## Other toolchains To build using a toolchain other than devkitARM, override the `TOOLCHAIN` environment variable with the path to your toolchain, which must contain the subdirectory `bin`. From 454068095cef3bf7bad8768d92b5aedd9ce17588 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Mon, 4 Apr 2022 16:59:01 -0400 Subject: [PATCH 104/105] Moved Sky Drop battle string to where other battle strings are --- src/battle_message.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_message.c b/src/battle_message.c index 34b258e63f..b374e3760a 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -427,8 +427,6 @@ static const u8 sText_ExclamationMark4[] = _("!"); static const u8 sText_ExclamationMark5[] = _("!"); static const u8 sText_Accuracy[] = _("accuracy"); static const u8 sText_Evasiveness[] = _("evasiveness"); -static const u8 sText_PkmnTookTargetHigh[] = _("{B_ATK_NAME_WITH_PREFIX} took {B_DEF_NAME_WITH_PREFIX}\ninto the air!"); -static const u8 sText_TargetTooHeavy[] = _("But the target\nwas too heavy!"); const u8 * const gStatNamesTable[NUM_BATTLE_STATS] = { @@ -733,6 +731,8 @@ static const u8 sText_PkmnAboutToBeAttackedByItsItem[] = _("{B_DEF_NAME_WITH_PRE static const u8 sText_CantEscapeBecauseOfCurrentMove[] = _("{B_DEF_NAME_WITH_PREFIX} can no longer escape\nbecause of {B_CURRENT_MOVE}!"); static const u8 sText_NeutralizingGasEnters[] = _("Neutralizing Gas filled the area!"); static const u8 sText_NeutralizingGasOver[] = _("The effects of Neutralizing\nGas wore off!"); +static const u8 sText_PkmnTookTargetHigh[] = _("{B_ATK_NAME_WITH_PREFIX} took {B_DEF_NAME_WITH_PREFIX}\ninto the air!"); +static const u8 sText_TargetTooHeavy[] = _("But the target\nwas too heavy!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { From 8a7e8e9805789b5732b974451545df0894148e78 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Tue, 12 Apr 2022 21:13:48 -0400 Subject: [PATCH 105/105] Apply suggestions from code review --- src/battle_message.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/battle_message.c b/src/battle_message.c index 3c648d32a4..039aca722b 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -895,9 +895,9 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PKMNHURTBY - BATTLESTRINGS_TABLE_START] = sText_PkmnHurtBy, [STRINGID_PKMNFREEDFROM - BATTLESTRINGS_TABLE_START] = sText_PkmnFreedFrom, [STRINGID_PKMNCRASHED - BATTLESTRINGS_TABLE_START] = sText_PkmnCrashed, - [STRINGID_PKMNSHROUDEDINMIST - BATTLESTRINGS_TABLE_START] =gText_PkmnShroudedInMist, + [STRINGID_PKMNSHROUDEDINMIST - BATTLESTRINGS_TABLE_START] = gText_PkmnShroudedInMist, [STRINGID_PKMNPROTECTEDBYMIST - BATTLESTRINGS_TABLE_START] = sText_PkmnProtectedByMist, - [STRINGID_PKMNGETTINGPUMPED - BATTLESTRINGS_TABLE_START] =gText_PkmnGettingPumped, + [STRINGID_PKMNGETTINGPUMPED - BATTLESTRINGS_TABLE_START] = gText_PkmnGettingPumped, [STRINGID_PKMNHITWITHRECOIL - BATTLESTRINGS_TABLE_START] = sText_PkmnHitWithRecoil, [STRINGID_PKMNPROTECTEDITSELF2 - BATTLESTRINGS_TABLE_START] = sText_PkmnProtectedItself2, [STRINGID_PKMNBUFFETEDBYSANDSTORM - BATTLESTRINGS_TABLE_START] = sText_PkmnBuffetedBySandstorm, @@ -1007,12 +1007,12 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PKMNPREVENTSSTATLOSSWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnPreventsStatLossWith, [STRINGID_PKMNHURTSWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnHurtsWith, [STRINGID_PKMNTRACED - BATTLESTRINGS_TABLE_START] = sText_PkmnTraced, - [STRINGID_STATSHARPLY - BATTLESTRINGS_TABLE_START] =gText_StatSharply, - [STRINGID_STATROSE - BATTLESTRINGS_TABLE_START] =gText_StatRose, + [STRINGID_STATSHARPLY - BATTLESTRINGS_TABLE_START] = gText_StatSharply, + [STRINGID_STATROSE - BATTLESTRINGS_TABLE_START] = gText_StatRose, [STRINGID_STATHARSHLY - BATTLESTRINGS_TABLE_START] = sText_StatHarshly, [STRINGID_STATFELL - BATTLESTRINGS_TABLE_START] = sText_StatFell, [STRINGID_ATTACKERSSTATROSE - BATTLESTRINGS_TABLE_START] = sText_AttackersStatRose, - [STRINGID_DEFENDERSSTATROSE - BATTLESTRINGS_TABLE_START] =gText_DefendersStatRose, + [STRINGID_DEFENDERSSTATROSE - BATTLESTRINGS_TABLE_START] = gText_DefendersStatRose, [STRINGID_ATTACKERSSTATFELL - BATTLESTRINGS_TABLE_START] = sText_AttackersStatFell, [STRINGID_DEFENDERSSTATFELL - BATTLESTRINGS_TABLE_START] = sText_DefendersStatFell, [STRINGID_CRITICALHIT - BATTLESTRINGS_TABLE_START] = sText_CriticalHit, @@ -1102,7 +1102,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PKMNSITEMRESTOREDHPALITTLE - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemRestoredHPALittle, [STRINGID_ITEMALLOWSONLYYMOVE - BATTLESTRINGS_TABLE_START] = sText_ItemAllowsOnlyYMove, [STRINGID_PKMNHUNGONWITHX - BATTLESTRINGS_TABLE_START] = sText_PkmnHungOnWithX, - [STRINGID_EMPTYSTRING3 - BATTLESTRINGS_TABLE_START] =gText_EmptyString3, + [STRINGID_EMPTYSTRING3 - BATTLESTRINGS_TABLE_START] = gText_EmptyString3, [STRINGID_PKMNSXPREVENTSBURNS - BATTLESTRINGS_TABLE_START] = sText_PkmnsXPreventsBurns, [STRINGID_PKMNSXBLOCKSY - BATTLESTRINGS_TABLE_START] = sText_PkmnsXBlocksY, [STRINGID_PKMNSXRESTOREDHPALITTLE2 - BATTLESTRINGS_TABLE_START] = sText_PkmnsXRestoredHPALittle2, @@ -1173,10 +1173,10 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_TIEDOPPONENTBYREFEREE - BATTLESTRINGS_TABLE_START] = sText_TiedOpponentByReferee, [STRINGID_QUESTIONFORFEITMATCH - BATTLESTRINGS_TABLE_START] = sText_QuestionForfeitMatch, [STRINGID_FORFEITEDMATCH - BATTLESTRINGS_TABLE_START] = sText_ForfeitedMatch, - [STRINGID_PKMNTRANSFERREDSOMEONESPC - BATTLESTRINGS_TABLE_START] =gText_PkmnTransferredSomeonesPC, - [STRINGID_PKMNTRANSFERREDLANETTESPC - BATTLESTRINGS_TABLE_START] =gText_PkmnTransferredLanettesPC, - [STRINGID_PKMNBOXSOMEONESPCFULL - BATTLESTRINGS_TABLE_START] =gText_PkmnTransferredSomeonesPCBoxFull, - [STRINGID_PKMNBOXLANETTESPCFULL - BATTLESTRINGS_TABLE_START] =gText_PkmnTransferredLanettesPCBoxFull, + [STRINGID_PKMNTRANSFERREDSOMEONESPC - BATTLESTRINGS_TABLE_START] = gText_PkmnTransferredSomeonesPC, + [STRINGID_PKMNTRANSFERREDLANETTESPC - BATTLESTRINGS_TABLE_START] = gText_PkmnTransferredLanettesPC, + [STRINGID_PKMNBOXSOMEONESPCFULL - BATTLESTRINGS_TABLE_START] = gText_PkmnTransferredSomeonesPCBoxFull, + [STRINGID_PKMNBOXLANETTESPCFULL - BATTLESTRINGS_TABLE_START] = gText_PkmnTransferredLanettesPCBoxFull, [STRINGID_TRAINER1WINTEXT - BATTLESTRINGS_TABLE_START] = sText_Trainer1WinText, [STRINGID_TRAINER2WINTEXT - BATTLESTRINGS_TABLE_START] = sText_Trainer2WinText, [STRINGID_ENDUREDSTURDY - BATTLESTRINGS_TABLE_START] = sText_EnduredViaSturdy,