shithub: pokecrystal

Download patch

ref: b4df25a1e155cc383d6a2cc628b3830ae2e1e961
parent: 81e2a3f0cfd4a280196b1776de6ae7df334ad85c
author: IIMarckus <iimarckus@gmail.com>
date: Thu Oct 23 20:18:48 EDT 2014

More comments and labels for ball catch rates.

--- a/items/item_effects.asm
+++ b/items/item_effects.asm
@@ -245,7 +245,7 @@
 	jp z, .asm_e99c
 	ld a, [CurItem]
 	ld c, a
-	ld hl, Table_0xec0a
+	ld hl, BallMultiplierFunctionTable
 
 .asm_e8f2
 	ld a, [hli]
@@ -329,19 +329,23 @@
 
 	ld a, [$ffb6]
 	and a
-	jr nz, .asm_e960
+	jr nz, .statuscheck
 	ld a, 1
-.asm_e960
+.statuscheck
+; This routine is buggy. It was intended that SLP and FRZ provide a higher
+; catch rate than BRN/PSN/PAR, which in turn provide a higher catch rate than
+; no status effect at all. But instead, it makes BRN/PSN/PAR provide no
+; benefit.
 	ld b, a
 	ld a, [EnemyMonStatus]
 	and 1 << FRZ | SLP
 	ld c, 10
-	jr nz, .asm_e971
+	jr nz, .addstatus
 	and a
 	ld c, 5
-	jr nz, .asm_e971
+	jr nz, .addstatus
 	ld c, 0
-.asm_e971
+.addstatus
 	ld a, b
 	add c
 	jr nc, .asm_e977
@@ -725,34 +729,30 @@
 ; ec0a
 
 
-Table_0xec0a: ; ec0a
-; Note: SAFARI_BALL does not exist.
-	dbw ULTRA_BALL,  UltraBallChance
-	dbw GREAT_BALL,  GreatBallChance
-	dbw SAFARI_BALL, SafariBallChance
-	dbw HEAVY_BALL,  HeavyBallChance
-	dbw LEVEL_BALL,  LevelBallChance
-	dbw LURE_BALL,   LureBallChance
-	dbw FAST_BALL,   FastBallChance
-	dbw MOON_BALL,   MoonBallChance
-	dbw LOVE_BALL,   LoveBallChance
-	dbw PARK_BALL,   ParkBallChance
+BallMultiplierFunctionTable:
+; table of routines that increase or decrease the catch rate based on
+; which ball is used in a certain situation.
+	dbw ULTRA_BALL, UltraBallMultiplier
+	dbw GREAT_BALL, GreatBallMultiplier
+	dbw 8,          GreatBallMultiplier ; Safari Ball, leftover from RBY
+	dbw HEAVY_BALL, HeavyBallMultiplier
+	dbw LEVEL_BALL, LevelBallMultiplier
+	dbw LURE_BALL,  LureBallMultiplier
+	dbw FAST_BALL,  FastBallMultiplier
+	dbw MOON_BALL,  MoonBallMultiplier
+	dbw LOVE_BALL,  LoveBallMultiplier
+	dbw PARK_BALL,  GreatBallMultiplier
 	db $ff
-; ec29
 
-
-UltraBallChance: ; ec29
-; x2
+UltraBallMultiplier:
+; multiply catch rate by 2
 	sla b
 	ret nc
 	ld b, $ff
 	ret
-; ec2f
 
-GreatBallChance: ; ec2f
-ParkBallChance:
-SafariBallChance:
-; x1.5
+GreatBallMultiplier:
+; multiply catch rate by 1.5
 	ld a, b
 	srl a
 	add b
@@ -760,10 +760,8 @@
 	ret nc
 	ld b, $ff
 	ret
-; ec38
 
-
-GetPokedexEntryBank: ; ec38
+GetPokedexEntryBank:
 	push hl
 	push de
 	ld a, [EnemyMonSpecies]
@@ -790,9 +788,13 @@
 	db BANK(PokedexEntries2)
 	db BANK(PokedexEntries3)
 	db BANK(PokedexEntries4)
-; ec50
 
