ref: af7d328d6613925111be3ff3dbc5165874b24bc7
dir: /engine/items/tmhm.asm/
TMHMPocket: ld a, $1 ldh [hInMenu], a call TMHM_PocketLoop ld a, $0 ldh [hInMenu], a ret nc call PlaceHollowCursor call WaitBGMap ld a, [wCurItem] dec a ld [wCurItemQuantity], a ld hl, wTMsHMs ld c, a ld b, 0 add hl, bc ld a, [hl] ld [wItemQuantity], a call .ConvertItemToTMHMNumber scf ret .ConvertItemToTMHMNumber: ld a, [wCurItem] ld c, a callfar GetNumberedTMHM ld a, c ld [wCurItem], a ret ConvertCurItemIntoCurTMHM: ld a, [wCurItem] ld c, a callfar GetTMHMNumber ld a, c ld [wTempTMHM], a ret GetTMHMItemMove: call ConvertCurItemIntoCurTMHM predef GetTMHMMove ret AskTeachTMHM: ld hl, wOptions ld a, [hl] push af res NO_TEXT_SCROLL, [hl] ld a, [wCurItem] cp TM01 jr c, .NotTMHM call GetTMHMItemMove ld a, [wTempTMHM] ld [wPutativeTMHMMove], a call GetMoveName call CopyName1 ld hl, BootedTMText ; Booted up a TM ld a, [wCurItem] cp HM01 jr c, .TM ld hl, BootedHMText ; Booted up an HM .TM: call PrintText ld hl, ContainedMoveText call PrintText call YesNoBox .NotTMHM: pop bc ld a, b ld [wOptions], a ret ChooseMonToLearnTMHM: ld hl, wStringBuffer2 ld de, wTMHMMoveNameBackup ld bc, MOVE_NAME_LENGTH - 1 call CopyBytes call ClearBGPalettes ChooseMonToLearnTMHM_NoRefresh: farcall LoadPartyMenuGFX farcall InitPartyMenuWithCancel farcall InitPartyMenuGFX ld a, PARTYMENUACTION_TEACH_TMHM ld [wPartyMenuActionText], a .loopback farcall WritePartyMenuTilemap farcall PrintPartyMenuText call WaitBGMap call SetPalettes call DelayFrame farcall PartyMenuSelect push af ld a, [wCurPartySpecies] cp EGG pop bc ; now contains the former contents of af jr z, .egg push bc ld hl, wTMHMMoveNameBackup ld de, wStringBuffer2 ld bc, MOVE_NAME_LENGTH - 1 call CopyBytes pop af ; now contains the original contents of af ret .egg push hl push de push bc push af ld de, SFX_WRONG call PlaySFX call WaitSFX pop af pop bc pop de pop hl jr .loopback TeachTMHM: predef CanLearnTMHMMove push bc ld a, [wCurPartyMon] ld hl, wPartyMonNicknames call GetNickname pop bc ld a, c and a jr nz, .compatible push de ld de, SFX_WRONG call PlaySFX pop de ld hl, TMHMNotCompatibleText call PrintText jr .nope .compatible callfar KnowsMove jr c, .nope predef LearnMove ld a, b and a jr z, .nope farcall StubbedTrainerRankings_TMsHMsTaught ld a, [wCurItem] call IsHM ret c ld c, HAPPINESS_LEARNMOVE callfar ChangeHappiness call ConsumeTM jr .learned_move .nope and a ret .didnt_use ; unreferenced ld a, 2 ld [wItemEffectSucceeded], a .learned_move scf ret BootedTMText: text_far _BootedTMText text_end BootedHMText: text_far _BootedHMText text_end ContainedMoveText: text_far _ContainedMoveText text_end TMHMNotCompatibleText: text_far _TMHMNotCompatibleText text_end TMHM_PocketLoop: xor a ldh [hBGMapMode], a call TMHM_DisplayPocketItems ld a, 2 ld [w2DMenuCursorInitY], a ld a, 7 ld [w2DMenuCursorInitX], a ld a, 1 ld [w2DMenuNumCols], a ld a, 5 sub d inc a cp 6 jr nz, .okay dec a .okay ld [w2DMenuNumRows], a ld a, $c ld [w2DMenuFlags1], a xor a ld [w2DMenuFlags2], a ld a, $20 ld [w2DMenuCursorOffsets], a ld a, A_BUTTON | B_BUTTON | D_UP | D_DOWN | D_LEFT | D_RIGHT ld [wMenuJoypadFilter], a ld a, [wTMHMPocketCursor] inc a ld [wMenuCursorY], a ld a, $1 ld [wMenuCursorX], a jr TMHM_ShowTMMoveDescription TMHM_JoypadLoop: call TMHM_DisplayPocketItems call StaticMenuJoypad ld b, a ld a, [wMenuCursorY] dec a ld [wTMHMPocketCursor], a xor a ldh [hBGMapMode], a ld a, [w2DMenuFlags2] bit 7, a jp nz, TMHM_ScrollPocket ld a, b ld [wMenuJoypad], a bit A_BUTTON_F, a jp nz, TMHM_ChooseTMorHM bit B_BUTTON_F, a jp nz, TMHM_ExitPack bit D_RIGHT_F, a jp nz, TMHM_ExitPocket bit D_LEFT_F, a jp nz, TMHM_ExitPocket TMHM_ShowTMMoveDescription: call TMHM_CheckHoveringOverCancel jp nc, TMHM_ExitPocket hlcoord 0, 12 ld b, 4 ld c, SCREEN_WIDTH - 2 call Textbox ld a, [wCurItem] cp NUM_TMS + NUM_HMS + 1 jr nc, TMHM_JoypadLoop ld [wTempTMHM], a predef GetTMHMMove ld a, [wTempTMHM] ld [wCurSpecies], a hlcoord 1, 14 call PrintMoveDescription jp TMHM_JoypadLoop TMHM_ChooseTMorHM: call TMHM_PlaySFX_ReadText2 call CountTMsHMs ; This stores the count to wTempTMHM. ld a, [wMenuCursorY] dec a ld b, a ld a, [wTMHMPocketScrollPosition] add b ld b, a ld a, [wTempTMHM] cp b jr z, _TMHM_ExitPack ; our cursor was hovering over CANCEL TMHM_CheckHoveringOverCancel: call TMHM_GetCurrentPocketPosition ld a, [wMenuCursorY] ld b, a .loop inc c ld a, c cp NUM_TMS + NUM_HMS + 1 jr nc, .okay ld a, [hli] and a jr z, .loop dec b jr nz, .loop ld a, c .okay ld [wCurItem], a cp -1 ret TMHM_ExitPack: call TMHM_PlaySFX_ReadText2 _TMHM_ExitPack: ld a, B_BUTTON ld [wMenuJoypad], a and a ret TMHM_ExitPocket: and a ret TMHM_ScrollPocket: ld a, b bit 7, a jr nz, .skip ld hl, wTMHMPocketScrollPosition ld a, [hl] and a jp z, TMHM_JoypadLoop dec [hl] call TMHM_DisplayPocketItems jp TMHM_ShowTMMoveDescription .skip call TMHM_GetCurrentPocketPosition ld b, 5 .loop inc c ld a, c cp NUM_TMS + NUM_HMS + 1 jp nc, TMHM_JoypadLoop ld a, [hli] and a jr z, .loop dec b jr nz, .loop ld hl, wTMHMPocketScrollPosition inc [hl] call TMHM_DisplayPocketItems jp TMHM_ShowTMMoveDescription TMHM_DisplayPocketItems: ld a, [wBattleType] cp BATTLETYPE_TUTORIAL jp z, Tutorial_TMHMPocket hlcoord 5, 2 lb bc, 10, 15 ld a, " " call ClearBox call TMHM_GetCurrentPocketPosition ld d, $5 .loop2 inc c ld a, c cp NUM_TMS + NUM_HMS + 1 jr nc, .NotTMHM ld a, [hli] and a jr z, .loop2 ld b, a ld a, c ld [wTempTMHM], a push hl push de push bc call TMHMPocket_GetCurrentLineCoord push hl ld a, [wTempTMHM] cp NUM_TMS + 1 jr nc, .HM ld de, wTempTMHM lb bc, PRINTNUM_LEADINGZEROS | 1, 2 call PrintNum jr .okay .HM: push af sub NUM_TMS ld [wTempTMHM], a ld [hl], "H" inc hl ld de, wTempTMHM lb bc, PRINTNUM_LEFTALIGN | 1, 2 call PrintNum pop af ld [wTempTMHM], a .okay predef GetTMHMMove ld a, [wNamedObjectIndex] ld [wPutativeTMHMMove], a call GetMoveName pop hl ld bc, 3 add hl, bc push hl call PlaceString pop hl pop bc ld a, c push bc cp NUM_TMS + 1 jr nc, .hm2 ld bc, SCREEN_WIDTH + 9 add hl, bc ld [hl], "×" inc hl ld a, "0" ; why are we doing this? pop bc push bc ld a, b ld [wTempTMHM], a ld de, wTempTMHM lb bc, 1, 2 call PrintNum .hm2 pop bc pop de pop hl dec d jr nz, .loop2 jr .done .NotTMHM: call TMHMPocket_GetCurrentLineCoord inc hl inc hl inc hl push de ld de, TMHM_CancelString call PlaceString pop de .done ret TMHMPocket_GetCurrentLineCoord: hlcoord 5, 0 ld bc, 2 * SCREEN_WIDTH ld a, 6 sub d ld e, a ; AddNTimes .loop add hl, bc dec e jr nz, .loop ret PlaceMoveNameAfterTMHMName: ; unreferenced ; Similar to a part of TMHM_DisplayPocketItems. pop hl ld bc, 3 add hl, bc predef GetTMHMMove ld a, [wTempTMHM] ld [wPutativeTMHMMove], a call GetMoveName push hl call PlaceString pop hl ret TMHM_CancelString: db "CANCEL@" TMHM_GetCurrentPocketPosition: ld hl, wTMsHMs ld a, [wTMHMPocketScrollPosition] ld b, a inc b ld c, 0 .loop inc c ld a, [hli] and a jr z, .loop dec b jr nz, .loop dec hl dec c ret Tutorial_TMHMPocket: hlcoord 9, 3 push de ld de, TMHM_CancelString call PlaceString pop de ret TMHM_PlaySFX_ReadText2: push de ld de, SFX_READ_TEXT_2 call PlaySFX pop de ret VerboseReceiveTMHM: ; unreferenced call ConvertCurItemIntoCurTMHM call .CheckHaveRoomForTMHM ld hl, .NoRoomTMHMText jr nc, .print ld hl, .ReceivedTMHMText .print jp PrintText .NoRoomTMHMText: text_far _NoRoomTMHMText text_end .ReceivedTMHMText: text_far _ReceivedTMHMText text_end .CheckHaveRoomForTMHM: ld a, [wTempTMHM] dec a ld hl, wTMsHMs ld b, 0 ld c, a add hl, bc ld a, [hl] inc a cp MAX_ITEM_STACK + 1 ret nc ld [hl], a ret ConsumeTM: call ConvertCurItemIntoCurTMHM ld a, [wTempTMHM] dec a ld hl, wTMsHMs ld b, 0 ld c, a add hl, bc ld a, [hl] and a ret z dec a ld [hl], a ret nz ld a, [wTMHMPocketScrollPosition] and a ret z dec a ld [wTMHMPocketScrollPosition], a ret CountTMsHMs: ld b, 0 ld c, NUM_TMS + NUM_HMS ld hl, wTMsHMs .loop ld a, [hli] and a jr z, .skip inc b .skip dec c jr nz, .loop ld a, b ld [wTempTMHM], a ret