pokered/home/move_mon.asm

240 lines
4.5 KiB
NASM
Raw Normal View History

; Copies [hl, bc) to [de, de + bc - hl).
; In other words, the source data is from hl up to but not including bc,
; and the destination is de.
CopyDataUntil::
ld a, [hli]
ld [de], a
inc de
ld a, h
cp b
jr nz, CopyDataUntil
ld a, l
cp c
jr nz, CopyDataUntil
ret
2020-07-04 02:57:43 +00:00
; Function to remove a pokemon from the party or the current box.
; wWhichPokemon determines the pokemon.
; [wRemoveMonFromBox] == 0 specifies the party.
; [wRemoveMonFromBox] != 0 specifies the current box.
RemovePokemon::
jpfar _RemovePokemon
2020-07-04 02:57:43 +00:00
AddPartyMon::
push hl
push de
push bc
farcall _AddPartyMon
2020-07-04 02:57:43 +00:00
pop bc
pop de
pop hl
ret
; calculates all 5 stats of current mon and writes them to [de]
CalcStats::
ld c, $0
.statsLoop
inc c
call CalcStat
ldh a, [hMultiplicand+1]
2020-07-04 02:57:43 +00:00
ld [de], a
inc de
ldh a, [hMultiplicand+2]
2020-07-04 02:57:43 +00:00
ld [de], a
inc de
ld a, c
cp NUM_STATS
jr nz, .statsLoop
ret
; calculates stat c of current mon
; c: stat to calc (HP=1,Atk=2,Def=3,Spd=4,Spc=5)
; b: consider stat exp?
; hl: base ptr to stat exp values ([hl + 2*c - 1] and [hl + 2*c])
CalcStat::
push hl
push de
push bc
ld a, b
ld d, a
push hl
ld hl, wMonHeader
ld b, $0
add hl, bc
ld a, [hl] ; read base value of stat
ld e, a
pop hl
push hl
sla c
ld a, d
and a
jr z, .statExpDone ; consider stat exp?
add hl, bc ; skip to corresponding stat exp value
.statExpLoop ; calculates ceil(Sqrt(stat exp)) in b
xor a
ldh [hMultiplicand], a
ldh [hMultiplicand+1], a
2020-07-04 02:57:43 +00:00
inc b ; increment current stat exp bonus
ld a, b
cp $ff
jr z, .statExpDone
ldh [hMultiplicand+2], a
ldh [hMultiplier], a
2020-07-04 02:57:43 +00:00
call Multiply
ld a, [hld]
ld d, a
ldh a, [hProduct + 3]
2020-07-04 02:57:43 +00:00
sub d
ld a, [hli]
ld d, a
ldh a, [hProduct + 2]
2020-07-04 02:57:43 +00:00
sbc d ; test if (current stat exp bonus)^2 < stat exp
jr c, .statExpLoop
.statExpDone
srl c
pop hl
push bc
ld bc, wPartyMon1DVs - (wPartyMon1HPExp - 1) ; also wEnemyMonDVs - wEnemyMonHP
add hl, bc
pop bc
ld a, c
cp $2
jr z, .getAttackIV
cp $3
jr z, .getDefenseIV
cp $4
jr z, .getSpeedIV
cp $5
jr z, .getSpecialIV
.getHpIV
push bc
ld a, [hl] ; Atk IV
swap a
and $1
sla a
sla a
sla a
ld b, a
ld a, [hli] ; Def IV
and $1
sla a
sla a
add b
ld b, a
ld a, [hl] ; Spd IV
swap a
and $1
sla a
add b
ld b, a
ld a, [hl] ; Spc IV
and $1
add b ; HP IV: LSB of the other 4 IVs
pop bc
jr .calcStatFromIV
.getAttackIV
ld a, [hl]
swap a
and $f
jr .calcStatFromIV
.getDefenseIV
ld a, [hl]
and $f
jr .calcStatFromIV
.getSpeedIV
inc hl
ld a, [hl]
swap a
and $f
jr .calcStatFromIV
.getSpecialIV
inc hl
ld a, [hl]
and $f
.calcStatFromIV
ld d, $0
add e
ld e, a
jr nc, .noCarry
inc d ; de = Base + IV
.noCarry
sla e
rl d ; de = (Base + IV) * 2
srl b
srl b ; b = ceil(Sqrt(stat exp)) / 4
ld a, b
add e
jr nc, .noCarry2
inc d ; de = (Base + IV) * 2 + ceil(Sqrt(stat exp)) / 4
.noCarry2
ldh [hMultiplicand+2], a
2020-07-04 02:57:43 +00:00
ld a, d
ldh [hMultiplicand+1], a
2020-07-04 02:57:43 +00:00
xor a
ldh [hMultiplicand], a
ld a, [wCurEnemyLevel]
ldh [hMultiplier], a
2020-07-04 02:57:43 +00:00
call Multiply ; ((Base + IV) * 2 + ceil(Sqrt(stat exp)) / 4) * Level
ldh a, [hMultiplicand]
ldh [hDividend], a
ldh a, [hMultiplicand+1]
ldh [hDividend+1], a
ldh a, [hMultiplicand+2]
ldh [hDividend+2], a
2020-07-04 02:57:43 +00:00
ld a, $64
ldh [hDivisor], a
2020-07-04 02:57:43 +00:00
ld a, $3
ld b, a
call Divide ; (((Base + IV) * 2 + ceil(Sqrt(stat exp)) / 4) * Level) / 100
ld a, c
cp $1
ld a, 5 ; + 5 for non-HP stat
jr nz, .notHPStat
ld a, [wCurEnemyLevel]
2020-07-04 02:57:43 +00:00
ld b, a
ldh a, [hMultiplicand+2]
2020-07-04 02:57:43 +00:00
add b
ldh [hMultiplicand+2], a
2020-07-04 02:57:43 +00:00
jr nc, .noCarry3
ldh a, [hMultiplicand+1]
2020-07-04 02:57:43 +00:00
inc a
ldh [hMultiplicand+1], a ; HP: (((Base + IV) * 2 + ceil(Sqrt(stat exp)) / 4) * Level) / 100 + Level
2020-07-04 02:57:43 +00:00
.noCarry3
ld a, 10 ; +10 for HP stat
.notHPStat
ld b, a
ldh a, [hMultiplicand+2]
2020-07-04 02:57:43 +00:00
add b
ldh [hMultiplicand+2], a
2020-07-04 02:57:43 +00:00
jr nc, .noCarry4
ldh a, [hMultiplicand+1]
2020-07-04 02:57:43 +00:00
inc a ; non-HP: (((Base + IV) * 2 + ceil(Sqrt(stat exp)) / 4) * Level) / 100 + 5
ldh [hMultiplicand+1], a ; HP: (((Base + IV) * 2 + ceil(Sqrt(stat exp)) / 4) * Level) / 100 + Level + 10
2020-07-04 02:57:43 +00:00
.noCarry4
ldh a, [hMultiplicand+1] ; check for overflow (>999)
2020-07-07 15:10:29 +00:00
cp HIGH(MAX_STAT_VALUE) + 1
2020-07-04 02:57:43 +00:00
jr nc, .overflow
2020-07-07 15:10:29 +00:00
cp HIGH(MAX_STAT_VALUE)
2020-07-04 02:57:43 +00:00
jr c, .noOverflow
ldh a, [hMultiplicand+2]
2020-07-07 15:10:29 +00:00
cp LOW(MAX_STAT_VALUE) + 1
2020-07-04 02:57:43 +00:00
jr c, .noOverflow
.overflow
2020-07-07 15:10:29 +00:00
ld a, HIGH(MAX_STAT_VALUE) ; overflow: cap at 999
ldh [hMultiplicand+1], a
2020-07-07 15:10:29 +00:00
ld a, LOW(MAX_STAT_VALUE)
ldh [hMultiplicand+2], a
2020-07-04 02:57:43 +00:00
.noOverflow
pop bc
pop de
pop hl
ret
AddEnemyMonToPlayerParty::
homecall_sf _AddEnemyMonToPlayerParty
2020-07-04 02:57:43 +00:00
ret
MoveMon::
homecall_sf _MoveMon
2020-07-04 02:57:43 +00:00
ret