Simultaneous HP Reduction (CFRU Port) (#5770)

This commit is contained in:
Bassoonian 2024-12-04 19:21:51 +01:00 committed by GitHub
commit 7c10e024ac
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
40 changed files with 2138 additions and 1232 deletions

View File

@ -356,7 +356,7 @@
.byte 0x3a .byte 0x3a
.endm .endm
.macro healthbar_update battler:req .macro absorbhealthbarupdate battler:req
.byte 0x3b .byte 0x3b
.byte \battler .byte \battler
.endm .endm
@ -832,7 +832,7 @@
.byte 0x94 .byte 0x94
.endm .endm
.macro unused_95 .macro copybidedmg
.byte 0x95 .byte 0x95
.endm .endm
@ -1230,11 +1230,11 @@
.byte 0xe5 .byte 0xe5
.endm .endm
.macro unused3 .macro unused_0xE6
.byte 0xe6 .byte 0xe6
.endm .endm
.macro unused4 .macro unused_0xE7
.byte 0xe7 .byte 0xe7
.endm .endm
@ -1764,6 +1764,27 @@
callnative BS_RemoveTerrain callnative BS_RemoveTerrain
.endm .endm
.macro setmoveresultflags flags:req
callnative BS_SetMoveResultFlags
.2byte \flags
.endm
.macro clearmoveresultflags flags:req
callnative BS_ClearMoveResultFlags
.2byte \flags
.endm
.macro jumpifmoveresultflags flags:req failInstr:req
callnative BS_JumpIfMoveResultFlags
.2byte \flags
.4byte \failInstr
.endm
.macro jumpifcriticalhit failInstr:req
callnative BS_JumpIfCriticalHit
.4byte \failInstr
.endm
@ various command changed to more readable macros @ various command changed to more readable macros
.macro cancelmultiturnmoves battler:req .macro cancelmultiturnmoves battler:req
various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES
@ -2404,7 +2425,7 @@
.endm .endm
.macro jumpifmovehadnoeffect jumpInstr:req .macro jumpifmovehadnoeffect jumpInstr:req
jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_NO_EFFECT, \jumpInstr jumpifmoveresultflags MOVE_RESULT_NO_EFFECT, \jumpInstr
.endm .endm
.macro jumpifside battler:req, side:req, equalJumpInstr:req .macro jumpifside battler:req, side:req, equalJumpInstr:req

View File

@ -411,6 +411,7 @@ B_ATK_TEAM2 = FD 38
B_DEF_NAME = FD 39 B_DEF_NAME = FD 39
B_DEF_TEAM1 = FD 3A B_DEF_TEAM1 = FD 3A
B_DEF_TEAM2 = FD 3B B_DEF_TEAM2 = FD 3B
B_DEF_PARTNER_NAME = FD 3C
@ FD 3C - preiously gActiveBattler @ FD 3C - preiously gActiveBattler
@ FD 3D - preiously gActiveBattler without Illusion Check @ FD 3D - preiously gActiveBattler without Illusion Check
B_ATK_NAME_WITH_PREFIX2 = FD 3E B_ATK_NAME_WITH_PREFIX2 = FD 3E

View File

@ -26,7 +26,7 @@ BattleScript_DamageToQuarterTargetHP::
attackstring attackstring
ppreduce ppreduce
typecalc typecalc
bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE
damagetoquartertargethp damagetoquartertargethp
goto BattleScript_HitFromAtkAnimation goto BattleScript_HitFromAtkAnimation
@ -205,7 +205,7 @@ BattleScript_FilletAwayTrySpeed::
printfromtable gStatUpStringIds printfromtable gStatUpStringIds
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
BattleScript_FilletAwayEnd:: BattleScript_FilletAwayEnd::
bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT clearmoveresultflags MOVE_RESULT_NO_EFFECT
healthbarupdate BS_ATTACKER healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER datahpupdate BS_ATTACKER
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
@ -238,7 +238,7 @@ BattleScript_EffectDoodle_AfterCopy:
BattleScript_EffectGlaiveRush:: BattleScript_EffectGlaiveRush::
call BattleScript_EffectHit_Ret call BattleScript_EffectHit_Ret
jumpifhalfword CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_TryFaintMon jumpifmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_TryFaintMon
setglaiverush setglaiverush
goto BattleScript_TryFaintMon goto BattleScript_TryFaintMon
@ -434,7 +434,7 @@ BattleScript_EffectCorrosiveGas::
BattleScript_CorrosiveGasFail: BattleScript_CorrosiveGasFail:
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
printstring STRINGID_NOEFFECTONTARGET printstring STRINGID_NOEFFECTONTARGET
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
@ -717,7 +717,7 @@ BattleScript_SkyDropFlyingType:
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_SkyDropChangedTarget: BattleScript_SkyDropChangedTarget:
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
resultmessage resultmessage
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
makevisible BS_ATTACKER makevisible BS_ATTACKER
@ -1797,7 +1797,7 @@ BattleScript_EffectFinalGambit::
ppreduce ppreduce
critcalc critcalc
typecalc typecalc
bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE
dmgtocurrattackerhp dmgtocurrattackerhp
adjustdamage adjustdamage
attackanimation attackanimation
@ -1809,13 +1809,13 @@ BattleScript_EffectFinalGambit::
datahpupdate BS_TARGET datahpupdate BS_TARGET
resultmessage resultmessage
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
dmgtocurrattackerhp
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
setadditionaleffects setadditionaleffects
tryfaintmon BS_ATTACKER
tryfaintmon BS_TARGET tryfaintmon BS_TARGET
jumpifmovehadnoeffect BattleScript_MoveEnd jumpifmovehadnoeffect BattleScript_MoveEnd
setatkhptozero
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
tryfaintmon BS_ATTACKER
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_EffectHitSwitchTarget:: BattleScript_EffectHitSwitchTarget::
@ -2384,7 +2384,7 @@ BattleScript_EffectMetalBurst::
attackstring attackstring
ppreduce ppreduce
typecalc typecalc
bichalfword gMoveResultFlags, MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE
adjustdamage adjustdamage
goto BattleScript_HitFromAtkAnimation goto BattleScript_HitFromAtkAnimation
@ -2859,7 +2859,7 @@ BattleScript_EffectNaturalGiftEnd:
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_MakeMoveMissed:: BattleScript_MakeMoveMissed::
orhalfword gMoveResultFlags, MOVE_RESULT_MISSED setmoveresultflags MOVE_RESULT_MISSED
BattleScript_PrintMoveMissed:: BattleScript_PrintMoveMissed::
attackstring attackstring
ppreduce ppreduce
@ -2912,14 +2912,14 @@ BattleScript_ElectricTerrainPrevents::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
printstring STRINGID_ELECTRICTERRAINPREVENTS printstring STRINGID_ELECTRICTERRAINPREVENTS
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_MistyTerrainPrevents:: BattleScript_MistyTerrainPrevents::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
printstring STRINGID_MISTYTERRAINPREVENTS printstring STRINGID_MISTYTERRAINPREVENTS
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_FlowerVeilProtectsRet:: BattleScript_FlowerVeilProtectsRet::
@ -2931,7 +2931,7 @@ BattleScript_FlowerVeilProtectsRet::
BattleScript_FlowerVeilProtects: BattleScript_FlowerVeilProtects:
call BattleScript_FlowerVeilProtectsRet call BattleScript_FlowerVeilProtectsRet
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_SweetVeilProtectsRet:: BattleScript_SweetVeilProtectsRet::
@ -2943,7 +2943,7 @@ BattleScript_SweetVeilProtectsRet::
BattleScript_SweetVeilProtects: BattleScript_SweetVeilProtects:
call BattleScript_SweetVeilProtectsRet call BattleScript_SweetVeilProtectsRet
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_AromaVeilProtectsRet:: BattleScript_AromaVeilProtectsRet::
@ -2955,7 +2955,7 @@ BattleScript_AromaVeilProtectsRet::
BattleScript_AromaVeilProtects: BattleScript_AromaVeilProtects:
call BattleScript_AromaVeilProtectsRet call BattleScript_AromaVeilProtectsRet
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_PastelVeilProtectsRet:: BattleScript_PastelVeilProtectsRet::
@ -2967,7 +2967,7 @@ BattleScript_PastelVeilProtectsRet::
BattleScript_PastelVeilProtects: BattleScript_PastelVeilProtects:
call BattleScript_PastelVeilProtectsRet call BattleScript_PastelVeilProtectsRet
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_AbilityProtectsDoesntAffectRet:: BattleScript_AbilityProtectsDoesntAffectRet::
@ -2979,7 +2979,7 @@ BattleScript_AbilityProtectsDoesntAffectRet::
BattleScript_AbilityProtectsDoesntAffect: BattleScript_AbilityProtectsDoesntAffect:
call BattleScript_AbilityProtectsDoesntAffectRet call BattleScript_AbilityProtectsDoesntAffectRet
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_InsomniaProtects: BattleScript_InsomniaProtects:
@ -2987,7 +2987,7 @@ BattleScript_InsomniaProtects:
call BattleScript_AbilityPopUp call BattleScript_AbilityPopUp
printstring STRINGID_PKMNSTAYEDAWAKEUSING printstring STRINGID_PKMNSTAYEDAWAKEUSING
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_AlreadyAsleep:: BattleScript_AlreadyAsleep::
@ -2995,21 +2995,21 @@ BattleScript_AlreadyAsleep::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
printstring STRINGID_PKMNALREADYASLEEP printstring STRINGID_PKMNALREADYASLEEP
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_WasntAffected:: BattleScript_WasntAffected::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
printstring STRINGID_PKMNWASNTAFFECTED printstring STRINGID_PKMNWASNTAFFECTED
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_CantMakeAsleep:: BattleScript_CantMakeAsleep::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
printfromtable gUproarAwakeStringIds printfromtable gUproarAwakeStringIds
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_EffectAbsorbLiquidOoze:: BattleScript_EffectAbsorbLiquidOoze::
@ -3017,11 +3017,12 @@ BattleScript_EffectAbsorbLiquidOoze::
goto BattleScript_EffectAbsorb goto BattleScript_EffectAbsorb
BattleScript_EffectAbsorb:: BattleScript_EffectAbsorb::
healthbarupdate BS_ATTACKER absorbhealthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER datahpupdate BS_ATTACKER
printfromtable gAbsorbDrainStringIds printfromtable gAbsorbDrainStringIds
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_ATTACKER tryfaintmon BS_ATTACKER
bicword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_PASSIVE_DAMAGE
return return
BattleScript_EffectExplosion:: BattleScript_EffectExplosion::
@ -3093,7 +3094,7 @@ BattleScript_EffectMirrorMove::
pause B_WAIT_TIME_LONG pause B_WAIT_TIME_LONG
trymirrormove trymirrormove
ppreduce ppreduce
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
printstring STRINGID_MIRRORMOVEFAILED printstring STRINGID_MIRRORMOVEFAILED
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
@ -3432,7 +3433,7 @@ BattleScript_EffectSuperFang::
attackstring attackstring
ppreduce ppreduce
typecalc typecalc
bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE
damagetohalftargethp damagetohalftargethp
goto BattleScript_HitFromAtkAnimation goto BattleScript_HitFromAtkAnimation
@ -3441,7 +3442,7 @@ BattleScript_EffectRecoilIfMiss::
accuracycheck BattleScript_MoveMissedDoDamage, ACC_CURR_MOVE accuracycheck BattleScript_MoveMissedDoDamage, ACC_CURR_MOVE
.if B_CRASH_IF_TARGET_IMMUNE >= GEN_4 .if B_CRASH_IF_TARGET_IMMUNE >= GEN_4
typecalc typecalc
jumpifhalfword CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveMissedDoDamage jumpifmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveMissedDoDamage
.endif .endif
goto BattleScript_HitFromAtkString goto BattleScript_HitFromAtkString
BattleScript_MoveMissedDoDamage:: BattleScript_MoveMissedDoDamage::
@ -3452,7 +3453,7 @@ BattleScript_MoveMissedDoDamage::
resultmessage resultmessage
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
.if B_CRASH_IF_TARGET_IMMUNE < GEN_4 .if B_CRASH_IF_TARGET_IMMUNE < GEN_4
jumpifhalfword CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd jumpifmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd
.endif .endif
moveendcase MOVEEND_PROTECT_LIKE_EFFECT @ Spiky Shield's damage happens before recoil. moveendcase MOVEEND_PROTECT_LIKE_EFFECT @ Spiky Shield's damage happens before recoil.
jumpifhasnohp BS_ATTACKER, BattleScript_MoveEnd jumpifhasnohp BS_ATTACKER, BattleScript_MoveEnd
@ -3467,18 +3468,18 @@ BattleScript_MoveMissedDoDamage::
manipulatedamage DMG_RECOIL_FROM_MISS manipulatedamage DMG_RECOIL_FROM_MISS
.endif .endif
.if B_CRASH_IF_TARGET_IMMUNE >= GEN_4 .if B_CRASH_IF_TARGET_IMMUNE >= GEN_4
bichalfword gMoveResultFlags, MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE clearmoveresultflags MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE
.else .else
bichalfword gMoveResultFlags, MOVE_RESULT_MISSED clearmoveresultflags MOVE_RESULT_MISSED
.endif .endif
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE
healthbarupdate BS_ATTACKER healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER datahpupdate BS_ATTACKER
tryfaintmon BS_ATTACKER tryfaintmon BS_ATTACKER
.if B_CRASH_IF_TARGET_IMMUNE >= GEN_4 .if B_CRASH_IF_TARGET_IMMUNE >= GEN_4
orhalfword gMoveResultFlags, MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE setmoveresultflags MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE
.else .else
orhalfword gMoveResultFlags, MOVE_RESULT_MISSED setmoveresultflags MOVE_RESULT_MISSED
.endif .endif
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
@ -3665,7 +3666,7 @@ BattleScript_EffectParalyze::
jumpifterrainaffected BS_TARGET, STATUS_FIELD_MISTY_TERRAIN, BattleScript_MistyTerrainPrevents jumpifterrainaffected BS_TARGET, STATUS_FIELD_MISTY_TERRAIN, BattleScript_MistyTerrainPrevents
accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE
jumpifsafeguard BattleScript_SafeguardProtected jumpifsafeguard BattleScript_SafeguardProtected
bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE
attackanimation attackanimation
waitanimation waitanimation
seteffectprimary MOVE_EFFECT_PARALYSIS seteffectprimary MOVE_EFFECT_PARALYSIS
@ -3924,7 +3925,7 @@ BattleScript_EffectLevelDamage::
attackstring attackstring
ppreduce ppreduce
typecalc typecalc
bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE
dmgtolevel dmgtolevel
adjustdamage adjustdamage
goto BattleScript_HitFromAtkAnimation goto BattleScript_HitFromAtkAnimation
@ -3935,7 +3936,7 @@ BattleScript_EffectPsywave::
attackstring attackstring
ppreduce ppreduce
typecalc typecalc
bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE
psywavedamageeffect psywavedamageeffect
adjustdamage adjustdamage
goto BattleScript_HitFromAtkAnimation goto BattleScript_HitFromAtkAnimation
@ -3947,7 +3948,7 @@ BattleScript_EffectCounter::
attackstring attackstring
ppreduce ppreduce
typecalc typecalc
bichalfword gMoveResultFlags, MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE
adjustdamage adjustdamage
goto BattleScript_HitFromAtkAnimation goto BattleScript_HitFromAtkAnimation
@ -3975,7 +3976,6 @@ BattleScript_EffectPainSplit::
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
healthbarupdate BS_ATTACKER healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER datahpupdate BS_ATTACKER
copyword gBattleMoveDamage, sPAINSPLIT_HP
healthbarupdate BS_TARGET healthbarupdate BS_TARGET
datahpupdate BS_TARGET datahpupdate BS_TARGET
printstring STRINGID_SHAREDPAIN printstring STRINGID_SHAREDPAIN
@ -4430,7 +4430,7 @@ BattleScript_EffectFixedDamageArg::
attackstring attackstring
ppreduce ppreduce
typecalc typecalc
bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE
setargtobattledamage setargtobattledamage
adjustdamage adjustdamage
goto BattleScript_HitFromAtkAnimation goto BattleScript_HitFromAtkAnimation
@ -4575,7 +4575,7 @@ BattleScript_EffectMirrorCoat::
attackstring attackstring
ppreduce ppreduce
typecalc typecalc
bichalfword gMoveResultFlags, MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE
adjustdamage adjustdamage
goto BattleScript_HitFromAtkAnimation goto BattleScript_HitFromAtkAnimation
@ -4631,7 +4631,7 @@ BattleScript_BeatUpLoop::
trydobeatup BattleScript_BeatUpEnd, BattleScript_ButItFailed trydobeatup BattleScript_BeatUpEnd, BattleScript_ButItFailed
printstring STRINGID_PKMNATTACK printstring STRINGID_PKMNATTACK
critcalc critcalc
jumpifbyte CMP_NOT_EQUAL, gIsCriticalHit, TRUE, BattleScript_BeatUpAttack jumpifcriticalhit BattleScript_BeatUpAttack
manipulatedamage DMG_DOUBLED manipulatedamage DMG_DOUBLED
BattleScript_BeatUpAttack:: BattleScript_BeatUpAttack::
adjustdamage adjustdamage
@ -4700,7 +4700,7 @@ BattleScript_FailedFromPpReduce::
ppreduce ppreduce
BattleScript_ButItFailed:: BattleScript_ButItFailed::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
resultmessage resultmessage
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
@ -4710,7 +4710,7 @@ BattleScript_RestoreAttackerButItFailed:
BattleScript_NotAffected:: BattleScript_NotAffected::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE
resultmessage resultmessage
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
@ -4718,7 +4718,7 @@ BattleScript_NotAffected::
BattleScript_NotAffectedAbilityPopUp:: BattleScript_NotAffectedAbilityPopUp::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
call BattleScript_AbilityPopUpTarget call BattleScript_AbilityPopUpTarget
orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE
resultmessage resultmessage
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
@ -4788,7 +4788,6 @@ BattleScript_EffectSpitUp::
attackstring attackstring
ppreduce ppreduce
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
setbyte gIsCriticalHit, FALSE
damagecalc damagecalc
adjustdamage adjustdamage
stockpiletobasedamage BattleScript_SpitUpFail stockpiletobasedamage BattleScript_SpitUpFail
@ -5122,7 +5121,7 @@ BattleScript_EffectBrickBreak::
damagecalc damagecalc
adjustdamage adjustdamage
jumpifbyte CMP_EQUAL, sB_ANIM_TURN, 0, BattleScript_BrickBreakAnim jumpifbyte CMP_EQUAL, sB_ANIM_TURN, 0, BattleScript_BrickBreakAnim
bichalfword gMoveResultFlags, MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE clearmoveresultflags MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE
BattleScript_BrickBreakAnim:: BattleScript_BrickBreakAnim::
attackanimation attackanimation
waitanimation waitanimation
@ -5181,12 +5180,10 @@ BattleScript_EffectEndeavor::
attackstring attackstring
ppreduce ppreduce
setdamagetohealthdifference BattleScript_ButItFailed setdamagetohealthdifference BattleScript_ButItFailed
copyword gHpDealt, gBattleMoveDamage
accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE
typecalc typecalc
jumpifmovehadnoeffect BattleScript_HitFromAtkAnimation jumpifmovehadnoeffect BattleScript_HitFromAtkAnimation
bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE
copyword gBattleMoveDamage, gHpDealt
adjustdamage adjustdamage
goto BattleScript_HitFromAtkAnimation goto BattleScript_HitFromAtkAnimation
@ -5310,7 +5307,7 @@ BattleScript_TickleEnd::
BattleScript_CantLowerMultipleStats:: BattleScript_CantLowerMultipleStats::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
printstring STRINGID_STATSWONTDECREASE2 printstring STRINGID_STATSWONTDECREASE2
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
@ -5394,7 +5391,7 @@ BattleScript_CalmMindEnd::
BattleScript_CantRaiseMultipleStats:: BattleScript_CantRaiseMultipleStats::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
printstring STRINGID_STATSWONTINCREASE2 printstring STRINGID_STATSWONTINCREASE2
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
@ -6046,7 +6043,6 @@ BattleScript_SafeguardEnds::
BattleScript_LeechSeedTurnDrainLiquidOoze:: BattleScript_LeechSeedTurnDrainLiquidOoze::
call BattleScript_LeechSeedTurnDrain call BattleScript_LeechSeedTurnDrain
manipulatedamage DMG_CHANGE_SIGN
copybyte gBattlerAbility, gBattlerAttacker copybyte gBattlerAbility, gBattlerAttacker
call BattleScript_AbilityPopUp call BattleScript_AbilityPopUp
goto BattleScript_LeechSeedTurnDrainGainHp goto BattleScript_LeechSeedTurnDrainGainHp
@ -6058,7 +6054,6 @@ BattleScript_LeechSeedTurnDrainHealBlock::
BattleScript_LeechSeedTurnDrainRecovery:: BattleScript_LeechSeedTurnDrainRecovery::
call BattleScript_LeechSeedTurnDrain call BattleScript_LeechSeedTurnDrain
BattleScript_LeechSeedTurnDrainGainHp: BattleScript_LeechSeedTurnDrainGainHp:
manipulatedamage DMG_BIG_ROOT
healthbarupdate BS_TARGET healthbarupdate BS_TARGET
datahpupdate BS_TARGET datahpupdate BS_TARGET
printfromtable gLeechSeedStringIds printfromtable gLeechSeedStringIds
@ -6085,8 +6080,8 @@ BattleScript_BideAttack::
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
accuracycheck BattleScript_MoveMissed, ACC_CURR_MOVE accuracycheck BattleScript_MoveMissed, ACC_CURR_MOVE
typecalc typecalc
bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE
copyword gBattleMoveDamage, sBIDE_DMG copybidedmg
adjustdamage adjustdamage
setbyte sB_ANIM_TURN, 1 setbyte sB_ANIM_TURN, 1
attackanimation attackanimation
@ -6642,14 +6637,14 @@ BattleScript_FutureAttackEnd::
moveendcase MOVEEND_RAGE moveendcase MOVEEND_RAGE
moveendcase MOVEEND_ABILITIES moveendcase MOVEEND_ABILITIES
moveendfromto MOVEEND_ITEM_EFFECTS_ALL, MOVEEND_UPDATE_LAST_MOVES moveendfromto MOVEEND_ITEM_EFFECTS_ALL, MOVEEND_UPDATE_LAST_MOVES
setbyte gMoveResultFlags, 0 setmoveresultflags 0
end2 end2
BattleScript_FutureAttackMiss:: BattleScript_FutureAttackMiss::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
sethword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
resultmessage resultmessage
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
sethword gMoveResultFlags, 0 setmoveresultflags 0
end2 end2
BattleScript_NoMovesLeft:: BattleScript_NoMovesLeft::
@ -6923,7 +6918,7 @@ BattleScript_MagicCoatPrankster::
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
printstring STRINGID_ITDOESNTAFFECT printstring STRINGID_ITDOESNTAFFECT
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT setmoveresultflags MOVE_RESULT_NO_EFFECT
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_SnatchedMove:: BattleScript_SnatchedMove::
@ -6972,7 +6967,6 @@ BattleScript_MegaEvolution::
printstring STRINGID_MEGAEVOREACTING printstring STRINGID_MEGAEVOREACTING
BattleScript_MegaEvolutionAfterString: BattleScript_MegaEvolutionAfterString:
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
setbyte gIsCriticalHit, 0
handlemegaevo BS_SCRIPTING, 0 handlemegaevo BS_SCRIPTING, 0
playanimation BS_SCRIPTING, B_ANIM_MEGA_EVOLUTION playanimation BS_SCRIPTING, B_ANIM_MEGA_EVOLUTION
waitanimation waitanimation
@ -6990,7 +6984,6 @@ BattleScript_WishMegaEvolution::
BattleScript_PrimalReversion:: BattleScript_PrimalReversion::
flushtextbox flushtextbox
setbyte gIsCriticalHit, 0
handleprimalreversion BS_SCRIPTING, 0 handleprimalreversion BS_SCRIPTING, 0
handleprimalreversion BS_SCRIPTING, 1 handleprimalreversion BS_SCRIPTING, 1
playanimation BS_SCRIPTING, B_ANIM_PRIMAL_REVERSION playanimation BS_SCRIPTING, B_ANIM_PRIMAL_REVERSION
@ -7006,7 +6999,6 @@ BattleScript_UltraBurst::
trytrainerslidezmovemsg trytrainerslidezmovemsg
printstring STRINGID_ULTRABURSTREACTING printstring STRINGID_ULTRABURSTREACTING
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
setbyte gIsCriticalHit, 0
handleultraburst BS_SCRIPTING, 0 handleultraburst BS_SCRIPTING, 0
playanimation BS_SCRIPTING, B_ANIM_ULTRA_BURST playanimation BS_SCRIPTING, B_ANIM_ULTRA_BURST
waitanimation waitanimation
@ -7313,7 +7305,7 @@ BattleScript_PowderMoveNoEffectPrint:
BattleScript_PowderMoveNoEffectWaitMsg: BattleScript_PowderMoveNoEffectWaitMsg:
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
cancelmultiturnmoves BS_ATTACKER cancelmultiturnmoves BS_ATTACKER
sethword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_MoveUsedFlinched:: BattleScript_MoveUsedFlinched::
@ -8245,7 +8237,7 @@ BattleScript_MoveHPDrain::
datahpupdate BS_TARGET datahpupdate BS_TARGET
printstring STRINGID_PKMNRESTOREDHPUSING printstring STRINGID_PKMNRESTOREDHPUSING
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_MoveStatDrain_PPLoss:: BattleScript_MoveStatDrain_PPLoss::
@ -8277,7 +8269,7 @@ BattleScript_MonMadeMoveUseless::
call BattleScript_AbilityPopUp call BattleScript_AbilityPopUp
printstring STRINGID_PKMNSXMADEYUSELESS printstring STRINGID_PKMNSXMADEYUSELESS
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_FlashFireBoost_PPLoss:: BattleScript_FlashFireBoost_PPLoss::
@ -8356,7 +8348,7 @@ BattleScript_SoundproofProtected::
call BattleScript_AbilityPopUp call BattleScript_AbilityPopUp
printstring STRINGID_PKMNSXBLOCKSY printstring STRINGID_PKMNSXBLOCKSY
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_IceFaceNullsDamage:: BattleScript_IceFaceNullsDamage::
@ -8405,7 +8397,7 @@ BattleScript_AbilityNoSpecificStatLoss::
printstring STRINGID_PKMNSXPREVENTSYLOSS printstring STRINGID_PKMNSXPREVENTSYLOSS
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY
orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT setmoveresultflags MOVE_RESULT_NO_EFFECT
return return
BattleScript_StickyHoldActivates:: BattleScript_StickyHoldActivates::
@ -8430,7 +8422,7 @@ BattleScript_ProteanActivates::
BattleScript_TeraShellDistortingTypeMatchups:: BattleScript_TeraShellDistortingTypeMatchups::
pause B_WAIT_TIME_SHORTEST pause B_WAIT_TIME_SHORTEST
call BattleScript_AbilityPopUp call BattleScript_AbilityPopUpScripting
printstring STRINGID_PKMNMADESHELLGLEAM printstring STRINGID_PKMNMADESHELLGLEAM
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
return return
@ -8515,7 +8507,7 @@ BattleScript_WeakArmorActivates::
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_WeakArmorActivatesSpeed jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_WeakArmorActivatesSpeed
pause B_WAIT_TIME_SHORTEST pause B_WAIT_TIME_SHORTEST
printfromtable gStatDownStringIds printfromtable gStatDownStringIds
bichalfword gMoveResultFlags, MOVE_RESULT_MISSED @ Set by statbuffchange when stat can't be decreased clearmoveresultflags MOVE_RESULT_MISSED @ Set by statbuffchange when stat can't be decreased
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
goto BattleScript_WeakArmorActivatesSpeed goto BattleScript_WeakArmorActivatesSpeed
BattleScript_WeakArmorDefAnim: BattleScript_WeakArmorDefAnim:
@ -8534,7 +8526,7 @@ BattleScript_WeakArmorActivatesSpeed:
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_EMPTY, BattleScript_WeakArmorActivatesEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_EMPTY, BattleScript_WeakArmorActivatesEnd
pause B_WAIT_TIME_SHORTEST pause B_WAIT_TIME_SHORTEST
printstring STRINGID_TARGETSTATWONTGOHIGHER printstring STRINGID_TARGETSTATWONTGOHIGHER
bichalfword gMoveResultFlags, MOVE_RESULT_MISSED clearmoveresultflags MOVE_RESULT_MISSED
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
goto BattleScript_WeakArmorActivatesEnd goto BattleScript_WeakArmorActivatesEnd
BattleScript_WeakArmorSpeedAnim: BattleScript_WeakArmorSpeedAnim:
@ -8657,31 +8649,31 @@ BattleScript_RockyHelmetActivatesDmg:
BattleScript_SpikyShieldEffect:: BattleScript_SpikyShieldEffect::
jumpifabsent BS_ATTACKER, BattleScript_SpikyShieldRet jumpifabsent BS_ATTACKER, BattleScript_SpikyShieldRet
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE
bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT clearmoveresultflags MOVE_RESULT_NO_EFFECT
healthbarupdate BS_ATTACKER healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER datahpupdate BS_ATTACKER
printstring STRINGID_PKMNHURTSWITH printstring STRINGID_PKMNHURTSWITH
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_ATTACKER tryfaintmon BS_ATTACKER
orhalfword gMoveResultFlags, MOVE_RESULT_MISSED setmoveresultflags MOVE_RESULT_MISSED
BattleScript_SpikyShieldRet:: BattleScript_SpikyShieldRet::
return return
BattleScript_KingsShieldEffect:: BattleScript_KingsShieldEffect::
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE
bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT clearmoveresultflags MOVE_RESULT_NO_EFFECT
seteffectsecondary seteffectsecondary
copybyte sBATTLER, gBattlerTarget copybyte sBATTLER, gBattlerTarget
copybyte gBattlerTarget, gBattlerAttacker copybyte gBattlerTarget, gBattlerAttacker
copybyte gBattlerAttacker, sBATTLER copybyte gBattlerAttacker, sBATTLER
orhalfword gMoveResultFlags, MOVE_RESULT_MISSED setmoveresultflags MOVE_RESULT_MISSED
return return
BattleScript_BanefulBunkerEffect:: BattleScript_BanefulBunkerEffect::
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_PASSIVE_DAMAGE orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_PASSIVE_DAMAGE
bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT clearmoveresultflags MOVE_RESULT_NO_EFFECT
seteffectsecondary seteffectsecondary
orhalfword gMoveResultFlags, MOVE_RESULT_MISSED setmoveresultflags MOVE_RESULT_MISSED
return return
BattleScript_CuteCharmActivates:: BattleScript_CuteCharmActivates::
@ -8885,18 +8877,12 @@ BattleScript_GemActivates::
return return
BattleScript_BerryReduceDmg:: BattleScript_BerryReduceDmg::
playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT
waitanimation waitanimation
setlastuseditem BS_TARGET setlastuseditem BS_SCRIPTING
printstring STRINGID_TARGETATEITEM
waitmessage B_WAIT_TIME_LONG
removeitem BS_TARGET
return
BattleScript_PrintBerryReduceString::
waitmessage B_WAIT_TIME_LONG
printstring STRINGID_BERRYDMGREDUCES printstring STRINGID_BERRYDMGREDUCES
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
removeitem BS_SCRIPTING
return return
BattleScript_BerryCureConfusionEnd2:: BattleScript_BerryCureConfusionEnd2::
@ -9687,7 +9673,7 @@ BattleScript_DarkTypePreventsPrankster::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
printstring STRINGID_ITDOESNTAFFECT printstring STRINGID_ITDOESNTAFFECT
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT setmoveresultflags MOVE_RESULT_NO_EFFECT
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_WellBakedBodyActivates:: BattleScript_WellBakedBodyActivates::
@ -9695,7 +9681,7 @@ BattleScript_WellBakedBodyActivates::
ppreduce ppreduce
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
call BattleScript_AbilityPopUpTarget call BattleScript_AbilityPopUpTarget
orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT setmoveresultflags MOVE_RESULT_NO_EFFECT
modifybattlerstatstage BS_TARGET, STAT_DEF, INCREASE, 1, BattleScript_WellBakedBodyEnd, ANIM_ON modifybattlerstatstage BS_TARGET, STAT_DEF, INCREASE, 1, BattleScript_WellBakedBodyEnd, ANIM_ON
BattleScript_WellBakedBodyEnd: BattleScript_WellBakedBodyEnd:
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
@ -9705,7 +9691,7 @@ BattleScript_WindRiderActivatesMoveEnd::
ppreduce ppreduce
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
call BattleScript_AbilityPopUpTarget call BattleScript_AbilityPopUpTarget
orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT setmoveresultflags MOVE_RESULT_NO_EFFECT
modifybattlerstatstage BS_TARGET, STAT_ATK, INCREASE, 1, BattleScript_WindRiderActivatesMoveEnd_End, ANIM_ON modifybattlerstatstage BS_TARGET, STAT_ATK, INCREASE, 1, BattleScript_WindRiderActivatesMoveEnd_End, ANIM_ON
BattleScript_WindRiderActivatesMoveEnd_End: BattleScript_WindRiderActivatesMoveEnd_End:
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
@ -10113,7 +10099,7 @@ BattleScript_EffectSnow::
BattleScript_SleepClauseBlocked:: BattleScript_SleepClauseBlocked::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
orhalfword gMoveResultFlags, MOVE_RESULT_FAILED setmoveresultflags MOVE_RESULT_FAILED
printstring STRINGID_BLOCKEDBYSLEEPCLAUSE printstring STRINGID_BLOCKEDBYSLEEPCLAUSE
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd goto BattleScript_MoveEnd

View File

@ -48,7 +48,7 @@ BattleScript_UseItemMessage:
return return
BattleScript_ItemRestoreHPRet: BattleScript_ItemRestoreHPRet:
bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT clearmoveresultflags MOVE_RESULT_NO_EFFECT
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
healthbarupdate BS_SCRIPTING healthbarupdate BS_SCRIPTING
datahpupdate BS_SCRIPTING datahpupdate BS_SCRIPTING
@ -69,7 +69,7 @@ BattleScript_ItemRestoreHPEnd:
BattleScript_ItemRestoreHP_Party:: BattleScript_ItemRestoreHP_Party::
jumpifbyte CMP_EQUAL, gBattleCommunication, TRUE, BattleScript_ItemRestoreHP_SendOutRevivedBattler jumpifbyte CMP_EQUAL, gBattleCommunication, TRUE, BattleScript_ItemRestoreHP_SendOutRevivedBattler
bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT clearmoveresultflags MOVE_RESULT_NO_EFFECT
printstring STRINGID_ITEMRESTOREDSPECIESHEALTH printstring STRINGID_ITEMRESTOREDSPECIESHEALTH
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
return return

View File

@ -251,6 +251,8 @@ struct SpecialStatus
u8 afterYou:1; u8 afterYou:1;
u8 preventLifeOrbDamage:1; // So that Life Orb doesn't activate various effects. u8 preventLifeOrbDamage:1; // So that Life Orb doesn't activate various effects.
u8 distortedTypeMatchups:1; u8 distortedTypeMatchups:1;
u8 teraShellAbilityDone:1;
u8 criticalHit:1;
}; };
struct SideTimer struct SideTimer
@ -829,11 +831,25 @@ struct BattleStruct
u16 commanderActive[MAX_BATTLERS_COUNT]; u16 commanderActive[MAX_BATTLERS_COUNT];
u32 stellarBoostFlags[NUM_BATTLE_SIDES]; // stored as a bitfield of flags for all types for each side u32 stellarBoostFlags[NUM_BATTLE_SIDES]; // stored as a bitfield of flags for all types for each side
u8 redCardActivates:1; u8 redCardActivates:1;
u8 padding:7; u8 padding1:7;
u8 usedEjectItem; u8 usedEjectItem;
u8 usedMicleBerry;
u8 monCausingSleepClause[NUM_BATTLE_SIDES]; // Stores which pokemon on a given side is causing Sleep Clause to be active as the mon's index in the party u8 monCausingSleepClause[NUM_BATTLE_SIDES]; // Stores which pokemon on a given side is causing Sleep Clause to be active as the mon's index in the party
u8 sleepClauseEffectExempt:4; // Stores whether effect should be exempt from triggering Sleep Clause (Effect Spore) u8 sleepClauseEffectExempt:4; // Stores whether effect should be exempt from triggering Sleep Clause (Effect Spore)
u8 usedMicleBerry:4;
s32 battlerExpReward;
// Simultaneous hp reduction for spread moves
s32 moveDamage[MAX_BATTLERS_COUNT];
s32 critChance[MAX_BATTLERS_COUNT];
u16 moveResultFlags[MAX_BATTLERS_COUNT];
u8 missStringId[MAX_BATTLERS_COUNT];
u8 noResultString[MAX_BATTLERS_COUNT];
u8 doneDoublesSpreadHit:1;
u8 calculatedDamageDone:1;
u8 calculatedSpreadMoveAccuracy:1;
u8 printedStrongWindsWeakenedAttack:1;
u8 numSpreadTargets:2;
u8 padding2:2;
}; };
// The palaceFlags member of struct BattleStruct contains 1 flag per move to indicate which moves the AI should consider, // The palaceFlags member of struct BattleStruct contains 1 flag per move to indicate which moves the AI should consider,
@ -848,7 +864,6 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER
#define IS_MOVE_PHYSICAL(move)(GetBattleMoveCategory(move) == DAMAGE_CATEGORY_PHYSICAL) #define IS_MOVE_PHYSICAL(move)(GetBattleMoveCategory(move) == DAMAGE_CATEGORY_PHYSICAL)
#define IS_MOVE_SPECIAL(move)(GetBattleMoveCategory(move) == DAMAGE_CATEGORY_SPECIAL) #define IS_MOVE_SPECIAL(move)(GetBattleMoveCategory(move) == DAMAGE_CATEGORY_SPECIAL)
#define IS_MOVE_STATUS(move)(gMovesInfo[move].category == DAMAGE_CATEGORY_STATUS) #define IS_MOVE_STATUS(move)(gMovesInfo[move].category == DAMAGE_CATEGORY_STATUS)
#define IS_MOVE_RECOIL(move)(gMovesInfo[move].recoil > 0 || gMovesInfo[move].effect == EFFECT_RECOIL_IF_MISS) #define IS_MOVE_RECOIL(move)(gMovesInfo[move].recoil > 0 || gMovesInfo[move].effect == EFFECT_RECOIL_IF_MISS)
#define BATTLER_MAX_HP(battlerId)(gBattleMons[battlerId].hp == gBattleMons[battlerId].maxHP) #define BATTLER_MAX_HP(battlerId)(gBattleMons[battlerId].hp == gBattleMons[battlerId].maxHP)
@ -915,6 +930,8 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER
#define SET_STATCHANGER(statId, stage, goesDown) (gBattleScripting.statChanger = (statId) + ((stage) << 3) + (goesDown << 7)) #define SET_STATCHANGER(statId, stage, goesDown) (gBattleScripting.statChanger = (statId) + ((stage) << 3) + (goesDown << 7))
#define SET_STATCHANGER2(dst, statId, stage, goesDown)(dst = (statId) + ((stage) << 3) + (goesDown << 7)) #define SET_STATCHANGER2(dst, statId, stage, goesDown)(dst = (statId) + ((stage) << 3) + (goesDown << 7))
#define DO_ACCURACY_CHECK 2 // Don't skip the accuracy check before the move might be absorbed
// NOTE: The members of this struct have hard-coded offsets // NOTE: The members of this struct have hard-coded offsets
// in include/constants/battle_script_commands.h // in include/constants/battle_script_commands.h
struct BattleScripting struct BattleScripting
@ -1095,7 +1112,6 @@ extern u8 gChosenMovePos;
extern u16 gCurrentMove; extern u16 gCurrentMove;
extern u16 gChosenMove; extern u16 gChosenMove;
extern u16 gCalledMove; extern u16 gCalledMove;
extern s32 gBattleMoveDamage;
extern s32 gHpDealt; extern s32 gHpDealt;
extern s32 gBideDmg[MAX_BATTLERS_COUNT]; extern s32 gBideDmg[MAX_BATTLERS_COUNT];
extern u16 gLastUsedItem; extern u16 gLastUsedItem;
@ -1106,7 +1122,6 @@ extern u8 gBattlerFainted;
extern u8 gEffectBattler; extern u8 gEffectBattler;
extern u8 gPotentialItemEffectBattler; extern u8 gPotentialItemEffectBattler;
extern u8 gAbsentBattlerFlags; extern u8 gAbsentBattlerFlags;
extern u8 gIsCriticalHit;
extern u8 gMultiHitCounter; extern u8 gMultiHitCounter;
extern const u8 *gBattlescriptCurrInstr; extern const u8 *gBattlescriptCurrInstr;
extern u8 gChosenActionByBattler[MAX_BATTLERS_COUNT]; extern u8 gChosenActionByBattler[MAX_BATTLERS_COUNT];
@ -1122,7 +1137,6 @@ extern u16 gLockedMoves[MAX_BATTLERS_COUNT];
extern u16 gLastUsedMove; extern u16 gLastUsedMove;
extern u8 gLastHitBy[MAX_BATTLERS_COUNT]; extern u8 gLastHitBy[MAX_BATTLERS_COUNT];
extern u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT]; extern u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT];
extern u16 gMoveResultFlags;
extern u32 gHitMarker; extern u32 gHitMarker;
extern u8 gBideTarget[MAX_BATTLERS_COUNT]; extern u8 gBideTarget[MAX_BATTLERS_COUNT];
extern u32 gSideStatuses[NUM_BATTLE_SIDES]; extern u32 gSideStatuses[NUM_BATTLE_SIDES];
@ -1210,5 +1224,29 @@ static inline bool32 IsDoubleBattle(void)
return gBattleTypeFlags & BATTLE_TYPE_DOUBLE; return gBattleTypeFlags & BATTLE_TYPE_DOUBLE;
} }
static inline bool32 IsSpreadMove(u32 moveTarget)
{
return IsDoubleBattle() && (moveTarget == MOVE_TARGET_BOTH || moveTarget == MOVE_TARGET_FOES_AND_ALLY);
}
static inline bool32 IsDoubleSpreadMove(void)
{
return gBattleStruct->numSpreadTargets > 1
&& !(gHitMarker & (HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_UNABLE_TO_USE_MOVE))
&& IsSpreadMove(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove));
}
static inline bool32 IsBattlerInvalidForSpreadMove(u32 battlerAtk, u32 battlerDef, u32 moveTarget)
{
return battlerDef == battlerAtk
|| !IsBattlerAlive(battlerDef)
|| (battlerDef == BATTLE_PARTNER(battlerAtk) && (moveTarget == MOVE_TARGET_BOTH));
}
static inline bool32 MoveResultHasEffect(u32 battler)
{
return !(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT);
}
#endif // GUARD_BATTLE_H #endif // GUARD_BATTLE_H

