Decouple passive hp updates from move damage updates (#7942)
Some checks are pending
CI / build (push) Waiting to run
CI / allcontributors (push) Waiting to run

This commit is contained in:
Alex 2025-10-19 16:40:13 +02:00 committed by GitHub
parent a5b69a4daf
commit cb0d503f66
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 550 additions and 696 deletions

View File

@ -45,14 +45,16 @@
.byte 0xa
.endm
.macro healthbarupdate battler:req
.macro healthbarupdate battler:req updateState:req
.byte 0xb
.byte \battler
.byte \updateState
.endm
.macro datahpupdate battler:req
.macro datahpupdate battler:req updateState:req
.byte 0xc
.byte \battler
.byte \updateState
.endm
.macro critmessage
@ -358,9 +360,8 @@
.byte 0x3a
.endm
.macro absorbhealthbarupdate battler:req
.macro isdmgblockedbydisguise
.byte 0x3b
.byte \battler
.endm
.macro return
@ -759,7 +760,7 @@
callnative BS_RemoveStockpileCounters
.endm
.macro setdrainedhp
.macro unused_0x88
.byte 0x88
.endm
@ -1293,7 +1294,7 @@
.byte 0xf3
.endm
.macro subattackerhpbydmg
.macro unused_0xf4
.byte 0xf4
.endm

View File

@ -136,11 +136,10 @@ BattleScript_EffectShedTail::
jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailed
setsubstitute
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SUBSTITUTE_FAILED, BattleScript_SubstituteString
orword gHitMarker, HITMARKER_PASSIVE_HP_UPDATE
attackanimation
waitanimation
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
printstring STRINGID_SHEDITSTAIL
waitmessage B_WAIT_TIME_LONG
moveendto MOVEEND_ATTACKER_VISIBLE
@ -159,7 +158,6 @@ BattleScript_EffectFilletAway::
jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_ButItFailed
BattleScript_FilletAwayTryAttack::
halvehp BattleScript_ButItFailed
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
attackanimation
waitanimation
setstatchanger STAT_ATK, 2, FALSE
@ -178,8 +176,8 @@ BattleScript_FilletAwayTrySpeed::
waitmessage B_WAIT_TIME_LONG
BattleScript_FilletAwayEnd::
clearmoveresultflags MOVE_RESULT_NO_EFFECT
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
goto BattleScript_MoveEnd
BattleScript_EffectDoodle::
@ -381,20 +379,13 @@ BattleScript_MoveEffectSaltCure::
BattleScript_SaltCureExtraDamage::
playanimation BS_ATTACKER, B_ANIM_SALT_CURE_DAMAGE, NULL
waitanimation
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
printstring STRINGID_TARGETISHURTBYSALTCURE
waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_ATTACKER
end2
BattleScript_HurtTarget_NoString:
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
return
BattleScript_EffectCorrosiveGas::
attackcanceler
accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE
@ -508,10 +499,8 @@ BattleScript_TeatimeLoop:
jumpifelectricabilityaffected BS_TARGET, ABILITY_VOLT_ABSORB, BattleScript_Teatimesorb
jumpifelectricabilityaffected BS_TARGET, ABILITY_MOTOR_DRIVE, BattleScript_Teatimemotor
jumpifteainvulnerable BS_TARGET, BattleScript_Teatimevul @ in semi-invulnerable state OR held item is not a Berry
orword gHitMarker, HITMARKER_DISABLE_ANIMATION | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
setbyte sBERRY_OVERRIDE, TRUE @ override the requirements for eating berries
consumeberry BS_TARGET, TRUE @ consume the berry, then restore the item from changedItems
bicword gHitMarker, HITMARKER_DISABLE_ANIMATION | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
setbyte sBERRY_OVERRIDE, FALSE
removeitem BS_TARGET
moveendto MOVEEND_NEXT_TARGET
@ -526,8 +515,8 @@ BattleScript_Teatimevul:
BattleScript_Teatimesorb:
call BattleScript_AbilityPopUpTarget
tryhealquarterhealth BS_TARGET, BattleScript_Teatimesorb_end
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE
datahpupdate BS_TARGET, PASSIVE_HP_UPDATE
printstring STRINGID_PKMNREGAINEDHEALTH
waitmessage B_WAIT_TIME_LONG
BattleScript_Teatimesorb_end:
@ -701,8 +690,8 @@ BattleScript_EffectFling::
effectivenesssound
hitanimation BS_TARGET
waitstate
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE
datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE
critmessage
waitmessage B_WAIT_TIME_MED
resultmessage
@ -780,11 +769,10 @@ BattleScript_FlingMissed:
BattleScript_EffectClangorousSoul::
attackcanceler
cutonethirdhpandraisestats BattleScript_ButItFailed
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_BIDE | HITMARKER_PASSIVE_HP_UPDATE
attackanimation
waitanimation
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
call BattleScript_AllStatsUp
goto BattleScript_MoveEnd
@ -972,9 +960,8 @@ BattleScript_EffectJungleHealing::
JungleHealing_RestoreTargetHealth:
copybyte gBattlerAttacker, gBattlerTarget
tryhealquarterhealth BS_TARGET, BattleScript_JungleHealing_TryCureStatus
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE
datahpupdate BS_TARGET, PASSIVE_HP_UPDATE
printstring STRINGID_PKMNREGAINEDHEALTH
waitmessage B_WAIT_TIME_LONG
BattleScript_JungleHealing_TryCureStatus:
@ -1015,10 +1002,9 @@ BattleScript_EffectLifeDewCheckPartner:
setallytonexttarget BattleScript_EffectLifeDewNextTarget
BattleScript_EffectLifeDewHealing:
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
tryhealquarterhealth BS_TARGET, BattleScript_EffectLifeDewEnd
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE
datahpupdate BS_TARGET, PASSIVE_HP_UPDATE
printstring STRINGID_PKMNREGAINEDHEALTH
waitmessage B_WAIT_TIME_LONG
return
@ -1108,10 +1094,9 @@ BattleScript_StrengthSapHp:
jumpiffullhp BS_ATTACKER, BattleScript_MoveEnd
BattleScript_StrengthSapManipulateDmg:
manipulatedamage DMG_BIG_ROOT
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
jumpifability BS_TARGET, ABILITY_LIQUID_OOZE, BattleScript_StrengthSapLiquidOoze
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
printstring STRINGID_PKMNENERGYDRAINED
waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd
@ -1119,8 +1104,8 @@ BattleScript_StrengthSapLiquidOoze:
call BattleScript_AbilityPopUpTarget
manipulatedamage DMG_CHANGE_SIGN
setbyte cMULTISTRING_CHOOSER, B_MSG_ABSORB_OOZE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
printfromtable gAbsorbDrainStringIds
waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_ATTACKER
@ -1477,9 +1462,8 @@ BattleScript_EffectAfterYou::
BattleScript_MoveEffectFlameBurst::
printstring STRINGID_BURSTINGFLAMESHIT
waitmessage B_WAIT_TIME_LONG
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_SCRIPTING
datahpupdate BS_SCRIPTING
healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
tryfaintmon BS_SCRIPTING
return
@ -1612,8 +1596,8 @@ BattleScript_AutotomizeWeightLoss::
BattleScript_FinalGambit::
setatkhptozero
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
tryfaintmon BS_ATTACKER
return
@ -2024,8 +2008,8 @@ BattleScript_EffectHealPulse::
tryhealpulse BattleScript_AlreadyAtFullHp
attackanimation
waitanimation
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE
datahpupdate BS_TARGET, PASSIVE_HP_UPDATE
printstring STRINGID_PKMNREGAINEDHEALTH
waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd
@ -2125,8 +2109,8 @@ BattleScript_EffectHealingWishRestore:
waitanimation
dmgtomaxattackerhp
manipulatedamage DMG_CHANGE_SIGN
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
clearstatus
waitstate
updatestatusicon BS_ATTACKER
@ -2479,8 +2463,8 @@ BattleScript_Hit_RetFromAtkAnimation::
effectivenesssound
hitanimation BS_TARGET
waitstate
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE
datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE
critmessage
waitmessage B_WAIT_TIME_LONG
resultmessage
@ -2610,12 +2594,11 @@ BattleScript_EffectAbsorbLiquidOoze::
goto BattleScript_EffectAbsorb
BattleScript_EffectAbsorb::
absorbhealthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
printfromtable gAbsorbDrainStringIds
waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_ATTACKER
bicword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE | HITMARKER_PASSIVE_HP_UPDATE
return
BattleScript_EffectExplosion::
@ -2632,9 +2615,8 @@ BattleScript_FaintAttackerForExplosion::
return
BattleScript_MaxHp50Recoil::
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
tryfaintmon BS_ATTACKER
return
@ -2841,9 +2823,8 @@ BattleScript_EffectRestoreHp::
attackanimation
waitanimation
BattleScript_RestoreHp:
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
printstring STRINGID_PKMNREGAINEDHEALTH
waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd
@ -2918,9 +2899,8 @@ BattleScript_RecoilIfMiss::
printstring STRINGID_PKMNCRASHED
waitmessage B_WAIT_TIME_LONG
jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_RecoilEnd
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
tryfaintmon BS_ATTACKER
return
@ -3158,11 +3138,10 @@ BattleScript_EffectSubstitute::
jumpifvolatile BS_ATTACKER, VOLATILE_SUBSTITUTE, BattleScript_AlreadyHasSubstitute
setsubstitute
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SUBSTITUTE_FAILED, BattleScript_SubstituteString
orword gHitMarker, HITMARKER_PASSIVE_HP_UPDATE
attackanimation
waitanimation
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
BattleScript_SubstituteString::
pause B_WAIT_TIME_SHORT
printfromtable gSubstituteUsedStringIds
@ -3282,11 +3261,10 @@ BattleScript_EffectPainSplit::
painsplitdmgcalc BattleScript_ButItFailed
attackanimation
waitanimation
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE
datahpupdate BS_TARGET, PASSIVE_HP_UPDATE
printstring STRINGID_SHAREDPAIN
waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd
@ -3462,12 +3440,11 @@ BattleScript_DoGhostCurse::
attackcanceler
accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON
cursetarget BattleScript_ButItFailed
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
setbyte sB_ANIM_TURN, 0
attackanimation
waitanimation
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
printstring STRINGID_PKMNLAIDCURSE
waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_ATTACKER
@ -3758,11 +3735,10 @@ BattleScript_EffectBellyDrum::
attackcanceler
jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_ButItFailed
halvehp BattleScript_ButItFailed
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
attackanimation
waitanimation
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
setstatchanger STAT_ATK, MAX_STAT_STAGE, FALSE
statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveEnd
printstring STRINGID_PKMNCUTHPMAXEDATTACK
@ -3834,8 +3810,8 @@ BattleScript_BeatUpAttack::
effectivenesssound
hitanimation BS_TARGET
waitstate
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE
datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE
critmessage
waitmessage B_WAIT_TIME_LONG
resultmessage
@ -3863,9 +3839,8 @@ BattleScript_EffectSoftboiled::
BattleScript_PresentHealTarget::
attackanimation
waitanimation
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE
datahpupdate BS_TARGET, PASSIVE_HP_UPDATE
printstring STRINGID_PKMNREGAINEDHEALTH
waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd
@ -3974,9 +3949,8 @@ BattleScript_EffectSwallow::
stockpiletohpheal BattleScript_ButItFailed
attackanimation
waitanimation
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE
datahpupdate BS_TARGET, PASSIVE_HP_UPDATE
printstring STRINGID_PKMNREGAINEDHEALTH
waitmessage B_WAIT_TIME_LONG
removestockpilecounters
@ -4216,8 +4190,8 @@ BattleScript_BrickBreakDoHit::
effectivenesssound
hitanimation BS_TARGET
waitstate
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE
datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE
critmessage
waitmessage B_WAIT_TIME_LONG
resultmessage
@ -4903,8 +4877,8 @@ BattleScript_FogEnded_Ret::
BattleScript_IceBodyHeal::
call BattleScript_AbilityPopUp
playanimation BS_ATTACKER, B_ANIM_SIMPLE_HEAL
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
printstring STRINGID_ICEBODYHPGAIN
waitmessage B_WAIT_TIME_LONG
end2
@ -5031,9 +5005,8 @@ BattleScript_LeechSeedTurnDrainHealBlock::
BattleScript_LeechSeedTurnDrainRecovery::
call BattleScript_LeechSeedTurnDrain
BattleScript_LeechSeedTurnDrainGainHp:
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE
datahpupdate BS_TARGET, PASSIVE_HP_UPDATE
printfromtable gLeechSeedStringIds
waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_TARGET
@ -5041,8 +5014,8 @@ BattleScript_LeechSeedTurnDrainGainHp:
BattleScript_LeechSeedTurnDrain:
playanimation BS_ATTACKER, B_ANIM_LEECH_SEED_DRAIN, sB_ANIM_ARG1
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
tryfaintmon BS_ATTACKER
return
@ -5067,8 +5040,8 @@ BattleScript_BideAttack::
effectivenesssound
hitanimation BS_TARGET
waitstate
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE
datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE
resultmessage
waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_TARGET
@ -5216,16 +5189,14 @@ BattleScript_EncoredNoMore::
BattleScript_DestinyBondTakesLife::
printstring STRINGID_PKMNTOOKFOE
waitmessage B_WAIT_TIME_LONG
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
tryfaintmon BS_ATTACKER
return
BattleScript_DmgHazardsOnAttacker::
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
call BattleScript_PrintHurtByDmgHazards
tryfaintmon BS_ATTACKER
tryfaintmon_spikes BS_ATTACKER, BattleScript_DmgHazardsOnAttackerFainted
@ -5238,9 +5209,8 @@ BattleScript_DmgHazardsOnAttackerFainted::
goto BattleScript_HandleFaintedMon
BattleScript_DmgHazardsOnTarget::
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE
datahpupdate BS_TARGET, PASSIVE_HP_UPDATE
call BattleScript_PrintHurtByDmgHazards
tryfaintmon BS_TARGET
tryfaintmon_spikes BS_TARGET, BattleScript_DmgHazardsOnTargetFainted
@ -5253,9 +5223,8 @@ BattleScript_DmgHazardsOnTargetFainted::
goto BattleScript_HandleFaintedMon
BattleScript_DmgHazardsOnBattlerScripting::
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_SCRIPTING
datahpupdate BS_SCRIPTING
healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
call BattleScript_PrintHurtByDmgHazards
tryfaintmon BS_SCRIPTING
tryfaintmon_spikes BS_SCRIPTING, BattleScript_DmgHazardsOnBattlerScriptingFainted
@ -5268,9 +5237,8 @@ BattleScript_DmgHazardsOnBattlerScriptingFainted::
goto BattleScript_HandleFaintedMon
BattleScript_DmgHazardsOnFaintedBattler::
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_FAINTED
datahpupdate BS_FAINTED
healthbarupdate BS_FAINTED, PASSIVE_HP_UPDATE
datahpupdate BS_FAINTED, PASSIVE_HP_UPDATE
call BattleScript_PrintHurtByDmgHazards
tryfaintmon BS_FAINTED
tryfaintmon_spikes BS_FAINTED, BattleScript_DmgHazardsOnFaintedBattlerFainted
@ -5329,9 +5297,8 @@ BattleScript_StickyWebOnSwitchInEnd:
BattleScript_PerishSongTakesLife::
printstring STRINGID_PKMNPERISHCOUNTFELL
waitmessage B_WAIT_TIME_LONG
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
tryfaintmon BS_ATTACKER
end2
@ -5339,20 +5306,18 @@ BattleScript_PerishBodyActivates::
call BattleScript_AbilityPopUp
printstring STRINGID_PKMNSWILLPERISHIN3TURNS
waitmessage B_WAIT_TIME_LONG
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
return
BattleScript_GulpMissileGorging::
call BattleScript_AbilityPopUp
playanimation BS_ATTACKER, B_ANIM_GULP_MISSILE
waitanimation
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
effectivenesssound
hitanimation BS_ATTACKER
waitstate
jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_GulpMissileNoDmgGorging
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
tryfaintmon BS_ATTACKER
jumpiffainted BS_ATTACKER, TRUE, BattleScript_GulpMissileNoSecondEffectGorging
BattleScript_GulpMissileNoDmgGorging:
@ -5373,13 +5338,12 @@ BattleScript_GulpMissileGulping::
call BattleScript_AbilityPopUp
playanimation BS_ATTACKER, B_ANIM_GULP_MISSILE
waitanimation
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
effectivenesssound
hitanimation BS_ATTACKER
waitstate
jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_GulpMissileNoDmgGulping
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
tryfaintmon BS_ATTACKER
jumpiffainted BS_ATTACKER, TRUE, BattleScript_GulpMissileNoSecondEffectGulping
BattleScript_GulpMissileNoDmgGulping:
@ -5462,9 +5426,8 @@ BattleScript_EarthEaterActivates::
call BattleScript_AbilityPopUp
pause B_WAIT_TIME_LONG
tryhealquarterhealth BS_TARGET, BattleScript_EarthEaterRet
orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE
datahpupdate BS_TARGET, PASSIVE_HP_UPDATE
printstring STRINGID_PKMNREGAINEDHEALTH
waitmessage B_WAIT_TIME_LONG
BattleScript_EarthEaterRet:
@ -5559,8 +5522,8 @@ BattleScript_DoFutureAttackHit::
effectivenesssound
hitanimation BS_TARGET
waitstate
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE
datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE
critmessage
waitmessage B_WAIT_TIME_LONG
BattleScript_DoFutureAttackResult:
@ -5707,9 +5670,8 @@ BattleScript_WishComesTrue::
playanimation BS_TARGET, B_ANIM_WISH_HEAL
printstring STRINGID_PKMNWISHCAMETRUE
waitmessage B_WAIT_TIME_LONG
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE
datahpupdate BS_TARGET, PASSIVE_HP_UPDATE
printstring STRINGID_PKMNREGAINEDHEALTH
waitmessage B_WAIT_TIME_LONG
end2
@ -5735,9 +5697,8 @@ BattleScript_IngrainTurnHeal::
printstring STRINGID_PKMNABSORBEDNUTRIENTS
BattleScript_TurnHeal:
waitmessage B_WAIT_TIME_LONG
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
end2
BattleScript_AquaRingHeal::
@ -6019,9 +5980,8 @@ BattleScript_CudChewActivates::
BattleScript_ApplyDisguiseFormChangeHPLoss::
jumpifgenconfiglowerthan GEN_CONFIG_DISGUISE_HP_LOSS, GEN_8, BattleScript_ApplyDisguiseFormChangeHPLossReturn
orword gHitMarker, HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_SCRIPTING
datahpupdate BS_SCRIPTING
healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
BattleScript_ApplyDisguiseFormChangeHPLossReturn:
return
@ -6110,9 +6070,8 @@ BattleScript_AftermathDmg::
pause B_WAIT_TIME_SHORT
call BattleScript_AbilityPopUpScripting
jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_AftermathDmgRet
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
printstring STRINGID_AFTERMATHDMG
waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_ATTACKER
@ -6153,9 +6112,8 @@ BattleScript_PoisonTurnDmg::
BattleScript_DoStatusTurnDmg::
statusanimation BS_ATTACKER
BattleScript_DoTurnDmg:
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
tryfaintmon BS_ATTACKER
checkteamslost BattleScript_DoTurnDmgEnd
tryactivateitem BS_ATTACKER, ON_ITEM_HP_THRESHOLD
@ -6168,9 +6126,8 @@ BattleScript_PoisonHealActivates::
printstring STRINGID_POISONHEALHPUP
waitmessage B_WAIT_TIME_LONG
statusanimation BS_ATTACKER
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
end2
BattleScript_BurnTurnDmg::
@ -6279,9 +6236,9 @@ BattleScript_DoSelfConfusionDmg::
effectivenesssound
hitanimation BS_ATTACKER
waitstate
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
isdmgblockedbydisguise
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
resultmessage
waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_ATTACKER
@ -6297,9 +6254,8 @@ BattleScript_MoveUsedPowder::
effectivenesssound
hitanimation BS_ATTACKER
waitstate
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
printstring STRINGID_POWDEREXPLODES
waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_ATTACKER
@ -6487,9 +6443,8 @@ BattleScript_MoveEffectRecoil::
jumpifability BS_ATTACKER, ABILITY_ROCK_HEAD, BattleScript_RecoilEnd
jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_RecoilEnd
BattleScript_DoRecoil::
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
printstring STRINGID_PKMNHITWITHRECOIL
waitmessage B_WAIT_TIME_LONG
tryupdaterecoiltracker
@ -6668,9 +6623,8 @@ BattleScript_AbilityHpHeal:
call BattleScript_AbilityPopUp
printstring STRINGID_PKMNSXRESTOREDHPALITTLE2
waitmessage B_WAIT_TIME_LONG
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
return
BattleScript_RainDishActivates::
@ -6705,10 +6659,9 @@ BattleScript_HarvestActivatesEnd:
end2
BattleScript_SolarPowerActivates::
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
call BattleScript_AbilityPopUp
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
printstring STRINGID_SOLARPOWERHPDROP
waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_ATTACKER
@ -6992,10 +6945,9 @@ BattleScript_HospitalityActivates::
call BattleScript_AbilityPopUp
printstring STRINGID_HOSPITALITYRESTORATION
waitmessage B_WAIT_TIME_LONG
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
playanimation BS_EFFECT_BATTLER, B_ANIM_SIMPLE_HEAL
healthbarupdate BS_EFFECT_BATTLER
datahpupdate BS_EFFECT_BATTLER
healthbarupdate BS_EFFECT_BATTLER, PASSIVE_HP_UPDATE
datahpupdate BS_EFFECT_BATTLER, PASSIVE_HP_UPDATE
end3
BattleScript_AttackWeakenedByStrongWinds::
@ -7097,9 +7049,8 @@ BattleScript_BadDreams_DmgAfterPopUp:
printstring STRINGID_BADDREAMSDMG
waitmessage B_WAIT_TIME_LONG
dmg_1_8_targethp
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE
datahpupdate BS_TARGET, PASSIVE_HP_UPDATE
jumpifhasnohp BS_TARGET, BattleScript_BadDreams_HidePopUp
BattleScript_BadDreamsIncrement:
addbyte gBattlerTarget, 1
@ -7144,9 +7095,8 @@ BattleScript_DampStopsExplosion::
BattleScript_MoveHPDrain::
pause B_WAIT_TIME_SHORT
call BattleScript_AbilityPopUp
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE
datahpupdate BS_TARGET, PASSIVE_HP_UPDATE
printstring STRINGID_PKMNRESTOREDHPUSING
waitmessage B_WAIT_TIME_LONG
setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE
@ -7257,10 +7207,8 @@ BattleScript_MoveUsedPsychicTerrainPrevents::
BattleScript_GrassyTerrainHeals::
printstring STRINGID_GRASSYTERRAINHEALS
waitmessage B_WAIT_TIME_LONG
orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
bicword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
end2
BattleScript_AbilityNoSpecificStatLoss::
@ -7505,9 +7453,8 @@ BattleScript_ImposterActivates::
end3
BattleScript_HurtAttacker:
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
printstring STRINGID_PKMNHURTSWITH
waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_ATTACKER
@ -7529,10 +7476,9 @@ BattleScript_RockyHelmetActivatesDmg:
BattleScript_SpikyShieldEffect::
jumpifabsent BS_ATTACKER, BattleScript_SpikyShieldRet
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
clearmoveresultflags MOVE_RESULT_NO_EFFECT
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
printstring STRINGID_PKMNHURTSWITH
waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_ATTACKER
@ -7541,7 +7487,6 @@ BattleScript_SpikyShieldRet::
return
BattleScript_KingsShieldEffect::
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
clearmoveresultflags MOVE_RESULT_NO_EFFECT
seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_NONE
copybyte sBATTLER, gBattlerTarget
@ -7551,7 +7496,6 @@ BattleScript_KingsShieldEffect::
return
BattleScript_BanefulBunkerEffect::
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
clearmoveresultflags MOVE_RESULT_NO_EFFECT
setnonvolatilestatus TRIGGER_ON_PROTECT
setmoveresultflags MOVE_RESULT_MISSED
@ -7775,9 +7719,8 @@ BattleScript_ItemHealHP_RemoveItemRet_Anim:
playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT
printstring STRINGID_PKMNSITEMRESTOREDHEALTH
waitmessage B_WAIT_TIME_LONG
orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_SCRIPTING
datahpupdate BS_SCRIPTING
healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
removeitem BS_SCRIPTING
return
@ -7790,9 +7733,8 @@ BattleScript_ItemHealHP_RemoveItemEnd2_Anim:
playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT
printstring STRINGID_PKMNSITEMRESTOREDHEALTH
waitmessage B_WAIT_TIME_LONG
orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
removeitem BS_ATTACKER
end2
@ -7833,9 +7775,8 @@ BattleScript_AirBaloonMsgPop::
return
BattleScript_ItemHurtRet::
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
printstring STRINGID_HURTBYITEM
waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_ATTACKER
@ -7851,9 +7792,8 @@ BattleScript_ItemHealHP_Ret::
playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT
printstring STRINGID_PKMNSITEMRESTOREDHPALITTLE
waitmessage B_WAIT_TIME_LONG
orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE
datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE
return
BattleScript_SelectingNotAllowedMoveChoiceItem::
@ -7906,9 +7846,8 @@ BattleScript_BerryConfuseHealEnd2_Anim:
playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT
printstring STRINGID_PKMNSITEMRESTOREDHEALTH
waitmessage B_WAIT_TIME_LONG
orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_SCRIPTING
datahpupdate BS_SCRIPTING
healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
seteffectprimary BS_SCRIPTING, BS_SCRIPTING, MOVE_EFFECT_CONFUSION
removeitem BS_SCRIPTING
end2
@ -7922,9 +7861,8 @@ BattleScript_BerryConfuseHealRet_Anim:
playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT
printstring STRINGID_PKMNSITEMRESTOREDHEALTH
waitmessage B_WAIT_TIME_LONG
orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
healthbarupdate BS_SCRIPTING
datahpupdate BS_SCRIPTING
healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
seteffectprimary BS_SCRIPTING, BS_SCRIPTING, MOVE_EFFECT_CONFUSION
removeitem BS_SCRIPTING
return
@ -8268,8 +8206,8 @@ BattleScript_ZEffectPrintString::
return
BattleScript_RecoverHPZMove::
healthbarupdate BS_SCRIPTING
datahpupdate BS_SCRIPTING
healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
printfromtable gZEffectStringIds
waitmessage B_WAIT_TIME_LONG
return
@ -8288,8 +8226,8 @@ BattleScript_HealReplacementZMove::
playanimation BS_SCRIPTING, B_ANIM_WISH_HEAL, 0x0
printfromtable gZEffectStringIds
waitmessage B_WAIT_TIME_LONG
healthbarupdate BS_SCRIPTING
datahpupdate BS_SCRIPTING
healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
return
BattleScript_EffectExtremeEvoboost::
@ -8759,9 +8697,8 @@ BattleScript_EffectHealOneSixthAllies::
BattleScript_HealOneSixthAlliesLoop:
jumpifabsent BS_TARGET, BattleScript_HealOneSixthAlliesIncrement
tryhealsixthhealth BattleScript_HealOneSixthAlliesIncrement
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE
datahpupdate BS_TARGET, PASSIVE_HP_UPDATE
printstring STRINGID_PKMNREGAINEDHEALTH
waitmessage B_WAIT_TIME_LONG
BattleScript_HealOneSixthAlliesIncrement:

View File

@ -49,9 +49,8 @@ BattleScript_UseItemMessage:
BattleScript_ItemRestoreHPRet:
clearmoveresultflags MOVE_RESULT_NO_EFFECT
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
healthbarupdate BS_SCRIPTING
datahpupdate BS_SCRIPTING
healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE
printstring STRINGID_ITEMRESTOREDSPECIESHEALTH
waitmessage B_WAIT_TIME_LONG
return

View File

@ -761,6 +761,7 @@ struct BattleStruct
u8 pursuitStoredSwitch; // Stored id for the Pursuit target's switch
s32 battlerExpReward;
u16 prevTurnSpecies[MAX_BATTLERS_COUNT]; // Stores species the AI has in play at start of turn
s16 passiveHpUpdate[MAX_BATTLERS_COUNT]; // non-move damage and healing
s16 moveDamage[MAX_BATTLERS_COUNT];
s16 critChance[MAX_BATTLERS_COUNT];
u16 moveResultFlags[MAX_BATTLERS_COUNT];
@ -772,15 +773,14 @@ struct BattleStruct
u8 printedStrongWindsWeakenedAttack:1;
u8 numSpreadTargets:2;
u8 noTargetPresent:1;
u8 cheekPouchActivated:1;
s16 savedcheekPouchDamage; // Cheek Pouch can happen in the middle of an attack execution so we need to store the current dmg
u8 padding1:1;
struct MessageStatus slideMessageStatus;
u8 trainerSlideSpriteIds[MAX_BATTLERS_COUNT];
u8 hazardsQueue[NUM_BATTLE_SIDES][HAZARDS_MAX_COUNT];
u8 numHazards[NUM_BATTLE_SIDES];
u8 hazardsCounter:4; // Counter for applying hazard on switch in
enum SubmoveState submoveAnnouncement:2;
u8 padding1:2;
u8 padding2:2;
};
struct AiBattleData
@ -1234,7 +1234,7 @@ static inline bool32 IsSpreadMove(u32 moveTarget)
static inline bool32 IsDoubleSpreadMove(void)
{
return gBattleStruct->numSpreadTargets > 1
&& !(gHitMarker & (HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE | HITMARKER_UNABLE_TO_USE_MOVE))
&& !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE)
&& IsSpreadMove(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove));
}
@ -1250,4 +1250,18 @@ static inline u32 GetChosenMoveFromPosition(u32 battler)
return gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]];
}
static inline void SetPassiveDamageAmount(u32 battler, s32 value)
{
if (value == 0)
value = 1;
gBattleStruct->passiveHpUpdate[battler] = value;
}
static inline void SetHealAmount(u32 battler, s32 value)
{
if (value == 0)
value = 1;
gBattleStruct->passiveHpUpdate[battler] = -1 * value;
}
#endif // GUARD_BATTLE_H

