handle rototiller + prankster

This commit is contained in:
ghoulslash 2021-10-10 19:54:17 -04:00
parent 4aeadd96c9
commit fcada4fcad
4 changed files with 26 additions and 24 deletions

View File

@ -942,10 +942,6 @@ BattleScript_FlowerShieldMoveTargetEnd:
jumpifnexttargetvalid BattleScript_FlowerShieldLoop jumpifnexttargetvalid BattleScript_FlowerShieldLoop
end end
BattleScript_RototillerRet::
return
BattleScript_EffectRototiller: BattleScript_EffectRototiller:
attackcanceler attackcanceler
attackstring attackstring

View File

@ -152,7 +152,7 @@ bool32 CompareStat(u8 battlerId, u8 statId, u8 cmpTo, u8 cmpKind);
bool32 TryRoomService(u8 battlerId); bool32 TryRoomService(u8 battlerId);
void BufferStatChange(u8 battlerId, u8 statId, u8 stringId); void BufferStatChange(u8 battlerId, u8 statId, u8 stringId);
void DoBurmyFormChange(u32 monId); void DoBurmyFormChange(u32 monId);
bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef); bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef, bool32 checkTarget);
// ability checks // ability checks
bool32 IsRolePlayBannedAbilityAtk(u16 ability); bool32 IsRolePlayBannedAbilityAtk(u16 ability);

View File

