It was a dark and spooky merge... 🎃 (pret merge 2023/10/27) (#3471)

This commit is contained in:
Eduardo Quezada D'Ottone 2023-10-27 11:35:03 -03:00 committed by GitHub
commit 5e67625e05
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 636 additions and 529 deletions

View File

@ -150,9 +150,9 @@ Note that in msys2, Copy is Ctrl+Insert and Paste is Shift+Insert.
<details> <details>
<summary><i>Notes...</i></summary> <summary><i>Notes...</i></summary>
> Note 1: While not shown, msys uses forward slashes `/` instead of backwards slashes `\` as the directory separator. > Note 1: While not shown, msys uses forward slashes `/` instead of backwards slashes `\` as the directory separator.
> Note 2: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "Downloads/My Downloads"`. > Note 2: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "Downloads/My Downloads"`.
> Note 3: Windows path names are case-insensitive so adhering to capitalization isnt needed. > Note 3: Windows path names are case-insensitive so adhering to capitalization isnt needed.
> Note 4: If libpng was saved elsewhere, you will need to specify the full path to where libpng was downloaded, e.g. `cd c:/devkitpro/msys2` if it was saved there. > Note 4: If libpng was saved elsewhere, you will need to specify the full path to where libpng was downloaded, e.g. `cd c:/devkitpro/msys2` if it was saved there.
</details> </details>

View File

@ -1,3 +1,4 @@
#include "config.h"
#include "constants/global.h" #include "constants/global.h"
#include "constants/contest.h" #include "constants/contest.h"
.include "asm/macros.inc" .include "asm/macros.inc"
@ -435,11 +436,11 @@ AI_CGM_BetterWhenAudienceExcited:
AI_CGM_BetterWhenAudienceExcited_1stUp: AI_CGM_BetterWhenAudienceExcited_1stUp:
@ BUG: Should be if_appeal_num_eq 0 @ BUG: Should be if_appeal_num_eq 0
@ 1st up on 1st appeal excitement will always be 0 @ 1st up on 1st appeal excitement will always be 0
.ifdef BUGFIX #ifdef BUGFIX
if_appeal_num_eq 0, AI_CGM_BetterWhenAudienceExcited_1stAppeal if_appeal_num_eq 0, AI_CGM_BetterWhenAudienceExcited_1stAppeal
.else #else
if_appeal_num_not_eq 0, AI_CGM_BetterWhenAudienceExcited_1stAppeal if_appeal_num_not_eq 0, AI_CGM_BetterWhenAudienceExcited_1stAppeal
.endif #endif
if_excitement_eq 4, AI_CGM_BetterWhenAudienceExcited_1AwayFromMax if_excitement_eq 4, AI_CGM_BetterWhenAudienceExcited_1AwayFromMax
if_excitement_eq 3, AI_CGM_BetterWhenAudienceExcited_2AwayFromMax if_excitement_eq 3, AI_CGM_BetterWhenAudienceExcited_2AwayFromMax
end end
@ -546,11 +547,11 @@ AI_CGM_TargetMonWithJudgesAttention:
end end
AI_CGM_TargetMonWithJudgesAttention_CheckMon1: AI_CGM_TargetMonWithJudgesAttention_CheckMon1:
if_cannot_participate MON_1, AI_CGM_TargetMonWithJudgesAttention_CheckMon2 if_cannot_participate MON_1, AI_CGM_TargetMonWithJudgesAttention_CheckMon2
.ifdef BUGFIX #ifdef BUGFIX
if_not_used_combo_starter MON_1, AI_CGM_TargetMonWithJudgesAttention_CheckMon2 if_not_used_combo_starter MON_1, AI_CGM_TargetMonWithJudgesAttention_CheckMon2
.else #else
if_used_combo_starter MON_1, AI_CGM_TargetMonWithJudgesAttention_CheckMon2 if_used_combo_starter MON_1, AI_CGM_TargetMonWithJudgesAttention_CheckMon2
.endif #endif
if_random_less_than 125, AI_CGM_TargetMonWithJudgesAttention_CheckMon2 if_random_less_than 125, AI_CGM_TargetMonWithJudgesAttention_CheckMon2
score +2 score +2
if_not_completed_combo MON_1, AI_CGM_TargetMonWithJudgesAttention_CheckMon2 if_not_completed_combo MON_1, AI_CGM_TargetMonWithJudgesAttention_CheckMon2
@ -559,11 +560,11 @@ AI_CGM_TargetMonWithJudgesAttention_CheckMon1:
AI_CGM_TargetMonWithJudgesAttention_CheckMon2: AI_CGM_TargetMonWithJudgesAttention_CheckMon2:
if_user_order_eq MON_2, AI_CGM_End if_user_order_eq MON_2, AI_CGM_End
if_cannot_participate MON_2, AI_CGM_TargetMonWithJudgesAttention_CheckMon3 if_cannot_participate MON_2, AI_CGM_TargetMonWithJudgesAttention_CheckMon3
.ifdef BUGFIX #ifdef BUGFIX
if_not_used_combo_starter MON_2, AI_CGM_TargetMonWithJudgesAttention_CheckMon3 if_not_used_combo_starter MON_2, AI_CGM_TargetMonWithJudgesAttention_CheckMon3
.else #else
if_used_combo_starter MON_2, AI_CGM_TargetMonWithJudgesAttention_CheckMon3 if_used_combo_starter MON_2, AI_CGM_TargetMonWithJudgesAttention_CheckMon3
.endif #endif
if_random_less_than 125, AI_CGM_TargetMonWithJudgesAttention_CheckMon3 if_random_less_than 125, AI_CGM_TargetMonWithJudgesAttention_CheckMon3
score +2 score +2
if_not_completed_combo MON_2, AI_CGM_TargetMonWithJudgesAttention_CheckMon3 if_not_completed_combo MON_2, AI_CGM_TargetMonWithJudgesAttention_CheckMon3
@ -572,11 +573,11 @@ AI_CGM_TargetMonWithJudgesAttention_CheckMon2:
AI_CGM_TargetMonWithJudgesAttention_CheckMon3: AI_CGM_TargetMonWithJudgesAttention_CheckMon3:
if_user_order_eq MON_3, AI_CGM_End if_user_order_eq MON_3, AI_CGM_End
if_cannot_participate MON_3, AI_CGM_End if_cannot_participate MON_3, AI_CGM_End
.ifdef BUGFIX #ifdef BUGFIX
if_not_used_combo_starter MON_3, AI_CGM_End if_not_used_combo_starter MON_3, AI_CGM_End
.else #else
if_used_combo_starter MON_3, AI_CGM_End if_used_combo_starter MON_3, AI_CGM_End
.endif #endif
if_random_less_than 125, AI_CGM_End if_random_less_than 125, AI_CGM_End
score +2 score +2
if_not_completed_combo MON_3, AI_CGM_End if_not_completed_combo MON_3, AI_CGM_End

View File

@ -1,3 +1,4 @@
#include "config.h"
#include "config/battle.h" #include "config/battle.h"
#include "config/item.h" #include "config/item.h"
#include "constants/global.h" #include "constants/global.h"

View File

@ -415,18 +415,18 @@ BattleFrontier_BattleTowerLobby_EventScript_SaveBeforeLinkMultisChallenge::
@ to the flash, but not data in PokemonStorage. The SaveGame script that follows asks the player to do a full save, @ to the flash, but not data in PokemonStorage. The SaveGame script that follows asks the player to do a full save,
@ which they can opt out of. As a result the player can save their party and quit without having saved the PC. @ which they can opt out of. As a result the player can save their party and quit without having saved the PC.
@ This allows players to clone pokemon and their held items by withdrawing them (or erase them by despositing). @ This allows players to clone pokemon and their held items by withdrawing them (or erase them by despositing).
.ifndef BUGFIX #ifndef BUGFIX
tower_save 0 tower_save 0
.endif #endif
call Common_EventScript_SaveGame call Common_EventScript_SaveGame
setvar VAR_TEMP_CHALLENGE_STATUS, 255 setvar VAR_TEMP_CHALLENGE_STATUS, 255
goto_if_eq VAR_RESULT, 0, BattleFrontier_BattleTowerLobby_EventScript_CancelChallengeSaveFailed goto_if_eq VAR_RESULT, 0, BattleFrontier_BattleTowerLobby_EventScript_CancelChallengeSaveFailed
@ GAME_STAT_ENTERED_BATTLE_TOWER should not be incremented here, for two reasons: @ GAME_STAT_ENTERED_BATTLE_TOWER should not be incremented here, for two reasons:
@ 1. It is incremented again in BattleFrontier_BattleTowerLobby_EventScript_CableLinkSuccessful or BattleFrontier_BattleTowerLobby_EventScript_WirelessLinkSuccessful @ 1. It is incremented again in BattleFrontier_BattleTowerLobby_EventScript_CableLinkSuccessful or BattleFrontier_BattleTowerLobby_EventScript_WirelessLinkSuccessful
@ 2. If the player tries to save, but fails, the counter will still be incremented even if the player never enters the tower. @ 2. If the player tries to connect, but fails, the counter will still be incremented even if the player never enters the tower.
.ifndef BUGFIX #ifndef BUGFIX
incrementgamestat GAME_STAT_ENTERED_BATTLE_TOWER incrementgamestat GAME_STAT_ENTERED_BATTLE_TOWER
.endif #endif
specialvar VAR_RESULT, IsWirelessAdapterConnected specialvar VAR_RESULT, IsWirelessAdapterConnected
goto_if_eq VAR_RESULT, TRUE, BattleFrontier_BattleTowerLobby_EventScript_TryWirelessLink goto_if_eq VAR_RESULT, TRUE, BattleFrontier_BattleTowerLobby_EventScript_TryWirelessLink
goto BattleFrontier_BattleTowerLobby_EventScript_TryCableLink goto BattleFrontier_BattleTowerLobby_EventScript_TryCableLink

View File

@ -229,11 +229,11 @@ MossdeepCity_SpaceCenter_1F_EventScript_Grunt2::
copyobjectxytoperm LOCALID_STAIR_GRUNT copyobjectxytoperm LOCALID_STAIR_GRUNT
switch VAR_FACING switch VAR_FACING
case DIR_WEST, MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsWest case DIR_WEST, MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsWest
#ifdef BUGFIX #ifdef BUGFIX
case DIR_EAST, MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsEast case DIR_EAST, MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsEast
#else #else
case DIR_WEST, MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsEast case DIR_WEST, MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsEast
#endif #endif
applymovement LOCALID_STAIR_GRUNT, MossdeepCity_SpaceCenter_1F_Movement_MoveGruntFromStairs applymovement LOCALID_STAIR_GRUNT, MossdeepCity_SpaceCenter_1F_Movement_MoveGruntFromStairs
waitmovement 0 waitmovement 0
setvar VAR_MOSSDEEP_SPACE_CENTER_STAIR_GUARD_STATE, 2 setvar VAR_MOSSDEEP_SPACE_CENTER_STAIR_GUARD_STATE, 2

View File

@ -13,9 +13,9 @@ TrainerHill_OnWarp:
TrainerHill_1F_EventScript_DummyOnWarp:: TrainerHill_1F_EventScript_DummyOnWarp::
setvar VAR_TEMP_3, 1 setvar VAR_TEMP_3, 1
.ifdef BUGFIX #ifdef BUGFIX
end @ Missing end. By chance, the next byte (0x02 of VAR_TEMP_2) is also the id for the end cmd end @ Missing end. By chance, the next byte (0x02 of VAR_TEMP_2) is also the id for the end cmd
.endif #endif
TrainerHill_OnFrame: TrainerHill_OnFrame:
map_script_2 VAR_TEMP_2, 0, TrainerHill_1F_EventScript_DummyWarpToEntranceCounter map_script_2 VAR_TEMP_2, 0, TrainerHill_1F_EventScript_DummyWarpToEntranceCounter

View File

@ -741,8 +741,15 @@ u8 GetFactoryMonFixedIV(u8 challengeNum, bool8 isLastBattle)
u8 ivSet; u8 ivSet;
bool8 useHigherIV = isLastBattle ? TRUE : FALSE; bool8 useHigherIV = isLastBattle ? TRUE : FALSE;
if (challengeNum > 8) // The Factory has an out-of-bounds access when generating the rental draft for round 9 (challengeNum==8),
ivSet = 7; // or the "elevated" rentals from round 8 (challengeNum+1==8)
// This happens to land on a number higher than 31, which is interpreted as "random IVs"
#ifdef BUGFIX
if (challengeNum >= ARRAY_COUNT(sFixedIVTable))
#else
if (challengeNum > ARRAY_COUNT(sFixedIVTable))
#endif
ivSet = ARRAY_COUNT(sFixedIVTable) - 1;
else else
ivSet = challengeNum; ivSet = challengeNum;

View File

@ -1325,7 +1325,7 @@ u8 Unref_TryInitLocalObjectEvent(u8 localId)
if (InBattlePyramid()) if (InBattlePyramid())
objectEventCount = GetNumBattlePyramidObjectEvents(); objectEventCount = GetNumBattlePyramidObjectEvents();
else if (InTrainerHill()) else if (InTrainerHill())
objectEventCount = 2; objectEventCount = HILL_TRAINERS_PER_FLOOR;
else else
objectEventCount = gMapHeader.events->objectEventCount; objectEventCount = gMapHeader.events->objectEventCount;
@ -1641,7 +1641,7 @@ void TrySpawnObjectEvents(s16 cameraX, s16 cameraY)
if (InBattlePyramid()) if (InBattlePyramid())
objectCount = GetNumBattlePyramidObjectEvents(); objectCount = GetNumBattlePyramidObjectEvents();
else if (InTrainerHill()) else if (InTrainerHill())
objectCount = 2; objectCount = HILL_TRAINERS_PER_FLOOR;
else else
objectCount = gMapHeader.events->objectEventCount; objectCount = gMapHeader.events->objectEventCount;

File diff suppressed because it is too large Load Diff

View File

@ -205,22 +205,45 @@ static bool8 UNUSED StartMenu_ShowMapNamePopup(void)
return TRUE; return TRUE;
} }
// States and data defines for Task_MapNamePopUpWindow
enum {
STATE_SLIDE_IN,
STATE_WAIT,
STATE_SLIDE_OUT,
STATE_UNUSED,
STATE_ERASE,
STATE_END,
STATE_PRINT, // For some reason the first state is numerically last.
};
#define POPUP_OFFSCREEN_Y 40
#define POPUP_SLIDE_SPEED 2
#define tState data[0]
#define tOnscreenTimer data[1]
#define tYOffset data[2]
#define tIncomingPopUp data[3]
#define tPrintTimer data[4]
void ShowMapNamePopup(void) void ShowMapNamePopup(void)
{ {
if (FlagGet(FLAG_HIDE_MAP_NAME_POPUP) != TRUE) if (FlagGet(FLAG_HIDE_MAP_NAME_POPUP) != TRUE)
{ {
if (!FuncIsActiveTask(Task_MapNamePopUpWindow)) if (!FuncIsActiveTask(Task_MapNamePopUpWindow))
{ {
// New pop up window
sPopupTaskId = CreateTask(Task_MapNamePopUpWindow, 90); sPopupTaskId = CreateTask(Task_MapNamePopUpWindow, 90);
SetGpuReg(REG_OFFSET_BG0VOFS, 40); SetGpuReg(REG_OFFSET_BG0VOFS, POPUP_OFFSCREEN_Y);
gTasks[sPopupTaskId].data[0] = 6; gTasks[sPopupTaskId].tState = STATE_PRINT;
gTasks[sPopupTaskId].data[2] = 40; gTasks[sPopupTaskId].tYOffset = POPUP_OFFSCREEN_Y;
} }
else else
{ {
if (gTasks[sPopupTaskId].data[0] != 2) // There's already a pop up window running.
gTasks[sPopupTaskId].data[0] = 2; // Hurry the old pop up offscreen so the new one can appear.
gTasks[sPopupTaskId].data[3] = 1; if (gTasks[sPopupTaskId].tState != STATE_SLIDE_OUT)
gTasks[sPopupTaskId].tState = STATE_SLIDE_OUT;
gTasks[sPopupTaskId].tIncomingPopUp = TRUE;
} }
} }
} }
@ -229,61 +252,65 @@ static void Task_MapNamePopUpWindow(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
switch (task->data[0]) switch (task->tState)
{ {
case 6: case STATE_PRINT:
task->data[4]++; // Wait, then create and print the pop up window
if (task->data[4] > 30) if (++task->tPrintTimer > 30)
{ {
task->data[0] = 0; task->tState = STATE_SLIDE_IN;
task->data[4] = 0; task->tPrintTimer = 0;
ShowMapNamePopUpWindow(); ShowMapNamePopUpWindow();
} }
break; break;
case 0: case STATE_SLIDE_IN:
task->data[2] -= 2; // Slide the window onscreen.
if (task->data[2] <= 0 ) task->tYOffset -= POPUP_SLIDE_SPEED;
if (task->tYOffset <= 0 )
{ {
task->data[2] = 0; task->tYOffset = 0;
task->data[0] = 1; task->tState = STATE_WAIT;
gTasks[sPopupTaskId].data[1] = 0; gTasks[sPopupTaskId].data[1] = 0;
} }
break; break;
case 1: case STATE_WAIT:
task->data[1]++; // Wait while the window is fully onscreen.
if (task->data[1] > 120 ) if (++task->tOnscreenTimer > 120)
{ {
task->data[1] = 0; task->tOnscreenTimer = 0;
task->data[0] = 2; task->tState = STATE_SLIDE_OUT;
} }
break; break;
case 2: case STATE_SLIDE_OUT:
task->data[2] += 2; // Slide the window offscreen.
if (task->data[2] > 39) task->tYOffset += POPUP_SLIDE_SPEED;
if (task->tYOffset >= POPUP_OFFSCREEN_Y)
{ {
task->data[2] = 40; task->tYOffset = POPUP_OFFSCREEN_Y;
if (task->data[3]) if (task->tIncomingPopUp)
{ {
task->data[0] = 6; // A new pop up window is incoming,
task->data[4] = 0; // return to the first state to show it.
task->data[3] = 0; task->tState = STATE_PRINT;
task->tPrintTimer = 0;
task->tIncomingPopUp = FALSE;
} }
else else
{ {
task->data[0] = 4; task->tState = STATE_ERASE;
return; return;
} }
} }
break; break;
case 4: case STATE_ERASE:
ClearStdWindowAndFrame(GetMapNamePopUpWindowId(), TRUE); ClearStdWindowAndFrame(GetMapNamePopUpWindowId(), TRUE);
task->data[0] = 5; task->tState = STATE_END;
break; break;
case 5: case STATE_END:
HideMapNamePopUpWindow(); HideMapNamePopUpWindow();
return; return;
} }
SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]); SetGpuReg(REG_OFFSET_BG0VOFS, task->tYOffset);
} }
void HideMapNamePopUpWindow(void) void HideMapNamePopUpWindow(void)

View File

@ -588,7 +588,7 @@ static void ConditionGraph_CalcRightHalf(struct ConditionGraph *graph)
// No need for conditional, positions on the Beauty line are always above the Cute line // No need for conditional, positions on the Beauty line are always above the Cute line
ConditionGraph_CalcLine(graph, graph->scanlineRight[0], &graph->curPositions[GRAPH_BEAUTY], &graph->curPositions[GRAPH_CUTE], TRUE, NULL); ConditionGraph_CalcLine(graph, graph->scanlineRight[0], &graph->curPositions[GRAPH_BEAUTY], &graph->curPositions[GRAPH_CUTE], TRUE, NULL);
// Calculate Cute -> Tough line (includes left scanline because this crosses the halfway point) // Calculate Cute -> Smart line (includes left scanline because this crosses the halfway point)
i = (graph->curPositions[GRAPH_CUTE].y <= graph->curPositions[GRAPH_SMART].y); i = (graph->curPositions[GRAPH_CUTE].y <= graph->curPositions[GRAPH_SMART].y);
ConditionGraph_CalcLine(graph, graph->scanlineRight[0], &graph->curPositions[GRAPH_CUTE], &graph->curPositions[GRAPH_SMART], i, graph->scanlineLeft[0]); ConditionGraph_CalcLine(graph, graph->scanlineRight[0], &graph->curPositions[GRAPH_CUTE], &graph->curPositions[GRAPH_SMART], i, graph->scanlineLeft[0]);

View File

@ -328,7 +328,7 @@ s32 mini_vpprintf(void* buf, const char *fmt, va_list va)
break; break;
case 'S' : // preproc encoded string handler case 'S' : // preproc encoded string handler
ptr = va_arg(va, char*); ptr = va_arg(va, char*);
len = StringLength(ptr); len = StringLength((u8*)ptr);
if (pad_to > 0) if (pad_to > 0)
{ {
len = mini_pad(ptr, len, pad_char, pad_to, bf); len = mini_pad(ptr, len, pad_char, pad_to, bf);

View File

@ -222,7 +222,7 @@ static const struct MenuAction sItemStorage_MenuActions[] =
[MENU_EXIT] = { gText_Cancel, {ItemStorage_Exit} } [MENU_EXIT] = { gText_Cancel, {ItemStorage_Exit} }
}; };
static const struct ItemSlot sNewGamePCItems[] = static const u16 sNewGamePCItems[][2] =
{ {
{ ITEM_POTION, 1 }, { ITEM_POTION, 1 },
{ ITEM_NONE, 0 } { ITEM_NONE, 0 }
@ -355,16 +355,20 @@ static const struct WindowTemplate sWindowTemplates_ItemStorage[ITEMPC_WIN_COUNT
static const u8 sSwapArrowTextColors[] = {TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_DARK_GRAY}; static const u8 sSwapArrowTextColors[] = {TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_DARK_GRAY};
// Macro below is likely a fakematch, equivalent to sNewGamePCItems[i].quantity
#define GET_QUANTITY(i) ((u16)((u16 *)sNewGamePCItems + 1)[i * 2])
void NewGameInitPCItems(void) void NewGameInitPCItems(void)
{ {
u8 i = 0; u8 i = 0;
ClearItemSlots(gSaveBlock1Ptr->pcItems, PC_ITEMS_COUNT); ClearItemSlots(gSaveBlock1Ptr->pcItems, PC_ITEMS_COUNT);
for(; sNewGamePCItems[i].itemId != ITEM_NONE && GET_QUANTITY(i) &&
AddPCItem(sNewGamePCItems[i].itemId, GET_QUANTITY(i)) == TRUE; i++); while (TRUE)
{
if (sNewGamePCItems[i][0] == ITEM_NONE || sNewGamePCItems[i][1] == 0)
break;
if (AddPCItem(sNewGamePCItems[i][0], sNewGamePCItems[i][1]) != TRUE)
break;
i++;
}
} }
#undef GET_QUANTITY
void BedroomPC(void) void BedroomPC(void)
{ {

View File

@ -23,6 +23,12 @@
#include "constants/rgb.h" #include "constants/rgb.h"
#include "constants/songs.h" #include "constants/songs.h"
enum {
TAG_VERSION = 1000,
TAG_PRESS_START_COPYRIGHT,
TAG_LOGO_SHINE,
};
#define VERSION_BANNER_RIGHT_TILEOFFSET 64 #define VERSION_BANNER_RIGHT_TILEOFFSET 64
#define VERSION_BANNER_LEFT_X 98 #define VERSION_BANNER_LEFT_X 98
#define VERSION_BANNER_RIGHT_X 162 #define VERSION_BANNER_RIGHT_X 162
@ -158,8 +164,8 @@ static const union AnimCmd *const sVersionBannerRightAnimTable[] =
static const struct SpriteTemplate sVersionBannerLeftSpriteTemplate = static const struct SpriteTemplate sVersionBannerLeftSpriteTemplate =
{ {
.tileTag = 1000, .tileTag = TAG_VERSION,
.paletteTag = 1000, .paletteTag = TAG_VERSION,
.oam = &sVersionBannerLeftOamData, .oam = &sVersionBannerLeftOamData,
.anims = sVersionBannerLeftAnimTable, .anims = sVersionBannerLeftAnimTable,
.images = NULL, .images = NULL,
@ -169,8 +175,8 @@ static const struct SpriteTemplate sVersionBannerLeftSpriteTemplate =
static const struct SpriteTemplate sVersionBannerRightSpriteTemplate = static const struct SpriteTemplate sVersionBannerRightSpriteTemplate =
{ {
.tileTag = 1000, .tileTag = TAG_VERSION,
.paletteTag = 1000, .paletteTag = TAG_VERSION,
.oam = &sVersionBannerRightOamData, .oam = &sVersionBannerRightOamData,
.anims = sVersionBannerRightAnimTable, .anims = sVersionBannerRightAnimTable,
.images = NULL, .images = NULL,
@ -183,7 +189,7 @@ static const struct CompressedSpriteSheet sSpriteSheet_EmeraldVersion[] =
{ {
.data = gTitleScreenEmeraldVersionGfx, .data = gTitleScreenEmeraldVersionGfx,
.size = 0x1000, .size = 0x1000,
.tag = 1000 .tag = TAG_VERSION
}, },
{}, {},
}; };
@ -205,75 +211,80 @@ static const struct OamData sOamData_CopyrightBanner =
.affineParam = 0, .affineParam = 0,
}; };
static const union AnimCmd sCopyrightBannerAnim0[] = static const union AnimCmd sAnim_PressStart_0[] =
{ {
ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(1, 4),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sCopyrightBannerAnim1[] = static const union AnimCmd sAnim_PressStart_1[] =
{ {
ANIMCMD_FRAME(5, 4), ANIMCMD_FRAME(5, 4),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sCopyrightBannerAnim2[] = static const union AnimCmd sAnim_PressStart_2[] =
{ {
ANIMCMD_FRAME(9, 4), ANIMCMD_FRAME(9, 4),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sCopyrightBannerAnim3[] = static const union AnimCmd sAnim_PressStart_3[] =
{ {
ANIMCMD_FRAME(13, 4), ANIMCMD_FRAME(13, 4),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sCopyrightBannerAnim4[] = static const union AnimCmd sAnim_PressStart_4[] =
{ {
ANIMCMD_FRAME(17, 4), ANIMCMD_FRAME(17, 4),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sCopyrightBannerAnim5[] = static const union AnimCmd sAnim_Copyright_0[] =
{ {
ANIMCMD_FRAME(21, 4), ANIMCMD_FRAME(21, 4),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sCopyrightBannerAnim6[] = static const union AnimCmd sAnim_Copyright_1[] =
{ {
ANIMCMD_FRAME(25, 4), ANIMCMD_FRAME(25, 4),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sCopyrightBannerAnim7[] = static const union AnimCmd sAnim_Copyright_2[] =
{ {
ANIMCMD_FRAME(29, 4), ANIMCMD_FRAME(29, 4),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sCopyrightBannerAnim8[] = static const union AnimCmd sAnim_Copyright_3[] =
{ {
ANIMCMD_FRAME(33, 4), ANIMCMD_FRAME(33, 4),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sCopyrightBannerAnim9[] = static const union AnimCmd sAnim_Copyright_4[] =
{ {
ANIMCMD_FRAME(37, 4), ANIMCMD_FRAME(37, 4),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd *const sStartCopyrightBannerAnimTable[] = // The "Press Start" and copyright graphics are each 5 32x8 segments long
#define NUM_PRESS_START_FRAMES 5
#define NUM_COPYRIGHT_FRAMES 5
static const union AnimCmd *const sStartCopyrightBannerAnimTable[NUM_PRESS_START_FRAMES + NUM_COPYRIGHT_FRAMES] =
{ {
sCopyrightBannerAnim0, sAnim_PressStart_0,
sCopyrightBannerAnim1, sAnim_PressStart_1,
sCopyrightBannerAnim2, sAnim_PressStart_2,
sCopyrightBannerAnim3, sAnim_PressStart_3,
sCopyrightBannerAnim4, sAnim_PressStart_4,
sCopyrightBannerAnim5, [NUM_PRESS_START_FRAMES] =
sCopyrightBannerAnim6, sAnim_Copyright_0,
sCopyrightBannerAnim7, sAnim_Copyright_1,
sCopyrightBannerAnim8, sAnim_Copyright_2,
sCopyrightBannerAnim9, sAnim_Copyright_3,
sAnim_Copyright_4,
}; };
static const struct SpriteTemplate sStartCopyrightBannerSpriteTemplate = static const struct SpriteTemplate sStartCopyrightBannerSpriteTemplate =
{ {
.tileTag = 1001, .tileTag = TAG_PRESS_START_COPYRIGHT,
.paletteTag = 1001, .paletteTag = TAG_PRESS_START_COPYRIGHT,
.oam = &sOamData_CopyrightBanner, .oam = &sOamData_CopyrightBanner,
.anims = sStartCopyrightBannerAnimTable, .anims = sStartCopyrightBannerAnimTable,
.images = NULL, .images = NULL,
@ -286,7 +297,7 @@ static const struct CompressedSpriteSheet sSpriteSheet_PressStart[] =
{ {
.data = gTitleScreenPressStartGfx, .data = gTitleScreenPressStartGfx,
.size = 0x520, .size = 0x520,
.tag = 1001 .tag = TAG_PRESS_START_COPYRIGHT
}, },
{}, {},
}; };
@ -295,7 +306,7 @@ static const struct SpritePalette sSpritePalette_PressStart[] =
{ {
{ {
.data = gTitleScreenPressStartPal, .data = gTitleScreenPressStartPal,
.tag = 1001 .tag = TAG_PRESS_START_COPYRIGHT
}, },
{}, {},
}; };
@ -330,8 +341,8 @@ static const union AnimCmd *const sPokemonLogoShineAnimTable[] =
static const struct SpriteTemplate sPokemonLogoShineSpriteTemplate = static const struct SpriteTemplate sPokemonLogoShineSpriteTemplate =
{ {
.tileTag = 1002, .tileTag = TAG_LOGO_SHINE,
.paletteTag = 1001, .paletteTag = TAG_PRESS_START_COPYRIGHT,
.oam = &sPokemonLogoShineOamData, .oam = &sPokemonLogoShineOamData,
.anims = sPokemonLogoShineAnimTable, .anims = sPokemonLogoShineAnimTable,
.images = NULL, .images = NULL,
@ -344,15 +355,25 @@ static const struct CompressedSpriteSheet sPokemonLogoShineSpriteSheet[] =
{ {
.data = sTitleScreenLogoShineGfx, .data = sTitleScreenLogoShineGfx,
.size = 0x800, .size = 0x800,
.tag = 1002 .tag = TAG_LOGO_SHINE
}, },
{}, {},
}; };
// code // Task data for the main title screen tasks (Task_TitleScreenPhase#)
#define tCounter data[0]
#define tSkipToNext data[1]
#define tPointless data[2] // Incremented but never used to do anything.
#define tBg2Y data[3]
#define tBg1Y data[4]
// Sprite data for sVersionBannerLeftSpriteTemplate / sVersionBannerRightSpriteTemplate
#define sAlphaBlendIdx data[0]
#define sParentTaskId data[1]
static void SpriteCB_VersionBannerLeft(struct Sprite *sprite) static void SpriteCB_VersionBannerLeft(struct Sprite *sprite)
{ {
if (gTasks[sprite->data[1]].data[1] != 0) if (gTasks[sprite->sParentTaskId].tSkipToNext)
{ {
sprite->oam.objMode = ST_OAM_OBJ_NORMAL; sprite->oam.objMode = ST_OAM_OBJ_NORMAL;
sprite->y = VERSION_BANNER_Y_GOAL; sprite->y = VERSION_BANNER_Y_GOAL;
@ -361,15 +382,15 @@ static void SpriteCB_VersionBannerLeft(struct Sprite *sprite)
{ {
if (sprite->y != VERSION_BANNER_Y_GOAL) if (sprite->y != VERSION_BANNER_Y_GOAL)
sprite->y++; sprite->y++;
if (sprite->data[0] != 0) if (sprite->sAlphaBlendIdx != 0)
sprite->data[0]--; sprite->sAlphaBlendIdx--;
SetGpuReg(REG_OFFSET_BLDALPHA, gTitleScreenAlphaBlend[sprite->data[0]]); SetGpuReg(REG_OFFSET_BLDALPHA, gTitleScreenAlphaBlend[sprite->sAlphaBlendIdx]);
} }
} }
static void SpriteCB_VersionBannerRight(struct Sprite *sprite) static void SpriteCB_VersionBannerRight(struct Sprite *sprite)
{ {
if (gTasks[sprite->data[1]].data[1] != 0) if (gTasks[sprite->sParentTaskId].tSkipToNext)
{ {
sprite->oam.objMode = ST_OAM_OBJ_NORMAL; sprite->oam.objMode = ST_OAM_OBJ_NORMAL;
sprite->y = VERSION_BANNER_Y_GOAL; sprite->y = VERSION_BANNER_Y_GOAL;
@ -381,13 +402,16 @@ static void SpriteCB_VersionBannerRight(struct Sprite *sprite)
} }
} }
// Sprite data for SpriteCB_PressStartCopyrightBanner
#define sAnimate data[0]
#define sTimer data[1]
static void SpriteCB_PressStartCopyrightBanner(struct Sprite *sprite) static void SpriteCB_PressStartCopyrightBanner(struct Sprite *sprite)
{ {
if (sprite->data[0] == 1) if (sprite->sAnimate == TRUE)
{ {
sprite->data[1]++;
// Alternate between hidden and shown every 16th frame // Alternate between hidden and shown every 16th frame
if (sprite->data[1] & 16) if (++sprite->sTimer & 16)
sprite->invisible = FALSE; sprite->invisible = FALSE;
else else
sprite->invisible = TRUE; sprite->invisible = TRUE;
@ -404,11 +428,11 @@ static void CreatePressStartBanner(s16 x, s16 y)
u8 spriteId; u8 spriteId;
x -= 64; x -= 64;
for (i = 0; i < 5; i++, x += 32) for (i = 0; i < NUM_PRESS_START_FRAMES; i++, x += 32)
{ {
spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0); spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0);
StartSpriteAnim(&gSprites[spriteId], i); StartSpriteAnim(&gSprites[spriteId], i);
gSprites[spriteId].data[0] = 1; gSprites[spriteId].sAnimate = TRUE;
} }
} }
@ -418,93 +442,122 @@ static void CreateCopyrightBanner(s16 x, s16 y)
u8 spriteId; u8 spriteId;
x -= 64; x -= 64;
for (i = 0; i < 5; i++, x += 32) for (i = 0; i < NUM_COPYRIGHT_FRAMES; i++, x += 32)
{ {
spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0); spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0);
StartSpriteAnim(&gSprites[spriteId], i + 5); StartSpriteAnim(&gSprites[spriteId], i + NUM_PRESS_START_FRAMES);
} }
} }
#undef sAnimate
#undef sTimer
// Defines for SpriteCB_PokemonLogoShine
enum {
SHINE_MODE_SINGLE_NO_BG_COLOR,
SHINE_MODE_DOUBLE,
SHINE_MODE_SINGLE,
};
#define SHINE_SPEED 4
#define sMode data[0]
#define sBgColor data[1]
static void SpriteCB_PokemonLogoShine(struct Sprite *sprite) static void SpriteCB_PokemonLogoShine(struct Sprite *sprite)
{ {
if (sprite->x < DISPLAY_WIDTH + 32) if (sprite->x < DISPLAY_WIDTH + 32)
{ {
if (sprite->data[0]) // Flash background // In any mode except SHINE_MODE_SINGLE_NO_BG_COLOR the background
// color will change, in addition to the shine sprite moving.
if (sprite->sMode != SHINE_MODE_SINGLE_NO_BG_COLOR)
{ {
u16 backgroundColor; u16 backgroundColor;
if (sprite->x < DISPLAY_WIDTH / 2) if (sprite->x < DISPLAY_WIDTH / 2)
{ {
// Brighten background color // Brighten background color
if (sprite->data[1] < 31) if (sprite->sBgColor < 31)
sprite->data[1]++; sprite->sBgColor++;
if (sprite->data[1] < 31) if (sprite->sBgColor < 31)
sprite->data[1]++; sprite->sBgColor++;
} }
else else
{ {
// Darken background color // Darken background color
if (sprite->data[1] != 0) if (sprite->sBgColor != 0)
sprite->data[1]--; sprite->sBgColor--;
if (sprite->data[1] != 0) if (sprite->sBgColor != 0)
sprite->data[1]--; sprite->sBgColor--;
} }
backgroundColor = _RGB(sprite->data[1], sprite->data[1], sprite->data[1]); backgroundColor = _RGB(sprite->sBgColor, sprite->sBgColor, sprite->sBgColor);
if (sprite->x == DISPLAY_WIDTH / 2 + 12
|| sprite->x == DISPLAY_WIDTH / 2 + 16 // Flash the background green for 4 frames of movement.
|| sprite->x == DISPLAY_WIDTH / 2 + 20 // Otherwise use the updating color.
|| sprite->x == DISPLAY_WIDTH / 2 + 24) if (sprite->x == DISPLAY_WIDTH / 2 + (3 * SHINE_SPEED)
|| sprite->x == DISPLAY_WIDTH / 2 + (4 * SHINE_SPEED)
|| sprite->x == DISPLAY_WIDTH / 2 + (5 * SHINE_SPEED)
|| sprite->x == DISPLAY_WIDTH / 2 + (6 * SHINE_SPEED))
gPlttBufferFaded[0] = RGB(24, 31, 12); gPlttBufferFaded[0] = RGB(24, 31, 12);
else else
gPlttBufferFaded[0] = backgroundColor; gPlttBufferFaded[0] = backgroundColor;
} }
sprite->x += 4;
sprite->x += SHINE_SPEED;
} }
else else
{ {
// Sprite has moved fully offscreen
gPlttBufferFaded[0] = RGB_BLACK; gPlttBufferFaded[0] = RGB_BLACK;
DestroySprite(sprite); DestroySprite(sprite);
} }
} }
static void SpriteCB_PokemonLogoShine2(struct Sprite *sprite) static void SpriteCB_PokemonLogoShine_Fast(struct Sprite *sprite)
{ {
if (sprite->x < DISPLAY_WIDTH + 32) if (sprite->x < DISPLAY_WIDTH + 32)
sprite->x += 8; sprite->x += SHINE_SPEED * 2;
else else
DestroySprite(sprite); DestroySprite(sprite);
} }
static void StartPokemonLogoShine(u8 flashBg) static void StartPokemonLogoShine(u8 mode)
{ {
u8 spriteId; u8 spriteId;
switch (flashBg) switch (mode)
{ {
case 0: case SHINE_MODE_SINGLE_NO_BG_COLOR:
case 2: case SHINE_MODE_SINGLE:
// Create one regular shine sprite.
// If mode is SHINE_MODE_SINGLE it will also change the background color.
spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0); spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0);
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW; gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW;
gSprites[spriteId].data[0] = flashBg; gSprites[spriteId].sMode = mode;
break; break;
case 1: case SHINE_MODE_DOUBLE:
// Create an invisible sprite with mode set to update the background color
spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0); spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0);
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW; gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW;
gSprites[spriteId].data[0] = flashBg; gSprites[spriteId].sMode = mode;
gSprites[spriteId].invisible = TRUE; gSprites[spriteId].invisible = TRUE;
// Create two faster shine sprites
spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0); spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0);
gSprites[spriteId].callback = SpriteCB_PokemonLogoShine2; gSprites[spriteId].callback = SpriteCB_PokemonLogoShine_Fast;
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW; gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW;
spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, -80, 68, 0); spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, -80, 68, 0);
gSprites[spriteId].callback = SpriteCB_PokemonLogoShine2; gSprites[spriteId].callback = SpriteCB_PokemonLogoShine_Fast;
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW; gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW;
break; break;
} }
} }
#undef sMode
#undef sBgColor
static void VBlankCB(void) static void VBlankCB(void)
{ {
ScanlineEffect_InitHBlankDmaTransfer(); ScanlineEffect_InitHBlankDmaTransfer();
@ -514,9 +567,6 @@ static void VBlankCB(void)
SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
} }
#define tCounter data[0]
#define tSkipToNext data[1]
void CB2_InitTitleScreen(void) void CB2_InitTitleScreen(void)
{ {
switch (gMain.state) switch (gMain.state)
@ -573,13 +623,13 @@ void CB2_InitTitleScreen(void)
gTasks[taskId].tCounter = 256; gTasks[taskId].tCounter = 256;
gTasks[taskId].tSkipToNext = FALSE; gTasks[taskId].tSkipToNext = FALSE;
gTasks[taskId].data[2] = -16; gTasks[taskId].tPointless = -16;
gTasks[taskId].data[3] = -32; gTasks[taskId].tBg2Y = -32;
gMain.state = 3; gMain.state = 3;
break; break;
} }
case 3: case 3:
BeginNormalPaletteFade(PALETTES_ALL, 1, 0x10, 0, RGB_WHITEALPHA); BeginNormalPaletteFade(PALETTES_ALL, 1, 16, 0, RGB_WHITEALPHA);
SetVBlankCallback(VBlankCB); SetVBlankCallback(VBlankCB);
gMain.state = 4; gMain.state = 4;
break; break;
@ -614,7 +664,7 @@ void CB2_InitTitleScreen(void)
case 5: case 5:
if (!UpdatePaletteFade()) if (!UpdatePaletteFade())
{ {
StartPokemonLogoShine(0); StartPokemonLogoShine(SHINE_MODE_SINGLE_NO_BG_COLOR);
ScanlineEffect_InitWave(0, DISPLAY_HEIGHT, 4, 4, 0, SCANLINE_EFFECT_REG_BG1HOFS, TRUE); ScanlineEffect_InitWave(0, DISPLAY_HEIGHT, 4, 4, 0, SCANLINE_EFFECT_REG_BG1HOFS, TRUE);
SetMainCallback2(MainCB2); SetMainCallback2(MainCB2);
} }
@ -634,7 +684,7 @@ static void MainCB2(void)
static void Task_TitleScreenPhase1(u8 taskId) static void Task_TitleScreenPhase1(u8 taskId)
{ {
// Skip to next phase when A, B, Start, or Select is pressed // Skip to next phase when A, B, Start, or Select is pressed
if (JOY_NEW(A_B_START_SELECT) || gTasks[taskId].data[1] != 0) if (JOY_NEW(A_B_START_SELECT) || gTasks[taskId].tSkipToNext)
{ {
gTasks[taskId].tSkipToNext = TRUE; gTasks[taskId].tSkipToNext = TRUE;
gTasks[taskId].tCounter = 0; gTasks[taskId].tCounter = 0;
@ -644,9 +694,9 @@ static void Task_TitleScreenPhase1(u8 taskId)
{ {
u16 frameNum = gTasks[taskId].tCounter; u16 frameNum = gTasks[taskId].tCounter;
if (frameNum == 176) if (frameNum == 176)
StartPokemonLogoShine(1); StartPokemonLogoShine(SHINE_MODE_DOUBLE);
else if (frameNum == 64) else if (frameNum == 64)
StartPokemonLogoShine(2); StartPokemonLogoShine(SHINE_MODE_SINGLE);
gTasks[taskId].tCounter--; gTasks[taskId].tCounter--;
} }
@ -663,18 +713,21 @@ static void Task_TitleScreenPhase1(u8 taskId)
// Create left side of version banner // Create left side of version banner
spriteId = CreateSprite(&sVersionBannerLeftSpriteTemplate, VERSION_BANNER_LEFT_X, VERSION_BANNER_Y, 0); spriteId = CreateSprite(&sVersionBannerLeftSpriteTemplate, VERSION_BANNER_LEFT_X, VERSION_BANNER_Y, 0);
gSprites[spriteId].data[0] = 64; gSprites[spriteId].sAlphaBlendIdx = ARRAY_COUNT(gTitleScreenAlphaBlend);
gSprites[spriteId].data[1] = taskId; gSprites[spriteId].sParentTaskId = taskId;
// Create right side of version banner // Create right side of version banner
spriteId = CreateSprite(&sVersionBannerRightSpriteTemplate, VERSION_BANNER_RIGHT_X, VERSION_BANNER_Y, 0); spriteId = CreateSprite(&sVersionBannerRightSpriteTemplate, VERSION_BANNER_RIGHT_X, VERSION_BANNER_Y, 0);
gSprites[spriteId].data[1] = taskId; gSprites[spriteId].sParentTaskId = taskId;
gTasks[taskId].tCounter = 144; gTasks[taskId].tCounter = 144;
gTasks[taskId].func = Task_TitleScreenPhase2; gTasks[taskId].func = Task_TitleScreenPhase2;
} }
} }
#undef sParentTaskId
#undef sAlphaBlendIdx
// Create "Press Start" and copyright banners, and slide Pokemon logo up // Create "Press Start" and copyright banners, and slide Pokemon logo up
static void Task_TitleScreenPhase2(u8 taskId) static void Task_TitleScreenPhase2(u8 taskId)
{ {
@ -705,31 +758,31 @@ static void Task_TitleScreenPhase2(u8 taskId)
| DISPCNT_OBJ_ON); | DISPCNT_OBJ_ON);
CreatePressStartBanner(START_BANNER_X, 108); CreatePressStartBanner(START_BANNER_X, 108);
CreateCopyrightBanner(START_BANNER_X, 148); CreateCopyrightBanner(START_BANNER_X, 148);
gTasks[taskId].data[4] = 0; gTasks[taskId].tBg1Y = 0;
gTasks[taskId].func = Task_TitleScreenPhase3; gTasks[taskId].func = Task_TitleScreenPhase3;
} }
if (!(gTasks[taskId].tCounter & 3) && gTasks[taskId].data[2] != 0) if (!(gTasks[taskId].tCounter & 3) && gTasks[taskId].tPointless != 0)
gTasks[taskId].data[2]++; gTasks[taskId].tPointless++;
if (!(gTasks[taskId].tCounter & 1) && gTasks[taskId].data[3] != 0) if (!(gTasks[taskId].tCounter & 1) && gTasks[taskId].tBg2Y != 0)
gTasks[taskId].data[3]++; gTasks[taskId].tBg2Y++;
// Slide Pokemon logo up // Slide Pokemon logo up
yPos = gTasks[taskId].data[3] * 256; yPos = gTasks[taskId].tBg2Y * 256;
SetGpuReg(REG_OFFSET_BG2Y_L, yPos); SetGpuReg(REG_OFFSET_BG2Y_L, yPos);
SetGpuReg(REG_OFFSET_BG2Y_H, yPos / 0x10000); SetGpuReg(REG_OFFSET_BG2Y_H, yPos / 0x10000);
gTasks[taskId].data[5] = 15; gTasks[taskId].data[5] = 15; // Unused
gTasks[taskId].data[6] = 6; gTasks[taskId].data[6] = 6; // Unused
} }
// Show Rayquaza silhouette and process main title screen input // Show Rayquaza silhouette and process main title screen input
static void Task_TitleScreenPhase3(u8 taskId) static void Task_TitleScreenPhase3(u8 taskId)
{ {
if ((JOY_NEW(A_BUTTON)) || (JOY_NEW(START_BUTTON))) if (JOY_NEW(A_BUTTON) || JOY_NEW(START_BUTTON))
{ {
FadeOutBGM(4); FadeOutBGM(4);
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_WHITEALPHA); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITEALPHA);
SetMainCallback2(CB2_GoToMainMenu); SetMainCallback2(CB2_GoToMainMenu);
} }
else if (JOY_HELD(CLEAR_SAVE_BUTTON_COMBO) == CLEAR_SAVE_BUTTON_COMBO) else if (JOY_HELD(CLEAR_SAVE_BUTTON_COMBO) == CLEAR_SAVE_BUTTON_COMBO)
@ -740,30 +793,29 @@ static void Task_TitleScreenPhase3(u8 taskId)
&& CanResetRTC() == TRUE) && CanResetRTC() == TRUE)
{ {
FadeOutBGM(4); FadeOutBGM(4);
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
SetMainCallback2(CB2_GoToResetRtcScreen); SetMainCallback2(CB2_GoToResetRtcScreen);
} }
else if (JOY_HELD(BERRY_UPDATE_BUTTON_COMBO) == BERRY_UPDATE_BUTTON_COMBO) else if (JOY_HELD(BERRY_UPDATE_BUTTON_COMBO) == BERRY_UPDATE_BUTTON_COMBO)
{ {
FadeOutBGM(4); FadeOutBGM(4);
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
SetMainCallback2(CB2_GoToBerryFixScreen); SetMainCallback2(CB2_GoToBerryFixScreen);
} }
else else
{ {
SetGpuReg(REG_OFFSET_BG2Y_L, 0); SetGpuReg(REG_OFFSET_BG2Y_L, 0);
SetGpuReg(REG_OFFSET_BG2Y_H, 0); SetGpuReg(REG_OFFSET_BG2Y_H, 0);
gTasks[taskId].tCounter++; if (++gTasks[taskId].tCounter & 1)
if (gTasks[taskId].tCounter & 1)
{ {
gTasks[taskId].data[4]++; gTasks[taskId].tBg1Y++;
gBattle_BG1_Y = gTasks[taskId].data[4] / 2; gBattle_BG1_Y = gTasks[taskId].tBg1Y / 2;
gBattle_BG1_X = 0; gBattle_BG1_X = 0;
} }
UpdateLegendaryMarkingColor(gTasks[taskId].tCounter); UpdateLegendaryMarkingColor(gTasks[taskId].tCounter);
if ((gMPlayInfo_BGM.status & 0xFFFF) == 0) if ((gMPlayInfo_BGM.status & 0xFFFF) == 0)
{ {
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_WHITEALPHA); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITEALPHA);
SetMainCallback2(CB2_GoToCopyrightScreen); SetMainCallback2(CB2_GoToCopyrightScreen);
} }
} }

View File

@ -650,7 +650,7 @@ void LoadTrainerHillObjectEventTemplates(void)
eventTemplates[i].localId = i + 1; eventTemplates[i].localId = i + 1;
eventTemplates[i].graphicsId = FacilityClassToGraphicsId(sHillData->floors[floorId].trainers[i].facilityClass); eventTemplates[i].graphicsId = FacilityClassToGraphicsId(sHillData->floors[floorId].trainers[i].facilityClass);
eventTemplates[i].x = sHillData->floors[floorId].map.trainerCoords[i] & 0xF; eventTemplates[i].x = sHillData->floors[floorId].map.trainerCoords[i] & 0xF;
eventTemplates[i].y = ((sHillData->floors[floorId].map.trainerCoords[i] >> 4) & 0xF) + 5; eventTemplates[i].y = ((sHillData->floors[floorId].map.trainerCoords[i] >> 4) & 0xF) + HILL_FLOOR_HEIGHT_MARGIN;
bits = i << 2; bits = i << 2;
eventTemplates[i].movementType = ((sHillData->floors[floorId].map.trainerDirections >> bits) & 0xF) + MOVEMENT_TYPE_FACE_UP; eventTemplates[i].movementType = ((sHillData->floors[floorId].map.trainerDirections >> bits) & 0xF) + MOVEMENT_TYPE_FACE_UP;
eventTemplates[i].trainerRange_berryTreeId = (sHillData->floors[floorId].map.trainerRanges >> bits) & 0xF; eventTemplates[i].trainerRange_berryTreeId = (sHillData->floors[floorId].map.trainerRanges >> bits) & 0xF;

View File

@ -1115,7 +1115,7 @@ static u8 UNUSED GetPartyIdFromSelectionId_(u8 selectionId)
static void LoadAndCreateUpDownSprites(void) static void LoadAndCreateUpDownSprites(void)
{ {
u16 i, spriteId; u16 i;
LoadSpriteSheet(&sSpriteSheet_UpDown); LoadSpriteSheet(&sSpriteSheet_UpDown);
LoadSpritePalette(&sSpritePalette_UpDown); LoadSpritePalette(&sSpritePalette_UpDown);
@ -1125,7 +1125,7 @@ static void LoadAndCreateUpDownSprites(void)
{ {
if (sInfo->enhancements[i] != 0) if (sInfo->enhancements[i] != 0)
{ {
spriteId = CreateSprite(&sSpriteTemplate_UpDown, sUpDownCoordsOnGraph[i][0], sUpDownCoordsOnGraph[i][1], 0); u16 spriteId = CreateSprite(&sSpriteTemplate_UpDown, sUpDownCoordsOnGraph[i][0], sUpDownCoordsOnGraph[i][1], 0);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
{ {
if (sInfo->enhancements[i] != 0) // Always true here if (sInfo->enhancements[i] != 0) // Always true here
@ -1136,20 +1136,24 @@ static void LoadAndCreateUpDownSprites(void)
} }
} }
#define tTimer data[0]
static void SpriteCB_UpDown(struct Sprite *sprite) static void SpriteCB_UpDown(struct Sprite *sprite)
{ {
if (sprite->data[0] < 6) if (sprite->tTimer < 6)
sprite->y2 -= 2; sprite->y2 -= 2;
else if (sprite->data[0] < 12) else if (sprite->tTimer < 12)
sprite->y2 += 2; sprite->y2 += 2;
if (++sprite->data[0] > 60) if (++sprite->tTimer > 60)
{ {
DestroySprite(sprite); DestroySprite(sprite);
sInfo->numEnhancements--; sInfo->numEnhancements--;
} }
} }
#undef tTimer
static void LoadPartyInfo(void) static void LoadPartyInfo(void)
{ {
u16 i; u16 i;
@ -1611,12 +1615,15 @@ static void LoadConditionGfx(void)
LoadSpritePalette(&spritePalette); LoadSpritePalette(&spritePalette);
} }
#define sSpeed data[0]
#define sTargetX data[1]
static void CreateConditionSprite(void) static void CreateConditionSprite(void)
{ {
u16 i; u16 i;
s16 xDiff, xStart; s16 xDiff, xStart;
int yStart = 17; int yStart = 17;
int var = 8; int speed = 8;
struct Sprite **sprites = sMenu->condition; struct Sprite **sprites = sMenu->condition;
const struct SpriteTemplate *template = &sSpriteTemplate_Condition; const struct SpriteTemplate *template = &sSpriteTemplate_Condition;
@ -1625,9 +1632,9 @@ static void CreateConditionSprite(void)
u8 spriteId = CreateSprite(template, i * xDiff + xStart, yStart, 0); u8 spriteId = CreateSprite(template, i * xDiff + xStart, yStart, 0);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
{ {
gSprites[spriteId].data[0] = var; gSprites[spriteId].sSpeed = speed;
gSprites[spriteId].data[1] = (i * xDiff) | 0x20; gSprites[spriteId].sTargetX = (i * xDiff) | 0x20;
gSprites[spriteId].data[2] = i; gSprites[spriteId].data[2] = i; // Unused
StartSpriteAnim(&gSprites[spriteId], i); StartSpriteAnim(&gSprites[spriteId], i);
sprites[i] = &gSprites[spriteId]; sprites[i] = &gSprites[spriteId];
} }
@ -1656,11 +1663,15 @@ static void SpriteCB_Condition(struct Sprite *sprite)
{ {
s16 prevX = sprite->x; s16 prevX = sprite->x;
sprite->x += sprite->data[0]; // Slide onscreen
if ((prevX <= sprite->data[1] && sprite->x >= sprite->data[1]) sprite->x += sprite->sSpeed;
|| (prevX >= sprite->data[1] && sprite->x <= sprite->data[1]))
// Check if target position has been reached/surpassed
if ((prevX <= sprite->sTargetX && sprite->x >= sprite->sTargetX)
|| (prevX >= sprite->sTargetX && sprite->x <= sprite->sTargetX))
{ {
sprite->x = sprite->data[1]; // End slide onscreen, become static sprite.
sprite->x = sprite->sTargetX;
sprite->callback = SpriteCallbackDummy; sprite->callback = SpriteCallbackDummy;
} }
} }