View File

@ -73,8 +73,8 @@
#define B_TXT_DEF_NAME 0x39 #define B_TXT_DEF_NAME 0x39
#define B_TXT_DEF_TEAM1 0x3A // Your/The opposing #define B_TXT_DEF_TEAM1 0x3A // Your/The opposing
#define B_TXT_DEF_TEAM2 0x3B // your/the opposing #define B_TXT_DEF_TEAM2 0x3B // your/the opposing
// #define B_TXT_SELECTION_NAME 0x3C - removed #define B_TXT_DEF_PARTNER_NAME 0x3C
// #define B_TXT_SELECTION_NAME2 0x3D no Illusion check - removed // #define B_UNUSED_0x3D 0x3D
#define B_TXT_ATK_NAME_WITH_PREFIX2 0x3E //lowercase #define B_TXT_ATK_NAME_WITH_PREFIX2 0x3E //lowercase
#define B_TXT_DEF_NAME_WITH_PREFIX2 0x3F //lowercase #define B_TXT_DEF_NAME_WITH_PREFIX2 0x3F //lowercase
#define B_TXT_EFF_NAME_WITH_PREFIX2 0x40 //lowercase #define B_TXT_EFF_NAME_WITH_PREFIX2 0x40 //lowercase

View File

@ -358,7 +358,6 @@ extern const u8 BattleScript_SelectingNotAllowedMoveThroatChopInPalace[];
extern const u8 BattleScript_ThroatChopEndTurn[]; extern const u8 BattleScript_ThroatChopEndTurn[];
extern const u8 BattleScript_GemActivates[]; extern const u8 BattleScript_GemActivates[];
extern const u8 BattleScript_BerryReduceDmg[]; extern const u8 BattleScript_BerryReduceDmg[];
extern const u8 BattleScript_PrintBerryReduceString[];
extern const u8 BattleScript_WeaknessPolicy[]; extern const u8 BattleScript_WeaknessPolicy[];
extern const u8 BattleScript_TargetItemStatRaise[]; extern const u8 BattleScript_TargetItemStatRaise[];
extern const u8 BattleScript_RockyHelmetActivates[]; extern const u8 BattleScript_RockyHelmetActivates[];

