diff --git a/data/battle/effect_command_pointers.asm b/data/battle/effect_command_pointers.asm index b3eeea273..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 @@ -168,13 +168,13 @@ 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 + 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 c56ff2560..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 - effect0xa5 - checkfaint + moveanim + bidefailtext + 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,16 +2047,16 @@ BeatUp: damagecalc damagevariation clearmissdamage - hittargetnosub + moveanimnosub failuretext - checkfaint + applydamage criticaltext cleartext supereffectivetext checkdestinybond buildopponentrage endloop - effect0xa8 + beatupfailtext raisesub kingsrock endmove diff --git a/docs/bugs_and_glitches.md b/docs/bugs_and_glitches.md index 2c7f83e25..95c5e032f 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.* diff --git a/engine/battle/effect_commands.asm b/engine/battle/effect_commands.asm index 376624e44..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 @@ -2437,7 +2440,7 @@ FailText_CheckOpponentProtect: ; 35157 ; 35165 -BattleCommanda5: ; 35165 +BattleCommand_BideFailText: ; 35165 ld a, [wAttackMissed] and a ret z @@ -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 @@ -4136,6 +4140,7 @@ BattleCommand_EatDream: ; 36008 SapHealth: ; 36011 + ; Divide damage by 2, store it in hDividend ld hl, wCurDamage ld a, [hli] srl a @@ -4145,10 +4150,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 +4163,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 +4180,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 +4192,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 +4205,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 +4217,8 @@ SapHealth: ; 36011 ld [hli], a ld [wBuffer6], a inc de -.okay3 + +.finish ld a, [hBattleTurn] and a hlcoord 10, 9 @@ -5638,7 +5655,7 @@ CheckPlayerHasMonToSwitchTo: ; 36994 BattleCommand_EndLoop: ; 369b6 ; endloop -; Loop back to the command before 'critical'. +; Loop back to 'critical'. ld de, wPlayerRolloutCount ld bc, wPlayerDamageTaken @@ -5701,7 +5718,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 @@ -5753,7 +5770,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 diff --git a/engine/battle/move_effects/beat_up.asm b/engine/battle/move_effects/beat_up.asm index 18e350504..8ea308d90 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 @@ -191,7 +203,9 @@ BattleCommand_BeatUp: ; 35461 ; 355b5 -BattleCommanda8: ; 355b5 +BattleCommand_BeatUpFailText: ; 355b5 +; beatupfailtext + ld a, [wBeatUpHitAtLeastOnce] and a ret nz 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 33d7dc611..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 @@ -169,13 +169,13 @@ 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 + command beatupfailtext ; a8 command clearmissdamage ; a9 command movedelay ; aa - command hittarget ; ab + command moveanim ; ab command tristatuschance ; ac command supereffectivelooptext ; ad command startloop ; ae