Finish factory select screen doc

This commit is contained in:
GriffinR
2020-12-30 17:35:33 -05:00
parent 0bf49198f6
commit 7ae78dc773
+168 -121
View File
@@ -43,21 +43,25 @@
#define SELECTABLE_MONS_COUNT 6 #define SELECTABLE_MONS_COUNT 6
#define PALTAG_BALL_GRAY 0x64 enum {
#define PALTAG_BALL_SELECTED 0x65 PALTAG_BALL_GRAY = 100,
#define PALTAG_INTERFACE 0x66 PALTAG_BALL_SELECTED,
#define PALTAG_MON_PIC_BG 0x67 PALTAG_INTERFACE,
PALTAG_MON_PIC_BG,
};
#define GFXTAG_BALL 0x64 enum {
#define GFXTAG_ARROW 0x65 GFXTAG_BALL = 100,
#define GFXTAG_MENU_HIGHLIGHT_LEFT 0x66 GFXTAG_ARROW,
#define GFXTAG_MENU_HIGHLIGHT_RIGHT 0x67 GFXTAG_MENU_HIGHLIGHT_LEFT,
#define GFXTAG_ACTION_BOX_LEFT 0x68 GFXTAG_MENU_HIGHLIGHT_RIGHT,
#define GFXTAG_ACTION_BOX_RIGHT 0x69 GFXTAG_ACTION_BOX_LEFT,
#define GFXTAG_ACTION_HIGHLIGHT_LEFT 0x6A GFXTAG_ACTION_BOX_RIGHT,
#define GFXTAG_ACTION_HIGHLIGHT_MIDDLE 0x6B GFXTAG_ACTION_HIGHLIGHT_LEFT,
#define GFXTAG_ACTION_HIGHLIGHT_RIGHT 0x6C GFXTAG_ACTION_HIGHLIGHT_MIDDLE,
#define GFXTAG_MON_PIC_BG_ANIM 0x6D GFXTAG_ACTION_HIGHLIGHT_RIGHT,
GFXTAG_MON_PIC_BG_ANIM,
};
// Tasks in this file universally use data[0] as a state for switches // Tasks in this file universally use data[0] as a state for switches
#define tState data[0] #define tState data[0]
@@ -69,6 +73,14 @@ enum {
FADESTATE_DELAY FADESTATE_DELAY
}; };
// Return states for the Select Actions
enum {
SELECT_SUMMARY,
SELECT_CONTINUE_CHOOSING,
SELECT_CONFIRM_MONS,
SELECT_INVALID_MON,
};
struct FactorySelectableMon struct FactorySelectableMon
{ {
u16 monId; u16 monId;
@@ -129,7 +141,7 @@ struct FactorySwapScreen
u8 yesNoCursorPos; u8 yesNoCursorPos;
u8 actionsCount; u8 actionsCount;
const struct SwapScreenAction *actionsData; const struct SwapScreenAction *actionsData;
u8 unused1C[4]; u8 unused[4];
bool8 monSwapped; bool8 monSwapped;
u8 fadeSpeciesNameTaskId; u8 fadeSpeciesNameTaskId;
bool8 fadeSpeciesNameActive; bool8 fadeSpeciesNameActive;
@@ -161,22 +173,22 @@ static void Select_PrintMonSpecies(void);
static void Select_PrintMonCategory(void); static void Select_PrintMonCategory(void);
static void Select_PrintRentalPkmnString(void); static void Select_PrintRentalPkmnString(void);
static void Select_CopyMonsToPlayerParty(void); static void Select_CopyMonsToPlayerParty(void);
static void sub_819C4B4(void); static void Select_ShowChosenMons(void);
static void Select_ShowYesNoOptions(void); static void Select_ShowYesNoOptions(void);
static void sub_819C568(void); static void Select_HideChosenMons(void);
static void Select_ShowMenuOptions(void); static void Select_ShowMenuOptions(void);
static void Select_PrintMenuOptions(void); static void Select_PrintMenuOptions(void);
static void Select_PrintYesNoOptions(void); static void Select_PrintYesNoOptions(void);
static void Select_Task_FadeSpeciesName(u8); static void Select_Task_FadeSpeciesName(u8);
static void sub_819C1D0(u8); static void Select_Task_OpenChosenMonPics(u8);
static void Select_Task_HandleChooseMons(u8); static void Select_Task_HandleChooseMons(u8);
static void Select_Task_HandleMenu(u8); static void Select_Task_HandleMenu(u8);
static void CreateFrontierFactorySelectableMons(u8); static void CreateFrontierFactorySelectableMons(u8);
static void CreateSlateportTentSelectableMons(u8); static void CreateSlateportTentSelectableMons(u8);
static void Select_SetBallSpritePaletteNum(u8); static void Select_SetBallSpritePaletteNum(u8);
static void sub_819B958(u8); static void Select_ErasePopupMenu(u8);
static u8 Select_RunMenuOptionFunc(void); static u8 Select_RunMenuOptionFunc(void);
static u8 sub_819BC9C(void); static u8 Select_DeclineChosenMons(void);
static u8 Select_OptionSummary(void); static u8 Select_OptionSummary(void);
static u8 Select_OptionOthers(void); static u8 Select_OptionOthers(void);
static u8 Select_OptionRentDeselect(void); static u8 Select_OptionRentDeselect(void);
@@ -226,7 +238,6 @@ static void Swap_ActionMon(u8);
static void Swap_ActionCancel(u8); static void Swap_ActionCancel(u8);
static void Swap_ActionPkmnForSwap(u8); static void Swap_ActionPkmnForSwap(u8);
// Ewram variables
static EWRAM_DATA u8 *sSelectMenuTilesetBuffer = NULL; static EWRAM_DATA u8 *sSelectMenuTilesetBuffer = NULL;
static EWRAM_DATA u8 *sSelectMonPicBgTilesetBuffer = NULL; static EWRAM_DATA u8 *sSelectMonPicBgTilesetBuffer = NULL;
static EWRAM_DATA u8 *sSelectMenuTilemapBuffer = NULL; static EWRAM_DATA u8 *sSelectMenuTilemapBuffer = NULL;
@@ -1092,6 +1103,26 @@ void DoBattleFactorySelectScreen(void)
SetMainCallback2(CB2_InitSelectScreen); SetMainCallback2(CB2_InitSelectScreen);
} }
// States for the main tasks of the Select_ functions after initialization, including:
// Select_Task_OpenSummaryScreen, Select_Task_HandleYesNo, Select_Task_HandleMenu, and Select_Task_HandleChooseMons
// Unnecessarily complicated, could easily have just kept states numbered in each task always starting at 0
// There's only one instance (Select_Task_HandleChooseMons) where a non-initial case is used
// Select_Task_Exit has its own straightforward states
#define STATE_CHOOSE_MONS_INIT 0
#define STATE_CHOOSE_MONS_HANDLE_INPUT 1
#define STATE_MENU_INIT 2
#define STATE_MENU_HANDLE_INPUT 3
#define STATE_YESNO_SHOW_OPTIONS 4
#define STATE_YESNO_HANDLE_INPUT 5
#define STATE_SUMMARY_FADE 6
#define STATE_SUMMARY_CLEAN 7
#define STATE_SUMMARY_SHOW 8
#define STATE_MENU_SHOW_OPTIONS 9
#define STATE_YESNO_SHOW_MONS 10
#define STATE_CHOOSE_MONS_INVALID 11
#define STATE_MENU_REINIT 12
#define STATE_MENU_RESHOW 13
static void CB2_InitSelectScreen(void) static void CB2_InitSelectScreen(void)
{ {
u8 taskId; u8 taskId;
@@ -1217,14 +1248,14 @@ static void CB2_InitSelectScreen(void)
{ {
gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].tState = 0; gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].tState = 0;
taskId = CreateTask(Select_Task_HandleChooseMons, 0); taskId = CreateTask(Select_Task_HandleChooseMons, 0);
gTasks[taskId].tState = 0; gTasks[taskId].tState = STATE_CHOOSE_MONS_INIT;
} }
else else
{ {
gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].tState = 1; gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].tState = 1;
sFactorySelectScreen->fadeSpeciesNameActive = FALSE; sFactorySelectScreen->fadeSpeciesNameActive = FALSE;
taskId = CreateTask(Select_Task_HandleMenu, 0); taskId = CreateTask(Select_Task_HandleMenu, 0);
gTasks[taskId].tState = 13; gTasks[taskId].tState = STATE_MENU_RESHOW;
} }
SetMainCallback2(CB2_SelectScreen); SetMainCallback2(CB2_SelectScreen);
break; break;
@@ -1360,11 +1391,12 @@ static void Select_HandleMonSelectionChange(void)
if (sFactorySelectScreen->mons[cursorPos].selectedId) // Deselect a mon. if (sFactorySelectScreen->mons[cursorPos].selectedId) // Deselect a mon.
{ {
paletteNum = IndexOfSpritePaletteTag(PALTAG_BALL_GRAY); paletteNum = IndexOfSpritePaletteTag(PALTAG_BALL_GRAY);
if (sFactorySelectScreen->selectingMonsState == 3 && sFactorySelectScreen->mons[cursorPos].selectedId == 1) if (sFactorySelectScreen->selectingMonsState == FRONTIER_PARTY_SIZE
&& sFactorySelectScreen->mons[cursorPos].selectedId == 1)
{ {
for (i = 0; i < SELECTABLE_MONS_COUNT; i++) for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
{ {
if (sFactorySelectScreen->mons[i].selectedId == 2) if (sFactorySelectScreen->mons[i].selectedId == FRONTIER_PARTY_SIZE - 1)
break; break;
} }
if (i == SELECTABLE_MONS_COUNT) if (i == SELECTABLE_MONS_COUNT)
@@ -1404,12 +1436,12 @@ static void Select_Task_OpenSummaryScreen(u8 taskId)
switch (gTasks[taskId].tState) switch (gTasks[taskId].tState)
{ {
case 6: case STATE_SUMMARY_FADE:
gPlttBufferUnfaded[228] = gPlttBufferFaded[228]; gPlttBufferUnfaded[228] = gPlttBufferFaded[228];
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
gTasks[taskId].tState = 7; gTasks[taskId].tState = STATE_SUMMARY_CLEAN;
break; break;
case 7: case STATE_SUMMARY_CLEAN:
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId); DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId);
@@ -1420,10 +1452,10 @@ static void Select_Task_OpenSummaryScreen(u8 taskId)
FREE_AND_SET_NULL(sSelectMenuTilemapBuffer); FREE_AND_SET_NULL(sSelectMenuTilemapBuffer);
FREE_AND_SET_NULL(sSelectMonPicBgTilemapBuffer); FREE_AND_SET_NULL(sSelectMonPicBgTilemapBuffer);
FreeAllWindowBuffers(); FreeAllWindowBuffers();
gTasks[taskId].tState = 8; gTasks[taskId].tState = STATE_SUMMARY_SHOW;
} }
break; break;
case 8: case STATE_SUMMARY_SHOW:
sFactorySelectScreen->speciesNameColorBackup = gPlttBufferUnfaded[228]; sFactorySelectScreen->speciesNameColorBackup = gPlttBufferUnfaded[228];
DestroyTask(taskId); DestroyTask(taskId);
sFactorySelectScreen->fromSummaryScreen = TRUE; sFactorySelectScreen->fromSummaryScreen = TRUE;
@@ -1465,6 +1497,7 @@ static void Select_Task_Exit(u8 taskId)
} }
} }
// Handles the Yes/No prompt when confirming the 3 selected rental pokemon
static void Select_Task_HandleYesNo(u8 taskId) static void Select_Task_HandleYesNo(u8 taskId)
{ {
if (sFactorySelectScreen->monPicAnimating == TRUE) if (sFactorySelectScreen->monPicAnimating == TRUE)
@@ -1472,42 +1505,43 @@ static void Select_Task_HandleYesNo(u8 taskId)
switch (gTasks[taskId].tState) switch (gTasks[taskId].tState)
{ {
case 10: case STATE_YESNO_SHOW_MONS:
sub_819C4B4(); Select_ShowChosenMons();
gTasks[taskId].tState = 4; gTasks[taskId].tState = STATE_YESNO_SHOW_OPTIONS;
break; break;
case 4: case STATE_YESNO_SHOW_OPTIONS:
Select_ShowYesNoOptions(); Select_ShowYesNoOptions();
gTasks[taskId].tState = 5; gTasks[taskId].tState = STATE_YESNO_HANDLE_INPUT;
break; break;
case 5: case STATE_YESNO_HANDLE_INPUT:
if (JOY_NEW(A_BUTTON)) if (JOY_NEW(A_BUTTON))
{ {
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
if (sFactorySelectScreen->yesNoCursorPos == 0) if (sFactorySelectScreen->yesNoCursorPos == 0)
{ {
// Selected Yes // Selected Yes, confirmed selected pokemon
sub_819C568(); Select_HideChosenMons();
gTasks[taskId].tState = 0; gTasks[taskId].tState = 0;
gTasks[taskId].func = Select_Task_Exit; gTasks[taskId].func = Select_Task_Exit;
} }
else else
{ {
// Selected No // Selected No, continue choosing pokemon
sub_819B958(SELECT_WIN_YES_NO); Select_ErasePopupMenu(SELECT_WIN_YES_NO);
sub_819BC9C(); Select_DeclineChosenMons();
sFactorySelectScreen->fadeSpeciesNameActive = TRUE; sFactorySelectScreen->fadeSpeciesNameActive = TRUE;
gTasks[taskId].tState = 1; gTasks[taskId].tState = STATE_CHOOSE_MONS_HANDLE_INPUT;
gTasks[taskId].func = Select_Task_HandleChooseMons; gTasks[taskId].func = Select_Task_HandleChooseMons;
} }
} }
else if (JOY_NEW(B_BUTTON)) else if (JOY_NEW(B_BUTTON))
{ {
// Pressed B, Continue choosing pokemon
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
sub_819B958(SELECT_WIN_YES_NO); Select_ErasePopupMenu(SELECT_WIN_YES_NO);
sub_819BC9C(); Select_DeclineChosenMons();
sFactorySelectScreen->fadeSpeciesNameActive = TRUE; sFactorySelectScreen->fadeSpeciesNameActive = TRUE;
gTasks[taskId].tState = 1; gTasks[taskId].tState = STATE_CHOOSE_MONS_HANDLE_INPUT;
gTasks[taskId].func = Select_Task_HandleChooseMons; gTasks[taskId].func = Select_Task_HandleChooseMons;
} }
else if (JOY_REPEAT(DPAD_UP)) else if (JOY_REPEAT(DPAD_UP))
@@ -1524,48 +1558,49 @@ static void Select_Task_HandleYesNo(u8 taskId)
} }
} }
// Handles the popup menu that shows when a pokemon is selected
static void Select_Task_HandleMenu(u8 taskId) static void Select_Task_HandleMenu(u8 taskId)
{ {
switch (gTasks[taskId].tState) switch (gTasks[taskId].tState)
{ {
case 2: case STATE_MENU_INIT:
if (!sFactorySelectScreen->fromSummaryScreen) if (!sFactorySelectScreen->fromSummaryScreen)
OpenMonPic(&sFactorySelectScreen->monPics[1].bgSpriteId, &sFactorySelectScreen->monPicAnimating, FALSE); OpenMonPic(&sFactorySelectScreen->monPics[1].bgSpriteId, &sFactorySelectScreen->monPicAnimating, FALSE);
gTasks[taskId].tState = 9; gTasks[taskId].tState = STATE_MENU_SHOW_OPTIONS;
break; break;
case 9: case STATE_MENU_SHOW_OPTIONS:
if (sFactorySelectScreen->monPicAnimating != TRUE) if (sFactorySelectScreen->monPicAnimating != TRUE)
{ {
Select_ShowMenuOptions(); Select_ShowMenuOptions();
sFactorySelectScreen->fromSummaryScreen = FALSE; sFactorySelectScreen->fromSummaryScreen = FALSE;
gTasks[taskId].tState = 3; gTasks[taskId].tState = STATE_MENU_HANDLE_INPUT;
} }
break; break;
case 3: case STATE_MENU_HANDLE_INPUT:
if (JOY_NEW(A_BUTTON)) if (JOY_NEW(A_BUTTON))
{ {
u8 retVal; u8 retVal;
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
retVal = Select_RunMenuOptionFunc(); retVal = Select_RunMenuOptionFunc();
if (retVal == 1) if (retVal == SELECT_CONTINUE_CHOOSING)
{ {
sFactorySelectScreen->fadeSpeciesNameActive = TRUE; sFactorySelectScreen->fadeSpeciesNameActive = TRUE;
gTasks[taskId].tState = 1; gTasks[taskId].tState = STATE_CHOOSE_MONS_HANDLE_INPUT;
gTasks[taskId].func = Select_Task_HandleChooseMons; gTasks[taskId].func = Select_Task_HandleChooseMons;
} }
else if (retVal == 2) else if (retVal == SELECT_CONFIRM_MONS)
{ {
gTasks[taskId].tState = 10; gTasks[taskId].tState = STATE_YESNO_SHOW_MONS;
gTasks[taskId].func = Select_Task_HandleYesNo; gTasks[taskId].func = Select_Task_HandleYesNo;
} }
else if (retVal == 3) else if (retVal == SELECT_INVALID_MON)
{ {
gTasks[taskId].tState = 11; gTasks[taskId].tState = STATE_CHOOSE_MONS_INVALID;
gTasks[taskId].func = Select_Task_HandleChooseMons; gTasks[taskId].func = Select_Task_HandleChooseMons;
} }
else else // SELECT_SUMMARY
{ {
gTasks[taskId].tState = 6; gTasks[taskId].tState = STATE_SUMMARY_FADE;
gTasks[taskId].func = Select_Task_OpenSummaryScreen; gTasks[taskId].func = Select_Task_OpenSummaryScreen;
} }
} }
@@ -1573,9 +1608,9 @@ static void Select_Task_HandleMenu(u8 taskId)
{ {
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
CloseMonPic(sFactorySelectScreen->monPics[1], &sFactorySelectScreen->monPicAnimating, FALSE); CloseMonPic(sFactorySelectScreen->monPics[1], &sFactorySelectScreen->monPicAnimating, FALSE);
sub_819B958(SELECT_WIN_OPTIONS); Select_ErasePopupMenu(SELECT_WIN_OPTIONS);
sFactorySelectScreen->fadeSpeciesNameActive = TRUE; sFactorySelectScreen->fadeSpeciesNameActive = TRUE;
gTasks[taskId].tState = 1; gTasks[taskId].tState = STATE_CHOOSE_MONS_HANDLE_INPUT;
gTasks[taskId].func = Select_Task_HandleChooseMons; gTasks[taskId].func = Select_Task_HandleChooseMons;
} }
else if (JOY_REPEAT(DPAD_UP)) else if (JOY_REPEAT(DPAD_UP))
@@ -1589,7 +1624,7 @@ static void Select_Task_HandleMenu(u8 taskId)
Select_UpdateMenuCursorPosition(1); Select_UpdateMenuCursorPosition(1);
} }
break; break;
case 12: case STATE_MENU_REINIT:
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
if (sFactorySelectScreen->fromSummaryScreen == TRUE) if (sFactorySelectScreen->fromSummaryScreen == TRUE)
@@ -1598,16 +1633,17 @@ static void Select_Task_HandleMenu(u8 taskId)
gPlttBufferUnfaded[228] = gPlttBufferUnfaded[244]; gPlttBufferUnfaded[228] = gPlttBufferUnfaded[244];
} }
sFactorySelectScreen->fromSummaryScreen = FALSE; sFactorySelectScreen->fromSummaryScreen = FALSE;
gTasks[taskId].tState = 3; gTasks[taskId].tState = STATE_MENU_HANDLE_INPUT;
} }
break; break;
case 13: case STATE_MENU_RESHOW:
Select_ShowMenuOptions(); Select_ShowMenuOptions();
gTasks[taskId].tState = 12; gTasks[taskId].tState = STATE_MENU_REINIT;
break; break;
} }
} }
// Handles input on the main selection screen, when no popup menu is open
static void Select_Task_HandleChooseMons(u8 taskId) static void Select_Task_HandleChooseMons(u8 taskId)
{ {
if (sFactorySelectScreen->monPicAnimating == TRUE) if (sFactorySelectScreen->monPicAnimating == TRUE)
@@ -1615,19 +1651,19 @@ static void Select_Task_HandleChooseMons(u8 taskId)
switch (gTasks[taskId].tState) switch (gTasks[taskId].tState)
{ {
case 0: case STATE_CHOOSE_MONS_INIT:
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
gTasks[taskId].tState = 1; gTasks[taskId].tState = STATE_CHOOSE_MONS_HANDLE_INPUT;
sFactorySelectScreen->fadeSpeciesNameActive = TRUE; sFactorySelectScreen->fadeSpeciesNameActive = TRUE;
} }
break; break;
case 1: case STATE_CHOOSE_MONS_HANDLE_INPUT:
if (JOY_NEW(A_BUTTON)) if (JOY_NEW(A_BUTTON))
{ {
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
sFactorySelectScreen->fadeSpeciesNameActive = FALSE; sFactorySelectScreen->fadeSpeciesNameActive = FALSE;
gTasks[taskId].tState = 2; gTasks[taskId].tState = STATE_MENU_INIT;
gTasks[taskId].func = Select_Task_HandleMenu; gTasks[taskId].func = Select_Task_HandleMenu;
} }
else if (JOY_REPEAT(DPAD_LEFT)) else if (JOY_REPEAT(DPAD_LEFT))
@@ -1645,14 +1681,14 @@ static void Select_Task_HandleChooseMons(u8 taskId)
Select_PrintMonSpecies(); Select_PrintMonSpecies();
} }
break; break;
case 11: case STATE_CHOOSE_MONS_INVALID:
if (JOY_NEW(A_BUTTON)) if (JOY_NEW(A_BUTTON))
{ {
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
CloseMonPic(sFactorySelectScreen->monPics[1], &sFactorySelectScreen->monPicAnimating, FALSE); CloseMonPic(sFactorySelectScreen->monPics[1], &sFactorySelectScreen->monPicAnimating, FALSE);
Select_PrintSelectMonString(); Select_PrintSelectMonString();
sFactorySelectScreen->fadeSpeciesNameActive = TRUE; sFactorySelectScreen->fadeSpeciesNameActive = TRUE;
gTasks[taskId].tState = 1; gTasks[taskId].tState = STATE_CHOOSE_MONS_HANDLE_INPUT;
} }
break; break;
} }
@@ -1785,7 +1821,7 @@ static void Select_ShowYesNoOptions(void)
Select_PrintYesNoOptions(); Select_PrintYesNoOptions();
} }
static void sub_819B958(u8 windowId) static void Select_ErasePopupMenu(u8 windowId)
{ {
gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = TRUE; gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = TRUE;
gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = TRUE; gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = TRUE;
@@ -1878,29 +1914,29 @@ static u8 Select_OptionRentDeselect(void)
if (selectedId == 0 && !Select_AreSpeciesValid(monId)) if (selectedId == 0 && !Select_AreSpeciesValid(monId))
{ {
Select_PrintCantSelectSameMon(); Select_PrintCantSelectSameMon();
sub_819B958(SELECT_WIN_OPTIONS); Select_ErasePopupMenu(SELECT_WIN_OPTIONS);
return 3; return SELECT_INVALID_MON;
} }
else else
{ {
CloseMonPic(sFactorySelectScreen->monPics[1], &sFactorySelectScreen->monPicAnimating, FALSE); CloseMonPic(sFactorySelectScreen->monPics[1], &sFactorySelectScreen->monPicAnimating, FALSE);
Select_HandleMonSelectionChange(); Select_HandleMonSelectionChange();
Select_PrintSelectMonString(); Select_PrintSelectMonString();
sub_819B958(SELECT_WIN_OPTIONS); Select_ErasePopupMenu(SELECT_WIN_OPTIONS);
if (sFactorySelectScreen->selectingMonsState > 3) if (sFactorySelectScreen->selectingMonsState > FRONTIER_PARTY_SIZE)
return 2; return SELECT_CONFIRM_MONS;
else else
return 1; return SELECT_CONTINUE_CHOOSING;
} }
} }
static u8 sub_819BC9C(void) static u8 Select_DeclineChosenMons(void)
{ {
sub_819C568(); Select_HideChosenMons();
Select_HandleMonSelectionChange(); Select_HandleMonSelectionChange();
Select_PrintSelectMonString(); Select_PrintSelectMonString();
sub_819B958(SELECT_WIN_OPTIONS); Select_ErasePopupMenu(SELECT_WIN_OPTIONS);
if (sFactorySelectScreen->selectingMonsState > 3) if (sFactorySelectScreen->selectingMonsState > FRONTIER_PARTY_SIZE)
return 2; return 2;
else else
return 1; return 1;
@@ -1908,14 +1944,14 @@ static u8 sub_819BC9C(void)
static u8 Select_OptionSummary(void) static u8 Select_OptionSummary(void)
{ {
return 0; return SELECT_SUMMARY;
} }
static u8 Select_OptionOthers(void) static u8 Select_OptionOthers(void)
{ {
CloseMonPic(sFactorySelectScreen->monPics[1], &sFactorySelectScreen->monPicAnimating, FALSE); CloseMonPic(sFactorySelectScreen->monPics[1], &sFactorySelectScreen->monPicAnimating, FALSE);
sub_819B958(SELECT_WIN_OPTIONS); Select_ErasePopupMenu(SELECT_WIN_OPTIONS);
return 1; return SELECT_CONTINUE_CHOOSING;
} }
static void Select_PrintMonCategory(void) static void Select_PrintMonCategory(void)
@@ -1977,7 +2013,7 @@ static void Select_ReshowMonSprite(void)
gSprites[sFactorySelectScreen->monPics[1].bgSpriteId].invisible = TRUE; gSprites[sFactorySelectScreen->monPics[1].bgSpriteId].invisible = TRUE;
} }
static void Select_ShowChosenMonsSprites(void) static void Select_CreateChosenMonsSprites(void)
{ {
u8 i, j; u8 i, j;
@@ -2002,10 +2038,11 @@ static void Select_ShowChosenMonsSprites(void)
sFactorySelectScreen->monPicAnimating = FALSE; sFactorySelectScreen->monPicAnimating = FALSE;
} }
static void sub_819C040(struct Sprite *sprite) static void SpriteCB_OpenChosenMonPics(struct Sprite *sprite)
{ {
u8 taskId; u8 taskId;
// Current sprite is monPics[1]
if (sprite->affineAnimEnded if (sprite->affineAnimEnded
&& gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].affineAnimEnded && gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].affineAnimEnded
&& gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].affineAnimEnded) && gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].affineAnimEnded)
@@ -2014,15 +2051,16 @@ static void sub_819C040(struct Sprite *sprite)
gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].invisible = TRUE; gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].invisible = TRUE;
gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].invisible = TRUE; gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].invisible = TRUE;
taskId = CreateTask(sub_819C1D0, 1); taskId = CreateTask(Select_Task_OpenChosenMonPics, 1);
gTasks[taskId].func(taskId); gTasks[taskId].func(taskId);
sprite->callback = SpriteCallbackDummy; sprite->callback = SpriteCallbackDummy;
} }
} }
static void sub_819C100(struct Sprite *sprite) static void SpriteCB_CloseChosenMonPics(struct Sprite *sprite)
{ {
// Current sprite is monPics[1]
if (sprite->affineAnimEnded if (sprite->affineAnimEnded
&& gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].affineAnimEnded && gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].affineAnimEnded
&& gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].affineAnimEnded) && gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].affineAnimEnded)
@@ -2039,7 +2077,7 @@ static void sub_819C100(struct Sprite *sprite)
} }
} }
// Task data for sub_819C1D0, sub_819C2D4, Task_CloseMonPic, and Task_OpenMonPic // Task data for Select_Task_OpenChosenMonPics, Select_Task_CloseChosenMonPics, Task_CloseMonPic, and Task_OpenMonPic
#define tWinLeft data[3] #define tWinLeft data[3]
#ifndef UBFIX #ifndef UBFIX
#define tWinRight data[24] // UB: Typo? Likely meant data[4], 24 is out of bounds #define tWinRight data[24] // UB: Typo? Likely meant data[4], 24 is out of bounds
@@ -2051,7 +2089,7 @@ static void sub_819C100(struct Sprite *sprite)
#define tSpriteId data[6] // TODO: Clarify, what sprite #define tSpriteId data[6] // TODO: Clarify, what sprite
#define tIsSwapScreen data[7] #define tIsSwapScreen data[7]
static void sub_819C1D0(u8 taskId) static void Select_Task_OpenChosenMonPics(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
switch (task->tState) switch (task->tState)
@@ -2087,31 +2125,17 @@ static void sub_819C1D0(u8 taskId)
break; break;
default: default:
DestroyTask(taskId); DestroyTask(taskId);
Select_ShowChosenMonsSprites(); Select_CreateChosenMonsSprites();
return; return;
} }
task->tState++; task->tState++;
} }
static void sub_819C2D4(u8 taskId) static void Select_Task_CloseChosenMonPics(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
switch (task->tState) switch (task->tState)
{ {
default:
HideBg(3);
gSprites[sFactorySelectScreen->monPics[1].bgSpriteId].invisible = FALSE;
gSprites[sFactorySelectScreen->monPics[1].bgSpriteId].callback = sub_819C100;
gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].invisible = FALSE;
gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].callback = SpriteCallbackDummy;
gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].invisible = FALSE;
gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].callback = SpriteCallbackDummy;
StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->monPics[1].bgSpriteId], 1);
StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->monPics[0].bgSpriteId], 1);
StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->monPics[2].bgSpriteId], 1);
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
DestroyTask(taskId);
break;
case 0: case 0:
task->tWinLeft = 16; task->tWinLeft = 16;
task->tWinRight = DISPLAY_WIDTH - 16; task->tWinRight = DISPLAY_WIDTH - 16;
@@ -2136,23 +2160,37 @@ static void sub_819C2D4(u8 taskId)
if (task->tWinTop == 64) if (task->tWinTop == 64)
task->tState++; task->tState++;
break; break;
default:
HideBg(3);
gSprites[sFactorySelectScreen->monPics[1].bgSpriteId].invisible = FALSE;
gSprites[sFactorySelectScreen->monPics[1].bgSpriteId].callback = SpriteCB_CloseChosenMonPics;
gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].invisible = FALSE;
gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].callback = SpriteCallbackDummy;
gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].invisible = FALSE;
gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].callback = SpriteCallbackDummy;
StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->monPics[1].bgSpriteId], 1);
StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->monPics[0].bgSpriteId], 1);
StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->monPics[2].bgSpriteId], 1);
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
DestroyTask(taskId);
break;
} }
} }
static void sub_819C4B4(void) static void Select_ShowChosenMons(void)
{ {
sFactorySelectScreen->monPics[1].bgSpriteId = CreateSprite(&sSpriteTemplate_Select_MonPicBgAnim, 120, 64, 1); sFactorySelectScreen->monPics[1].bgSpriteId = CreateSprite(&sSpriteTemplate_Select_MonPicBgAnim, 120, 64, 1);
sFactorySelectScreen->monPics[0].bgSpriteId = CreateSprite(&sSpriteTemplate_Select_MonPicBgAnim, 44, 64, 1); sFactorySelectScreen->monPics[0].bgSpriteId = CreateSprite(&sSpriteTemplate_Select_MonPicBgAnim, 44, 64, 1);
sFactorySelectScreen->monPics[2].bgSpriteId = CreateSprite(&sSpriteTemplate_Select_MonPicBgAnim, 196, 64, 1); sFactorySelectScreen->monPics[2].bgSpriteId = CreateSprite(&sSpriteTemplate_Select_MonPicBgAnim, 196, 64, 1);
gSprites[sFactorySelectScreen->monPics[1].bgSpriteId].callback = sub_819C040; gSprites[sFactorySelectScreen->monPics[1].bgSpriteId].callback = SpriteCB_OpenChosenMonPics;
gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].callback = SpriteCallbackDummy; gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].callback = SpriteCallbackDummy;
gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].callback = SpriteCallbackDummy; gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].callback = SpriteCallbackDummy;
sFactorySelectScreen->monPicAnimating = TRUE; sFactorySelectScreen->monPicAnimating = TRUE;
} }
static void sub_819C568(void) static void Select_HideChosenMons(void)
{ {
u8 taskId; u8 taskId;
@@ -2160,7 +2198,7 @@ static void sub_819C568(void)
FreeAndDestroyMonPicSprite(sFactorySelectScreen->monPics[1].monSpriteId); FreeAndDestroyMonPicSprite(sFactorySelectScreen->monPics[1].monSpriteId);
FreeAndDestroyMonPicSprite(sFactorySelectScreen->monPics[2].monSpriteId); FreeAndDestroyMonPicSprite(sFactorySelectScreen->monPics[2].monSpriteId);
taskId = CreateTask(sub_819C2D4, 1); taskId = CreateTask(Select_Task_CloseChosenMonPics, 1);
gTasks[taskId].func(taskId); gTasks[taskId].func(taskId);
sFactorySelectScreen->monPicAnimating = TRUE; sFactorySelectScreen->monPicAnimating = TRUE;
@@ -2194,7 +2232,6 @@ static bool32 Select_AreSpeciesValid(u16 monId)
} }
} }
} }
return TRUE; return TRUE;
} }
@@ -2494,6 +2531,9 @@ static void Swap_AskAcceptMon(u8 taskId)
} }
} }
#undef STATE_SHOW_YES_NO
#undef STATE_HANDLE_INPUT
static void Swap_Task_HandleMenu(u8 taskId) static void Swap_Task_HandleMenu(u8 taskId)
{ {
switch (gTasks[taskId].tState) switch (gTasks[taskId].tState)
@@ -2688,6 +2728,7 @@ static void Swap_Task_FadeSpeciesName2(u8 taskId)
} }
} }
// TODO
static void sub_819D12C(u8 taskId) static void sub_819D12C(u8 taskId)
{ {
s8 i; s8 i;
@@ -4031,7 +4072,7 @@ static void SpriteCB_OpenMonPic(struct Sprite *sprite)
} }
} }
static void sub_819F654(struct Sprite *sprite) static void SpriteCB_CloseMonPic(struct Sprite *sprite)
{ {
if (sprite->affineAnimEnded) if (sprite->affineAnimEnded)
{ {
@@ -4050,6 +4091,7 @@ static void Task_OpenMonPic(u8 taskId)
switch (task->tState) switch (task->tState)
{ {
case 0: case 0:
// Init
task->tWinLeft = 88; task->tWinLeft = 88;
task->tWinRight = DISPLAY_WIDTH - 88; task->tWinRight = DISPLAY_WIDTH - 88;
task->tWinTop = 64; task->tWinTop = 64;
@@ -4061,11 +4103,13 @@ static void Task_OpenMonPic(u8 taskId)
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
break; break;
case 1: case 1:
// Show mon pic bg
ShowBg(3); ShowBg(3);
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
break; break;
case 2: case 2:
// Animate mon pic bg
task->tWinTop -= 4; task->tWinTop -= 4;
task->tWinBottom += 4; task->tWinBottom += 4;
if (task->tWinTop <= 32 || task->tWinBottom >= 96) if (task->tWinTop <= 32 || task->tWinBottom >= 96)
@@ -4094,16 +4138,8 @@ static void Task_CloseMonPic(u8 taskId)
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
switch (task->tState) switch (task->tState)
{ {
default:
HideBg(3);
gSprites[task->tSpriteId].sIsSwapScreen = task->tIsSwapScreen;
gSprites[task->tSpriteId].invisible = FALSE;
gSprites[task->tSpriteId].callback = sub_819F654;
StartSpriteAffineAnim(&gSprites[task->tSpriteId], 1);
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
DestroyTask(taskId);
break;
case 0: case 0:
// Init
task->tWinLeft = 88; task->tWinLeft = 88;
task->tWinRight = DISPLAY_WIDTH - 88; task->tWinRight = DISPLAY_WIDTH - 88;
task->tWinTop = 32; task->tWinTop = 32;
@@ -4116,6 +4152,7 @@ static void Task_CloseMonPic(u8 taskId)
task->tState++; task->tState++;
break; break;
case 1: case 1:
// Animate bg
task->tWinTop += 4; task->tWinTop += 4;
task->tWinBottom -= 4; task->tWinBottom -= 4;
if (task->tWinTop >= 64 || task->tWinBottom <= 65) if (task->tWinTop >= 64 || task->tWinBottom <= 65)
@@ -4127,6 +4164,16 @@ static void Task_CloseMonPic(u8 taskId)
if (task->tWinTop == 64) if (task->tWinTop == 64)
task->tState++; task->tState++;
break; break;
default:
// Hide bg
HideBg(3);
gSprites[task->tSpriteId].sIsSwapScreen = task->tIsSwapScreen;
gSprites[task->tSpriteId].invisible = FALSE;
gSprites[task->tSpriteId].callback = SpriteCB_CloseMonPic;
StartSpriteAffineAnim(&gSprites[task->tSpriteId], 1);
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
DestroyTask(taskId);
break;
} }
} }