View File

@ -421,5 +421,6 @@ void RemoveAbilityFlags(u32 battler);
bool32 IsDazzlingAbility(enum Ability ability);
bool32 IsAllowedToUseBag(void);
bool32 IsAnyTargetTurnDamaged(u32 battlerAtk);
bool32 IsMimikyuDisguised(u32 battler);
#endif // GUARD_BATTLE_UTIL_H

View File

@ -237,10 +237,9 @@ enum SemiInvulnerableExclusion
EXCLUDE_COMMANDER,
};
#define HITMARKER_IGNORE_BIDE (1 << 5)
#define HITMARKER_DESTINYBOND (1 << 6)
#define HITMARKER_NO_ANIMATIONS (1 << 7) // set from battleSceneOff. Never changed during battle
#define HITMARKER_IGNORE_SUBSTITUTE (1 << 8)
#define HITMARKER_UNUSED_8 (1 << 8)
#define HITMARKER_ATTACKSTRING_PRINTED (1 << 9)
#define HITMARKER_UNUSED_10 (1 << 10)
#define HITMARKER_UNUSED_11 (1 << 11)
@ -252,7 +251,7 @@ enum SemiInvulnerableExclusion
#define HITMARKER_DISABLE_ANIMATION (1 << 17) // disable animations during battle scripts, e.g. for Bug Bite
#define HITMARKER_UNUSED_18 (1 << 18)
#define HITMARKER_UNABLE_TO_USE_MOVE (1 << 19)
#define HITMARKER_PASSIVE_HP_UPDATE (1 << 20)
#define HITMARKER_UNUSED_20 (1 << 20)
#define HITMARKER_UNUSED_21 (1 << 21)
#define HITMARKER_PLAYER_FAINTED (1 << 22)
#define HITMARKER_UNUSED_23 (1 << 23)

