Corrosion (#306)

* Status move poisoning for Steel and Poison types.

* Can poison itself with Toxic Orb.

* Secondary effect poisoning now working.

* Created a function that checks if abilities can bypass type immunities.

* Created macro to handle typeimmunity

* Applied review changes.

* Applied review requests.

* Left more readable version of HOLD_EFFECT_TOXIC_ORB.
This commit is contained in:
Eduardo Alvaro Quezada D'Ottone 2020-04-21 09:59:19 -04:00 committed by GitHub
parent a80150f890
commit c5a6acc7db
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 29 additions and 11 deletions

View File

@ -1713,6 +1713,12 @@
various \battler, VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED
.4byte \ptr
.endm
.macro trypoisontype attacker:req, target:req, ptr:req
various \attacker, VARIOUS_HANDLE_TYPE_IMMUNITY
.byte \target
.4byte \ptr
.endm
.macro trysetfairylock ptr:req
various BS_ATTACKER, VARIOUS_TRY_FAIRY_LOCK

View File

@ -2650,8 +2650,7 @@ BattleScript_EffectToxic::
jumpifsubstituteblocks BattleScript_ButItFailed
jumpifstatus BS_TARGET, STATUS1_POISON | STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned
jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed
jumpiftype BS_TARGET, TYPE_POISON, BattleScript_NotAffected
jumpiftype BS_TARGET, TYPE_STEEL, BattleScript_NotAffected
trypoisontype BS_ATTACKER, BS_TARGET, BattleScript_NotAffected
accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE
jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected
attackanimation
@ -2971,8 +2970,7 @@ BattleScript_EffectPoison::
jumpifsubstituteblocks BattleScript_ButItFailed
jumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned
jumpifstatus BS_TARGET, STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned
jumpiftype BS_TARGET, TYPE_POISON, BattleScript_NotAffected
jumpiftype BS_TARGET, TYPE_STEEL, BattleScript_NotAffected
trypoisontype BS_ATTACKER, BS_TARGET, BattleScript_NotAffected
jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed
accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE
jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected

View File

@ -17,6 +17,7 @@ void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags);
bool8 UproarWakeUpCheck(u8 battlerId);
bool32 DoesSubstituteBlockMove(u8 battlerAtk, u8 battlerDef, u32 move);
bool32 DoesDisguiseBlockMove(u8 battlerAtk, u8 battlerDef, u32 move);
bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget);
bool32 CanUseLastResort(u8 battlerId);
u32 IsFlowerVeilProtected(u32 battler);
u32 IsLeafGuardProtected(u32 battler);

View File

@ -1,6 +1,7 @@
#ifndef GUARD_BATTLE_SCRIPTS_H
#define GUARD_BATTLE_SCRIPTS_H
extern const u8 BattleScript_NotAffected[];
extern const u8 BattleScript_HitFromCritCalc[];
extern const u8 BattleScript_MoveEnd[];
extern const u8 BattleScript_MakeMoveMissed[];

View File

@ -156,6 +156,7 @@
#define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 93
#define VARIOUS_TRY_FAIRY_LOCK 94
#define VARIOUS_JUMP_IF_NO_ALLY 95
#define VARIOUS_HANDLE_TYPE_IMMUNITY 96
// Cmd_manipulatedamage
#define DMG_CHANGE_SIGN 0

View File

@ -2254,7 +2254,7 @@ void SetMoveEffect(bool32 primary, u32 certain)
}
RESET_RETURN
}
if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) || IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL))
if (!CanPoisonType(gBattleScripting.battler, gEffectBattler)
&& (gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
&& (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))
{
@ -2264,9 +2264,7 @@ void SetMoveEffect(bool32 primary, u32 certain)
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
RESET_RETURN
}
if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON))
break;
if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL))
if (!CanPoisonType(gBattleScripting.battler, gEffectBattler))
break;
if (gBattleMons[gEffectBattler].status1)
break;
@ -2401,7 +2399,7 @@ void SetMoveEffect(bool32 primary, u32 certain)
}
RESET_RETURN
}
if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) || IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL))
if (!CanPoisonType(gBattleScripting.battler, gEffectBattler)
&& (gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
&& (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))
{
@ -2413,7 +2411,7 @@ void SetMoveEffect(bool32 primary, u32 certain)
}
if (gBattleMons[gEffectBattler].status1)
break;
if (!IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) && !IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL))
if (CanPoisonType(gBattleScripting.battler, gEffectBattler))
{
if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY
|| GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE
@ -6672,6 +6670,13 @@ static void HandleTerrainMove(u32 moveEffect)
}
}
bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget)
{
return (GetBattlerAbility(battlerAttacker) == ABILITY_CORROSION
|| !(IS_BATTLER_OF_TYPE(battlerTarget, TYPE_POISON)
|| IS_BATTLER_OF_TYPE(battlerTarget, TYPE_STEEL)));
}
bool32 CanUseLastResort(u8 battlerId)
{
u32 i;
@ -6885,6 +6890,12 @@ static void Cmd_various(void)
gBattleStruct->friskedBattler = 0;
gBattleStruct->friskedAbility = FALSE;
break;
case VARIOUS_HANDLE_TYPE_IMMUNITY:
if (!CanPoisonType(gActiveBattler, GetBattlerForBattleScript(gBattlescriptCurrInstr[3])))
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 4);
else
gBattlescriptCurrInstr += 8;
return;
case VARIOUS_TRACE_ABILITY:
gBattleMons[gActiveBattler].ability = gBattleStruct->tracedAbility[gActiveBattler];
RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability);

View File

@ -4865,7 +4865,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
{
case HOLD_EFFECT_TOXIC_ORB:
if (!gBattleMons[battlerId].status1
&& !IS_BATTLER_OF_TYPE(battlerId, TYPE_POISON) && !IS_BATTLER_OF_TYPE(battlerId, TYPE_STEEL)
&& CanPoisonType(battlerId, battlerId)
&& GetBattlerAbility(battlerId) != ABILITY_IMMUNITY)
{
effect = ITEM_STATUS_CHANGE;