This tutorial adds Pokémon genders like in Gen II.
It is also compatible with Pokémon Yellow.
1. Create a new file gender_constants.asm in constants/
+; See data/gender_ratios.asm
+
+; Used to define gender ratios
+MALE_ONLY EQU $00
+MALE_88_PERCENT EQU $1F
+MALE_75_PERCENT EQU $3F
+SAME_BOTH_GENDERS EQU $7F
+FEMALE_75_PERCENT EQU $BF
+FEMALE_ONLY EQU $FE
+NO_GENDER EQU $FF
+
+; used when returning a Pokemon's gender
+GENDERLESS EQU $00
+MALE EQU $01
+FEMALE EQU $02
+
2. Create a new file gender_ratios.asm in data/
This defines how likely a Pokémon is to be male or female, or whether it is genderless in certain cases.
+MonGenderRatios:
+ db SAME_BOTH_GENDERS ; RHYDON
+ db FEMALE_ONLY ; KANGASKHAN
+ db NO_GENDER ; NIDORAN_M
+ db FEMALE_75_PERCENT ; CLEFAIRY
+ db SAME_BOTH_GENDERS ; SPEAROW
+ db NO_GENDER ; VOLTORB
+ db MALE_ONLY ; NIDOKING
+ db SAME_BOTH_GENDERS ; SLOWBRO
+ db MALE_88_PERCENT ; IVYSAUR
+ db SAME_BOTH_GENDERS ; EXEGGUTOR
+ db SAME_BOTH_GENDERS ; LICKITUNG
+ db SAME_BOTH_GENDERS ; EXEGGCUTE
+ db SAME_BOTH_GENDERS ; GRIMER
+ db SAME_BOTH_GENDERS ; GENGAR
+ db NO_GENDER ; NIDORAN_F
+ db FEMALE_ONLY ; NIDOQUEEN
+ db SAME_BOTH_GENDERS ; CUBONE
+ db SAME_BOTH_GENDERS ; RHYHORN
+ db SAME_BOTH_GENDERS ; LAPRAS
+ db MALE_75_PERCENT ; ARCANINE
+ db NO_GENDER ; MEW
+ db SAME_BOTH_GENDERS ; GYARADOS
+ db SAME_BOTH_GENDERS ; SHELLDER
+ db SAME_BOTH_GENDERS ; TENTACOOL
+ db SAME_BOTH_GENDERS ; GASTLY
+ db SAME_BOTH_GENDERS ; SCYTHER
+ db NO_GENDER ; STARYU
+ db MALE_88_PERCENT ; BLASTOISE
+ db SAME_BOTH_GENDERS ; PINSIR
+ db SAME_BOTH_GENDERS ; TANGELA
+ db NO_GENDER ; MISSINGNO_1F
+ db NO_GENDER ; MISSINGNO_20
+ db MALE_75_PERCENT ; GROWLITHE
+ db SAME_BOTH_GENDERS ; ONIX
+ db SAME_BOTH_GENDERS ; FEAROW
+ db SAME_BOTH_GENDERS ; PIDGEY
+ db SAME_BOTH_GENDERS ; SLOWPOKE
+ db MALE_75_PERCENT ; KADABRA
+ db SAME_BOTH_GENDERS ; GRAVELER
+ db FEMALE_ONLY ; CHANSEY
+ db MALE_75_PERCENT ; MACHOKE
+ db NO_GENDER ; MR_MIME
+ db MALE_ONLY ; HITMONLEE
+ db MALE_ONLY ; HITMONCHAN
+ db SAME_BOTH_GENDERS ; ARBOK
+ db SAME_BOTH_GENDERS ; PARASECT
+ db SAME_BOTH_GENDERS ; PSYDUCK
+ db SAME_BOTH_GENDERS ; DROWZEE
+ db SAME_BOTH_GENDERS ; GOLEM
+ db NO_GENDER ; MISSINGNO_32
+ db MALE_75_PERCENT ; MAGMAR
+ db NO_GENDER ; MISSINGNO_34
+ db MALE_75_PERCENT ; ELECTABUZZ
+ db NO_GENDER ; MAGNETON
+ db SAME_BOTH_GENDERS ; KOFFING
+ db NO_GENDER ; MISSINGNO_38
+ db SAME_BOTH_GENDERS ; MANKEY
+ db SAME_BOTH_GENDERS ; SEEL
+ db SAME_BOTH_GENDERS ; DIGLETT
+ db MALE_ONLY ; TAUROS
+ db NO_GENDER ; MISSINGNO_3D
+ db NO_GENDER ; MISSINGNO_3E
+ db NO_GENDER ; MISSINGNO_3F
+ db NO_GENDER ; FARFETCHD
+ db SAME_BOTH_GENDERS ; VENONAT
+ db SAME_BOTH_GENDERS ; DRAGONITE
+ db NO_GENDER ; MISSINGNO_43
+ db NO_GENDER ; MISSINGNO_44
+ db NO_GENDER ; MISSINGNO_45
+ db SAME_BOTH_GENDERS ; DODUO
+ db SAME_BOTH_GENDERS ; POLIWAG
+ db FEMALE_ONLY ; JYNX
+ db NO_GENDER ; MOLTRES
+ db NO_GENDER ; ARTICUNO
+ db NO_GENDER ; ZAPDOS
+ db NO_GENDER ; DITTO
+ db SAME_BOTH_GENDERS ; MEOWTH
+ db SAME_BOTH_GENDERS ; KRABBY
+ db NO_GENDER ; MISSINGNO_4F
+ db NO_GENDER ; MISSINGNO_50
+ db NO_GENDER ; MISSINGNO_51
+ db FEMALE_75_PERCENT ; VULPIX
+ db FEMALE_75_PERCENT ; NINETALES
+ db SAME_BOTH_GENDERS ; PIKACHU
+ db SAME_BOTH_GENDERS ; RAICHU
+ db NO_GENDER ; MISSINGNO_56
+ db NO_GENDER ; MISSINGNO_57
+ db SAME_BOTH_GENDERS ; DRATINI
+ db SAME_BOTH_GENDERS ; DRAGONAIR
+ db MALE_88_PERCENT ; KABUTO
+ db MALE_88_PERCENT ; KABUTOPS
+ db SAME_BOTH_GENDERS ; HORSEA
+ db SAME_BOTH_GENDERS ; SEADRA
+ db NO_GENDER ; MISSINGNO_5E
+ db NO_GENDER ; MISSINGNO_5F
+ db SAME_BOTH_GENDERS ; SANDSHREW
+ db SAME_BOTH_GENDERS ; SANDSLASH
+ db MALE_88_PERCENT ; OMANYTE
+ db MALE_88_PERCENT ; OMASTAR
+ db FEMALE_75_PERCENT ; JIGGLYPUFF
+ db FEMALE_75_PERCENT ; WIGGLYTUFF
+ db MALE_88_PERCENT ; EEVEE
+ db MALE_88_PERCENT ; FLAREON
+ db MALE_88_PERCENT ; JOLTEON
+ db MALE_88_PERCENT ; VAPOREON
+ db MALE_75_PERCENT ; MACHOP
+ db SAME_BOTH_GENDERS ; ZUBAT
+ db SAME_BOTH_GENDERS ; EKANS
+ db SAME_BOTH_GENDERS ; PARAS
+ db SAME_BOTH_GENDERS ; POLIWHIRL
+ db SAME_BOTH_GENDERS ; POLIWRATH
+ db SAME_BOTH_GENDERS ; WEEDLE
+ db SAME_BOTH_GENDERS ; KAKUNA
+ db SAME_BOTH_GENDERS ; BEEDRILL
+ db NO_GENDER ; MISSINGNO_73
+ db SAME_BOTH_GENDERS ; DODRIO
+ db SAME_BOTH_GENDERS ; PRIMEAPE
+ db SAME_BOTH_GENDERS ; DUGTRIO
+ db SAME_BOTH_GENDERS ; VENOMOTH
+ db SAME_BOTH_GENDERS ; DEWGONG
+ db NO_GENDER ; MISSINGNO_79
+ db NO_GENDER ; MISSINGNO_7A
+ db SAME_BOTH_GENDERS ; CATERPIE
+ db SAME_BOTH_GENDERS ; METAPOD
+ db SAME_BOTH_GENDERS ; BUTTERFREE
+ db MALE_75_PERCENT ; MACHAMP
+ db NO_GENDER ; MISSINGNO_7F
+ db SAME_BOTH_GENDERS ; GOLDUCK
+ db SAME_BOTH_GENDERS ; HYPNO
+ db SAME_BOTH_GENDERS ; GOLBAT
+ db NO_GENDER ; MEWTWO
+ db MALE_88_PERCENT ; SNORLAX
+ db SAME_BOTH_GENDERS ; MAGIKARP
+ db NO_GENDER ; MISSINGNO_86
+ db NO_GENDER ; MISSINGNO_87
+ db SAME_BOTH_GENDERS ; MUK
+ db NO_GENDER ; MISSINGNO_8A
+ db SAME_BOTH_GENDERS ; KINGLER
+ db SAME_BOTH_GENDERS ; CLOYSTER
+ db NO_GENDER ; MISSINGNO_8C
+ db NO_GENDER ; ELECTRODE
+ db FEMALE_75_PERCENT ; CLEFABLE
+ db SAME_BOTH_GENDERS ; WEEZING
+ db SAME_BOTH_GENDERS ; PERSIAN
+ db SAME_BOTH_GENDERS ; MAROWAK
+ db NO_GENDER ; MISSINGNO_92
+ db SAME_BOTH_GENDERS ; HAUNTER
+ db MALE_75_PERCENT ; ABRA
+ db MALE_75_PERCENT ; ALAKAZAM
+ db SAME_BOTH_GENDERS ; PIDGEOTTO
+ db SAME_BOTH_GENDERS ; PIDGEOT
+ db NO_GENDER ; STARMIE
+ db MALE_88_PERCENT ; BULBASAUR
+ db MALE_88_PERCENT ; VENUSAUR
+ db SAME_BOTH_GENDERS ; TENTACRUEL
+ db NO_GENDER ; MISSINGNO_9C
+ db SAME_BOTH_GENDERS ; GOLDEEN
+ db SAME_BOTH_GENDERS ; SEAKING
+ db NO_GENDER ; MISSINGNO_9F
+ db NO_GENDER ; MISSINGNO_A0
+ db NO_GENDER ; MISSINGNO_A1
+ db NO_GENDER ; MISSINGNO_A2
+ db SAME_BOTH_GENDERS ; PONYTA
+ db SAME_BOTH_GENDERS ; RAPIDASH
+ db SAME_BOTH_GENDERS ; RATTATA
+ db SAME_BOTH_GENDERS ; RATICATE
+ db MALE_ONLY ; NIDORINO
+ db FEMALE_ONLY ; NIDORINA
+ db SAME_BOTH_GENDERS ; GEODUDE
+ db NO_GENDER ; PORYGON
+ db MALE_88_PERCENT ; AERODACTYL
+ db NO_GENDER ; MISSINGNO_AC
+ db NO_GENDER ; MAGNEMITE
+ db NO_GENDER ; MISSINGNO_AE
+ db NO_GENDER ; MISSINGNO_AF
+ db MALE_88_PERCENT ; CHARMANDER
+ db MALE_88_PERCENT ; SQUIRTLE
+ db MALE_88_PERCENT ; CHARMELEON
+ db MALE_88_PERCENT ; WARTORTLE
+ db MALE_88_PERCENT ; CHARIZARD
+ db NO_GENDER ; MISSINGNO_B5
+ db NO_GENDER ; FOSSIL_KABUTOPS
+ db NO_GENDER ; FOSSIL_AERODACTYL
+ db NO_GENDER ; MON_GHOST
+ db SAME_BOTH_GENDERS ; ODDISH
+ db SAME_BOTH_GENDERS ; GLOOM
+ db SAME_BOTH_GENDERS ; VILEPLUME
+ db SAME_BOTH_GENDERS ; BELLSPROUT
+ db SAME_BOTH_GENDERS ; WEEPINBELL
+ db SAME_BOTH_GENDERS ; VICTREEBEL
+
This will show the actual male/female icon in the battle screen.
DrawPlayerHUDAndHPBar:
xor a
ldh [hAutoBGTransferEnabled], a
hlcoord 9, 7
lb bc, 5, 11
call ClearScreenArea
callfar PlacePlayerHUDTiles
hlcoord 18, 9
ld [hl], $73
ld de, wBattleMonNick
hlcoord 10, 7
call CenterMonName
call PlaceString
+ call PrintPlayerMonGender
ld hl, wBattleMonSpecies
...
DrawEnemyHUDAndHPBar:
xor a
ldh [hAutoBGTransferEnabled], a
hlcoord 0, 0
lb bc, 4, 12
call ClearScreenArea
callfar PlaceEnemyHUDTiles
ld de, wEnemyMonNick
hlcoord 1, 0
call CenterMonName
call PlaceString
+ call PrintEnemyMonGender
hlcoord 4, 1
...
And add this new routine at the bottom of the same file
+PrintPlayerMonGender:
+ ld a, [wBattleMonSpecies]
+ ld de, wBattleMonDVs
+ coord hl, 17, 8
+ jr PrintGenderCommon
+
+PrintEnemyMonGender:
+ ld a, [wEnemyMonSpecies]
+ ld de, wEnemyMonDVs
+ coord hl, 9, 1
+PrintGenderCommon:
+ ld [wGenderTemp], a
+ push hl
+ farcall GetMonGender
+ ld a, [wGenderTemp]
+ and a
+ jr z, .genderless
+ dec a
+ ld a, "♂"
+ jr z, .ok
+ ld a, "♀"
+ jr .ok
+.genderless
+ ld a, " "
+.ok
+ pop hl
+ ld [hl], a
+ ret
+
4. Create a new file mon_gender.asm in engine/
This routine calculates the gender based on the Attack DV, like in Gen II.
+GetMonGender::
+ ld hl, MonGenderRatios
+ ld a, [wGenderTemp]
+ dec a
+ ld c, a
+ ld b, 0
+ add hl, bc
+
+; Attack DV
+ ld a, [de]
+ and $f0
+ ld b, a
+; Speed DV
+ inc de
+ ld a, [de]
+ and $f0
+ swap a
+ or b
+ ld b, a
+
+ ld a, [hl]
+
+ cp NO_GENDER
+ jr z, .genderless
+
+ cp FEMALE_ONLY
+ jr z, .female
+
+ and a ; MALE_ONLY
+ jr z, .male
+
+ cp b
+ jr c, .male
+
+.female
+ ld a, FEMALE
+ jr .done
+.male
+ ld a, MALE
+ jr .done
+.genderless
+ ld a, GENDERLESS
+.done
+ ld [wGenderTemp], a
+ ret
+
+
+INCLUDE "data/gender_ratios.asm"
This will show the male/female icon on the status screen.
StatusScreen:
...
.StatusWritten
...
hlcoord 12, 16
call PlaceString ; OT
hlcoord 12, 14
ld de, wLoadedMonOTID
lb bc, LEADING_ZEROES | 2, 5
call PrintNumber ; ID Number
ld d, STATUS_SCREEN_STATS_BOX
call PrintStatsBox
+ ld a, [wLoadedMonSpecies]
+ ld [wGenderTemp], a
+ call PrintGenderStatusScreen
call Delay3
call GBPalNormal
hlcoord 1, 0
call LoadFlippedFrontSpriteByMonIndex ; draw Pokémon picture
ld a, [wCurPartySpecies]
call PlayCry
call WaitForTextScrollButtonPress
pop af
ldh [hTileAnimations], a
ret
And add this new routine at the bottom of the same file
+PrintGenderStatusScreen:
+ ld de, wLoadedMonDVs
+ farcall GetMonGender
+ ld a, [wGenderTemp]
+ and a
+ ret z
+ dec a
+ ld a, '♂'
+ jr z, .ok
+ ld a, '♀'
+.ok
+ coord hl, 18, 2
+ ld [hl], a
+ ret
+
6. Edit includes.asm adding this line at the bottom
+INCLUDE "constants/gender_constants.asm"
In the example below, I used bank 6 for no particular reason other than that it had a lot of free space. Feel free to move it if needed.
SECTION "Battle Engine 2", ROMX
INCLUDE "engine/gfx/load_pokedex_tiles.asm"
INCLUDE "engine/overworld/map_sprites.asm"
INCLUDE "engine/overworld/emotion_bubbles.asm"
INCLUDE "engine/events/evolve_trade.asm"
INCLUDE "engine/battle/move_effects/substitute.asm"
INCLUDE "engine/menus/pc.asm"
SECTION "Play Time", ROMX
INCLUDE "engine/play_time.asm"
+INCLUDE "engine/mon_gender.asm"
SECTION "Doors and Ledges", ROMX
8. Define a new variable in ram/wram.asm.
In both the examples below I used an unused byte. Choose one depending on which ROM you are using or feel free to move it somewhere else.
pokered (and pokeblue)
; used for TestBattle (unused in non-debug builds)
+wGenderTemp::
wTestBattlePlayerSelectedMove:: db
pokeyellow
NEXTU
+wGenderTemp::
wUnusedCreditsByte:: db