View File

@ -119,6 +119,7 @@ enum
CANCELLER_EXPLODING_DAMP, CANCELLER_EXPLODING_DAMP,
CANCELLER_MULTIHIT_MOVES, CANCELLER_MULTIHIT_MOVES,
CANCELLER_Z_MOVES, CANCELLER_Z_MOVES,
CANCELLER_MULTI_TARGET_MOVES,
CANCELLER_END, CANCELLER_END,
CANCELLER_PSYCHIC_TERRAIN, CANCELLER_PSYCHIC_TERRAIN,
CANCELLER_END2, CANCELLER_END2,
@ -317,7 +318,8 @@ void RemoveBattlerType(u32 battler, u8 type);
u32 GetMoveType(u32 move); u32 GetMoveType(u32 move);
void TryActivateSleepClause(u32 battler, u32 indexInParty); void TryActivateSleepClause(u32 battler, u32 indexInParty);
void TryDeactivateSleepClause(u32 battlerSide, u32 indexInParty); void TryDeactivateSleepClause(u32 battlerSide, u32 indexInParty);
bool8 IsSleepClauseActiveForSide(u32 battlerSide); bool32 IsSleepClauseActiveForSide(u32 battlerSide);
bool32 IsSleepClauseEnabled(); bool32 IsSleepClauseEnabled();
void ClearDamageCalcResults(void);
#endif // GUARD_BATTLE_UTIL_H #endif // GUARD_BATTLE_UTIL_H

View File

@ -3,7 +3,7 @@
// The following correspond to the struct members of BattleScripting by adding their offset // The following correspond to the struct members of BattleScripting by adding their offset
#define sPAINSPLIT_HP (gBattleScripting + 0x00) // painSplitHp #define sPAINSPLIT_HP (gBattleScripting + 0x00) // painSplitHp
#define sBIDE_DMG (gBattleScripting + 0x04) // bideDmg #define sUNUSED_0x04 (gBattleScripting + 0x04) // unused_0x04
#define sMULTIHIT_STRING (gBattleScripting + 0x08) // multihitString #define sMULTIHIT_STRING (gBattleScripting + 0x08) // multihitString
#define sEXP_CATCH (gBattleScripting + 0x0E) // expOnCatch #define sEXP_CATCH (gBattleScripting + 0x0E) // expOnCatch
#define sUNUSED (gBattleScripting + 0x0F) // unused #define sUNUSED (gBattleScripting + 0x0F) // unused
@ -222,14 +222,14 @@
#define VARIOUS_SWAP_STATS 130 #define VARIOUS_SWAP_STATS 130
// Cmd_manipulatedamage // Cmd_manipulatedamage
#define DMG_CHANGE_SIGN 0 #define DMG_CHANGE_SIGN 1
#define DMG_RECOIL_FROM_MISS 1 #define DMG_RECOIL_FROM_MISS 2
#define DMG_DOUBLED 2 #define DMG_DOUBLED 3
#define DMG_1_8_TARGET_HP 3 #define DMG_1_8_TARGET_HP 4
#define DMG_FULL_ATTACKER_HP 4 #define DMG_FULL_ATTACKER_HP 5
#define DMG_CURR_ATTACKER_HP 5 #define DMG_CURR_ATTACKER_HP 6
#define DMG_BIG_ROOT 6 #define DMG_BIG_ROOT 7
#define DMG_RECOIL_FROM_IMMUNE 7 // Used to calculate recoil for the Gen 4 version of Jump Kick #define DMG_RECOIL_FROM_IMMUNE 8 // Used to calculate recoil for the Gen 4 version of Jump Kick
// Cmd_jumpifcantswitch // Cmd_jumpifcantswitch
#define SWITCH_IGNORE_ESCAPE_PREVENTION (1 << 7) #define SWITCH_IGNORE_ESCAPE_PREVENTION (1 << 7)

View File

