pokecrystal/engine/pokemon/learn.asm

240 lines
3.6 KiB
NASM

LearnMove:
call LoadTilemapToTempTilemap
ld a, [wCurPartyMon]
ld hl, wPartyMonNicknames
call GetNickname
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 [wNamedObjectIndex], 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, StopLearningMoveText
call PrintText
call YesNoBox
jp c, .loop
ld hl, DidNotLearnMoveText
call PrintText
ld b, 0
ret
.learned
ld hl, LearnedMoveText
call PrintText
ld b, 1
ret
ForgetMove:
push hl
ld hl, AskForgetMoveText
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, MoveAskForgetText
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 [wListMovesLineSpacing], 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 SafeLoadTempTilemapToTilemap
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, MoveCantForgetHMText
call PrintText
pop hl
jr .loop
.cancel
scf
ret
LearnedMoveText:
text_far _LearnedMoveText
text_end
MoveAskForgetText:
text_far _MoveAskForgetText
text_end
StopLearningMoveText:
text_far _StopLearningMoveText
text_end
DidNotLearnMoveText:
text_far _DidNotLearnMoveText
text_end
AskForgetMoveText:
text_far _AskForgetMoveText
text_end
Text_1_2_and_Poof:
text_far Text_MoveForgetCount ; 1, 2 and…
text_asm
push de
ld de, SFX_SWITCH_POKEMON
call PlaySFX
pop de
ld hl, .MoveForgotText
ret
.MoveForgotText:
text_far _MoveForgotText
text_end
MoveCantForgetHMText:
text_far _MoveCantForgetHMText
text_end