mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-11-17 12:07:38 +01:00
Merge pull request #1849 from BuffelSaft/pastel_veil2
Add Pastel Veil, fix Corrosion and Poison Touch
This commit is contained in:
commit
90ddc8d706
@ -2581,6 +2581,18 @@ BattleScript_AromaVeilProtects:
|
|||||||
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED
|
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED
|
||||||
goto BattleScript_MoveEnd
|
goto BattleScript_MoveEnd
|
||||||
|
|
||||||
|
BattleScript_PastelVeilProtectsRet::
|
||||||
|
pause B_WAIT_TIME_SHORT
|
||||||
|
call BattleScript_AbilityPopUp
|
||||||
|
printstring STRINGID_PASTELVEILPROTECTED
|
||||||
|
waitmessage B_WAIT_TIME_LONG
|
||||||
|
return
|
||||||
|
|
||||||
|
BattleScript_PastelVeilProtects:
|
||||||
|
call BattleScript_PastelVeilProtectsRet
|
||||||
|
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED
|
||||||
|
goto BattleScript_MoveEnd
|
||||||
|
|
||||||
BattleScript_LeafGuardProtectsRet::
|
BattleScript_LeafGuardProtectsRet::
|
||||||
pause B_WAIT_TIME_SHORT
|
pause B_WAIT_TIME_SHORT
|
||||||
call BattleScript_AbilityPopUp
|
call BattleScript_AbilityPopUp
|
||||||
@ -3081,6 +3093,7 @@ BattleScript_EffectToxic::
|
|||||||
ppreduce
|
ppreduce
|
||||||
jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected
|
jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected
|
||||||
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects
|
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects
|
||||||
|
jumpifability BS_TARGET_SIDE, ABILITY_PASTEL_VEIL, BattleScript_PastelVeilProtects
|
||||||
jumpifflowerveil BattleScript_FlowerVeilProtects
|
jumpifflowerveil BattleScript_FlowerVeilProtects
|
||||||
jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects
|
jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects
|
||||||
jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects
|
jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects
|
||||||
@ -3108,6 +3121,7 @@ BattleScript_AlreadyPoisoned::
|
|||||||
|
|
||||||
BattleScript_ImmunityProtected::
|
BattleScript_ImmunityProtected::
|
||||||
copybyte gEffectBattler, gBattlerTarget
|
copybyte gEffectBattler, gBattlerTarget
|
||||||
|
call BattleScript_AbilityPopUp
|
||||||
setbyte cMULTISTRING_CHOOSER, B_MSG_ABILITY_PREVENTS_MOVE_STATUS
|
setbyte cMULTISTRING_CHOOSER, B_MSG_ABILITY_PREVENTS_MOVE_STATUS
|
||||||
call BattleScript_PSNPrevention
|
call BattleScript_PSNPrevention
|
||||||
goto BattleScript_MoveEnd
|
goto BattleScript_MoveEnd
|
||||||
@ -3436,6 +3450,7 @@ BattleScript_EffectPoison::
|
|||||||
ppreduce
|
ppreduce
|
||||||
jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected
|
jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected
|
||||||
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects
|
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects
|
||||||
|
jumpifability BS_TARGET_SIDE, ABILITY_PASTEL_VEIL, BattleScript_PastelVeilProtects
|
||||||
jumpifflowerveil BattleScript_FlowerVeilProtects
|
jumpifflowerveil BattleScript_FlowerVeilProtects
|
||||||
jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects
|
jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects
|
||||||
jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects
|
jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects
|
||||||
@ -8978,3 +8993,27 @@ BattleScript_DarkTypePreventsPrankster::
|
|||||||
waitmessage B_WAIT_TIME_LONG
|
waitmessage B_WAIT_TIME_LONG
|
||||||
orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT
|
orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT
|
||||||
goto BattleScript_MoveEnd
|
goto BattleScript_MoveEnd
|
||||||
|
|
||||||
|
BattleScript_PastelVeilActivates::
|
||||||
|
setbyte gBattleCommunication, 0
|
||||||
|
setbyte gBattleCommunication + 1, 0
|
||||||
|
BattleScript_PastelVeil_TryCurePoison:
|
||||||
|
jumpifstatus BS_TARGET, STATUS1_POISON | STATUS1_TOXIC_POISON, BattleScript_PastelVeilCurePoison
|
||||||
|
goto BattleScript_PastelVeilLoopIncrement
|
||||||
|
BattleScript_PastelVeilCurePoison:
|
||||||
|
jumpifbyte CMP_NOT_EQUAL, gBattleCommunication + 1, 0x0, BattleScript_PastelVeilCurePoisonNoPopUp
|
||||||
|
call BattleScript_AbilityPopUp
|
||||||
|
setbyte gBattleCommunication + 1, 1
|
||||||
|
BattleScript_PastelVeilCurePoisonNoPopUp: @ Only show Pastel Veil pop up once if it cures two mons
|
||||||
|
printfromtable gSwitchInAbilityStringIds
|
||||||
|
waitmessage B_WAIT_TIME_LONG
|
||||||
|
curestatus BS_TARGET
|
||||||
|
updatestatusicon BS_TARGET
|
||||||
|
BattleScript_PastelVeilLoopIncrement:
|
||||||
|
jumpifbyte CMP_NOT_EQUAL, gBattleCommunication, 0x0, BattleScript_PastelVeilEnd
|
||||||
|
addbyte gBattleCommunication, 1
|
||||||
|
jumpifnoally BS_TARGET, BattleScript_PastelVeilEnd
|
||||||
|
setallytonexttarget BattleScript_PastelVeil_TryCurePoison
|
||||||
|
goto BattleScript_PastelVeilEnd
|
||||||
|
BattleScript_PastelVeilEnd:
|
||||||
|
end3
|
||||||
|
@ -406,5 +406,6 @@ extern const u8 BattleScript_SelectingNotAllowedMoveGorillaTactics[];
|
|||||||
extern const u8 BattleScript_WanderingSpiritActivates[];
|
extern const u8 BattleScript_WanderingSpiritActivates[];
|
||||||
extern const u8 BattleScript_MirrorArmorReflect[];
|
extern const u8 BattleScript_MirrorArmorReflect[];
|
||||||
extern const u8 BattleScript_GooeyActivates[];
|
extern const u8 BattleScript_GooeyActivates[];
|
||||||
|
extern const u8 BattleScript_PastelVeilActivates[];
|
||||||
|
|
||||||
#endif // GUARD_BATTLE_SCRIPTS_H
|
#endif // GUARD_BATTLE_SCRIPTS_H
|
||||||
|
@ -168,7 +168,7 @@ bool32 IsEntrainmentBannedAbilityAttacker(u16 ability);
|
|||||||
bool32 IsEntrainmentTargetOrSimpleBeamBannedAbility(u16 ability);
|
bool32 IsEntrainmentTargetOrSimpleBeamBannedAbility(u16 ability);
|
||||||
|
|
||||||
bool32 CanSleep(u8 battlerId);
|
bool32 CanSleep(u8 battlerId);
|
||||||
bool32 CanBePoisoned(u8 battlerId);
|
bool32 CanBePoisoned(u8 battlerAttacker, u8 battlerTarget);
|
||||||
bool32 CanBeBurned(u8 battlerId);
|
bool32 CanBeBurned(u8 battlerId);
|
||||||
bool32 CanBeParalyzed(u8 battlerId);
|
bool32 CanBeParalyzed(u8 battlerId);
|
||||||
bool32 CanBeFrozen(u8 battlerId);
|
bool32 CanBeFrozen(u8 battlerId);
|
||||||
|
@ -599,8 +599,10 @@
|
|||||||
#define STRINGID_BROKETHROUGHPROTECTION 596
|
#define STRINGID_BROKETHROUGHPROTECTION 596
|
||||||
#define STRINGID_ABILITYALLOWSONLYMOVE 597
|
#define STRINGID_ABILITYALLOWSONLYMOVE 597
|
||||||
#define STRINGID_SWAPPEDABILITIES 598
|
#define STRINGID_SWAPPEDABILITIES 598
|
||||||
|
#define STRINGID_PASTELVEILPROTECTED 599
|
||||||
|
#define STRINGID_PASTELVEILENTERS 600
|
||||||
|
|
||||||
#define BATTLESTRINGS_COUNT 599
|
#define BATTLESTRINGS_COUNT 601
|
||||||
|
|
||||||
// The below IDs are all indexes into battle message tables,
|
// The below IDs are all indexes into battle message tables,
|
||||||
// used to determine which of a set of messages to print.
|
// used to determine which of a set of messages to print.
|
||||||
@ -835,6 +837,7 @@
|
|||||||
#define B_MSG_SWITCHIN_SCREENCLEANER 12
|
#define B_MSG_SWITCHIN_SCREENCLEANER 12
|
||||||
#define B_MSG_SWITCHIN_ASONE 13
|
#define B_MSG_SWITCHIN_ASONE 13
|
||||||
#define B_MSG_SWITCHIN_CURIOUS_MEDICINE 14
|
#define B_MSG_SWITCHIN_CURIOUS_MEDICINE 14
|
||||||
|
#define B_MSG_SWITCHIN_PASTEL_VEIL 15
|
||||||
|
|
||||||
// gMentalHerbCureStringIds
|
// gMentalHerbCureStringIds
|
||||||
#define B_MSG_MENTALHERBCURE_INFATUATION 0
|
#define B_MSG_MENTALHERBCURE_INFATUATION 0
|
||||||
|
@ -2616,7 +2616,7 @@ bool32 AI_CanPutToSleep(u8 battlerAtk, u8 battlerDef, u16 defAbility, u16 move,
|
|||||||
bool32 AI_CanBePoisoned(u8 battler, u16 ability)
|
bool32 AI_CanBePoisoned(u8 battler, u16 ability)
|
||||||
{
|
{
|
||||||
if (ability == ABILITY_IMMUNITY
|
if (ability == ABILITY_IMMUNITY
|
||||||
|| ability == ABILITY_PASTEL_VEIL
|
|| IsAbilityOnSide(battler, ABILITY_PASTEL_VEIL)
|
||||||
|| gBattleMons[battler].status1 & STATUS1_ANY
|
|| gBattleMons[battler].status1 & STATUS1_ANY
|
||||||
|| IsAbilityStatusProtected(battler)
|
|| IsAbilityStatusProtected(battler)
|
||||||
|| gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD)
|
|| gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD)
|
||||||
|
@ -725,9 +725,13 @@ static const u8 sText_ButHoopaCantUseIt[] = _("But Hoopa can't use it\nthe way i
|
|||||||
static const u8 sText_BrokeThroughProtection[] = _("It broke through the\n{B_DEF_NAME_WITH_PREFIX}'s protection!");
|
static const u8 sText_BrokeThroughProtection[] = _("It broke through the\n{B_DEF_NAME_WITH_PREFIX}'s protection!");
|
||||||
static const u8 sText_AbilityAllowsOnlyMove[] = _("{B_ATK_ABILITY} allows the\nuse of only {B_CURRENT_MOVE}!\p");
|
static const u8 sText_AbilityAllowsOnlyMove[] = _("{B_ATK_ABILITY} allows the\nuse of only {B_CURRENT_MOVE}!\p");
|
||||||
static const u8 sText_SwappedAbilities[] = _("{B_DEF_NAME_WITH_PREFIX} swapped Abilities\nwith its target!");
|
static const u8 sText_SwappedAbilities[] = _("{B_DEF_NAME_WITH_PREFIX} swapped Abilities\nwith its target!");
|
||||||
|
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!");
|
||||||
|
|
||||||
const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
|
const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
|
||||||
{
|
{
|
||||||
|
[STRINGID_PASTELVEILENTERS - 12] = sText_PastelVeilEnters,
|
||||||
|
[STRINGID_PASTELVEILPROTECTED -12] = sText_PastelVeilProtected,
|
||||||
[STRINGID_SWAPPEDABILITIES - 12] = sText_SwappedAbilities,
|
[STRINGID_SWAPPEDABILITIES - 12] = sText_SwappedAbilities,
|
||||||
[STRINGID_ABILITYALLOWSONLYMOVE - 12] = sText_AbilityAllowsOnlyMove,
|
[STRINGID_ABILITYALLOWSONLYMOVE - 12] = sText_AbilityAllowsOnlyMove,
|
||||||
[STRINGID_BROKETHROUGHPROTECTION - 12] = sText_BrokeThroughProtection,
|
[STRINGID_BROKETHROUGHPROTECTION - 12] = sText_BrokeThroughProtection,
|
||||||
@ -1375,6 +1379,7 @@ const u16 gSwitchInAbilityStringIds[] =
|
|||||||
[B_MSG_SWITCHIN_SCREENCLEANER] = STRINGID_SCREENCLEANERENTERS,
|
[B_MSG_SWITCHIN_SCREENCLEANER] = STRINGID_SCREENCLEANERENTERS,
|
||||||
[B_MSG_SWITCHIN_ASONE] = STRINGID_ASONEENTERS,
|
[B_MSG_SWITCHIN_ASONE] = STRINGID_ASONEENTERS,
|
||||||
[B_MSG_SWITCHIN_CURIOUS_MEDICINE] = STRINGID_CURIOUSMEDICINEENTERS,
|
[B_MSG_SWITCHIN_CURIOUS_MEDICINE] = STRINGID_CURIOUSMEDICINEENTERS,
|
||||||
|
[B_MSG_SWITCHIN_PASTEL_VEIL] = STRINGID_PASTELVEILENTERS,
|
||||||
};
|
};
|
||||||
|
|
||||||
const u16 gMissStringIds[] =
|
const u16 gMissStringIds[] =
|
||||||
|
@ -2685,9 +2685,7 @@ void SetMoveEffect(bool32 primary, u32 certain)
|
|||||||
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT;
|
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT;
|
||||||
RESET_RETURN
|
RESET_RETURN
|
||||||
}
|
}
|
||||||
if (!CanPoisonType(gBattleScripting.battler, gEffectBattler))
|
if (!CanBePoisoned(gBattleScripting.battler, gEffectBattler))
|
||||||
break;
|
|
||||||
if (!CanBePoisoned(gEffectBattler))
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
statusChanged = TRUE;
|
statusChanged = TRUE;
|
||||||
@ -2812,11 +2810,8 @@ void SetMoveEffect(bool32 primary, u32 certain)
|
|||||||
}
|
}
|
||||||
if (gBattleMons[gEffectBattler].status1)
|
if (gBattleMons[gEffectBattler].status1)
|
||||||
break;
|
break;
|
||||||
if (CanPoisonType(gBattleScripting.battler, gEffectBattler))
|
if (CanBePoisoned(gBattleScripting.battler, gEffectBattler))
|
||||||
{
|
{
|
||||||
if (!CanBePoisoned(gEffectBattler))
|
|
||||||
break;
|
|
||||||
|
|
||||||
// It's redundant, because at this point we know the status1 value is 0.
|
// It's redundant, because at this point we know the status1 value is 0.
|
||||||
gBattleMons[gEffectBattler].status1 &= ~(STATUS1_TOXIC_POISON);
|
gBattleMons[gEffectBattler].status1 &= ~(STATUS1_TOXIC_POISON);
|
||||||
gBattleMons[gEffectBattler].status1 &= ~(STATUS1_POISON);
|
gBattleMons[gEffectBattler].status1 &= ~(STATUS1_POISON);
|
||||||
@ -7269,9 +7264,8 @@ static void HandleTerrainMove(u32 moveEffect)
|
|||||||
|
|
||||||
bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget)
|
bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget)
|
||||||
{
|
{
|
||||||
return (GetBattlerAbility(battlerAttacker) == ABILITY_CORROSION
|
return ((GetBattlerAbility(battlerAttacker) == ABILITY_CORROSION && gBattleMoves[gCurrentMove].split == SPLIT_STATUS)
|
||||||
|| !(IS_BATTLER_OF_TYPE(battlerTarget, TYPE_POISON)
|
|| !(IS_BATTLER_OF_TYPE(battlerTarget, TYPE_POISON) || IS_BATTLER_OF_TYPE(battlerTarget, TYPE_STEEL)));
|
||||||
|| IS_BATTLER_OF_TYPE(battlerTarget, TYPE_STEEL)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool32 CanParalyzeType(u8 battlerAttacker, u8 battlerTarget)
|
bool32 CanParalyzeType(u8 battlerAttacker, u8 battlerTarget)
|
||||||
|
@ -4079,6 +4079,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
|||||||
effect++;
|
effect++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case ABILITY_PASTEL_VEIL:
|
||||||
|
if (!gSpecialStatuses[battler].switchInAbilityDone)
|
||||||
|
{
|
||||||
|
gBattlerTarget = battler;
|
||||||
|
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_PASTEL_VEIL;
|
||||||
|
BattleScriptPushCursorAndCallback(BattleScript_PastelVeilActivates);
|
||||||
|
effect++;
|
||||||
|
gSpecialStatuses[battler].switchInAbilityDone = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case ABILITY_ANTICIPATION:
|
case ABILITY_ANTICIPATION:
|
||||||
if (!gSpecialStatuses[battler].switchInAbilityDone)
|
if (!gSpecialStatuses[battler].switchInAbilityDone)
|
||||||
{
|
{
|
||||||
@ -5013,7 +5023,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
|||||||
&& gBattleMons[gBattlerAttacker].hp != 0
|
&& gBattleMons[gBattlerAttacker].hp != 0
|
||||||
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
|
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
|
||||||
&& TARGET_TURN_DAMAGED
|
&& TARGET_TURN_DAMAGED
|
||||||
&& CanBePoisoned(gBattlerAttacker)
|
&& CanBePoisoned(gBattlerAttacker, gBattlerTarget)
|
||||||
&& IsMoveMakingContact(move, gBattlerAttacker)
|
&& IsMoveMakingContact(move, gBattlerAttacker)
|
||||||
&& (Random() % 3) == 0)
|
&& (Random() % 3) == 0)
|
||||||
{
|
{
|
||||||
@ -5200,8 +5210,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
|||||||
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||||
&& gBattleMons[gBattlerTarget].hp != 0
|
&& gBattleMons[gBattlerTarget].hp != 0
|
||||||
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
|
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
|
||||||
&& CanBePoisoned(gBattlerTarget)
|
&& CanBePoisoned(gBattlerAttacker, gBattlerTarget)
|
||||||
&& IsMoveMakingContact(move, gBattlerAttacker)
|
&& IsMoveMakingContact(move, gBattlerAttacker)
|
||||||
|
&& TARGET_TURN_DAMAGED // Need to actually hit the target
|
||||||
&& (Random() % 3) == 0)
|
&& (Random() % 3) == 0)
|
||||||
{
|
{
|
||||||
gBattleScripting.moveEffect = MOVE_EFFECT_POISON;
|
gBattleScripting.moveEffect = MOVE_EFFECT_POISON;
|
||||||
@ -5641,18 +5652,19 @@ bool32 CanSleep(u8 battlerId)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool32 CanBePoisoned(u8 battlerId)
|
bool32 CanBePoisoned(u8 battlerAttacker, u8 battlerTarget)
|
||||||
{
|
{
|
||||||
u16 ability = GetBattlerAbility(battlerId);
|
u16 ability = GetBattlerAbility(battlerTarget);
|
||||||
if (IS_BATTLER_OF_TYPE(battlerId, TYPE_POISON)
|
|
||||||
|| IS_BATTLER_OF_TYPE(battlerId, TYPE_STEEL)
|
if (!(CanPoisonType(battlerAttacker, battlerTarget))
|
||||||
|| gSideStatuses[GetBattlerSide(battlerId)] & SIDE_STATUS_SAFEGUARD
|
|| gSideStatuses[GetBattlerSide(battlerTarget)] & SIDE_STATUS_SAFEGUARD
|
||||||
|| gBattleMons[battlerId].status1 & STATUS1_ANY
|
|| gBattleMons[battlerTarget].status1 & STATUS1_ANY
|
||||||
|| ability == ABILITY_IMMUNITY
|
|| ability == ABILITY_IMMUNITY
|
||||||
|| ability == ABILITY_COMATOSE
|
|| ability == ABILITY_COMATOSE
|
||||||
|| gBattleMons[battlerId].status1 & STATUS1_ANY
|
|| IsAbilityOnSide(battlerTarget, ABILITY_PASTEL_VEIL)
|
||||||
|| IsAbilityStatusProtected(battlerId)
|
|| gBattleMons[battlerTarget].status1 & STATUS1_ANY
|
||||||
|| IsBattlerTerrainAffected(battlerId, STATUS_FIELD_MISTY_TERRAIN))
|
|| IsAbilityStatusProtected(battlerTarget)
|
||||||
|
|| IsBattlerTerrainAffected(battlerTarget, STATUS_FIELD_MISTY_TERRAIN))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user