pokecrystal-board/engine/pokemon/evolve.asm

650 lines
8.7 KiB
NASM
Raw Normal View History

2018-06-24 07:09:41 -07:00
EvolvePokemon:
2018-01-23 14:39:09 -08:00
ld hl, wEvolvableFlags
xor a
ld [hl], a
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
ld c, a
ld b, SET_FLAG
call EvoFlagAction
2018-06-24 07:09:41 -07:00
EvolveAfterBattle:
xor a
2015-11-23 13:04:53 -08:00
ld [wMonTriedToEvolve], a
dec a
2018-01-23 14:39:09 -08:00
ld [wCurPartyMon], a
push hl
push bc
push de
2018-01-23 14:39:09 -08:00
ld hl, wPartyCount
push hl
EvolveAfterBattle_MasterLoop:
2018-01-23 14:39:09 -08:00
ld hl, wCurPartyMon
inc [hl]
pop hl
inc hl
ld a, [hl]
cp $ff
2016-01-12 09:46:18 -08:00
jp z, .ReturnToMap
2016-05-16 12:46:13 -07:00
ld [wEvolutionOldSpecies], a
push hl
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
ld c, a
2018-01-23 14:39:09 -08:00
ld hl, wEvolvableFlags
ld b, CHECK_FLAG
call EvoFlagAction
ld a, c
and a
2016-01-12 09:46:18 -08:00
jp z, EvolveAfterBattle_MasterLoop
2016-05-16 12:46:13 -07:00
ld a, [wEvolutionOldSpecies]
dec a
ld b, 0
ld c, a
ld hl, EvosAttacksPointers
add hl, bc
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
push hl
xor a
2018-01-23 14:39:09 -08:00
ld [wMonType], a
predef CopyMonToTempMon
pop hl
.loop
ld a, [hli]
and a
2016-01-12 09:46:18 -08:00
jr z, EvolveAfterBattle_MasterLoop
ld b, a
cp EVOLVE_TRADE
jr z, .trade
ld a, [wLinkMode]
and a
jp nz, .dont_evolve_2
ld a, b
cp EVOLVE_ITEM
jp z, .item
ld a, [wForceEvolution]
and a
jp nz, .dont_evolve_2
ld a, b
cp EVOLVE_LEVEL
jp z, .level
cp EVOLVE_HAPPINESS
jr z, .happiness
; EVOLVE_STAT
2018-01-23 14:39:09 -08:00
ld a, [wTempMonLevel]
cp [hl]
jp c, .dont_evolve_1
call IsMonHoldingEverstone
jp z, .dont_evolve_1
push hl
2018-01-23 14:39:09 -08:00
ld de, wTempMonAttack
ld hl, wTempMonDefense
ld c, 2
call CompareBytes
ld a, ATK_EQ_DEF
jr z, .got_tyrogue_evo
ld a, ATK_LT_DEF
jr c, .got_tyrogue_evo
ld a, ATK_GT_DEF
.got_tyrogue_evo
pop hl
inc hl
cp [hl]
jp nz, .dont_evolve_2
inc hl
jr .proceed
.happiness
2018-01-23 14:39:09 -08:00
ld a, [wTempMonHappiness]
cp HAPPINESS_TO_EVOLVE
jp c, .dont_evolve_2
call IsMonHoldingEverstone
jp z, .dont_evolve_2
ld a, [hli]
cp TR_ANYTIME
jr z, .proceed
cp TR_MORNDAY
jr z, .happiness_daylight
2023-07-31 03:27:53 -07:00
; TR_EVENITE
2018-01-23 14:39:09 -08:00
ld a, [wTimeOfDay]
cp NITE_F
2023-07-31 03:27:53 -07:00
jp c, .dont_evolve_3 ; MORN_F or DAY_F
jr .proceed
.happiness_daylight
2018-01-23 14:39:09 -08:00
ld a, [wTimeOfDay]
cp NITE_F
2023-07-31 03:27:53 -07:00
jp nc, .dont_evolve_3 ; NITE_F or EVE_F
jr .proceed
.trade
ld a, [wLinkMode]
and a
jp z, .dont_evolve_2
call IsMonHoldingEverstone
jp z, .dont_evolve_2
ld a, [hli]
ld b, a
inc a
jr z, .proceed
ld a, [wLinkMode]
cp LINK_TIMECAPSULE
jp z, .dont_evolve_3
2018-01-23 14:39:09 -08:00
ld a, [wTempMonItem]
cp b
jp nz, .dont_evolve_3
xor a
2018-01-23 14:39:09 -08:00
ld [wTempMonItem], a
jr .proceed
.item
ld a, [hli]
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wCurItem]
cp b
jp nz, .dont_evolve_3
ld a, [wForceEvolution]
and a
jp z, .dont_evolve_3
ld a, [wLinkMode]
and a
jp nz, .dont_evolve_3
jr .proceed
.level
ld a, [hli]
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wTempMonLevel]
cp b
jp c, .dont_evolve_3
call IsMonHoldingEverstone
jp z, .dont_evolve_3
.proceed
2018-01-23 14:39:09 -08:00
ld a, [wTempMonLevel]
ld [wCurPartyLevel], a
ld a, $1
2015-11-23 13:04:53 -08:00
ld [wMonTriedToEvolve], a
push hl
ld a, [hl]
2016-05-16 12:46:13 -07:00
ld [wEvolutionNewSpecies], a
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
ld hl, wPartyMonNicknames
call GetNickname
call CopyName1
ld hl, EvolvingText
call PrintText
ld c, 50
call DelayFrames
xor a
ldh [hBGMapMode], a
hlcoord 0, 0
lb bc, 12, 20
call ClearBox
ld a, $1
ldh [hBGMapMode], a
call ClearSprites
2017-12-24 09:47:30 -08:00
farcall EvolutionAnimation
push af
call ClearSprites
pop af
jp c, CancelEvolution
ld hl, CongratulationsYourPokemonText
call PrintText
pop hl
ld a, [hl]
2018-01-23 14:39:09 -08:00
ld [wCurSpecies], a
ld [wTempMonSpecies], a
2016-05-16 12:46:13 -07:00
ld [wEvolutionNewSpecies], a
ld [wNamedObjectIndex], a
call GetPokemonName
push hl
ld hl, EvolvedIntoText
2019-04-08 05:15:10 -07:00
call PrintTextboxText
ld de, MUSIC_NONE
call PlayMusic
ld de, SFX_CAUGHT_MON
call PlaySFX
call WaitSFX
ld c, 40
call DelayFrames
call ClearTilemap
call UpdateSpeciesNameIfNotNicknamed
call GetBaseData
2018-01-23 14:39:09 -08:00
ld hl, wTempMonExp + 2
ld de, wTempMonMaxHP
ld b, TRUE
predef CalcMonStats
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
ld hl, wPartyMons
ld bc, PARTYMON_STRUCT_LENGTH
call AddNTimes
ld e, l
ld d, h
ld bc, MON_MAXHP
add hl, bc
ld a, [hli]
ld b, a
ld c, [hl]
2018-01-23 14:39:09 -08:00
ld hl, wTempMonMaxHP + 1
ld a, [hld]
sub c
ld c, a
ld a, [hl]
sbc b
ld b, a
2018-01-23 14:39:09 -08:00
ld hl, wTempMonHP + 1
ld a, [hl]
add c
ld [hld], a
ld a, [hl]
adc b
ld [hl], a
2018-01-23 14:39:09 -08:00
ld hl, wTempMonSpecies
ld bc, PARTYMON_STRUCT_LENGTH
call CopyBytes
2018-01-23 14:39:09 -08:00
ld a, [wCurSpecies]
ld [wTempSpecies], a
xor a
2018-01-23 14:39:09 -08:00
ld [wMonType], a
call LearnLevelMoves
ld a, [wTempSpecies]
dec a
call SetSeenAndCaughtMon
ld a, [wTempSpecies]
cp UNOWN
jr nz, .skip_unown
2018-01-23 14:39:09 -08:00
ld hl, wTempMonDVs
predef GetUnownLetter
2017-12-24 09:47:30 -08:00
callfar UpdateUnownDex
.skip_unown
pop de
pop hl
2018-01-23 14:39:09 -08:00
ld a, [wTempMonSpecies]
ld [hl], a
push hl
ld l, e
ld h, d
2016-01-12 09:46:18 -08:00
jp EvolveAfterBattle_MasterLoop
.dont_evolve_1
inc hl
.dont_evolve_2
inc hl
.dont_evolve_3
inc hl
jp .loop
.UnusedReturnToMap: ; unreferenced
pop hl
.ReturnToMap:
pop de
pop bc
pop hl
ld a, [wLinkMode]
and a
ret nz
ld a, [wBattleMode]
and a
ret nz
2015-11-23 13:04:53 -08:00
ld a, [wMonTriedToEvolve]
and a
call nz, RestartMapMusic
ret
2018-06-24 07:09:41 -07:00
UpdateSpeciesNameIfNotNicknamed:
2018-01-23 14:39:09 -08:00
ld a, [wCurSpecies]
push af
2018-01-23 14:39:09 -08:00
ld a, [wBaseDexNo]
ld [wNamedObjectIndex], a
call GetPokemonName
pop af
2018-01-23 14:39:09 -08:00
ld [wCurSpecies], a
ld hl, wStringBuffer1
ld de, wStringBuffer2
.loop
ld a, [de]
inc de
cp [hl]
inc hl
ret nz
cp "@"
jr nz, .loop
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
2018-01-20 09:25:55 -08:00
ld bc, MON_NAME_LENGTH
2018-01-23 14:39:09 -08:00
ld hl, wPartyMonNicknames
call AddNTimes
push hl
2018-01-23 14:39:09 -08:00
ld a, [wCurSpecies]
ld [wNamedObjectIndex], a
call GetPokemonName
2018-01-23 14:39:09 -08:00
ld hl, wStringBuffer1
pop de
2018-01-20 09:25:55 -08:00
ld bc, MON_NAME_LENGTH
jp CopyBytes
2018-06-24 07:09:41 -07:00
CancelEvolution:
ld hl, StoppedEvolvingText
call PrintText
call ClearTilemap
pop hl
2016-01-12 09:46:18 -08:00
jp EvolveAfterBattle_MasterLoop
2018-06-24 07:09:41 -07:00
IsMonHoldingEverstone:
push hl
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
ld hl, wPartyMon1Item
ld bc, PARTYMON_STRUCT_LENGTH
call AddNTimes
ld a, [hl]
cp EVERSTONE
pop hl
ret
CongratulationsYourPokemonText:
text_far _CongratulationsYourPokemonText
text_end
EvolvedIntoText:
text_far _EvolvedIntoText
text_end
StoppedEvolvingText:
text_far _StoppedEvolvingText
text_end
EvolvingText:
text_far _EvolvingText
text_end
2018-06-24 07:09:41 -07:00
LearnLevelMoves:
ld a, [wTempSpecies]
2018-01-23 14:39:09 -08:00
ld [wCurPartySpecies], a
dec a
ld b, 0
ld c, a
ld hl, EvosAttacksPointers
add hl, bc
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
.skip_evos
ld a, [hli]
and a
jr nz, .skip_evos
.find_move
ld a, [hli]
and a
jr z, .done
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyLevel]
cp b
ld a, [hli]
jr nz, .find_move
push hl
ld d, a
2018-01-23 14:39:09 -08:00
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
jr .learn
.has_move
pop hl
jr .find_move
.learn
ld a, d
ld [wPutativeTMHMMove], a
ld [wNamedObjectIndex], a
call GetMoveName
call CopyName1
predef LearnMove
pop hl
jr .find_move
.done
2018-01-23 14:39:09 -08:00
ld a, [wCurPartySpecies]
ld [wTempSpecies], a
ret
2018-06-24 07:09:41 -07:00
FillMoves:
2018-01-23 14:39:09 -08:00
; Fill in moves at de for wCurPartySpecies at wCurPartyLevel
push hl
push de
push bc
ld hl, EvosAttacksPointers
ld b, 0
2018-01-23 14:39:09 -08:00
ld a, [wCurPartySpecies]
dec a
add a
rl b
ld c, a
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
.GoToAttacks:
ld a, [hli]
and a
jr nz, .GoToAttacks
jr .GetLevel
.NextMove:
pop de
.GetMove:
inc hl
.GetLevel:
ld a, [hli]
and a
jp z, .done
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyLevel]
cp b
jp c, .done
2020-11-03 16:53:07 -08:00
ld a, [wSkipMovesBeforeLevelUp]
and a
jr z, .CheckMove
ld a, [wPrevPartyLevel]
cp b
jr nc, .GetMove
.CheckMove:
push de
ld c, NUM_MOVES
.CheckRepeat:
ld a, [de]
inc de
cp [hl]
jr z, .NextMove
dec c
jr nz, .CheckRepeat
pop de
push de
ld c, NUM_MOVES
.CheckSlot:
ld a, [de]
and a
jr z, .LearnMove
inc de
dec c
jr nz, .CheckSlot
pop de
push de
push hl
ld h, d
ld l, e
call ShiftMoves
2016-05-16 12:46:13 -07:00
ld a, [wEvolutionOldSpecies]
and a
jr z, .ShiftedMove
push de
2018-01-23 14:39:09 -08:00
ld bc, wPartyMon1PP - (wPartyMon1Moves + NUM_MOVES - 1)
add hl, bc
ld d, h
ld e, l
call ShiftMoves
pop de
.ShiftedMove:
pop hl
.LearnMove:
ld a, [hl]
ld [de], a
2016-05-16 12:46:13 -07:00
ld a, [wEvolutionOldSpecies]
and a
jr z, .NextMove
push hl
ld a, [hl]
ld hl, MON_PP - MON_MOVES
add hl, de
push hl
dec a
ld hl, Moves + MOVE_PP
ld bc, MOVE_LENGTH
call AddNTimes
ld a, BANK(Moves)
call GetFarByte
pop hl
ld [hl], a
pop hl
jr .NextMove
.done
pop bc
pop de
pop hl
ret
2018-06-24 07:09:41 -07:00
ShiftMoves:
ld c, NUM_MOVES - 1
.loop
inc de
ld a, [de]
ld [hli], a
dec c
jr nz, .loop
ret
2018-06-24 07:09:41 -07:00
EvoFlagAction:
push de
ld d, $0
predef SmallFarFlagAction
pop de
ret
2018-06-24 07:09:41 -07:00
GetPreEvolution:
2018-01-23 14:39:09 -08:00
; Find the first mon to evolve into wCurPartySpecies.
2018-01-23 14:39:09 -08:00
; Return carry and the new species in wCurPartySpecies
; if a pre-evolution is found.
ld c, 0
.loop ; For each Pokemon...
ld hl, EvosAttacksPointers
ld b, 0
add hl, bc
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
.loop2 ; For each evolution...
ld a, [hli]
and a
2018-01-23 14:39:09 -08:00
jr z, .no_evolve ; If we jump, this Pokemon does not evolve into wCurPartySpecies.
cp EVOLVE_STAT ; This evolution type has the extra parameter of stat comparison.
jr nz, .not_tyrogue
inc hl
.not_tyrogue
inc hl
2018-01-23 14:39:09 -08:00
ld a, [wCurPartySpecies]
cp [hl]
jr z, .found_preevo
inc hl
ld a, [hl]
and a
jr nz, .loop2
.no_evolve
inc c
ld a, c
cp NUM_POKEMON
jr c, .loop
and a
ret
.found_preevo
inc c
ld a, c
2018-01-23 14:39:09 -08:00
ld [wCurPartySpecies], a
scf
ret