@ -531,202 +531,204 @@
#define STRINGID_LASERFOCUS 529 #define STRINGID_LASERFOCUS 529
#define STRINGID_GEMACTIVATES 530 #define STRINGID_GEMACTIVATES 530
#define STRINGID_BERRYDMGREDUCES 531 #define STRINGID_BERRYDMGREDUCES 531
#define STRINGID_TARGETATEITEM 532 #define STRINGID_AIRBALLOONFLOAT 532
#define STRINGID_AIRBALLOONFLOAT 533 #define STRINGID_AIRBALLOONPOP 533
#define STRINGID_AIRBALLOONPOP 534 #define STRINGID_INCINERATEBURN 534
#define STRINGID_INCINERATEBURN 535 #define STRINGID_BUGBITE 535
#define STRINGID_BUGBITE 536 #define STRINGID_ILLUSIONWOREOFF 536
#define STRINGID_ILLUSIONWOREOFF 537 #define STRINGID_ATTACKERCUREDTARGETSTATUS 537
#define STRINGID_ATTACKERCUREDTARGETSTATUS 538 #define STRINGID_ATTACKERLOSTFIRETYPE 538
#define STRINGID_ATTACKERLOSTFIRETYPE 539 #define STRINGID_HEALERCURE 539
#define STRINGID_HEALERCURE 540 #define STRINGID_SCRIPTINGABILITYSTATRAISE 540
#define STRINGID_SCRIPTINGABILITYSTATRAISE 541 #define STRINGID_RECEIVERABILITYTAKEOVER 541
#define STRINGID_RECEIVERABILITYTAKEOVER 542 #define STRINGID_PKNMABSORBINGPOWER 542
#define STRINGID_PKNMABSORBINGPOWER 543 #define STRINGID_NOONEWILLBEABLETORUNAWAY 543
#define STRINGID_NOONEWILLBEABLETORUNAWAY 544 #define STRINGID_DESTINYKNOTACTIVATES 544
#define STRINGID_DESTINYKNOTACTIVATES 545 #define STRINGID_CLOAKEDINAFREEZINGLIGHT 545
#define STRINGID_CLOAKEDINAFREEZINGLIGHT 546 #define STRINGID_CLEARAMULETWONTLOWERSTATS 546
#define STRINGID_CLEARAMULETWONTLOWERSTATS 547 #define STRINGID_FERVENTWISHREACHED 547
#define STRINGID_FERVENTWISHREACHED 548 #define STRINGID_AIRLOCKACTIVATES 548
#define STRINGID_AIRLOCKACTIVATES 549 #define STRINGID_PRESSUREENTERS 549
#define STRINGID_PRESSUREENTERS 550 #define STRINGID_DARKAURAENTERS 550
#define STRINGID_DARKAURAENTERS 551 #define STRINGID_FAIRYAURAENTERS 551
#define STRINGID_FAIRYAURAENTERS 552 #define STRINGID_AURABREAKENTERS 552
#define STRINGID_AURABREAKENTERS 553 #define STRINGID_COMATOSEENTERS 553
#define STRINGID_COMATOSEENTERS 554 #define STRINGID_SCREENCLEANERENTERS 554
#define STRINGID_SCREENCLEANERENTERS 555 #define STRINGID_FETCHEDPOKEBALL 555
#define STRINGID_FETCHEDPOKEBALL 556 #define STRINGID_BATTLERABILITYRAISEDSTAT 556
#define STRINGID_BATTLERABILITYRAISEDSTAT 557 #define STRINGID_ASANDSTORMKICKEDUP 557
#define STRINGID_ASANDSTORMKICKEDUP 558 #define STRINGID_PKMNSWILLPERISHIN3TURNS 558
#define STRINGID_PKMNSWILLPERISHIN3TURNS 559 #define STRINGID_ABILITYRAISEDSTATDRASTICALLY 559
#define STRINGID_ABILITYRAISEDSTATDRASTICALLY 560 #define STRINGID_AURAFLAREDTOLIFE 560
#define STRINGID_AURAFLAREDTOLIFE 561 #define STRINGID_ASONEENTERS 561
#define STRINGID_ASONEENTERS 562 #define STRINGID_CURIOUSMEDICINEENTERS 562
#define STRINGID_CURIOUSMEDICINEENTERS 563 #define STRINGID_CANACTFASTERTHANKSTO 563
#define STRINGID_CANACTFASTERTHANKSTO 564 #define STRINGID_MICLEBERRYACTIVATES 564
#define STRINGID_MICLEBERRYACTIVATES 565 #define STRINGID_PKMNSHOOKOFFTHETAUNT 565
#define STRINGID_PKMNSHOOKOFFTHETAUNT 566 #define STRINGID_PKMNGOTOVERITSINFATUATION 566
#define STRINGID_PKMNGOTOVERITSINFATUATION 567 #define STRINGID_ITEMCANNOTBEREMOVED 567
#define STRINGID_ITEMCANNOTBEREMOVED 568 #define STRINGID_STICKYBARBTRANSFER 568
#define STRINGID_STICKYBARBTRANSFER 569 #define STRINGID_PKMNBURNHEALED 569
#define STRINGID_PKMNBURNHEALED 570 #define STRINGID_REDCARDACTIVATE 570
#define STRINGID_REDCARDACTIVATE 571 #define STRINGID_EJECTBUTTONACTIVATE 571
#define STRINGID_EJECTBUTTONACTIVATE 572 #define STRINGID_ATKGOTOVERINFATUATION 572
#define STRINGID_ATKGOTOVERINFATUATION 573 #define STRINGID_TORMENTEDNOMORE 573
#define STRINGID_TORMENTEDNOMORE 574 #define STRINGID_HEALBLOCKEDNOMORE 574
#define STRINGID_HEALBLOCKEDNOMORE 575 #define STRINGID_ATTACKERBECAMEFULLYCHARGED 575
#define STRINGID_ATTACKERBECAMEFULLYCHARGED 576 #define STRINGID_ATTACKERBECAMEASHSPECIES 576
#define STRINGID_ATTACKERBECAMEASHSPECIES 577 #define STRINGID_EXTREMELYHARSHSUNLIGHT 577
#define STRINGID_EXTREMELYHARSHSUNLIGHT 578 #define STRINGID_EXTREMESUNLIGHTFADED 578
#define STRINGID_EXTREMESUNLIGHTFADED 579 #define STRINGID_MOVEEVAPORATEDINTHEHARSHSUNLIGHT 579
#define STRINGID_MOVEEVAPORATEDINTHEHARSHSUNLIGHT 580 #define STRINGID_EXTREMELYHARSHSUNLIGHTWASNOTLESSENED 580
#define STRINGID_EXTREMELYHARSHSUNLIGHTWASNOTLESSENED 581 #define STRINGID_HEAVYRAIN 581
#define STRINGID_HEAVYRAIN 582 #define STRINGID_HEAVYRAINLIFTED 582
#define STRINGID_HEAVYRAINLIFTED 583 #define STRINGID_MOVEFIZZLEDOUTINTHEHEAVYRAIN 583
#define STRINGID_MOVEFIZZLEDOUTINTHEHEAVYRAIN 584 #define STRINGID_NORELIEFROMHEAVYRAIN 584
#define STRINGID_NORELIEFROMHEAVYRAIN 585 #define STRINGID_MYSTERIOUSAIRCURRENT 585
#define STRINGID_MYSTERIOUSAIRCURRENT 586 #define STRINGID_STRONGWINDSDISSIPATED 586
#define STRINGID_STRONGWINDSDISSIPATED 587 #define STRINGID_MYSTERIOUSAIRCURRENTBLOWSON 587
#define STRINGID_MYSTERIOUSAIRCURRENTBLOWSON 588 #define STRINGID_ATTACKWEAKENEDBSTRONGWINDS 588
#define STRINGID_ATTACKWEAKENEDBSTRONGWINDS 589 #define STRINGID_STUFFCHEEKSCANTSELECT 589
#define STRINGID_STUFFCHEEKSCANTSELECT 590 #define STRINGID_PKMNREVERTEDTOPRIMAL 590
#define STRINGID_PKMNREVERTEDTOPRIMAL 591 #define STRINGID_BUTPOKEMONCANTUSETHEMOVE 591
#define STRINGID_BUTPOKEMONCANTUSETHEMOVE 592 #define STRINGID_BUTHOOPACANTUSEIT 592
#define STRINGID_BUTHOOPACANTUSEIT 593 #define STRINGID_BROKETHROUGHPROTECTION 593
#define STRINGID_BROKETHROUGHPROTECTION 594 #define STRINGID_ABILITYALLOWSONLYMOVE 594
#define STRINGID_ABILITYALLOWSONLYMOVE 595 #define STRINGID_SWAPPEDABILITIES 595
#define STRINGID_SWAPPEDABILITIES 596 #define STRINGID_PASTELVEILPROTECTED 596
#define STRINGID_PASTELVEILPROTECTED 597 #define STRINGID_PASTELVEILENTERS 597
#define STRINGID_PASTELVEILENTERS 598 #define STRINGID_BATTLERTYPECHANGEDTO 598
#define STRINGID_BATTLERTYPECHANGEDTO 599 #define STRINGID_BOTHCANNOLONGERESCAPE 599
#define STRINGID_BOTHCANNOLONGERESCAPE 600 #define STRINGID_CANTESCAPEDUETOUSEDMOVE 600
#define STRINGID_CANTESCAPEDUETOUSEDMOVE 601 #define STRINGID_PKMNBECAMEWEAKERTOFIRE 601
#define STRINGID_PKMNBECAMEWEAKERTOFIRE 602 #define STRINGID_ABOUTTOUSEPOLTERGEIST 602
#define STRINGID_ABOUTTOUSEPOLTERGEIST 603 #define STRINGID_CANTESCAPEBECAUSEOFCURRENTMOVE 603
#define STRINGID_CANTESCAPEBECAUSEOFCURRENTMOVE 604 #define STRINGID_NEUTRALIZINGGASENTERS 604
#define STRINGID_NEUTRALIZINGGASENTERS 605 #define STRINGID_NEUTRALIZINGGASOVER 605
#define STRINGID_NEUTRALIZINGGASOVER 606 #define STRINGID_TARGETTOOHEAVY 606
#define STRINGID_TARGETTOOHEAVY 607 #define STRINGID_PKMNTOOKTARGETHIGH 607
#define STRINGID_PKMNTOOKTARGETHIGH 608 #define STRINGID_PKMNINSNAPTRAP 608
#define STRINGID_PKMNINSNAPTRAP 609 #define STRINGID_METEORBEAMCHARGING 609
#define STRINGID_METEORBEAMCHARGING 610 #define STRINGID_HEATUPBEAK 610
#define STRINGID_HEATUPBEAK 611 #define STRINGID_COURTCHANGE 611
#define STRINGID_COURTCHANGE 612 #define STRINGID_PLAYERLOSTTOENEMYTRAINER 612
#define STRINGID_PLAYERLOSTTOENEMYTRAINER 613 #define STRINGID_PLAYERPAIDPRIZEMONEY 613
#define STRINGID_PLAYERPAIDPRIZEMONEY 614 #define STRINGID_ZPOWERSURROUNDS 614
#define STRINGID_ZPOWERSURROUNDS 615 #define STRINGID_ZMOVEUNLEASHED 615
#define STRINGID_ZMOVEUNLEASHED 616 #define STRINGID_ZMOVERESETSSTATS 616
#define STRINGID_ZMOVERESETSSTATS 617 #define STRINGID_ZMOVEALLSTATSUP 617
#define STRINGID_ZMOVEALLSTATSUP 618 #define STRINGID_ZMOVEZBOOSTCRIT 618
#define STRINGID_ZMOVEZBOOSTCRIT 619 #define STRINGID_ZMOVERESTOREHP 619
#define STRINGID_ZMOVERESTOREHP 620 #define STRINGID_ZMOVESTATUP 620
#define STRINGID_ZMOVESTATUP 621 #define STRINGID_ZMOVEHPTRAP 621
#define STRINGID_ZMOVEHPTRAP 622 #define STRINGID_ATTACKEREXPELLEDTHEPOISON 622
#define STRINGID_ATTACKEREXPELLEDTHEPOISON 623 #define STRINGID_ATTACKERSHOOKITSELFAWAKE 623
#define STRINGID_ATTACKERSHOOKITSELFAWAKE 624 #define STRINGID_ATTACKERBROKETHROUGHPARALYSIS 624
#define STRINGID_ATTACKERBROKETHROUGHPARALYSIS 625 #define STRINGID_ATTACKERHEALEDITSBURN 625
#define STRINGID_ATTACKERHEALEDITSBURN 626 #define STRINGID_ATTACKERMELTEDTHEICE 626
#define STRINGID_ATTACKERMELTEDTHEICE 627 #define STRINGID_TARGETTOUGHEDITOUT 627
#define STRINGID_TARGETTOUGHEDITOUT 628 #define STRINGID_ATTACKERLOSTELECTRICTYPE 628
#define STRINGID_ATTACKERLOSTELECTRICTYPE 629 #define STRINGID_ATTACKERSWITCHEDSTATWITHTARGET 629
#define STRINGID_ATTACKERSWITCHEDSTATWITHTARGET 630 #define STRINGID_BEINGHITCHARGEDPKMNWITHPOWER 630
#define STRINGID_BEINGHITCHARGEDPKMNWITHPOWER 631 #define STRINGID_SUNLIGHTACTIVATEDABILITY 631
#define STRINGID_SUNLIGHTACTIVATEDABILITY 632 #define STRINGID_STATWASHEIGHTENED 632
#define STRINGID_STATWASHEIGHTENED 633 #define STRINGID_ELECTRICTERRAINACTIVATEDABILITY 633
#define STRINGID_ELECTRICTERRAINACTIVATEDABILITY 634 #define STRINGID_ABILITYWEAKENEDSURROUNDINGMONSSTAT 634
#define STRINGID_ABILITYWEAKENEDSURROUNDINGMONSSTAT 635 #define STRINGID_ATTACKERGAINEDSTRENGTHFROMTHEFALLEN 635
#define STRINGID_ATTACKERGAINEDSTRENGTHFROMTHEFALLEN 636 #define STRINGID_PKMNSABILITYPREVENTSABILITY 636
#define STRINGID_PKMNSABILITYPREVENTSABILITY 637 #define STRINGID_PREPARESHELLTRAP 637
#define STRINGID_PREPARESHELLTRAP 638 #define STRINGID_SHELLTRAPDIDNTWORK 638
#define STRINGID_SHELLTRAPDIDNTWORK 639 #define STRINGID_SPIKESDISAPPEAREDFROMTEAM 639
#define STRINGID_SPIKESDISAPPEAREDFROMTEAM 640 #define STRINGID_TOXICSPIKESDISAPPEAREDFROMTEAM 640
#define STRINGID_TOXICSPIKESDISAPPEAREDFROMTEAM 641 #define STRINGID_STICKYWEBDISAPPEAREDFROMTEAM 641
#define STRINGID_STICKYWEBDISAPPEAREDFROMTEAM 642 #define STRINGID_STEALTHROCKDISAPPEAREDFROMTEAM 642
#define STRINGID_STEALTHROCKDISAPPEAREDFROMTEAM 643 #define STRINGID_COULDNTFULLYPROTECT 643
#define STRINGID_COULDNTFULLYPROTECT 644 #define STRINGID_STOCKPILEDEFFECTWOREOFF 644
#define STRINGID_STOCKPILEDEFFECTWOREOFF 645 #define STRINGID_PKMNREVIVEDREADYTOFIGHT 645
#define STRINGID_PKMNREVIVEDREADYTOFIGHT 646 #define STRINGID_ITEMRESTOREDSPECIESHEALTH 646
#define STRINGID_ITEMRESTOREDSPECIESHEALTH 647 #define STRINGID_ITEMCUREDSPECIESSTATUS 647
#define STRINGID_ITEMCUREDSPECIESSTATUS 648 #define STRINGID_ITEMRESTOREDSPECIESPP 648
#define STRINGID_ITEMRESTOREDSPECIESPP 649 #define STRINGID_THUNDERCAGETRAPPED 649
#define STRINGID_THUNDERCAGETRAPPED 650 #define STRINGID_PKMNHURTBYFROSTBITE 650
#define STRINGID_PKMNHURTBYFROSTBITE 651 #define STRINGID_PKMNGOTFROSTBITE 651
#define STRINGID_PKMNGOTFROSTBITE 652 #define STRINGID_PKMNSITEMHEALEDFROSTBITE 652
#define STRINGID_PKMNSITEMHEALEDFROSTBITE 653 #define STRINGID_ATTACKERHEALEDITSFROSTBITE 653
#define STRINGID_ATTACKERHEALEDITSFROSTBITE 654 #define STRINGID_PKMNFROSTBITEHEALED 654
#define STRINGID_PKMNFROSTBITEHEALED 655 #define STRINGID_PKMNFROSTBITEHEALED2 655
#define STRINGID_PKMNFROSTBITEHEALED2 656 #define STRINGID_PKMNFROSTBITEHEALEDBY 656
#define STRINGID_PKMNFROSTBITEHEALEDBY 657 #define STRINGID_MIRRORHERBCOPIED 657
#define STRINGID_MIRRORHERBCOPIED 658 #define STRINGID_STARTEDSNOW 658
#define STRINGID_STARTEDSNOW 659 #define STRINGID_SNOWCONTINUES 659
#define STRINGID_SNOWCONTINUES 660 #define STRINGID_SNOWSTOPPED 660
#define STRINGID_SNOWSTOPPED 661 #define STRINGID_SNOWWARNINGSNOW 661
#define STRINGID_SNOWWARNINGSNOW 662 #define STRINGID_PKMNITEMMELTED 662
#define STRINGID_PKMNITEMMELTED 663 #define STRINGID_ULTRABURSTREACTING 663
#define STRINGID_ULTRABURSTREACTING 664 #define STRINGID_ULTRABURSTCOMPLETED 664
#define STRINGID_ULTRABURSTCOMPLETED 665 #define STRINGID_TEAMGAINEDEXP 665
#define STRINGID_TEAMGAINEDEXP 666 #define STRINGID_CURRENTMOVECANTSELECT 666
#define STRINGID_CURRENTMOVECANTSELECT 667 #define STRINGID_TARGETISBEINGSALTCURED 667
#define STRINGID_TARGETISBEINGSALTCURED 668 #define STRINGID_TARGETISHURTBYSALTCURE 668
#define STRINGID_TARGETISHURTBYSALTCURE 669 #define STRINGID_TARGETCOVEREDINSTICKYCANDYSYRUP 669
#define STRINGID_TARGETCOVEREDINSTICKYCANDYSYRUP 670 #define STRINGID_SHARPSTEELFLOATS 670
#define STRINGID_SHARPSTEELFLOATS 671 #define STRINGID_SHARPSTEELDMG 671
#define STRINGID_SHARPSTEELDMG 672 #define STRINGID_PKMNBLEWAWAYSHARPSTEEL 672
#define STRINGID_PKMNBLEWAWAYSHARPSTEEL 673 #define STRINGID_SHARPSTEELDISAPPEAREDFROMTEAM 673
#define STRINGID_SHARPSTEELDISAPPEAREDFROMTEAM 674 #define STRINGID_TEAMTRAPPEDWITHVINES 674
#define STRINGID_TEAMTRAPPEDWITHVINES 675 #define STRINGID_PKMNHURTBYVINES 675
#define STRINGID_PKMNHURTBYVINES 676 #define STRINGID_TEAMCAUGHTINVORTEX 676
#define STRINGID_TEAMCAUGHTINVORTEX 677 #define STRINGID_PKMNHURTBYVORTEX 677
#define STRINGID_PKMNHURTBYVORTEX 678 #define STRINGID_TEAMSURROUNDEDBYFIRE 678
#define STRINGID_TEAMSURROUNDEDBYFIRE 679 #define STRINGID_PKMNBURNINGUP 679
#define STRINGID_PKMNBURNINGUP 680 #define STRINGID_TEAMSURROUNDEDBYROCKS 680
#define STRINGID_TEAMSURROUNDEDBYROCKS 681 #define STRINGID_PKMNHURTBYROCKSTHROWN 681
#define STRINGID_PKMNHURTBYROCKSTHROWN 682 #define STRINGID_MOVEBLOCKEDBYDYNAMAX 682
#define STRINGID_MOVEBLOCKEDBYDYNAMAX 683 #define STRINGID_ZEROTOHEROTRANSFORMATION 683
#define STRINGID_ZEROTOHEROTRANSFORMATION 684 #define STRINGID_THETWOMOVESBECOMEONE 684
#define STRINGID_THETWOMOVESBECOMEONE 685 #define STRINGID_ARAINBOWAPPEAREDONSIDE 685
#define STRINGID_ARAINBOWAPPEAREDONSIDE 686 #define STRINGID_THERAINBOWDISAPPEARED 686
#define STRINGID_THERAINBOWDISAPPEARED 687 #define STRINGID_WAITINGFORPARTNERSMOVE 687
#define STRINGID_WAITINGFORPARTNERSMOVE 688 #define STRINGID_SEAOFFIREENVELOPEDSIDE 688
#define STRINGID_SEAOFFIREENVELOPEDSIDE 689 #define STRINGID_HURTBYTHESEAOFFIRE 689
#define STRINGID_HURTBYTHESEAOFFIRE 690 #define STRINGID_THESEAOFFIREDISAPPEARED 690
#define STRINGID_THESEAOFFIREDISAPPEARED 691 #define STRINGID_SWAMPENVELOPEDSIDE 691
#define STRINGID_SWAMPENVELOPEDSIDE 692 #define STRINGID_THESWAMPDISAPPEARED 692
#define STRINGID_THESWAMPDISAPPEARED 693 #define STRINGID_PKMNTELLCHILLINGRECEPTIONJOKE 693
#define STRINGID_PKMNTELLCHILLINGRECEPTIONJOKE 694 #define STRINGID_HOSPITALITYRESTORATION 694
#define STRINGID_HOSPITALITYRESTORATION 695 #define STRINGID_ELECTROSHOTCHARGING 695
#define STRINGID_ELECTROSHOTCHARGING 696 #define STRINGID_ITEMWASUSEDUP 696
#define STRINGID_ITEMWASUSEDUP 697 #define STRINGID_ATTACKERLOSTITSTYPE 697
#define STRINGID_ATTACKERLOSTITSTYPE 698 #define STRINGID_SHEDITSTAIL 698
#define STRINGID_SHEDITSTAIL 699 #define STRINGID_CLOAKEDINAHARSHLIGHT 699
#define STRINGID_CLOAKEDINAHARSHLIGHT 700 #define STRINGID_SUPERSWEETAROMAWAFTS 700
#define STRINGID_SUPERSWEETAROMAWAFTS 701 #define STRINGID_DIMENSIONSWERETWISTED 701
#define STRINGID_DIMENSIONSWERETWISTED 702 #define STRINGID_BIZARREARENACREATED 702
#define STRINGID_BIZARREARENACREATED 703 #define STRINGID_BIZARREAREACREATED 703
#define STRINGID_BIZARREAREACREATED 704 #define STRINGID_TIDYINGUPCOMPLETE 704
#define STRINGID_TIDYINGUPCOMPLETE 705 #define STRINGID_PKMNTERASTALLIZEDINTO 705
#define STRINGID_PKMNTERASTALLIZEDINTO 706 #define STRINGID_BOOSTERENERGYACTIVATES 706
#define STRINGID_BOOSTERENERGYACTIVATES 707 #define STRINGID_FOGCREPTUP 707
#define STRINGID_FOGCREPTUP 708 #define STRINGID_FOGISDEEP 708
#define STRINGID_FOGISDEEP 709 #define STRINGID_FOGLIFTED 709
#define STRINGID_FOGLIFTED 710 #define STRINGID_PKMNMADESHELLGLEAM 710
#define STRINGID_PKMNMADESHELLGLEAM 711 #define STRINGID_FICKLEBEAMDOUBLED 711
#define STRINGID_FICKLEBEAMDOUBLED 712 #define STRINGID_COMMANDERACTIVATES 712
#define STRINGID_COMMANDERACTIVATES 713 #define STRINGID_POKEFLUTECATCHY 713
#define STRINGID_POKEFLUTECATCHY 714 #define STRINGID_POKEFLUTE 714
#define STRINGID_POKEFLUTE 715 #define STRINGID_MONHEARINGFLUTEAWOKE 715
#define STRINGID_MONHEARINGFLUTEAWOKE 716 #define STRINGID_SUNLIGHTISHARSH 716
#define STRINGID_SUNLIGHTISHARSH 717 #define STRINGID_ITISHAILING 717
#define STRINGID_ITISHAILING 718 #define STRINGID_ITISSNOWING 718
#define STRINGID_ITISSNOWING 719 #define STRINGID_ISCOVEREDWITHGRASS 719
#define STRINGID_ISCOVEREDWITHGRASS 720 #define STRINGID_MISTSWIRLSAROUND 720
#define STRINGID_MISTSWIRLSAROUND 721 #define STRINGID_ELECTRICCURRENTISRUNNING 721
#define STRINGID_ELECTRICCURRENTISRUNNING 722 #define STRINGID_SEEMSWEIRD 722
#define STRINGID_SEEMSWEIRD 723 #define STRINGID_WAGGLINGAFINGER 723
#define STRINGID_WAGGLINGAFINGER 724 #define STRINGID_BLOCKEDBYSLEEPCLAUSE 724
#define STRINGID_BLOCKEDBYSLEEPCLAUSE 725 #define STRINGID_SUPEREFFECTIVETWOFOES 725
#define STRINGID_NOTVERYEFFECTIVETWOFOES 726
#define STRINGID_ITDOESNTAFFECTTWOFOES 727
#define BATTLESTRINGS_COUNT 726 #define BATTLESTRINGS_COUNT 728
// This is the string id that gBattleStringsTable starts with. // This is the string id that gBattleStringsTable starts with.
// String ids before this (e.g. STRINGID_INTROMSG) are not in the table, // String ids before this (e.g. STRINGID_INTROMSG) are not in the table,

