- 7
- Posts
- 2
- Years
- Age 35
- he/him
- OR, USA
- Seen Jan 5, 2023
I followed the tutorial for adding evolution moves - that is, moves that Pokemon learn upon evolution, regardless of level. The tutorial creates a table that gives one evolution move to every Pokemon, with the option to use the NO_MOVE constant to not have an evolution move. So in my case, the table comes out looking like this (at data/pokemon/evolution_moves.asm):
And the code to get them to learn these moves looks like this (at enginge/pokemon/evolve.asm):
The problem, of course, being this:
So... since there are so many NO_MOVE entries in the table, I'm wondering if there's a more efficient way to do the whole thing where those entries are essentially skipped, not taking up memory space. A lot of things in pokecrystal use "pointer tables," which might be what I'm looking for, but I'm not sure. My understanding of assembly code and memory bank rules is very limited; I can probably just put something in a different bank, but it seems worth pursuing the efficiency angle. Has anybody dealt with this particular issue before?
Spoiler:
Code:
EvolutionMoves::
table_width 1, EvolutionMoves
db NO_MOVE ; BULBASAUR
db NO_MOVE ; IVYSAUR
db NO_MOVE ; VENUSAUR
db NO_MOVE ; CHARMANDER
db NO_MOVE ; CHARMELEON
db WING_ATTACK ; CHARIZARD
db NO_MOVE ; SQUIRTLE
db NO_MOVE ; WARTORTLE
db NO_MOVE ; BLASTOISE
db NO_MOVE ; CATERPIE
db HARDEN ; METAPOD
db NO_MOVE ; BUTTERFREE
db NO_MOVE ; WEEDLE
db HARDEN ; KAKUNA
db NO_MOVE ; BEEDRILL
db NO_MOVE ; PIDGEY
db NO_MOVE ; PIDGEOTTO
db NO_MOVE ; PIDGEOT
db NO_MOVE ; RATTATA
db SCARY_FACE ; RATICATE
db NO_MOVE ; SPEAROW
db NO_MOVE ; FEAROW
db NO_MOVE ; EKANS
db NO_MOVE ; ARBOK
db NO_MOVE ; PIKACHU
db THUNDERBOLT ; RAICHU
db NO_MOVE ; SANDSHREW
db NO_MOVE ; SANDLASH
db NO_MOVE ; NIDORAN_F
db NO_MOVE ; NIDORINA
db NO_MOVE ; NIDOQUEEN
db NO_MOVE ; NIDORAN_M
db NO_MOVE ; NIDORINO
db NO_MOVE ; NIDOKING
db NO_MOVE ; CLEFAIRY
db NO_MOVE ; CLEFABLE
db NO_MOVE ; VULPIX
db NO_MOVE ; NINETALES
db NO_MOVE ; JIGGLYPUFF
db NO_MOVE ; WIGGLYTUFF
db NO_MOVE ; ZUBAT
db NO_MOVE ; GOLBAT
db NO_MOVE ; ODDISH
db NO_MOVE ; GLOOM
db PETAL_DANCE ; VILEPLUME
db NO_MOVE ; PARAS
db NO_MOVE ; PARASECT
db NO_MOVE ; VENONAT
db GUST ; VENOMOTH
db NO_MOVE ; DIGLETT
db TRI_ATTACK ; DUGTRIO
db NO_MOVE ; MEOWTH
db NO_MOVE ; PERSIAN
db NO_MOVE ; PSYDUCK
db PAY_DAY ; GOLDUCK
db NO_MOVE ; MANKEY
db NO_MOVE ; PRIMEAPE
db NO_MOVE ; GROWLITHE
db NO_MOVE ; ARCANINE
db NO_MOVE ; POLIWAG
db NO_MOVE ; POLIWHIRL
db ROLLING_KICK ; POLIWRATH
db NO_MOVE ; ABRA
db KINESIS ; KADABRA
db KINESIS ; ALAKAZAM
db NO_MOVE ; MACHOP
db NO_MOVE ; MACHOKE
db NO_MOVE ; MACHAMP
db NO_MOVE ; BELLSPROUT
db NO_MOVE ; WEEPINBELL
db RAZOR_LEAF ; VICTREEBEL
db NO_MOVE ; TENTACOOL
db NO_MOVE ; TENTACRUEL
db NO_MOVE ; GEODUDE
db NO_MOVE ; GRAVELER
db NO_MOVE ; GOLEM
db NO_MOVE ; PONYTA
db FURY_ATTACK ; RAPIDASH
db NO_MOVE ; SLOWPOKE
db WITHDRAW ; SLOWBRO
db NO_MOVE ; MAGNEMITE
db NO_MOVE ; MAGNETON
db NO_MOVE ; FARFETCH_D
db NO_MOVE ; DODUO
db TRI_ATTACK ; DODRIO
db NO_MOVE ; SEEL
db NO_MOVE ; DEWGONG
db NO_MOVE ; GRIMER
db NO_MOVE ; MUK
db NO_MOVE ; SHELLDER
db SPIKE_CANNON ; CLOYSTER
db NO_MOVE ; GASTLY
db NO_MOVE ; HAUNTER
db NO_MOVE ; GENGAR
db NO_MOVE ; ONIX
db NO_MOVE ; DROWZEE
db NIGHT_SHADE ; HYPNO
db NO_MOVE ; KRABBY
db NO_MOVE ; KINGLER
db NO_MOVE ; VOLTORB
db NO_MOVE ; ELECTRODE
db NO_MOVE ; EXEGGCUTE
db STOMP ; EXEGGUTOR
db NO_MOVE ; CUBONE
db NIGHT_SHADE ; MAROWAK
db DOUBLE_KICK ; HITMONLEE
db COMET_PUNCH ; HITMONCHAN
db NO_MOVE ; LICKITUNG
db NO_MOVE ; KOFFING
db NO_MOVE ; WEEZING
db NO_MOVE ; RHYHORN
db NO_MOVE ; RHYDON
db NO_MOVE ; CHANSEY
db NO_MOVE ; TANGELA
db NO_MOVE ; KANGASKHAN
db NO_MOVE ; HORSEA
db NO_MOVE ; SEADRA
db NO_MOVE ; GOLDEEN
db NO_MOVE ; SEAKING
db NO_MOVE ; STARYU
db CONFUSION ; STARMIE
db NO_MOVE ; MR__MIME
db NO_MOVE ; SCYTHER
db LOVELY_KISS ; JYNX
db NO_MOVE ; ELECTABUZZ
db NO_MOVE ; MAGMAR
db NO_MOVE ; PINSIR
db NO_MOVE ; TAUROS
db NO_MOVE ; MAGIKARP
db BITE ; GYARADOS
db NO_MOVE ; LAPRAS
db NO_MOVE ; DITTO
db NO_MOVE ; EEVEE
db WATER_GUN ; VAPOREON
db THUNDERSHOCK ; JOLTEON
db EMBER ; FLAREON
db NO_MOVE ; PORYGON
db NO_MOVE ; OMANYTE
db SPIKE_CANNON ; OMASTAR
db NO_MOVE ; KABUTO
db CROSS_CHOP ; KABUTOPS
db NO_MOVE ; AERODACTYL
db NO_MOVE ; SNORLAX
db NO_MOVE ; ARTICUNO
db NO_MOVE ; ZAPDOS
db NO_MOVE ; MOLTRES
db NO_MOVE ; DRATINI
db NO_MOVE ; DRAGONAIR
db WING_ATTACK ; DRAGONITE
db NO_MOVE ; MEWTWO
db NO_MOVE ; MEW
db NO_MOVE ; CHIKORITA
db NO_MOVE ; BAYLEEF
db NO_MOVE ; MEGANIUM
db NO_MOVE ; CYNDAQUIL
db NO_MOVE ; QUILAVA
db NO_MOVE ; TYPHLOSION
db NO_MOVE ; TOTODILE
db NO_MOVE ; CROCONAW
db NO_MOVE ; FERALIGATR
db NO_MOVE ; SENTRET
db NO_MOVE ; FURRET
db NO_MOVE ; HOOTHOOT
db NO_MOVE ; NOCTOWL
db NO_MOVE ; LEDYBA
db NO_MOVE ; LEDIAN
db NO_MOVE ; SPINARAK
db NO_MOVE ; ARIADOS
db NO_MOVE ; CROBAT
db NO_MOVE ; CHINCHOU
db NO_MOVE ; LANTURN
db NO_MOVE ; PICHU
db NO_MOVE ; CLEFFA
db NO_MOVE ; IGGLYBUFF
db NO_MOVE ; TOGEPI
db WING_ATTACK ; TOGETIC
db NO_MOVE ; NATU
db NO_MOVE ; XATU
db NO_MOVE ; MAREEP
db NO_MOVE ; FLAAFFY
db THUNDERPUNCH ; AMPHAROS
db PETAL_DANCE ; BELLOSSOM
db NO_MOVE ; MARILL
db NO_MOVE ; AZUMARILL
db NO_MOVE ; SUDOWOODO
db LICK ; POLITOED
db NO_MOVE ; HOPPIP
db NO_MOVE ; SKIPLOOM
db NO_MOVE ; JUMPLUFF
db NO_MOVE ; AIPOM
db NO_MOVE ; SUNKERN
db FLAME_WHEEL ; SUNFLORA
db NO_MOVE ; YANMA
db NO_MOVE ; WOOPER
db NO_MOVE ; QUAGSIRE
db CONFUSION ; ESPEON
db PURSUIT ; UMBREON
db NO_MOVE ; MURKROW
db SWAGGER ; SLOWKING
db NO_MOVE ; MISDREAVUS
db NO_MOVE ; UNOWN
db NO_MOVE ; WOBBUFFET
db NO_MOVE ; GIRAFARIG
db NO_MOVE ; PINECO
db HARDEN ; FORRETRESS
db NO_MOVE ; DUNSPARCE
db NO_MOVE ; GLIGAR
db NO_MOVE ; STEELIX
db NO_MOVE ; SNUBBULL
db NO_MOVE ; GRANBULL
db NO_MOVE ; QWILFISH
db METAL_CLAW ; SCIZOR
db NO_MOVE ; SHUCKLE
db NO_MOVE ; HERACROSS
db NO_MOVE ; SNEASEL
db NO_MOVE ; TEDDIURSA
db NO_MOVE ; URSARING
db NO_MOVE ; SLUGMA
db ROLLOUT ; MAGCARGO
db NO_MOVE ; SWINUB
db FURY_ATTACK ; PILOSWINE
db NO_MOVE ; CORSOLA
db NO_MOVE ; REMORAID
db OCTAZOOKA ; OCTILLERY
db NO_MOVE ; DELIBIRD
db NO_MOVE ; MANTINE
db NO_MOVE ; SKARMORY
db NO_MOVE ; HOUNDOUR
db NO_MOVE ; HOUNDOOM
db NO_MOVE ; KINGDRA
db NO_MOVE ; PHANPY
db HORN_ATTACK ; DONPHAN
db NO_MOVE ; PORYGON2
db NO_MOVE ; STANTLER
db NO_MOVE ; SMEARGLE
db NO_MOVE ; TYROGUE
db ROLLING_KICK ; HITMONTOP
db NO_MOVE ; SMOOCHUM
db NO_MOVE ; ELEKID
db NO_MOVE ; MAGBY
db NO_MOVE ; MILTANK
db NO_MOVE ; BLISSEY
db NO_MOVE ; RAIKOU
db NO_MOVE ; ENTEI
db NO_MOVE ; SUICUNE
db NO_MOVE ; LARVITAR
db HARDEN ; PUPITAR
db NO_MOVE ; TYRANITAR
db NO_MOVE ; LUGIA
db NO_MOVE ; HO_OH
db NO_MOVE ; CELEBI
db TWISTER ; YANMEGA
db NO_MOVE ; WHIMSICOTT
assert_table_length NUM_POKEMON
And the code to get them to learn these moves looks like this (at enginge/pokemon/evolve.asm):
Code:
LearnEvolutionMove:
ld a, [wTempSpecies]
ld [wCurPartySpecies], a
dec a
ld c, a
ld b, 0
ld hl, EvolutionMoves
add hl, bc
ld a, [hl]
and a
ret z
push hl
ld d, a
ld hl, wPartyMon1Moves
ld a, [wCurPartyMon]
ld bc, PARTYMON_STRUCT_LENGTH
call AddNTimes
ld b, NUM_MOVES
.check_move
ld a, [hli]
cp d
jr z, .has_move
dec b
jr nz, .check_move
ld a, d
ld [wPutativeTMHMMove], a
ld [wNamedObjectIndex], a
call GetMoveName
call CopyName1
predef LearnMove
ld a, [wCurPartySpecies]
ld [wTempSpecies], a
.has_move
pop hl
ret
The problem, of course, being this:
Code:
error: layout.link(69): Sections would extend past the end of ROMX ($8117 > $7fff)
So... since there are so many NO_MOVE entries in the table, I'm wondering if there's a more efficient way to do the whole thing where those entries are essentially skipped, not taking up memory space. A lot of things in pokecrystal use "pointer tables," which might be what I'm looking for, but I'm not sure. My understanding of assembly code and memory bank rules is very limited; I can probably just put something in a different bank, but it seems worth pursuing the efficiency angle. Has anybody dealt with this particular issue before?