@ -1416,7 +1416,7 @@ static void Cmd_attackcanceler(void)
gProtectStructs[gBattlerTarget].bounceMove = 0; gProtectStructs[gBattlerTarget].bounceMove = 0;
gProtectStructs[gBattlerTarget].usesBouncedMove = 1; gProtectStructs[gBattlerTarget].usesBouncedMove = 1;
gBattleCommunication[MULTISTRING_CHOOSER] = 0; gBattleCommunication[MULTISTRING_CHOOSER] = 0;
if (BlocksPrankster(gCurrentMove, gBattlerTarget, gBattlerAttacker)) if (BlocksPrankster(gCurrentMove, gBattlerTarget, gBattlerAttacker, TRUE))
{ {
// Opponent used a prankster'd magic coat -> reflected status move should fail against a dark-type attacker // Opponent used a prankster'd magic coat -> reflected status move should fail against a dark-type attacker
gBattlerTarget = gBattlerAttacker; gBattlerTarget = gBattlerAttacker;
@ -7345,8 +7345,8 @@ static bool32 IsRototillerAffected(u32 battlerId)
return FALSE; // Only grass types affected return FALSE; // Only grass types affected
if (gStatuses3[battlerId] & STATUS3_SEMI_INVULNERABLE) if (gStatuses3[battlerId] & STATUS3_SEMI_INVULNERABLE)
return FALSE; // Rototiller doesn't affected semi-invulnerable battlers return FALSE; // Rototiller doesn't affected semi-invulnerable battlers
//if (!CompareStat(battlerId, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN) && !CompareStat(battlerId, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)) if (BlocksPrankster(MOVE_ROTOTILLER, gBattlerAttacker, battlerId, FALSE))
//return FALSE; // Battler unaffected if atk and spatk are maxed return FALSE;
return TRUE; return TRUE;
} }
@ -8757,21 +8757,22 @@ static void Cmd_various(void)
} }
gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; // remove the terrain gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; // remove the terrain
break; break;
case VARIOUS_JUMP_IF_PRANKSTER_BLOCKED: case VARIOUS_JUMP_IF_PRANKSTER_BLOCKED:
if (BlocksPrankster(gCurrentMove, gBattlerAttacker, gActiveBattler)) if (BlocksPrankster(gCurrentMove, gBattlerAttacker, gActiveBattler, TRUE))
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
else else
gBattlescriptCurrInstr += 7; gBattlescriptCurrInstr += 7;
return; return;
case VARIOUS_GET_ROTOTILLER_TARGETS: case VARIOUS_GET_ROTOTILLER_TARGETS:
// Gets the battlers to be affected by rototiller. If there are none, print 'But it failed!' // Gets the battlers to be affected by rototiller. If there are none, print 'But it failed!'
{ {
u32 count = 0; u32 count = 0;
for (i = 0; i < gBattlersCount; i++) for (i = 0; i < gBattlersCount; i++)
{ {
gSpecialStatuses[i].rototillerAffected = FALSE;
if (IsRototillerAffected(i)) if (IsRototillerAffected(i))
{ {
gSpecialStatuses[i].rototillerAffected = 1; gSpecialStatuses[i].rototillerAffected = TRUE;
count++; count++;
} }
} }
@ -8785,7 +8786,7 @@ static void Cmd_various(void)
case VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED: case VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED:
if (gSpecialStatuses[gActiveBattler].rototillerAffected) if (gSpecialStatuses[gActiveBattler].rototillerAffected)
{ {
gSpecialStatuses[gActiveBattler].rototillerAffected = 0; gSpecialStatuses[gActiveBattler].rototillerAffected = FALSE;
gBattlescriptCurrInstr += 7; gBattlescriptCurrInstr += 7;
} }
else else
@ -10954,7 +10955,7 @@ static void Cmd_trysetperishsong(void)
{ {
if (gStatuses3[i] & STATUS3_PERISH_SONG if (gStatuses3[i] & STATUS3_PERISH_SONG
|| GetBattlerAbility(i) == ABILITY_SOUNDPROOF || GetBattlerAbility(i) == ABILITY_SOUNDPROOF
|| BlocksPrankster(gCurrentMove, gBattlerAttacker, i)) || BlocksPrankster(gCurrentMove, gBattlerAttacker, i, TRUE))
{ {
notAffectedCount++; notAffectedCount++;
} }

View File

@ -3421,7 +3421,7 @@ u8 AtkCanceller_UnableToUseMove(void)
gBattleStruct->atkCancellerTracker++; gBattleStruct->atkCancellerTracker++;
break; break;
case CANCELLER_PRANKSTER: case CANCELLER_PRANKSTER:
if (BlocksPrankster(gCurrentMove, gBattlerAttacker, gBattlerTarget) if (BlocksPrankster(gCurrentMove, gBattlerAttacker, gBattlerTarget, TRUE)
&& !(IS_MOVE_STATUS(gCurrentMove) && GetBattlerAbility(gBattlerTarget) == ABILITY_MAGIC_BOUNCE)) && !(IS_MOVE_STATUS(gCurrentMove) && GetBattlerAbility(gBattlerTarget) == ABILITY_MAGIC_BOUNCE))
{ {
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE) || !(gBattleMoves[gCurrentMove].target & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE) || !(gBattleMoves[gCurrentMove].target & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY)))
@ -9344,16 +9344,21 @@ void DoBurmyFormChange(u32 monId)
} }
} }
bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef) bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef, bool32 checkTarget)
{ {
#if B_PRANKSTER_DARK_TYPES >= GEN_7 #if B_PRANKSTER_DARK_TYPES >= GEN_7
if (gProtectStructs[battlerPrankster].pranksterElevated if (!gProtectStructs[battlerPrankster].pranksterElevated)
&& GetBattlerSide(battlerPrankster) != GetBattlerSide(battlerDef)
&& !(gBattleMoves[gCurrentMove].target & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_DEPENDS)) // Don't block hazards, assist-type moves
&& IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK) // Only Dark-types can block Prankster'd
&& !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE))
return TRUE;
else
#endif
return FALSE; return FALSE;
if (GetBattlerSide(battlerPrankster) == GetBattlerSide(battlerDef))
return FALSE;
if (checkTarget && (gBattleMoves[move].target & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_DEPENDS)))
return FALSE;
if (!IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK))
return FALSE;
if (gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)
return FALSE;
return TRUE;
#endif
return FALSE;
} }