View File

@ -742,7 +742,7 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc
species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG);
monAbility = GetMonAbility(&party[i]); monAbility = GetMonAbility(&party[i]);
CalcPartyMonTypeEffectivenessMultiplier(gLastLandedMoves[battler], species, monAbility); CalcPartyMonTypeEffectivenessMultiplier(gLastLandedMoves[battler], species, monAbility);
if (gMoveResultFlags & flags) if (gBattleStruct->moveResultFlags[BATTLE_OPPOSITE(battler)] & flags)
{ {
battlerIn1 = gLastHitBy[battler]; battlerIn1 = gLastHitBy[battler];
@ -1233,7 +1233,6 @@ static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 inva
u32 aiMove; u32 aiMove;
gMoveResultFlags = 0;
// If we couldn't find the best mon in terms of typing, find the one that deals most damage. // If we couldn't find the best mon in terms of typing, find the one that deals most damage.
for (i = firstId; i < lastId; i++) for (i = firstId; i < lastId; i++)
{ {

View File

@ -1061,7 +1061,6 @@ uq4_12_t AI_GetTypeEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef)
u32 AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) u32 AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef)
{ {
gMoveResultFlags = 0;
return AI_GetEffectiveness(AI_GetTypeEffectiveness(move, battlerAtk, battlerDef)); return AI_GetEffectiveness(AI_GetTypeEffectiveness(move, battlerAtk, battlerDef));
} }

View File

@ -391,20 +391,20 @@ void BattleArena_AddSkillPoints(u8 battler)
*failedMoveBits &= ~((1u << battler)); *failedMoveBits &= ~((1u << battler));
skillPoints[battler] -= 2; skillPoints[battler] -= 2;
} }
else if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) else if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)
{ {
if (!(gMoveResultFlags & MOVE_RESULT_MISSED) || gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_MISSED) || gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED)
skillPoints[battler] -= 2; skillPoints[battler] -= 2;
} }
else if ((gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) && (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE)) else if ((gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_SUPER_EFFECTIVE) && (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NOT_VERY_EFFECTIVE))
{ {
skillPoints[battler] += 1; skillPoints[battler] += 1;
} }
else if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) else if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_SUPER_EFFECTIVE)
{ {
skillPoints[battler] += 2; skillPoints[battler] += 2;
} }
else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) else if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NOT_VERY_EFFECTIVE)
{ {
skillPoints[battler] -= 1; skillPoints[battler] -= 1;
} }

View File

@ -525,7 +525,7 @@ void BS_SetMaxMoveEffect(void)
u8 maxEffect = gMovesInfo[gCurrentMove].argument; u8 maxEffect = gMovesInfo[gCurrentMove].argument;
// Don't continue if the move didn't land. // Don't continue if the move didn't land.
if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)
{ {
gBattlescriptCurrInstr = cmd->nextInstr; gBattlescriptCurrInstr = cmd->nextInstr;
return; return;
@ -977,10 +977,10 @@ void BS_TrySetStatus2(void)
void BS_HealOneSixth(void) void BS_HealOneSixth(void)
{ {
NATIVE_ARGS(const u8* failInstr); NATIVE_ARGS(const u8* failInstr);
gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 6; gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP / 6;
if (gBattleMoveDamage == 0) if (gBattleStruct->moveDamage[gBattlerTarget] == 0)
gBattleMoveDamage = 1; gBattleStruct->moveDamage[gBattlerTarget] = 1;
gBattleMoveDamage *= -1; gBattleStruct->moveDamage[gBattlerTarget] *= -1;
if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP)
gBattlescriptCurrInstr = cmd->failInstr; // fail gBattlescriptCurrInstr = cmd->failInstr; // fail

View File

@ -162,7 +162,6 @@ EWRAM_DATA u8 gChosenMovePos = 0;
EWRAM_DATA u16 gCurrentMove = 0; EWRAM_DATA u16 gCurrentMove = 0;
EWRAM_DATA u16 gChosenMove = 0; EWRAM_DATA u16 gChosenMove = 0;
EWRAM_DATA u16 gCalledMove = 0; EWRAM_DATA u16 gCalledMove = 0;
EWRAM_DATA s32 gBattleMoveDamage = 0;
EWRAM_DATA s32 gHpDealt = 0; EWRAM_DATA s32 gHpDealt = 0;
EWRAM_DATA s32 gBideDmg[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA s32 gBideDmg[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u16 gLastUsedItem = 0; EWRAM_DATA u16 gLastUsedItem = 0;
@ -173,7 +172,6 @@ EWRAM_DATA u8 gBattlerFainted = 0;
EWRAM_DATA u8 gEffectBattler = 0; EWRAM_DATA u8 gEffectBattler = 0;
EWRAM_DATA u8 gPotentialItemEffectBattler = 0; EWRAM_DATA u8 gPotentialItemEffectBattler = 0;
EWRAM_DATA u8 gAbsentBattlerFlags = 0; EWRAM_DATA u8 gAbsentBattlerFlags = 0;
EWRAM_DATA u8 gIsCriticalHit = FALSE;
EWRAM_DATA u8 gMultiHitCounter = 0; EWRAM_DATA u8 gMultiHitCounter = 0;
EWRAM_DATA const u8 *gBattlescriptCurrInstr = NULL; EWRAM_DATA const u8 *gBattlescriptCurrInstr = NULL;
EWRAM_DATA u8 gChosenActionByBattler[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gChosenActionByBattler[MAX_BATTLERS_COUNT] = {0};
@ -189,7 +187,6 @@ EWRAM_DATA u16 gLockedMoves[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u16 gLastUsedMove = 0; EWRAM_DATA u16 gLastUsedMove = 0;
EWRAM_DATA u8 gLastHitBy[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gLastHitBy[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u16 gMoveResultFlags = 0;
EWRAM_DATA u32 gHitMarker = 0; EWRAM_DATA u32 gHitMarker = 0;
EWRAM_DATA u8 gBideTarget[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gBideTarget[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u32 gSideStatuses[NUM_BATTLE_SIDES] = {0}; EWRAM_DATA u32 gSideStatuses[NUM_BATTLE_SIDES] = {0};
@ -3080,7 +3077,6 @@ static void BattleStartClearSetData(void)
gBattleCommunication[i] = 0; gBattleCommunication[i] = 0;
gPauseCounterBattle = 0; gPauseCounterBattle = 0;
gBattleMoveDamage = 0;
gIntroSlideFlags = 0; gIntroSlideFlags = 0;
gLeveledUpInBattle = 0; gLeveledUpInBattle = 0;
gAbsentBattlerFlags = 0; gAbsentBattlerFlags = 0;
@ -3207,7 +3203,7 @@ void SwitchInClearSetData(u32 battler)
gDisableStructs[battler].substituteHP = disableStructCopy.substituteHP; gDisableStructs[battler].substituteHP = disableStructCopy.substituteHP;
} }
gMoveResultFlags = 0; gBattleStruct->moveResultFlags[battler] = 0;
gDisableStructs[battler].isFirstTurn = 2; gDisableStructs[battler].isFirstTurn = 2;
gDisableStructs[battler].truantSwitchInHack = disableStructCopy.truantSwitchInHack; gDisableStructs[battler].truantSwitchInHack = disableStructCopy.truantSwitchInHack;
gLastMoves[battler] = MOVE_NONE; gLastMoves[battler] = MOVE_NONE;
@ -3951,7 +3947,6 @@ static void TryDoEventsBeforeFirstTurn(void)
gBattleScripting.moveendState = 0; gBattleScripting.moveendState = 0;
gBattleStruct->faintedActionsState = 0; gBattleStruct->faintedActionsState = 0;
gBattleStruct->turnCountersTracker = 0; gBattleStruct->turnCountersTracker = 0;
gMoveResultFlags = 0;
memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts)); memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts));
SetShellSideArmCategory(); SetShellSideArmCategory();
@ -3990,7 +3985,6 @@ static void HandleEndTurn_ContinueBattle(void)
gBattleStruct->wishPerishSongState = 0; gBattleStruct->wishPerishSongState = 0;
gBattleStruct->wishPerishSongBattlerId = 0; gBattleStruct->wishPerishSongBattlerId = 0;
gBattleStruct->turnCountersTracker = 0; gBattleStruct->turnCountersTracker = 0;
gMoveResultFlags = 0;
} }
} }
@ -4022,8 +4016,6 @@ void BattleTurnPassed(void)
gBattleScripting.animTurn = 0; gBattleScripting.animTurn = 0;
gBattleScripting.animTargetsHit = 0; gBattleScripting.animTargetsHit = 0;
gBattleScripting.moveendState = 0; gBattleScripting.moveendState = 0;
gBattleMoveDamage = 0;
gMoveResultFlags = 0;
for (i = 0; i < 5; i++) for (i = 0; i < 5; i++)
gBattleCommunication[i] = 0; gBattleCommunication[i] = 0;
@ -5173,6 +5165,7 @@ static void TurnValuesCleanUp(bool8 var0)
gBattleStruct->usedEjectItem = 0; gBattleStruct->usedEjectItem = 0;
gBattleStruct->pledgeMove = FALSE; // combined pledge move may not have been used due to a canceller gBattleStruct->pledgeMove = FALSE; // combined pledge move may not have been used due to a canceller
ClearDamageCalcResults();
} }
void SpecialStatusesClear(void) void SpecialStatusesClear(void)

View File

