Document starter_choose.c

This commit is contained in:
GriffinR
2020-07-06 17:22:37 -04:00
parent 46f4a4bbf7
commit 43c48d95c2
6 changed files with 151 additions and 149 deletions

View File

Before

Width:  |  Height:  |  Size: 635 B

After

Width:  |  Height:  |  Size: 635 B

View File

Before

Width:  |  Height:  |  Size: 349 B

After

Width:  |  Height:  |  Size: 349 B

View File

@@ -5,6 +5,7 @@ extern const u16 gBirchBagGrassPal[2][16];
extern const u32 gBirchBagTilemap[]; extern const u32 gBirchBagTilemap[];
extern const u32 gBirchGrassTilemap[]; extern const u32 gBirchGrassTilemap[];
extern const u32 gBirchHelpGfx[]; extern const u32 gBirchHelpGfx[];
extern const u32 gPokeballSelection_Gfx[];
u16 GetStarterPokemon(u16 chosenStarterId); u16 GetStarterPokemon(u16 chosenStarterId);
void CB2_ChooseStarter(void); void CB2_ChooseStarter(void);

View File

@@ -374,6 +374,9 @@ extern const u8 gText_DefaultNameTerra[];
extern const u8 gText_DefaultNameLucy[]; extern const u8 gText_DefaultNameLucy[];
extern const u8 gText_DefaultNameHalie[]; extern const u8 gText_DefaultNameHalie[];
extern const u8 gText_BirchInTrouble[];
extern const u8 gText_ConfirmStarterChoice[];
// mystery event menu text // mystery event menu text
extern const u8 gText_EventSafelyLoaded[]; extern const u8 gText_EventSafelyLoaded[];
extern const u8 gText_LoadErrorEndingSession[]; extern const u8 gText_LoadErrorEndingSession[];

View File

@@ -24,6 +24,7 @@
#include "pokedex.h" #include "pokedex.h"
#include "util.h" #include "util.h"
#include "trainer_pokemon_sprites.h" #include "trainer_pokemon_sprites.h"
#include "starter_choose.h"
#include "constants/battle_frontier.h" #include "constants/battle_frontier.h"
#include "constants/songs.h" #include "constants/songs.h"
#include "constants/rgb.h" #include "constants/rgb.h"
@@ -132,8 +133,6 @@ struct FactorySwapMonsStruct
bool8 unk30; bool8 unk30;
}; };
extern const u32 gUnknown_085B18AC[];
// This file's functions. // This file's functions.
static void sub_819A44C(struct Sprite *sprite); static void sub_819A44C(struct Sprite *sprite);
static void CB2_InitSelectScreen(void); static void CB2_InitSelectScreen(void);
@@ -263,7 +262,7 @@ static const struct SpriteSheet gUnknown_086103BC[] =
static const struct CompressedSpriteSheet gUnknown_086103E4[] = static const struct CompressedSpriteSheet gUnknown_086103E4[] =
{ {
{gUnknown_085B18AC, 0x800, TAG_TILE_64}, {gPokeballSelection_Gfx, 0x800, TAG_TILE_64},
{}, {},
}; };
@@ -616,7 +615,7 @@ static const struct SpriteSheet gUnknown_08610650[] =
static const struct CompressedSpriteSheet gUnknown_086106A0[] = static const struct CompressedSpriteSheet gUnknown_086106A0[] =
{ {
{gUnknown_085B18AC, 0x800, TAG_TILE_64}, {gPokeballSelection_Gfx, 0x800, TAG_TILE_64},
{}, {},
}; };

View File

