From e1da37e03303b1a6dd6531d8a044339f337731a1 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Wed, 4 Apr 2018 22:35:47 +0200 Subject: [PATCH 1/6] Comment SapHealth Also fixed some Beat Up inconsistencies to make it more readable. --- engine/battle/effect_commands.asm | 27 +++++++++++++++++++------- engine/battle/move_effects/beat_up.asm | 22 ++++++++++++++++----- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/engine/battle/effect_commands.asm b/engine/battle/effect_commands.asm index 376624e44..9e304df72 100644 --- a/engine/battle/effect_commands.asm +++ b/engine/battle/effect_commands.asm @@ -4136,6 +4136,7 @@ BattleCommand_EatDream: ; 36008 SapHealth: ; 36011 + ; Divide damage by 2, store it in hDividend ld hl, wCurDamage ld a, [hli] srl a @@ -4145,10 +4146,11 @@ SapHealth: ; 36011 rr a ld [hDividend + 1], a or b - jr nz, .ok1 - ld a, $1 + jr nz, .at_least_one + ld a, 1 ld [hDividend + 1], a -.ok1 +.at_least_one + ld hl, wBattleMonHP ld de, wBattleMonMaxHP ld a, [hBattleTurn] @@ -4157,12 +4159,16 @@ SapHealth: ; 36011 ld hl, wEnemyMonHP ld de, wEnemyMonMaxHP .battlemonhp + + ; Store current HP in little endian wBuffer3/4 ld bc, wBuffer4 ld a, [hli] ld [bc], a ld a, [hl] dec bc ld [bc], a + + ; Store max HP in little endian wBuffer1/2 ld a, [de] dec bc ld [bc], a @@ -4170,6 +4176,8 @@ SapHealth: ; 36011 ld a, [de] dec bc ld [bc], a + + ; Add hDividend to current HP and copy it to little endian wBuffer5/6 ld a, [hDividend + 1] ld b, [hl] add b @@ -4180,7 +4188,9 @@ SapHealth: ; 36011 adc b ld [hli], a ld [wBuffer6], a - jr c, .okay2 + jr c, .max_hp + + ; Substract current HP from max HP (to see if we have more than max HP) ld a, [hld] ld b, a ld a, [de] @@ -4191,8 +4201,10 @@ SapHealth: ; 36011 ld a, [de] inc de sbc b - jr nc, .okay3 -.okay2 + jr nc, .finish + +.max_hp + ; Load max HP into current HP and copy it to little endian wBuffer5/6 ld a, [de] ld [hld], a ld [wBuffer5], a @@ -4201,7 +4213,8 @@ SapHealth: ; 36011 ld [hli], a ld [wBuffer6], a inc de -.okay3 + +.finish ld a, [hBattleTurn] and a hlcoord 10, 9 diff --git a/engine/battle/move_effects/beat_up.asm b/engine/battle/move_effects/beat_up.asm index 18e350504..2f326e362 100644 --- a/engine/battle/move_effects/beat_up.asm +++ b/engine/battle/move_effects/beat_up.asm @@ -5,9 +5,11 @@ BattleCommand_BeatUp: ; 35461 ld a, [hBattleTurn] and a jp nz, .enemy_beats_up + ld a, [wPlayerSubStatus3] bit SUBSTATUS_IN_LOOP, a jr nz, .next_mon + ld c, 20 call DelayFrames xor a @@ -51,11 +53,13 @@ BattleCommand_BeatUp: ; 35461 ld [wBeatUpHitAtLeastOnce], a ld hl, BeatUpAttackText call StdBattleTextBox + ld a, [wEnemyMonSpecies] ld [wCurSpecies], a call GetBaseData ld a, [wBaseDefense] ld c, a + push bc ld a, MON_SPECIES call GetBeatupMonLocation @@ -65,12 +69,14 @@ BattleCommand_BeatUp: ; 35461 ld a, [wBaseAttack] pop bc ld b, a + push bc ld a, MON_LEVEL call GetBeatupMonLocation ld a, [hl] ld e, a pop bc + ld a, [wPlayerMoveStructPower] ld d, a ret @@ -78,21 +84,22 @@ BattleCommand_BeatUp: ; 35461 .enemy_beats_up ld a, [wEnemySubStatus3] bit SUBSTATUS_IN_LOOP, a - jr nz, .not_first_enemy_beatup + jr nz, .enemy_next_mon xor a ld [wEnemyRolloutCount], a ld [wd002], a ld [wBeatUpHitAtLeastOnce], a - jr .enemy_continue + jr .enemy_got_mon -.not_first_enemy_beatup +.enemy_next_mon ld a, [wEnemyRolloutCount] ld b, a ld a, [wOTPartyCount] sub b ld [wd002], a -.enemy_continue + +.enemy_got_mon ld a, [wBattleMode] dec a jr z, .wild @@ -122,19 +129,20 @@ BattleCommand_BeatUp: ; 35461 call AddNTimes ld de, wStringBuffer1 call CopyBytes + .got_enemy_nick ld a, MON_HP call GetBeatupMonLocation ld a, [hli] or [hl] jp z, .beatup_fail + ld a, [wd002] ld b, a ld a, [wCurOTMon] cp b ld hl, wEnemyMonStatus jr z, .active_enemy - ld a, MON_STATUS call GetBeatupMonLocation .active_enemy @@ -157,11 +165,13 @@ BattleCommand_BeatUp: ; 35461 .finish_beatup ld hl, BeatUpAttackText call StdBattleTextBox + ld a, [wBattleMonSpecies] ld [wCurSpecies], a call GetBaseData ld a, [wBaseDefense] ld c, a + push bc ld a, MON_SPECIES call GetBeatupMonLocation @@ -171,12 +181,14 @@ BattleCommand_BeatUp: ; 35461 ld a, [wBaseAttack] pop bc ld b, a + push bc ld a, MON_LEVEL call GetBeatupMonLocation ld a, [hl] ld e, a pop bc + ld a, [wEnemyMoveStructPower] ld d, a ret From 682ca7e93c635b21b7ac3db709ba6296c53fa080 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Thu, 29 Mar 2018 10:57:55 +0200 Subject: [PATCH 2/6] Label bidefailtext This "unknown" battle command is actually used to give the proper fail message to bide. --- data/battle/effect_command_pointers.asm | 2 +- data/moves/effects.asm | 2 +- engine/battle/effect_commands.asm | 2 +- macros/scripts/battle_commands.asm | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/battle/effect_command_pointers.asm b/data/battle/effect_command_pointers.asm index b3eeea273..ae780dca6 100644 --- a/data/battle/effect_command_pointers.asm +++ b/data/battle/effect_command_pointers.asm @@ -168,7 +168,7 @@ BattleCommandPointers: ; 3fd28 dw BattleCommand_RageDamage ; 3527b dw BattleCommand_ResetTypeMatchup ; 34833 dw BattleCommand_AllStatsUp ; 36500 - dw BattleCommanda5 ; 35165 + dw BattleCommand_BideFailText ; 35165 dw BattleCommand_RaiseSubNoAnim ; 365af dw BattleCommand_LowerSubNoAnim ; 365c3 dw BattleCommanda8 ; 355b5 diff --git a/data/moves/effects.asm b/data/moves/effects.asm index c56ff2560..0a52319fb 100644 --- a/data/moves/effects.asm +++ b/data/moves/effects.asm @@ -797,7 +797,7 @@ Bide: resettypematchup checkhit hittarget - effect0xa5 + bidefailtext checkfaint checkdestinybond buildopponentrage diff --git a/engine/battle/effect_commands.asm b/engine/battle/effect_commands.asm index 9e304df72..9433c33b4 100644 --- a/engine/battle/effect_commands.asm +++ b/engine/battle/effect_commands.asm @@ -2437,7 +2437,7 @@ FailText_CheckOpponentProtect: ; 35157 ; 35165 -BattleCommanda5: ; 35165 +BattleCommand_BideFailText: ; 35165 ld a, [wAttackMissed] and a ret z diff --git a/macros/scripts/battle_commands.asm b/macros/scripts/battle_commands.asm index 33d7dc611..7802d0329 100644 --- a/macros/scripts/battle_commands.asm +++ b/macros/scripts/battle_commands.asm @@ -169,7 +169,7 @@ ENDM command ragedamage ; a2 command resettypematchup ; a3 command allstatsup ; a4 - command effect0xa5 ; a5 + command bidefailtext ; a5 command raisesubnoanim ; a6 command lowersubnoanim ; a7 command effect0xa8 ; a8 From c1e3d17769aa3088556dcd1142944541f7f6fd0e Mon Sep 17 00:00:00 2001 From: mid-kid Date: Tue, 3 Apr 2018 01:05:44 +0200 Subject: [PATCH 3/6] `endloop` loops back to critical itself The comments seemed to specify that `endloop` loops back to the command before `critical` and executes that, which simply isn't true. It loops back to `critical` itself, and executes `critical`, before continuing on with the remaining commands. --- engine/battle/effect_commands.asm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/engine/battle/effect_commands.asm b/engine/battle/effect_commands.asm index 9433c33b4..16b3cea9a 100644 --- a/engine/battle/effect_commands.asm +++ b/engine/battle/effect_commands.asm @@ -5651,7 +5651,7 @@ CheckPlayerHasMonToSwitchTo: ; 36994 BattleCommand_EndLoop: ; 369b6 ; endloop -; Loop back to the command before 'critical'. +; Loop back to 'critical'. ld de, wPlayerRolloutCount ld bc, wPlayerDamageTaken @@ -5766,7 +5766,6 @@ BattleCommand_EndLoop: ; 369b6 ld [bc], a ret -; Loop back to the command before 'critical'. .loop_back_to_critical ld a, [wBattleScriptBufferAddress + 1] ld h, a From 800f9489145dc7c82edb3fa86fc24a5ff7411533 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Tue, 3 Apr 2018 12:00:24 +0200 Subject: [PATCH 4/6] Label BattleCommand_BeatUpFailText --- data/battle/effect_command_pointers.asm | 2 +- data/moves/effects.asm | 2 +- engine/battle/effect_commands.asm | 2 +- engine/battle/move_effects/beat_up.asm | 4 +++- macros/scripts/battle_commands.asm | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/data/battle/effect_command_pointers.asm b/data/battle/effect_command_pointers.asm index ae780dca6..a57e08be7 100644 --- a/data/battle/effect_command_pointers.asm +++ b/data/battle/effect_command_pointers.asm @@ -171,7 +171,7 @@ BattleCommandPointers: ; 3fd28 dw BattleCommand_BideFailText ; 35165 dw BattleCommand_RaiseSubNoAnim ; 365af dw BattleCommand_LowerSubNoAnim ; 365c3 - dw BattleCommanda8 ; 355b5 + dw BattleCommand_BeatUpFailText ; 355b5 dw BattleCommand_ClearMissDamage ; 355d5 - a9 dw BattleCommand_MoveDelay ; 37e80 dw BattleCommand_HitTarget ; 34f57 diff --git a/data/moves/effects.asm b/data/moves/effects.asm index 0a52319fb..a262babe2 100644 --- a/data/moves/effects.asm +++ b/data/moves/effects.asm @@ -2056,7 +2056,7 @@ BeatUp: checkdestinybond buildopponentrage endloop - effect0xa8 + beatupfailtext raisesub kingsrock endmove diff --git a/engine/battle/effect_commands.asm b/engine/battle/effect_commands.asm index 16b3cea9a..b9a7382c0 100644 --- a/engine/battle/effect_commands.asm +++ b/engine/battle/effect_commands.asm @@ -5714,7 +5714,7 @@ BattleCommand_EndLoop: ; 369b6 ld a, BATTLE_VARS_SUBSTATUS3 call GetBattleVarAddr res SUBSTATUS_IN_LOOP, [hl] - call BattleCommanda8 + call BattleCommand_BeatUpFailText jp EndMoveEffect .not_triple_kick diff --git a/engine/battle/move_effects/beat_up.asm b/engine/battle/move_effects/beat_up.asm index 2f326e362..8ea308d90 100644 --- a/engine/battle/move_effects/beat_up.asm +++ b/engine/battle/move_effects/beat_up.asm @@ -203,7 +203,9 @@ BattleCommand_BeatUp: ; 35461 ; 355b5 -BattleCommanda8: ; 355b5 +BattleCommand_BeatUpFailText: ; 355b5 +; beatupfailtext + ld a, [wBeatUpHitAtLeastOnce] and a ret nz diff --git a/macros/scripts/battle_commands.asm b/macros/scripts/battle_commands.asm index 7802d0329..db446d9ff 100644 --- a/macros/scripts/battle_commands.asm +++ b/macros/scripts/battle_commands.asm @@ -172,7 +172,7 @@ ENDM command bidefailtext ; a5 command raisesubnoanim ; a6 command lowersubnoanim ; a7 - command effect0xa8 ; a8 + command beatupfailtext ; a8 command clearmissdamage ; a9 command movedelay ; aa command hittarget ; ab From 2958188fc6d1ea8d9a5c2d4f0d5a4e3d6ca8faaa Mon Sep 17 00:00:00 2001 From: mid-kid Date: Tue, 3 Apr 2018 13:15:18 +0200 Subject: [PATCH 5/6] Document more Beat Up-related bugs Two bugs related to not raising the substitute when it should, one bug related to not running king's rock when it should, and the other related to running king's rock when it shouldn't. Fun. --- docs/bugs_and_glitches.md | 78 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/docs/bugs_and_glitches.md b/docs/bugs_and_glitches.md index 0212ed6fc..1e63839a9 100644 --- a/docs/bugs_and_glitches.md +++ b/docs/bugs_and_glitches.md @@ -15,6 +15,8 @@ These are known bugs and glitches in the original Pokémon Crystal game: code th - [A Pokémon that fainted from Pursuit will have its old status condition when revived](#a-pokémon-that-fainted-from-pursuit-will-have-its-old-status-condition-when-revived) - [Lock-On and Mind Reader don't always bypass Fly and Dig](#lock-on-and-mind-reader-dont-always-bypass-fly-and-dig) - [Beat Up can desynchronize link battles](#beat-up-can-desynchronize-link-battles) +- [Beat Up may fail to raise substitute](#beat-up-may-fail-to-raise-substitute) +- [Beat Up may trigger King's Rock even if it failed](#beat-up-may-trigger-kings-rock-even-if-it-failed) - [Present damage is incorrect in link battles](#present-damage-is-incorrect-in-link-battles) - ["Smart" AI encourages Mean Look if its own Pokémon is badly poisoned](#smart-ai-encourages-mean-look-if-its-own-pokémon-is-badly-poisoned) - [AI makes a false assumption about `CheckTypeMatchup`](#ai-makes-a-false-assumption-about-checktypematchup) @@ -339,6 +341,82 @@ This is a bug with `BattleCommand_BeatUp` in [engine/battle/move_effects/beat_up **Fix:** Change `cp [hl]` to `cp c`. +## Beat Up may fail to raise substitute + +*Fixing this bug will break compatibility with standard Pokémon Crystal for link battles.* +(Only the fixes denoted with "breaking" will actually break compatibility, the others just affect what's shown on the screen with the patched game) + +This is a bug in `BattleCommand_EndLoop` in [engine/battle/effect_commands.asm](/engine/battle/effect_commands.asm) that prevents the rest of the move's effect from being executed if the player or enemy only has one mon in their party while using Beat Up. + +It prevents the substitute from being raised and the King's Rock from working. + +```asm +.only_one_beatup + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarAddr + res SUBSTATUS_IN_LOOP, [hl] + call BattleCommand_BeatUpFailText + jp EndMoveEffect +``` + +**Fix (breaking):** Replace the last two lines with `ret`. +**Fix (cosmetics):** Call `BattleCommand_RaiseSub` before the `jp`. + +There's a similar oversight in `BattleCommand_FailureText` in [engine/battle/effect_commands.asm](/engine/battle/effect_commands.asm) that will prevent the substitute from being raised if Beat Up is protected against. + +```asm + cp EFFECT_MULTI_HIT + jr z, .multihit + cp EFFECT_DOUBLE_HIT + jr z, .multihit + cp EFFECT_POISON_MULTI_HIT + jr z, .multihit + jp EndMoveEffect + +.multihit + call BattleCommand_RaiseSub + jp EndMoveEffect +``` + +**Fix:** Check for `EFFECT_BEAT_UP` as well. + + +## Beat Up may trigger King's Rock even if it failed + +*Fixing this bug will break compatibility with standard Pokémon Crystal for link battles.* + +This is a bug in how `wAttackMissed` is never set by BeatUp, even when none of the 'mon have been able to attack (due to being fainted or having a status effect), the King's Rock may activate. + +This bug can be fixed in a plethora of ways, but the most straight-forward would be in `BattleCommand_BeatUpFailText` in [engine/battle/move_effects/beat_up.asm](/engine/battle/move_effects/beat_up.asm), as that's always ran before the king's rock effect. + +```asm +BattleCommand_BeatUpFailText: ; 355b5 +; beatupfailtext + + ld a, [wBeatUpHitAtLeastOnce] + and a + ret nz + + jp PrintButItFailed +``` + +**Fix:** + +```asm +BattleCommand_BeatUpFailText: ; 355b5 +; beatupfailtext + + ld a, [wBeatUpHitAtLeastOnce] + and a + ret nz + + inc a + ld [wAttackMissed], a + + jp PrintButItFailed +``` + + ## Present damage is incorrect in link battles *Fixing this bug will break compatibility with standard Pokémon Crystal for link battles.* From d4025863cf56466b79827bace6d6b3e48ffd05e9 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Wed, 4 Apr 2018 23:27:40 +0200 Subject: [PATCH 6/6] Rename some battle commands `hittarget` was misleading, as it doesn't actually "hit" the target, it only plays the animation. As such, I've renamed it to `moveanim`. `checkfaint` has nothing to do with checking if the user or target has fainted, instead, it applies wCurDamage onto the target's HP, hitting the substitute if applicable. I've renamed the command to `applydamage` and all of its subfunctions accordingly. --- data/battle/effect_command_pointers.asm | 6 +- data/moves/effects.asm | 248 ++++++++++----------- engine/battle/effect_commands.asm | 120 +++++----- engine/battle/move_effects/false_swipe.asm | 6 + macros/scripts/battle_commands.asm | 6 +- 5 files changed, 198 insertions(+), 188 deletions(-) diff --git a/data/battle/effect_command_pointers.asm b/data/battle/effect_command_pointers.asm index a57e08be7..f18e3c230 100644 --- a/data/battle/effect_command_pointers.asm +++ b/data/battle/effect_command_pointers.asm @@ -14,10 +14,10 @@ BattleCommandPointers: ; 3fd28 dw BattleCommand_DamageVariation ; 34cfd dw BattleCommand_CheckHit ; 34d32 dw BattleCommand_LowerSub ; 34eee - dw BattleCommand_HitTargetNoSub ; 34f60 + dw BattleCommand_MoveAnimNoSub ; 34f60 dw BattleCommand_RaiseSub ; 35004 dw BattleCommand_FailureText ; 35023 - dw BattleCommand_CheckFaint ; 3505e + dw BattleCommand_ApplyDamage ; 3505e dw BattleCommand_CriticalText ; 35175 dw BattleCommand_SuperEffectiveText ; 351ad dw BattleCommand_CheckDestinyBond ; 351c0 @@ -174,7 +174,7 @@ BattleCommandPointers: ; 3fd28 dw BattleCommand_BeatUpFailText ; 355b5 dw BattleCommand_ClearMissDamage ; 355d5 - a9 dw BattleCommand_MoveDelay ; 37e80 - dw BattleCommand_HitTarget ; 34f57 + dw BattleCommand_MoveAnim ; 34f57 dw BattleCommand_TriStatusChance ; 3658f dw BattleCommand_SuperEffectiveLoopText ; 351a5 dw BattleCommand_StartLoop ; 35197 diff --git a/data/moves/effects.asm b/data/moves/effects.asm index a262babe2..eeb02b3a1 100644 --- a/data/moves/effects.asm +++ b/data/moves/effects.asm @@ -10,9 +10,9 @@ NormalHit: stab damagevariation checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -40,9 +40,9 @@ PoisonHit: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -60,9 +60,9 @@ LeechHit: stab damagevariation checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext draintarget @@ -82,9 +82,9 @@ BurnHit: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -103,9 +103,9 @@ FreezeHit: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -124,9 +124,9 @@ ParalyzeHit: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -145,9 +145,9 @@ Selfdestruct: damagevariation checkhit selfdestruct - hittargetnosub + moveanimnosub failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -165,9 +165,9 @@ DreamEater: stab damagevariation checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext eatdream @@ -544,9 +544,9 @@ AttackDownHit: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -566,9 +566,9 @@ DefenseDownHit: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -589,9 +589,9 @@ SpeedDownHit: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -611,9 +611,9 @@ SpecialAttackDownHit: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -633,9 +633,9 @@ SpecialDefenseDownHit: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -655,9 +655,9 @@ AccuracyDownHit: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -677,9 +677,9 @@ EvasionDownHit: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -699,9 +699,9 @@ DefenseUpHit: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -721,9 +721,9 @@ AttackUpHit: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -743,9 +743,9 @@ AllUpHit: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -763,9 +763,9 @@ PayDay: stab damagevariation checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext payday @@ -796,9 +796,9 @@ Bide: unleashenergy resettypematchup checkhit - hittarget + moveanim bidefailtext - checkfaint + applydamage checkdestinybond buildopponentrage kingsrock @@ -817,9 +817,9 @@ Rampage: stab damagevariation clearmissdamage - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -848,9 +848,9 @@ MultiHit: stab damagevariation clearmissdamage - hittargetnosub + moveanimnosub failuretext - checkfaint + applydamage criticaltext cleartext supereffectivelooptext @@ -875,9 +875,9 @@ PoisonMultiHit: stab damagevariation clearmissdamage - hittargetnosub + moveanimnosub failuretext - checkfaint + applydamage criticaltext cleartext supereffectivelooptext @@ -900,9 +900,9 @@ FlinchHit: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -916,9 +916,9 @@ OHKOHit: doturn stab ohko - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -935,9 +935,9 @@ RecoilHit: stab damagevariation checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext recoil @@ -980,9 +980,9 @@ ConfuseHit: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1022,9 +1022,9 @@ TriAttack: stab damagevariation checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1066,9 +1066,9 @@ SkyAttack: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1094,9 +1094,9 @@ HyperBeam: stab damagevariation checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext rechargenextturn @@ -1115,10 +1115,10 @@ Rage: checkhit ragedamage damagevariation - hittarget + moveanim failuretext rage - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1176,9 +1176,9 @@ RazorWind: stab damagevariation checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1198,10 +1198,10 @@ Fly: stab damagevariation checkhit - hittargetnosub + moveanimnosub raisesub failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1220,9 +1220,9 @@ TrapTarget: stab damagevariation clearmissdamage - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1239,9 +1239,9 @@ StaticDamage: constantdamage checkhit resettypematchup - hittarget + moveanim failuretext - checkfaint + applydamage checkdestinybond buildopponentrage kingsrock @@ -1254,9 +1254,9 @@ Reversal: constantdamage stab checkhit - hittarget + moveanim failuretext - checkfaint + applydamage supereffectivetext checkdestinybond buildopponentrage @@ -1268,9 +1268,9 @@ Counter: usedmovetext doturn counter - hittarget + moveanim failuretext - checkfaint + applydamage checkdestinybond buildopponentrage kingsrock @@ -1304,9 +1304,9 @@ Snore: checkhit effectchance snore - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1378,9 +1378,9 @@ FalseSwipe: damagevariation falseswipe checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1409,9 +1409,9 @@ TripleKick: stab damagevariation clearmissdamage - hittargetnosub + moveanimnosub failuretext - checkfaint + applydamage criticaltext cleartext supereffectivelooptext @@ -1434,9 +1434,9 @@ Thief: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext thief @@ -1470,9 +1470,9 @@ FlameWheel: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext defrost @@ -1543,9 +1543,9 @@ Rollout: checkhit rolloutpower damagevariation - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1582,9 +1582,9 @@ FuryCutter: checkhit furycutter damagevariation - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1611,9 +1611,9 @@ Return: stab damagevariation checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1634,7 +1634,7 @@ Present: damagevariation clearmissdamage failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1653,9 +1653,9 @@ Frustration: stab damagevariation checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1681,9 +1681,9 @@ SacredFire: damagevariation checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext defrost @@ -1704,9 +1704,9 @@ Magnitude: damagevariation checkhit doubleundergrounddamage - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1732,9 +1732,9 @@ Pursuit: damagevariation pursuit checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1752,9 +1752,9 @@ RapidSpin: stab damagevariation checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext clearhazards @@ -1794,9 +1794,9 @@ HiddenPower: stab damagevariation checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1824,7 +1824,7 @@ FakeOut: doturn checkhit fakeout - hittarget + moveanim failuretext endmove @@ -1847,9 +1847,9 @@ MirrorCoat: usedmovetext doturn mirrorcoat - hittarget + moveanim failuretext - checkfaint + applydamage checkdestinybond buildopponentrage kingsrock @@ -1867,9 +1867,9 @@ SkullBash: stab damagevariation checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1892,9 +1892,9 @@ Twister: doubleflyingdamage checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1914,9 +1914,9 @@ Earthquake: doubleundergrounddamage checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1933,9 +1933,9 @@ FutureSight: futuresight damagevariation ; skip here if last turn checkhit - hittargetnosub + moveanimnosub failuretext - checkfaint + applydamage checkdestinybond buildopponentrage endmove @@ -1951,9 +1951,9 @@ Gust: damagevariation doubleflyingdamage checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1972,9 +1972,9 @@ Stomp: doubleminimizedamage checkhit effectchance - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -1995,9 +1995,9 @@ Solarbeam: stab damagevariation checkhit - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -2017,9 +2017,9 @@ Thunder: effectchance stab damagevariation - hittarget + moveanim failuretext - checkfaint + applydamage criticaltext supereffectivetext checkdestinybond @@ -2047,9 +2047,9 @@ BeatUp: damagecalc damagevariation clearmissdamage - hittargetnosub + moveanimnosub failuretext - checkfaint + applydamage criticaltext cleartext supereffectivetext diff --git a/engine/battle/effect_commands.asm b/engine/battle/effect_commands.asm index b9a7382c0..ea6c22dda 100644 --- a/engine/battle/effect_commands.asm +++ b/engine/battle/effect_commands.asm @@ -556,8 +556,8 @@ CheckEnemyTurn: ; 3421f and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND call z, PlayFXAnimID - ld c, $1 - call EnemyHurtItself + ld c, TRUE + call DoEnemyDamage call BattleCommand_RaiseSub call CantMove jp EndTurn @@ -676,8 +676,8 @@ HitConfusion: ; 343a5 call CallBattleCore ld a, $1 ld [hBGMapMode], a - ld c, $1 - call PlayerHurtItself + ld c, TRUE + call DoPlayerDamage jp BattleCommand_RaiseSub ; 343db @@ -2081,16 +2081,16 @@ BattleCommand_LowerSub: ; 34eee ; 34f57 -BattleCommand_HitTarget: ; 34f57 -; hittarget +BattleCommand_MoveAnim: ; 34f57 +; moveanim call BattleCommand_LowerSub - call BattleCommand_HitTargetNoSub + call BattleCommand_MoveAnimNoSub jp BattleCommand_RaiseSub ; 34f60 -BattleCommand_HitTargetNoSub: ; 34f60 +BattleCommand_MoveAnimNoSub: ; 34f60 ld a, [wAttackMissed] and a jp nz, BattleCommand_MoveDelay @@ -2274,65 +2274,68 @@ BattleCommand_FailureText: ; 35023 ; 3505e -BattleCommand_CheckFaint: ; 3505e -; checkfaint +BattleCommand_ApplyDamage: ; 3505e +; applydamage ld a, BATTLE_VARS_SUBSTATUS1_OPP call GetBattleVar bit SUBSTATUS_ENDURE, a - jr z, .not_enduring - call BattleCommand_FalseSwipe - ld b, $0 - jr nc, .okay - ld b, $1 - jr .okay + jr z, .focus_band -.not_enduring + call BattleCommand_FalseSwipe + ld b, 0 + jr nc, .damage + ld b, 1 + jr .damage + +.focus_band call GetOpponentItem ld a, b cp HELD_FOCUS_BAND - ld b, $0 - jr nz, .okay + ld b, 0 + jr nz, .damage + call BattleRandom cp c - jr nc, .okay + jr nc, .damage call BattleCommand_FalseSwipe - ld b, $0 - jr nc, .okay - ld b, $2 -.okay + ld b, 0 + jr nc, .damage + ld b, 2 + +.damage push bc - call .check_sub - ld c, $0 + call .update_damage_taken + ld c, FALSE ld a, [hBattleTurn] and a jr nz, .damage_player - call EnemyHurtItself + call DoEnemyDamage jr .done_damage .damage_player - call PlayerHurtItself + call DoPlayerDamage .done_damage pop bc ld a, b and a ret z + dec a - jr nz, .not_enduring2 + jr nz, .focus_band_text ld hl, EnduredText jp StdBattleTextBox -.not_enduring2 +.focus_band_text call GetOpponentItem ld a, [hl] ld [wNamedObjectIndexBuffer], a call GetItemName - ld hl, HungOnText jp StdBattleTextBox -.check_sub +.update_damage_taken ld a, BATTLE_VARS_SUBSTATUS4_OPP call GetBattleVar bit SUBSTATUS_SUBSTITUTE, a @@ -2341,10 +2344,10 @@ BattleCommand_CheckFaint: ; 3505e ld de, wPlayerDamageTaken + 1 ld a, [hBattleTurn] and a - jr nz, .damage_taken + jr nz, .got_damage_taken ld de, wEnemyDamageTaken + 1 -.damage_taken +.got_damage_taken ld a, [wCurDamage + 1] ld b, a ld a, [de] @@ -2418,11 +2421,11 @@ GetFailureResultText: ; 350e4 ld a, $1 ld [wKickCounter], a call LoadMoveAnim - ld c, $1 + ld c, TRUE ld a, [hBattleTurn] and a - jp nz, EnemyHurtItself - jp PlayerHurtItself + jp nz, DoEnemyDamage + jp DoPlayerDamage FailText_CheckOpponentProtect: ; 35157 ld a, BATTLE_VARS_SUBSTATUS1_OPP @@ -3620,15 +3623,13 @@ PlayFXAnimID: ; 35d08 ld c, 3 call DelayFrames - callfar PlayBattleAnim - ret ; 35d1c -EnemyHurtItself: ; 35d1c +DoEnemyDamage: ; 35d1c ld hl, wCurDamage ld a, [hli] ld b, a @@ -3638,13 +3639,14 @@ EnemyHurtItself: ; 35d1c ld a, c and a - jr nz, .mimic_sub_check - + jr nz, .ignore_substitute ld a, [wEnemySubStatus4] bit SUBSTATUS_SUBSTITUTE, a - jp nz, SelfInflictDamageToSubstitute + jp nz, DoSubstituteDamage -.mimic_sub_check +.ignore_substitute + ; Substract wCurDamage from wEnemyMonHP. + ; store original HP in little endian wBuffer3/4 ld a, [hld] ld b, a ld a, [wEnemyMonHP + 1] @@ -3657,19 +3659,18 @@ EnemyHurtItself: ; 35d1c ld [wBuffer4], a sbc b ld [wEnemyMonHP], a - jr nc, .mimic_faint + jr nc, .no_underflow ld a, [wBuffer4] ld [hli], a ld a, [wBuffer3] ld [hl], a - xor a ld hl, wEnemyMonHP ld [hli], a ld [hl], a -.mimic_faint +.no_underflow ld hl, wEnemyMonMaxHP ld a, [hli] ld [wBuffer2], a @@ -3680,6 +3681,7 @@ EnemyHurtItself: ; 35d1c ld [wBuffer6], a ld a, [hl] ld [wBuffer5], a + hlcoord 2, 2 xor a ld [wWhichHPBar], a @@ -3690,7 +3692,7 @@ EnemyHurtItself: ; 35d1c ; 35d7e -PlayerHurtItself: ; 35d7e +DoPlayerDamage: ; 35d7e ld hl, wCurDamage ld a, [hli] ld b, a @@ -3700,12 +3702,15 @@ PlayerHurtItself: ; 35d7e ld a, c and a - jr nz, .mimic_sub_check - + jr nz, .ignore_substitute ld a, [wPlayerSubStatus4] bit SUBSTATUS_SUBSTITUTE, a - jp nz, SelfInflictDamageToSubstitute -.mimic_sub_check + jp nz, DoSubstituteDamage + +.ignore_substitute + ; Substract wCurDamage from wBattleMonHP. + ; store original HP in little endian wBuffer3/4 + ; store new HP in little endian wBuffer5/6 ld a, [hld] ld b, a ld a, [wBattleMonHP + 1] @@ -3719,14 +3724,13 @@ PlayerHurtItself: ; 35d7e sbc b ld [wBattleMonHP], a ld [wBuffer6], a - jr nc, .mimic_faint + jr nc, .no_underflow ld a, [wBuffer4] ld [hli], a ld a, [wBuffer3] ld [hl], a xor a - ld hl, wBattleMonHP ld [hli], a ld [hl], a @@ -3734,14 +3738,15 @@ PlayerHurtItself: ; 35d7e ld [hli], a ld [hl], a -.mimic_faint +.no_underflow ld hl, wBattleMonMaxHP ld a, [hli] ld [wBuffer2], a ld a, [hl] ld [wBuffer1], a + hlcoord 10, 9 - ld a, $1 + ld a, 1 ld [wWhichHPBar], a predef AnimateHPBar .did_no_damage @@ -3750,8 +3755,7 @@ PlayerHurtItself: ; 35d7e ; 35de0 -SelfInflictDamageToSubstitute: ; 35de0 - +DoSubstituteDamage: ; 35de0 ld hl, SubTookDamageText call StdBattleTextBox diff --git a/engine/battle/move_effects/false_swipe.asm b/engine/battle/move_effects/false_swipe.asm index e93b627ec..f00de91e7 100644 --- a/engine/battle/move_effects/false_swipe.asm +++ b/engine/battle/move_effects/false_swipe.asm @@ -1,6 +1,8 @@ BattleCommand_FalseSwipe: ; 35c94 ; falseswipe +; Makes sure wCurDamage < MonHP + ld hl, wEnemyMonHP ld a, [hBattleTurn] and a @@ -15,12 +17,14 @@ BattleCommand_FalseSwipe: ; 35c94 pop de pop hl jr c, .done + ld a, [hli] ld [de], a inc de ld a, [hl] dec a ld [de], a + inc a jr nz, .okay dec de @@ -28,11 +32,13 @@ BattleCommand_FalseSwipe: ; 35c94 dec a ld [de], a .okay + ld a, [wCriticalHit] cp 2 jr nz, .carry xor a ld [wCriticalHit], a + .carry scf ret diff --git a/macros/scripts/battle_commands.asm b/macros/scripts/battle_commands.asm index db446d9ff..48e034bdf 100644 --- a/macros/scripts/battle_commands.asm +++ b/macros/scripts/battle_commands.asm @@ -15,10 +15,10 @@ ENDM command damagevariation ; 08 command checkhit ; 09 command lowersub ; 0a - command hittargetnosub ; 0b + command moveanimnosub ; 0b command raisesub ; 0c command failuretext ; 0d - command checkfaint ; 0e + command applydamage ; 0e command criticaltext ; 0f command supereffectivetext ; 10 command checkdestinybond ; 11 @@ -175,7 +175,7 @@ ENDM command beatupfailtext ; a8 command clearmissdamage ; a9 command movedelay ; aa - command hittarget ; ab + command moveanim ; ab command tristatuschance ; ac command supereffectivelooptext ; ad command startloop ; ae