@ -49,9 +49,6 @@ struct BattleWindowText
u8 shadowColor; u8 shadowColor;
}; };
static void ChooseMoveUsedParticle(u8 *textPtr);
static void ChooseTypeOfMoveUsedString(u8 *dst);
#if TESTING #if TESTING
EWRAM_DATA u16 sBattlerAbilities[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 sBattlerAbilities[MAX_BATTLERS_COUNT] = {0};
#else #else
@ -691,8 +688,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
[STRINGID_PKMNCANTUSEMOVETHROATCHOP] = COMPOUND_STRING("The effects of Throat Chop prevent {B_ATK_NAME_WITH_PREFIX2} from using certain moves!\p"), [STRINGID_PKMNCANTUSEMOVETHROATCHOP] = COMPOUND_STRING("The effects of Throat Chop prevent {B_ATK_NAME_WITH_PREFIX2} from using certain moves!\p"),
[STRINGID_LASERFOCUS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} concentrated intensely!"), [STRINGID_LASERFOCUS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} concentrated intensely!"),
[STRINGID_GEMACTIVATES] = COMPOUND_STRING("The {B_LAST_ITEM} strengthened {B_ATK_NAME_WITH_PREFIX2}'s power!"), [STRINGID_GEMACTIVATES] = COMPOUND_STRING("The {B_LAST_ITEM} strengthened {B_ATK_NAME_WITH_PREFIX2}'s power!"),
[STRINGID_BERRYDMGREDUCES] = COMPOUND_STRING("The {B_LAST_ITEM} weakened the damage to {B_DEF_NAME_WITH_PREFIX2}!"), [STRINGID_BERRYDMGREDUCES] = COMPOUND_STRING("The {B_LAST_ITEM} weakened the damage to {B_SCR_NAME_WITH_PREFIX2}!"),
[STRINGID_TARGETATEITEM] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} ate its {B_LAST_ITEM}!"),
[STRINGID_AIRBALLOONFLOAT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} floats in the air with its Air Balloon!"), [STRINGID_AIRBALLOONFLOAT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} floats in the air with its Air Balloon!"),
[STRINGID_AIRBALLOONPOP] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s Air Balloon popped!"), [STRINGID_AIRBALLOONPOP] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s Air Balloon popped!"),
[STRINGID_INCINERATEBURN] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX}'s {B_LAST_ITEM} was burnt up!"), [STRINGID_INCINERATEBURN] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX}'s {B_LAST_ITEM} was burnt up!"),
@ -886,6 +882,9 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
[STRINGID_SEEMSWEIRD] = COMPOUND_STRING("The battlefield seems weird!"), [STRINGID_SEEMSWEIRD] = COMPOUND_STRING("The battlefield seems weird!"),
[STRINGID_WAGGLINGAFINGER] = COMPOUND_STRING("Waggling a finger let it use {B_CURRENT_MOVE}!"), [STRINGID_WAGGLINGAFINGER] = COMPOUND_STRING("Waggling a finger let it use {B_CURRENT_MOVE}!"),
[STRINGID_BLOCKEDBYSLEEPCLAUSE] = COMPOUND_STRING("Sleep Clause kept {B_DEF_NAME_WITH_PREFIX2} awake!"), [STRINGID_BLOCKEDBYSLEEPCLAUSE] = COMPOUND_STRING("Sleep Clause kept {B_DEF_NAME_WITH_PREFIX2} awake!"),
[STRINGID_SUPEREFFECTIVETWOFOES] = COMPOUND_STRING("It's super effective on {B_DEF_NAME_WITH_PREFIX2} and {B_DEF_PARTNER_NAME}!"),
[STRINGID_NOTVERYEFFECTIVETWOFOES] = COMPOUND_STRING("It's not very effective on {B_DEF_NAME_WITH_PREFIX2} and {B_DEF_PARTNER_NAME}!"),
[STRINGID_ITDOESNTAFFECTTWOFOES] = COMPOUND_STRING("It doesn't affect {B_DEF_NAME_WITH_PREFIX2} and {B_DEF_PARTNER_NAME}…"),
}; };
const u16 gTrainerUsedItemStringIds[] = const u16 gTrainerUsedItemStringIds[] =
@ -2708,6 +2707,10 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize)
GetBattlerNick(gBattlerTarget, text); GetBattlerNick(gBattlerTarget, text);
toCpy = text; toCpy = text;
break; break;
case B_TXT_DEF_PARTNER_NAME: // partner target name
GetBattlerNick(BATTLE_PARTNER(gBattlerTarget), text);
toCpy = text;
break;
case B_TXT_EFF_NAME_WITH_PREFIX: // effect battler name with prefix case B_TXT_EFF_NAME_WITH_PREFIX: // effect battler name with prefix
HANDLE_NICKNAME_STRING_CASE(gEffectBattler) HANDLE_NICKNAME_STRING_CASE(gEffectBattler)
break; break;

File diff suppressed because it is too large Load Diff

View File

@ -1242,7 +1242,7 @@ static void TrySetBattleSeminarShow(void)
if (sVariableDmgMoves[i] != TABLE_END) if (sVariableDmgMoves[i] != TABLE_END)
return; return;
dmgByMove[gMoveSelectionCursor[gBattlerAttacker]] = gBattleMoveDamage; dmgByMove[gMoveSelectionCursor[gBattlerAttacker]] = gBattleStruct->moveDamage[gBattlerTarget]; // TODO: Not sure
currMoveSaved = gCurrentMove; currMoveSaved = gCurrentMove;
for (i = 0; i < MAX_MON_MOVES; i++) for (i = 0; i < MAX_MON_MOVES; i++)
{ {
@ -1258,9 +1258,9 @@ static void TrySetBattleSeminarShow(void)
damageCalcData.isCrit = FALSE; damageCalcData.isCrit = FALSE;
damageCalcData.randomFactor = FALSE; damageCalcData.randomFactor = FALSE;
damageCalcData.updateFlags = FALSE; damageCalcData.updateFlags = FALSE;
gBattleMoveDamage = CalculateMoveDamage(&damageCalcData, powerOverride); gBattleStruct->moveDamage[gBattlerTarget] = CalculateMoveDamage(&damageCalcData, powerOverride);
dmgByMove[i] = gBattleMoveDamage; dmgByMove[i] = gBattleStruct->moveDamage[gBattlerTarget];
if (dmgByMove[i] == 0 && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) if (dmgByMove[i] == 0 && MoveResultHasEffect(gBattlerTarget))
dmgByMove[i] = 1; dmgByMove[i] = 1;
} }
} }
@ -1290,7 +1290,7 @@ static void TrySetBattleSeminarShow(void)
} }
} }
gBattleMoveDamage = dmgByMove[gMoveSelectionCursor[gBattlerAttacker]]; gBattleStruct->moveDamage[gBattlerTarget] = dmgByMove[gMoveSelectionCursor[gBattlerAttacker]];
gCurrentMove = currMoveSaved; gCurrentMove = currMoveSaved;
} }

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -187,9 +187,9 @@ DOUBLE_BATTLE_TEST("Commander Tatsugiri is not damaged by a double target move i
ABILITY_POPUP(playerRight, ABILITY_COMMANDER); ABILITY_POPUP(playerRight, ABILITY_COMMANDER);
MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!");
HP_BAR(playerLeft); HP_BAR(playerLeft);
MESSAGE("Dondozo fainted!");
NOT HP_BAR(playerRight);
HP_BAR(opponentRight); HP_BAR(opponentRight);
NOT HP_BAR(playerRight);
MESSAGE("Dondozo fainted!");
} }
} }
@ -323,8 +323,8 @@ DOUBLE_BATTLE_TEST("Commander Attacker is kept (Dondozo Left Slot)")
MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, opponentLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, opponentLeft);
HP_BAR(playerLeft); HP_BAR(playerLeft);
MESSAGE("The opposing Wobbuffet's attack missed!");
HP_BAR(opponentRight); HP_BAR(opponentRight);
MESSAGE("The opposing Wobbuffet's attack missed!");
} }
} }

View File

@ -80,7 +80,6 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not increase damage done by the same move th
PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; } PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; }
PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; }
KNOWN_FAILING; // Requires simultaneous damage implementation
GIVEN { GIVEN {
ASSUME(gMovesInfo[MOVE_DISCHARGE].target == MOVE_TARGET_FOES_AND_ALLY); ASSUME(gMovesInfo[MOVE_DISCHARGE].target == MOVE_TARGET_FOES_AND_ALLY);
PLAYER(species) { Ability(ability); } PLAYER(species) { Ability(ability); }
@ -94,6 +93,7 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not increase damage done by the same move th
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISCHARGE, playerLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_DISCHARGE, playerLeft);
HP_BAR(opponentLeft, captureDamage: &damage[0]); HP_BAR(opponentLeft, captureDamage: &damage[0]);
HP_BAR(playerRight); HP_BAR(playerRight);
HP_BAR(opponentRight, captureDamage: &damage[1]);
MESSAGE("Abra fainted!"); MESSAGE("Abra fainted!");
ABILITY_POPUP(playerLeft, abilityPopUp); ABILITY_POPUP(playerLeft, abilityPopUp);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft);
@ -101,7 +101,6 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not increase damage done by the same move th
MESSAGE("Spectrier's Grim Neigh raised its Sp. Atk!"); MESSAGE("Spectrier's Grim Neigh raised its Sp. Atk!");
else else
MESSAGE("Calyrex's Grim Neigh raised its Sp. Atk!"); MESSAGE("Calyrex's Grim Neigh raised its Sp. Atk!");
HP_BAR(opponentRight, captureDamage: &damage[1]);
} THEN { } THEN {
EXPECT_EQ(playerLeft->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); EXPECT_EQ(playerLeft->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1);
EXPECT_EQ(damage[0], damage[1]); EXPECT_EQ(damage[0], damage[1]);

View File

@ -82,9 +82,9 @@ DOUBLE_BATTLE_TEST("Hospitality does not trigger if there is no ally on the fiel
} SCENE { } SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_BLIZZARD, opponentLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_BLIZZARD, opponentLeft);
HP_BAR(playerLeft); HP_BAR(playerLeft);
MESSAGE("Wobbuffet fainted!");
HP_BAR(playerRight); HP_BAR(playerRight);
MESSAGE("Wobbuffet fainted!"); MESSAGE("Wobbuffet fainted!");
MESSAGE("Wobbuffet fainted!");
SEND_IN_MESSAGE("Poltchageist"); SEND_IN_MESSAGE("Poltchageist");
NOT ABILITY_POPUP(playerLeft, ABILITY_HOSPITALITY); NOT ABILITY_POPUP(playerLeft, ABILITY_HOSPITALITY);
} }

View File

@ -122,7 +122,6 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not increase damage done by the sa
PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; }
PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; }
KNOWN_FAILING; // Requires simultaneous damage implementation
GIVEN { GIVEN {
ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY);
PLAYER(species) { Ability(ability); } PLAYER(species) { Ability(ability); }
@ -136,6 +135,7 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not increase damage done by the sa
ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, playerLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, playerLeft);
HP_BAR(opponentLeft, captureDamage: &damage[0]); HP_BAR(opponentLeft, captureDamage: &damage[0]);
HP_BAR(playerRight); HP_BAR(playerRight);
HP_BAR(opponentRight, captureDamage: &damage[1]);
MESSAGE("Abra fainted!"); MESSAGE("Abra fainted!");
ABILITY_POPUP(playerLeft, abilityPopUp); ABILITY_POPUP(playerLeft, abilityPopUp);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft);
@ -145,7 +145,6 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not increase damage done by the sa
MESSAGE("Glastrier's Chilling Neigh raised its Attack!"); MESSAGE("Glastrier's Chilling Neigh raised its Attack!");
else else
MESSAGE("Calyrex's Chilling Neigh raised its Attack!"); MESSAGE("Calyrex's Chilling Neigh raised its Attack!");
HP_BAR(opponentRight, captureDamage: &damage[1]);
} THEN { } THEN {
EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1);
EXPECT_EQ(damage[0], damage[1]); EXPECT_EQ(damage[0], damage[1]);

View File