@@ -14,6 +14,7 @@
#include "sound.h" #include "sound.h"
#include "sprite.h" #include "sprite.h"
#include "starter_choose.h" #include "starter_choose.h"
#include "strings.h"
#include "task.h" #include "task.h"
#include "text.h" #include "text.h"
#include "text_window.h" #include "text_window.h"
@@ -27,54 +28,45 @@
#define STARTER_MON_COUNT 3 #define STARTER_MON_COUNT 3
// Position of the sprite of the selected starter Pokemon // Position of the sprite of the selected starter Pokemon
#define STARTER_PKMN_POS_X 120 #define STARTER_PKMN_POS_X (DISPLAY_WIDTH / 2)
#define STARTER_PKMN_POS_Y 64 #define STARTER_PKMN_POS_Y 64
// text #define TAG_POKEBALL_SELECT 0x1000
extern const u8 gText_BirchInTrouble[]; #define TAG_STARTER_CIRCLE 0x1001
extern const u8 gText_ConfirmStarterChoice[];
// this file's functions static void CB2_StarterChoose(void);
static void MainCallback2_StarterChoose(void); static void ClearStarterLabel(void);
static void sub_8134604(void); static void Task_StarterChoose(u8 taskId);
static void Task_StarterChoose1(u8 taskId); static void Task_HandleStarterChooseInput(u8 taskId);
static void Task_StarterChoose2(u8 taskId); static void Task_WaitForStarterSprite(u8 taskId);
static void Task_StarterChoose3(u8 taskId); static void Task_AskConfirmStarter(u8 taskId);
static void Task_StarterChoose4(u8 taskId); static void Task_HandleConfirmStarterInput(u8 taskId);
static void Task_StarterChoose5(u8 taskId); static void Task_DeclineStarter(u8 taskId);
static void Task_StarterChoose6(u8 taskId);
static void Task_MoveStarterChooseCursor(u8 taskId); static void Task_MoveStarterChooseCursor(u8 taskId);
static void sub_8134668(u8 taskId); static void Task_CreateStarterLabel(u8 taskId);
static void CreateStarterPokemonLabel(u8 selection); static void CreateStarterPokemonLabel(u8 selection);
static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y); static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y);
void sub_81346DC(struct Sprite *sprite); static void SpriteCB_SelectionHand(struct Sprite *sprite);
void sub_813473C(struct Sprite *sprite); static void SpriteCB_Pokeball(struct Sprite *sprite);
void StarterPokemonSpriteCallback(struct Sprite *sprite); static void SpriteCB_StarterPokemon(struct Sprite *sprite);
static u16 sStarterChooseWindowId; static u16 sStarterLabelWindowId;
// .rodata
const u16 gBirchBagGrassPal[][16] = const u16 gBirchBagGrassPal[][16] =
{ {
INCBIN_U16("graphics/misc/birch_bag.gbapal"), INCBIN_U16("graphics/misc/birch_bag.gbapal"),
INCBIN_U16("graphics/misc/birch_grass.gbapal"), INCBIN_U16("graphics/misc/birch_grass.gbapal"),
}; };
const u16 gBirchBallarrow_Pal[] = INCBIN_U16("graphics/misc/birch_ballarrow.gbapal"); static const u16 sPokeballSelection_Pal[] = INCBIN_U16("graphics/misc/pokeball_selection.gbapal");
static const u16 sStarterCircle_Pal[] = INCBIN_U16("graphics/misc/starter_circle.gbapal");
const u16 gBirchCircle_Pal[] = INCBIN_U16("graphics/misc/birch_circle.gbapal");
const u32 gBirchBagTilemap[] = INCBIN_U32("graphics/misc/birch_bag_map.bin.lz"); const u32 gBirchBagTilemap[] = INCBIN_U32("graphics/misc/birch_bag_map.bin.lz");
const u32 gBirchGrassTilemap[] = INCBIN_U32("graphics/misc/birch_grass_map.bin.lz"); const u32 gBirchGrassTilemap[] = INCBIN_U32("graphics/misc/birch_grass_map.bin.lz");
const u32 gBirchHelpGfx[] = INCBIN_U32("graphics/misc/birch_help.4bpp.lz"); // Birch bag and grass combined
const u32 gPokeballSelection_Gfx[] = INCBIN_U32("graphics/misc/pokeball_selection.4bpp.lz");
static const u32 sStarterCircle_Gfx[] = INCBIN_U32("graphics/misc/starter_circle.4bpp.lz");
const u32 gBirchHelpGfx[] = INCBIN_U32("graphics/misc/birch_help.4bpp.lz"); static const struct WindowTemplate sWindowTemplates[] =
const u32 gUnknown_085B18AC[] = INCBIN_U32("graphics/misc/birch_ballarrow.4bpp.lz");
const u32 gUnknown_085B1BCC[] = INCBIN_U32("graphics/misc/birch_circle.4bpp.lz");
static const struct WindowTemplate gUnknown_085B1DCC[] =
{ {
{ {
.bg = 0, .bg = 0,
@@ -88,7 +80,7 @@ static const struct WindowTemplate gUnknown_085B1DCC[] =
DUMMY_WIN_TEMPLATE, DUMMY_WIN_TEMPLATE,
}; };
static const struct WindowTemplate gUnknown_085B1DDC = static const struct WindowTemplate sWindowTemplate_ConfirmStarter =
{ {
.bg = 0, .bg = 0,
.tilemapLeft = 24, .tilemapLeft = 24,
@@ -99,7 +91,7 @@ static const struct WindowTemplate gUnknown_085B1DDC =
.baseBlock = 0x0260 .baseBlock = 0x0260
}; };
static const struct WindowTemplate gUnknown_085B1DE4 = static const struct WindowTemplate sWindowTemplate_StarterLabel =
{ {
.bg = 0, .bg = 0,
.tilemapLeft = 0, .tilemapLeft = 0,
@@ -117,7 +109,7 @@ static const u8 sPokeballCoords[STARTER_MON_COUNT][2] =
{180, 64}, {180, 64},
}; };
static const u8 sStarterLabelCoords[][2] = static const u8 sStarterLabelCoords[STARTER_MON_COUNT][2] =
{ {
{0, 9}, {0, 9},
{16, 10}, {16, 10},
@@ -131,7 +123,7 @@ static const u16 sStarterMon[STARTER_MON_COUNT] =
SPECIES_MUDKIP, SPECIES_MUDKIP,
}; };
static const struct BgTemplate gUnknown_085B1E00[3] = static const struct BgTemplate sBgTemplates[3] =
{ {
{ {
.bg = 0, .bg = 0,
@@ -164,7 +156,7 @@ static const struct BgTemplate gUnknown_085B1E00[3] =
static const u8 sTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GREY}; static const u8 sTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GREY};
static const struct OamData gOamData_85B1E10 = static const struct OamData sOam_Hand =
{ {
.y = 160, .y = 160,
.affineMode = ST_OAM_AFFINE_OFF, .affineMode = ST_OAM_AFFINE_OFF,
@@ -181,7 +173,7 @@ static const struct OamData gOamData_85B1E10 =
.affineParam = 0, .affineParam = 0,
}; };
static const struct OamData gOamData_85B1E18 = static const struct OamData sOam_Pokeball =
{ {
.y = 160, .y = 160,
.affineMode = ST_OAM_AFFINE_OFF, .affineMode = ST_OAM_AFFINE_OFF,
@@ -198,7 +190,7 @@ static const struct OamData gOamData_85B1E18 =
.affineParam = 0, .affineParam = 0,
}; };
static const struct OamData gOamData_85B1E20 = static const struct OamData sOam_StarterCircle =
{ {
.y = 160, .y = 160,
.affineMode = ST_OAM_AFFINE_DOUBLE, .affineMode = ST_OAM_AFFINE_DOUBLE,
@@ -222,19 +214,19 @@ static const u8 sCursorCoords[][2] =
{180, 32}, {180, 32},
}; };
static const union AnimCmd gSpriteAnim_85B1E30[] = static const union AnimCmd sAnim_Hand[] =
{ {
ANIMCMD_FRAME(48, 30), ANIMCMD_FRAME(48, 30),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd gSpriteAnim_85B1E38[] = static const union AnimCmd sAnim_Pokeball_Still[] =
{ {
ANIMCMD_FRAME(0, 30), ANIMCMD_FRAME(0, 30),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd gSpriteAnim_85B1E40[] = static const union AnimCmd sAnim_Pokeball_Moving[] =
{ {
ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(16, 4),
ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(0, 4),
@@ -256,109 +248,109 @@ static const union AnimCmd gSpriteAnim_85B1E40[] =
ANIMCMD_JUMP(0), ANIMCMD_JUMP(0),
}; };
static const union AnimCmd gSpriteAnim_85B1E88[] = static const union AnimCmd sAnim_StarterCircle[] =
{ {
ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(0, 8),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd * const gSpriteAnimTable_85B1E90[] = static const union AnimCmd * const sAnims_Hand[] =
{ {
gSpriteAnim_85B1E30, sAnim_Hand,
}; };
static const union AnimCmd * const gSpriteAnimTable_85B1E94[] = static const union AnimCmd * const sAnims_Pokeball[] =
{ {
gSpriteAnim_85B1E38, sAnim_Pokeball_Still,
gSpriteAnim_85B1E40, sAnim_Pokeball_Moving,
}; };
static const union AnimCmd * const gSpriteAnimTable_85B1E9C[] = static const union AnimCmd * const sAnims_StarterCircle[] =
{ {
gSpriteAnim_85B1E88, sAnim_StarterCircle,
}; };
static const union AffineAnimCmd gSpriteAffineAnim_85B1EA0[] = static const union AffineAnimCmd sAffineAnim_StarterPokemon[] =
{ {
AFFINEANIMCMD_FRAME(16, 16, 0, 0), AFFINEANIMCMD_FRAME(16, 16, 0, 0),
AFFINEANIMCMD_FRAME(16, 16, 0, 15), AFFINEANIMCMD_FRAME(16, 16, 0, 15),
AFFINEANIMCMD_END, AFFINEANIMCMD_END,
}; };
static const union AffineAnimCmd gSpriteAffineAnim_85B1EB8[] = static const union AffineAnimCmd sAffineAnim_StarterCircle[] =
{ {
AFFINEANIMCMD_FRAME(20, 20, 0, 0), AFFINEANIMCMD_FRAME(20, 20, 0, 0),
AFFINEANIMCMD_FRAME(20, 20, 0, 15), AFFINEANIMCMD_FRAME(20, 20, 0, 15),
AFFINEANIMCMD_END, AFFINEANIMCMD_END,
}; };
static const union AffineAnimCmd * const gUnknown_085B1ED0 = {gSpriteAffineAnim_85B1EA0}; static const union AffineAnimCmd * const sAffineAnims_StarterPokemon = {sAffineAnim_StarterPokemon};
static const union AffineAnimCmd * const gSpriteAffineAnimTable_85B1ED4[] = {gSpriteAffineAnim_85B1EB8}; static const union AffineAnimCmd * const sAffineAnims_StarterCircle[] = {sAffineAnim_StarterCircle};
static const struct CompressedSpriteSheet gUnknown_085B1ED8[] = static const struct CompressedSpriteSheet sSpriteSheet_PokeballSelect[] =
{ {
{ {
.data = gUnknown_085B18AC, .data = gPokeballSelection_Gfx,
.size = 0x0800, .size = 0x0800,
.tag = 0x1000 .tag = TAG_POKEBALL_SELECT
}, },
{} {}
}; };
static const struct CompressedSpriteSheet gUnknown_085B1EE8[] = static const struct CompressedSpriteSheet sSpriteSheet_StarterCircle[] =
{ {
{ {
.data = gUnknown_085B1BCC, .data = sStarterCircle_Gfx,
.size = 0x0800, .size = 0x0800,
.tag = 0x1001 .tag = TAG_STARTER_CIRCLE
}, },
{} {}
}; };
static const struct SpritePalette gUnknown_085B1EF8[] = static const struct SpritePalette sSpritePalettes_StarterChoose[] =
{ {
{ {
.data = gBirchBallarrow_Pal, .data = sPokeballSelection_Pal,
.tag = 0x1000 .tag = TAG_POKEBALL_SELECT
}, },
{ {
.data = gBirchCircle_Pal, .data = sStarterCircle_Pal,
.tag = 0x1001 .tag = TAG_STARTER_CIRCLE
}, },
{}, {},
}; };
static const struct SpriteTemplate sSpriteTemplate_Hand = static const struct SpriteTemplate sSpriteTemplate_Hand =
{ {
.tileTag = 0x1000, .tileTag = TAG_POKEBALL_SELECT,
.paletteTag = 0x1000, .paletteTag = TAG_POKEBALL_SELECT,
.oam = &gOamData_85B1E10, .oam = &sOam_Hand,
.anims = gSpriteAnimTable_85B1E90, .anims = sAnims_Hand,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_81346DC .callback = SpriteCB_SelectionHand
}; };
static const struct SpriteTemplate sSpriteTemplate_PokeBall = static const struct SpriteTemplate sSpriteTemplate_Pokeball =
{ {
.tileTag = 0x1000, .tileTag = TAG_POKEBALL_SELECT,
.paletteTag = 0x1000, .paletteTag = TAG_POKEBALL_SELECT,
.oam = &gOamData_85B1E18, .oam = &sOam_Pokeball,
.anims = gSpriteAnimTable_85B1E94, .anims = sAnims_Pokeball,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_813473C .callback = SpriteCB_Pokeball
}; };
static const struct SpriteTemplate gUnknown_085B1F40 = static const struct SpriteTemplate sSpriteTemplate_StarterCircle =
{ {
.tileTag = 0x1001, .tileTag = TAG_STARTER_CIRCLE,
.paletteTag = 0x1001, .paletteTag = TAG_STARTER_CIRCLE,
.oam = &gOamData_85B1E20, .oam = &sOam_StarterCircle,
.anims = gSpriteAnimTable_85B1E9C, .anims = sAnims_StarterCircle,
.images = NULL, .images = NULL,
.affineAnims = gSpriteAffineAnimTable_85B1ED4, .affineAnims = sAffineAnims_StarterCircle,
.callback = StarterPokemonSpriteCallback .callback = SpriteCB_StarterPokemon
}; };
// .text // .text
@@ -376,10 +368,15 @@ static void VblankCB_StarterChoose(void)
TransferPlttBuffer(); TransferPlttBuffer();
} }
// Data for Task_StarterChoose
#define tStarterSelection data[0] #define tStarterSelection data[0]
#define tPkmnSpriteId data[1] #define tPkmnSpriteId data[1]
#define tCircleSpriteId data[2] #define tCircleSpriteId data[2]
// Data for sSpriteTemplate_Pokeball
#define sTaskId data[0]
#define sBallId data[1]
void CB2_ChooseStarter(void) void CB2_ChooseStarter(void)
{ {
u16 savedIme; u16 savedIme;
@@ -412,8 +409,8 @@ void CB2_ChooseStarter(void)
LZ77UnCompVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(7))); LZ77UnCompVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(7)));
ResetBgsAndClearDma3BusyFlags(0); ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, gUnknown_085B1E00, ARRAY_COUNT(gUnknown_085B1E00)); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));
InitWindows(gUnknown_085B1DCC); InitWindows(sWindowTemplates);
DeactivateAllTextPrinters(); DeactivateAllTextPrinters();
LoadUserWindowBorderGfx(0, 0x2A8, 0xD0); LoadUserWindowBorderGfx(0, 0x2A8, 0xD0);
@@ -427,17 +424,17 @@ void CB2_ChooseStarter(void)
LoadPalette(GetOverworldTextboxPalettePtr(), 0xE0, 0x20); LoadPalette(GetOverworldTextboxPalettePtr(), 0xE0, 0x20);
LoadPalette(gBirchBagGrassPal, 0, 0x40); LoadPalette(gBirchBagGrassPal, 0, 0x40);
LoadCompressedSpriteSheet(&gUnknown_085B1ED8[0]); LoadCompressedSpriteSheet(&sSpriteSheet_PokeballSelect[0]);
LoadCompressedSpriteSheet(&gUnknown_085B1EE8[0]); LoadCompressedSpriteSheet(&sSpriteSheet_StarterCircle[0]);
LoadSpritePalettes(gUnknown_085B1EF8); LoadSpritePalettes(sSpritePalettes_StarterChoose);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
EnableInterrupts(DISPSTAT_VBLANK); EnableInterrupts(DISPSTAT_VBLANK);
SetVBlankCallback(VblankCB_StarterChoose); SetVBlankCallback(VblankCB_StarterChoose);
SetMainCallback2(MainCallback2_StarterChoose); SetMainCallback2(CB2_StarterChoose);
SetGpuReg(REG_OFFSET_WININ, 0x3F); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);
SetGpuReg(REG_OFFSET_WINOUT, 0x1F); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ);
SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0H, 0);
SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WIN0V, 0);
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN);
@@ -449,7 +446,7 @@ void CB2_ChooseStarter(void)
ShowBg(2); ShowBg(2);
ShowBg(3); ShowBg(3);
taskId = CreateTask(Task_StarterChoose1, 0); taskId = CreateTask(Task_StarterChoose, 0);
gTasks[taskId].tStarterSelection = 1; gTasks[taskId].tStarterSelection = 1;
// Create hand sprite // Create hand sprite
@@ -457,22 +454,22 @@ void CB2_ChooseStarter(void)
gSprites[spriteId].data[0] = taskId; gSprites[spriteId].data[0] = taskId;
// Create three Pokeball sprites // Create three Pokeball sprites
spriteId = CreateSprite(&sSpriteTemplate_PokeBall, sPokeballCoords[0][0], sPokeballCoords[0][1], 2); spriteId = CreateSprite(&sSpriteTemplate_Pokeball, sPokeballCoords[0][0], sPokeballCoords[0][1], 2);
gSprites[spriteId].data[0] = taskId; gSprites[spriteId].sTaskId = taskId;
gSprites[spriteId].data[1] = 0; gSprites[spriteId].sBallId = 0;
spriteId = CreateSprite(&sSpriteTemplate_PokeBall, sPokeballCoords[1][0], sPokeballCoords[1][1], 2); spriteId = CreateSprite(&sSpriteTemplate_Pokeball, sPokeballCoords[1][0], sPokeballCoords[1][1], 2);
gSprites[spriteId].data[0] = taskId; gSprites[spriteId].sTaskId = taskId;
gSprites[spriteId].data[1] = 1; gSprites[spriteId].sBallId = 1;
spriteId = CreateSprite(&sSpriteTemplate_PokeBall, sPokeballCoords[2][0], sPokeballCoords[2][1], 2); spriteId = CreateSprite(&sSpriteTemplate_Pokeball, sPokeballCoords[2][0], sPokeballCoords[2][1], 2);
gSprites[spriteId].data[0] = taskId; gSprites[spriteId].sTaskId = taskId;
gSprites[spriteId].data[1] = 2; gSprites[spriteId].sBallId = 2;
sStarterChooseWindowId = 0xFF; sStarterLabelWindowId = 0xFF;
} }
static void MainCallback2_StarterChoose(void) static void CB2_StarterChoose(void)
{ {
RunTasks(); RunTasks();
AnimateSprites(); AnimateSprites();
@@ -481,71 +478,71 @@ static void MainCallback2_StarterChoose(void)
UpdatePaletteFade(); UpdatePaletteFade();
} }
static void Task_StarterChoose1(u8 taskId) static void Task_StarterChoose(u8 taskId)
{ {
CreateStarterPokemonLabel(gTasks[taskId].tStarterSelection); CreateStarterPokemonLabel(gTasks[taskId].tStarterSelection);
DrawStdFrameWithCustomTileAndPalette(0, FALSE, 0x2A8, 0xD); DrawStdFrameWithCustomTileAndPalette(0, FALSE, 0x2A8, 0xD);
AddTextPrinterParameterized(0, 1, gText_BirchInTrouble, 0, 1, 0, NULL); AddTextPrinterParameterized(0, 1, gText_BirchInTrouble, 0, 1, 0, NULL);
PutWindowTilemap(0); PutWindowTilemap(0);
ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(0);
gTasks[taskId].func = Task_StarterChoose2; gTasks[taskId].func = Task_HandleStarterChooseInput;
} }
static void Task_StarterChoose2(u8 taskId) static void Task_HandleStarterChooseInput(u8 taskId)
{ {
u8 selection = gTasks[taskId].tStarterSelection; u8 selection = gTasks[taskId].tStarterSelection;
if (gMain.newKeys & A_BUTTON) if (JOY_NEW(A_BUTTON))
{ {
u8 spriteId; u8 spriteId;
sub_8134604(); ClearStarterLabel();
// Create white circle background // Create white circle background
spriteId = CreateSprite(&gUnknown_085B1F40, sPokeballCoords[selection][0], sPokeballCoords[selection][1], 1); spriteId = CreateSprite(&sSpriteTemplate_StarterCircle, sPokeballCoords[selection][0], sPokeballCoords[selection][1], 1);
gTasks[taskId].tCircleSpriteId = spriteId; gTasks[taskId].tCircleSpriteId = spriteId;
// Create Pokemon sprite // Create Pokemon sprite
spriteId = CreatePokemonFrontSprite(GetStarterPokemon(gTasks[taskId].tStarterSelection), sPokeballCoords[selection][0], sPokeballCoords[selection][1]); spriteId = CreatePokemonFrontSprite(GetStarterPokemon(gTasks[taskId].tStarterSelection), sPokeballCoords[selection][0], sPokeballCoords[selection][1]);
gSprites[spriteId].affineAnims = &gUnknown_085B1ED0; gSprites[spriteId].affineAnims = &sAffineAnims_StarterPokemon;
gSprites[spriteId].callback = StarterPokemonSpriteCallback; gSprites[spriteId].callback = SpriteCB_StarterPokemon;
gTasks[taskId].tPkmnSpriteId = spriteId; gTasks[taskId].tPkmnSpriteId = spriteId;
gTasks[taskId].func = Task_StarterChoose3; gTasks[taskId].func = Task_WaitForStarterSprite;
} }
else if ((gMain.newKeys & DPAD_LEFT) && selection > 0) else if (JOY_NEW(DPAD_LEFT) && selection > 0)
{ {
gTasks[taskId].tStarterSelection--; gTasks[taskId].tStarterSelection--;
gTasks[taskId].func = Task_MoveStarterChooseCursor; gTasks[taskId].func = Task_MoveStarterChooseCursor;
} }
else if ((gMain.newKeys & DPAD_RIGHT) && selection < (STARTER_MON_COUNT - 1)) else if (JOY_NEW(DPAD_RIGHT) && selection < STARTER_MON_COUNT - 1)
{ {
gTasks[taskId].tStarterSelection++; gTasks[taskId].tStarterSelection++;
gTasks[taskId].func = Task_MoveStarterChooseCursor; gTasks[taskId].func = Task_MoveStarterChooseCursor;
} }
} }
static void Task_StarterChoose3(u8 taskId) static void Task_WaitForStarterSprite(u8 taskId)
{ {
if (gSprites[gTasks[taskId].tCircleSpriteId].affineAnimEnded && if (gSprites[gTasks[taskId].tCircleSpriteId].affineAnimEnded &&
gSprites[gTasks[taskId].tCircleSpriteId].pos1.x == STARTER_PKMN_POS_X && gSprites[gTasks[taskId].tCircleSpriteId].pos1.x == STARTER_PKMN_POS_X &&
gSprites[gTasks[taskId].tCircleSpriteId].pos1.y == STARTER_PKMN_POS_Y) gSprites[gTasks[taskId].tCircleSpriteId].pos1.y == STARTER_PKMN_POS_Y)
{ {
gTasks[taskId].func = Task_StarterChoose4; gTasks[taskId].func = Task_AskConfirmStarter;
} }
} }
static void Task_StarterChoose4(u8 taskId) static void Task_AskConfirmStarter(u8 taskId)
{ {
PlayCry1(GetStarterPokemon(gTasks[taskId].tStarterSelection), 0); PlayCry1(GetStarterPokemon(gTasks[taskId].tStarterSelection), 0);
FillWindowPixelBuffer(0, PIXEL_FILL(1)); FillWindowPixelBuffer(0, PIXEL_FILL(1));
AddTextPrinterParameterized(0, 1, gText_ConfirmStarterChoice, 0, 1, 0, NULL); AddTextPrinterParameterized(0, 1, gText_ConfirmStarterChoice, 0, 1, 0, NULL);
ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(0);
CreateYesNoMenu(&gUnknown_085B1DDC, 0x2A8, 0xD, 0); CreateYesNoMenu(&sWindowTemplate_ConfirmStarter, 0x2A8, 0xD, 0);
gTasks[taskId].func = Task_StarterChoose5; gTasks[taskId].func = Task_HandleConfirmStarterInput;
} }
static void Task_StarterChoose5(u8 taskId) static void Task_HandleConfirmStarterInput(u8 taskId)
{ {
u8 spriteId; u8 spriteId;
@@ -558,7 +555,7 @@ static void Task_StarterChoose5(u8 taskId)
SetMainCallback2(gMain.savedCallback); SetMainCallback2(gMain.savedCallback);
break; break;
case 1: // NO case 1: // NO
case -1: // B button case MENU_B_PRESSED:
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
spriteId = gTasks[taskId].tPkmnSpriteId; spriteId = gTasks[taskId].tPkmnSpriteId;
FreeOamMatrix(gSprites[spriteId].oam.matrixNum); FreeOamMatrix(gSprites[spriteId].oam.matrixNum);
@@ -567,14 +564,14 @@ static void Task_StarterChoose5(u8 taskId)
spriteId = gTasks[taskId].tCircleSpriteId; spriteId = gTasks[taskId].tCircleSpriteId;
FreeOamMatrix(gSprites[spriteId].oam.matrixNum); FreeOamMatrix(gSprites[spriteId].oam.matrixNum);
DestroySprite(&gSprites[spriteId]); DestroySprite(&gSprites[spriteId]);
gTasks[taskId].func = Task_StarterChoose6; gTasks[taskId].func = Task_DeclineStarter;
break; break;
} }
} }
static void Task_StarterChoose6(u8 taskId) static void Task_DeclineStarter(u8 taskId)
{ {
gTasks[taskId].func = Task_StarterChoose1; gTasks[taskId].func = Task_StarterChoose;
} }
static void CreateStarterPokemonLabel(u8 selection) static void CreateStarterPokemonLabel(u8 selection)
@@ -589,20 +586,20 @@ static void CreateStarterPokemonLabel(u8 selection)
CopyMonCategoryText(SpeciesToNationalPokedexNum(species), categoryText); CopyMonCategoryText(SpeciesToNationalPokedexNum(species), categoryText);
speciesName = gSpeciesNames[species]; speciesName = gSpeciesNames[species];
winTemplate = gUnknown_085B1DE4; winTemplate = sWindowTemplate_StarterLabel;
winTemplate.tilemapLeft = sStarterLabelCoords[selection][0]; winTemplate.tilemapLeft = sStarterLabelCoords[selection][0];
winTemplate.tilemapTop = sStarterLabelCoords[selection][1]; winTemplate.tilemapTop = sStarterLabelCoords[selection][1];
sStarterChooseWindowId = AddWindow(&winTemplate); sStarterLabelWindowId = AddWindow(&winTemplate);
FillWindowPixelBuffer(sStarterChooseWindowId, PIXEL_FILL(0)); FillWindowPixelBuffer(sStarterLabelWindowId, PIXEL_FILL(0));
width = GetStringCenterAlignXOffset(7, categoryText, 0x68); width = GetStringCenterAlignXOffset(7, categoryText, 0x68);
AddTextPrinterParameterized3(sStarterChooseWindowId, 7, width, 1, sTextColors, 0, categoryText); AddTextPrinterParameterized3(sStarterLabelWindowId, 7, width, 1, sTextColors, 0, categoryText);
width = GetStringCenterAlignXOffset(1, speciesName, 0x68); width = GetStringCenterAlignXOffset(1, speciesName, 0x68);
AddTextPrinterParameterized3(sStarterChooseWindowId, 1, width, 0x11, sTextColors, 0, speciesName); AddTextPrinterParameterized3(sStarterLabelWindowId, 1, width, 17, sTextColors, 0, speciesName);
PutWindowTilemap(sStarterChooseWindowId); PutWindowTilemap(sStarterLabelWindowId);
ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(0);
labelLeft = sStarterLabelCoords[selection][0] * 8 - 4; labelLeft = sStarterLabelCoords[selection][0] * 8 - 4;
@@ -613,12 +610,12 @@ static void CreateStarterPokemonLabel(u8 selection)
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(labelTop, labelBottom)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(labelTop, labelBottom));
} }
static void sub_8134604(void) static void ClearStarterLabel(void)
{ {
FillWindowPixelBuffer(sStarterChooseWindowId, PIXEL_FILL(0)); FillWindowPixelBuffer(sStarterLabelWindowId, PIXEL_FILL(0));
ClearWindowTilemap(sStarterChooseWindowId); ClearWindowTilemap(sStarterLabelWindowId);
RemoveWindow(sStarterChooseWindowId); RemoveWindow(sStarterLabelWindowId);
sStarterChooseWindowId = 0xFF; sStarterLabelWindowId = 0xFF;
SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0H, 0);
SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WIN0V, 0);
ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(0);
@@ -626,14 +623,14 @@ static void sub_8134604(void)
static void Task_MoveStarterChooseCursor(u8 taskId) static void Task_MoveStarterChooseCursor(u8 taskId)
{ {
sub_8134604(); ClearStarterLabel();
gTasks[taskId].func = sub_8134668; gTasks[taskId].func = Task_CreateStarterLabel;
} }
static void sub_8134668(u8 taskId) static void Task_CreateStarterLabel(u8 taskId)
{ {
CreateStarterPokemonLabel(gTasks[taskId].tStarterSelection); CreateStarterPokemonLabel(gTasks[taskId].tStarterSelection);
gTasks[taskId].func = Task_StarterChoose2; gTasks[taskId].func = Task_HandleStarterChooseInput;
} }
static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y) static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y)
@@ -645,25 +642,27 @@ static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y)
return spriteId; return spriteId;
} }
void sub_81346DC(struct Sprite *sprite) static void SpriteCB_SelectionHand(struct Sprite *sprite)
{ {
// Float up and down above selected pokeball
sprite->pos1.x = sCursorCoords[gTasks[sprite->data[0]].tStarterSelection][0]; sprite->pos1.x = sCursorCoords[gTasks[sprite->data[0]].tStarterSelection][0];
sprite->pos1.y = sCursorCoords[gTasks[sprite->data[0]].tStarterSelection][1]; sprite->pos1.y = sCursorCoords[gTasks[sprite->data[0]].tStarterSelection][1];
sprite->pos2.y = Sin(sprite->data[1], 8); sprite->pos2.y = Sin(sprite->data[1], 8);
sprite->data[1] = (u8)(sprite->data[1]) + 4; sprite->data[1] = (u8)(sprite->data[1]) + 4;
} }
void sub_813473C(struct Sprite *sprite) static void SpriteCB_Pokeball(struct Sprite *sprite)
{ {
if (gTasks[sprite->data[0]].tStarterSelection == sprite->data[1]) // Animate pokeball if currently selected
if (gTasks[sprite->sTaskId].tStarterSelection == sprite->sBallId)
StartSpriteAnimIfDifferent(sprite, 1); StartSpriteAnimIfDifferent(sprite, 1);
else else
StartSpriteAnimIfDifferent(sprite, 0); StartSpriteAnimIfDifferent(sprite, 0);
} }
void StarterPokemonSpriteCallback(struct Sprite *sprite) static void SpriteCB_StarterPokemon(struct Sprite *sprite)
{ {
//Move sprite to upper center of screen // Move sprite to upper center of screen
if (sprite->pos1.x > STARTER_PKMN_POS_X) if (sprite->pos1.x > STARTER_PKMN_POS_X)
sprite->pos1.x -= 4; sprite->pos1.x -= 4;
if (sprite->pos1.x < STARTER_PKMN_POS_X) if (sprite->pos1.x < STARTER_PKMN_POS_X)