mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-12-26 03:34:15 +01:00
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:
parent
a80150f890
commit
c5a6acc7db
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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[];
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user