diff options
Diffstat (limited to 'engine/pokemon/learn.asm')
-rw-r--r-- | engine/pokemon/learn.asm | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/engine/pokemon/learn.asm b/engine/pokemon/learn.asm new file mode 100644 index 00000000..2c66dcd5 --- /dev/null +++ b/engine/pokemon/learn.asm @@ -0,0 +1,239 @@ +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, 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 [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 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 |