ref: 2b6dd505c1674e0d99d649515a8efe868035db09
parent: d334a331fabe25c4094c4c7e4cd9e270f51c1a30
author: Remy Oukaour <remy.oukaour@gmail.com>
date: Thu Dec 14 20:01:57 EST 2017
Document another bug Remove an unused file
--- a/battle/magikarp_length.asm
+++ /dev/null
@@ -1,214 +1,0 @@
-CalcMagikarpLength: ; fbbfc
-; Return Magikarp's length (in mm) at wMagikarpLength (big endian).
-;
-; input:
-; de: EnemyMonDVs
-; bc: PlayerID
-
-; This function is poorly commented.
-
-; In short, it generates a value between 190 and 1786 using
-; a Magikarp's DVs and its trainer ID. This value is further
-; filtered in LoadEnemyMon to make longer Magikarp even rarer.
-
-; The value is generated from a lookup table.
-; The index is determined by the dv xored with the player's trainer id.
-
-; bc = rrc(dv[0]) ++ rrc(dv[1]) ^ rrc(id)
-
-; if bc < 10: [wMagikarpLength] = c + 190
-; if bc >= $ff00: [wMagikarpLength] = c + 1370
-; else: [wMagikarpLength] = z * 100 + (bc - x) / y
-
-; X, Y, and Z depend on the value of b as follows:
-
-; if b = 0: x = 310, y = 2, z = 3
-; if b = 1: x = 710, y = 4, z = 4
-; if b = 2-9: x = 2710, y = 20, z = 5
-; if b = 10-29: x = 7710, y = 50, z = 6
-; if b = 30-68: x = 17710, y = 100, z = 7
-; if b = 69-126: x = 32710, y = 150, z = 8
-; if b = 127-185: x = 47710, y = 150, z = 9
-; if b = 186-224: x = 57710, y = 100, z = 10
-; if b = 225-243: x = 62710, y = 50, z = 11
-; if b = 244-251: x = 64710, y = 20, z = 12
-; if b = 252-253: x = 65210, y = 5, z = 13
-; if b = 254: x = 65410, y = 2, z = 14
-
-
- ; bc = rrc(dv[0]) ++ rrc(dv[1]) ^ rrc(id)
-
- ; id
- ld h, b
- ld l, c
- ld a, [hli]
- ld b, a
- ld c, [hl]
- rrc b
- rrc c
-
- ; dv
- ld a, [de]
- inc de
- rrca
- rrca
- xor b
- ld b, a
-
- ld a, [de]
- rrca
- rrca
- xor c
- ld c, a
-
- ; if bc < 10:
- ; de = bc + 190
- ; break
-
- ld a, b
- and a
- jr nz, .no
- ld a, c
- cp 10
- jr nc, .no
-
- ld hl, 190
- add hl, bc
- ld d, h
- ld e, l
- jr .done
-
-.no
-
- ld hl, .Lengths
- ld a, 2
- ld [wd265], a
-
-.read
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- call .BCLessThanDE
- jr nc, .next
-
- ; c = (bc - de) / [hl]
- call .BCMinusDE
- ld a, b
- ld [hDividend + 0], a
- ld a, c
- ld [hDividend + 1], a
- ld a, [hl]
- ld [hDivisor], a
- ld b, 2
- call Divide
- ld a, [hQuotient + 2]
- ld c, a
-
- ; de = c + 100 * (2 + i)
- xor a
- ld [hMultiplicand + 0], a
- ld [hMultiplicand + 1], a
- ld a, 100
- ld [hMultiplicand + 2], a
- ld a, [wd265]
- ld [hMultiplier], a
- call Multiply
- ld b, 0
- ld a, [hProduct + 3]
- add c
- ld e, a
- ld a, [hProduct + 2]
- adc b
- ld d, a
- jr .done
-
-.next
- inc hl ; align to next triplet
- ld a, [wd265]
- inc a
- ld [wd265], a
- cp 16
- jr c, .read
-
- call .BCMinusDE
- ld hl, 1600
- add hl, bc
- ld d, h
- ld e, l
-
-.done
- ; hl = de * 10
- ld h, d
- ld l, e
- add hl, hl
- add hl, hl
- add hl, de
- add hl, hl
-
- ; hl = hl / 254
- ld de, -254
- ld a, -1
-.div_254
- inc a
- add hl, de
- jr c, .div_254
-
- ; d, e = hl / 12, hl % 12
- ld d, 0
-.mod_12
- cp 12
- jr c, .ok
- sub 12
- inc d
- jr .mod_12
-.ok
- ld e, a
-
- ld hl, wMagikarpLength
- ld [hl], d
- inc hl
- ld [hl], e
- ret
-; fbc9a
-
-.BCLessThanDE: ; fbc9a
-; Intention: Return bc < de.
-; Reality: Return b < d.
- ld a, b
- cp d
- ret c
- ret nc ; whoops
- ld a, c
- cp e
- ret
-; fbca1
-
-.BCMinusDE: ; fbca1
-; bc -= de
- ld a, c
- sub e
- ld c, a
- ld a, b
- sbc d
- ld b, a
- ret
-; fbca8
-
-.Lengths: ; fbca8
-; ????, divisor
- dwb 110, 1
- dwb 310, 2
- dwb 710, 4
- dwb 2710, 20
- dwb 7710, 50
- dwb 17710, 100
- dwb 32710, 150
- dwb 47710, 150
- dwb 57710, 100
- dwb 62710, 50
- dwb 64710, 20
- dwb 65210, 5
- dwb 65410, 2
- dwb 65510, 1 ; not used
-; fbcd2
--- a/docs/bugs_and_glitches.md
+++ b/docs/bugs_and_glitches.md
@@ -27,6 +27,7 @@
- [Dragon Scale, not Dragon Fang, boosts Dragon-type moves](#dragon-scale-not-dragon-fang-boosts-dragon-type-moves)
- [Daisy's massages don't always increase happiness](#daisys-massages-dont-always-increase-happiness)
- [Magikarp in Lake of Rage are shorter, not longer](#magikarp-in-lake-of-rage-are-shorter-not-longer)
+- [Magikarp lengths can be miscalculated](#magikarp-lengths-can-be-miscalculated)
- [Battle transitions fail to account for the enemy's level](#battle-transitions-fail-to-account-for-the-enemys-level)
- [Slot machine payout sound effects cut each other off](#slot-machine-payout-sound-effects-cut-each-other-off)
- [Team Rocket battle music is not used for Executives or Scientists](#team-rocket-battle-music-is-not-used-for-executives-or-scientists)
@@ -734,6 +735,27 @@
```
**Fix:** Change both `jr z, .Happiness` to `jr nz, .Happiness`.
+
+
+## Magikarp lengths can be miscalculated
+
+This is a bug with `CalcMagikarpLength.BCLessThanDE` in [event/magikarp.asm](/event/magikarp.asm):
+
+```asm
+.BCLessThanDE: ; fbc9a
+; Intention: Return bc < de.
+; Reality: Return b < d.
+ ld a, b
+ cp d
+ ret c
+ ret nc ; whoops
+ ld a, c
+ cp e
+ ret
+; fbca1
+```
+
+**Fix:** Delete `ret nc`.
## Battle transitions fail to account for the enemy's level