summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/learn_move.s1954
-rw-r--r--baserom.ipsbin414160 -> 413412 bytes
-rw-r--r--data/battle_anim_effects_3.s2
-rw-r--r--data/learn_move.s28
-rw-r--r--data/strings.s18
-rw-r--r--graphics/learn_move/interface_sprites.pngbin0 -> 316 bytes
-rw-r--r--include/graphics.h6
-rw-r--r--include/strings.h11
-rw-r--r--ld_script.txt4
-rw-r--r--src/battle_tower.c8
-rw-r--r--src/learn_move.c842
-rw-r--r--sym_ewram.txt5
12 files changed, 881 insertions, 1997 deletions
diff --git a/asm/learn_move.s b/asm/learn_move.s
deleted file mode 100644
index 36b88bc20..000000000
--- a/asm/learn_move.s
+++ /dev/null
@@ -1,1954 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_80E4620
-sub_80E4620: @ 80E4620
- push {lr}
- bl LoadOam
- bl ProcessSpriteCopyRequests
- bl TransferPlttBuffer
- pop {r0}
- bx r0
- thumb_func_end sub_80E4620
-
- thumb_func_start DisplayMoveTutorMenu
-DisplayMoveTutorMenu: @ 80E4634
- push {lr}
- sub sp, 0x4
- bl ScriptContext2_Enable
- ldr r0, _080E465C @ =sub_80E4660
- movs r1, 0xA
- bl CreateTask
- movs r0, 0x1
- negs r0, r0
- movs r1, 0
- str r1, [sp]
- movs r2, 0
- movs r3, 0x10
- bl BeginNormalPaletteFade
- add sp, 0x4
- pop {r0}
- bx r0
- .align 2, 0
-_080E465C: .4byte sub_80E4660
- thumb_func_end DisplayMoveTutorMenu
-
- thumb_func_start sub_80E4660
-sub_80E4660: @ 80E4660
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r0, _080E468C @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _080E4684
- ldr r0, _080E4690 @ =sub_80E478C
- bl SetMainCallback2
- ldr r1, _080E4694 @ =gFieldCallback
- ldr r0, _080E4698 @ =FieldCallback_ReturnToEventScript2
- str r0, [r1]
- adds r0, r4, 0
- bl DestroyTask
-_080E4684:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080E468C: .4byte gPaletteFade
-_080E4690: .4byte sub_80E478C
-_080E4694: .4byte gFieldCallback
-_080E4698: .4byte FieldCallback_ReturnToEventScript2
- thumb_func_end sub_80E4660
-
- thumb_func_start sub_80E469C
-sub_80E469C: @ 80E469C
- push {r4,r5,lr}
- sub sp, 0xC
- movs r0, 0
- bl ResetBgsAndClearDma3BusyFlags
- ldr r1, _080E4774 @ =gUnknown_83FFA3C
- movs r0, 0
- movs r2, 0x2
- bl InitBgsFromTemplates
- bl ResetTempTileDataBuffers
- ldr r0, _080E4778 @ =gUnknown_83FFA44
- bl InitWindows
- lsls r0, 16
- cmp r0, 0
- beq _080E476C
- bl DeactivateAllTextPrinters
- movs r5, 0
-_080E46C6:
- lsls r4, r5, 24
- lsrs r4, 24
- adds r0, r4, 0
- bl ClearWindowTilemap
- adds r0, r4, 0
- movs r1, 0
- bl FillWindowPixelBuffer
- adds r5, 0x1
- cmp r5, 0x8
- bls _080E46C6
- movs r0, 0x7
- movs r1, 0x11
- bl FillWindowPixelBuffer
- movs r0, 0x1E
- str r0, [sp]
- movs r0, 0x14
- str r0, [sp, 0x4]
- movs r0, 0xF
- str r0, [sp, 0x8]
- movs r0, 0
- movs r1, 0
- movs r2, 0
- movs r3, 0
- bl FillBgTilemapBufferRect
- ldr r0, _080E477C @ =gUnknown_203AAB4
- ldr r1, [r0]
- movs r0, 0x99
- lsls r0, 2
- adds r1, r0
- movs r0, 0x1
- bl SetBgTilemapBuffer
- movs r0, 0
- movs r1, 0x1
- movs r2, 0xE0
- bl TextWindow_SetUserSelectedFrame
- movs r0, 0xD0
- movs r1, 0x1
- bl sub_8107D38
- ldr r0, _080E4780 @ =gUnknown_8E97DDC
- movs r1, 0
- movs r2, 0x20
- bl LoadPalette
- ldr r1, _080E4784 @ =gUnknown_8E97DFC
- movs r0, 0
- str r0, [sp]
- movs r0, 0x1
- movs r2, 0
- movs r3, 0
- bl DecompressAndLoadBgGfxUsingHeap
- ldr r1, _080E4788 @ =gUnknown_8E97EC4
- movs r0, 0x1
- movs r2, 0
- movs r3, 0
- bl CopyToBgTilemapBuffer
- movs r0, 0x1
- bl CopyBgTilemapBufferToVram
- movs r0, 0x12
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x10
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x16
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x14
- movs r1, 0
- bl SetGpuReg
-_080E476C:
- add sp, 0xC
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080E4774: .4byte gUnknown_83FFA3C
-_080E4778: .4byte gUnknown_83FFA44
-_080E477C: .4byte gUnknown_203AAB4
-_080E4780: .4byte gUnknown_8E97DDC
-_080E4784: .4byte gUnknown_8E97DFC
-_080E4788: .4byte gUnknown_8E97EC4
- thumb_func_end sub_80E469C
-
- thumb_func_start sub_80E478C
-sub_80E478C: @ 80E478C
- push {r4,lr}
- movs r0, 0
- movs r1, 0
- bl SetGpuReg
- bl ResetSpriteData
- bl FreeAllSpritePalettes
- bl ResetTasks
- ldr r4, _080E47EC @ =gUnknown_203AAB4
- ldr r0, _080E47F0 @ =0x00000a6c
- bl AllocZeroed
- str r0, [r4]
- bl sub_80E4F54
- ldr r0, [r4]
- ldr r1, _080E47F4 @ =gSpecialVar_0x8004
- ldrh r1, [r1]
- movs r2, 0x98
- lsls r2, 2
- adds r0, r2
- strb r1, [r0]
- bl sub_80E50CC
- ldr r0, _080E47F8 @ =sub_80E4620
- bl SetVBlankCallback
- bl sub_80E469C
- bl sub_80E5004
- bl RunTasks
- bl AnimateSprites
- bl BuildOamBuffer
- bl UpdatePaletteFade
- ldr r0, _080E47FC @ =sub_80E4870
- bl SetMainCallback2
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080E47EC: .4byte gUnknown_203AAB4
-_080E47F0: .4byte 0x00000a6c
-_080E47F4: .4byte gSpecialVar_0x8004
-_080E47F8: .4byte sub_80E4620
-_080E47FC: .4byte sub_80E4870
- thumb_func_end sub_80E478C
-
- thumb_func_start sub_80E4800
-sub_80E4800: @ 80E4800
- push {lr}
- movs r0, 0
- movs r1, 0
- bl SetGpuReg
- bl ResetSpriteData
- bl FreeAllSpritePalettes
- bl ResetTasks
- bl sub_80E50CC
- ldr r0, _080E485C @ =gUnknown_203AAB4
- ldr r0, [r0]
- ldr r1, _080E4860 @ =gSpecialVar_0x8005
- ldrh r1, [r1]
- ldr r2, _080E4864 @ =0x00000261
- adds r0, r2
- strb r1, [r0]
- ldr r0, _080E4868 @ =sub_80E4620
- bl SetVBlankCallback
- bl sub_80E469C
- bl sub_80E5004
- movs r0, 0
- movs r1, 0
- movs r2, 0x2
- bl FillPalette
- bl RunTasks
- bl AnimateSprites
- bl BuildOamBuffer
- bl UpdatePaletteFade
- ldr r0, _080E486C @ =sub_80E4870
- bl SetMainCallback2
- pop {r0}
- bx r0
- .align 2, 0
-_080E485C: .4byte gUnknown_203AAB4
-_080E4860: .4byte gSpecialVar_0x8005
-_080E4864: .4byte 0x00000261
-_080E4868: .4byte sub_80E4620
-_080E486C: .4byte sub_80E4870
- thumb_func_end sub_80E4800
-
- thumb_func_start sub_80E4870
-sub_80E4870: @ 80E4870
- push {r4,lr}
- movs r0, 0x7
- bl IsTextPrinterActive
- lsls r0, 16
- cmp r0, 0
- bne _080E4882
- bl sub_80E48F4
-_080E4882:
- ldr r4, _080E48B8 @ =gUnknown_203AAB4
- ldr r0, [r4]
- ldr r1, _080E48BC @ =0x0000025f
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0
- beq _080E489E
- bl sub_80E54C0
- ldr r0, [r4]
- ldr r1, _080E48BC @ =0x0000025f
- adds r0, r1
- movs r1, 0
- strb r1, [r0]
-_080E489E:
- bl RunTasks
- bl RunTextPrinters
- bl AnimateSprites
- bl BuildOamBuffer
- bl UpdatePaletteFade
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080E48B8: .4byte gUnknown_203AAB4
-_080E48BC: .4byte 0x0000025f
- thumb_func_end sub_80E4870
-
- thumb_func_start sub_80E48C0
-sub_80E48C0: @ 80E48C0
- push {r4,lr}
- sub sp, 0x8
- adds r1, r0, 0
- ldr r4, _080E48F0 @ =gStringVar4
- adds r0, r4, 0
- bl StringExpandPlaceholders
- bl GetTextSpeedSetting
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp]
- movs r0, 0x2
- str r0, [sp, 0x4]
- movs r0, 0x7
- adds r1, r4, 0
- movs r2, 0
- movs r3, 0x2
- bl sub_80E559C
- add sp, 0x8
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080E48F0: .4byte gStringVar4
- thumb_func_end sub_80E48C0
-
- thumb_func_start sub_80E48F4
-sub_80E48F4: @ 80E48F4
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- sub sp, 0xC
- ldr r1, _080E4918 @ =gUnknown_203AAB4
- ldr r0, [r1]
- ldrb r0, [r0]
- adds r7, r1, 0
- cmp r0, 0x21
- bls _080E490C
- b _080E4EDA
-_080E490C:
- lsls r0, 2
- ldr r1, _080E491C @ =_080E4920
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_080E4918: .4byte gUnknown_203AAB4
-_080E491C: .4byte _080E4920
- .align 2, 0
-_080E4920:
- .4byte _080E49A8
- .4byte _080E49F4
- .4byte _080E4A0C
- .4byte _080E4A14
- .4byte _080E4A38
- .4byte _080E4EDA
- .4byte _080E4EDA
- .4byte _080E4EDA
- .4byte _080E4A3E
- .4byte _080E4A68
- .4byte _080E4EDA
- .4byte _080E4EDA
- .4byte _080E4AF4
- .4byte _080E4B20
- .4byte _080E4CFA
- .4byte _080E4D18
- .4byte _080E4B58
- .4byte _080E4B70
- .4byte _080E4B98
- .4byte _080E4C5A
- .4byte _080E4C70
- .4byte _080E4CE4
- .4byte _080E4CE8
- .4byte _080E4EDA
- .4byte _080E4BDC
- .4byte _080E4BF4
- .4byte _080E4C1C
- .4byte _080E4C54
- .4byte _080E4D48
- .4byte _080E4D8C
- .4byte _080E4E70
- .4byte _080E4E90
- .4byte _080E4EA8
- .4byte _080E4EC0
-_080E49A8:
- movs r0, 0x1
- negs r0, r0
- movs r1, 0
- str r1, [sp]
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
- movs r0, 0
- bl ShowBg
- movs r0, 0x1
- bl ShowBg
- bl sub_80E5444
- ldr r4, _080E49EC @ =gUnknown_203AAB4
- ldr r1, [r4]
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
- bl sub_80E4EF0
- movs r0, 0
- bl sub_80E4F0C
- bl sub_80E5300
- ldr r0, [r4]
- ldr r1, _080E49F0 @ =0x0000025f
- adds r0, r1
- movs r1, 0x1
- strb r1, [r0]
- b _080E4EDA
- .align 2, 0
-_080E49EC: .4byte gUnknown_203AAB4
-_080E49F0: .4byte 0x0000025f
-_080E49F4:
- ldr r0, _080E4A08 @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- beq _080E4A02
- b _080E4EDA
-_080E4A02:
- ldr r1, [r7]
- movs r0, 0x4
- b _080E4ED8
- .align 2, 0
-_080E4A08: .4byte gPaletteFade
-_080E4A0C:
- ldr r1, [r7]
- ldrb r0, [r1]
- adds r0, 0x1
- b _080E4ED8
-_080E4A14:
- movs r0, 0
- bl sub_80E4F0C
- ldr r2, _080E4A30 @ =gUnknown_203AAB4
- ldr r0, [r2]
- ldr r3, _080E4A34 @ =0x0000025f
- adds r0, r3
- movs r1, 0x1
- strb r1, [r0]
- ldr r1, [r2]
- ldrb r0, [r1]
- adds r0, 0x1
- b _080E4ED8
- .align 2, 0
-_080E4A30: .4byte gUnknown_203AAB4
-_080E4A34: .4byte 0x0000025f
-_080E4A38:
- bl sub_80E5204
- b _080E4EDA
-_080E4A3E:
- ldr r0, _080E4A60 @ =gUnknown_83FFA8C
- movs r1, 0x1
- str r1, [sp]
- movs r1, 0xE
- str r1, [sp, 0x4]
- movs r1, 0
- str r1, [sp, 0x8]
- movs r1, 0x3
- movs r2, 0
- movs r3, 0x2
- bl CreateYesNoMenu
- ldr r0, _080E4A64 @ =gUnknown_203AAB4
- ldr r1, [r0]
- ldrb r0, [r1]
- adds r0, 0x1
- b _080E4ED8
- .align 2, 0
-_080E4A60: .4byte gUnknown_83FFA8C
-_080E4A64: .4byte gUnknown_203AAB4
-_080E4A68:
- bl sub_80E5574
- lsls r0, 24
- asrs r1, r0, 24
- cmp r1, 0
- beq _080E4A88
- cmp r1, 0
- bgt _080E4A82
- movs r0, 0x1
- negs r0, r0
- cmp r1, r0
- beq _080E4AE6
- b _080E4EDA
-_080E4A82:
- cmp r1, 0x1
- beq _080E4AE6
- b _080E4EDA
-_080E4A88:
- ldr r4, _080E4AC8 @ =gUnknown_203AAB4
- ldr r2, [r4]
- movs r6, 0x98
- lsls r6, 2
- adds r0, r2, r6
- ldrb r1, [r0]
- movs r0, 0x64
- muls r0, r1
- ldr r1, _080E4ACC @ =gPlayerParty
- adds r0, r1
- ldr r3, _080E4AD0 @ =0x00000a67
- adds r1, r2, r3
- ldrb r1, [r1]
- lsls r1, 1
- adds r2, 0xE8
- adds r2, r1
- ldrh r1, [r2]
- bl GiveMoveToMon
- lsls r0, 16
- ldr r1, _080E4AD4 @ =0xffff0000
- cmp r0, r1
- beq _080E4AE0
- ldr r0, _080E4AD8 @ =gUnknown_841E405
- bl sub_80E48C0
- ldr r1, _080E4ADC @ =gSpecialVar_0x8004
- movs r0, 0x1
- strh r0, [r1]
- ldr r1, [r4]
- movs r0, 0x1F
- b _080E4ED8
- .align 2, 0
-_080E4AC8: .4byte gUnknown_203AAB4
-_080E4ACC: .4byte gPlayerParty
-_080E4AD0: .4byte 0x00000a67
-_080E4AD4: .4byte 0xffff0000
-_080E4AD8: .4byte gUnknown_841E405
-_080E4ADC: .4byte gSpecialVar_0x8004
-_080E4AE0:
- ldr r1, [r4]
- movs r0, 0x10
- b _080E4ED8
-_080E4AE6:
- ldr r0, _080E4AF0 @ =gUnknown_203AAB4
- ldr r1, [r0]
- movs r0, 0x3
- b _080E4ED8
- .align 2, 0
-_080E4AF0: .4byte gUnknown_203AAB4
-_080E4AF4:
- ldr r0, _080E4B18 @ =gUnknown_83FFA8C
- movs r1, 0x1
- str r1, [sp]
- movs r1, 0xE
- str r1, [sp, 0x4]
- movs r1, 0
- str r1, [sp, 0x8]
- movs r1, 0x3
- movs r2, 0
- movs r3, 0x2
- bl CreateYesNoMenu
- ldr r0, _080E4B1C @ =gUnknown_203AAB4
- ldr r1, [r0]
- ldrb r0, [r1]
- adds r0, 0x1
- b _080E4ED8
- .align 2, 0
-_080E4B18: .4byte gUnknown_83FFA8C
-_080E4B1C: .4byte gUnknown_203AAB4
-_080E4B20:
- bl sub_80E5574
- lsls r0, 24
- asrs r1, r0, 24
- cmp r1, 0
- beq _080E4B40
- cmp r1, 0
- bgt _080E4B3A
- movs r0, 0x1
- negs r0, r0
- cmp r1, r0
- beq _080E4B4C
- b _080E4EDA
-_080E4B3A:
- cmp r1, 0x1
- beq _080E4B4C
- b _080E4EDA
-_080E4B40:
- ldr r0, _080E4B48 @ =gSpecialVar_0x8004
- strh r1, [r0]
- b _080E4ED2
- .align 2, 0
-_080E4B48: .4byte gSpecialVar_0x8004
-_080E4B4C:
- ldr r0, _080E4B54 @ =gUnknown_203AAB4
- ldr r1, [r0]
- movs r0, 0x3
- b _080E4ED8
- .align 2, 0
-_080E4B54: .4byte gUnknown_203AAB4
-_080E4B58:
- ldr r0, _080E4B68 @ =gUnknown_841E414
- bl sub_80E48C0
- ldr r0, _080E4B6C @ =gUnknown_203AAB4
- ldr r1, [r0]
- ldrb r0, [r1]
- adds r0, 0x1
- b _080E4ED8
- .align 2, 0
-_080E4B68: .4byte gUnknown_841E414
-_080E4B6C: .4byte gUnknown_203AAB4
-_080E4B70:
- ldr r0, _080E4B90 @ =gUnknown_83FFA8C
- movs r1, 0x1
- str r1, [sp]
- movs r1, 0xE
- str r1, [sp, 0x4]
- movs r1, 0
- str r1, [sp, 0x8]
- movs r1, 0x3
- movs r2, 0
- movs r3, 0x2
- bl CreateYesNoMenu
- ldr r0, _080E4B94 @ =gUnknown_203AAB4
- ldr r1, [r0]
- movs r0, 0x12
- b _080E4ED8
- .align 2, 0
-_080E4B90: .4byte gUnknown_83FFA8C
-_080E4B94: .4byte gUnknown_203AAB4
-_080E4B98:
- bl sub_80E5574
- lsls r0, 24
- asrs r1, r0, 24
- cmp r1, 0
- beq _080E4BB8
- cmp r1, 0
- bgt _080E4BB2
- movs r0, 0x1
- negs r0, r0
- cmp r1, r0
- beq _080E4BD0
- b _080E4EDA
-_080E4BB2:
- cmp r1, 0x1
- beq _080E4BD0
- b _080E4EDA
-_080E4BB8:
- ldr r0, _080E4BC8 @ =gUnknown_841E50C
- bl sub_80E48C0
- ldr r0, _080E4BCC @ =gUnknown_203AAB4
- ldr r1, [r0]
- movs r0, 0x13
- b _080E4ED8
- .align 2, 0
-_080E4BC8: .4byte gUnknown_841E50C
-_080E4BCC: .4byte gUnknown_203AAB4
-_080E4BD0:
- ldr r0, _080E4BD8 @ =gUnknown_203AAB4
- ldr r1, [r0]
- movs r0, 0x18
- b _080E4ED8
- .align 2, 0
-_080E4BD8: .4byte gUnknown_203AAB4
-_080E4BDC:
- ldr r0, _080E4BEC @ =gUnknown_841E481
- bl sub_80E48C0
- ldr r0, _080E4BF0 @ =gUnknown_203AAB4
- ldr r1, [r0]
- ldrb r0, [r1]
- adds r0, 0x1
- b _080E4ED8
- .align 2, 0
-_080E4BEC: .4byte gUnknown_841E481
-_080E4BF0: .4byte gUnknown_203AAB4
-_080E4BF4:
- ldr r0, _080E4C14 @ =gUnknown_83FFA8C
- movs r1, 0x1
- str r1, [sp]
- movs r1, 0xE
- str r1, [sp, 0x4]
- movs r1, 0
- str r1, [sp, 0x8]
- movs r1, 0x3
- movs r2, 0
- movs r3, 0x2
- bl CreateYesNoMenu
- ldr r0, _080E4C18 @ =gUnknown_203AAB4
- ldr r1, [r0]
- movs r0, 0x1A
- b _080E4ED8
- .align 2, 0
-_080E4C14: .4byte gUnknown_83FFA8C
-_080E4C18: .4byte gUnknown_203AAB4
-_080E4C1C:
- bl sub_80E5574
- lsls r0, 24
- asrs r1, r0, 24
- cmp r1, 0
- beq _080E4C3C
- cmp r1, 0
- bgt _080E4C36
- movs r0, 0x1
- negs r0, r0
- cmp r1, r0
- beq _080E4C48
- b _080E4EDA
-_080E4C36:
- cmp r1, 0x1
- beq _080E4C48
- b _080E4EDA
-_080E4C3C:
- ldr r0, _080E4C44 @ =gUnknown_203AAB4
- ldr r1, [r0]
- movs r0, 0x1B
- b _080E4ED8
- .align 2, 0
-_080E4C44: .4byte gUnknown_203AAB4
-_080E4C48:
- ldr r0, _080E4C50 @ =gUnknown_203AAB4
- ldr r1, [r0]
- movs r0, 0x10
- b _080E4ED8
- .align 2, 0
-_080E4C50: .4byte gUnknown_203AAB4
-_080E4C54:
- ldr r1, [r7]
- movs r0, 0x3
- b _080E4ED8
-_080E4C5A:
- ldr r1, [r7]
- movs r2, 0
- movs r0, 0x14
- strb r0, [r1]
- subs r0, 0x15
- str r2, [sp]
- movs r1, 0
- movs r3, 0x10
- bl BeginNormalPaletteFade
- b _080E4EDA
-_080E4C70:
- ldr r0, _080E4CC8 @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- beq _080E4C7E
- b _080E4EDA
-_080E4C7E:
- ldr r2, [r7]
- ldr r6, _080E4CCC @ =0x00000263
- adds r0, r2, r6
- ldrb r0, [r0]
- ldr r3, _080E4CD0 @ =0x00000a68
- adds r1, r2, r3
- ldr r6, _080E4CD4 @ =0x00000a6a
- adds r2, r6
- bl ListMenuGetScrollAndRow
- bl FreeAllWindowBuffers
- ldr r0, _080E4CD8 @ =gPlayerParty
- ldr r5, [r7]
- movs r2, 0x98
- lsls r2, 2
- adds r1, r5, r2
- ldrb r1, [r1]
- ldr r2, _080E4CDC @ =gPlayerPartyCount
- ldrb r2, [r2]
- subs r2, 0x1
- lsls r2, 24
- lsrs r2, 24
- ldr r3, _080E4CE0 @ =sub_80E4800
- subs r6, 0x3
- adds r4, r5, r6
- ldrb r4, [r4]
- lsls r4, 1
- adds r5, 0xE8
- adds r5, r4
- ldrh r4, [r5]
- str r4, [sp]
- bl ShowSelectMovePokemonSummaryScreen
- ldr r1, [r7]
- movs r0, 0x1C
- b _080E4ED8
- .align 2, 0
-_080E4CC8: .4byte gPaletteFade
-_080E4CCC: .4byte 0x00000263
-_080E4CD0: .4byte 0x00000a68
-_080E4CD4: .4byte 0x00000a6a
-_080E4CD8: .4byte gPlayerParty
-_080E4CDC: .4byte gPlayerPartyCount
-_080E4CE0: .4byte sub_80E4800
-_080E4CE4:
- ldr r1, [r7]
- b _080E4ED6
-_080E4CE8:
- movs r0, 0x1
- negs r0, r0
- movs r1, 0
- str r1, [sp]
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
- b _080E4EDA
-_080E4CFA:
- movs r0, 0x1
- negs r0, r0
- movs r1, 0
- str r1, [sp]
- movs r2, 0
- movs r3, 0x10
- bl BeginNormalPaletteFade
- ldr r0, _080E4D14 @ =gUnknown_203AAB4
- ldr r1, [r0]
- ldrb r0, [r1]
- adds r0, 0x1
- b _080E4ED8
- .align 2, 0
-_080E4D14: .4byte gUnknown_203AAB4
-_080E4D18:
- ldr r0, _080E4D3C @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- beq _080E4D26
- b _080E4EDA
-_080E4D26:
- bl FreeAllWindowBuffers
- ldr r0, _080E4D40 @ =gUnknown_203AAB4
- ldr r0, [r0]
- bl Free
- ldr r0, _080E4D44 @ =CB2_ReturnToField
- bl SetMainCallback2
- b _080E4EDA
- .align 2, 0
-_080E4D3C: .4byte gPaletteFade
-_080E4D40: .4byte gUnknown_203AAB4
-_080E4D44: .4byte CB2_ReturnToField
-_080E4D48:
- movs r0, 0x1
- negs r0, r0
- movs r1, 0
- str r1, [sp]
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
- movs r0, 0
- bl ShowBg
- movs r0, 0x1
- bl ShowBg
- ldr r0, _080E4D88 @ =gUnknown_203AAB4
- ldr r1, [r0]
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
- bl sub_80E5444
- bl sub_80E4EF0
- bl sub_80E5300
- movs r0, 0x1
- bl sub_80E4F0C
- bl sub_80E54C0
- b _080E4EDA
- .align 2, 0
-_080E4D88: .4byte gUnknown_203AAB4
-_080E4D8C:
- ldr r0, _080E4DAC @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- beq _080E4D9A
- b _080E4EDA
-_080E4D9A:
- ldr r1, [r7]
- ldr r0, _080E4DB0 @ =0x00000261
- adds r2, r1, r0
- ldrb r0, [r2]
- cmp r0, 0x4
- bne _080E4DB4
- movs r0, 0x18
- b _080E4ED8
- .align 2, 0
-_080E4DAC: .4byte gPaletteFade
-_080E4DB0: .4byte 0x00000261
-_080E4DB4:
- movs r4, 0x98
- lsls r4, 2
- adds r0, r1, r4
- ldrb r0, [r0]
- movs r6, 0x64
- muls r0, r6
- ldr r5, _080E4E50 @ =gPlayerParty
- adds r0, r5
- ldrb r1, [r2]
- adds r1, 0xD
- bl GetMonData
- lsls r0, 16
- lsrs r0, 16
- ldr r2, _080E4E54 @ =gStringVar3
- movs r1, 0xD
- mov r9, r1
- mov r1, r9
- muls r1, r0
- ldr r3, _080E4E58 @ =gMoveNames
- mov r8, r3
- add r1, r8
- adds r0, r2, 0
- bl StringCopy
- ldr r1, [r7]
- adds r0, r1, r4
- ldrb r0, [r0]
- muls r0, r6
- adds r0, r5
- ldr r2, _080E4E5C @ =0x00000261
- adds r1, r2
- ldrb r1, [r1]
- bl RemoveMonPPBonus
- ldr r3, [r7]
- adds r4, r3, r4
- ldrb r0, [r4]
- muls r0, r6
- adds r0, r5
- ldr r4, _080E4E60 @ =0x00000a67
- adds r1, r3, r4
- ldrb r2, [r1]
- lsls r2, 1
- adds r1, r3, 0
- adds r1, 0xE8
- adds r1, r2
- ldrh r1, [r1]
- ldr r6, _080E4E5C @ =0x00000261
- adds r3, r6
- ldrb r2, [r3]
- bl SetMonMoveSlot
- ldr r0, _080E4E64 @ =gStringVar2
- ldr r2, [r7]
- adds r4, r2, r4
- ldrb r1, [r4]
- lsls r1, 1
- adds r2, 0xE8
- adds r2, r1
- ldrh r1, [r2]
- mov r2, r9
- muls r2, r1
- adds r1, r2, 0
- add r1, r8
- bl StringCopy
- ldr r0, _080E4E68 @ =gUnknown_841E493
- bl sub_80E48C0
- ldr r1, [r7]
- movs r0, 0x1E
- strb r0, [r1]
- ldr r1, _080E4E6C @ =gSpecialVar_0x8004
- movs r0, 0x1
- strh r0, [r1]
- b _080E4EDA
- .align 2, 0
-_080E4E50: .4byte gPlayerParty
-_080E4E54: .4byte gStringVar3
-_080E4E58: .4byte gMoveNames
-_080E4E5C: .4byte 0x00000261
-_080E4E60: .4byte 0x00000a67
-_080E4E64: .4byte gStringVar2
-_080E4E68: .4byte gUnknown_841E493
-_080E4E6C: .4byte gSpecialVar_0x8004
-_080E4E70:
- ldr r0, _080E4E88 @ =gUnknown_841E4C0
- bl sub_80E48C0
- ldr r0, _080E4E8C @ =gUnknown_203AAB4
- ldr r1, [r0]
- movs r0, 0x1F
- strb r0, [r1]
- adds r0, 0xE2
- bl PlayFanfare
- b _080E4EDA
- .align 2, 0
-_080E4E88: .4byte gUnknown_841E4C0
-_080E4E8C: .4byte gUnknown_203AAB4
-_080E4E90:
- ldr r0, _080E4EA0 @ =0x00000101
- bl PlayFanfare
- ldr r0, _080E4EA4 @ =gUnknown_203AAB4
- ldr r1, [r0]
- movs r0, 0x20
- b _080E4ED8
- .align 2, 0
-_080E4EA0: .4byte 0x00000101
-_080E4EA4: .4byte gUnknown_203AAB4
-_080E4EA8:
- bl IsFanfareTaskInactive
- lsls r0, 24
- cmp r0, 0
- beq _080E4EDA
- ldr r0, _080E4EBC @ =gUnknown_203AAB4
- ldr r1, [r0]
- movs r0, 0x21
- b _080E4ED8
- .align 2, 0
-_080E4EBC: .4byte gUnknown_203AAB4
-_080E4EC0:
- ldr r0, _080E4EE8 @ =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- beq _080E4EDA
- movs r0, 0x5
- bl PlaySE
-_080E4ED2:
- ldr r0, _080E4EEC @ =gUnknown_203AAB4
- ldr r1, [r0]
-_080E4ED6:
- movs r0, 0xE
-_080E4ED8:
- strb r0, [r1]
-_080E4EDA:
- add sp, 0xC
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080E4EE8: .4byte gMain
-_080E4EEC: .4byte gUnknown_203AAB4
- thumb_func_end sub_80E48F4
-
- thumb_func_start sub_80E4EF0
-sub_80E4EF0: @ 80E4EF0
- push {r4,lr}
- movs r4, 0x6
-_080E4EF4:
- lsls r0, r4, 24
- lsrs r0, 24
- movs r1, 0x1
- movs r2, 0xE
- bl DrawTextBorderOuter
- adds r4, 0x1
- cmp r4, 0x7
- ble _080E4EF4
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_80E4EF0
-
- thumb_func_start sub_80E4F0C
-sub_80E4F0C: @ 80E4F0C
- push {r4,r5,lr}
- sub sp, 0x8
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0
- bne _080E4F42
- ldr r4, _080E4F4C @ =gStringVar4
- ldr r1, _080E4F50 @ =gUnknown_841E3E3
- adds r0, r4, 0
- bl StringExpandPlaceholders
- str r5, [sp]
- movs r0, 0x2
- str r0, [sp, 0x4]
- movs r0, 0x7
- adds r1, r4, 0
- movs r2, 0
- movs r3, 0x2
- bl sub_80E559C
- movs r0, 0x7
- bl PutWindowTilemap
- movs r0, 0x7
- movs r1, 0x3
- bl CopyWindowToVram
-_080E4F42:
- add sp, 0x8
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080E4F4C: .4byte gStringVar4
-_080E4F50: .4byte gUnknown_841E3E3
- thumb_func_end sub_80E4F0C
-
- thumb_func_start sub_80E4F54
-sub_80E4F54: @ 80E4F54
- push {r4,lr}
- ldr r2, _080E4FA4 @ =gUnknown_203AAB4
- ldr r0, [r2]
- movs r1, 0
- strb r1, [r0]
- ldr r0, [r2]
- strb r1, [r0, 0x2]
- ldr r0, [r2]
- strb r1, [r0, 0x19]
- ldr r0, [r2]
- strb r1, [r0, 0x18]
- ldr r0, [r2]
- strb r1, [r0, 0x1C]
- ldr r0, [r2]
- strb r1, [r0, 0x1A]
- ldr r0, [r2]
- strb r1, [r0, 0x1B]
- ldr r0, [r2]
- strb r1, [r0, 0x1D]
- ldr r0, [r2]
- strb r1, [r0, 0x1E]
- ldr r0, [r2]
- ldr r3, _080E4FA8 @ =0x0000025f
- adds r0, r3
- strb r1, [r0]
- movs r3, 0
- adds r4, r2, 0
- movs r2, 0
-_080E4F8C:
- ldr r0, [r4]
- lsls r1, r3, 1
- adds r0, 0xE8
- adds r0, r1
- strh r2, [r0]
- adds r3, 0x1
- cmp r3, 0x13
- ble _080E4F8C
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080E4FA4: .4byte gUnknown_203AAB4
-_080E4FA8: .4byte 0x0000025f
- thumb_func_end sub_80E4F54
-
- thumb_func_start sub_80E4FAC
-sub_80E4FAC: @ 80E4FAC
- push {r4,lr}
- adds r4, r0, 0
- movs r1, 0x30
- ldrsh r0, [r4, r1]
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 1
- movs r0, 0xFF
- ands r1, r0
- movs r2, 0x2E
- ldrsh r0, [r4, r2]
- cmp r0, 0x1
- beq _080E4FD0
- cmp r0, 0x1
- ble _080E4FF6
- cmp r0, 0x2
- beq _080E4FE4
- b _080E4FF6
-_080E4FD0:
- adds r0, r1, 0
- movs r1, 0x3
- bl Sin
- ldrh r1, [r4, 0x32]
- adds r2, r0, 0
- muls r2, r1
- adds r0, r2, 0
- strh r0, [r4, 0x24]
- b _080E4FF6
-_080E4FE4:
- adds r0, r1, 0
- movs r1, 0x1
- bl Sin
- ldrh r1, [r4, 0x32]
- adds r2, r0, 0
- muls r2, r1
- adds r0, r2, 0
- strh r0, [r4, 0x26]
-_080E4FF6:
- ldrh r0, [r4, 0x30]
- adds r0, 0x1
- strh r0, [r4, 0x30]
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_80E4FAC
-
- thumb_func_start sub_80E5004
-sub_80E5004: @ 80E5004
- push {r4-r6,lr}
- mov r6, r8
- push {r6}
- ldr r0, _080E50B4 @ =gUnknown_83FF9F4
- bl LoadSpriteSheet
- ldr r0, _080E50B8 @ =gUnknown_83FF9FC
- bl LoadSpritePalette
- ldr r0, _080E50BC @ =gUnknown_83FFA24
- mov r8, r0
- movs r1, 0xC8
- movs r2, 0x4
- movs r3, 0
- bl CreateSprite
- ldr r5, _080E50C0 @ =gUnknown_203AAB4
- ldr r1, [r5]
- strb r0, [r1, 0x3]
- ldr r0, [r5]
- ldrb r1, [r0, 0x3]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r4, _080E50C4 @ =gSprites
- adds r0, r4
- movs r1, 0x1
- bl StartSpriteAnim
- ldr r2, [r5]
- ldrb r1, [r2, 0x3]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r4
- movs r6, 0x2
- strh r6, [r0, 0x2E]
- ldrb r1, [r2, 0x3]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r4
- ldr r1, _080E50C8 @ =0x0000ffff
- strh r1, [r0, 0x32]
- mov r0, r8
- movs r1, 0xC8
- movs r2, 0x6C
- movs r3, 0
- bl CreateSprite
- ldr r1, [r5]
- strb r0, [r1, 0x3]
- ldr r2, [r5]
- ldrb r1, [r2, 0x3]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r4
- strh r6, [r0, 0x2E]
- ldrb r1, [r2, 0x3]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r4
- movs r1, 0x1
- strh r1, [r0, 0x32]
- movs r2, 0
- movs r3, 0x4
-_080E508C:
- ldr r0, [r5]
- adds r0, 0x3
- adds r0, r2
- ldrb r1, [r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r4
- adds r0, 0x3E
- ldrb r1, [r0]
- orrs r1, r3
- strb r1, [r0]
- adds r2, 0x1
- cmp r2, 0x1
- ble _080E508C
- pop {r3}
- mov r8, r3
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080E50B4: .4byte gUnknown_83FF9F4
-_080E50B8: .4byte gUnknown_83FF9FC
-_080E50BC: .4byte gUnknown_83FFA24
-_080E50C0: .4byte gUnknown_203AAB4
-_080E50C4: .4byte gSprites
-_080E50C8: .4byte 0x0000ffff
- thumb_func_end sub_80E5004
-
- thumb_func_start sub_80E50CC
-sub_80E50CC: @ 80E50CC
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0xC
- ldr r7, _080E51E8 @ =gUnknown_203AAB4
- ldr r1, [r7]
- movs r4, 0x98
- lsls r4, 2
- adds r0, r1, r4
- ldrb r0, [r0]
- movs r6, 0x64
- muls r0, r6
- ldr r5, _080E51EC @ =gPlayerParty
- adds r0, r5
- adds r1, 0xE8
- bl GetMoveRelearnerMoves
- ldr r1, [r7]
- strb r0, [r1, 0x1A]
- ldr r1, [r7]
- adds r4, r1, r4
- ldrb r0, [r4]
- muls r0, r6
- adds r0, r5
- adds r1, 0xE8
- bl GetMoveRelearnerMoves
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- movs r5, 0
- ldr r0, [r7]
- ldrb r0, [r0, 0x1A]
- cmp r5, r0
- bge _080E513C
- adds r6, r7, 0
- movs r7, 0xD
- movs r4, 0x8D
- lsls r4, 1
-_080E511A:
- ldr r1, [r6]
- adds r0, r1, r4
- lsls r2, r5, 1
- adds r1, 0xE8
- adds r1, r2
- ldrh r1, [r1]
- muls r1, r7
- ldr r2, _080E51F0 @ =gMoveNames
- adds r1, r2
- bl StringCopy
- adds r4, 0xD
- adds r5, 0x1
- ldr r0, [r6]
- ldrb r0, [r0, 0x1A]
- cmp r5, r0
- blt _080E511A
-_080E513C:
- ldr r4, _080E51E8 @ =gUnknown_203AAB4
- ldr r0, [r4]
- movs r1, 0x98
- lsls r1, 2
- adds r0, r1
- ldrb r1, [r0]
- movs r0, 0x64
- muls r0, r1
- ldr r1, _080E51EC @ =gPlayerParty
- adds r0, r1
- movs r1, 0x2
- mov r2, sp
- bl GetMonData
- ldr r0, _080E51F4 @ =gStringVar1
- mov r1, sp
- bl StringCopy10
- ldr r0, [r4]
- ldrb r2, [r0, 0x1A]
- movs r1, 0xD
- muls r1, r2
- movs r7, 0x8D
- lsls r7, 1
- adds r1, r7
- adds r0, r1
- ldr r1, _080E51F8 @ =gFameCheckerText_Cancel
- bl StringCopy
- ldr r1, [r4]
- ldrb r0, [r1, 0x1A]
- adds r0, 0x1
- strb r0, [r1, 0x1A]
- movs r5, 0
- movs r3, 0x1
- add r3, r8
- mov r12, r3
- cmp r5, r8
- bge _080E51AA
- adds r6, r4, 0
- adds r4, r7, 0
-_080E518E:
- ldr r0, [r6]
- lsls r3, r5, 3
- adds r1, r0, 0
- adds r1, 0x20
- adds r1, r3
- adds r2, r0, r4
- str r2, [r1]
- adds r0, 0x24
- adds r0, r3
- str r5, [r0]
- adds r4, 0xD
- adds r5, 0x1
- cmp r5, r8
- blt _080E518E
-_080E51AA:
- ldr r4, _080E51E8 @ =gUnknown_203AAB4
- ldr r2, [r4]
- lsls r3, r5, 3
- adds r0, r2, 0
- adds r0, 0x20
- adds r0, r3
- ldr r1, _080E51F8 @ =gFameCheckerText_Cancel
- str r1, [r0]
- adds r2, 0x24
- adds r2, r3
- movs r0, 0xFE
- str r0, [r2]
- ldr r2, _080E51FC @ =gMultiuseListMenuTemplate
- adds r1, r2, 0
- ldr r0, _080E5200 @ =gUnknown_83FFA94
- ldm r0!, {r3,r5,r6}
- stm r1!, {r3,r5,r6}
- ldm r0!, {r3,r5,r6}
- stm r1!, {r3,r5,r6}
- ldr r0, [r4]
- adds r0, 0x20
- str r0, [r2]
- mov r5, r12
- strh r5, [r2, 0xC]
- add sp, 0xC
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080E51E8: .4byte gUnknown_203AAB4
-_080E51EC: .4byte gPlayerParty
-_080E51F0: .4byte gMoveNames
-_080E51F4: .4byte gStringVar1
-_080E51F8: .4byte gFameCheckerText_Cancel
-_080E51FC: .4byte gMultiuseListMenuTemplate
-_080E5200: .4byte gUnknown_83FFA94
- thumb_func_end sub_80E50CC
-
- thumb_func_start sub_80E5204
-sub_80E5204: @ 80E5204
- push {r4,r5,lr}
- ldr r4, _080E5258 @ =gUnknown_203AAB4
- ldr r0, [r4]
- ldr r1, _080E525C @ =0x00000263
- adds r0, r1
- ldrb r0, [r0]
- bl ListMenu_ProcessInput
- ldr r0, _080E5260 @ =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- beq _080E5284
- movs r0, 0x5
- bl PlaySE
- ldr r1, [r4]
- ldr r2, _080E5264 @ =0x00000a67
- adds r0, r1, r2
- ldrb r0, [r0]
- cmp r0, 0xFE
- beq _080E5270
- movs r0, 0x8
- strb r0, [r1]
- ldr r0, _080E5268 @ =gStringVar2
- ldr r1, [r4]
- adds r2, r1, r2
- ldrb r3, [r2]
- movs r2, 0xD
- muls r2, r3
- movs r3, 0x8D
- lsls r3, 1
- adds r2, r3
- adds r1, r2
- bl StringCopy
- ldr r0, _080E526C @ =gUnknown_841E3FB
- bl sub_80E48C0
- b _080E529E
- .align 2, 0
-_080E5258: .4byte gUnknown_203AAB4
-_080E525C: .4byte 0x00000263
-_080E5260: .4byte gMain
-_080E5264: .4byte 0x00000a67
-_080E5268: .4byte gStringVar2
-_080E526C: .4byte gUnknown_841E3FB
-_080E5270:
- ldr r0, _080E5280 @ =gUnknown_841E4E2
- bl sub_80E48C0
- ldr r1, [r4]
- movs r0, 0xC
- strb r0, [r1]
- b _080E529E
- .align 2, 0
-_080E5280: .4byte gUnknown_841E4E2
-_080E5284:
- movs r0, 0x2
- ands r0, r1
- cmp r0, 0
- beq _080E529E
- movs r0, 0x5
- bl PlaySE
- ldr r0, [r4]
- movs r1, 0xC
- strb r1, [r0]
- ldr r0, _080E52DC @ =gUnknown_841E4E2
- bl sub_80E48C0
-_080E529E:
- ldr r0, _080E52E0 @ =gUnknown_203AAB4
- ldr r4, [r0]
- ldrb r0, [r4, 0x1A]
- cmp r0, 0x6
- bls _080E52FA
- ldr r2, _080E52E4 @ =gSprites
- movs r0, 0x3E
- adds r0, r2
- mov r12, r0
- ldrb r0, [r0]
- movs r1, 0x5
- negs r1, r1
- adds r3, r1, 0
- ands r3, r0
- mov r0, r12
- strb r3, [r0]
- adds r5, r2, 0
- adds r5, 0x82
- ldrb r0, [r5]
- adds r2, r1, 0
- ands r2, r0
- strb r2, [r5]
- ldrb r0, [r4, 0x19]
- cmp r0, 0
- bne _080E52E8
- movs r1, 0x4
- adds r0, r3, 0
- orrs r0, r1
- mov r1, r12
- strb r0, [r1]
- b _080E52FA
- .align 2, 0
-_080E52DC: .4byte gUnknown_841E4E2
-_080E52E0: .4byte gUnknown_203AAB4
-_080E52E4: .4byte gSprites
-_080E52E8:
- ldrb r1, [r4, 0x19]
- ldrb r0, [r4, 0x1A]
- subs r0, 0x6
- cmp r1, r0
- bne _080E52FA
- movs r1, 0x4
- adds r0, r2, 0
- orrs r0, r1
- strb r0, [r5]
-_080E52FA:
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_80E5204
-
- thumb_func_start sub_80E5300
-sub_80E5300: @ 80E5300
- push {r4,lr}
- ldr r0, _080E5330 @ =gMultiuseListMenuTemplate
- ldr r4, _080E5334 @ =gUnknown_203AAB4
- ldr r2, [r4]
- ldr r3, _080E5338 @ =0x00000a68
- adds r1, r2, r3
- ldrh r1, [r1]
- adds r3, 0x2
- adds r2, r3
- ldrh r2, [r2]
- bl ListMenuInit
- ldr r1, [r4]
- ldr r2, _080E533C @ =0x00000263
- adds r1, r2
- strb r0, [r1]
- movs r0, 0x6
- movs r1, 0x1
- bl CopyWindowToVram
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080E5330: .4byte gMultiuseListMenuTemplate
-_080E5334: .4byte gUnknown_203AAB4
-_080E5338: .4byte 0x00000a68
-_080E533C: .4byte 0x00000263
- thumb_func_end sub_80E5300
-
- thumb_func_start sub_80E5340
-sub_80E5340: @ 80E5340
- push {r4,r5,lr}
- sub sp, 0x3C
- lsls r0, 16
- lsrs r5, r0, 16
- ldr r1, _080E5380 @ =gBattleMoves
- lsls r0, r5, 1
- adds r0, r5
- lsls r0, 2
- adds r4, r0, r1
- ldrb r1, [r4, 0x2]
- adds r1, 0x1
- lsls r1, 24
- lsrs r1, 24
- movs r0, 0x2
- movs r2, 0x1
- movs r3, 0x4
- bl BlitMoveInfoIcon
- ldrb r0, [r4, 0x1]
- cmp r0, 0x1
- bhi _080E5388
- ldr r1, _080E5384 @ =gText_ThreeHyphens
- movs r0, 0
- str r0, [sp]
- str r0, [sp, 0x4]
- movs r0, 0x3
- movs r2, 0x1
- movs r3, 0x4
- bl sub_80E559C
- b _080E53A6
- .align 2, 0
-_080E5380: .4byte gBattleMoves
-_080E5384: .4byte gText_ThreeHyphens
-_080E5388:
- ldrb r1, [r4, 0x1]
- add r0, sp, 0x8
- movs r2, 0x1
- movs r3, 0x3
- bl ConvertIntToDecimalStringN
- movs r0, 0
- str r0, [sp]
- str r0, [sp, 0x4]
- movs r0, 0x3
- add r1, sp, 0x8
- movs r2, 0x1
- movs r3, 0x4
- bl sub_80E559C
-_080E53A6:
- ldr r2, _080E53CC @ =gBattleMoves
- lsls r1, r5, 1
- adds r0, r1, r5
- lsls r0, 2
- adds r0, r2
- ldrb r2, [r0, 0x3]
- adds r4, r1, 0
- cmp r2, 0
- bne _080E53D4
- ldr r1, _080E53D0 @ =gText_ThreeHyphens
- str r2, [sp]
- movs r0, 0x1
- str r0, [sp, 0x4]
- movs r0, 0x3
- movs r2, 0x1
- movs r3, 0x12
- bl sub_80E559C
- b _080E53F4
- .align 2, 0
-_080E53CC: .4byte gBattleMoves
-_080E53D0: .4byte gText_ThreeHyphens
-_080E53D4:
- ldrb r1, [r0, 0x3]
- add r0, sp, 0x8
- movs r2, 0x1
- movs r3, 0x3
- bl ConvertIntToDecimalStringN
- movs r0, 0
- str r0, [sp]
- movs r0, 0x1
- str r0, [sp, 0x4]
- movs r0, 0x3
- add r1, sp, 0x8
- movs r2, 0x1
- movs r3, 0x12
- bl sub_80E559C
-_080E53F4:
- ldr r1, _080E543C @ =gBattleMoves
- adds r0, r4, r5
- lsls r0, 2
- adds r0, r1
- ldrb r1, [r0, 0x4]
- add r0, sp, 0x8
- movs r2, 0
- movs r3, 0x2
- bl ConvertIntToDecimalStringN
- movs r4, 0
- str r4, [sp]
- str r4, [sp, 0x4]
- movs r0, 0x4
- add r1, sp, 0x8
- movs r2, 0x2
- movs r3, 0x2
- bl sub_80E559C
- ldr r1, _080E5440 @ =gMoveDescriptionPointers
- subs r0, r5, 0x1
- lsls r0, 2
- adds r0, r1
- ldr r1, [r0]
- str r4, [sp]
- str r4, [sp, 0x4]
- movs r0, 0x5
- movs r2, 0x1
- movs r3, 0
- bl sub_80E559C
- add sp, 0x3C
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080E543C: .4byte gBattleMoves
-_080E5440: .4byte gMoveDescriptionPointers
- thumb_func_end sub_80E5340
-
- thumb_func_start sub_80E5444
-sub_80E5444: @ 80E5444
- push {lr}
- movs r0, 0
- movs r1, 0x13
- movs r2, 0x1
- movs r3, 0x4
- bl BlitMoveInfoIcon
- movs r0, 0x1
- movs r1, 0x14
- movs r2, 0
- movs r3, 0x4
- bl BlitMoveInfoIcon
- movs r0, 0x1
- movs r1, 0x15
- movs r2, 0
- movs r3, 0x13
- bl BlitMoveInfoIcon
- movs r0, 0
- movs r1, 0x16
- movs r2, 0x1
- movs r3, 0x13
- bl BlitMoveInfoIcon
- movs r0, 0
- movs r1, 0x17
- movs r2, 0x1
- movs r3, 0x22
- bl BlitMoveInfoIcon
- movs r0, 0
- bl PutWindowTilemap
- movs r0, 0x1
- bl PutWindowTilemap
- movs r0, 0x4
- bl PutWindowTilemap
- movs r0, 0x3
- bl PutWindowTilemap
- movs r0, 0x5
- bl PutWindowTilemap
- movs r0, 0x2
- bl PutWindowTilemap
- movs r0, 0x7
- bl PutWindowTilemap
- movs r0, 0
- movs r1, 0x2
- bl CopyWindowToVram
- movs r0, 0x1
- movs r1, 0x2
- bl CopyWindowToVram
- pop {r0}
- bx r0
- thumb_func_end sub_80E5444
-
- thumb_func_start sub_80E54C0
-sub_80E54C0: @ 80E54C0
- push {r4,r5,lr}
- ldr r0, _080E54E0 @ =gUnknown_203AAB4
- ldr r1, [r0]
- ldr r0, _080E54E4 @ =0x00000a67
- adds r2, r1, r0
- ldrb r0, [r2]
- cmp r0, 0xFE
- beq _080E54E8
- lsls r0, 1
- adds r1, 0xE8
- adds r1, r0
- ldrh r0, [r1]
- bl sub_80E5340
- b _080E5504
- .align 2, 0
-_080E54E0: .4byte gUnknown_203AAB4
-_080E54E4: .4byte 0x00000a67
-_080E54E8:
- movs r5, 0x2
-_080E54EA:
- lsls r4, r5, 24
- lsrs r4, 24
- adds r0, r4, 0
- movs r1, 0
- bl FillWindowPixelBuffer
- adds r0, r4, 0
- movs r1, 0x2
- bl CopyWindowToVram
- adds r5, 0x1
- cmp r5, 0x5
- ble _080E54EA
-_080E5504:
- movs r0, 0x3
- movs r1, 0x2
- bl CopyWindowToVram
- movs r0, 0x4
- movs r1, 0x2
- bl CopyWindowToVram
- movs r0, 0x2
- movs r1, 0x2
- bl CopyWindowToVram
- movs r0, 0x2
- movs r1, 0x2
- bl CopyWindowToVram
- movs r0, 0x5
- movs r1, 0x2
- bl CopyWindowToVram
- movs r0, 0x7
- movs r1, 0x3
- bl CopyWindowToVram
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_80E54C0
-
- thumb_func_start sub_80E553C
-sub_80E553C: @ 80E553C
- push {r4,lr}
- adds r4, r0, 0
- lsls r1, 24
- cmp r1, 0
- bne _080E5560
- movs r0, 0x5
- bl PlaySE
- ldr r2, _080E5568 @ =gUnknown_203AAB4
- ldr r0, [r2]
- ldr r1, _080E556C @ =0x0000025f
- adds r0, r1
- movs r1, 0x1
- strb r1, [r0]
- ldr r0, [r2]
- ldr r1, _080E5570 @ =0x00000a67
- adds r0, r1
- strb r4, [r0]
-_080E5560:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080E5568: .4byte gUnknown_203AAB4
-_080E556C: .4byte 0x0000025f
-_080E5570: .4byte 0x00000a67
- thumb_func_end sub_80E553C
-
- thumb_func_start sub_80E5574
-sub_80E5574: @ 80E5574
- push {r4,lr}
- bl Menu_ProcessInputNoWrapClearOnChoose
- lsls r0, 24
- asrs r4, r0, 24
- movs r0, 0x2
- negs r0, r0
- cmp r4, r0
- beq _080E5594
- movs r0, 0x6
- bl PutWindowTilemap
- movs r0, 0x6
- movs r1, 0x1
- bl CopyWindowToVram
-_080E5594:
- adds r0, r4, 0
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_80E5574
-
- thumb_func_start sub_80E559C
-sub_80E559C: @ 80E559C
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x14
- mov r10, r1
- ldr r4, [sp, 0x38]
- lsls r0, 24
- lsrs r5, r0, 24
- lsls r2, 24
- lsrs r7, r2, 24
- lsls r3, 24
- lsrs r6, r3, 24
- movs r0, 0x1
- mov r8, r0
- mov r9, r0
- cmp r4, 0x1
- bhi _080E55C8
- movs r1, 0
- mov r8, r1
- mov r9, r1
-_080E55C8:
- cmp r4, 0
- blt _080E5622
- cmp r4, 0x1
- ble _080E55D6
- cmp r4, 0x2
- beq _080E5604
- b _080E5622
-_080E55D6:
- ldr r2, _080E55F4 @ =gUnknown_203AAB4
- ldr r0, [r2]
- ldr r1, _080E55F8 @ =0x00000a64
- adds r0, r1
- movs r1, 0
- strb r1, [r0]
- ldr r0, [r2]
- ldr r1, _080E55FC @ =0x00000a65
- adds r0, r1
- movs r1, 0x2
- strb r1, [r0]
- ldr r0, [r2]
- ldr r1, _080E5600 @ =0x00000a66
- b _080E561C
- .align 2, 0
-_080E55F4: .4byte gUnknown_203AAB4
-_080E55F8: .4byte 0x00000a64
-_080E55FC: .4byte 0x00000a65
-_080E5600: .4byte 0x00000a66
-_080E5604:
- ldr r2, _080E5678 @ =gUnknown_203AAB4
- ldr r0, [r2]
- ldr r1, _080E567C @ =0x00000a64
- adds r0, r1
- movs r1, 0x1
- strb r1, [r0]
- ldr r0, [r2]
- ldr r1, _080E5680 @ =0x00000a65
- adds r0, r1
- strb r4, [r0]
- ldr r0, [r2]
- adds r1, 0x1
-_080E561C:
- adds r0, r1
- movs r1, 0x3
- strb r1, [r0]
-_080E5622:
- cmp r4, 0x1
- beq _080E563E
- ldr r0, _080E5678 @ =gUnknown_203AAB4
- ldr r0, [r0]
- ldr r1, _080E567C @ =0x00000a64
- adds r0, r1
- ldrb r0, [r0]
- lsls r1, r0, 4
- orrs r1, r0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r5, 0
- bl FillWindowPixelBuffer
-_080E563E:
- mov r0, r8
- str r0, [sp]
- mov r1, r9
- str r1, [sp, 0x4]
- ldr r0, _080E5678 @ =gUnknown_203AAB4
- ldr r0, [r0]
- ldr r1, _080E567C @ =0x00000a64
- adds r0, r1
- str r0, [sp, 0x8]
- ldr r0, [sp, 0x34]
- lsls r0, 24
- asrs r0, 24
- str r0, [sp, 0xC]
- mov r0, r10
- str r0, [sp, 0x10]
- adds r0, r5, 0
- movs r1, 0x3
- adds r2, r7, 0
- adds r3, r6, 0
- bl AddTextPrinterParameterized4
- add sp, 0x14
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080E5678: .4byte gUnknown_203AAB4
-_080E567C: .4byte 0x00000a64
-_080E5680: .4byte 0x00000a65
- thumb_func_end sub_80E559C
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/baserom.ips b/baserom.ips
index 370073252..4a40d3337 100644
--- a/baserom.ips
+++ b/baserom.ips
Binary files differ
diff --git a/data/battle_anim_effects_3.s b/data/battle_anim_effects_3.s
index 23dd1e1fd..58fb29794 100644
--- a/data/battle_anim_effects_3.s
+++ b/data/battle_anim_effects_3.s
@@ -67,4 +67,4 @@ gUnknown_83FF65C:: @ 83FF65C
.incbin "baserom.gba", 0x3FF65C, 0x14C
gUnknown_83FF7A8:: @ 83FF7A8
- .incbin "baserom.gba", 0x3FF7A8, 0x24C
+ .incbin "baserom.gba", 0x3FF7A8, 0x30
diff --git a/data/learn_move.s b/data/learn_move.s
deleted file mode 100644
index ff3f2e3d1..000000000
--- a/data/learn_move.s
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "constants/region_map.h"
-#include "constants/flags.h"
-#include "constants/moves.h"
- .include "asm/macros.inc"
- .include "constants/constants.inc"
- .section .rodata
- .align 2
-
-gUnknown_83FF9F4:: @ 83FF9F4
- .incbin "baserom.gba", 0x3FF9F4, 0x8
-
-gUnknown_83FF9FC:: @ 83FF9FC
- .incbin "baserom.gba", 0x3FF9FC, 0x28
-
-gUnknown_83FFA24:: @ 83FFA24
- .incbin "baserom.gba", 0x3FFA24, 0x18
-
-gUnknown_83FFA3C:: @ 83FFA3C
- .incbin "baserom.gba", 0x3FFA3C, 0x8
-
-gUnknown_83FFA44:: @ 83FFA44
- .incbin "baserom.gba", 0x3FFA44, 0x48
-
-gUnknown_83FFA8C:: @ 83FFA8C
- .incbin "baserom.gba", 0x3FFA8C, 0x8
-
-gUnknown_83FFA94:: @ 83FFA94
- .incbin "baserom.gba", 0x3FFA94, 0x30
diff --git a/data/strings.s b/data/strings.s
index 9b223df62..101946475 100644
--- a/data/strings.s
+++ b/data/strings.s
@@ -4535,17 +4535,17 @@ gDaycareText_PlayOther:: @ 841E3A8
.string "The two prefer to play with other\n"
.string "POKéMON than each other.$"
-gUnknown_841E3E3:: @ 841E3E3
+gText_TeachWhichMoveToMon:: @ 841E3E3
.string "Teach which move to {STR_VAR_1}?$"
-gUnknown_841E3FB:: @ 841E3FB
+gText_TeachMoveQues:: @ 841E3FB
.string "Teach {STR_VAR_2}?$"
-gUnknown_841E405:: @ 841E405
+gText_MonLearnedMove:: @ 841E405
.string "{STR_VAR_1} learned\n"
.string "{STR_VAR_2}.$"
-gUnknown_841E414:: @ 841E414
+gText_MonIsTryingToLearnMove:: @ 841E414
.string "{STR_VAR_1} is trying to learn\n"
.string "{STR_VAR_2}.\p"
.string "But {STR_VAR_1} can't learn more\n"
@@ -4553,24 +4553,24 @@ gUnknown_841E414:: @ 841E414
.string "Delete an older move to make\n"
.string "room for {STR_VAR_2}?$"
-gUnknown_841E481:: @ 841E481
+gText_StopLearningMove:: @ 841E481
.string "Stop learning {STR_VAR_2}?$"
-gUnknown_841E493:: @ 841E493
+gText_1_2_and_Poof:: @ 841E493
.string "{PAUSE 0x20}1, {PAUSE 0x0F}2, and {PAUSE 0x0F}‥ {PAUSE 0x0F}‥ {PAUSE 0x0F}‥ {PAUSE 0x0F}{PLAY_SE SE_KON}Poof!\p"
.string "$"
-gUnknown_841E4C0:: @ 841E4C0
+gText_MonForgotOldMoveAndMonLearnedNewMove:: @ 841E4C0
.string "{STR_VAR_1} forgot {STR_VAR_3}.\p"
.string "And‥\p"
.string "{STR_VAR_1}\n"
.string "learned {STR_VAR_2}.$"
-gUnknown_841E4E2:: @ 841E4E2
+gText_GiveUpTryingToTeachNewMove:: @ 841E4E2
.string "Give up trying to teach a new\n"
.string "move to {STR_VAR_1}?$"
-gUnknown_841E50C:: @ 841E50C
+gText_WhichMoveShouldBeForgotten:: @ 841E50C
.string "Which move should be forgotten?\p"
.string "$"
diff --git a/graphics/learn_move/interface_sprites.png b/graphics/learn_move/interface_sprites.png
new file mode 100644
index 000000000..4fa3d4a1b
--- /dev/null
+++ b/graphics/learn_move/interface_sprites.png
Binary files differ
diff --git a/include/graphics.h b/include/graphics.h
index bc87e4d53..c057da386 100644
--- a/include/graphics.h
+++ b/include/graphics.h
@@ -4226,7 +4226,13 @@ extern const u16 gTradeMenuMonBox_Tilemap[];
extern const u16 gUnknown_8E9CBBC[];
extern const u16 gUnknown_8E9CB9C[];
+// hall_of_fame
extern const u32 gFile_graphics_misc_confetti_sheet[];
extern const u32 gFile_graphics_misc_confetti_palette[];
+// learn_move
+extern const u16 gUnknown_8E97DDC[];
+extern const u32 gUnknown_8E97DFC[];
+extern const u32 gUnknown_8E97EC4[];
+
#endif //GUARD_GRAPHICS_H
diff --git a/include/strings.h b/include/strings.h
index 80ede79ef..f39f4f553 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -724,4 +724,15 @@ extern const u8 gText_IDNumber[];
extern const u8 gText_Name[];
extern const u8 gText_MainMenuTime[];
+// learn_move
+extern const u8 gText_TeachWhichMoveToMon[];
+extern const u8 gText_MonLearnedMove[];
+extern const u8 gText_MonIsTryingToLearnMove[];
+extern const u8 gText_StopLearningMove[];
+extern const u8 gText_1_2_and_Poof[];
+extern const u8 gText_MonForgotOldMoveAndMonLearnedNewMove[];
+extern const u8 gText_WhichMoveShouldBeForgotten[];
+extern const u8 gText_TeachMoveQues[];
+extern const u8 gText_GiveUpTryingToTeachNewMove[];
+
#endif //GUARD_STRINGS_H
diff --git a/ld_script.txt b/ld_script.txt
index b2a1f11e7..03fab08a6 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -206,7 +206,7 @@ SECTIONS {
src/battle_controller_safari.o(.text);
src/fldeff_sweetscent.o(.text);
asm/battle_anim_effects_3.o(.text);
- asm/learn_move.o(.text);
+ src/learn_move.o(.text);
src/fldeff_softboiled.o(.text);
src/battle_tower.o(.text);
src/battle_controller_oak_old_man.o(.text);
@@ -478,7 +478,7 @@ SECTIONS {
data/field_effect_helpers.o(.rodata);
src/battle_controller_safari.o(.rodata);
data/battle_anim_effects_3.o(.rodata);
- data/learn_move.o(.rodata);
+ src/learn_move.o(.rodata);
src/battle_tower.o(.rodata);
src/battle_controller_oak_old_man.o(.rodata);
src/player_pc.o(.rodata);
diff --git a/src/battle_tower.c b/src/battle_tower.c
index 6720e9f1b..dfbef8fe5 100644
--- a/src/battle_tower.c
+++ b/src/battle_tower.c
@@ -43,6 +43,14 @@ static u16 GetCurrentBattleTowerWinStreak(u8 levelType);
static void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer * eReaderTrainer);
static void PrintEReaderTrainerFarewellMessage(void);
+const u8 unref_83FFAAC[] = {
+ 0x05, 0x04, 0x01, 0x10, 0x04, 0x02, 0x05, 0x06,
+ 0x03, 0x10, 0x06, 0x04, 0x00, 0x01, 0x02, 0x03,
+ 0x00, 0x02, 0x03
+};
+
+const u8 unref_83FFABF[] = _("100");
+
#include "data/battle_tower/trainers.h"
static const u16 sBattleTowerHeldItems[] = {
diff --git a/src/learn_move.c b/src/learn_move.c
new file mode 100644
index 000000000..e22922528
--- /dev/null
+++ b/src/learn_move.c
@@ -0,0 +1,842 @@
+#include "global.h"
+#include "bg.h"
+#include "malloc.h"
+#include "gpu_regs.h"
+#include "palette.h"
+#include "script.h"
+#include "task.h"
+#include "data.h"
+#include "trig.h"
+#include "window.h"
+#include "field_fadetransition.h"
+#include "overworld.h"
+#include "new_menu_helpers.h"
+#include "menu.h"
+#include "list_menu.h"
+#include "event_data.h"
+#include "text_window.h"
+#include "string_util.h"
+#include "pokemon_summary_screen.h"
+#include "graphics.h"
+#include "sound.h"
+#include "strings.h"
+#include "constants/songs.h"
+#include "constants/moves.h"
+
+struct MoveTutorMoveInfoHeaders
+{
+ const u8 *text;
+ u8 left;
+ u8 right;
+ u8 index; // unused
+};
+
+struct LearnMoveGfxResources
+{
+ u8 state;
+ u8 unk_01;
+ u8 unk_02;
+ u8 spriteIds[2];
+ u8 filler_05[0x13];
+ u8 unk_18;
+ u8 scrollPositionMaybe;
+ u8 numLearnableMoves;
+ u8 unk_1B;
+ u8 unk_1C;
+ u8 unk_1D;
+ u8 unk_1E;
+ struct ListMenuItem listMenuItems[25];
+ u16 learnableMoves[25];
+ u8 listMenuStrbufs[25][13];
+ bool8 scheduleMoveInfoUpdate;
+ u8 selectedPartyMember;
+ u8 selectedMoveSlot;
+ u8 unk_262;
+ u8 listMenuTaskId;
+ u8 bg1TilemapBuffer[BG_SCREEN_SIZE]; // 264
+ u8 textColor[3]; // A64
+ u8 selectedIndex;
+ u16 listMenuScrollPos;
+ u16 listMenuScrollRow;
+};
+
+static EWRAM_DATA struct LearnMoveGfxResources * sMoveRelearner = NULL;
+
+static void Task_InitMoveRelearnerMenu(u8 taskId);
+static void CB2_MoveRelearner_Init(void);
+static void CB2_MoveRelearner(void);
+static void MoveRelearnerStateMachine(void);
+static void DrawTextBorderOnWindows6and7(void);
+static void PrintTeachWhichMoveToStrVar1(bool8 onInit);
+static void InitMoveRelearnerStateVariables(void);
+static void SpriteCB_ListMenuScrollIndicators(struct Sprite * sprite);
+static void SpawnListMenuScrollIndicatorSprites(void);
+static void MoveRelearnerInitListMenuBuffersEtc(void);
+static void MoveRelearnerMenuHandleInput(void);
+static void MoveLearnerInitListMenu(void);
+static void LoadMoveInfoUI(void);
+static void PrintMoveInfoHandleCancel_CopyToVram(void);
+static void MoveRelearnerMenu_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list);
+static s8 YesNoMenuProcessInput(void);
+static void PrintTextOnWindow(u8 windowId, const u8 *str, u8 x, u8 y, s32 speed, s32 colorIdx);
+
+static const u16 sLearnMoveInterfaceSpritesPalette[] = INCBIN_U16("graphics/learn_move/interface_sprites.gbapal");
+static const u16 sLearnMoveInterfaceSpritesTiles[] = INCBIN_U16("graphics/learn_move/interface_sprites.4bpp");
+
+static const u8 sMoveTutorMenuWindowFrameDimensions[][4] =
+{
+ { 0, 0, 19, 13},
+ {20, 0, 29, 13},
+ { 2, 14, 27, 19}
+};
+
+static const u8 sJPText_TatakauWaza[] = _("たたかうわざ");
+static const u8 sJPText_Taipu[] = _("タイプ/");
+static const u8 sJPText_PP[] = _("PP/");
+static const u8 sJPText_Iryoku[] = _("いりょく/");
+static const u8 sJPText_Meichuu[] = _("めいちゅう/");
+
+static const struct MoveTutorMoveInfoHeaders sMoveTutorMoveInfoHeaders[][5] =
+{
+ {
+ {sJPText_TatakauWaza, 7, 1, 0},
+ {sJPText_Taipu, 1, 4, 1},
+ {sJPText_Iryoku, 11, 4, 2},
+ {sJPText_PP, 2, 6, 3},
+ {sJPText_Meichuu, 10, 6, 4},
+ },
+ {
+ {NULL, 0, 0, 0},
+ {NULL, 0, 0, 0},
+ {NULL, 0, 0, 0},
+ {NULL, 0, 0, 0},
+ {NULL, 0, 0, 0},
+ },
+};
+
+static const struct SpriteSheet sSpriteSheet_ListMenuScrollIndicators = {
+ sLearnMoveInterfaceSpritesTiles, 0x180, 5525
+};
+
+static const struct SpritePalette sSpritePalette_ListMenuScrollIndicators = {
+ sLearnMoveInterfaceSpritesPalette, 5526
+};
+
+static const struct OamData sOamdata_MoveRelearnerListMenuScrollIndicators = {
+ .shape = SPRITE_SHAPE(16x8),
+ .size = SPRITE_SIZE(16x8)
+};
+
+static const union AnimCmd sAnimCmd_ScrollIndicatorDown[] = {
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sAnimCmd_ScrollIndicatorUp[] = {
+ ANIMCMD_FRAME(6, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_MoveRelearnerListMenuScrollIndicators[] = {
+ sAnimCmd_ScrollIndicatorDown,
+ sAnimCmd_ScrollIndicatorUp
+};
+
+static const struct SpriteTemplate sSpriteTemplate_MoveRelearnerListMenuScrollIndicators = {
+ 5525, 5526, &sOamdata_MoveRelearnerListMenuScrollIndicators, sSpriteAnimTable_MoveRelearnerListMenuScrollIndicators, NULL, gDummySpriteAffineAnimTable, SpriteCB_ListMenuScrollIndicators
+};
+
+static const struct BgTemplate sBgTemplates[2] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 31,
+ .priority = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 8,
+ .priority = 1
+ }
+};
+
+static const struct WindowTemplate sWindowTemplates[9] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 0,
+ .width = 6,
+ .height = 7,
+ .paletteNum = 0x0d,
+ .baseBlock = 0x014
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 10,
+ .tilemapTop = 0,
+ .width = 5,
+ .height = 5,
+ .paletteNum = 0x0d,
+ .baseBlock = 0x03e
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 5,
+ .tilemapTop = 0,
+ .width = 5,
+ .height = 2,
+ .paletteNum = 0x0d,
+ .baseBlock = 0x057
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 15,
+ .tilemapTop = 0,
+ .width = 3,
+ .height = 5,
+ .paletteNum = 0x0f,
+ .baseBlock = 0x061
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 5,
+ .tilemapTop = 2,
+ .width = 3,
+ .height = 3,
+ .paletteNum = 0x0f,
+ .baseBlock = 0x070
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 2,
+ .tilemapTop = 6,
+ .width = 15,
+ .height = 8,
+ .paletteNum = 0x0f,
+ .baseBlock = 0x079
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 19,
+ .tilemapTop = 1,
+ .width = 10,
+ .height = 12,
+ .paletteNum = 0x0f,
+ .baseBlock = 0x0f1
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 2,
+ .tilemapTop = 15,
+ .width = 26,
+ .height = 4,
+ .paletteNum = 0x0f,
+ .baseBlock = 0x169
+ }, DUMMY_WIN_TEMPLATE
+};
+
+static const struct WindowTemplate gUnknown_83FFA8C = {
+ .bg = 0,
+ .tilemapLeft = 21,
+ .tilemapTop = 8,
+ .width = 6,
+ .height = 4,
+ .paletteNum = 0x0f,
+ .baseBlock = 0x1d1
+};
+
+static const struct ListMenuTemplate sMoveRelearnerListMenuTemplate = {
+ .items = NULL,
+ .moveCursorFunc = MoveRelearnerMenu_MoveCursorFunc,
+ .itemPrintFunc = NULL,
+ .totalItems = 0,
+ .maxShowed = 7,
+ .windowId = 6,
+ .header_X = 0,
+ .item_X = 8,
+ .cursor_X = 0,
+ .upText_Y = 0,
+ .cursorPal = 2,
+ .fillValue = 1,
+ .cursorShadowPal = 3,
+ .lettersSpacing = 1,
+ .itemVerticalPadding = 0,
+ .scrollMultiple = 0,
+ .fontId = 2,
+ .cursorKind = 0,
+};
+
+static void VBlankCB_MoveRelearner(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void DisplayMoveTutorMenu(void)
+{
+ ScriptContext2_Enable();
+ CreateTask(Task_InitMoveRelearnerMenu, 10);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+}
+
+static void Task_InitMoveRelearnerMenu(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(CB2_MoveRelearner_Init);
+ gFieldCallback = FieldCallback_ReturnToEventScript2;
+ DestroyTask(taskId);
+ }
+}
+
+static void MoveRelearnerLoadBgGfx(void)
+{
+ int i;
+ ResetBgsAndClearDma3BusyFlags(FALSE);
+ InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));
+ ResetTempTileDataBuffers();
+ if (InitWindows(sWindowTemplates))
+ {
+ DeactivateAllTextPrinters();
+ for (i = 0; i < NELEMS(sWindowTemplates); i++)
+ {
+ ClearWindowTilemap(i);
+ FillWindowPixelBuffer(i, PIXEL_FILL(0));
+ }
+ FillWindowPixelBuffer(7, PIXEL_FILL(1));
+ FillBgTilemapBufferRect(0, 0x000, 0, 0, 30, 20, 0xF);
+ SetBgTilemapBuffer(1, sMoveRelearner->bg1TilemapBuffer);
+ TextWindow_SetUserSelectedFrame(0, 1, 0xE0);
+ sub_8107D38(0xD0, 1);
+ LoadPalette(gUnknown_8E97DDC, 0x00, 0x20);
+ DecompressAndLoadBgGfxUsingHeap(1, gUnknown_8E97DFC, 0, 0, 0);
+ CopyToBgTilemapBuffer(1, gUnknown_8E97EC4, 0, 0);
+ CopyBgTilemapBufferToVram(1);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ }
+}
+
+static void CB2_MoveRelearner_Init(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ sMoveRelearner = AllocZeroed(sizeof(struct LearnMoveGfxResources));
+ InitMoveRelearnerStateVariables();
+ sMoveRelearner->selectedPartyMember = gSpecialVar_0x8004;
+ MoveRelearnerInitListMenuBuffersEtc();
+ SetVBlankCallback(VBlankCB_MoveRelearner);
+ MoveRelearnerLoadBgGfx();
+ SpawnListMenuScrollIndicatorSprites();
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ SetMainCallback2(CB2_MoveRelearner);
+}
+
+static void CB2_MoveRelearner_Resume(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ MoveRelearnerInitListMenuBuffersEtc();
+ sMoveRelearner->selectedMoveSlot = gSpecialVar_0x8005;
+ SetVBlankCallback(VBlankCB_MoveRelearner);
+ MoveRelearnerLoadBgGfx();
+ SpawnListMenuScrollIndicatorSprites();
+ FillPalette(RGB_BLACK, 0, 2);
+
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ SetMainCallback2(CB2_MoveRelearner);
+}
+
+static void CB2_MoveRelearner(void)
+{
+ if (!IsTextPrinterActive(7))
+ MoveRelearnerStateMachine();
+ if (sMoveRelearner->scheduleMoveInfoUpdate)
+ {
+ PrintMoveInfoHandleCancel_CopyToVram();
+ sMoveRelearner->scheduleMoveInfoUpdate = FALSE;
+ }
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void StringExpandPlaceholdersAndPrintTextOnWindow7Color2(const u8 *str)
+{
+ StringExpandPlaceholders(gStringVar4, str);
+ PrintTextOnWindow(7, gStringVar4, 0, 2, GetTextSpeedSetting(), 2);
+}
+
+static void MoveRelearnerStateMachine(void)
+{
+ u16 move;
+
+ switch (sMoveRelearner->state)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ ShowBg(0);
+ ShowBg(1);
+ LoadMoveInfoUI();
+ sMoveRelearner->state++;
+ DrawTextBorderOnWindows6and7();
+ PrintTeachWhichMoveToStrVar1(FALSE);
+ MoveLearnerInitListMenu();
+ sMoveRelearner->scheduleMoveInfoUpdate = TRUE;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ sMoveRelearner->state = 4;
+ break;
+ case 2:
+ sMoveRelearner->state++;
+ break;
+ case 3:
+ PrintTeachWhichMoveToStrVar1(FALSE);
+ sMoveRelearner->scheduleMoveInfoUpdate = TRUE;
+ sMoveRelearner->state++;
+ break;
+ case 4:
+ MoveRelearnerMenuHandleInput();
+ break;
+ case 8:
+ CreateYesNoMenu(&gUnknown_83FFA8C, 3, 0, 2, 0x001, 0xE, 0);
+ sMoveRelearner->state++;
+ break;
+ case 9:
+ switch (YesNoMenuProcessInput())
+ {
+ case 0:
+ if (GiveMoveToMon(&gPlayerParty[sMoveRelearner->selectedPartyMember], sMoveRelearner->learnableMoves[sMoveRelearner->selectedIndex]) != 0xFFFF)
+ {
+ StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_MonLearnedMove);
+ gSpecialVar_0x8004 = TRUE;
+ sMoveRelearner->state = 31;
+ }
+ else
+ {
+ sMoveRelearner->state = 16;
+ }
+ break;
+ case 1:
+ case -1:
+ sMoveRelearner->state = 3;
+ break;
+ }
+ break;
+ case 12:
+ CreateYesNoMenu(&gUnknown_83FFA8C, 3, 0, 2, 0x001, 0xE, 0);
+ sMoveRelearner->state++;
+ break;
+ case 13:
+ switch (YesNoMenuProcessInput())
+ {
+ case 0:
+ gSpecialVar_0x8004 = FALSE;
+ sMoveRelearner->state = 14;
+ break;
+ case 1:
+ case -1:
+ sMoveRelearner->state = 3;
+ break;
+ }
+ break;
+ case 16:
+ StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_MonIsTryingToLearnMove);
+ sMoveRelearner->state++;
+ break;
+ case 17:
+ CreateYesNoMenu(&gUnknown_83FFA8C, 3, 0, 2, 0x001, 0xE, 0);
+ sMoveRelearner->state = 18;
+ break;
+ case 18:
+ switch (YesNoMenuProcessInput())
+ {
+ case 0:
+ StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_WhichMoveShouldBeForgotten);
+ sMoveRelearner->state = 19;
+ break;
+ case 1:
+ case -1:
+ sMoveRelearner->state = 24;
+ break;
+ }
+ break;
+ case 24:
+ StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_StopLearningMove);
+ sMoveRelearner->state++;
+ break;
+ case 25:
+ CreateYesNoMenu(&gUnknown_83FFA8C, 3, 0, 2, 0x001, 0xE, 0);
+ sMoveRelearner->state = 26;
+ break;
+ case 26:
+ switch (YesNoMenuProcessInput())
+ {
+ case 0:
+ sMoveRelearner->state = 27;
+ break;
+ case 1:
+ case -1:
+ sMoveRelearner->state = 16;
+ break;
+ }
+ break;
+ case 27:
+ sMoveRelearner->state = 3;
+ break;
+ case 19:
+ sMoveRelearner->state = 20;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ break;
+ case 20:
+ if (!gPaletteFade.active)
+ {
+ ListMenuGetScrollAndRow(sMoveRelearner->listMenuTaskId, &sMoveRelearner->listMenuScrollPos, &sMoveRelearner->listMenuScrollRow);
+ FreeAllWindowBuffers();
+ ShowSelectMovePokemonSummaryScreen(gPlayerParty, sMoveRelearner->selectedPartyMember, gPlayerPartyCount - 1, CB2_MoveRelearner_Resume, sMoveRelearner->learnableMoves[sMoveRelearner->selectedIndex]);
+ sMoveRelearner->state = 28;
+ }
+ break;
+ case 21:
+ sMoveRelearner->state = 14;
+ break;
+ case 22:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ break;
+ case 14:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ sMoveRelearner->state++;
+ break;
+ case 15:
+ if (!gPaletteFade.active)
+ {
+ FreeAllWindowBuffers();
+ Free(sMoveRelearner);
+ SetMainCallback2(CB2_ReturnToField);
+ }
+ break;
+ case 28:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ ShowBg(0);
+ ShowBg(1);
+ sMoveRelearner->state++;
+ LoadMoveInfoUI();
+ DrawTextBorderOnWindows6and7();
+ MoveLearnerInitListMenu();
+ PrintTeachWhichMoveToStrVar1(TRUE);
+ PrintMoveInfoHandleCancel_CopyToVram();
+ break;
+ case 29:
+ if (!gPaletteFade.active)
+ {
+ if (sMoveRelearner->selectedMoveSlot == 4)
+ {
+ sMoveRelearner->state = 24;
+ }
+ else
+ {
+ move = GetMonData(&gPlayerParty[sMoveRelearner->selectedPartyMember], MON_DATA_MOVE1 + sMoveRelearner->selectedMoveSlot);
+ StringCopy(gStringVar3, gMoveNames[move]);
+ RemoveMonPPBonus(&gPlayerParty[sMoveRelearner->selectedPartyMember], sMoveRelearner->selectedMoveSlot);
+ SetMonMoveSlot(&gPlayerParty[sMoveRelearner->selectedPartyMember], sMoveRelearner->learnableMoves[sMoveRelearner->selectedIndex], sMoveRelearner->selectedMoveSlot);
+ StringCopy(gStringVar2, gMoveNames[sMoveRelearner->learnableMoves[sMoveRelearner->selectedIndex]]);
+ StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_1_2_and_Poof);
+ sMoveRelearner->state = 30;
+ gSpecialVar_0x8004 = TRUE;
+ }
+ }
+ break;
+ case 30:
+ StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_MonForgotOldMoveAndMonLearnedNewMove);
+ sMoveRelearner->state = 31;
+ PlayFanfare(MUS_FANFA1);
+ break;
+ case 31:
+ PlayFanfare(MUS_FANFA1);
+ sMoveRelearner->state = 32;
+ break;
+ case 32:
+ if (IsFanfareTaskInactive())
+ sMoveRelearner->state = 33;
+ break;
+ case 33:
+ if (JOY_NEW(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ sMoveRelearner->state = 14;
+ }
+ break;
+ }
+}
+
+static void DrawTextBorderOnWindows6and7(void)
+{
+ int i;
+ for (i = 6; i < 8; i++)
+ DrawTextBorderOuter(i, 0x001, 0xE);
+}
+
+static void PrintTeachWhichMoveToStrVar1(bool8 onInit)
+{
+ if (!onInit)
+ {
+ StringExpandPlaceholders(gStringVar4, gText_TeachWhichMoveToMon);
+ PrintTextOnWindow(7, gStringVar4, 0, 2, 0, 2);
+ PutWindowTilemap(7);
+ CopyWindowToVram(7, 3);
+ }
+}
+
+static void InitMoveRelearnerStateVariables(void)
+{
+ int i;
+ sMoveRelearner->state = 0;
+ sMoveRelearner->unk_02 = 0;
+ sMoveRelearner->scrollPositionMaybe = 0;
+ sMoveRelearner->unk_18 = 0;
+ sMoveRelearner->unk_1C = 0;
+ sMoveRelearner->numLearnableMoves = 0;
+ sMoveRelearner->unk_1B = 0;
+ sMoveRelearner->unk_1D = 0;
+ sMoveRelearner->unk_1E = 0;
+ sMoveRelearner->scheduleMoveInfoUpdate = FALSE;
+ for (i = 0; i < 20; i++)
+ sMoveRelearner->learnableMoves[i] = MOVE_NONE;
+}
+
+static void SpriteCB_ListMenuScrollIndicators(struct Sprite * sprite)
+{
+ s16 abcissa = (sprite->data[1] * 10) & 0xFF;
+ switch (sprite->data[0])
+ {
+ case 0:
+ break;
+ case 1:
+ sprite->pos2.x = Sin(abcissa, 3) * sprite->data[2];
+ break;
+ case 2:
+ sprite->pos2.y = Sin(abcissa, 1) * sprite->data[2];
+ break;
+ }
+ sprite->data[1]++;
+}
+
+static void SpawnListMenuScrollIndicatorSprites(void)
+{
+ int i;
+ LoadSpriteSheet(&sSpriteSheet_ListMenuScrollIndicators);
+ LoadSpritePalette(&sSpritePalette_ListMenuScrollIndicators);
+ sMoveRelearner->spriteIds[0] = CreateSprite(&sSpriteTemplate_MoveRelearnerListMenuScrollIndicators, 200, 4, 0);
+ StartSpriteAnim(&gSprites[sMoveRelearner->spriteIds[0]], 1);
+ gSprites[sMoveRelearner->spriteIds[0]].data[0] = 2;
+ gSprites[sMoveRelearner->spriteIds[0]].data[2] = -1;
+
+ // Bug: This should be using the second element of spriteIds.
+ sMoveRelearner->spriteIds[0] = CreateSprite(&sSpriteTemplate_MoveRelearnerListMenuScrollIndicators, 200, 108, 0);
+ gSprites[sMoveRelearner->spriteIds[0]].data[0] = 2;
+ gSprites[sMoveRelearner->spriteIds[0]].data[2] = 1;
+ for (i = 0; i < 2; i++)
+ gSprites[sMoveRelearner->spriteIds[i]].invisible = TRUE;
+}
+
+static void MoveRelearnerInitListMenuBuffersEtc(void)
+{
+ int i;
+ s32 count;
+ u8 nickname[11];
+
+ sMoveRelearner->numLearnableMoves = GetMoveRelearnerMoves(&gPlayerParty[sMoveRelearner->selectedPartyMember], sMoveRelearner->learnableMoves);
+ count = GetMoveRelearnerMoves(&gPlayerParty[sMoveRelearner->selectedPartyMember], sMoveRelearner->learnableMoves);
+ for (i = 0; i < sMoveRelearner->numLearnableMoves; i++)
+ StringCopy(sMoveRelearner->listMenuStrbufs[i], gMoveNames[sMoveRelearner->learnableMoves[i]]);
+ GetMonData(&gPlayerParty[sMoveRelearner->selectedPartyMember], MON_DATA_NICKNAME, nickname);
+ StringCopy10(gStringVar1, nickname);
+ StringCopy(sMoveRelearner->listMenuStrbufs[sMoveRelearner->numLearnableMoves], gFameCheckerText_Cancel);
+ sMoveRelearner->numLearnableMoves++;
+ for (i = 0; i < count; i++)
+ {
+ sMoveRelearner->listMenuItems[i].label = sMoveRelearner->listMenuStrbufs[i];
+ sMoveRelearner->listMenuItems[i].index = i;
+ }
+ sMoveRelearner->listMenuItems[i].label = gFameCheckerText_Cancel;
+ sMoveRelearner->listMenuItems[i].index = 0xFE;
+ gMultiuseListMenuTemplate = sMoveRelearnerListMenuTemplate;
+ gMultiuseListMenuTemplate.items = sMoveRelearner->listMenuItems;
+ gMultiuseListMenuTemplate.totalItems = count + 1;
+}
+
+static void MoveRelearnerMenuHandleInput(void)
+{
+ ListMenu_ProcessInput(sMoveRelearner->listMenuTaskId);
+ if (JOY_NEW(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ if (sMoveRelearner->selectedIndex != 0xFE)
+ {
+ sMoveRelearner->state = 8;
+ StringCopy(gStringVar2, sMoveRelearner->listMenuStrbufs[sMoveRelearner->selectedIndex]);
+ StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_TeachMoveQues);
+ }
+ else
+ {
+ StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_GiveUpTryingToTeachNewMove);
+ sMoveRelearner->state = 12;
+ }
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ sMoveRelearner->state = 12;
+ StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_GiveUpTryingToTeachNewMove);
+ }
+ if (sMoveRelearner->numLearnableMoves > 6)
+ {
+ gSprites[0].invisible = FALSE;
+ gSprites[1].invisible = FALSE;
+ if (sMoveRelearner->scrollPositionMaybe == 0)
+ gSprites[0].invisible = TRUE;
+ else if (sMoveRelearner->scrollPositionMaybe == sMoveRelearner->numLearnableMoves - 6)
+ gSprites[1].invisible = TRUE;
+ }
+}
+
+static void MoveLearnerInitListMenu(void)
+{
+ sMoveRelearner->listMenuTaskId = ListMenuInit(&gMultiuseListMenuTemplate, sMoveRelearner->listMenuScrollPos, sMoveRelearner->listMenuScrollRow);
+ CopyWindowToVram(6, 1);
+}
+
+static void PrintMoveInfo(u16 move)
+{
+ u8 buffer[50];
+ BlitMoveInfoIcon(2, gBattleMoves[move].type + 1, 1, 4);
+
+ if (gBattleMoves[move].power < 2)
+ {
+ PrintTextOnWindow(3, gText_ThreeHyphens, 1, 4, 0, 0);
+ }
+ else
+ {
+ ConvertIntToDecimalStringN(buffer, gBattleMoves[move].power, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ PrintTextOnWindow(3, buffer, 1, 4, 0, 0);
+ }
+
+ if (gBattleMoves[move].accuracy == 0)
+ {
+ PrintTextOnWindow(3, gText_ThreeHyphens, 1, 18, 0, 1);
+ }
+ else
+ {
+ ConvertIntToDecimalStringN(buffer, gBattleMoves[move].accuracy, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ PrintTextOnWindow(3, buffer, 1, 18, 0, 1);
+ }
+ ConvertIntToDecimalStringN(buffer, gBattleMoves[move].pp, STR_CONV_MODE_LEFT_ALIGN, 2);
+ PrintTextOnWindow(4, buffer, 2, 2, 0, 0);
+ PrintTextOnWindow(5, gMoveDescriptionPointers[move - 1], 1, 0, 0, 0);
+}
+
+static void LoadMoveInfoUI(void)
+{
+ BlitMoveInfoIcon(0, 19, 1, 4);
+ BlitMoveInfoIcon(1, 20, 0, 4);
+ BlitMoveInfoIcon(1, 21, 0, 19);
+ BlitMoveInfoIcon(0, 22, 1, 19);
+ BlitMoveInfoIcon(0, 23, 1, 34);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ PutWindowTilemap(4);
+ PutWindowTilemap(3);
+ PutWindowTilemap(5);
+ PutWindowTilemap(2);
+ PutWindowTilemap(7);
+ CopyWindowToVram(0, 2);
+ CopyWindowToVram(1, 2);
+}
+
+static void PrintMoveInfoHandleCancel_CopyToVram(void)
+{
+ int i;
+ if (sMoveRelearner->selectedIndex != 0xFE)
+ {
+ PrintMoveInfo(sMoveRelearner->learnableMoves[sMoveRelearner->selectedIndex]);
+ }
+ else
+ {
+ for (i = 2; i < 6; i++)
+ {
+ FillWindowPixelBuffer(i, PIXEL_FILL(0));
+ CopyWindowToVram(i, 2);
+ }
+ }
+ CopyWindowToVram(3, 2);
+ CopyWindowToVram(4, 2);
+ CopyWindowToVram(2, 2);
+ CopyWindowToVram(2, 2);
+ CopyWindowToVram(5, 2);
+ CopyWindowToVram(7, 3);
+}
+
+static void MoveRelearnerMenu_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list)
+{
+ if (!onInit)
+ {
+ PlaySE(SE_SELECT);
+ sMoveRelearner->scheduleMoveInfoUpdate = TRUE;
+ sMoveRelearner->selectedIndex = itemIndex;
+ }
+}
+
+static s8 YesNoMenuProcessInput(void)
+{
+ s8 input = Menu_ProcessInputNoWrapClearOnChoose();
+ if (input != -2)
+ {
+ PutWindowTilemap(6);
+ CopyWindowToVram(6, 1);
+ }
+ return input;
+}
+
+static void PrintTextOnWindow(u8 windowId, const u8 *str, u8 x, u8 y, s32 speed, s32 colorIdx)
+{
+ s32 letterSpacing = 1;
+ s32 lineSpacing = 1;
+ if (colorIdx == 0 || colorIdx == 1)
+ {
+ letterSpacing = 0;
+ lineSpacing = 0;
+ }
+ switch (colorIdx)
+ {
+ case 0:
+ case 1:
+ sMoveRelearner->textColor[0] = 0;
+ sMoveRelearner->textColor[1] = 2;
+ sMoveRelearner->textColor[2] = 3;
+ break;
+ case 2:
+ sMoveRelearner->textColor[0] = 1;
+ sMoveRelearner->textColor[1] = 2;
+ sMoveRelearner->textColor[2] = 3;
+ }
+ if (colorIdx != 1)
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(sMoveRelearner->textColor[0]));
+ AddTextPrinterParameterized4(windowId, 3, x, y, letterSpacing, lineSpacing, sMoveRelearner->textColor, speed, str);
+}
diff --git a/sym_ewram.txt b/sym_ewram.txt
index 27b3067ec..a892eb532 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -447,9 +447,8 @@ gUnknown_2039A34: @ 2039A34
gUnknown_203AAB0: @ 203AAB0
.space 0x4
-gUnknown_203AAB4: @ 203AAB4
- .space 0x4
-
+ .align 2
+ .include "src/learn_move.o"
.align 2
.include "src/battle_tower.o"
.align 2