Pokémon Gender - pret/pokered GitHub Wiki

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
+	

3. Edit engine/battle/core.asm

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"

5. Edit engine/pokemon/status_screen.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"

7. Edit main.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