shithub: pokered

Download patch

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