summaryrefslogtreecommitdiff
path: root/engine/pokemon/learn.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/pokemon/learn.asm')
-rw-r--r--engine/pokemon/learn.asm239
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