View File

@ -200,4 +200,10 @@ enum TriggerOnFieldStatus
ON_WEATHER,
};
enum HealthUpdate
{
PASSIVE_HP_UPDATE,
MOVE_DAMAGE_HP_UPDATE,
};
#endif // GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H

View File

@ -1423,7 +1423,7 @@ bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move)
{
if (B_STURDY >= GEN_5 && gAiLogicData->abilities[battlerTarget] == ABILITY_STURDY)
return TRUE;
if (gBattleMons[battlerTarget].species == SPECIES_MIMIKYU_DISGUISED)
if (IsMimikyuDisguised(battlerTarget))
return TRUE;
}
@ -5184,7 +5184,7 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove)
if (gBattleMons[battlerDef].ability == ABILITY_DISGUISE
&& !MoveIgnoresTargetAbility(zMove)
&& (gBattleMons[battlerDef].species == SPECIES_MIMIKYU_DISGUISED || gBattleMons[battlerDef].species == SPECIES_MIMIKYU_TOTEM_DISGUISED))
&& IsMimikyuDisguised(battlerDef))
return FALSE; // Don't waste a Z-Move busting disguise
if (gBattleMons[battlerDef].ability == ABILITY_ICE_FACE
&& !MoveIgnoresTargetAbility(zMove)

View File

@ -236,9 +236,7 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler)
&& GetBattlerHoldEffect(battler) != HOLD_EFFECT_SAFETY_GOGGLES
&& !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD))
{
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16;
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 16);
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SANDSTORM;
BattleScriptExecute(BattleScript_DamagingWeather);
effect = TRUE;
@ -261,9 +259,7 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler)
&& GetBattlerHoldEffect(battler) != HOLD_EFFECT_SAFETY_GOGGLES
&& !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD))
{
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16;
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 16);
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_HAIL;
BattleScriptExecute(BattleScript_DamagingWeather);
effect = TRUE;
@ -378,21 +374,22 @@ static bool32 HandleEndTurnWish(u32 battler)
if (gWishFutureKnock.wishCounter[battler] == gBattleTurnCounter && IsBattlerAlive(battler))
{
s32 wishHeal = 0;
gBattlerTarget = battler;
PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, battler, gWishFutureKnock.wishPartyId[battler])
if (B_WISH_HP_SOURCE >= GEN_5)
{
if (IsOnPlayerSide(battler))
gBattleStruct->moveDamage[battler] = max(1, GetMonData(&gPlayerParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2);
wishHeal = GetMonData(&gPlayerParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2;
else
gBattleStruct->moveDamage[battler] = max(1, GetMonData(&gEnemyParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2);
wishHeal = GetMonData(&gEnemyParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2;
}
else
{
gBattleStruct->moveDamage[battler] = max(1, GetNonDynamaxMaxHP(battler) / 2);
wishHeal = GetNonDynamaxMaxHP(battler) / 2;
}
gBattleStruct->moveDamage[battler] *= -1;
SetHealAmount(battler, wishHeal);
if (gBattleMons[battler].volatiles.healBlock)
BattleScriptExecute(BattleScript_WishButHealBlocked);
else if (gBattleMons[battler].hp == gBattleMons[battler].maxHP)
@ -427,8 +424,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler)
if (!IS_BATTLER_OF_TYPE(battler, gSideTimers[side].damageNonTypesType)
&& !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD))
{
gBattlerAttacker = battler;
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 6;
SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 6);
ChooseDamageNonTypesString(gSideTimers[side].damageNonTypesType);
BattleScriptExecute(BattleScript_DamageNonTypesContinues);
effect = TRUE;
@ -440,7 +436,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler)
if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SEA_OF_FIRE)
{
gBattlerAttacker = battler;
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8;
SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8);
BtlController_EmitStatusAnimation(battler, B_COMM_TO_CONTROLLER, FALSE, STATUS1_BURN);
MarkBattlerForControllerExec(battler);
BattleScriptExecute(BattleScript_HurtByTheSeaOfFire);
@ -478,10 +474,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler)
&& !IsSemiInvulnerable(battler, CHECK_ALL)
&& IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler)))
{
gBattlerAttacker = battler;
gBattleStruct->moveDamage[battler] = -(GetNonDynamaxMaxHP(battler) / 16);
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = -1;
SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 16);
BattleScriptExecute(BattleScript_GrassyTerrainHeals);
effect = TRUE;
}
@ -526,7 +519,7 @@ static bool32 HandleEndTurnAquaRing(u32 battler)
&& !IsBattlerAtMaxHp(battler)
&& IsBattlerAlive(battler))
{
gBattleStruct->moveDamage[battler] = GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16);
SetHealAmount(battler, GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16));
BattleScriptExecute(BattleScript_AquaRingHeal);
effect = TRUE;
}
@ -545,7 +538,7 @@ static bool32 HandleEndTurnIngrain(u32 battler)
&& !IsBattlerAtMaxHp(battler)
&& IsBattlerAlive(battler))
{
gBattleStruct->moveDamage[battler] = GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16);
SetHealAmount(battler, GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16));
BattleScriptExecute(BattleScript_IngrainTurnHeal);
effect = TRUE;
}
@ -567,12 +560,12 @@ static bool32 HandleEndTurnLeechSeed(u32 battler)
gBattlerTarget = gBattleMons[battler].volatiles.leechSeed - 1; // leech seed receiver
gBattleScripting.animArg1 = gBattlerTarget;
gBattleScripting.animArg2 = gBattlerAttacker;
gBattleStruct->moveDamage[gBattlerAttacker] = max(1, GetNonDynamaxMaxHP(battler) / 8);
gBattleStruct->moveDamage[gBattlerTarget] = GetDrainedBigRootHp(gBattlerTarget, gBattleStruct->moveDamage[gBattlerAttacker]);
gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE;
s32 drainAmount = GetNonDynamaxMaxHP(gBattlerAttacker) / 8;
s32 healAmount = GetDrainedBigRootHp(gBattlerTarget, drainAmount);
if (GetBattlerAbility(battler) == ABILITY_LIQUID_OOZE)
{
gBattleStruct->moveDamage[gBattlerTarget] = gBattleStruct->moveDamage[gBattlerTarget] * -1;
SetPassiveDamageAmount(gBattlerAttacker, drainAmount);
SetPassiveDamageAmount(gBattlerTarget, healAmount);
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_OOZE;
BattleScriptExecute(BattleScript_LeechSeedTurnDrainLiquidOoze);
}
@ -582,6 +575,8 @@ static bool32 HandleEndTurnLeechSeed(u32 battler)
}
else
{
SetPassiveDamageAmount(gBattlerAttacker, drainAmount);
SetHealAmount(gBattlerTarget, healAmount);
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_DRAIN;
BattleScriptExecute(BattleScript_LeechSeedTurnDrainRecovery);
}
@ -607,30 +602,23 @@ static bool32 HandleEndTurnPoison(u32 battler)
{
if (!IsBattlerAtMaxHp(battler) && !gBattleMons[battler].volatiles.healBlock)
{
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8;
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
gBattleStruct->moveDamage[battler] *= -1;
SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 8);
BattleScriptExecute(BattleScript_PoisonHealActivates);
effect = TRUE;
}
}
else if (gBattleMons[battler].status1 & STATUS1_TOXIC_POISON)
{
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16;
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 16);
if ((gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_TURN(15)) // not 16 turns
gBattleMons[battler].status1 += STATUS1_TOXIC_TURN(1);
gBattleStruct->moveDamage[battler] *= (gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) >> 8;
gBattleStruct->passiveHpUpdate[battler] *= (gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) >> 8;
BattleScriptExecute(BattleScript_PoisonTurnDmg);
effect = TRUE;
}
else
{
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8;
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8);
BattleScriptExecute(BattleScript_PoisonTurnDmg);
effect = TRUE;
}
@ -651,15 +639,14 @@ static bool32 HandleEndTurnBurn(u32 battler)
&& IsBattlerAlive(battler)
&& !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD))
{
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8);
s32 burnDamage = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8);
if (ability == ABILITY_HEATPROOF)
{
if (gBattleStruct->moveDamage[battler] > (gBattleStruct->moveDamage[battler] / 2) + 1) // Record ability if the burn takes less damage than it normally would.
if (burnDamage > (burnDamage / 2) + 1) // Record ability if the burn takes less damage than it normally would.
RecordAbilityBattle(battler, ABILITY_HEATPROOF);
gBattleStruct->moveDamage[battler] /= 2;
burnDamage /= 2;
}
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
SetPassiveDamageAmount(battler, burnDamage);
BattleScriptExecute(BattleScript_BurnTurnDmg);
effect = TRUE;
}
@ -677,9 +664,7 @@ static bool32 HandleEndTurnFrostbite(u32 battler)
&& IsBattlerAlive(battler)
&& !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD))
{
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8);
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8));
BattleScriptExecute(BattleScript_FrostbiteTurnDmg);
effect = TRUE;
}
@ -699,9 +684,7 @@ static bool32 HandleEndTurnNightmare(u32 battler)
{
if (gBattleMons[battler].status1 & STATUS1_SLEEP)
{
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4;
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 4);
BattleScriptExecute(BattleScript_NightmareTurnDmg);
effect = TRUE;
}
@ -724,9 +707,7 @@ static bool32 HandleEndTurnCurse(u32 battler)
&& IsBattlerAlive(battler)
&& !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD))
{
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4;
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 4);
BattleScriptExecute(BattleScript_CurseTurnDmg);
effect = TRUE;
}
@ -752,13 +733,12 @@ static bool32 HandleEndTurnWrap(u32 battler)
gBattleScripting.animArg2 = gBattleStruct->wrappedMove[battler] >> 8;
PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[battler]);
BattleScriptExecute(BattleScript_WrapTurnDmg);
s32 bindDamage = 0;
if (GetBattlerHoldEffect(gBattleStruct->wrappedBy[battler]) == HOLD_EFFECT_BINDING_BAND)
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8);
bindDamage = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8);
else
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16);
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
bindDamage = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16);
SetPassiveDamageAmount(battler, bindDamage);
}
else // broke free
{
@ -782,12 +762,12 @@ static bool32 HandleEndTurnSaltCure(u32 battler)
&& IsBattlerAlive(battler)
&& !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD))
{
s32 saltCureDamage = 0;
if (IS_BATTLER_ANY_TYPE(battler, TYPE_STEEL, TYPE_WATER))
gBattleStruct->moveDamage[battler] = gBattleMons[battler].maxHP / 4;
saltCureDamage = gBattleMons[battler].maxHP / 4;
else
gBattleStruct->moveDamage[battler] = gBattleMons[battler].maxHP / 8;
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
saltCureDamage = gBattleMons[battler].maxHP / 8;
SetPassiveDamageAmount(battler, saltCureDamage);
PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SALT_CURE);
BattleScriptExecute(BattleScript_SaltCureExtraDamage);
effect = TRUE;
@ -1065,7 +1045,7 @@ static bool32 HandleEndTurnPerishSong(u32 battler)
if (gDisableStructs[battler].perishSongTimer == 0)
{
gBattleMons[battler].volatiles.perishSong = FALSE;
gBattleStruct->moveDamage[battler] = gBattleMons[battler].hp;
SetPassiveDamageAmount(battler, gBattleMons[battler].hp);
BattleScriptExecute(BattleScript_PerishSongTakesLife);
}
else
@ -1560,7 +1540,7 @@ static bool32 (*const sEndTurnEffectHandlers[])(u32 battler) =
u32 DoEndTurnEffects(void)
{
u32 battler = MAX_BATTLERS_COUNT;
gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE);
gHitMarker |= HITMARKER_GRUDGE;
for (;;)
{
@ -1576,7 +1556,7 @@ u32 DoEndTurnEffects(void)
// Jump out if possible after endTurnEventsCounter was increased in the above code block
if (gBattleStruct->endTurnEventsCounter == ENDTURN_COUNT)
{
gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE);
gHitMarker &= ~HITMARKER_GRUDGE;
return FALSE;
}

