summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRangi <35663410+Rangi42@users.noreply.github.com>2019-03-03 19:31:47 -0500
committerGitHub <noreply@github.com>2019-03-03 19:31:47 -0500
commit9e9f43bce776cfb92991bd601115c65baca07230 (patch)
treeb0ee2d9219481804d0c38f63aae98f3ed438ac5d
parenteee79d7049232c50a17d7d445a2b2b65fed0e056 (diff)
parentf6e94dfd7903578e39ef419f04303937bedf9628 (diff)
Merge pull request #610 from ISSOtm/pursuit_fix
Fix Confusion and Pursuit bugs in #603
-rw-r--r--docs/bugs_and_glitches.md83
-rw-r--r--engine/battle/core.asm6
2 files changed, 84 insertions, 5 deletions
diff --git a/docs/bugs_and_glitches.md b/docs/bugs_and_glitches.md
index e59530db4..a24399931 100644
--- a/docs/bugs_and_glitches.md
+++ b/docs/bugs_and_glitches.md
@@ -247,7 +247,65 @@ This bug existed for all battles in Gold and Silver, and was only fixed for sing
([Video](https://twitter.com/crystal_rby/status/874626362287562752))
-*To do:* Identify specific code causing this bug and fix it.
+**Fix:** Edit the end of [hram.asm](/hram.asm) to create a new temporary variable:
+
+```diff
+ hClockResetTrigger:: db ; ffeb
++hIsConfusionDamage:: db ; ffec
+```
+
+Then edit `HitSelfInConfusion` in [engine/battle/effect_commands.asm](/engine/battle/effect_commands.asm):
+
+```diff
+ pop af
+ ld e, a
++ ld a, 1
++ ldh [hIsConfusionDamage], a
+ ret
+```
+
+Then, in the same file, edit `BattleCommand_DamageCalc`:
+
+```diff
+ .skip_zero_damage_check
+
++ xor a ; Not confusion damage
++ ldh [hIsConfusionDamage], a
++
++ConfusionDamageCalc:
+ ; Minimum defense value is 1.
+ ld a, c
+ and a
+ jr nz, .not_dividing_by_zero
+ ld c, 1
+ .not_dividing_by_zero
+```
+
+```diff
+ ; Item boosts
++ ldh a, [hIsConfusionDamage]
++ and a
++ jr nz, .DoneItem ; Item boosts don't apply to confusion damage
+ call GetUserItem
+```
+
+Finally, replace the calls in `CheckEnemyTurn` and `HitConfusion`, still in the same file:
+
+```diff
+ ld hl, HurtItselfText
+ call StdBattleTextBox
+ call HitSelfInConfusion
+- call BattleCommand_DamageCalc
++ call ConfusionDamageCalc
+ call BattleCommand_LowerSub
+```
+
+```diff
+ call HitSelfInConfusion
+- call BattleCommand_DamageCalc
++ call ConfusionDamageCalc
+ call BattleCommand_LowerSub
+```
## Moves that lower Defense can do so after breaking a Substitute
@@ -345,7 +403,28 @@ Add this to the end of each file:
([Video](https://www.youtube.com/watch?v=tiRvw-Nb2ME))
-*To do:* Identify specific code causing this bug and fix it.
+**Fix:** Edit `PursuitSwitch` in [engine/battle/core.asm](/engine/battle/core.asm)
+
+```diff
+ ld a, $f0
+ ld [wCryTracks], a
+ ld a, [wBattleMonSpecies]
+ call PlayStereoCry
++ ld a, [wCurBattleMon]
++ push af
+ ld a, [wLastPlayerMon]
++ ld [wCurBattleMon], a
++ call UpdateFaintedPlayerMon
++ pop af
++ ld [wCurBattleMon], a
+- ld c, a
+- ld hl, wBattleParticipantsNotFainted
+- ld b, RESET_FLAG
+- predef SmallFarFlagAction
+ call PlayerMonFaintedAnimation
+ ld hl, BattleText_MonFainted
+ jr .done_fainted
+```
## Lock-On and Mind Reader don't always bypass Fly and Dig
diff --git a/engine/battle/core.asm b/engine/battle/core.asm
index 72e85f088..4e9d13f15 100644
--- a/engine/battle/core.asm
+++ b/engine/battle/core.asm
@@ -2131,7 +2131,7 @@ UpdateBattleStateAndExperienceAfterEnemyFaint:
ld a, [wWhichMonFaintedFirst]
and a
jr nz, .player_mon_did_not_faint
- call PlayerMonFaintHappinessMod
+ call UpdateFaintedPlayerMon
.player_mon_did_not_faint
call CheckPlayerPartyForFitMon
@@ -2601,7 +2601,7 @@ HandlePlayerMonFaint:
call z, FaintEnemyPokemon
ld a, $1
ld [wWhichMonFaintedFirst], a
- call PlayerMonFaintHappinessMod
+ call UpdateFaintedPlayerMon
call CheckPlayerPartyForFitMon
ld a, d
and a
@@ -2642,7 +2642,7 @@ HandlePlayerMonFaint:
jp z, WildFled_EnemyFled_LinkBattleCanceled
jp DoubleSwitch
-PlayerMonFaintHappinessMod:
+UpdateFaintedPlayerMon:
ld a, [wCurBattleMon]
ld c, a
ld hl, wBattleParticipantsNotFainted