ref: 7069593eeba657581732b1bc0c895ca66f590f04
parent: d2f4073eb9b8a39c2356be0de10867aabe95dd3a
author: YamaArashi <shadow962@live.com>
date: Tue Jan 24 09:20:31 EST 2012
added some comments and added multiply/divide constants hg-commit-id: fb230f02d2ca
--- a/common.asm
+++ b/common.asm
@@ -10956,11 +10956,12 @@
ld [$d11c],a
ld a,[W_BATTLETYPE]
cp a,2 ;SafariBattle
- jr nz,.next2\@
+ jr nz,.skipSafariZoneCode\@
+.safariZone\@
; remove a Safari Ball from inventory
ld hl,W_NUMSAFARIBALLS
dec [hl]
-.next2\@ ;$56b6
+.skipSafariZoneCode\@ ;$56b6
call GoPAL_SET_CF1C
ld a,$43
ld [$d11e],a
@@ -10974,62 +10975,69 @@
jp z,$5801
ld a,[W_BATTLETYPE]
dec a
- jr nz,.next3\@
- ld hl,W_GRASSRATE ;backups wildMon data
+ jr nz,.notOldManBattle\@
+.oldManBattle\@
+ ld hl,W_GRASSRATE
ld de,W_PLAYERNAME
ld bc,11
- call CopyData
+ call CopyData ; save the player's name in the Wild Monster data (part of the Cinnabar Island Missingno glitch)
jp .BallSuccess\@ ;$578b
-.next3\@ ;$56e9
+.notOldManBattle\@ ;$56e9
ld a,[W_CURMAP]
- cp a,$93 ;MonTower 6F
- jr nz,.next4\@
+ cp a,POKEMONTOWER_6
+ jr nz,.loop\@
ld a,[$cfd8]
cp a,MAROWAK
ld b,$10
jp z,$5801
-.next4\@ ;$56fa
- call $3e5c ;GetRandom
+; if not fighting ghost Marowak, loop until a random number in the current
+; pokeball's allowed range is found
+.loop\@ ;$56fa
+ call GenRandom
ld b,a
ld hl,$cf91
ld a,[hl]
- cp a,MASTER_BALL;1
+ cp a,MASTER_BALL
jp z,.BallSuccess\@ ;$578b
- cp a,POKE_BALL ;4
- jr z,.next5\@
+ cp a,POKE_BALL
+ jr z,.checkForAilments
ld a,200
cp b
- jr c,.next4\@ ;get only numbers < 200
+ jr c,.loop\@ ;get only numbers <= 200 for Great Ball
ld a,[hl]
- cp a,GREAT_BALL ;3
- jr z,.next5\@
- ld a,150 ;get only numbers < 150
+ cp a,GREAT_BALL
+ jr z,.checkForAilments
+ ld a,150 ;get only numbers <= 150 for Ultra Ball
cp b
- jr c,.next4\@
-.next5\@ ;$571a
- ld a,[$cfe9] ;status ailments
+ jr c,.loop\@
+.checkForAilments\@ ;$571a
+; pokemon can be caught more easily with any (primary) status ailment
+; Frozen/Asleep pokemon are relatively even easier to catch
+; for Frozen/Asleep pokemon, any random number from 0-24 ensures a catch.
+; for the others, a random number from 0-11 ensures a catch.
+ ld a,[W_ENEMYMONSTATUS] ;status ailments
and a
- jr z,.next6\@
+ jr z,.noAilments\@
and a,(FRZ + SLP) ;is frozen and/or asleep?
ld c,12
- jr z,.noAilments\@
+ jr z,.notFrozenOrAsleep\@
ld c,25
-.noAilments\@ ;$5728
+.notFrozenOrAsleep\@ ;$5728
ld a,b
sub c
jp c,.BallSuccess\@ ;$578b
ld b,a
-.next6\@ ;$572e
+.noAilments\@ ;$572e
push bc ;save RANDOM number
xor a
- ld [$ff96],a
- ld hl,$cff4 ;enemy: Max HP
+ ld [H_MULTIPLICAND],a
+ ld hl,W_ENEMYMONMAXHP
ld a,[hli]
- ld [$ff97],a
+ ld [H_MULTIPLICAND + 1],a
ld a,[hl]
- ld [$ff98],a
+ ld [H_MULTIPLICAND + 2],a
ld a,255
- ld [$ff99],a
+ ld [H_MULTIPLIER],a
call $38ac ;Multiply: MaxHP * 255
ld a,[$cf91]
cp a,GREAT_BALL
@@ -11037,10 +11045,10 @@
jr nz,.next7\@
ld a,8
.next7\@ ;$574d
- ld [$ff99],a
- ld b,4 ;GreatBall's BallFactor
+ ld [H_DIVISOR],a
+ ld b,4 ;number of significant bytes
call $38b9 ;Divide
- ld hl,$cfe6 ;currentHP
+ ld hl,W_ENEMYMONCURHP
ld a,[hli]
ld b,a
ld a,[hl]
@@ -11051,44 +11059,44 @@
srl b
rr a
srl b
- rr a
+ rr a ; a = current HP / 4
and a
jr nz,.next8\@
inc a
.next8\@ ;$5766
- ld [$ff99],a
+ ld [H_DIVISOR],a
ld b,4
- call $38b9 ;Divide
- ld a,[$ff97]
+ call $38b9 ; Divide: ((MaxHP * 255) / BallFactor) / (CurHP / 4)
+ ld a,[H_QUOTIENT + 2]
and a
jr z,.next9\@
ld a,255
- ld [$ff98],a
+ ld [H_QUOTIENT + 3],a
.next9\@ ;$5776
pop bc
ld a,[$d007] ;enemy: Catch Rate
cp b
jr c,.next10\@
- ld a,[$ff97]
+ ld a,[H_QUOTIENT + 2]
and a
- jr nz,.BallSuccess\@
- call $3e5c ;get random number
+ jr nz,.BallSuccess\@ ; if ((MaxHP * 255) / BallFactor) / (CurHP / 4) > 0x255, automatic success
+ call GenRandom
ld b,a
- ld a,[$ff98]
+ ld a,[H_QUOTIENT + 3]
cp b
jr c,.next10\@
.BallSuccess\@ ;$578b
jr .BallSuccess2\@
.next10\@ ;$578d
- ld a,[$ff98]
+ ld a,[H_QUOTIENT + 3]
ld [$d11e],a
xor a
- ld [$ff96],a
- ld [$ff97],a
+ ld [H_MULTIPLICAND],a
+ ld [H_MULTIPLICAND + 1],a
ld a,[$d007] ;enemy: Catch Rate
- ld [$ff98],a
+ ld [H_MULTIPLICAND + 2],a
ld a,100
- ld [$ff99],a
+ ld [H_MULTIPLIER],a
call $38ac ;Multiply: CatchRate * 100
ld a,[$cf91]
ld b,255
@@ -11102,21 +11110,21 @@
jr z,.next11\@
.next11\@ ;$57b8
ld a,b
- ld [$ff99],a
+ ld [H_DIVISOR],a
ld b,4
call $38b9 ;Divide
- ld a,[$ff97]
+ ld a,[H_QUOTIENT + 2]
and a
ld b,$63
jr nz,.next12\@
ld a,[$d11e]
- ld [$ff99],a
+ ld [H_MULTIPLIER],a
call $38ac
ld a,255
- ld [$ff99],a
+ ld [H_DIVISOR],a
ld b,4
call $38b9
- ld a,[$cfe9] ;status ailments
+ ld a,[W_ENEMYMONSTATUS] ;status ailments
and a
jr z,.next13\@
and a,(FRZ + SLP)
@@ -11124,11 +11132,11 @@
jr z,.next14\@
ld b,10
.next14\@ ;$57e6
- ld a,[$ff98]
+ ld a,[H_QUOTIENT + 3]
add b
- ld [$ff98],a
+ ld [H_QUOTIENT + 3],a
.next13\@ ;$57eb
- ld a,[$ff98]
+ ld a,[H_QUOTIENT + 3]
cp a,10
ld b,$20
jr c,.next12\@
@@ -21626,17 +21634,17 @@
jp AIPrintItemUse
Function67CF: ; 0x3a7cf 67CF
- ld [$FF99],a
+ ld [H_DIVISOR],a
ld hl,$CFF4
ld a,[hli]
- ld [$FF95],a
+ ld [H_DIVIDEND],a
ld a,[hl]
- ld [$FF96],a
+ ld [H_DIVIDEND + 1],a
ld b,2
call $38B9
- ld a,[$FF98]
+ ld a,[H_QUOTIENT + 3]
ld c,a
- ld a,[$FF97]
+ ld a,[H_QUOTIENT + 2]
ld b,a
ld hl,$CFE7
ld a,[hld]
@@ -25530,25 +25538,25 @@
and a,$80
ld b,a
ld a,[hl] ; a = damage multiplier
- ld [$ff99],a
+ ld [H_MULTIPLIER],a
add b
ld [$d05b],a
xor a
- ld [$ff96],a
+ ld [H_MULTIPLICAND],a
ld hl,W_DAMAGE
ld a,[hli]
- ld [$ff97],a
+ ld [H_MULTIPLICAND + 1],a
ld a,[hld]
- ld [$ff98],a
+ ld [H_MULTIPLICAND + 2],a
call $38ac ; multiply
ld a,10
- ld [$ff99],a
+ ld [H_DIVISOR],a
ld b,$04
call $38b9 ; divide
- ld a,[$ff97]
+ ld a,[H_QUOTIENT + 2]
ld [hli],a
ld b,a
- ld a,[$ff98]
+ ld a,[H_QUOTIENT + 3]
ld [hl],a
or b ; is damage 0?
jr nz,.skipTypeImmunity\@
@@ -25837,10 +25845,10 @@
ld c,a ; c = 14 - EVASIONMOD (this "reflects" the value over 7, so that an increase in the target's evasion decreases the hit chance instead of increasing the hit chance)
; zero the high bytes of the multiplicand
xor a
- ld [$ff96],a
- ld [$ff97],a
+ ld [H_MULTIPLICAND],a
+ ld [H_MULTIPLICAND + 1],a
ld a,[hl]
- ld [$ff98],a ; set multiplicand to move accuracy
+ ld [H_MULTIPLICAND + 2],a ; set multiplicand to move accuracy
push hl
ld d,$02 ; loop has two iterations
; loop to do the calculations, the first iteration multiplies by the accuracy ratio and the second iteration multiplies by the evasion ratio
@@ -25854,28 +25862,28 @@
add hl,bc ; hl = address of stat modifier ratio
pop bc
ld a,[hli]
- ld [$ff99],a ; set multiplier to the numerator of the ratio
+ ld [H_MULTIPLIER],a ; set multiplier to the numerator of the ratio
call $38ac ; multiply
ld a,[hl]
- ld [$ff99],a ; set divisor to the the denominator of the ratio (the dividend is the product of the previous multiplication)
+ ld [H_DIVISOR],a ; set divisor to the the denominator of the ratio (the dividend is the product of the previous multiplication)
ld b,$04 ; number of significant bytes in the dividend
call $38b9 ; divide
- ld a,[$ff98]
+ ld a,[H_QUOTIENT + 3]
ld b,a
- ld a,[$ff97]
+ ld a,[H_QUOTIENT + 2]
or b
jp nz,.nextCalculation\@
; make sure the result is always at least one
- ld [$ff97],a
+ ld [H_QUOTIENT + 2],a
ld a,$01
- ld [$ff98],a
+ ld [H_QUOTIENT + 3],a
.nextCalculation\@
ld b,c
dec d
jr nz,.loop\@
- ld a,[$ff97]
+ ld a,[H_QUOTIENT + 2]
and a ; is the calculated hit chance over 0xFF?
- ld a,[$ff98]
+ ld a,[H_QUOTIENT + 3]
jr z,.storeAccuracy\@
; if calculated hit chance over 0xFF
ld a,$ff ; set the hit chance to 0xFF
--- a/constants.asm
+++ b/constants.asm
@@ -699,6 +699,18 @@
W_SAFARITIMER1 EQU $D70D ; use 01 for maximum
W_SAFARITIMER2 EQU $D70E ; use F4 for maximum
+; Note: the following multiplication and division addresses are used for multiple purposes
+; and so they overlap with each other
+
+H_MULTIPLICAND EQU $FF96 ; 3 bytes, big endian order
+H_MULTIPLIER EQU $FF99 ; 1 byte
+H_PRODUCT EQU $FF95 ; 4 bytes, big endian order
+
+H_DIVIDEND EQU $FF95 ; 4 bytes, big endian order
+H_DIVISOR EQU $FF99 ; 1 byte
+H_QUOTIENT EQU $FF95 ; 4 bytes, big endian order
+H_REMAINDER EQU $FF99 ; 1 byte
+
H_RAND1 EQU $FFD3
H_RAND2 EQU $FFD4