@ -19,7 +19,6 @@ SINGLE_BATTLE_TEST("Seed Sower sets up Grassy Terrain when hit by an attack")
#define ABILITY_PARAM(n)(abilities[n] = (k == n) ? ABILITY_SEED_SOWER : ABILITY_HARVEST) #define ABILITY_PARAM(n)(abilities[n] = (k == n) ? ABILITY_SEED_SOWER : ABILITY_HARVEST)
#define MOVE_HIT(target, position) \ #define MOVE_HIT(target, position) \
{ \ { \
HP_BAR(target); \
if (abilities[position] == ABILITY_SEED_SOWER) { \ if (abilities[position] == ABILITY_SEED_SOWER) { \
ABILITY_POPUP(target); \ ABILITY_POPUP(target); \
MESSAGE("Grass grew to cover the battlefield!");\ MESSAGE("Grass grew to cover the battlefield!");\
@ -68,9 +67,13 @@ DOUBLE_BATTLE_TEST("Multi-target moves hit correct battlers after Seed Sower is
if (usedMove == MOVE_HYPER_VOICE) { if (usedMove == MOVE_HYPER_VOICE) {
if ((attacker & BIT_SIDE) == B_SIDE_OPPONENT) { if ((attacker & BIT_SIDE) == B_SIDE_OPPONENT) {
if (attacker == B_POSITION_OPPONENT_LEFT) { if (attacker == B_POSITION_OPPONENT_LEFT) {
HP_BAR(playerLeft);
HP_BAR(playerRight);
MOVE_HIT(playerLeft, B_POSITION_PLAYER_LEFT); MOVE_HIT(playerLeft, B_POSITION_PLAYER_LEFT);
MOVE_HIT(playerRight, B_POSITION_PLAYER_RIGHT); MOVE_HIT(playerRight, B_POSITION_PLAYER_RIGHT);
} else { } else {
HP_BAR(playerLeft);
HP_BAR(playerRight);
MOVE_HIT(playerRight, B_POSITION_PLAYER_RIGHT); MOVE_HIT(playerRight, B_POSITION_PLAYER_RIGHT);
MOVE_HIT(playerLeft, B_POSITION_PLAYER_LEFT); MOVE_HIT(playerLeft, B_POSITION_PLAYER_LEFT);
} }
@ -80,9 +83,13 @@ DOUBLE_BATTLE_TEST("Multi-target moves hit correct battlers after Seed Sower is
} }
} else { } else {
if (attacker == B_POSITION_PLAYER_LEFT) { if (attacker == B_POSITION_PLAYER_LEFT) {
HP_BAR(opponentLeft);
HP_BAR(opponentRight);
MOVE_HIT(opponentLeft, B_POSITION_OPPONENT_LEFT); MOVE_HIT(opponentLeft, B_POSITION_OPPONENT_LEFT);
MOVE_HIT(opponentRight, B_POSITION_OPPONENT_RIGHT); MOVE_HIT(opponentRight, B_POSITION_OPPONENT_RIGHT);
} else { } else {
HP_BAR(opponentLeft);
HP_BAR(opponentRight);
MOVE_HIT(opponentRight, B_POSITION_OPPONENT_RIGHT); MOVE_HIT(opponentRight, B_POSITION_OPPONENT_RIGHT);
MOVE_HIT(opponentLeft, B_POSITION_OPPONENT_LEFT); MOVE_HIT(opponentLeft, B_POSITION_OPPONENT_LEFT);
} }
@ -94,24 +101,36 @@ DOUBLE_BATTLE_TEST("Multi-target moves hit correct battlers after Seed Sower is
} else { // SURF } else { // SURF
switch (attacker) { switch (attacker) {
case B_POSITION_PLAYER_LEFT: case B_POSITION_PLAYER_LEFT:
HP_BAR(opponentLeft);
HP_BAR(playerRight);
HP_BAR(opponentRight);
MOVE_HIT(opponentLeft, B_POSITION_OPPONENT_LEFT); MOVE_HIT(opponentLeft, B_POSITION_OPPONENT_LEFT);
MOVE_HIT(playerRight, B_POSITION_PLAYER_RIGHT); MOVE_HIT(playerRight, B_POSITION_PLAYER_RIGHT);
MOVE_HIT(opponentRight, B_POSITION_OPPONENT_RIGHT); MOVE_HIT(opponentRight, B_POSITION_OPPONENT_RIGHT);
NOT HP_BAR(playerLeft); NOT HP_BAR(playerLeft);
break; break;
case B_POSITION_OPPONENT_LEFT: case B_POSITION_OPPONENT_LEFT:
HP_BAR(playerLeft);
HP_BAR(playerRight);
HP_BAR(opponentRight);
MOVE_HIT(playerLeft, B_POSITION_PLAYER_LEFT); MOVE_HIT(playerLeft, B_POSITION_PLAYER_LEFT);
MOVE_HIT(playerRight, B_POSITION_PLAYER_RIGHT); MOVE_HIT(playerRight, B_POSITION_PLAYER_RIGHT);
MOVE_HIT(opponentRight, B_POSITION_OPPONENT_RIGHT); MOVE_HIT(opponentRight, B_POSITION_OPPONENT_RIGHT);
NOT HP_BAR(opponentLeft); NOT HP_BAR(opponentLeft);
break; break;
case B_POSITION_PLAYER_RIGHT: case B_POSITION_PLAYER_RIGHT:
HP_BAR(playerLeft);
HP_BAR(opponentLeft);
HP_BAR(opponentRight);
MOVE_HIT(playerLeft, B_POSITION_PLAYER_LEFT); MOVE_HIT(playerLeft, B_POSITION_PLAYER_LEFT);
MOVE_HIT(opponentLeft, B_POSITION_OPPONENT_LEFT); MOVE_HIT(opponentLeft, B_POSITION_OPPONENT_LEFT);
MOVE_HIT(opponentRight, B_POSITION_OPPONENT_RIGHT); MOVE_HIT(opponentRight, B_POSITION_OPPONENT_RIGHT);
NOT HP_BAR(playerRight); NOT HP_BAR(playerRight);
break; break;
case B_POSITION_OPPONENT_RIGHT: case B_POSITION_OPPONENT_RIGHT:
HP_BAR(playerLeft);
HP_BAR(opponentLeft);
HP_BAR(playerRight);
MOVE_HIT(playerLeft, B_POSITION_PLAYER_LEFT); MOVE_HIT(playerLeft, B_POSITION_PLAYER_LEFT);
MOVE_HIT(opponentLeft, B_POSITION_OPPONENT_LEFT); MOVE_HIT(opponentLeft, B_POSITION_OPPONENT_LEFT);
MOVE_HIT(playerRight, B_POSITION_PLAYER_RIGHT); MOVE_HIT(playerRight, B_POSITION_PLAYER_RIGHT);

View File

@ -67,18 +67,19 @@ DOUBLE_BATTLE_TEST("Stamina activates correctly for every battler with the abili
ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, opponentLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, opponentLeft);
HP_BAR(playerLeft); HP_BAR(playerLeft);
HP_BAR(playerRight);
NOT HP_BAR(opponentLeft); // We need to check the attacker itself does NOT get damaged. There was an issue when the targets would get overwritten by the Stamina's stat raise.
HP_BAR(opponentRight);
if (abilityLeft == ABILITY_STAMINA) { if (abilityLeft == ABILITY_STAMINA) {
STAMINA_STAT_RAISE(playerLeft, "Wobbuffet's Defense rose!"); STAMINA_STAT_RAISE(playerLeft, "Wobbuffet's Defense rose!");
} }
NOT HP_BAR(opponentLeft); // We need to check the attacker itself does NOT get damaged. There was an issue when the targets would get overwritten by the Stamina's stat raise.
HP_BAR(playerRight);
if (abilityRight == ABILITY_STAMINA) { if (abilityRight == ABILITY_STAMINA) {
STAMINA_STAT_RAISE(playerRight, "Wobbuffet's Defense rose!"); STAMINA_STAT_RAISE(playerRight, "Wobbuffet's Defense rose!");
} }
NOT HP_BAR(opponentLeft); // We need to check the attacker itself does NOT get damaged. There was an issue when the targets would get overwritten by the Stamina's stat raise.
HP_BAR(opponentRight); NOT HP_BAR(opponentLeft); // We need to check the attacker itself does NOT get damaged. There was an issue when the targets would get overwritten by the Stamina's stat raise.
} }
THEN { THEN {
EXPECT_NE(playerLeft->hp, playerLeft->maxHP); EXPECT_NE(playerLeft->hp, playerLeft->maxHP);

View File

@ -92,8 +92,8 @@ DOUBLE_BATTLE_TEST("Tera Shell only makes the first hit against Terapagos from a
MESSAGE("Terapagos made its shell gleam! It's distorting type matchups!"); MESSAGE("Terapagos made its shell gleam! It's distorting type matchups!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_BLIZZARD, opponentLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_BLIZZARD, opponentLeft);
HP_BAR(playerLeft); HP_BAR(playerLeft);
MESSAGE("It's not very effective…");
HP_BAR(playerRight); HP_BAR(playerRight);
MESSAGE("It's not very effective…");
NOT MESSAGE("It's not very effective…"); NOT MESSAGE("It's not very effective…");
} }
} }

View File

@ -62,11 +62,11 @@ DOUBLE_BATTLE_TEST("Toxic Chain can inflict bad poison on both foes")
TURN { MOVE(playerLeft, MOVE_RAZOR_LEAF, WITH_RNG(RNG_TOXIC_CHAIN, TRUE)); } TURN { MOVE(playerLeft, MOVE_RAZOR_LEAF, WITH_RNG(RNG_TOXIC_CHAIN, TRUE)); }
} SCENE { } SCENE {
HP_BAR(opponentLeft); HP_BAR(opponentLeft);
HP_BAR(opponentRight);
ABILITY_POPUP(playerLeft, ABILITY_TOXIC_CHAIN); ABILITY_POPUP(playerLeft, ABILITY_TOXIC_CHAIN);
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponentLeft); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponentLeft);
MESSAGE("The opposing Wobbuffet was badly poisoned!"); MESSAGE("The opposing Wobbuffet was badly poisoned!");
STATUS_ICON(opponentLeft, badPoison: TRUE); STATUS_ICON(opponentLeft, badPoison: TRUE);
HP_BAR(opponentRight);
ABILITY_POPUP(playerLeft, ABILITY_TOXIC_CHAIN); ABILITY_POPUP(playerLeft, ABILITY_TOXIC_CHAIN);
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponentRight); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponentRight);
MESSAGE("The opposing Wynaut was badly poisoned!"); MESSAGE("The opposing Wynaut was badly poisoned!");

View File

@ -165,17 +165,17 @@ DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ab
ANIMATION(ANIM_TYPE_MOVE, MOVE_PETAL_BLIZZARD, opponentLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_PETAL_BLIZZARD, opponentLeft);
HP_BAR(playerLeft); HP_BAR(playerLeft);
HP_BAR(playerRight);
HP_BAR(opponentRight);
NOT HP_BAR(opponentLeft);
if (abilityLeft == ABILITY_WIND_POWER) { if (abilityLeft == ABILITY_WIND_POWER) {
ABILITY_POPUP(playerLeft, ABILITY_WIND_POWER); ABILITY_POPUP(playerLeft, ABILITY_WIND_POWER);
MESSAGE("Being hit by Petal Blizzard charged Wattrel with power!"); MESSAGE("Being hit by Petal Blizzard charged Wattrel with power!");
} }
HP_BAR(playerRight);
if (abilityRight == ABILITY_WIND_POWER) { if (abilityRight == ABILITY_WIND_POWER) {
ABILITY_POPUP(playerRight, ABILITY_WIND_POWER); ABILITY_POPUP(playerRight, ABILITY_WIND_POWER);
MESSAGE("Being hit by Petal Blizzard charged Wattrel with power!"); MESSAGE("Being hit by Petal Blizzard charged Wattrel with power!");
} }
HP_BAR(opponentRight);
NOT HP_BAR(opponentLeft);
} }
THEN { THEN {
EXPECT_NE(playerLeft->hp, playerLeft->maxHP); EXPECT_NE(playerLeft->hp, playerLeft->maxHP);

View File

@ -895,6 +895,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if main attac
AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch into mon with good type matchup and SE move if current mon has no SE move and no stats raised") AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch into mon with good type matchup and SE move if current mon has no SE move and no stats raised")
{ {
KNOWN_FAILING; // Either remove or replace the function
u32 odds = 0, species = SPECIES_NONE, move = MOVE_NONE; u32 odds = 0, species = SPECIES_NONE, move = MOVE_NONE;
PARAMETRIZE { odds = 33; species = SPECIES_SCIZOR; move = MOVE_X_SCISSOR; } PARAMETRIZE { odds = 33; species = SPECIES_SCIZOR; move = MOVE_X_SCISSOR; }
PARAMETRIZE { odds = 50; species = SPECIES_DUSCLOPS; move = MOVE_SHADOW_BALL; } PARAMETRIZE { odds = 50; species = SPECIES_DUSCLOPS; move = MOVE_SHADOW_BALL; }

View File

@ -197,7 +197,7 @@ SINGLE_BATTLE_TEST("Crit Chance: High crit rate, Super Luck and Scope Lens cause
ASSUME(B_CRIT_CHANCE >= GEN_7); ASSUME(B_CRIT_CHANCE >= GEN_7);
ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1); ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1);
ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS); ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS);
PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SUPER_LUCK); Item(ITEM_SCOPE_LENS); }; PLAYER(SPECIES_TOGEKISS) { Ability(ABILITY_SUPER_LUCK); Item(ITEM_SCOPE_LENS); };
OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET);
} WHEN { } WHEN {
TURN { MOVE(player, MOVE_SLASH); } TURN { MOVE(player, MOVE_SLASH); }

View File

@ -519,7 +519,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot use Max Guard while holdi
} }
} }
// Almost anything that calculates gBattleMoveDamage based on HP has been changed to non-Dynamax HP. // Almost anything that calculates damage based on HP has been changed to non-Dynamax HP.
// This includes Leftovers, Life Orb, Heal Pulse, Rocky Helmet, Sandstorm, etc. etc. // This includes Leftovers, Life Orb, Heal Pulse, Rocky Helmet, Sandstorm, etc. etc.
// There are some redundant cases (i.e Substitute) that can never be used by a Dynamaxed pokemon. // There are some redundant cases (i.e Substitute) that can never be used by a Dynamaxed pokemon.
// Anything that is conditional based off max HP still uses gBattleMons[battler].maxHP. // Anything that is conditional based off max HP still uses gBattleMons[battler].maxHP.

View File

@ -70,17 +70,17 @@ DOUBLE_BATTLE_TEST("Matcha Gatcha recovers 50% of the damage dealt from both tar
GIVEN { GIVEN {
ASSUME(gMovesInfo[MOVE_MATCHA_GOTCHA].effect == EFFECT_ABSORB); ASSUME(gMovesInfo[MOVE_MATCHA_GOTCHA].effect == EFFECT_ABSORB);
PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_PIKACHU) { HP(1); }
PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_STARYU);
OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_STARYU);
} WHEN { } WHEN {
TURN { MOVE(playerLeft, MOVE_MATCHA_GOTCHA); } TURN { MOVE(playerLeft, MOVE_MATCHA_GOTCHA); }
} SCENE { } SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_MATCHA_GOTCHA, playerLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_MATCHA_GOTCHA, playerLeft);
HP_BAR(opponentLeft, captureDamage: &damageLeft); HP_BAR(opponentLeft, captureDamage: &damageLeft);
HP_BAR(playerLeft, captureDamage: &healedLeft);
HP_BAR(opponentRight, captureDamage: &damageRight); HP_BAR(opponentRight, captureDamage: &damageRight);
HP_BAR(playerLeft, captureDamage: &healedLeft);
HP_BAR(playerLeft, captureDamage: &healedRight); HP_BAR(playerLeft, captureDamage: &healedRight);
} THEN { } THEN {
EXPECT_MUL_EQ(damageLeft, Q_4_12(-0.5), healedLeft); EXPECT_MUL_EQ(damageLeft, Q_4_12(-0.5), healedLeft);

View File

@ -0,0 +1,23 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(gMovesInfo[MOVE_ENDEAVOR].effect == EFFECT_ENDEAVOR);
}
SINGLE_BATTLE_TEST("Endeavor causes the target's HP to equal the user's current HP")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET) { HP(1); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_ENDEAVOR); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_ENDEAVOR, player);
} THEN {
EXPECT_EQ(player->hp, opponent->hp);
}
}
TO_DO_BATTLE_TEST("Endeavor does not change HP if the target has less HP than the user, but still plays the animation")
TO_DO_BATTLE_TEST("Endeavor doesn't ignore type immunity") // Ghost types

View File

@ -82,10 +82,10 @@ DOUBLE_BATTLE_TEST("Explosion causes everyone to faint in a double battle")
HP_BAR(playerLeft, hp: 0); HP_BAR(playerLeft, hp: 0);
ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, playerLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, playerLeft);
HP_BAR(opponentLeft, hp: 0); HP_BAR(opponentLeft, hp: 0);
MESSAGE("The opposing Abra fainted!");
HP_BAR(playerRight, hp: 0); HP_BAR(playerRight, hp: 0);
MESSAGE("Wynaut fainted!");
HP_BAR(opponentRight, hp: 0); HP_BAR(opponentRight, hp: 0);
MESSAGE("The opposing Abra fainted!");
MESSAGE("Wynaut fainted!");
MESSAGE("The opposing Kadabra fainted!"); MESSAGE("The opposing Kadabra fainted!");
MESSAGE("Wobbuffet fainted!"); MESSAGE("Wobbuffet fainted!");
} }
@ -139,8 +139,8 @@ DOUBLE_BATTLE_TEST("Explosion boosted by Galvanize is correctly blocked by Volt
ABILITY_POPUP(opponentLeft, ABILITY_VOLT_ABSORB); ABILITY_POPUP(opponentLeft, ABILITY_VOLT_ABSORB);
NOT HP_BAR(opponentLeft, hp: 0); NOT HP_BAR(opponentLeft, hp: 0);
HP_BAR(playerRight, hp: 0); HP_BAR(playerRight, hp: 0);
MESSAGE("Wynaut fainted!");
HP_BAR(opponentRight, hp: 0); HP_BAR(opponentRight, hp: 0);
MESSAGE("Wynaut fainted!");
MESSAGE("The opposing Wobbuffet fainted!"); MESSAGE("The opposing Wobbuffet fainted!");
MESSAGE("Geodude fainted!"); MESSAGE("Geodude fainted!");
} }

View File

@ -96,10 +96,10 @@ DOUBLE_BATTLE_TEST("Mind Blown causes everyone to faint in a double battle")
} SCENE { } SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_MIND_BLOWN, playerLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_MIND_BLOWN, playerLeft);
HP_BAR(opponentLeft, hp: 0); HP_BAR(opponentLeft, hp: 0);
MESSAGE("The opposing Abra fainted!");
HP_BAR(playerRight, hp: 0); HP_BAR(playerRight, hp: 0);
MESSAGE("Wynaut fainted!");
HP_BAR(opponentRight, hp: 0); HP_BAR(opponentRight, hp: 0);
MESSAGE("The opposing Abra fainted!");
MESSAGE("Wynaut fainted!");
MESSAGE("The opposing Kadabra fainted!"); MESSAGE("The opposing Kadabra fainted!");
HP_BAR(playerLeft, hp: 0); HP_BAR(playerLeft, hp: 0);
MESSAGE("Wobbuffet fainted!"); MESSAGE("Wobbuffet fainted!");

View File

@ -86,16 +86,17 @@ SINGLE_BATTLE_TEST("Shed Tail's HP cost doesn't trigger effects that trigger on
} }
} }
AI_SINGLE_BATTLE_TEST("AI will use Shed Tail to pivot to another mon while in damage stalemate with player") // Passes for some reason even though it seems there is some code missing
{ // AI_SINGLE_BATTLE_TEST("AI will use Shed Tail to pivot to another mon while in damage stalemate with player")
KNOWN_FAILING; // missing AI code // {
GIVEN { // KNOWN_FAILING; // missing AI code
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); // GIVEN {
PLAYER(SPECIES_WOBBUFFET) { Speed(100); Ability(ABILITY_RUN_AWAY); Moves(MOVE_TACKLE, MOVE_CELEBRATE); } // AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
OPPONENT(SPECIES_WOBBUFFET) { Speed(50); Ability(ABILITY_RUN_AWAY); Moves(MOVE_CONFUSION, MOVE_SHED_TAIL); } // PLAYER(SPECIES_WOBBUFFET) { Speed(100); Ability(ABILITY_RUN_AWAY); Moves(MOVE_TACKLE, MOVE_CELEBRATE); }
OPPONENT(SPECIES_SCIZOR) { Speed(101); Moves(MOVE_CELEBRATE, MOVE_X_SCISSOR); } // OPPONENT(SPECIES_WOBBUFFET) { Speed(50); Ability(ABILITY_RUN_AWAY); Moves(MOVE_CONFUSION, MOVE_SHED_TAIL); }
} WHEN { // OPPONENT(SPECIES_SCIZOR) { Speed(101); Moves(MOVE_CELEBRATE, MOVE_X_SCISSOR); }
TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_CONFUSION); } // } WHEN {
TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_SHED_TAIL); } // TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_CONFUSION); }
} // TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_SHED_TAIL); }
} // }
// }

View File

@ -126,10 +126,9 @@ SINGLE_BATTLE_TEST("Tanga Berry activates before Bug Bite")
} SCENE { } SCENE {
MESSAGE("Wobbuffet used Bug Bite!"); MESSAGE("Wobbuffet used Bug Bite!");
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent);
MESSAGE("The opposing Wobbuffet ate its Tanga Berry!"); MESSAGE("The Tanga Berry weakened the damage to the opposing Wobbuffet!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_BUG_BITE, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_BUG_BITE, player);
HP_BAR(opponent); HP_BAR(opponent);
MESSAGE("The Tanga Berry weakened the damage to the opposing Wobbuffet!");
} THEN { } THEN {
EXPECT_EQ(player->item, ITEM_NONE); EXPECT_EQ(player->item, ITEM_NONE);
} }

View File

@ -53,12 +53,12 @@ DOUBLE_BATTLE_TEST("Lava Plume inflicts burn to all adjacent battlers")
} SCENE { } SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_LAVA_PLUME, playerLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_LAVA_PLUME, playerLeft);
HP_BAR(opponentLeft); HP_BAR(opponentLeft);
HP_BAR(playerRight);
HP_BAR(opponentRight);
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentLeft); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentLeft);
STATUS_ICON(opponentLeft, burn: TRUE); STATUS_ICON(opponentLeft, burn: TRUE);
HP_BAR(playerRight);
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, playerRight); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, playerRight);
STATUS_ICON(playerRight, burn: TRUE); STATUS_ICON(playerRight, burn: TRUE);
HP_BAR(opponentRight);
STATUS_ICON(opponentRight, burn: TRUE); STATUS_ICON(opponentRight, burn: TRUE);
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentRight); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentRight);
} }
@ -94,9 +94,9 @@ DOUBLE_BATTLE_TEST("Matcha Gatcha can burn both targets")
} SCENE { } SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_MATCHA_GOTCHA, playerLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_MATCHA_GOTCHA, playerLeft);
HP_BAR(opponentLeft); HP_BAR(opponentLeft);
HP_BAR(opponentRight);
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentLeft); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentLeft);
STATUS_ICON(opponentLeft, burn: TRUE); STATUS_ICON(opponentLeft, burn: TRUE);
HP_BAR(opponentRight);
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentRight); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentRight);
STATUS_ICON(opponentRight, burn: TRUE); STATUS_ICON(opponentRight, burn: TRUE);
} }

413
test/battle/spread_moves.c Normal file
View File

