ref: e0583934874a8fddb1204efd4357146be617cb1f
dir: /engine/pokemon/learn.asm/
LearnMove: call LoadTileMapToTempTileMap ld a, [wCurPartyMon] ld hl, wPartyMonNicknames call GetNick ld hl, wStringBuffer1 ld de, wMonOrItemNameBuffer ld bc, MON_NAME_LENGTH call CopyBytes .loop ld hl, wPartyMon1Moves ld bc, PARTYMON_STRUCT_LENGTH ld a, [wCurPartyMon] call AddNTimes ld d, h ld e, l ld b, NUM_MOVES ; Get the first empty move slot. This routine also serves to ; determine whether the Pokemon learning the moves already has ; all four slots occupied, in which case one would need to be ; deleted. .next ld a, [hl] and a jr z, .learn inc hl dec b jr nz, .next ; If we're here, we enter the routine for forgetting a move ; to make room for the new move we're trying to learn. push de call ForgetMove pop de jp c, .cancel push hl push de ld [wNamedObjectIndexBuffer], a ld b, a ld a, [wBattleMode] and a jr z, .not_disabled ld a, [wDisabledMove] cp b jr nz, .not_disabled xor a ld [wDisabledMove], a ld [wPlayerDisableCount], a .not_disabled call GetMoveName ld hl, Text_1_2_and_Poof ; 1, 2 and… call PrintText pop de pop hl .learn ld a, [wPutativeTMHMMove] ld [hl], a ld bc, MON_PP - MON_MOVES add hl, bc push hl push de dec a ld hl, Moves + MOVE_PP ld bc, MOVE_LENGTH call AddNTimes ld a, BANK(Moves) call GetFarByte pop de pop hl ld [hl], a ld a, [wBattleMode] and a jp z, .learned ld a, [wCurPartyMon] ld b, a ld a, [wCurBattleMon] cp b jp nz, .learned ld a, [wPlayerSubStatus5] bit SUBSTATUS_TRANSFORMED, a jp nz, .learned ld h, d ld l, e ld de, wBattleMonMoves ld bc, NUM_MOVES call CopyBytes ld bc, wPartyMon1PP - (wPartyMon1Moves + NUM_MOVES) add hl, bc ld de, wBattleMonPP ld bc, NUM_MOVES call CopyBytes jp .learned .cancel ld hl, Text_StopLearning ; Stop learning <MOVE>? call PrintText call YesNoBox jp c, .loop ld hl, Text_DidNotLearn ; <MON> did not learn <MOVE>. call PrintText ld b, 0 ret .learned ld hl, Text_LearnedMove ; <MON> learned <MOVE>! call PrintText ld b, 1 ret ForgetMove: push hl ld hl, Text_TryingToLearn call PrintText call YesNoBox pop hl ret c ld bc, -NUM_MOVES add hl, bc push hl ld de, wListMoves_MoveIndicesBuffer ld bc, NUM_MOVES call CopyBytes pop hl .loop push hl ld hl, Text_ForgetWhich call PrintText hlcoord 5, 2 ld b, NUM_MOVES * 2 ld c, MOVE_NAME_LENGTH call Textbox hlcoord 5 + 2, 2 + 2 ld a, SCREEN_WIDTH * 2 ld [wBuffer1], a predef ListMoves ; w2DMenuData ld a, $4 ld [w2DMenuCursorInitY], a ld a, $6 ld [w2DMenuCursorInitX], a ld a, [wNumMoves] inc a ld [w2DMenuNumRows], a ld a, $1 ld [w2DMenuNumCols], a ld [wMenuCursorY], a ld [wMenuCursorX], a ld a, $3 ld [wMenuJoypadFilter], a ld a, $20 ld [w2DMenuFlags1], a xor a ld [w2DMenuFlags2], a ld a, $20 ld [w2DMenuCursorOffsets], a call StaticMenuJoypad push af call Call_LoadTempTileMapToTileMap pop af pop hl bit 1, a jr nz, .cancel push hl ld a, [wMenuCursorY] dec a ld c, a ld b, 0 add hl, bc ld a, [hl] push af push bc call IsHMMove pop bc pop de ld a, d jr c, .hmmove pop hl add hl, bc and a ret .hmmove ld hl, Text_CantForgetHM call PrintText pop hl jr .loop .cancel scf ret Text_LearnedMove: ; <MON> learned <MOVE>! text_far UnknownText_0x1c5660 text_end Text_ForgetWhich: ; Which move should be forgotten? text_far UnknownText_0x1c5678 text_end Text_StopLearning: ; Stop learning <MOVE>? text_far UnknownText_0x1c5699 text_end Text_DidNotLearn: ; <MON> did not learn <MOVE>. text_far UnknownText_0x1c56af text_end Text_TryingToLearn: ; <MON> is trying to learn <MOVE>. But <MON> can't learn more than ; four moves. Delete an older move to make room for <MOVE>? text_far UnknownText_0x1c56c9 text_end Text_1_2_and_Poof: text_far UnknownText_0x1c5740 ; 1, 2 and… text_asm push de ld de, SFX_SWITCH_POKEMON call PlaySFX pop de ld hl, .PoofForgot ret .PoofForgot: ; Poof! <MON> forgot <MOVE>. And… text_far UnknownText_0x1c574e text_end Text_CantForgetHM: ; HM moves can't be forgotten now. text_far UnknownText_0x1c5772 text_end