shithub: pokecrystal

Download patch

ref: 9e9f43bce776cfb92991bd601115c65baca07230
parent: eee79d7049232c50a17d7d445a2b2b65fed0e056
parent: f6e94dfd7903578e39ef419f04303937bedf9628
author: Rangi <35663410+Rangi42@users.noreply.github.com>
date: Sun Mar 3 14:31:47 EST 2019

Merge pull request #610 from ISSOtm/pursuit_fix

Fix Confusion and Pursuit bugs in #603

--- a/docs/bugs_and_glitches.md
+++ b/docs/bugs_and_glitches.md
@@ -247,9 +247,67 @@
 
 ([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
 
 *Fixing this bug will break compatibility with standard Pokémon Crystal for link battles.*
@@ -345,7 +403,28 @@
 
 ([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
--- a/engine/battle/core.asm
+++ b/engine/battle/core.asm
@@ -2131,7 +2131,7 @@
 	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 @@
 	call z, FaintEnemyPokemon
 	ld a, $1
 	ld [wWhichMonFaintedFirst], a
-	call PlayerMonFaintHappinessMod
+	call UpdateFaintedPlayerMon
 	call CheckPlayerPartyForFitMon
 	ld a, d
 	and a
@@ -2642,7 +2642,7 @@
 	jp z, WildFled_EnemyFled_LinkBattleCanceled
 	jp DoubleSwitch
 
-PlayerMonFaintHappinessMod:
+UpdateFaintedPlayerMon:
 	ld a, [wCurBattleMon]
 	ld c, a
 	ld hl, wBattleParticipantsNotFainted