summaryrefslogtreecommitdiff
path: root/battle
diff options
context:
space:
mode:
authorSanky <gsanky@gmail.com>2013-03-02 21:40:02 +0100
committerSanky <gsanky@gmail.com>2013-03-02 21:40:02 +0100
commitaec5a652c8ed7d482330dd9254b48e5a7141866d (patch)
tree06678a02f28e62a39b2c61fb576468afc335f634 /battle
parent5af3f92d9080cb874b6c46aa5b52c2a6cdab24f0 (diff)
parent9ee0600524218d47ce2faa9b122a8e2b498e9b66 (diff)
Merge http://github.com/yenatch/pokecrystal
Diffstat (limited to 'battle')
-rw-r--r--battle/magikarp_length.asm220
1 files changed, 220 insertions, 0 deletions
diff --git a/battle/magikarp_length.asm b/battle/magikarp_length.asm
new file mode 100644
index 000000000..7b2d5e386
--- /dev/null
+++ b/battle/magikarp_length.asm
@@ -0,0 +1,220 @@
+CalcMagikarpLength: ; fbbfc
+; Return Magikarp's length (in mm) in MagikarpLength (big endian)
+;
+; input:
+; de: EnemyMonDVs
+; bc: PlayerID
+
+; This function is needlessly convoluted, and poorly commented.
+; Reading is discouraged.
+
+; In short, it generates a value between 190 and 1786 using
+; a Magikarp's DVs and its trainer ID. This value is further
+; scrutinized in GetEnemyMon to make longer Magikarp even rarer.
+
+; This is done by calculating the value using operands from
+; a conversion lookup table.
+
+; Our index is calculated by xoring DVs with the trainer ID:
+
+; bc = rrc(rrc(dvs)) xor rrc(id)
+
+; if bc < $a: MagikarpLength = c + 190
+; if bc >= $ff00: MagikarpLength = c + 1370
+; else: MagikarpLength = 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
+
+; These values represent arbitrary conversion points.
+
+
+; b = rrcrrc(atkdefdv) xor rrc(id[0])
+
+; id
+ ld h, b
+ ld l, c
+ ld a, [hli]
+ ld b, a
+ ld c, [hl]
+ rrc b
+ rrc c
+
+; dvs
+ ld a, [de]
+ inc de
+ rrca
+ rrca
+ xor b
+ ld b, a
+
+; c = rrcrrc(spdspcdv) xor rrc(id[1])
+
+ ld a, [de]
+ rrca
+ rrca
+ xor c
+ ld c, a
+
+; if bc < $000a:
+ ld a, b
+ and a
+ jr nz, .loadtable
+ ld a, c
+ cp a, $a
+ jr nc, .loadtable
+
+; de = hl = bc + $be
+ ld hl, $be
+ add hl, bc
+ ld d, h
+ ld e, l
+ jr .endtable
+
+.loadtable
+ ld hl, .MagikarpLengthTable
+ ld a, $02
+ ld [$d265], a
+
+.readtable
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ call .BLessThanD
+ jr nc, .advancetable
+
+; c = bc / [hl]
+ call .BCMinusDE
+ ld a, b
+ ld [$ffb3], a
+ ld a, c
+ ld [$ffb4], a
+ ld a, [hl]
+ ld [$ffb7], a
+ ld b, $02
+ call Divide
+ ld a, [$ffb6]
+ ld c, a
+
+; de = c + 100 * (2 + number of rows down the table)
+ xor a
+ ld [$ffb4], a
+ ld [$ffb5], a
+ ld a, $64
+ ld [$ffb6], a
+ ld a, [$d265]
+ ld [$ffb7], a
+ call Multiply
+ ld b, $00
+ ld a, [$ffb6]
+ add c
+ ld e, a
+ ld a, [$ffb5]
+ adc b
+ ld d, a
+ jr .endtable
+
+.advancetable
+ inc hl ; align to next triplet
+ ld a, [$d265]
+ inc a
+ ld [$d265], a
+ cp a, $10
+ jr c, .readtable
+
+ call .BCMinusDE
+ ld hl, $0640
+ add hl, bc
+ ld d, h
+ ld e, l
+
+.endtable
+ ld h, d
+ ld l, e
+ add hl, hl
+ add hl, hl
+ add hl, de
+ add hl, hl ; hl = de * 10
+
+ ld de, $ff02
+ ld a, $ff
+.loop
+ inc a
+ add hl, de ; - 254
+ jr c, .loop
+
+ ld d, $00
+
+; mod $0c
+.modloop
+ cp a, $0c
+ jr c, .done
+ sub a, $0c
+ inc d
+ jr .modloop
+
+.done
+ ld e, a
+ ld hl, MagikarpLength
+ ld [hl], d
+ inc hl
+ ld [hl], e
+ ret
+; fbc9a
+
+.BLessThanD ; fbc9a
+; return carry if b < d
+ ld a, b
+ cp d
+ ret c
+ ret nc
+; fbc9e
+
+.CLessThanE ; fbc9e
+; unused
+ 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
+
+.MagikarpLengthTable ; fbca8
+; ????, divisor
+ dwb $006e, $01
+ dwb $0136, $02
+ dwb $02c6, $04
+ dwb $0a96, $14
+ dwb $1e1e, $32
+ dwb $452e, $64
+ dwb $7fc6, $96
+ dwb $ba5e, $96
+ dwb $e16e, $64
+ dwb $f4f6, $32
+ dwb $fcc6, $14
+ dwb $feba, $05
+ dwb $ff82, $02
+; fbccf
+