ref: af29f1f97ca855f24879a17283886a1d959fb3ed
dir: /engine/pokemon/evolve.asm/
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, Text_WhatEvolving 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 farcall EvolutionAnimation push af call ClearSprites pop af jp c, CancelEvolution ld hl, Text_CongratulationsYourPokemon 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, Text_EvolvedIntoPKMN call PrintTextBoxText farcall StubbedTrainerRankings_MonsEvolved 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 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, Text_StoppedEvolving 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 Text_CongratulationsYourPokemon: ; Congratulations! Your @ @ text_far UnknownText_0x1c4b92 text_end Text_EvolvedIntoPKMN: ; evolved into @ ! text_far UnknownText_0x1c4baf text_end Text_StoppedEvolving: ; Huh? @ stopped evolving! text_far UnknownText_0x1c4bc5 text_end Text_WhatEvolving: ; What? @ is evolving! text_far UnknownText_0x1c4be3 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, [wd002] 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 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