summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCameron Hall <camthesaxman@users.noreply.github.com>2016-10-06 23:53:33 -0500
committerYamaArashi <YamaArashi@users.noreply.github.com>2016-10-06 21:53:33 -0700
commit3634e8edc2f1e732e1139a71fb2ea6a357027220 (patch)
tree0a25092b18cfae01023bc18542d45abed3542645
parent7bfb307a68458b89ef4eb42716a98f86a47280a1 (diff)
decompile starter chooser (#55)
-rw-r--r--asm/rom5.s1067
-rw-r--r--asm/rom6.s4
-rw-r--r--data/data2.s23
-rw-r--r--ld_script.txt1
-rw-r--r--src/starter_choose.c434
5 files changed, 457 insertions, 1072 deletions
diff --git a/asm/rom5.s b/asm/rom5.s
index 523bf8a4c..b1ebc4e1c 100644
--- a/asm/rom5.s
+++ b/asm/rom5.s
@@ -14921,7 +14921,7 @@ sub_8082168: @ 8082168
pop {r0}
bx r0
.align 2, 0
-_0808217C: .4byte sub_8109E80
+_0808217C: .4byte CB2_ChooseStarter
_08082180: .4byte gMain
_08082184: .4byte sub_8082188
thumb_func_end sub_8082168
@@ -14936,7 +14936,7 @@ sub_8082188: @ 8082188
ldrh r1, [r2]
strh r1, [r0]
ldrh r0, [r2]
- bl sub_8109E50
+ bl GetStarterPokemon
lsls r0, 16
lsrs r0, 16
movs r1, 0
@@ -44865,8 +44865,8 @@ _08090D34: .4byte 0x0000064e
_08090D38: .4byte 0x06007aca
thumb_func_end sub_8090C68
- thumb_func_start sub_8090D3C
-sub_8090D3C: @ 8090D3C
+ thumb_func_start GetPokemonCategory
+GetPokemonCategory: @ 8090D3C
adds r1, r0, 0
lsls r1, 16
lsrs r1, 16
@@ -44878,7 +44878,7 @@ sub_8090D3C: @ 8090D3C
bx lr
.align 2, 0
_08090D50: .4byte gPokedexEntries
- thumb_func_end sub_8090D3C
+ thumb_func_end GetPokemonCategory
thumb_func_start sub_8090D54
sub_8090D54: @ 8090D54
@@ -294608,1061 +294608,4 @@ sub_8109E34: @ 8109E34
_08109E4C: .4byte sub_8109B7C
thumb_func_end sub_8109E34
- thumb_func_start sub_8109E50
-sub_8109E50: @ 8109E50
- push {lr}
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0x3
- bls _08109E5C
- movs r1, 0
-_08109E5C:
- ldr r0, _08109E68
- lsls r1, 1
- adds r1, r0
- ldrh r0, [r1]
- pop {r1}
- bx r1
- .align 2, 0
-_08109E68: .4byte gUnknown_083F76C4
- thumb_func_end sub_8109E50
-
- thumb_func_start sub_8109E6C
-sub_8109E6C: @ 8109E6C
- push {lr}
- bl LoadOam
- bl ProcessSpriteCopyRequests
- bl TransferPlttBuffer
- pop {r0}
- bx r0
- thumb_func_end sub_8109E6C
-
- thumb_func_start sub_8109E80
-sub_8109E80: @ 8109E80
- push {r4-r6,lr}
- mov r6, r10
- mov r5, r9
- mov r4, r8
- push {r4-r6}
- sub sp, 0xC
- movs r0, 0
- bl SetVBlankCallback
- movs r0, 0x80
- lsls r0, 19
- mov r10, r0
- movs r1, 0
- strh r1, [r0]
- ldr r6, _0810A08C
- strh r1, [r6]
- ldr r3, _0810A090
- mov r8, r3
- strh r1, [r3]
- adds r0, 0xA
- strh r1, [r0]
- ldr r5, _0810A094
- strh r1, [r5]
- adds r0, 0x12
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- subs r0, 0x6
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- subs r0, 0x6
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- subs r0, 0x6
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- add r0, sp, 0x4
- strh r1, [r0]
- ldr r2, _0810A098
- str r0, [r2]
- movs r1, 0xC0
- lsls r1, 19
- str r1, [r2, 0x4]
- ldr r0, _0810A09C
- str r0, [r2, 0x8]
- ldr r0, [r2, 0x8]
- movs r0, 0
- mov r9, r0
- str r0, [sp, 0x8]
- add r0, sp, 0x8
- str r0, [r2]
- movs r0, 0xE0
- lsls r0, 19
- str r0, [r2, 0x4]
- ldr r0, _0810A0A0
- str r0, [r2, 0x8]
- ldr r0, [r2, 0x8]
- add r0, sp, 0x4
- mov r3, r9
- strh r3, [r0]
- str r0, [r2]
- movs r0, 0xA0
- lsls r0, 19
- str r0, [r2, 0x4]
- ldr r0, _0810A0A4
- str r0, [r2, 0x8]
- ldr r0, [r2, 0x8]
- ldr r0, _0810A0A8
- bl LZ77UnCompVram
- ldr r0, _0810A0AC
- ldr r1, _0810A0B0
- bl LZ77UnCompVram
- ldr r0, _0810A0B4
- ldr r1, _0810A0B8
- bl LZ77UnCompVram
- bl remove_some_task
- bl ResetTasks
- bl ResetSpriteData
- bl ResetPaletteFade
- bl FreeAllSpritePalettes
- ldr r0, _0810A0BC
- movs r1, 0
- movs r2, 0x40
- bl LoadPalette
- ldr r0, _0810A0C0
- bl LoadCompressedObjectPic
- ldr r0, _0810A0C4
- bl LoadCompressedObjectPic
- ldr r0, _0810A0C8
- bl LoadSpritePalettes
- ldr r0, _0810A0CC
- bl SetUpWindowConfig
- ldr r0, _0810A0D0
- bl InitMenuWindow
- movs r0, 0x1
- negs r0, r0
- mov r1, r9
- str r1, [sp]
- movs r1, 0
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
- ldr r3, _0810A0D4
- ldrh r2, [r3]
- mov r0, r9
- strh r0, [r3]
- ldr r4, _0810A0D8
- ldrh r0, [r4]
- movs r1, 0x1
- orrs r0, r1
- strh r0, [r4]
- strh r2, [r3]
- ldr r2, _0810A0DC
- ldrh r0, [r2]
- movs r1, 0x8
- orrs r0, r1
- strh r0, [r2]
- ldr r0, _0810A0E0
- bl SetVBlankCallback
- ldr r0, _0810A0E4
- bl SetMainCallback2
- ldr r1, _0810A0E8
- movs r0, 0x3F
- strh r0, [r1]
- adds r1, 0x2
- movs r0, 0x1F
- strh r0, [r1]
- ldr r0, _0810A0EC
- mov r1, r9
- strh r1, [r0]
- adds r0, 0x4
- strh r1, [r0]
- ldr r1, _0810A0F0
- movs r0, 0xFE
- strh r0, [r1]
- ldr r0, _0810A0F4
- mov r3, r9
- strh r3, [r0]
- adds r1, 0x4
- movs r0, 0x7
- strh r0, [r1]
- ldr r1, _0810A0F8
- adds r0, r1, 0
- strh r0, [r6]
- ldr r3, _0810A0FC
- adds r0, r3, 0
- mov r1, r8
- strh r0, [r1]
- ldr r3, _0810A100
- adds r0, r3, 0
- strh r0, [r5]
- movs r1, 0xF5
- lsls r1, 6
- adds r0, r1, 0
- mov r3, r10
- strh r0, [r3]
- ldr r0, _0810A104
- movs r1, 0
- bl CreateTask
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- ldr r1, _0810A108
- lsls r0, r4, 2
- adds r0, r4
- lsls r0, 3
- adds r0, r1
- movs r1, 0x1
- mov r10, r1
- mov r3, r10
- strh r3, [r0, 0x8]
- ldr r0, _0810A10C
- movs r1, 0x78
- movs r2, 0x38
- movs r3, 0x2
- bl CreateSprite
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _0810A110
- mov r8, r1
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- add r1, r8
- strh r4, [r1, 0x2E]
- ldr r6, _0810A114
- ldr r5, _0810A118
- ldrb r1, [r5]
- ldrb r2, [r5, 0x1]
- adds r0, r6, 0
- movs r3, 0x2
- bl CreateSprite
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- add r1, r8
- strh r4, [r1, 0x2E]
- mov r3, r9
- strh r3, [r1, 0x30]
- ldrb r1, [r5, 0x2]
- ldrb r2, [r5, 0x3]
- adds r0, r6, 0
- movs r3, 0x2
- bl CreateSprite
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- add r1, r8
- strh r4, [r1, 0x2E]
- mov r0, r10
- strh r0, [r1, 0x30]
- ldrb r1, [r5, 0x4]
- ldrb r2, [r5, 0x5]
- adds r0, r6, 0
- movs r3, 0x2
- bl CreateSprite
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- add r1, r8
- strh r4, [r1, 0x2E]
- movs r0, 0x2
- strh r0, [r1, 0x30]
- add sp, 0xC
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0810A08C: .4byte REG_BG3CNT
-_0810A090: .4byte REG_BG2CNT
-_0810A094: .4byte REG_BG0CNT
-_0810A098: .4byte 0x040000d4
-_0810A09C: .4byte 0x8100c000
-_0810A0A0: .4byte 0x85000100
-_0810A0A4: .4byte 0x81000200
-_0810A0A8: .4byte gUnknown_083F66F0
-_0810A0AC: .4byte gBirchBagTilemap
-_0810A0B0: .4byte 0x06003000
-_0810A0B4: .4byte gBirchGrassTilemap
-_0810A0B8: .4byte 0x06003800
-_0810A0BC: .4byte gUnknown_083F62EC
-_0810A0C0: .4byte gUnknown_083F7794
-_0810A0C4: .4byte gUnknown_083F77A4
-_0810A0C8: .4byte gUnknown_083F77B4
-_0810A0CC: .4byte gWindowConfig_81E6C3C
-_0810A0D0: .4byte gWindowConfig_81E6CE4
-_0810A0D4: .4byte 0x04000208
-_0810A0D8: .4byte 0x04000200
-_0810A0DC: .4byte REG_DISPSTAT
-_0810A0E0: .4byte sub_8109E6C
-_0810A0E4: .4byte sub_810A11C
-_0810A0E8: .4byte REG_WININ
-_0810A0EC: .4byte REG_WIN0H
-_0810A0F0: .4byte REG_BLDCNT
-_0810A0F4: .4byte REG_BLDALPHA
-_0810A0F8: .4byte 0x00000703
-_0810A0FC: .4byte 0x00000602
-_0810A100: .4byte 0x00001f08
-_0810A104: .4byte sub_810A134
-_0810A108: .4byte gTasks
-_0810A10C: .4byte gSpriteTemplate_83F77CC
-_0810A110: .4byte gSprites
-_0810A114: .4byte gSpriteTemplate_83F77E4
-_0810A118: .4byte gUnknown_083F76B8
- thumb_func_end sub_8109E80
-
- thumb_func_start sub_810A11C
-sub_810A11C: @ 810A11C
- push {lr}
- bl RunTasks
- bl AnimateSprites
- bl BuildOamBuffer
- bl UpdatePaletteFade
- pop {r0}
- bx r0
- thumb_func_end sub_810A11C
-
- thumb_func_start sub_810A134
-sub_810A134: @ 810A134
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _0810A16C
- lsls r4, r0, 2
- adds r4, r0
- lsls r4, 3
- adds r4, r1
- ldrb r1, [r4, 0x8]
- movs r0, 0xFF
- bl sub_810A42C
- movs r0, 0x2
- movs r1, 0xE
- movs r2, 0x1B
- movs r3, 0x13
- bl MenuDrawTextWindow
- ldr r0, _0810A170
- movs r1, 0x3
- movs r2, 0xF
- bl MenuPrint
- ldr r0, _0810A174
- str r0, [r4]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0810A16C: .4byte gTasks
-_0810A170: .4byte gOtherText_BirchInTrouble
-_0810A174: .4byte sub_810A178
- thumb_func_end sub_810A134
-
- thumb_func_start sub_810A178
-sub_810A178: @ 810A178
- push {r4-r7,lr}
- lsls r0, 24
- lsrs r5, r0, 24
- ldr r2, _0810A218
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 3
- adds r6, r0, r2
- ldrh r7, [r6, 0x8]
- ldrb r4, [r6, 0x8]
- ldr r1, _0810A21C
- ldrh r3, [r1, 0x2E]
- movs r0, 0x1
- ands r0, r3
- cmp r0, 0
- beq _0810A240
- ldr r1, _0810A220
- lsls r4, 1
- adds r0, r4, r1
- ldrb r0, [r0]
- adds r1, 0x1
- adds r1, r4, r1
- ldrb r1, [r1]
- adds r2, r0, 0
- adds r2, 0xD
- lsls r2, 24
- lsrs r2, 24
- adds r3, r1, 0x3
- lsls r3, 24
- lsrs r3, 24
- bl MenuZeroFillWindowRect
- ldr r0, _0810A224
- movs r1, 0
- strh r1, [r0]
- adds r0, 0x4
- strh r1, [r0]
- ldr r0, _0810A228
- ldr r1, _0810A22C
- adds r2, r4, r1
- ldrb r5, [r2]
- adds r1, 0x1
- adds r4, r1
- ldrb r4, [r4]
- adds r1, r5, 0
- adds r2, r4, 0
- movs r3, 0x1
- bl CreateSprite
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r6, 0xC]
- ldrh r0, [r6, 0x8]
- bl sub_8109E50
- lsls r0, 16
- lsrs r0, 16
- adds r1, r5, 0
- adds r2, r4, 0
- bl sub_810A580
- lsls r0, 24
- lsrs r0, 24
- ldr r4, _0810A230
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- adds r2, r4, 0
- adds r2, 0x10
- adds r2, r1, r2
- ldr r3, _0810A234
- str r3, [r2]
- adds r4, 0x1C
- adds r1, r4
- ldr r2, _0810A238
- str r2, [r1]
- strh r0, [r6, 0xA]
- ldr r0, _0810A23C
- str r0, [r6]
- b _0810A282
- .align 2, 0
-_0810A218: .4byte gTasks
-_0810A21C: .4byte gMain
-_0810A220: .4byte gUnknown_083F76BE
-_0810A224: .4byte REG_WIN0H
-_0810A228: .4byte gSpriteTemplate_83F77FC
-_0810A22C: .4byte gUnknown_083F76B8
-_0810A230: .4byte gSprites
-_0810A234: .4byte gUnknown_083F778C
-_0810A238: .4byte sub_810A6C4
-_0810A23C: .4byte sub_810A288
-_0810A240:
- movs r0, 0x20
- ands r0, r3
- cmp r0, 0
- beq _0810A25C
- cmp r4, 0
- beq _0810A25C
- subs r1, r7, 0x1
- strh r1, [r6, 0x8]
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl sub_810A42C
- b _0810A282
-_0810A25C:
- ldrh r1, [r1, 0x2E]
- movs r0, 0x10
- ands r0, r1
- cmp r0, 0
- beq _0810A282
- cmp r4, 0x1
- bhi _0810A282
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 3
- adds r0, r2
- ldrh r1, [r0, 0x8]
- adds r1, 0x1
- strh r1, [r0, 0x8]
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl sub_810A42C
-_0810A282:
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_810A178
-
- thumb_func_start sub_810A288
-sub_810A288: @ 810A288
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r3, _0810A2CC
- ldr r2, _0810A2D0
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r2, r1, r2
- movs r0, 0xC
- ldrsh r1, [r2, r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r1, r0, r3
- adds r0, r1, 0
- adds r0, 0x3F
- ldrb r0, [r0]
- lsls r0, 26
- cmp r0, 0
- bge _0810A2C6
- movs r3, 0x20
- ldrsh r0, [r1, r3]
- cmp r0, 0x78
- bne _0810A2C6
- movs r3, 0x22
- ldrsh r0, [r1, r3]
- cmp r0, 0x40
- bne _0810A2C6
- ldr r0, _0810A2D4
- str r0, [r2]
-_0810A2C6:
- pop {r0}
- bx r0
- .align 2, 0
-_0810A2CC: .4byte gSprites
-_0810A2D0: .4byte gTasks
-_0810A2D4: .4byte sub_810A2D8
- thumb_func_end sub_810A288
-
- thumb_func_start sub_810A2D8
-sub_810A2D8: @ 810A2D8
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _0810A324
- lsls r4, r0, 2
- adds r4, r0
- lsls r4, 3
- adds r4, r1
- ldrh r0, [r4, 0x8]
- bl sub_8109E50
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0
- bl PlayCry1
- movs r0, 0x2
- movs r1, 0xE
- movs r2, 0x1B
- movs r3, 0x13
- bl MenuDrawTextWindow
- ldr r0, _0810A328
- movs r1, 0x3
- movs r2, 0xF
- bl MenuPrint
- movs r0, 0x15
- movs r1, 0x7
- movs r2, 0x1
- bl DisplayYesNoMenu
- ldr r0, _0810A32C
- str r0, [r4]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0810A324: .4byte gTasks
-_0810A328: .4byte gOtherText_DoYouChoosePoke
-_0810A32C: .4byte sub_810A330
- thumb_func_end sub_810A2D8
-
- thumb_func_start sub_810A330
-sub_810A330: @ 810A330
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- bl ProcessMenuInputNoWrap_
- lsls r0, 24
- asrs r1, r0, 24
- cmp r1, 0
- beq _0810A356
- cmp r1, 0
- bgt _0810A350
- movs r0, 0x1
- negs r0, r0
- cmp r1, r0
- beq _0810A37C
- b _0810A3E2
-_0810A350:
- cmp r1, 0x1
- beq _0810A37C
- b _0810A3E2
-_0810A356:
- ldr r2, _0810A370
- ldr r1, _0810A374
- lsls r0, r4, 2
- adds r0, r4
- lsls r0, 3
- adds r0, r1
- ldrh r0, [r0, 0x8]
- strh r0, [r2]
- ldr r0, _0810A378
- ldr r0, [r0, 0x8]
- bl SetMainCallback2
- b _0810A3E2
- .align 2, 0
-_0810A370: .4byte gScriptResult
-_0810A374: .4byte gTasks
-_0810A378: .4byte gMain
-_0810A37C:
- movs r0, 0x5
- bl PlaySE
- movs r0, 0x15
- movs r1, 0x7
- movs r2, 0x1B
- movs r3, 0xC
- bl MenuZeroFillWindowRect
- ldr r0, _0810A3E8
- lsls r5, r4, 2
- adds r5, r4
- lsls r5, 3
- adds r5, r0
- ldrb r0, [r5, 0xA]
- ldr r6, _0810A3EC
- lsls r4, r0, 4
- adds r4, r0
- lsls r4, 2
- adds r4, r6
- ldrb r0, [r4, 0x5]
- lsrs r0, 4
- bl GetSpritePaletteTagByPaletteNum
- lsls r0, 16
- lsrs r0, 16
- bl FreeSpritePaletteByTag
- ldrb r0, [r4, 0x3]
- lsls r0, 26
- lsrs r0, 27
- bl FreeOamMatrix
- adds r0, r4, 0
- bl DestroySprite
- ldrb r0, [r5, 0xC]
- lsls r4, r0, 4
- adds r4, r0
- lsls r4, 2
- adds r4, r6
- ldrb r0, [r4, 0x3]
- lsls r0, 26
- lsrs r0, 27
- bl FreeOamMatrix
- adds r0, r4, 0
- bl DestroySprite
- ldr r0, _0810A3F0
- str r0, [r5]
-_0810A3E2:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0810A3E8: .4byte gTasks
-_0810A3EC: .4byte gSprites
-_0810A3F0: .4byte sub_810A3F4
- thumb_func_end sub_810A330
-
- thumb_func_start sub_810A3F4
-sub_810A3F4: @ 810A3F4
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _0810A408
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- ldr r0, _0810A40C
- str r0, [r1]
- bx lr
- .align 2, 0
-_0810A408: .4byte gTasks
-_0810A40C: .4byte sub_810A134
- thumb_func_end sub_810A3F4
-
- thumb_func_start sub_810A410
-sub_810A410: @ 810A410
- push {r4,lr}
- movs r4, 0xFC
- strb r4, [r0]
- adds r0, 0x1
- movs r4, 0x4
- strb r4, [r0]
- adds r0, 0x1
- strb r2, [r0]
- adds r0, 0x1
- strb r1, [r0]
- strb r3, [r0, 0x1]
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_810A410
-
- thumb_func_start sub_810A42C
-sub_810A42C: @ 810A42C
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x48
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r6, r1, 24
- cmp r0, 0xFF
- beq _0810A46A
- ldr r1, _0810A568
- lsls r2, r0, 1
- adds r0, r2, r1
- ldrb r0, [r0]
- adds r1, 0x1
- adds r2, r1
- ldrb r1, [r2]
- adds r2, r0, 0
- adds r2, 0xD
- lsls r2, 24
- lsrs r2, 24
- adds r3, r1, 0x3
- lsls r3, 24
- lsrs r3, 24
- bl MenuZeroFillWindowRect
- ldr r0, _0810A56C
- movs r1, 0
- strh r1, [r0]
- adds r0, 0x4
- strh r1, [r0]
-_0810A46A:
- adds r0, r6, 0
- bl sub_8109E50
- lsls r0, 16
- lsrs r7, r0, 16
- adds r0, r7, 0
- bl SpeciesToNationalPokedexNum
- lsls r0, 16
- lsrs r0, 16
- bl sub_8090D3C
- adds r5, r0, 0
- mov r0, sp
- movs r1, 0
- movs r2, 0xF
- movs r3, 0x8
- bl sub_810A410
- movs r4, 0x5
- mov r2, sp
- adds r2, 0x5
- movs r0, 0xFC
- strb r0, [r2]
- mov r1, sp
- adds r1, 0x6
- movs r0, 0x11
- strb r0, [r1]
- mov r0, sp
- adds r0, 0x7
- strb r4, [r0]
- movs r4, 0x8
- movs r3, 0
- ldrb r0, [r5]
- mov r8, r2
- lsls r6, 1
- cmp r0, 0xFF
- beq _0810A4D8
-_0810A4B6:
- mov r0, sp
- adds r1, r0, r4
- adds r0, r5, r3
- ldrb r0, [r0]
- strb r0, [r1]
- adds r0, r3, 0x1
- lsls r0, 24
- lsrs r3, r0, 24
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- adds r0, r5, r3
- ldrb r0, [r0]
- cmp r0, 0xFF
- beq _0810A4D8
- cmp r3, 0xA
- bls _0810A4B6
-_0810A4D8:
- adds r1, r4, 0
- adds r0, r1, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- add r1, sp
- movs r0, 0
- strb r0, [r1]
- mov r1, sp
- adds r0, r1, r4
- ldr r1, _0810A570
- bl StringCopy
- ldr r0, _0810A568
- adds r1, r6, r0
- ldrb r4, [r1]
- adds r0, 0x1
- adds r0, r6, r0
- ldrb r5, [r0]
- mov r0, sp
- adds r1, r4, 0
- adds r2, r5, 0
- bl MenuPrint
- mov r0, sp
- movs r1, 0
- movs r2, 0xF
- movs r3, 0x8
- bl sub_810A410
- movs r0, 0xB
- adds r1, r7, 0
- muls r1, r0
- ldr r0, _0810A574
- adds r1, r0
- mov r0, r8
- movs r2, 0x6B
- movs r3, 0x1
- bl sub_8072C74
- adds r2, r5, 0x2
- lsls r2, 24
- lsrs r2, 24
- mov r0, sp
- adds r1, r4, 0
- bl MenuPrint
- lsls r0, r4, 3
- adds r0, 0x4
- lsls r0, 24
- adds r4, 0xD
- lsls r4, 3
- adds r4, 0x4
- lsls r4, 24
- lsrs r4, 24
- lsls r1, r5, 27
- adds r5, 0x4
- lsls r5, 27
- lsrs r5, 24
- ldr r2, _0810A56C
- lsrs r0, 16
- orrs r0, r4
- strh r0, [r2]
- ldr r0, _0810A578
- lsrs r1, 16
- orrs r1, r5
- strh r1, [r0]
- add sp, 0x48
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0810A568: .4byte gUnknown_083F76BE
-_0810A56C: .4byte REG_WIN0H
-_0810A570: .4byte gOtherText_Poke
-_0810A574: .4byte gSpeciesNames
-_0810A578: .4byte REG_WIN0V
- thumb_func_end sub_810A42C
-
- thumb_func_start nullsub_72
-nullsub_72: @ 810A57C
- bx lr
- thumb_func_end nullsub_72
-
- thumb_func_start sub_810A580
-sub_810A580: @ 810A580
- push {r4-r6,lr}
- mov r6, r9
- mov r5, r8
- push {r5,r6}
- sub sp, 0x8
- adds r5, r0, 0
- mov r8, r1
- mov r9, r2
- lsls r5, 16
- lsrs r5, 16
- mov r0, r8
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- mov r0, r9
- lsls r0, 24
- lsrs r0, 24
- mov r9, r0
- lsls r6, r5, 3
- ldr r0, _0810A610
- adds r0, r6, r0
- ldr r1, _0810A614
- lsls r2, r5, 2
- adds r2, r1
- ldrb r1, [r2]
- ldrb r2, [r2, 0x1]
- ldr r4, _0810A618
- ldr r3, [r4]
- ldr r4, [r4, 0x4]
- str r4, [sp]
- str r5, [sp, 0x4]
- bl DecompressPicFromTable_2
- ldr r0, _0810A61C
- adds r6, r0
- adds r0, r6, 0
- bl LoadCompressedObjectPalette
- adds r0, r5, 0
- movs r1, 0x1
- bl GetMonSpriteTemplate_803C56C
- ldr r0, _0810A620
- mov r1, r8
- mov r2, r9
- movs r3, 0
- bl CreateSprite
- lsls r0, 24
- lsrs r0, 24
- ldr r4, _0810A624
- lsls r2, r0, 4
- adds r2, r0
- lsls r2, 2
- adds r1, r4, 0
- adds r1, 0x1C
- adds r1, r2, r1
- ldr r3, _0810A628
- str r3, [r1]
- adds r2, r4
- ldrb r3, [r2, 0x5]
- movs r1, 0xD
- negs r1, r1
- ands r1, r3
- strb r1, [r2, 0x5]
- add sp, 0x8
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_0810A610: .4byte gMonFrontPicTable
-_0810A614: .4byte gMonFrontPicCoords
-_0810A618: .4byte gUnknown_081FAF4C
-_0810A61C: .4byte gMonPaletteTable
-_0810A620: .4byte gUnknown_02024E8C
-_0810A624: .4byte gSprites
-_0810A628: .4byte nullsub_72
- thumb_func_end sub_810A580
-
- thumb_func_start sub_810A62C
-sub_810A62C: @ 810A62C
- push {r4,lr}
- adds r4, r0, 0
- ldr r2, _0810A684
- ldr r3, _0810A688
- movs r0, 0x2E
- ldrsh r1, [r4, r0]
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 3
- adds r0, r3
- movs r1, 0x8
- ldrsh r0, [r0, r1]
- lsls r0, 1
- adds r0, r2
- ldrb r0, [r0]
- strh r0, [r4, 0x20]
- movs r0, 0x2E
- ldrsh r1, [r4, r0]
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 3
- adds r0, r3
- movs r1, 0x8
- ldrsh r0, [r0, r1]
- lsls r0, 1
- adds r2, 0x1
- adds r0, r2
- ldrb r0, [r0]
- strh r0, [r4, 0x22]
- movs r1, 0x30
- ldrsh r0, [r4, r1]
- movs r1, 0x8
- bl Sin
- strh r0, [r4, 0x26]
- ldrh r0, [r4, 0x30]
- lsls r0, 24
- lsrs r0, 24
- adds r0, 0x4
- strh r0, [r4, 0x30]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0810A684: .4byte gUnknown_083F76E4
-_0810A688: .4byte gTasks
- thumb_func_end sub_810A62C
-
- thumb_func_start sub_810A68C
-sub_810A68C: @ 810A68C
- push {lr}
- adds r3, r0, 0
- ldr r2, _0810A6B4
- movs r0, 0x2E
- ldrsh r1, [r3, r0]
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 3
- adds r0, r2
- movs r2, 0x8
- ldrsh r1, [r0, r2]
- movs r2, 0x30
- ldrsh r0, [r3, r2]
- cmp r1, r0
- bne _0810A6B8
- adds r0, r3, 0
- movs r1, 0x1
- bl StartSpriteAnimIfDifferent
- b _0810A6C0
- .align 2, 0
-_0810A6B4: .4byte gTasks
-_0810A6B8:
- adds r0, r3, 0
- movs r1, 0
- bl StartSpriteAnimIfDifferent
-_0810A6C0:
- pop {r0}
- bx r0
- thumb_func_end sub_810A68C
-
- thumb_func_start sub_810A6C4
-sub_810A6C4: @ 810A6C4
- push {lr}
- adds r1, r0, 0
- ldrh r2, [r1, 0x20]
- movs r3, 0x20
- ldrsh r0, [r1, r3]
- cmp r0, 0x78
- ble _0810A6D6
- subs r0, r2, 0x4
- strh r0, [r1, 0x20]
-_0810A6D6:
- ldrh r2, [r1, 0x20]
- movs r3, 0x20
- ldrsh r0, [r1, r3]
- cmp r0, 0x77
- bgt _0810A6E4
- adds r0, r2, 0x4
- strh r0, [r1, 0x20]
-_0810A6E4:
- ldrh r2, [r1, 0x22]
- movs r3, 0x22
- ldrsh r0, [r1, r3]
- cmp r0, 0x40
- ble _0810A6F2
- subs r0, r2, 0x2
- strh r0, [r1, 0x22]
-_0810A6F2:
- ldrh r2, [r1, 0x22]
- movs r3, 0x22
- ldrsh r0, [r1, r3]
- cmp r0, 0x3F
- bgt _0810A700
- adds r0, r2, 0x2
- strh r0, [r1, 0x22]
-_0810A700:
- pop {r0}
- bx r0
- thumb_func_end sub_810A6C4
-
.align 2, 0 @ Don't pad with nop.
diff --git a/asm/rom6.s b/asm/rom6.s
index 165c8b229..038db98db 100644
--- a/asm/rom6.s
+++ b/asm/rom6.s
@@ -8694,7 +8694,7 @@ sub_810F694: @ 810F694
bl VarGet
lsls r0, 16
lsrs r0, 16
- bl sub_8109E50
+ bl GetStarterPokemon
lsls r0, 16
lsrs r6, r0, 16
bl CalculatePlayerPartyCount
@@ -118856,7 +118856,7 @@ sub_81458DC: @ 81458DC
bl VarGet
lsls r0, 16
lsrs r0, 16
- bl sub_8109E50
+ bl GetStarterPokemon
lsls r0, 16
lsrs r0, 16
bl SpeciesToNationalPokedexNum
diff --git a/data/data2.s b/data/data2.s
index 4c976cd75..21a0c4c5a 100644
--- a/data/data2.s
+++ b/data/data2.s
@@ -23922,15 +23922,22 @@ gBirchBallarrow_Gfx::
gBirchCircle_Gfx::
.incbin "graphics/misc/birch_circle.4bpp.lz"
-gUnknown_083F76B8:: @ 83F76B8
- .incbin "baserom.gba", 0x003f76b8, 0x6
+gStarterChoose_PokeballCoords:: @ 83F76B8
+ .byte 60, 64
+ .byte 120, 88
+ .byte 692, 64
-gUnknown_083F76BE:: @ 83F76BE
- .incbin "baserom.gba", 0x003f76be, 0x6
-
-gUnknown_083F76C4:: @ 83F76C4
- .incbin "baserom.gba", 0x003f76c4, 0x8
+gStarterChoose_LabelCoords:: @ 83F76BE
+ .byte 0, 9
+ .byte 16, 10
+ .byte 8, 4
+gStarterMons:: @ 83F76C4
+ .2byte SPECIES_TREECKO
+ .2byte SPECIES_TORCHIC
+ .2byte SPECIES_MUDKIP
+ .2byte 0
+
.align 2
gOamData_83F76CC:: @ 83F76CC
.2byte 0x00A0
@@ -24042,7 +24049,7 @@ gSpriteTemplate_83F77E4:: @ 83F77E4
.align 2
gSpriteTemplate_83F77FC:: @ 83F77FC
- spr_template 4097, 4097, gOamData_83F76DC, gSpriteAnimTable_83F7758, NULL, gSpriteAffineAnimTable_83F7790, sub_810A6C4
+ spr_template 4097, 4097, gOamData_83F76DC, gSpriteAnimTable_83F7758, NULL, gSpriteAffineAnimTable_83F7790, StarterPokemonSpriteAnimCallback
@ 83F7814
ClockGfx_Misc:
diff --git a/ld_script.txt b/ld_script.txt
index ae47a7157..e9aec19af 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -72,6 +72,7 @@ SECTIONS {
asm/rom_8074BAC.o(.text);
src/task.o(.text);
asm/rom5.o(.text);
+ src/starter_choose.o(.text);
src/wallclock.o(.text);
asm/rom6.o(.text);
} =0
diff --git a/src/starter_choose.c b/src/starter_choose.c
new file mode 100644
index 000000000..0bb6c88b4
--- /dev/null
+++ b/src/starter_choose.c
@@ -0,0 +1,434 @@
+#include "gba/gba.h"
+#include "main.h"
+#include "menu.h"
+#include "palette.h"
+#include "pokemon.h"
+#include "songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+#include "trig.h"
+
+//Functions that need to be put in headers
+void LZ77UnCompVram(const void *src, void *dest);
+void remove_some_task(void);
+void LoadCompressedObjectPic(void *);
+void LoadCompressedObjectPalette(const struct SpritePalette *);
+u16 SpeciesToNationalPokedexNum(u16);
+void DecompressPicFromTable_2(const struct SpriteSheet *, u8, u8, void *, void *, u32);
+
+struct MonCoords
+{
+ u8 x, y;
+};
+
+extern void * const gUnknown_081FAF4C[];
+extern const u8 gStarterChoose_PokeballCoords[][2];
+extern u8 gUnknown_083F66F0[];
+extern u8 gBirchBagTilemap[];
+extern u8 gBirchGrassTilemap[];
+extern u8 gUnknown_083F7794[];
+extern u8 gUnknown_083F77A4[];
+extern u8 gUnknown_083F62EC[];
+extern const u8 gStarterChoose_LabelCoords[][2];
+extern u16 gStarterMons[];
+extern union AffineAnimCmd *gUnknown_083F778C[];
+extern u8 gOtherText_DoYouChoosePoke[];
+extern u16 gScriptResult;
+extern u8 gSpeciesNames[][11];
+extern u8 gOtherText_Poke[];
+extern const struct SpriteSheet gMonFrontPicTable[];
+extern const struct MonCoords gMonFrontPicCoords[];
+extern const struct SpritePalette gMonPaletteTable[];
+extern u8 gUnknown_083F76E4[][2];
+extern u8 gOtherText_BirchInTrouble[];
+
+extern struct WindowConfig gWindowConfig_81E6C3C;
+extern struct WindowConfig gWindowConfig_81E6CE4;
+extern struct SpriteTemplate gSpriteTemplate_83F77E4;
+extern struct SpriteTemplate gSpriteTemplate_83F77CC;
+extern struct SpritePalette gUnknown_083F77B4[];
+extern struct SpriteTemplate gSpriteTemplate_83F77FC;
+extern struct SpriteTemplate gUnknown_02024E8C;
+
+u16 GetStarterPokemon(u16);
+static void MainCallback2(void);
+static void Task_StarterChoose1(u8 taskId);
+static void Task_StarterChoose2(u8 taskId);
+static void Task_StarterChoose3(u8 taskId);
+static void Task_StarterChoose4(u8 taskId);
+static void Task_StarterChoose5(u8 taskId);
+static void Task_StarterChoose6(u8 taskId);
+
+extern u8 *GetPokemonCategory(u16);
+static void CreateStarterPokemonLabel(u8, u8);
+static u8 CreatePokemonFrontSprite(u16, u8, u8);
+void StarterPokemonSpriteAnimCallback(struct Sprite *);
+
+//Task data
+enum {
+ TD_STARTERSELECTION,
+ TD_POKEMON_SPRITE,
+ TD_CIRCLE_SPRITE,
+};
+
+//Retrieves one of the available starter Pokemon
+u16 GetStarterPokemon(u16 n)
+{
+ if(n > 3)
+ n = 0;
+ return gStarterMons[n];
+}
+
+static void VblankCallback(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void CB2_ChooseStarter(void)
+{
+ u16 savedIme;
+ u8 taskId;
+ u8 spriteId;
+
+ SetVBlankCallback(NULL);
+
+ REG_DISPCNT = 0;
+ REG_BG3CNT = 0;
+ REG_BG2CNT = 0;
+ REG_BG1CNT = 0;
+ REG_BG0CNT = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+
+ DmaFill16(3, 0, VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, OAM, OAM_SIZE);
+ DmaFill16(3, 0, PLTT, PLTT_SIZE);
+
+ LZ77UnCompVram(&gUnknown_083F66F0, (void *)VRAM);
+ LZ77UnCompVram(&gBirchBagTilemap, (void *)(VRAM + 0x3000));
+ LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800));
+ remove_some_task();
+ ResetTasks();
+ ResetSpriteData();
+ ResetPaletteFade();
+ FreeAllSpritePalettes();
+ LoadPalette(gUnknown_083F62EC, 0, 0x40);
+ LoadCompressedObjectPic(gUnknown_083F7794);
+ LoadCompressedObjectPic(gUnknown_083F77A4);
+ LoadSpritePalettes(gUnknown_083F77B4);
+ SetUpWindowConfig(&gWindowConfig_81E6C3C);
+ InitMenuWindow(&gWindowConfig_81E6CE4);
+ BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+
+ savedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = savedIme;
+ REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
+
+ SetVBlankCallback(VblankCallback);
+ SetMainCallback2(MainCallback2);
+
+ REG_WININ = 0x3F;
+ REG_WINOUT = 0x1F;
+ REG_WIN0H = 0;
+ REG_WIN0V = 0;
+ REG_BLDCNT = 0xFE;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0x7;
+ REG_BG3CNT = 0x703;
+ REG_BG2CNT = 0x602;
+ REG_BG0CNT = 0x1F08;
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON;
+
+ taskId = CreateTask(Task_StarterChoose1, 0);
+ gTasks[taskId].data[TD_STARTERSELECTION] = 1;
+
+ //Create hand sprite
+ spriteId = CreateSprite(&gSpriteTemplate_83F77CC, 120, 56, 2);
+ gSprites[spriteId].data0 = taskId;
+
+ //Create three Pokeball sprites
+ spriteId = CreateSprite(
+ &gSpriteTemplate_83F77E4,
+ gStarterChoose_PokeballCoords[0][0], gStarterChoose_PokeballCoords[0][1], 2);
+ gSprites[spriteId].data0 = taskId;
+ gSprites[spriteId].data1 = 0;
+ spriteId = CreateSprite(
+ &gSpriteTemplate_83F77E4,
+ gStarterChoose_PokeballCoords[1][0], gStarterChoose_PokeballCoords[1][1], 2);
+ gSprites[spriteId].data0 = taskId;
+ gSprites[spriteId].data1 = 1;
+ spriteId = CreateSprite(
+ &gSpriteTemplate_83F77E4,
+ gStarterChoose_PokeballCoords[2][0], gStarterChoose_PokeballCoords[2][1], 2);
+ gSprites[spriteId].data0 = taskId;
+ gSprites[spriteId].data1 = 2;
+}
+
+static void MainCallback2(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void Task_StarterChoose1(u8 taskId)
+{
+ CreateStarterPokemonLabel(0xFF, gTasks[taskId].data[TD_STARTERSELECTION]);
+ MenuDrawTextWindow(2, 14, 27, 19);
+ MenuPrint(gOtherText_BirchInTrouble, 3, 15);
+ gTasks[taskId].func = Task_StarterChoose2;
+}
+
+static void Task_StarterChoose2(u8 taskId)
+{
+ u8 selection = gTasks[taskId].data[TD_STARTERSELECTION];
+
+ if(gMain.newKeys & A_BUTTON)
+ {
+ u8 spriteId;
+
+ MenuZeroFillWindowRect(
+ gStarterChoose_LabelCoords[selection][0],
+ gStarterChoose_LabelCoords[selection][1],
+ gStarterChoose_LabelCoords[selection][0] + 13,
+ gStarterChoose_LabelCoords[selection][1] + 3);
+
+ REG_WIN0H = 0;
+ REG_WIN0V = 0;
+
+ //Create white circle background
+ spriteId = CreateSprite(
+ &gSpriteTemplate_83F77FC,
+ gStarterChoose_PokeballCoords[selection][0],
+ gStarterChoose_PokeballCoords[selection][1],
+ 1);
+ gTasks[taskId].data[TD_CIRCLE_SPRITE] = spriteId;
+
+ //Create Pokemon sprite
+ spriteId = CreatePokemonFrontSprite(
+ GetStarterPokemon(gTasks[taskId].data[TD_STARTERSELECTION]),
+ gStarterChoose_PokeballCoords[selection][0],
+ gStarterChoose_PokeballCoords[selection][1]);
+ gSprites[spriteId].affineAnims = gUnknown_083F778C;
+ gSprites[spriteId].callback = StarterPokemonSpriteAnimCallback;
+ gTasks[taskId].data[TD_POKEMON_SPRITE] = spriteId;
+
+ gTasks[taskId].func = Task_StarterChoose3;
+ }
+ else
+ {
+ if((gMain.newKeys & DPAD_LEFT) && selection != 0)
+ {
+ gTasks[taskId].data[TD_STARTERSELECTION]--;
+ CreateStarterPokemonLabel(selection, gTasks[taskId].data[TD_STARTERSELECTION]);
+ }
+ else if((gMain.newKeys & DPAD_RIGHT) && selection <= 1)
+ {
+ gTasks[taskId].data[TD_STARTERSELECTION]++;
+ CreateStarterPokemonLabel(selection, gTasks[taskId].data[TD_STARTERSELECTION]);
+ }
+ }
+}
+
+static void Task_StarterChoose3(u8 taskId)
+{
+ if(gSprites[gTasks[taskId].data[TD_CIRCLE_SPRITE]].affineAnimEnded &&
+ gSprites[gTasks[taskId].data[TD_CIRCLE_SPRITE]].pos1.x == 120 &&
+ gSprites[gTasks[taskId].data[TD_CIRCLE_SPRITE]].pos1.y == 64)
+ {
+ gTasks[taskId].func = Task_StarterChoose4;
+ }
+}
+
+static void Task_StarterChoose4(u8 taskId)
+{
+ PlayCry1(GetStarterPokemon(gTasks[taskId].data[TD_STARTERSELECTION]), 0);
+ MenuDrawTextWindow(2, 14, 27, 19);
+ //"Do you choose this POKEMON?"
+ MenuPrint(gOtherText_DoYouChoosePoke, 3, 15);
+ DisplayYesNoMenu(21, 7, 1);
+ gTasks[taskId].func = Task_StarterChoose5;
+}
+
+static void Task_StarterChoose5(u8 taskId)
+{
+ u8 spriteId;
+
+ switch(ProcessMenuInputNoWrap_())
+ {
+ case 0: //YES
+ //Return the starter choice and exit.
+ gScriptResult = gTasks[taskId].data[TD_STARTERSELECTION];
+ SetMainCallback2(gMain.field_8);
+ break;
+ case 1: //NO
+ case -1: //B button
+ PlaySE(SE_SELECT);
+ MenuZeroFillWindowRect(21, 7, 27, 12);
+
+ spriteId = gTasks[taskId].data[TD_POKEMON_SPRITE];
+ FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteId].oam.paletteNum));
+ FreeOamMatrix(gSprites[spriteId].oam.matrixNum);
+ DestroySprite(&gSprites[spriteId]);
+
+ spriteId = gTasks[taskId].data[TD_CIRCLE_SPRITE];
+ FreeOamMatrix(gSprites[spriteId].oam.matrixNum);
+ DestroySprite(&gSprites[spriteId]);
+ gTasks[taskId].func = Task_StarterChoose6;
+ break;
+ }
+}
+
+static void Task_StarterChoose6(u8 taskId)
+{
+ gTasks[taskId].func = Task_StarterChoose1;
+}
+
+static void AddTextColorCtrlCode(u8 *string, u8 bgColor, u8 textColor, u8 shadowColor)
+{
+ *(string++) = EXT_CTRL_CODE_BEGIN;
+ *(string++) = 4;
+ *(string++) = textColor;
+ *(string++) = bgColor;
+ *(string++) = shadowColor;
+}
+
+#define SET_CHAR(str, index, c) \
+{ \
+ u8 *p = str + index; \
+ *p = c; \
+}
+
+static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection)
+{
+ u8 labelText[72];
+ u8 *category;
+ u8 srcIndex;
+ u8 dstIndex;
+ u16 species;
+
+ u8 labelLeft;
+ u8 labelRight;
+ u8 labelTop;
+ u8 labelBottom;
+
+ if(prevSelection != 0xFF)
+ {
+ //Remove the old Pokemon label
+ MenuZeroFillWindowRect(
+ gStarterChoose_LabelCoords[prevSelection][0],
+ gStarterChoose_LabelCoords[prevSelection][1],
+ gStarterChoose_LabelCoords[prevSelection][0] + 13,
+ gStarterChoose_LabelCoords[prevSelection][1] + 3);
+ REG_WIN0H = 0;
+ REG_WIN0V = 0;
+ }
+ species = GetStarterPokemon(selection);
+ category = GetPokemonCategory(SpeciesToNationalPokedexNum(species));
+ AddTextColorCtrlCode(labelText, 0, 15, 8);
+ dstIndex = 5;
+ SET_CHAR(labelText, 5, EXT_CTRL_CODE_BEGIN);
+ SET_CHAR(labelText, 6, 0x11);
+ SET_CHAR(labelText, 7, dstIndex);
+
+ //Copy category string to label
+ dstIndex = 8;
+ srcIndex = 0;
+ while(category[srcIndex] != EOS && srcIndex <= 10)
+ {
+ labelText[dstIndex] = category[srcIndex];
+ srcIndex++;
+ dstIndex++;
+ }
+ labelText[dstIndex++] = CHAR_SPACE;
+
+ //Copy POKEMON string to label
+ StringCopy(labelText + dstIndex, gOtherText_Poke);
+ MenuPrint(
+ labelText,
+ gStarterChoose_LabelCoords[selection][0],
+ gStarterChoose_LabelCoords[selection][1]);
+ AddTextColorCtrlCode(labelText, 0, 15, 8);
+
+ //Copy Pokemon name to label
+ sub_8072C74(labelText + 5, gSpeciesNames[species], 0x6B, 1);
+ MenuPrint(
+ labelText,
+ gStarterChoose_LabelCoords[selection][0],
+ gStarterChoose_LabelCoords[selection][1] + 2);
+
+ labelLeft = gStarterChoose_LabelCoords[selection][0] * 8 + 4;
+ labelRight = (gStarterChoose_LabelCoords[selection][0] + 13) * 8 + 4;
+ labelTop = gStarterChoose_LabelCoords[selection][1] * 8;
+ labelBottom = (gStarterChoose_LabelCoords[selection][1] + 4) * 8;
+ REG_WIN0H = WIN_RANGE(labelLeft, labelRight);
+ REG_WIN0V = WIN_RANGE(labelTop, labelBottom);
+}
+
+void nullsub_72(struct Sprite *sprite)
+{
+
+}
+
+static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y)
+{
+ u8 spriteId;
+
+ DecompressPicFromTable_2(
+ &gMonFrontPicTable[species],
+ gMonFrontPicCoords[species].x, gMonFrontPicCoords[species].y,
+ gUnknown_081FAF4C[0], gUnknown_081FAF4C[1],
+ species);
+ LoadCompressedObjectPalette(&gMonPaletteTable[species]);
+ GetMonSpriteTemplate_803C56C(species, 1);
+ spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0);
+ gSprites[spriteId].callback = nullsub_72;
+ gSprites[spriteId].oam.priority = 0;
+ return spriteId;
+}
+
+//Sprite callback
+void sub_810A62C(struct Sprite *sprite)
+{
+ sprite->pos1.x = gUnknown_083F76E4[gTasks[sprite->data0].data[TD_STARTERSELECTION]][0];
+ sprite->pos1.y = gUnknown_083F76E4[gTasks[sprite->data0].data[TD_STARTERSELECTION]][1];
+ sprite->pos2.y = Sin(sprite->data1, 8);
+ sprite->data1 = (u8)sprite->data1 + 4;
+}
+
+//Sprite callback
+void sub_810A68C(struct Sprite *sprite)
+{
+ if(gTasks[sprite->data0].data[TD_STARTERSELECTION] == sprite->data1)
+ StartSpriteAnimIfDifferent(sprite, 1);
+ else
+ StartSpriteAnimIfDifferent(sprite, 0);
+}
+
+//Sprite callback
+void StarterPokemonSpriteAnimCallback(struct Sprite *sprite)
+{
+ //Move sprite to upper center of screen
+ if(sprite->pos1.x > 120)
+ sprite->pos1.x -= 4;
+ if(sprite->pos1.x <= 119)
+ sprite->pos1.x += 4;
+ if(sprite->pos1.y > 64)
+ sprite->pos1.y -= 2;
+ if(sprite->pos1.y <= 63)
+ sprite->pos1.y += 2;
+}