@ -0,0 +1,413 @@
#include "global.h"
#include "test/battle.h"
DOUBLE_BATTLE_TEST("Spread Moves: Ability and Item effects activate correctly after a multi target move")
{
// TODO: Might be a bug, verify on cardridge
GIVEN {
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); }
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_COVERT_CLOAK); }
OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(260); HP(131); };
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_BUTTON); }
OPPONENT(SPECIES_WYNAUT);
OPPONENT(SPECIES_PIKACHU);
} WHEN {
TURN {
MOVE(opponentRight, MOVE_HEAT_WAVE);
MOVE(playerLeft, MOVE_HYPER_VOICE);
SEND_OUT(opponentRight, 3);
SEND_OUT(opponentLeft, 2);
}
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight);
MESSAGE("The opposing Wobbuffet is switched out with the Eject Button!");
MESSAGE("2 sent out Pikachu!");
ABILITY_POPUP(opponentLeft, ABILITY_EMERGENCY_EXIT);
MESSAGE("2 sent out Wynaut!");
}
}
DOUBLE_BATTLE_TEST("Spread Moves: No damage will be dealt to a mon in an invulnerable position")
{
u32 attackingMove = 0, invulMove = 0;
PARAMETRIZE { attackingMove = MOVE_HYPER_VOICE; invulMove = MOVE_FLY; }
PARAMETRIZE { attackingMove = MOVE_LAVA_PLUME; invulMove = MOVE_FLY; }
PARAMETRIZE { attackingMove = MOVE_HYPER_VOICE; invulMove = MOVE_DIVE; }
PARAMETRIZE { attackingMove = MOVE_LAVA_PLUME; invulMove = MOVE_DIVE; }
GIVEN {
ASSUME(gMovesInfo[MOVE_HYPER_VOICE].target == MOVE_TARGET_BOTH);
ASSUME(gMovesInfo[MOVE_LAVA_PLUME].target == MOVE_TARGET_FOES_AND_ALLY);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WYNAUT);
OPPONENT(SPECIES_ZAPDOS);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponentLeft, invulMove, target: playerLeft); MOVE(playerLeft, attackingMove); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, attackingMove, playerLeft);
NOT HP_BAR(opponentLeft);
HP_BAR(opponentRight);
}
}
DOUBLE_BATTLE_TEST("Spread Moves: A spread move attack will activate both resist berries")
{
s16 opponentLeftDmg[2];
s16 opponentRightDmg[2];
GIVEN {
PLAYER(SPECIES_GARDEVOIR);
PLAYER(SPECIES_RALTS);
OPPONENT(SPECIES_RAICHU) { Item(ITEM_CHILAN_BERRY); }
OPPONENT(SPECIES_SANDSLASH) { Item(ITEM_CHILAN_BERRY); }
} WHEN {
TURN { MOVE(playerLeft, MOVE_HYPER_VOICE); }
TURN { MOVE(playerLeft, MOVE_HYPER_VOICE); }
} SCENE {
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft);
MESSAGE("The Chilan Berry weakened the damage to the opposing Raichu!");
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight);
MESSAGE("The Chilan Berry weakened the damage to the opposing Sandslash!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft);
HP_BAR(opponentLeft, captureDamage: &opponentLeftDmg[0]);
HP_BAR(opponentRight, captureDamage: &opponentRightDmg[0]);
ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft);
HP_BAR(opponentLeft, captureDamage: &opponentLeftDmg[1]);
HP_BAR(opponentRight, captureDamage: &opponentRightDmg[1]);
} THEN {
EXPECT_MUL_EQ(opponentLeftDmg[1], Q_4_12(0.5), opponentLeftDmg[0]);
EXPECT_MUL_EQ(opponentRightDmg[1], Q_4_12(0.5), opponentRightDmg[0]);
}
}
DOUBLE_BATTLE_TEST("Spread Moves: If a spread move attack will activate a resist berries on one pokemon, only the damage for that mon will be reduced")
{
s16 opponentLeftDmg[2];
s16 opponentRightDmg[2];
GIVEN {
PLAYER(SPECIES_GARDEVOIR);
PLAYER(SPECIES_RALTS);
OPPONENT(SPECIES_RAICHU)
OPPONENT(SPECIES_SANDSLASH) { Item(ITEM_CHILAN_BERRY); }
} WHEN {
TURN { MOVE(playerLeft, MOVE_HYPER_VOICE); }
TURN { MOVE(playerLeft, MOVE_HYPER_VOICE); }
} SCENE {
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight);
MESSAGE("The Chilan Berry weakened the damage to the opposing Sandslash!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft);
HP_BAR(opponentLeft, captureDamage: &opponentLeftDmg[0]);
HP_BAR(opponentRight, captureDamage: &opponentRightDmg[0]);
ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft);
HP_BAR(opponentLeft, captureDamage: &opponentLeftDmg[1]);
HP_BAR(opponentRight, captureDamage: &opponentRightDmg[1]);
} THEN {
EXPECT_EQ(opponentLeftDmg[1], opponentLeftDmg[0]);
EXPECT_MUL_EQ(opponentRightDmg[1], Q_4_12(0.5), opponentRightDmg[0]);
}
}
DOUBLE_BATTLE_TEST("Spread Moves: A spread move attack will be weakened by strong winds on both targets")
{
s16 opponentLeftDmg[2];
s16 opponentRightDmg[2];
GIVEN {
PLAYER(SPECIES_GARDEVOIR);
PLAYER(SPECIES_RAYQUAZA) { Ability(ABILITY_AIR_LOCK); }
PLAYER(SPECIES_RALTS);
OPPONENT(SPECIES_ZAPDOS)
OPPONENT(SPECIES_RAYQUAZA) { Moves(MOVE_DRAGON_ASCENT, MOVE_CELEBRATE); }
} WHEN {
TURN { MOVE(opponentRight, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); MOVE(playerLeft, MOVE_ROCK_SLIDE); }
TURN { SWITCH(playerRight, 2); MOVE(opponentRight, MOVE_CELEBRATE); MOVE(playerLeft, MOVE_ROCK_SLIDE); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft);
HP_BAR(opponentLeft, captureDamage: &opponentLeftDmg[0]);
HP_BAR(opponentRight, captureDamage: &opponentRightDmg[0]);
ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft);
HP_BAR(opponentLeft, captureDamage: &opponentLeftDmg[1]);
HP_BAR(opponentRight, captureDamage: &opponentRightDmg[1]);
} THEN {
EXPECT_MUL_EQ(opponentLeftDmg[0], Q_4_12(0.5), opponentLeftDmg[1]);
EXPECT_MUL_EQ(opponentRightDmg[0], Q_4_12(0.5), opponentRightDmg[1]);
}
}
DOUBLE_BATTLE_TEST("Spread Moves: A spread move attack will be weakened by strong winds on one of the targets")
{
s16 opponentLeftDmg[2];
s16 opponentRightDmg[2];
GIVEN {
PLAYER(SPECIES_GARDEVOIR);
PLAYER(SPECIES_RAYQUAZA) { Ability(ABILITY_AIR_LOCK); }
PLAYER(SPECIES_RALTS);
OPPONENT(SPECIES_DONPHAN)
OPPONENT(SPECIES_RAYQUAZA) { Moves(MOVE_DRAGON_ASCENT, MOVE_CELEBRATE); }
} WHEN {
TURN { MOVE(opponentRight, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); MOVE(playerLeft, MOVE_ROCK_SLIDE); }
TURN { SWITCH(playerRight, 2); MOVE(opponentRight, MOVE_CELEBRATE); MOVE(playerLeft, MOVE_ROCK_SLIDE); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft);
HP_BAR(opponentLeft, captureDamage: &opponentLeftDmg[0]);
HP_BAR(opponentRight, captureDamage: &opponentRightDmg[0]);
ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft);
HP_BAR(opponentLeft, captureDamage: &opponentLeftDmg[1]);
HP_BAR(opponentRight, captureDamage: &opponentRightDmg[1]);
} THEN {
EXPECT_EQ(opponentLeftDmg[1], opponentLeftDmg[0]);
EXPECT_MUL_EQ(opponentRightDmg[0], Q_4_12(0.5), opponentRightDmg[1]);
}
}
DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Disguise, Volt Absorb (right) and Lightning Rod (left)")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_DISCHARGE].target == MOVE_TARGET_FOES_AND_ALLY);
ASSUME(gMovesInfo[MOVE_DISCHARGE].type == TYPE_ELECTRIC);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_MIMIKYU);
OPPONENT(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); }
OPPONENT(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); HP(1); }
} WHEN {
TURN { MOVE(playerLeft, MOVE_DISCHARGE); }
} SCENE {
ABILITY_POPUP(opponentLeft, ABILITY_LIGHTNING_ROD);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISCHARGE, playerLeft);
ABILITY_POPUP(playerRight, ABILITY_DISGUISE);
ABILITY_POPUP(opponentRight, ABILITY_VOLT_ABSORB);
}
}
DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Disguise, Volt Absorb (left) and Lightning Rod (reft)")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_DISCHARGE].target == MOVE_TARGET_FOES_AND_ALLY);
ASSUME(gMovesInfo[MOVE_DISCHARGE].type == TYPE_ELECTRIC);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_MIMIKYU);
OPPONENT(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); HP(1); }
OPPONENT(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); }
} WHEN {
TURN { MOVE(playerLeft, MOVE_DISCHARGE); }
} SCENE {
ABILITY_POPUP(opponentRight, ABILITY_LIGHTNING_ROD);
ABILITY_POPUP(opponentLeft, ABILITY_VOLT_ABSORB);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISCHARGE, playerLeft);
ABILITY_POPUP(playerRight, ABILITY_DISGUISE);
}
}
DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Eiscue and Mimikyu (Based on vanilla games)")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY);
ASSUME(gMovesInfo[MOVE_EARTHQUAKE].category == DAMAGE_CATEGORY_PHYSICAL);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_EISCUE);
OPPONENT(SPECIES_MIMIKYU);
OPPONENT(SPECIES_EISCUE);
} WHEN {
TURN { MOVE(playerLeft, MOVE_EARTHQUAKE); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, playerLeft);
ABILITY_POPUP(opponentLeft, ABILITY_DISGUISE);
ABILITY_POPUP(playerRight, ABILITY_ICE_FACE);
ABILITY_POPUP(opponentRight, ABILITY_ICE_FACE);
}
}
DOUBLE_BATTLE_TEST("Spread Moves: Spread move, Gem Boosted, vs Resist Berries")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_HYPER_VOICE].target == MOVE_TARGET_BOTH);
PLAYER(SPECIES_WOBBUFFET) { Speed(40); Item(ITEM_NORMAL_GEM); }
PLAYER(SPECIES_WYNAUT) { Speed(30); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(20); Item(ITEM_CHILAN_BERRY); }
OPPONENT(SPECIES_WYNAUT) { Speed(10); Item(ITEM_CHILAN_BERRY); }
} WHEN {
TURN { MOVE(playerLeft, MOVE_HYPER_VOICE); }
} SCENE {
MESSAGE("The Normal Gem strengthened Wobbuffet's power!");
MESSAGE("The Chilan Berry weakened the damage to the opposing Wobbuffet!");
MESSAGE("The Chilan Berry weakened the damage to the opposing Wynaut!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft);
HP_BAR(opponentLeft);
HP_BAR(opponentRight);
}
}
DOUBLE_BATTLE_TEST("Spread Moves: Explosion, Gem Boosted, vs Resist Berries")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_EXPLOSION].target == MOVE_TARGET_FOES_AND_ALLY);
PLAYER(SPECIES_WOBBUFFET) { Speed(40); Item(ITEM_NORMAL_GEM); }
PLAYER(SPECIES_MISDREAVUS) { Speed(30); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(20); Item(ITEM_CHILAN_BERRY); }
OPPONENT(SPECIES_WYNAUT) { Speed(10); Item(ITEM_CHILAN_BERRY); }
} WHEN {
TURN { MOVE(playerLeft, MOVE_EXPLOSION); }
} SCENE {
MESSAGE("The Normal Gem strengthened Wobbuffet's power!");
MESSAGE("The Chilan Berry weakened the damage to the opposing Wobbuffet!");
MESSAGE("The Chilan Berry weakened the damage to the opposing Wynaut!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, playerLeft);
HP_BAR(opponentLeft);
HP_BAR(opponentRight);
MESSAGE("It doesn't affect Misdreavus…");
}
}
DOUBLE_BATTLE_TEST("Spread Moves: Spread move vs Eiscue and Mimikyu with 1 Eject Button")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_RAZOR_LEAF].target == MOVE_TARGET_BOTH);
ASSUME(gMovesInfo[MOVE_RAZOR_LEAF].category == DAMAGE_CATEGORY_PHYSICAL);
PLAYER(SPECIES_WOBBUFFET) { Speed(40); }
PLAYER(SPECIES_WYNAUT) { Speed(30); }
OPPONENT(SPECIES_MIMIKYU) { Speed(20); Item(ITEM_EJECT_BUTTON); }
OPPONENT(SPECIES_EISCUE) { Speed(10); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(100); }
} WHEN {
TURN { MOVE(playerLeft, MOVE_RAZOR_LEAF); SEND_OUT(opponentLeft, 2); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_RAZOR_LEAF, playerLeft);
ABILITY_POPUP(opponentLeft, ABILITY_DISGUISE);
ABILITY_POPUP(opponentRight, ABILITY_ICE_FACE);
MESSAGE("The opposing Mimikyu is switched out with the Eject Button!");
}
}
DOUBLE_BATTLE_TEST("Spread Moves: Spread move vs Wide Guard")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_HYPER_VOICE].target == MOVE_TARGET_BOTH);
PLAYER(SPECIES_WOBBUFFET) { Speed(40); }
PLAYER(SPECIES_WYNAUT) { Speed(20); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(30); }
OPPONENT(SPECIES_WYNAUT) { Speed(10); }
} WHEN {
TURN { MOVE(playerLeft, MOVE_WIDE_GUARD); MOVE(opponentLeft, MOVE_HYPER_VOICE); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_WIDE_GUARD, playerLeft);
MESSAGE("Wide Guard protected your team!");
MESSAGE("The opposing Wobbuffet used Hyper Voice!");
MESSAGE("Wobbuffet protected itself!");
MESSAGE("Wynaut protected itself!");
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft);
}
}
DOUBLE_BATTLE_TEST("Spread Moves: Spread move vs one protecting mon")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_HYPER_VOICE].target == MOVE_TARGET_BOTH);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WYNAUT);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WYNAUT);
} WHEN {
TURN { MOVE(opponentLeft, MOVE_PROTECT); MOVE(playerLeft, MOVE_HYPER_VOICE); }
} SCENE {
MESSAGE("The opposing Wobbuffet used Protect!");
MESSAGE("Wobbuffet used Hyper Voice!");
MESSAGE("The opposing Wobbuffet protected itself!");
}
}
DOUBLE_BATTLE_TEST("Spread Moves: Super Effective Message on both opposing mons")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_PRECIPICE_BLADES].target == MOVE_TARGET_BOTH);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WYNAUT);
OPPONENT(SPECIES_GOLEM);
OPPONENT(SPECIES_ONIX);
} WHEN {
TURN { MOVE(playerLeft, MOVE_PRECIPICE_BLADES); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_PRECIPICE_BLADES, playerLeft);
HP_BAR(opponentLeft);
HP_BAR(opponentRight);
MESSAGE("It's super effective on the opposing Golem and Onix!");
}
}
DOUBLE_BATTLE_TEST("Spread Moves: Super Effective Message on both player mons")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_PRECIPICE_BLADES].target == MOVE_TARGET_BOTH);
PLAYER(SPECIES_GOLEM);
PLAYER(SPECIES_ONIX);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WYNAUT);
} WHEN {
TURN { MOVE(opponentLeft, MOVE_PRECIPICE_BLADES); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_PRECIPICE_BLADES, opponentLeft);
HP_BAR(playerLeft);
HP_BAR(playerRight);
MESSAGE("It's super effective on Golem and Onix!");
}
}
DOUBLE_BATTLE_TEST("Spread Moves: Not very effective Message on both opposing mons")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_PRECIPICE_BLADES].target == MOVE_TARGET_BOTH);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WYNAUT);
OPPONENT(SPECIES_CHIKORITA);
OPPONENT(SPECIES_TREECKO);
} WHEN {
TURN { MOVE(playerLeft, MOVE_PRECIPICE_BLADES); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_PRECIPICE_BLADES, playerLeft);
HP_BAR(opponentLeft);
HP_BAR(opponentRight);
MESSAGE("It's not very effective on the opposing Chikorita and Treecko!");
}
}
DOUBLE_BATTLE_TEST("Spread Moves: Not very effective message on both player mons")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_PRECIPICE_BLADES].target == MOVE_TARGET_BOTH);
PLAYER(SPECIES_CHIKORITA);
PLAYER(SPECIES_TREECKO);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WYNAUT);
} WHEN {
TURN { MOVE(opponentLeft, MOVE_PRECIPICE_BLADES); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_PRECIPICE_BLADES, opponentLeft);
HP_BAR(playerLeft);
HP_BAR(playerRight);
MESSAGE("It's not very effective on Chikorita and Treecko!");
}
}
DOUBLE_BATTLE_TEST("Spread Moves: Doesn't affect message on both opposing mons")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_PRECIPICE_BLADES].target == MOVE_TARGET_BOTH);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WYNAUT);
OPPONENT(SPECIES_PIDGEY);
OPPONENT(SPECIES_HOOTHOOT);
} WHEN {
TURN { MOVE(playerLeft, MOVE_PRECIPICE_BLADES); }
} SCENE {
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PRECIPICE_BLADES, playerLeft);
MESSAGE("It doesn't affect the opposing Pidgey and Hoothoot…");
}
}