-HeavyBallChance: ; ec50
+HeavyBallMultiplier:
+; subtract 20 from catch rate if weight < 102.4 kg
+; else add 0 to catch rate if weight < 204.8 kg
+; else add 20 to catch rate if weight < 307.2 kg
+; else add 30 to catch rate if weight < 409.6 kg
+; else add 40 to catch rate (never happens)
 	ld a, [EnemyMonSpecies]
 	ld hl, PokedexDataPointerTable
 	dec a
@@ -825,17 +827,18 @@
 	srl b
 	rr c
 	endr
-	call .asm_ec99
+	call .subbc
 
 	srl b
 	rr c
-	call .asm_ec99
+	call .subbc
 
 	ld a, h
 	pop bc
-	jr .asm_eca4
+	jr .compare
 
-.asm_ec99
+.subbc
+	; subtract bc from hl
 	push bc
 	ld a, b
 	cpl
@@ -848,21 +851,21 @@
 	pop bc
 	ret
 
-.asm_eca4
+.compare
 	ld c, a
-	cp $4
-	jr c, .asm_ecbc
+	cp 1024 >> 8 ; 102.4 kg
+	jr c, .lightmon
 
-	ld hl, .table_ecc4
-.asm_ecac
+	ld hl, .WeightsTable
+.lookup
 	ld a, c
 	cp [hl]
-	jr c, .asm_ecb4
+	jr c, .heavymon
 	inc hl
 	inc hl
-	jr .asm_ecac
+	jr .lookup
 
-.asm_ecb4
+.heavymon
 	inc hl
 	ld a, b
 	add [hl]
@@ -871,7 +874,7 @@
 	ld b, $ff
 	ret
 
-.asm_ecbc
+.lightmon
 	ld a, b
 	sub 20
 	ld b, a
@@ -879,15 +882,15 @@
 	ld b, $1
 	ret
 
-.table_ecc4
-	db   8,  0
-	db  12, 20
-	db  16, 30
-	db 255, 40
-; eccc
+.WeightsTable
+; weight factor, boost
+	db 2048 >> 8, 0
+	db 3072 >> 8, 20
+	db 4096 >> 8, 30
+	db 65280 >> 8, 40
 
-
-LureBallChance: ; eccc
+LureBallMultiplier:
+; multiply catch rate by 3 if this is a fishing rod battle
 	ld a, [BattleType]
 	cp BATTLETYPE_FISH
 	ret nz
@@ -903,11 +906,12 @@
 .done
 	ld b, a
 	ret
-; ecdd
 
+MoonBallMultiplier:
+; This function is buggy.
+; Intent:  multiply catch rate by 4 if mon evolves with moon stone
+; Reality: no boost
 
-MoonBallChance: ; ecdd
-
 GLOBAL EvosAttacks
 GLOBAL EvosAttacksPointers
 
@@ -934,17 +938,13 @@
 	inc hl
 	inc hl
 
-	; It appears that Moon Stone's
-	; constant from Pokémon Red is used.
-
-	; No Pokémon evolve with Burn Heal,
-	; so Moon Balls always have
-	; a catch rate of 1x.
-
+; Moon Stone's constant from Pokémon Red is used.
+; No Pokémon evolve with Burn Heal,
+; so Moon Balls always have a catch rate of 1×.
 	push bc
 	ld a, BANK(EvosAttacks)
 	call GetFarByte
-	cp MOON_STONE_RED ; BURN_HEAL
+	cp MOON_STONE_RED ; BURN_HEAL (in Red)
 	pop bc
 	ret nz
 
@@ -956,10 +956,13 @@
 	ld b, $ff
 .done
 	ret
-; ed12
 
+LoveBallMultiplier:
+; This function is buggy.
+; Intent:  multiply catch rate by 8 if mons are of same species, different sex
+; Reality: multiply catch rate by 8 if mons are of same species, same sex
 
-LoveBallChance: ; ed12
+	; does species match?
 	ld a, [TempEnemyMonSpecies]
 	ld c, a
 	ld a, [TempBattleMonSpecies]
@@ -966,6 +969,7 @@
 	cp c
 	ret nz
 
