ref: cb1d7f812be0c392351a8ee7f1dd8b439d8d62bc
parent: bcfac567ed5bb9e5254a41fc7ef20d325d5763b5
parent: 767cc1376b076db56a6773d49a129d6acc6a5378
author: Bryan Bishop <[email protected]>
date: Fri Mar 1 07:22:09 EST 2013
Merge pull request #118 from yenatch/master gender check & square root
--- a/main.asm
+++ b/main.asm
@@ -4839,9 +4839,41 @@
ret
; 0x12e1b
-INCBIN "baserom.gbc",$12e1b,$13d96 - $12e1b
+INCBIN "baserom.gbc",$12e1b,$13b87 - $12e1b
+GetSquareRoot: ; 13b87
+; Return the square root of de in b.
+; Rather than calculating the result, we take the index of the
+; first value in a table of squares that isn't lower than de.
+
+ ld hl, Squares
+ ld b, 0
+.loop
+; Make sure we don't go past the end of the table.
+ inc b
+ ld a, b
+ cp $ff
+ ret z
+
+; Iterate over the table until b**2 >= de.
+ ld a, [hli]
+ sub e
+ ld a, [hli]
+ sbc d
+
+ jr c, .loop
+ ret
+
+Squares: ; 13b98
+root set 1
+ rept $ff
+ dw root*root
+root set root+1
+ endr
+; 13d96
+
+
SECTION "bank5",DATA,BANK[$5]
INCBIN "baserom.gbc",$14000,$14032 - $14000
@@ -7137,8 +7169,128 @@
Dark:
db "DARK@"
-INCBIN "baserom.gbc",$50A28, $51424 - $50A28
+INCBIN "baserom.gbc", $50a28, $50bdd - $50a28
+
+GetGender: ; 50bdd
+; Return the gender of a given monster in a.
+
+; 1: male
+; 0: female
+; c: genderless
+
+; This is determined by comparing the Attack and Speed DVs
+; with the species' gender ratio.
+
+
+; Figure out what type of monster struct we're looking at.
+
+; 0: PartyMon
+ ld hl, PartyMon1DVs
+ ld bc, PartyMon2 - PartyMon1
+ ld a, [MonType]
+ and a
+ jr z, .PartyMon
+
+; 1: OTPartyMon
+ ld hl, OTPartyMon1DVs
+ dec a
+ jr z, .PartyMon
+
+; 2: BoxMon
+ ld hl, $ad26 + $15 ; BoxMon1DVs
+ ld bc, $20 ; BoxMon2 - BoxMon1
+ dec a
+ jr z, .BoxMon
+
+; 3: Unknown
+ ld hl, $d123 ; DVBuffer
+ dec a
+ jr z, .DVs
+
+; else: WildMon
+ ld hl, EnemyMonDVs
+ jr .DVs
+
+
+; Get our place in the party/box.
+
+.PartyMon
+.BoxMon
+ ld a, [CurPartyMon]
+ call AddNTimes
+
+
+.DVs
+
+; BoxMon data is read directly from SRAM.
+ ld a, [MonType]
+ cp 2
+ ld a, 1
+ call z, GetSRAMBank
+
+; Attack DV
+ ld a, [hli]
+ and $f0
+ ld b, a
+; Speed DV
+ ld a, [hl]
+ and $f0
+ swap a
+
+; Put our DVs together.
+ or b
+ ld b, a
+
+; Close SRAM if we were dealing with a BoxMon.
+ ld a, [MonType] ; MonType
+ cp 2 ; BOXMON
+ call z, CloseSRAM
+
+
+; We need the gender ratio to do anything with this.
+ push bc
+ ld a, [CurPartySpecies]
+ dec a
+ ld hl, BaseStats + 13 ; BASE_GENDER
+ ld bc, BaseStats1 - BaseStats
+ call AddNTimes
+ pop bc
+
+ ld a, BANK(BaseStats)
+ call GetFarByte
+
+
+; The higher the ratio, the more likely the monster is to be female.
+
+ cp $ff
+ jr z, .Genderless
+
+ and a
+ jr z, .Male
+
+ cp $fe
+ jr z, .Female
+
+; Values below the ratio are male, and vice versa.
+ cp b
+ jr c, .Male
+
+.Female
+ xor a
+ ret
+
+.Male
+ ld a, 1
+ and a
+ ret
+
+.Genderless
+ scf
+ ret
+; 50c50
+
+INCBIN "baserom.gbc", $50c50, $51424 - $50c50
BaseStats:
INCLUDE "stats/base_stats.asm"