repeated critical move table and recomment MoreCalculateDamage

This commit is contained in:
yenatch 2014-01-03 16:21:07 -05:00
parent d32e480f03
commit ffc0b8f9de

165
main.asm
View file

@ -65144,124 +65144,161 @@ Func_3df1c: ; 3df1c (f:5f1c)
ret ret
MoreCalculateDamage: ; 3df65 (f:5f65) MoreCalculateDamage: ; 3df65 (f:5f65)
ld a, [$ff00+$f3] ;FFF3 decides which address to use ; input:
; b: attack
; c: opponent defense
; d: base power
; e: level
ld a, [$ff00+$f3] ; whose turn?
and a and a
ld a, [W_PLAYERMOVEEFFECT] ld a, [W_PLAYERMOVEEFFECT]
jr z, .next jr z, .effect
ld a, [$cfcd] ld a, [$cfcd]
.next .effect
cp a, 7 ;effect to halve opponent defense [suicide moves]
jr nz, .next2 ; EXPLODE_EFFECT halves defense.
.halveDefense cp a, EXPLODE_EFFECT
srl c ;explosion and selfdestruct will halve the defense... jr nz, .ok
jr nz, .next2 srl c
inc c ;...with a minimum value of 1 [it is used as a divisor later on] jr nz, .ok
.next2 inc c ; ...with a minimum value of 1 (used as a divisor later on)
cp a, $1d .ok
jr z, .next3
; Multi-hit attacks may or may not have 0 bp.
cp a, TWO_TO_FIVE_ATTACKS_EFFECT
jr z, .skipbp
cp a, $1e cp a, $1e
jr z, .next3 jr z, .skipbp
cp a, $26 ;OHKO?
; Calculate OHKO damage based on remaining HP.
cp a, OHKO_EFFECT
jp z, Func_3e016 jp z, Func_3e016
ld a, d ;if attack base power zero then do nothing
; Don't calculate damage for moves that don't do any.
ld a, d ; base power
and a and a
ret z ret z
.next3 .skipbp
xor a xor a
ld hl, $ff95 ;multiplication address ld hl, H_DIVIDEND
ldi [hl], a ;init to zero ldi [hl], a
ldi [hl], a ldi [hl], a
ld [hl], a ld [hl], a
ld a, e
add a ;A = level *2 ; Multiply level by 2
jr nc, .noCarry ld a, e ; level
.carry add a
jr nc, .nc
push af push af
ld a, 1 ;add carry for level if needed ld a, 1
ld [hl], a ;level high byte [previously zero] ld [hl], a
pop af pop af
.noCarry .nc
inc hl inc hl
ldi [hl], a ;level low byte ldi [hl], a
ld a, 5 ;[divisor] = 5
; Divide by 5
ld a, 5
ldd [hl], a ldd [hl], a
push bc push bc
ld b, 4 ld b, 4
call Divide ;divide level by 5 call Divide
pop bc pop bc
inc [hl] ;+2 [?]
; Add 2
inc [hl] inc [hl]
inc hl ;8bit multiplier inc [hl]
inc hl ; multiplier
; Multiply by attack base power
ld [hl], d ld [hl], d
call Multiply ;*multiply by attack base power call Multiply
; Multiply by attack stat
ld [hl], b ld [hl], b
call Multiply ;*multiply by attacker attack stat call Multiply
; Divide by defender's defense stat
ld [hl], c ld [hl], c
ld b, 4 ld b, 4
call Divide ;*divide by defender defense stat call Divide
ld [hl], $32
ld b, 4
call Divide ;divide above result by 50
ld hl, W_DAMAGE ;[stuff below I never got to, was only interested in stuff above]
; Divide by 50
ld [hl], 50
ld b, 4
call Divide
ld hl, W_DAMAGE
ld b, [hl] ld b, [hl]
ld a, [$FF00+$98] ld a, [H_QUOTIENT + 3]
add b add b
ld [$FF00+$98], a ld [H_QUOTIENT + 3], a
jr nc, .asm_3dfd0 jr nc, .asm_3dfd0
ld a, [$FF00+$97]
ld a, [H_QUOTIENT + 2]
inc a inc a
ld [$FF00+$97], a ld [H_QUOTIENT + 2], a
and a and a
jr z, .asm_3e004 jr z, .asm_3e004
.asm_3dfd0 .asm_3dfd0
ld a, [H_DIVIDEND] ; $FF00+$95 (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT) ld a, [H_QUOTIENT]
ld b, a ld b, a
ld a, [H_NUMTOPRINT] ; $FF00+$96 (aliases: H_MULTIPLICAND) ld a, [H_QUOTIENT + 1]
or a or a
jr nz, .asm_3e004 jr nz, .asm_3e004
ld a, [$FF00+$97]
cp $3 ld a, [H_QUOTIENT + 2]
cp 998 / $100
jr c, .asm_3dfe8 jr c, .asm_3dfe8
cp $4 cp 998 / $100 + 1
jr nc, .asm_3e004 jr nc, .asm_3e004
ld a, [$FF00+$98] ld a, [H_QUOTIENT + 3]
cp $e6 cp 998 % $100
jr nc, .asm_3e004 jr nc, .asm_3e004
.asm_3dfe8 .asm_3dfe8
inc hl inc hl
ld a, [$FF00+$98] ld a, [H_QUOTIENT + 3]
ld b, [hl] ld b, [hl]
add b add b
ld [hld], a ld [hld], a
ld a, [$FF00+$97]
ld a, [H_QUOTIENT + 2]
ld b, [hl] ld b, [hl]
adc b adc b
ld [hl], a ld [hl], a
jr c, .asm_3e004 jr c, .asm_3e004
ld a, [hl] ld a, [hl]
cp $3 cp 998 / $100
jr c, .asm_3e00a jr c, .asm_3e00a
cp $4 cp 998 / $100 + 1
jr nc, .asm_3e004 jr nc, .asm_3e004
inc hl inc hl
ld a, [hld] ld a, [hld]
cp $e6 cp 998 % $100
jr c, .asm_3e00a jr c, .asm_3e00a
.asm_3e004 .asm_3e004
ld a, $3 ld a, 997 / $100
ld [hli], a ld [hli], a
ld a, $e5 ld a, 997 % $100
ld [hld], a ld [hld], a
.asm_3e00a .asm_3e00a
inc hl inc hl
ld a, [hl] ld a, [hl]
add $2 add 2
ld [hld], a ld [hld], a
jr nc, .asm_3e012 jr nc, .done
inc [hl] inc [hl]
.asm_3e012 .done
ld a, $1
ld a, 1
and a and a
ret ret
@ -65271,7 +65308,14 @@ Func_3e016: ; 3e016 (f:6016)
dec a dec a
ret ret
INCBIN "baserom.gbc",$3e01e,$3e023 - $3e01e
UnusedHighCriticalMoves: ; 3e01e (f:601e)
db KARATE_CHOP
db RAZOR_LEAF
db CRABHAMMER
db SLASH
db $FF
; 3e023
; determines if attack is a critical hit ; determines if attack is a critical hit
; azure heights claims "the fastest pokémon (who are,not coincidentally, ; azure heights claims "the fastest pokémon (who are,not coincidentally,
@ -65350,6 +65394,7 @@ HighCriticalMoves: ; 3e08e (f:608e)
db SLASH db SLASH
db $FF db $FF
; function to determine if Counter hits and if so, how much damage it does ; function to determine if Counter hits and if so, how much damage it does
HandleCounterMove: ; 3e093 (f:6093) HandleCounterMove: ; 3e093 (f:6093)
ld a,[H_WHOSETURN] ; whose turn ld a,[H_WHOSETURN] ; whose turn