View File

@ -266,9 +266,7 @@ static enum ItemEffect TryRockyHelmet(u32 battlerDef, u32 battlerAtk)
&& !CanBattlerAvoidContactEffects(battlerAtk, battlerDef, ability, GetBattlerHoldEffect(battlerAtk), gCurrentMove)
&& !IsAbilityAndRecord(battlerAtk, ability, ABILITY_MAGIC_GUARD))
{
gBattleStruct->moveDamage[battlerAtk] = GetNonDynamaxMaxHP(battlerAtk) / 6;
if (gBattleStruct->moveDamage[battlerAtk] == 0)
gBattleStruct->moveDamage[battlerAtk] = 1;
SetPassiveDamageAmount(battlerAtk, GetNonDynamaxMaxHP(battlerAtk) / 6);
PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[battlerDef].item);
BattleScriptCall(BattleScript_RockyHelmetActivates);
effect = ITEM_HP_CHANGE;
@ -366,12 +364,10 @@ static enum ItemEffect TryJabocaBerry(u32 battlerDef, u32 battlerAtk)
&& IsBattleMovePhysical(gCurrentMove)
&& !IsAbilityAndRecord(battlerAtk, GetBattlerAbility(battlerAtk), ABILITY_MAGIC_GUARD))
{
gBattleStruct->moveDamage[battlerAtk] = GetNonDynamaxMaxHP(battlerAtk) / 8;
if (gBattleStruct->moveDamage[battlerAtk] == 0)
gBattleStruct->moveDamage[battlerAtk] = 1;
s32 jabocaDamage = GetNonDynamaxMaxHP(battlerAtk) / 8;
if (GetBattlerAbility(battlerDef) == ABILITY_RIPEN)
gBattleStruct->moveDamage[gBattlerAttacker] *= 2;
jabocaDamage *= 2;
SetPassiveDamageAmount(battlerAtk, jabocaDamage);
BattleScriptCall(BattleScript_JabocaRowapBerryActivates);
PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[battlerDef].item);
effect = ITEM_HP_CHANGE;
@ -390,12 +386,10 @@ static enum ItemEffect TryRowapBerry(u32 battlerDef, u32 battlerAtk)
&& IsBattleMoveSpecial(gCurrentMove)
&& !IsAbilityAndRecord(battlerAtk, GetBattlerAbility(battlerAtk), ABILITY_MAGIC_GUARD))
{
gBattleStruct->moveDamage[battlerAtk] = GetNonDynamaxMaxHP(battlerAtk) / 8;
if (gBattleStruct->moveDamage[battlerAtk] == 0)
gBattleStruct->moveDamage[battlerAtk] = 1;
s32 rowapDamage = GetNonDynamaxMaxHP(battlerAtk) / 8;
if (GetBattlerAbility(battlerDef) == ABILITY_RIPEN)
gBattleStruct->moveDamage[battlerAtk] *= 2;
rowapDamage *= 2;
SetPassiveDamageAmount(battlerAtk, rowapDamage);
BattleScriptCall(BattleScript_JabocaRowapBerryActivates);
PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[battlerDef].item);
effect = ITEM_HP_CHANGE;
@ -414,10 +408,10 @@ static enum ItemEffect TrySetEnigmaBerry(u32 battlerDef, u32 battlerAtk)
&& !(gBattleScripting.overrideBerryRequirements && gBattleMons[battlerDef].hp == gBattleMons[battlerDef].maxHP)
&& !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battlerDef].volatiles.healBlock))
{
gBattleStruct->moveDamage[battlerDef] = (gBattleMons[battlerDef].maxHP * 25 / 100) * -1;
s32 healAmount = gBattleMons[battlerDef].maxHP * 25 / 100;
if (GetBattlerAbility(battlerDef) == ABILITY_RIPEN)
gBattleStruct->moveDamage[battlerDef] *= 2;
healAmount *= 2;
SetHealAmount(battlerDef, healAmount);
BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet);
effect = ITEM_HP_CHANGE;
}
@ -560,9 +554,7 @@ static enum ItemEffect TryShellBell(u32 battlerAtk)
&& !IsFutureSightAttackerInParty(battlerAtk, gBattlerTarget, gCurrentMove)
&& !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battlerAtk].volatiles.healBlock))
{
gBattleStruct->moveDamage[battlerAtk] = (gBattleScripting.savedDmg / GetBattlerHoldEffectParam(battlerAtk)) * -1;
if (gBattleStruct->moveDamage[battlerAtk] == 0)
gBattleStruct->moveDamage[battlerAtk] = -1;
SetHealAmount(battlerAtk, gBattleScripting.savedDmg / GetBattlerHoldEffectParam(battlerAtk));
BattleScriptCall(BattleScript_ItemHealHP_Ret);
effect = ITEM_HP_CHANGE;
}
@ -581,10 +573,7 @@ static enum ItemEffect TryLifeOrb(u32 battlerAtk)
&& GetMoveEffect(gCurrentMove) != EFFECT_PAIN_SPLIT
&& !IsFutureSightAttackerInParty(battlerAtk, gBattlerTarget, gCurrentMove))
{
DebugPrintf("move %d", gCurrentMove);
gBattleStruct->moveDamage[battlerAtk] = GetNonDynamaxMaxHP(battlerAtk) / 10;
if (gBattleStruct->moveDamage[battlerAtk] == 0)
gBattleStruct->moveDamage[battlerAtk] = 1;
SetPassiveDamageAmount(battlerAtk, GetNonDynamaxMaxHP(battlerAtk) / 10);
BattleScriptCall(BattleScript_ItemHurtRet);
effect = ITEM_HP_CHANGE;
}
@ -619,9 +608,7 @@ static enum ItemEffect TryStickyBarbOnEndTurn(u32 battler)
if (!IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD))
{
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8;
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8);
PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[battler].item);
BattleScriptExecute(BattleScript_ItemHurtEnd2);
effect = ITEM_HP_CHANGE;
@ -667,10 +654,7 @@ static enum ItemEffect TryLeftovers(u32 battler, enum HoldEffect holdEffect)
if (gBattleMons[battler].hp < gBattleMons[battler].maxHP
&& !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battler].volatiles.healBlock))
{
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16;
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
gBattleStruct->moveDamage[battler] *= -1;
SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 16);
RecordItemEffectBattle(battler, holdEffect);
BattleScriptExecute(BattleScript_ItemHealHP_End2);
effect = ITEM_HP_CHANGE;
@ -679,15 +663,13 @@ static enum ItemEffect TryLeftovers(u32 battler, enum HoldEffect holdEffect)
return effect;
}
static enum ItemEffect TryBlackSludge(u32 battler, enum HoldEffect holdEffect)
static enum ItemEffect TryBlackSludgeDamage(u32 battler, enum HoldEffect holdEffect)
{
enum ItemEffect effect = ITEM_NO_EFFECT;
if (!IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD))
{
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8;
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8);
RecordItemEffectBattle(battler, holdEffect);
BattleScriptExecute(BattleScript_ItemHurtEnd2);
effect = ITEM_HP_CHANGE;
@ -885,14 +867,16 @@ static u32 ItemHealHp(u32 battler, u32 itemId, enum HealAmount percentHeal, Acti
&& !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battler].volatiles.healBlock)
&& HasEnoughHpToEatBerry(battler, ability, 2, itemId))
{
s32 healAmount = 0;
if (percentHeal == PERCENT_HEAL_AMOUNT)
gBattleStruct->moveDamage[battler] = (GetNonDynamaxMaxHP(battler) * GetItemHoldEffectParam(itemId) / 100) * -1;
healAmount = (GetNonDynamaxMaxHP(battler) * GetItemHoldEffectParam(itemId) / 100);
else
gBattleStruct->moveDamage[battler] = GetItemHoldEffectParam(itemId) * -1;
healAmount = GetItemHoldEffectParam(itemId);
if (ability == ABILITY_RIPEN && GetItemPocket(itemId) == POCKET_BERRIES)
gBattleStruct->moveDamage[battler] *= 2;
healAmount *= 2;
SetHealAmount(battler, healAmount);
if (timing == IsOnSwitchInFirstTurnActivation)
BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2);
else
@ -958,16 +942,10 @@ static enum ItemEffect HealConfuseBerry(u32 battler, u32 itemId, u32 flavorId, A
if (HasEnoughHpToEatBerry(battler, ability, hpFraction, itemId)
&& !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battler].volatiles.healBlock))
{
PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavorId);
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / GetItemHoldEffectParam(itemId);
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
gBattleStruct->moveDamage[battler] *= -1;
s32 healAmount = GetNonDynamaxMaxHP(battler) / GetItemHoldEffectParam(itemId);
if (ability == ABILITY_RIPEN)
gBattleStruct->moveDamage[battler] *= 2;
healAmount *= 2;
SetHealAmount(battler, healAmount);
if (timing == IsOnSwitchInFirstTurnActivation)
{
if (GetFlavorRelationByPersonality(gBattleMons[battler].personality, flavorId) < 0)
@ -982,7 +960,7 @@ static enum ItemEffect HealConfuseBerry(u32 battler, u32 itemId, u32 flavorId, A
else
BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet);
}
PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavorId);
effect = ITEM_HP_CHANGE;
}
@ -1200,7 +1178,7 @@ enum ItemEffect ItemBattleEffects(u32 itemBattler, u32 battler, enum HoldEffect
if (IS_BATTLER_OF_TYPE(itemBattler, TYPE_POISON))
effect = TryLeftovers(itemBattler, holdEffect);
else
effect = TryBlackSludge(itemBattler, holdEffect);
effect = TryBlackSludgeDamage(itemBattler, holdEffect);
break;
case HOLD_EFFECT_CURE_PAR: // Cheri Berry
effect = TryCureParalysis(itemBattler, timing);

View File

@ -4023,7 +4023,6 @@ void BattleTurnPassed(void)
gHitMarker &= ~HITMARKER_UNABLE_TO_USE_MOVE;
gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED;
gHitMarker &= ~HITMARKER_PLAYER_FAINTED;
gHitMarker &= ~HITMARKER_PASSIVE_HP_UPDATE;
gBattleScripting.animTurn = 0;
gBattleScripting.animTargetsHit = 0;
gBattleScripting.moveendState = 0;
@ -5416,7 +5415,6 @@ static void RunTurnActionsFunctions(void)
if (gCurrentTurnActionNumber >= gBattlersCount) // everyone did their actions, turn finished
{
gHitMarker &= ~HITMARKER_PASSIVE_HP_UPDATE;
gBattleMainFunc = sEndTurnFuncsTable[gBattleOutcome & 0x7F];
}
else

File diff suppressed because it is too large Load Diff

View File

@ -914,9 +914,7 @@ void HandleAction_NothingIsFainted(void)
gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE;
gHitMarker &= ~(HITMARKER_DESTINYBOND
| HITMARKER_ATTACKSTRING_PRINTED
| HITMARKER_IGNORE_SUBSTITUTE
| HITMARKER_STATUS_ABILITY_EFFECT
| HITMARKER_PASSIVE_HP_UPDATE
| HITMARKER_OBEYS);
}
@ -929,10 +927,8 @@ void HandleAction_ActionFinished(void)
gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber];
memset(&gSpecialStatuses, 0, sizeof(gSpecialStatuses));
gHitMarker &= ~(HITMARKER_DESTINYBOND
| HITMARKER_IGNORE_SUBSTITUTE
| HITMARKER_ATTACKSTRING_PRINTED
| HITMARKER_STATUS_ABILITY_EFFECT
| HITMARKER_PASSIVE_HP_UPDATE
| HITMARKER_OBEYS);
ClearDamageCalcResults();
@ -1790,7 +1786,7 @@ void TryToRevertMimicryAndFlags(void)
bool32 BattleArenaTurnEnd(void)
{
gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE);
gHitMarker |= HITMARKER_GRUDGE;
if ((gBattleTypeFlags & BATTLE_TYPE_ARENA)
&& gBattleStruct->arenaTurnCounter == 2
@ -1804,7 +1800,7 @@ bool32 BattleArenaTurnEnd(void)
return TRUE;
}
gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE);
gHitMarker &= ~HITMARKER_GRUDGE;
return FALSE;
}
@ -1817,7 +1813,7 @@ s32 GetDrainedBigRootHp(u32 battler, s32 hp)
if (hp == 0)
hp = 1;
return hp * -1;
return hp;
}
// Should always be the last check. Otherwise the ability might be wrongly recorded.
@ -2258,7 +2254,7 @@ static enum MoveCanceller CancellerConfused(struct BattleContext *ctx)
dmgCtx.randomFactor = FALSE;
dmgCtx.updateFlags = TRUE;
dmgCtx.fixedBasePower = 40;
gBattleStruct->moveDamage[ctx->battlerAtk] = CalculateMoveDamage(&dmgCtx);
gBattleStruct->passiveHpUpdate[ctx->battlerAtk] = CalculateMoveDamage(&dmgCtx);
gProtectStructs[ctx->battlerAtk].confusionSelfDmg = TRUE;
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused;
@ -2735,7 +2731,7 @@ static enum MoveCanceller CancellerPowderStatus(struct BattleContext *ctx)
if (TryActivatePowderStatus(ctx->currentMove))
{
if (!IsAbilityAndRecord(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ABILITY_MAGIC_GUARD))
gBattleStruct->moveDamage[ctx->battlerAtk] = GetNonDynamaxMaxHP(ctx->battlerAtk) / 4;
SetPassiveDamageAmount(ctx->battlerAtk, GetNonDynamaxMaxHP(ctx->battlerAtk) / 4);
// This might be incorrect
if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE
@ -3543,10 +3539,7 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, enum Ability ability
else
{
battleScript = BattleScript_MoveHPDrain;
gBattleStruct->moveDamage[battlerDef] = GetNonDynamaxMaxHP(battlerDef) / 4;
if (gBattleStruct->moveDamage[battlerDef] == 0)
gBattleStruct->moveDamage[battlerDef] = 1;
gBattleStruct->moveDamage[battlerDef] *= -1;
SetHealAmount(battlerDef, GetNonDynamaxMaxHP(battlerDef) / 4);
}
break;
case MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY:
@ -4459,7 +4452,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec
{
gEffectBattler = partner;
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
gBattleStruct->moveDamage[partner] = (GetNonDynamaxMaxHP(partner) / 4) * -1;
SetHealAmount(partner, GetNonDynamaxMaxHP(partner) / 4);
BattleScriptPushCursorAndCallback(BattleScript_HospitalityActivates);
effect++;
}
@ -4575,10 +4568,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec
&& !gBattleMons[battler].volatiles.healBlock)
{
BattleScriptExecute(BattleScript_IceBodyHeal);
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16;
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
gBattleStruct->moveDamage[battler] *= -1;
SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 16);
effect++;
}
break;
@ -4591,11 +4581,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec
&& !IsBattlerAtMaxHp(battler)
&& !gBattleMons[battler].volatiles.healBlock)
{
s32 healAmount = gLastUsedAbility == ABILITY_RAIN_DISH ? 16 : 8;
SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / healAmount);
BattleScriptExecute(BattleScript_RainDishActivates);
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (gLastUsedAbility == ABILITY_RAIN_DISH ? 16 : 8);
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
gBattleStruct->moveDamage[battler] *= -1;
effect++;
}
break;
@ -4694,10 +4682,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec
if (IsBattlerWeatherAffected(battler, B_WEATHER_SUN))
{
SOLAR_POWER_HP_DROP:
SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8);
BattleScriptExecute(BattleScript_SolarPowerActivates);
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8;
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
effect++;
}
break;
@ -4985,9 +4971,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec
&& IsBattlerTurnDamaged(gBattlerTarget)
&& !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move))
{
gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / (B_ROUGH_SKIN_DMG >= GEN_4 ? 8 : 16);
if (gBattleStruct->moveDamage[gBattlerAttacker] == 0)
gBattleStruct->moveDamage[gBattlerAttacker] = 1;
SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / (B_ROUGH_SKIN_DMG >= GEN_4 ? 8 : 16));
PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility);
BattleScriptCall(BattleScript_RoughSkinActivates);
effect++;
@ -5007,9 +4991,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec
else
{
gBattleScripting.battler = gBattlerTarget;
gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4;
if (gBattleStruct->moveDamage[gBattlerAttacker] == 0)
gBattleStruct->moveDamage[gBattlerAttacker] = 1;
SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 4);
BattleScriptCall(BattleScript_AftermathDmg);
}
effect++;
@ -5025,7 +5007,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec
break;
gBattleScripting.battler = gBattlerTarget;
gBattleStruct->moveDamage[gBattlerAttacker] = gBattleStruct->moveDamage[gBattlerTarget];
SetPassiveDamageAmount(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerTarget]);
BattleScriptCall(BattleScript_AftermathDmg);
effect++;
}
@ -5225,12 +5207,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec
&& IsBattlerAlive(gBattlerAttacker)
&& gBattleMons[gBattlerTarget].species != SPECIES_CRAMORANT)
{
if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD)
{
gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4;
if (gBattleStruct->moveDamage[gBattlerAttacker] == 0)
gBattleStruct->moveDamage[gBattlerAttacker] = 1;
}
if (!IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD))
SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 4);
switch(gBattleMons[gBattlerTarget].species)
{
@ -10966,3 +10944,9 @@ bool32 IsAllowedToUseBag(void)
return TRUE; // Undefined Behavior
}
}
bool32 IsMimikyuDisguised(u32 battler)
{
return gBattleMons[battler].species == SPECIES_MIMIKYU_DISGUISED
|| gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED;
}

View File

@ -506,7 +506,7 @@ void SetZEffect(void)
case Z_EFFECT_RECOVER_HP:
if (gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP)
{
gBattleStruct->moveDamage[gBattlerAttacker] = (-1) * gBattleMons[gBattlerAttacker].maxHP;
SetHealAmount(gBattlerAttacker, gBattleMons[gBattlerAttacker].maxHP);
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_Z_RECOVER_HP;
BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH);
gBattlescriptCurrInstr = BattleScript_RecoverHPZMove;