summaryrefslogtreecommitdiff
path: root/engine/pokemon/evolve.asm
diff options
context:
space:
mode:
authorlibjet <libj3t@gmail.com>2020-05-19 21:33:58 +0100
committerlibjet <libj3t@gmail.com>2020-05-19 21:33:58 +0100
commitf53d5a4c9c49b9de8aab5026b2a74706b587377f (patch)
tree92140289f98188b6f9d4a70434ab4998089bc6b3 /engine/pokemon/evolve.asm
parent519fe1eda94386ec39f90331c9b2fe58bbe46e96 (diff)
Add evolve.asm
Diffstat (limited to 'engine/pokemon/evolve.asm')
-rwxr-xr-xengine/pokemon/evolve.asm932
1 files changed, 932 insertions, 0 deletions
diff --git a/engine/pokemon/evolve.asm b/engine/pokemon/evolve.asm
new file mode 100755
index 00000000..dbc1d899
--- /dev/null
+++ b/engine/pokemon/evolve.asm
@@ -0,0 +1,932 @@
+EvolvePokemon:
+ ld hl, wEvolvableFlags
+ xor a
+ ld [hl], a
+ ld a, [wCurPartyMon]
+ ld c, a
+ ld b, SET_FLAG
+ call EvoFlagAction
+EvolveAfterBattle:
+ xor a
+ ld [wMonTriedToEvolve], a
+ dec a
+ ld [wCurPartyMon], a
+ push hl
+ push bc
+ push de
+ ld hl, wPartyCount
+
+ push hl
+
+EvolveAfterBattle_MasterLoop:
+ ld hl, wCurPartyMon
+ inc [hl]
+
+ pop hl
+
+ inc hl
+ ld a, [hl]
+ cp $ff
+ jp z, .ReturnToMap
+
+ ld [wEvolutionOldSpecies], a
+
+ push hl
+ ld a, [wCurPartyMon]
+ ld c, a
+ ld hl, wEvolvableFlags
+ ld b, CHECK_FLAG
+ call EvoFlagAction
+ ld a, c
+ and a
+ jp z, EvolveAfterBattle_MasterLoop
+
+ 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
+ ld [wMonType], a
+ predef CopyMonToTempMon
+ pop hl
+
+.loop
+ ld a, [hli]
+ and a
+ 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
+ ld a, [wTempMonLevel]
+ cp [hl]
+ jp c, .dont_evolve_1
+
+ call IsMonHoldingEverstone
+ jp z, .dont_evolve_1
+
+ push hl
+ 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
+ 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
+
+; TR_NITE
+ ld a, [wTimeOfDay]
+ cp NITE_F
+ jp nz, .dont_evolve_3
+ jr .proceed
+
+.happiness_daylight
+ ld a, [wTimeOfDay]
+ cp NITE_F
+ jp z, .dont_evolve_3
+ 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
+
+ ld a, [wTempMonItem]
+ cp b
+ jp nz, .dont_evolve_3
+
+ xor a
+ ld [wTempMonItem], a
+ jr .proceed
+
+.item
+ ld a, [hli]
+ ld b, a
+ 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
+ ld a, [wTempMonLevel]
+ cp b
+ jp c, .dont_evolve_3
+ call IsMonHoldingEverstone
+ jp z, .dont_evolve_3
+
+.proceed
+ ld a, [wTempMonLevel]
+ ld [wCurPartyLevel], a
+ ld a, $1
+ ld [wMonTriedToEvolve], a
+
+ push hl
+
+ ld a, [hl]
+ ld [wEvolutionNewSpecies], a
+ ld a, [wCurPartyMon]
+ ld hl, wPartyMonNicknames
+ call GetNick
+ 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
+ call EvolutionAnimation
+
+ push af
+ call ClearSprites
+ pop af
+ jp c, CancelEvolution
+
+ ld hl, CongratulationsYourPokemonText
+ call PrintText
+
+ pop hl
+
+ ld a, [hl]
+ ld [wCurSpecies], a
+ ld [wTempMonSpecies], a
+ ld [wEvolutionNewSpecies], a
+ ld [wNamedObjectIndexBuffer], a
+ call GetPokemonName
+
+ push hl
+ ld hl, EvolvedIntoText
+ call PrintTextboxText
+ push de
+
+ ld de, MUSIC_NONE
+ call PlayMusic
+ ld de, SFX_CAUGHT_MON
+ call PlaySFX
+ call WaitSFX
+
+ pop de
+ ld c, 40
+ call DelayFrames
+
+ call ClearTilemap
+ call UpdateSpeciesNameIfNotNicknamed
+ call GetBaseData
+
+ ld hl, wTempMonExp + 2
+ ld de, wTempMonMaxHP
+ ld b, TRUE
+ predef CalcMonStats
+
+ 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]
+ ld hl, wTempMonMaxHP + 1
+ ld a, [hld]
+ sub c
+ ld c, a
+ ld a, [hl]
+ sbc b
+ ld b, a
+ ld hl, wTempMonHP + 1
+ ld a, [hl]
+ add c
+ ld [hld], a
+ ld a, [hl]
+ adc b
+ ld [hl], a
+
+ ld hl, wTempMonSpecies
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call CopyBytes
+
+ ld a, [wCurSpecies]
+ ld [wTempSpecies], a
+ xor a
+ ld [wMonType], a
+ call LearnLevelMoves
+ ld a, [wTempSpecies]
+ dec a
+ call SetSeenAndCaughtMon
+
+ ld a, [wTempSpecies]
+ cp UNOWN
+ jr nz, .skip_unown
+
+ ld hl, wTempMonDVs
+ predef GetUnownLetter
+ callfar UpdateUnownDex
+
+.skip_unown
+ pop de
+ pop hl
+ ld a, [wTempMonSpecies]
+ ld [hl], a
+ push hl
+ ld l, e
+ ld h, d
+ jp EvolveAfterBattle_MasterLoop
+
+.dont_evolve_1
+ inc hl
+.dont_evolve_2
+ inc hl
+.dont_evolve_3
+ inc hl
+ jp .loop
+
+; unused
+ pop hl
+.ReturnToMap:
+ pop de
+ pop bc
+ pop hl
+ ld a, [wLinkMode]
+ and a
+ ret nz
+ ld a, [wBattleMode]
+ and a
+ ret nz
+ ld a, [wMonTriedToEvolve]
+ and a
+ call nz, RestartMapMusic
+ ret
+
+UpdateSpeciesNameIfNotNicknamed:
+ ld a, [wCurSpecies]
+ push af
+ ld a, [wBaseDexNo]
+ ld [wNamedObjectIndexBuffer], a
+ call GetPokemonName
+ pop af
+ 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
+
+ ld a, [wCurPartyMon]
+ ld bc, MON_NAME_LENGTH
+ ld hl, wPartyMonNicknames
+ call AddNTimes
+ push hl
+ ld a, [wCurSpecies]
+ ld [wNamedObjectIndexBuffer], a
+ call GetPokemonName
+ ld hl, wStringBuffer1
+ pop de
+ ld bc, MON_NAME_LENGTH
+ jp CopyBytes
+
+CancelEvolution:
+ ld hl, StoppedEvolvingText
+ call PrintText
+ call ClearTilemap
+ pop hl
+ jp EvolveAfterBattle_MasterLoop
+
+IsMonHoldingEverstone:
+ push hl
+ 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
+
+LearnLevelMoves:
+ ld a, [wTempSpecies]
+ 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
+ ld a, [wCurPartyLevel]
+ cp b
+ ld a, [hli]
+ jr nz, .find_move
+
+ 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
+ jr .learn
+.has_move
+
+ pop hl
+ jr .find_move
+
+.learn
+ ld a, d
+ ld [wPutativeTMHMMove], a
+ ld [wNamedObjectIndexBuffer], a
+ call GetMoveName
+ call CopyName1
+ predef LearnMove
+ pop hl
+ jr .find_move
+
+.done
+ ld a, [wCurPartySpecies]
+ ld [wTempSpecies], a
+ ret
+
+FillMoves:
+; Fill in moves at de for wCurPartySpecies at wCurPartyLevel
+
+ push hl
+ push de
+ push bc
+ ld hl, EvosAttacksPointers
+ ld b, 0
+ 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
+ ld a, [wCurPartyLevel]
+ cp b
+ jp c, .done
+ ld a, [wEvolutionOldSpecies]
+ and a
+ jr z, .CheckMove
+ ld a, [wceed]
+ 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
+ ld a, [wEvolutionOldSpecies]
+ and a
+ jr z, .ShiftedMove
+ push de
+ 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
+ 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
+
+ShiftMoves:
+ ld c, NUM_MOVES - 1
+.loop
+ inc de
+ ld a, [de]
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ ret
+
+EvoFlagAction:
+ push de
+ ld d, $0
+ predef SmallFarFlagAction
+ pop de
+ ret
+
+EvolutionAnimation:
+ push hl
+ push de
+ push bc
+ ld a, [wCurSpecies]
+ push af
+ ldh a, [rOBP0]
+ push af
+ ld a, %11100100
+ ldh [rOBP0], a
+
+ ld de, MUSIC_NONE
+ call PlayMusic
+
+ callfar ClearSpriteAnims
+
+ ld de, .GFX
+ ld hl, vTiles0
+ lb bc, BANK(.GFX), 8
+ call Request2bpp
+ xor a
+ ld [wLowHealthAlarm], a
+
+ ld a, 1
+ ldh [hBGMapMode], a
+
+ call WaitBGMap
+ xor a
+ ldh [hBGMapMode], a
+
+ ld a, [wEvolutionOldSpecies]
+ ld [wPlayerHPPal], a
+ ld c, 0
+ call .GetSGBLayout
+
+ ld a, [wEvolutionNewSpecies]
+ ld [wCurPartySpecies], a
+ ld [wCurSpecies], a
+ call .PlaceFrontpic
+
+ ld de, vTiles2
+ ld hl, vTiles2 tile $31
+ ld bc, 7 * 7
+ call Request2bpp
+
+ ld a, [wEvolutionOldSpecies]
+ ld [wCurPartySpecies], a
+ ld [wCurSpecies], a
+ call .PlaceFrontpic
+
+ ld a, 1
+ ldh [hBGMapMode], a
+
+ ld a, [wEvolutionOldSpecies]
+ call PlayMonCry
+
+ ld de, MUSIC_EVOLUTION
+ call PlayMusic
+
+ ld c, 80
+ call DelayFrames
+
+ ld c, 1
+ call .GetSGBLayout
+
+.AnimationSequence:
+ call ClearJoypad
+ lb bc, 1, 16 ; flash b times, wait c frames in between
+.loop
+ push bc
+ call .WaitFrames_CheckPressedB
+ jr c, .cancel
+ call .Flash
+ pop bc
+ inc b
+ dec c
+ dec c
+ jr nz, .loop
+
+ xor a
+ ld [wEvolutionCanceled], a
+
+ ld a, 49
+ ld [wEvolutionPicOffset], a
+ call .ReplaceFrontpic
+
+ ld a, [wEvolutionNewSpecies]
+.return:
+ ld [wPlayerHPPal], a
+
+ ld c, 0
+ call .GetSGBLayout
+ call .PlayEvolvedSFX
+
+ callfar ClearSpriteAnims
+
+ ld a, [wPlayerHPPal]
+ call PlayMonCry
+
+ pop af
+ ldh [rOBP0], a
+ pop af
+ ld [wCurSpecies], a
+ pop bc
+ pop de
+ pop hl
+
+ ld a, [wEvolutionCanceled]
+ and a
+ ret z
+
+ scf
+ ret
+
+.cancel:
+ pop bc
+ ld a, 1
+ ld [wEvolutionCanceled], a
+
+ ld a, [wEvolutionOldSpecies]
+ jr .return
+
+.GetSGBLayout:
+ ld b, SCGB_EVOLUTION
+ jp GetSGBLayout
+
+.PlaceFrontpic:
+ call GetBaseData
+ hlcoord 7, 2
+ jp PrepMonFrontpic
+
+.Flash:
+ ld a, 7 * 7 ; previous stage
+ ld [wEvolutionPicOffset], a
+ call .ReplaceFrontpic
+ ld a, -7 * 7 ; new stage
+ ld [wEvolutionPicOffset], a
+ call .ReplaceFrontpic
+ dec b
+ jr nz, .Flash
+ ret
+
+.ReplaceFrontpic:
+ push bc
+ xor a
+ ldh [hBGMapMode], a
+ hlcoord 7, 2
+ lb bc, 7, 7
+ ld de, SCREEN_WIDTH - 7
+.loop1
+ push bc
+.loop2
+ ld a, [wEvolutionPicOffset]
+ add [hl]
+ ld [hli], a
+ dec c
+ jr nz, .loop2
+ pop bc
+ add hl, de
+ dec b
+ jr nz, .loop1
+ ld a, $1
+ ldh [hBGMapMode], a
+ call WaitBGMap
+ pop bc
+ ret
+
+.WaitFrames_CheckPressedB:
+ call DelayFrame
+ push bc
+ call JoyTextDelay
+ ldh a, [hJoyDown]
+ pop bc
+ and B_BUTTON
+ jr nz, .pressed_b
+.loop3
+ dec c
+ jr nz, .WaitFrames_CheckPressedB
+ and a
+ ret
+
+.pressed_b
+ ld a, [wForceEvolution]
+ and a
+ jr nz, .loop3
+ scf
+ ret
+
+.PlayEvolvedSFX:
+ ld a, [wEvolutionCanceled]
+ and a
+ ret nz
+ ld de, SFX_EVOLVED
+ call PlaySFX
+ ld hl, wJumptableIndex
+ ld a, [hl]
+ push af
+ ld [hl], $0
+.loop4
+ call .balls_of_light
+ jr nc, .done
+ call .AnimateBallsOfLight
+ jr .loop4
+
+.done
+ ld c, 32
+.loop5
+ call .AnimateBallsOfLight
+ dec c
+ jr nz, .loop5
+ pop af
+ ld [wJumptableIndex], a
+ ret
+
+.balls_of_light
+ ld hl, wJumptableIndex
+ ld a, [hl]
+ cp 32
+ ret nc
+ ld d, a
+ inc [hl]
+ and $1
+ jr nz, .done_balls
+ ld e, $0
+ call .GenerateBallOfLight
+ ld e, $10
+ call .GenerateBallOfLight
+
+.done_balls
+ scf
+ ret
+
+.GenerateBallOfLight:
+ push de
+ depixel 9, 11
+ ld a, $25
+ call InitSpriteAnimStruct
+ ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
+ add hl, bc
+ ld a, [wJumptableIndex]
+ and %1110
+ sla a
+ pop de
+ add e
+ ld [hl], a
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld [hl], $0
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld [hl], $10
+ ret
+
+.AnimateBallsOfLight:
+ push bc
+ callfar PlaySpriteAnimations
+ ; a = (([hVBlankCounter] + 4) / 2) % NUM_PALETTES
+ ldh a, [hVBlankCounter]
+ and %1110
+ srl a
+ inc a
+ inc a
+ and $7
+ ld b, a
+ ld hl, wVirtualOAMSprite00Attributes
+ ld c, NUM_SPRITE_OAM_STRUCTS
+.loop6
+ ld a, [hl]
+ or b
+ ld [hli], a ; attributes
+rept SPRITEOAMSTRUCT_LENGTH - 1
+ inc hl
+endr
+ dec c
+ jr nz, .loop6
+ pop bc
+ call DelayFrame
+ ret
+
+.GFX:
+ dr $4273d, $4278d
+
+GetPreEvolution:
+; Find the first mon to evolve into wCurPartySpecies.
+
+; 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
+ 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
+ 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
+ ld [wCurPartySpecies], a
+ scf
+ ret