+	; check player mon species
 	push bc
 	ld a, [TempBattleMonSpecies]
 	ld [CurPartySpecies], a
@@ -974,13 +978,14 @@
 	ld a, [CurBattleMon]
 	ld [CurPartyMon], a
 	callba GetGender
-	jr c, .asm_ed66
+	jr c, .done1 ; no effect on genderless
 
-	ld d, 0
-	jr nz, .asm_ed39
-	inc d
-.asm_ed39
+	ld d, 0 ; male
+	jr nz, .playermale
+	inc d   ; female
+.playermale
 
+	; check wild mon species
 	push de
 	ld a, [TempEnemyMonSpecies]
 	ld [CurPartySpecies], a
@@ -987,39 +992,42 @@
 	ld a, WILDMON
 	ld [MonType], a
 	callba GetGender
-	jr c, .asm_ed65
+	jr c, .done2 ; no effect on genderless
 
-	ld d, 0
-	jr nz, .asm_ed52
-	inc d
-.asm_ed52
+	ld d, 0 ; male
+	jr nz, .wildmale
+	inc d   ; female
+.wildmale
 
 	ld a, d
 	pop de
 	cp d
 	pop bc
-	ret nz
+	ret nz ; for the intended effect, this should be “ret z”
 
 	sla b
-	jr c, .asm_ed62
+	jr c, .max
 	sla b
-	jr c, .asm_ed62
+	jr c, .max
 	sla b
 	ret nc
-.asm_ed62
+.max
 	ld b, $ff
 	ret
 
-.asm_ed65
+.done2
 	pop de
 
-.asm_ed66
+.done1
 	pop bc
 	ret
-; ed68
 
-
-FastBallChance: ; ed68
+FastBallMultiplier:
+; This function is buggy.
+; Intent:  multiply catch rate by 4 if enemy mon is in one of the three
+;          FleeMons tables.
+; Reality: multiply catch rate by 4 if enemy mon is one of the first three in
+;          the first FleeMons table.
 	ld a, [TempEnemyMonSpecies]
 	ld c, a
 	ld hl, FleeMons
@@ -1033,7 +1041,7 @@
 	cp -1
 	jr z, .next
 	cp c
-	jr nz, .next
+	jr nz, .next ; for the intended effect, this should be “jr nz, .loop”
 	sla b
 	jr c, .max
 
@@ -1048,27 +1056,28 @@
 	dec d
 	jr nz, .loop
 	ret
-; ed8c
 
-
-LevelBallChance: ; ed8c
+LevelBallMultiplier:
+; multiply catch rate by 8 if player mon level / 4 > enemy mon level
+; multiply catch rate by 4 if player mon level / 2 > enemy mon level
+; multiply catch rate by 2 if player mon level > enemy mon level
 	ld a, [BattleMonLevel]
 	ld c, a
 	ld a, [EnemyMonLevel]
 	cp c
-	ret nc
+	ret nc ; if player is lower level, we're done here
 	sla b
 	jr c, .max
 
 	srl c
 	cp c
-	ret nc
+	ret nc ; if player/2 is lower level, we're done here
 	sla b
 	jr c, .max
 
 	srl c
 	cp c
-	ret nc
+	ret nc ; if player/4 is lower level, we're done here
 	sla b
 	ret nc
 
@@ -1075,8 +1084,6 @@
 .max
 	ld b, $ff
 	ret
-; edab
-
 
 UnknownText_0xedab: ; 0xedab
 	; It dodged the thrown BALL! This #MON can't be caught!
--- a/main.asm
+++ b/main.asm
@@ -59442,11 +59442,13 @@
 
 
 GetGender: ; 50bdd
-; Return the gender of a given monster in a.
+; Return the gender of a given monster (CurPartyMon/CurOTMon/CurWildMon).
+; When calling this function, a should be set to an appropriate MonType value.
 
-; 1: male
-; 0: female
-; c: genderless
+; return values:
+; a = 1: f = nc|nz; male
+; a = 0: f = nc|z;  female
+;        f = c:  genderless
 
 ; This is determined by comparing the Attack and Speed DVs
 ; with the species' gender ratio.