diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index e79afe0cd..9dac5beff 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -560,7 +560,7 @@ .macro setgravity ptr .byte 0x69 - .word \ptr + .4byte \ptr .endm .macro removeitem bank @@ -864,7 +864,7 @@ .macro settailwind ptr .byte 0xac - .word \ptr + .4byte \ptr .endm .macro tryspiteppreduce param0 @@ -911,7 +911,7 @@ .macro setembargo ptr .byte 0xb6 - .word \ptr + .4byte \ptr .endm .macro presentdamagecalculation @@ -1051,14 +1051,14 @@ .4byte \param1 .endm - .macro trysetroots param0 + .macro settoxicspikes ptr .byte 0xd5 - .4byte \param0 + .4byte \ptr .endm - .macro setaquaring ptr + .macro setgastroacid ptr .byte 0xd6 - .word \ptr + .4byte \ptr .endm .macro setyawn param0 @@ -1071,7 +1071,7 @@ .4byte \param0 .endm - .macro nop_D9 + .macro setroom .byte 0xd9 .endm @@ -1085,13 +1085,15 @@ .4byte \param0 .endm - .macro trysetgrudge param0 + .macro setstealthrock param0 .byte 0xdc .4byte \param0 .endm - .macro nop_DD + .macro setuserstatus3 flags ptr .byte 0xdd + .4byte \flags + .4byte \ptr .endm .macro asistattackselect param0 @@ -1216,6 +1218,11 @@ .byte \param0 .endm + .macro settelekinesis ptr + .byte 0xf9 + .4byte \ptr + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves bank various \bank, VARIOUS_CANCEL_MULTI_TURN_MOVES diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 669e27f8f..3feef4056 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -237,7 +237,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectAssurance .4byte BattleScript_EffectTrump_card .4byte BattleScript_EffectAcrobatics - .4byte BattleScript_EffectHeat_crash + .4byte BattleScript_EffectHeatCrash .4byte BattleScript_EffectPunishment .4byte BattleScript_EffectStoredPower .4byte BattleScript_EffectElectroBall @@ -257,12 +257,90 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectTailwind .4byte BattleScript_EffectEmbargo .4byte BattleScript_EffectAquaRing + .4byte BattleScript_EffectTrickRoom + .4byte BattleScript_EffectWonderRoom + .4byte BattleScript_EffectMagicRoom + .4byte BattleScript_EffectMagnetRise + .4byte BattleScript_EffectToxicSpikes + .4byte BattleScript_EffectGastroAcid + .4byte BattleScript_EffectStealthRock + .4byte BattleScript_EffectTelekinesis + +BattleScript_EffectTelekinesis: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON + attackstring + ppreduce + settelekinesis BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_PKMNIDENTIFIED + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectStealthRock: + attackcanceler + attackstring + ppreduce + setstealthrock STRINGID_POINTEDSTONESFLOAT + attackanimation + waitanimation + printstring STRINGID_POISONSPIKESSCATTERED + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectGastroAcid: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + setgastroacid BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_PKMNSABILITYSUPPRESSED + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectToxicSpikes: + attackcanceler + attackstring + ppreduce + settoxicspikes BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_POISONSPIKESSCATTERED + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectMagnetRise: + attackcanceler + attackstring + ppreduce + setuserstatus3 STATUS3_MAGNET_RISE BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_PKMNLEVITATEDONELECTROMAGNETISM + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectTrickRoom: +BattleScript_EffectWonderRoom: +BattleScript_EffectMagicRoom: + attackcanceler + attackstring + ppreduce + setroom + attackanimation + waitanimation + printfromtable gRoomsStringIds + waitmessage 0x40 + goto BattleScript_MoveEnd BattleScript_EffectAquaRing: attackcanceler attackstring ppreduce - setaquaring BattleScript_ButItFailed + setuserstatus3 STATUS3_AQUA_RING BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNSURROUNDEDWITHVEILOFWATER @@ -319,18 +397,8 @@ BattleScript_EffectRoost: setroost goto BattleScript_PresentHealTarget -BattleScript_EffectSpeedUp: -BattleScript_EffectSpecialDefenseUp: -BattleScript_EffectAccuracyUp: BattleScript_EffectAlwaysHit: -BattleScript_EffectSpecialAttackDown: -BattleScript_EffectSpecialDefenseDown: BattleScript_EffectPlaceholder43: -BattleScript_EffectAccuracyUp2: -BattleScript_EffectEvasionUp2: -BattleScript_EffectSpecialAttackDown2: -BattleScript_EffectAccuracyDown2: -BattleScript_EffectEvasionDown2: BattleScript_EffectEvasionDownHit: BattleScript_EffectVitalThrow: BattleScript_EffectUnused60: @@ -360,7 +428,7 @@ BattleScript_EffectHex: BattleScript_EffectAssurance: BattleScript_EffectTrump_card: BattleScript_EffectAcrobatics: -BattleScript_EffectHeat_crash: +BattleScript_EffectHeatCrash: BattleScript_EffectPunishment: BattleScript_EffectStoredPower: BattleScript_EffectElectroBall: @@ -621,6 +689,18 @@ BattleScript_EffectDefenseUp:: BattleScript_EffectSpecialAttackUp:: setstatchanger STAT_SPATK, 1, FALSE goto BattleScript_EffectStatUp + +BattleScript_EffectSpeedUp: + setstatchanger STAT_SPEED, 1, FALSE + goto BattleScript_EffectStatUp + +BattleScript_EffectSpecialDefenseUp: + setstatchanger STAT_SPDEF, 1, FALSE + goto BattleScript_EffectStatUp + +BattleScript_EffectAccuracyUp: + setstatchanger STAT_ACC, 1, FALSE + goto BattleScript_EffectStatUp BattleScript_EffectEvasionUp:: setstatchanger STAT_EVASION, 1, FALSE @@ -651,25 +731,33 @@ BattleScript_StatUp:: waitmessage 0x40 return -BattleScript_EffectAttackDown:: +BattleScript_EffectAttackDown: setstatchanger STAT_ATK, 1, TRUE goto BattleScript_EffectStatDown -BattleScript_EffectDefenseDown:: +BattleScript_EffectDefenseDown: setstatchanger STAT_DEF, 1, TRUE goto BattleScript_EffectStatDown -BattleScript_EffectSpeedDown:: +BattleScript_EffectSpeedDown: setstatchanger STAT_SPEED, 1, TRUE goto BattleScript_EffectStatDown -BattleScript_EffectAccuracyDown:: +BattleScript_EffectAccuracyDown: setstatchanger STAT_ACC, 1, TRUE goto BattleScript_EffectStatDown + +BattleScript_EffectSpecialAttackDown: + setstatchanger STAT_SPATK, 1, TRUE + goto BattleScript_EffectStatDown -BattleScript_EffectEvasionDown:: +BattleScript_EffectSpecialDefenseDown: + setstatchanger STAT_SPDEF, 1, TRUE + goto BattleScript_EffectStatDown + +BattleScript_EffectEvasionDown: setstatchanger STAT_EVASION, 1, TRUE -BattleScript_EffectStatDown:: +BattleScript_EffectStatDown: attackcanceler jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailedAtkStringPpReduce accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -1083,6 +1171,14 @@ BattleScript_EffectSpecialAttackUp2:: BattleScript_EffectSpecialDefenseUp2:: setstatchanger STAT_SPDEF, 2, FALSE goto BattleScript_EffectStatUp + +BattleScript_EffectAccuracyUp2: + setstatchanger STAT_ACC, 2, FALSE + goto BattleScript_EffectStatUp + +BattleScript_EffectEvasionUp2: + setstatchanger STAT_EVASION, 2, FALSE + goto BattleScript_EffectStatUp BattleScript_EffectTransform:: attackcanceler @@ -1095,21 +1191,33 @@ BattleScript_EffectTransform:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectAttackDown2:: +BattleScript_EffectAttackDown2: setstatchanger STAT_ATK, 2, TRUE goto BattleScript_EffectStatDown -BattleScript_EffectDefenseDown2:: +BattleScript_EffectDefenseDown2: setstatchanger STAT_DEF, 2, TRUE goto BattleScript_EffectStatDown -BattleScript_EffectSpeedDown2:: +BattleScript_EffectSpeedDown2: setstatchanger STAT_SPEED, 2, TRUE goto BattleScript_EffectStatDown -BattleScript_EffectSpecialDefenseDown2:: +BattleScript_EffectSpecialDefenseDown2: setstatchanger STAT_SPDEF, 2, TRUE goto BattleScript_EffectStatDown + +BattleScript_EffectSpecialAttackDown2: + setstatchanger STAT_SPATK, 2, TRUE + goto BattleScript_EffectStatDown + +BattleScript_EffectAccuracyDown2: + setstatchanger STAT_ACC, 2, TRUE + goto BattleScript_EffectStatDown + +BattleScript_EffectEvasionDown2: + setstatchanger STAT_EVASION, 2, TRUE + goto BattleScript_EffectStatDown BattleScript_EffectReflect:: attackcanceler @@ -2471,7 +2579,7 @@ BattleScript_EffectWish:: waitanimation goto BattleScript_MoveEnd -BattleScript_EffectAssist:: +BattleScript_EffectAssist: attackcanceler attackstring asistattackselect BattleScript_ButItFailedPpReduce @@ -2481,22 +2589,22 @@ BattleScript_EffectAssist:: setbyte sB_ANIM_TARGETS_HIT, 0x0 jumptorandomattack TRUE -BattleScript_EffectIngrain:: +BattleScript_EffectIngrain: attackcanceler attackstring ppreduce - trysetroots BattleScript_ButItFailed + setuserstatus3 STATUS3_ROOTED BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNPLANTEDROOTS waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectSuperpower:: +BattleScript_EffectSuperpower: setmoveeffect MOVE_EFFECT_ATK_DEF_DOWN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit -BattleScript_EffectMagicCoat:: +BattleScript_EffectMagicCoat: attackcanceler trysetmagiccoat BattleScript_ButItFailedAtkStringPpReduce attackstring @@ -2615,7 +2723,7 @@ BattleScript_EffectImprison:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectRefresh:: +BattleScript_EffectRefresh: attackcanceler attackstring ppreduce @@ -2627,18 +2735,18 @@ BattleScript_EffectRefresh:: updatestatusicon BS_ATTACKER goto BattleScript_MoveEnd -BattleScript_EffectGrudge:: +BattleScript_EffectGrudge: attackcanceler attackstring ppreduce - trysetgrudge BattleScript_ButItFailed + setuserstatus3 STATUS3_GRUDGE BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNWANTSGRUDGE waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectSnatch:: +BattleScript_EffectSnatch: attackcanceler trysetsnatch BattleScript_ButItFailedAtkStringPpReduce attackstring diff --git a/include/battle.h b/include/battle.h index c534d6745..1753c9a3e 100644 --- a/include/battle.h +++ b/include/battle.h @@ -253,8 +253,6 @@ struct SideTimer /*0x09*/ u8 followmeTarget; /*0x0A*/ u8 spikesAmount; u8 toxicSpikesAmount; - bool8 stealthRock; - bool8 stickyWeb; u8 auroraVeilTimer; u8 auroraVeilBattlerId; u8 tailwindTimer; diff --git a/include/constants/battle.h b/include/constants/battle.h index 7b0b00356..74544ddc4 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -198,6 +198,8 @@ #define SIDE_STATUS_TAILWIND (1 << 10) #define SIDE_STATUS_AURORA_VEIL (1 << 11) #define SIDE_STATUS_LUCKY_CHANT (1 << 12) +#define SIDE_STATUS_TOXIC_SPIKES (1 << 13) +#define SIDE_STATUS_STEALTH_ROCK (1 << 14) // Field affecting statuses. #define STATUS_FIELD_MAGIC_ROOM 0x1 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index d1fbe4079..72b569e62 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -22,8 +22,8 @@ #define EFFECT_ATTACK_DOWN 18 #define EFFECT_DEFENSE_DOWN 19 #define EFFECT_SPEED_DOWN 20 -#define EFFECT_SPECIAL_ATTACK_DOWN 21 // unused -#define EFFECT_SPECIAL_DEFENSE_DOWN 22 // unused +#define EFFECT_SPECIAL_ATTACK_DOWN 21 +#define EFFECT_SPECIAL_DEFENSE_DOWN 22 #define EFFECT_ACCURACY_DOWN 23 #define EFFECT_EVASION_DOWN 24 #define EFFECT_HAZE 25 @@ -142,7 +142,7 @@ #define EFFECT_DEFENSE_UP_HIT 138 #define EFFECT_ATTACK_UP_HIT 139 #define EFFECT_ALL_STATS_UP_HIT 140 -#define EFFECT_UNUSED_8D 141 // incomplete fake out in gen 2 +#define EFFECT_UNUSED_8D 141 #define EFFECT_BELLY_DRUM 142 #define EFFECT_PSYCH_UP 143 #define EFFECT_MIRROR_COAT 144 @@ -151,7 +151,7 @@ #define EFFECT_EARTHQUAKE 147 #define EFFECT_FUTURE_SIGHT 148 #define EFFECT_GUST 149 -#define EFFECT_FLINCH_MINIMIZE_HIT 150 // STOMP ASTONISH EXTRASENSORY NEEDLE_ARM +#define EFFECT_FLINCH_MINIMIZE_HIT 150 #define EFFECT_SOLARBEAM 151 #define EFFECT_THUNDER 152 #define EFFECT_TELEPORT 153 @@ -246,5 +246,13 @@ #define EFFECT_TAILWIND 240 #define EFFECT_EMBARGO 241 #define EFFECT_AQUA_RING 242 +#define EFFECT_TRICK_TOOM 243 +#define EFFECT_WONDER_ROOM 244 +#define EFFECT_MAGIC_ROOM 245 +#define EFFECT_MAGNET_RISE 246 +#define EFFECT_TOXIC_SPIKES 247 +#define EFFECT_GASTRO_ACID 248 +#define EFFECT_STEALTH_ROCK 249 +#define EFFECT_TELEKINESIS 250 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/battle_message.c b/src/battle_message.c index d5e78aff1..cd6cb8335 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -1304,6 +1304,14 @@ const u16 gTrappingMoves[] = MOVE_BIND, MOVE_WRAP, MOVE_FIRE_SPIN, MOVE_CLAMP, MOVE_WHIRLPOOL, MOVE_SAND_TOMB, 0xFFFF }; +const u16 gRoomsStringIds[] = +{ + STRINGID_PKMNTWISTEDDIMENSIONS, STRINGID_TRICKROOMENDS, + STRINGID_SWAPSDEFANDSPDEFOFALLPOKEMON, STRINGID_WONDERROOMENDS, + STRINGID_HELDITEMSLOSEEFFECTS, STRINGID_MAGICROOMENDS, + STRINGID_EMPTYSTRING3 +}; + const u8 gText_PkmnIsEvolving[] = _("What?\n{STR_VAR_1} is evolving!"); const u8 gText_CongratsPkmnEvolved[] = _("Congratulations! Your {STR_VAR_1}\nevolved into {STR_VAR_2}!{UNKNOWN_A}\p"); const u8 gText_PkmnStoppedEvolving[] = _("Huh? {STR_VAR_1}\nstopped evolving!\p"); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a798600fb..339b571f2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -304,15 +304,15 @@ static void atkD1_trysethelpinghand(void); static void atkD2_tryswapitems(void); static void atkD3_trycopyability(void); static void atkD4_trywish(void); -static void atkD5_trysetroots(void); -static void atkD6_setaquaring(void); +static void atkD5_settoxicspikes(void); +static void atkD6_setgastroacid(void); static void atkD7_setyawn(void); static void atkD8_setdamagetohealthdifference(void); -static void atkD9_nop(void); +static void atkD9_setroom(void); static void atkDA_tryswapabilities(void); static void atkDB_tryimprision(void); -static void atkDC_trysetgrudge(void); -static void atkDD_nop(void); +static void atkDC_setstealthrock(void); +static void atkDD_setuserstatus3(void); static void atkDE_asistattackselect(void); static void atkDF_trysetmagiccoat(void); static void atkE0_trysetsnatch(void); @@ -340,6 +340,7 @@ static void atkF5_removeattackerstatus1(void); static void atkF6_finishaction(void); static void atkF7_finishturn(void); static void atkF8_trainerslideout(void); +static void atkF9_settelekinesis(void); void (* const gBattleScriptingCommandsTable[])(void) = { @@ -556,15 +557,15 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkD2_tryswapitems, atkD3_trycopyability, atkD4_trywish, - atkD5_trysetroots, - atkD6_setaquaring, + atkD5_settoxicspikes, + atkD6_setgastroacid, atkD7_setyawn, atkD8_setdamagetohealthdifference, - atkD9_nop, + atkD9_setroom, atkDA_tryswapabilities, atkDB_tryimprision, - atkDC_trysetgrudge, - atkDD_nop, + atkDC_setstealthrock, + atkDD_setuserstatus3, atkDE_asistattackselect, atkDF_trysetmagiccoat, atkE0_trysetsnatch, @@ -591,7 +592,8 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkF5_removeattackerstatus1, atkF6_finishaction, atkF7_finishturn, - atkF8_trainerslideout + atkF8_trainerslideout, + atkF9_settelekinesis, }; struct StatFractions @@ -9206,29 +9208,40 @@ static void atkD4_trywish(void) } } -static void atkD5_trysetroots(void) // ingrain +static void atkD5_settoxicspikes(void) { - if (gStatuses3[gBattlerAttacker] & STATUS3_ROOTED) + u8 targetSide = GetBattlerSide(gBattlerTarget); + if (gSideTimers[targetSide].toxicSpikesAmount >= 2) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { - gStatuses3[gBattlerAttacker] |= STATUS3_ROOTED; + gSideTimers[targetSide].toxicSpikesAmount++; + gSideStatuses[targetSide] |= SIDE_STATUS_TOXIC_SPIKES; gBattlescriptCurrInstr += 5; } } -static void atkD6_setaquaring(void) +static void atkD6_setgastroacid(void) { - if (gStatuses3[gBattlerAttacker] & STATUS3_AQUA_RING) + switch (gBattleMons[gBattlerTarget].ability) { + case ABILITY_MULTITYPE: + case ABILITY_STANCE_CHANGE: + case ABILITY_SCHOOLING: + case ABILITY_COMATOSE: + case ABILITY_SHIELDS_DOWN: + case ABILITY_DISGUISE: + case ABILITY_RKS_SYSTEM: + case ABILITY_BATTLE_BOND: + case ABILITY_POWER_CONSTRUCT: gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - gStatuses3[gBattlerAttacker] |= STATUS3_AQUA_RING; + break; + default: + gStatuses3[gBattlerTarget] |= STATUS3_GASTRO_ACID; gBattlescriptCurrInstr += 5; + break; } } @@ -9259,8 +9272,39 @@ static void atkD8_setdamagetohealthdifference(void) } } -static void atkD9_nop(void) +static void HandleRoomMove(u32 statusFlag, u8 *timer, u8 stringId) { + if (gFieldStatuses & statusFlag) + { + gFieldStatuses &= ~(statusFlag); + *timer = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = stringId + 1; + } + else + { + gFieldStatuses |= statusFlag; + *timer = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = stringId; + } +} + +static void atkD9_setroom(void) +{ + switch (gCurrentMove) + { + case MOVE_TRICK_ROOM: + HandleRoomMove(STATUS_FIELD_TRICK_ROOM, &gFieldTimers.trickRoomTimer, 0); + break; + case MOVE_WONDER_ROOM: + HandleRoomMove(STATUS_FIELD_WONDER_ROOM, &gFieldTimers.wonderRoomTimer, 2); + break; + case MOVE_MAGIC_ROOM: + HandleRoomMove(STATUS_FIELD_MAGIC_ROOM, &gFieldTimers.magicRoomTimer, 4); + break; + default: + gBattleCommunication[MULTISTRING_CHOOSER] = 6; + break; + } gBattlescriptCurrInstr++; } @@ -9280,7 +9324,7 @@ static void atkDA_tryswapabilities(void) // skill swap gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability; gBattleMons[gBattlerTarget].ability = abilityAtk; - gBattlescriptCurrInstr += 5; + gBattlescriptCurrInstr += 5; } } @@ -9321,27 +9365,38 @@ static void atkDB_tryimprision(void) } } } - if (battlerId == gBattlersCount) // In Generation 3 games, Imprison fails if the user doesn't share any moves with any of the foes + if (battlerId == gBattlersCount) // In Generation 3 games, Imprison fails if the user doesn't share any moves with any of the foes. gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } -static void atkDC_trysetgrudge(void) +static void atkDC_setstealthrock(void) { - if (gStatuses3[gBattlerAttacker] & STATUS3_GRUDGE) + u8 targetSide = GetBattlerSide(gBattlerTarget); + if (gSideStatuses[targetSide] & SIDE_STATUS_STEALTH_ROCK) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { - gStatuses3[gBattlerAttacker] |= STATUS3_GRUDGE; + gSideStatuses[targetSide] |= SIDE_STATUS_STEALTH_ROCK; gBattlescriptCurrInstr += 5; } } -static void atkDD_nop(void) +static void atkDD_setuserstatus3(void) { - gBattlescriptCurrInstr++; + u32 flags = T1_READ_32(gBattlescriptCurrInstr + 1); + + if (gStatuses3[gBattlerAttacker] & flags) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5); + } + else + { + gStatuses3[gBattlerAttacker] |= flags; + gBattlescriptCurrInstr += 9; + } } static void atkDE_asistattackselect(void) @@ -9356,7 +9411,7 @@ static void atkDE_asistattackselect(void) else party = gPlayerParty; - for (monId = 0; monId < 6; monId++) + for (monId = 0; monId < PARTY_SIZE; monId++) { if (monId == gBattlerPartyIndexes[gBattlerAttacker]) continue; @@ -10176,3 +10231,19 @@ static void atkF8_trainerslideout(void) gBattlescriptCurrInstr += 2; } + +static void atkF9_settelekinesis(void) +{ + if (gStatuses3[gBattlerTarget] & (STATUS3_TELEKINESIS | STATUS3_ROOTED | STATUS3_SMACKED_DOWN) + || gFieldStatuses & STATUS_FIELD_GRAVITY + || (gBattleMons[gBattlerTarget].species == SPECIES_DIGLETT || gBattleMons[gBattlerTarget].species == SPECIES_DUGTRIO)) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } + else + { + gStatuses3[gBattlerTarget] |= STATUS3_TELEKINESIS; + gDisableStructs[gBattlerTarget].telekinesisTimer = 3; + gBattlescriptCurrInstr += 5; + } +}