Finish documenting battle_transition

This commit is contained in:
GriffinR
2021-10-29 11:56:06 -04:00
parent 901cd476b6
commit f51247615e
2 changed files with 276 additions and 220 deletions
+2 -2
View File
@@ -49,8 +49,8 @@ struct PaletteFadeControl
extern struct PaletteFadeControl gPaletteFade; extern struct PaletteFadeControl gPaletteFade;
extern u32 gPlttBufferTransferPending; extern u32 gPlttBufferTransferPending;
extern u8 gPaletteDecompressionBuffer[]; extern u8 gPaletteDecompressionBuffer[];
extern u16 gPlttBufferUnfaded[]; extern u16 gPlttBufferUnfaded[PLTT_BUFFER_SIZE];
extern u16 gPlttBufferFaded[]; extern u16 gPlttBufferFaded[PLTT_BUFFER_SIZE];
void LoadCompressedPalette(const u32 *, u16, u16); void LoadCompressedPalette(const u32 *, u16, u16);
void LoadPalette(const void *, u16, u16); void LoadPalette(const void *, u16, u16);
+274 -218
View File
@@ -80,8 +80,8 @@ struct RectangularSpiralLine
u8 state; u8 state;
s16 position; s16 position;
u8 moveIdx; u8 moveIdx;
s16 skipPosition; s16 reboundPosition;
u8 field_8; bool8 outward;
}; };
typedef bool8 (*TransitionStateFunc)(struct Task *task); typedef bool8 (*TransitionStateFunc)(struct Task *task);
@@ -227,8 +227,8 @@ static bool8 FrontierLogoWiggle_Init(struct Task *task);
static bool8 FrontierLogoWiggle_SetGfx(struct Task *task); static bool8 FrontierLogoWiggle_SetGfx(struct Task *task);
static bool8 FrontierLogoWave_Init(struct Task *task); static bool8 FrontierLogoWave_Init(struct Task *task);
static bool8 FrontierLogoWave_SetGfx(struct Task *task); static bool8 FrontierLogoWave_SetGfx(struct Task *task);
static bool8 FrontierLogoWave_Func3(struct Task *task); static bool8 FrontierLogoWave_InitScanline(struct Task *task);
static bool8 FrontierLogoWave_Func4(struct Task *task); static bool8 FrontierLogoWave_Main(struct Task *task);
static bool8 Rayquaza_Init(struct Task *task); static bool8 Rayquaza_Init(struct Task *task);
static bool8 Rayquaza_SetGfx(struct Task *task); static bool8 Rayquaza_SetGfx(struct Task *task);
static bool8 Rayquaza_PaletteFlash(struct Task *task); static bool8 Rayquaza_PaletteFlash(struct Task *task);
@@ -241,13 +241,13 @@ static bool8 FrontierSquares_Draw(struct Task *task);
static bool8 FrontierSquares_Shrink(struct Task *task); static bool8 FrontierSquares_Shrink(struct Task *task);
static bool8 FrontierSquares_End(struct Task *task); static bool8 FrontierSquares_End(struct Task *task);
static bool8 FrontierSquaresSpiral_Init(struct Task *task); static bool8 FrontierSquaresSpiral_Init(struct Task *task);
static bool8 FrontierSquaresSpiral_Func2(struct Task *task); static bool8 FrontierSquaresSpiral_Outward(struct Task *task);
static bool8 FrontierSquaresSpiral_Func3(struct Task *task); static bool8 FrontierSquaresSpiral_SetBlack(struct Task *task);
static bool8 FrontierSquaresSpiral_Func4(struct Task *task); static bool8 FrontierSquaresSpiral_Inward(struct Task *task);
static bool8 FrontierSquaresScroll_Init(struct Task *task); static bool8 FrontierSquaresScroll_Init(struct Task *task);
static bool8 FrontierSquaresScroll_Func2(struct Task *task); static bool8 FrontierSquaresScroll_Draw(struct Task *task);
static bool8 FrontierSquaresScroll_Func3(struct Task *task); static bool8 FrontierSquaresScroll_SetBlack(struct Task *task);
static bool8 FrontierSquaresScroll_Func4(struct Task *task); static bool8 FrontierSquaresScroll_Erase(struct Task *task);
static bool8 FrontierSquaresScroll_End(struct Task *task); static bool8 FrontierSquaresScroll_End(struct Task *task);
static bool8 Mugshot_Init(struct Task *task); static bool8 Mugshot_Init(struct Task *task);
static bool8 Mugshot_SetGfx(struct Task *task); static bool8 Mugshot_SetGfx(struct Task *task);
@@ -625,52 +625,73 @@ static const TransitionStateFunc sRectangularSpiral_Funcs[] =
}; };
#define SPIRAL_END (-1) #define SPIRAL_END (-1)
#define SPIRAL_SKIP (-2) #define SPIRAL_REBOUND (-2)
static const s16 gUnknown_085C8C90[] = {1, 27, 275, SPIRAL_END}; // Note that the directions are inverted for the lines originating at the bottom.
static const s16 gUnknown_085C8C98[] = {2, 486, SPIRAL_END}; // i.e. MOVE_RIGHT is a right move for the top lines and a left move for the inverted bottom lines.
static const s16 gUnknown_085C8C9E[] = {3, 262, SPIRAL_END}; enum {
static const s16 gUnknown_085C8CA4[] = {4, 507, SPIRAL_SKIP}; MOVE_RIGHT = 1,
MOVE_LEFT,
MOVE_UP,
MOVE_DOWN,
};
static const s16 gUnknown_085C8CAA[] = {1, 213, SPIRAL_END}; // Offsets of the movement data for spiraling in either direction.
static const s16 gUnknown_085C8CB0[] = {2, 548, SPIRAL_SKIP}; #define SPIRAL_INWARD_START 0
static const s16 gUnknown_085C8CB6[] = {3, 196, SPIRAL_END}; #define SPIRAL_INWARD_END 3
static const s16 gUnknown_085C8CBC[] = {4, 573, 309, SPIRAL_END}; #define SPIRAL_OUTWARD_START 4
#define SPIRAL_OUTWARD_END 7
static const s16 gUnknown_085C8CC4[] = {1, 474, SPIRAL_END}; static const s16 sRectangularSpiral_Major_InwardRight[] = {MOVE_RIGHT, 27, 275, SPIRAL_END};
static const s16 gUnknown_085C8CCA[] = {2, 295, 32, SPIRAL_END}; static const s16 sRectangularSpiral_Major_InwardLeft[] = {MOVE_LEFT, 486, SPIRAL_END};
static const s16 gUnknown_085C8CD2[] = {3, 58, SPIRAL_END}; static const s16 sRectangularSpiral_Major_InwardUp[] = {MOVE_UP, 262, SPIRAL_END};
static const s16 gUnknown_085C8CD8[] = {4, 455, SPIRAL_END}; static const s16 sRectangularSpiral_Major_InwardDown[] = {MOVE_DOWN, 507, SPIRAL_REBOUND};
static const s16 gUnknown_085C8CDE[] = {1, 540, SPIRAL_END}; static const s16 sRectangularSpiral_Minor_InwardRight[] = {MOVE_RIGHT, 213, SPIRAL_END};
static const s16 gUnknown_085C8CE4[] = {2, 229, SPIRAL_END}; static const s16 sRectangularSpiral_Minor_InwardLeft[] = {MOVE_LEFT, 548, SPIRAL_REBOUND};
static const s16 gUnknown_085C8CEA[] = {3, 244, 28, SPIRAL_END}; static const s16 sRectangularSpiral_Minor_InwardUp[] = {MOVE_UP, 196, SPIRAL_END};
static const s16 gUnknown_085C8CF2[] = {4, 517, SPIRAL_END}; static const s16 sRectangularSpiral_Minor_InwardDown[] = {MOVE_DOWN, 573, 309, SPIRAL_END};
static const s16 sRectangularSpiral_Minor_OutwardRight[] = {MOVE_RIGHT, 474, SPIRAL_END};
static const s16 sRectangularSpiral_Minor_OutwardLeft[] = {MOVE_LEFT, 295, 32, SPIRAL_END};
static const s16 sRectangularSpiral_Minor_OutwardUp[] = {MOVE_UP, 58, SPIRAL_END};
static const s16 sRectangularSpiral_Minor_OutwardDown[] = {MOVE_DOWN, 455, SPIRAL_END};
static const s16 sRectangularSpiral_Major_OutwardRight[] = {MOVE_RIGHT, 540, SPIRAL_END};
static const s16 sRectangularSpiral_Major_OutwardLeft[] = {MOVE_LEFT, 229, SPIRAL_END};
static const s16 sRectangularSpiral_Major_OutwardUp[] = {MOVE_UP, 244, 28, SPIRAL_END};
static const s16 sRectangularSpiral_Major_OutwardDown[] = {MOVE_DOWN, 517, SPIRAL_END};
// Move data for spiral lines starting in the top left / bottom right // Move data for spiral lines starting in the top left / bottom right
static const s16 *const sRectangularSpiral_MoveDataTable_MajorDiagonal[] = static const s16 *const sRectangularSpiral_MoveDataTable_MajorDiagonal[] =
{ {
gUnknown_085C8C90, [SPIRAL_INWARD_START] =
gUnknown_085C8CA4, sRectangularSpiral_Major_InwardRight,
gUnknown_085C8C98, sRectangularSpiral_Major_InwardDown,
gUnknown_085C8C9E, sRectangularSpiral_Major_InwardLeft,
gUnknown_085C8CEA, sRectangularSpiral_Major_InwardUp,
gUnknown_085C8CE4,
gUnknown_085C8CF2, [SPIRAL_OUTWARD_START] =
gUnknown_085C8CDE sRectangularSpiral_Major_OutwardUp,
sRectangularSpiral_Major_OutwardLeft,
sRectangularSpiral_Major_OutwardDown,
sRectangularSpiral_Major_OutwardRight
}; };
// Move data for spiral lines starting in the top right / bottom left // Move data for spiral lines starting in the top right / bottom left
static const s16 *const sRectangularSpiral_MoveDataTable_MinorDiagonal[] = static const s16 *const sRectangularSpiral_MoveDataTable_MinorDiagonal[] =
{ {
gUnknown_085C8CBC, [SPIRAL_INWARD_START] =
gUnknown_085C8CB0, sRectangularSpiral_Minor_InwardDown,
gUnknown_085C8CB6, sRectangularSpiral_Minor_InwardLeft,
gUnknown_085C8CAA, sRectangularSpiral_Minor_InwardUp,
gUnknown_085C8CCA, sRectangularSpiral_Minor_InwardRight,
gUnknown_085C8CD8,
gUnknown_085C8CC4, [SPIRAL_OUTWARD_START] =
gUnknown_085C8CD2 sRectangularSpiral_Minor_OutwardLeft,
sRectangularSpiral_Minor_OutwardDown,
sRectangularSpiral_Minor_OutwardRight,
sRectangularSpiral_Minor_OutwardUp
}; };
static const s16 *const *const sRectangularSpiral_MoveDataTables[] = static const s16 *const *const sRectangularSpiral_MoveDataTables[] =
@@ -738,7 +759,7 @@ static const TransitionStateFunc sAngledWipes_Funcs[] =
static const s16 sAngledWipes_MoveData[NUM_ANGLED_WIPES][5] = static const s16 sAngledWipes_MoveData[NUM_ANGLED_WIPES][5] =
{ {
// startX startY endX endY yDirection // startX startY endX endY yDirection
{56, 0, 0, DISPLAY_HEIGHT, 0}, {56, 0, 0, DISPLAY_HEIGHT, 0},
{104, DISPLAY_HEIGHT, DISPLAY_WIDTH, 88, 1}, {104, DISPLAY_HEIGHT, DISPLAY_WIDTH, 88, 1},
{DISPLAY_WIDTH, 72, 56, 0, 1}, {DISPLAY_WIDTH, 72, 56, 0, 1},
@@ -908,8 +929,8 @@ static const TransitionStateFunc sFrontierLogoWave_Funcs[] =
{ {
FrontierLogoWave_Init, FrontierLogoWave_Init,
FrontierLogoWave_SetGfx, FrontierLogoWave_SetGfx,
FrontierLogoWave_Func3, FrontierLogoWave_InitScanline,
FrontierLogoWave_Func4 FrontierLogoWave_Main
}; };
static const TransitionStateFunc sFrontierSquares_Funcs[] = static const TransitionStateFunc sFrontierSquares_Funcs[] =
@@ -923,38 +944,54 @@ static const TransitionStateFunc sFrontierSquares_Funcs[] =
static const TransitionStateFunc sFrontierSquaresSpiral_Funcs[] = static const TransitionStateFunc sFrontierSquaresSpiral_Funcs[] =
{ {
FrontierSquaresSpiral_Init, FrontierSquaresSpiral_Init,
FrontierSquaresSpiral_Func2, FrontierSquaresSpiral_Outward,
FrontierSquaresSpiral_Func3, FrontierSquaresSpiral_SetBlack,
FrontierSquaresSpiral_Func4, FrontierSquaresSpiral_Inward,
FrontierSquares_End FrontierSquares_End
}; };
static const TransitionStateFunc sFrontierSquaresScroll_Funcs[] = static const TransitionStateFunc sFrontierSquaresScroll_Funcs[] =
{ {
FrontierSquaresScroll_Init, FrontierSquaresScroll_Init,
FrontierSquaresScroll_Func2, FrontierSquaresScroll_Draw,
FrontierSquaresScroll_Func3, FrontierSquaresScroll_SetBlack,
FrontierSquaresScroll_Func4, FrontierSquaresScroll_Erase,
FrontierSquaresScroll_End FrontierSquaresScroll_End
}; };
static const u8 gUnknown_085C9A30[] = { // Dimensions for the 2 non-scrolling frontier square transitions.
0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, // SQUARE_SIZE is the same in the scrolling version but it uses
0x1b, 0x14, 0x0d, 0x06, 0x05, 0x04, 0x03, // more because it needs to show more than can be shown at a single
0x02, 0x01, 0x00, 0x07, 0x0e, 0x15, 0x16, // time n-screen.
0x17, 0x18, 0x19, 0x1a, 0x13, 0x0c, 0x0b, #define SQUARE_SIZE 4
0x0a, 0x09, 0x08, 0x0f, 0x10, 0x11, 0x12 #define MARGIN_SIZE 1 // Squares do not fit evenly across the width, so there is a margin on either side.
#define NUM_SQUARES_PER_ROW ((DISPLAY_WIDTH - (MARGIN_SIZE * 8 * 2)) / (SQUARE_SIZE * 8))
#define NUM_SQUARES_PER_COL (DISPLAY_HEIGHT / (SQUARE_SIZE * 8))
#define NUM_SQUARES (NUM_SQUARES_PER_ROW * NUM_SQUARES_PER_COL)
// The order in which the squares should appear/disappear to create
// the spiral effect. Spiraling inward starts with the first element,
// and spiraling outward starts with the last. The positions are the
// squares numbered left-to-right top-to-bottom.
static const u8 sFrontierSquaresSpiral_Positions[NUM_SQUARES] = {
28, 29, 30, 31, 32, 33, 34,
27, 20, 13, 6, 5, 4, 3,
2, 1, 0, 7, 14, 21, 22,
23, 24, 25, 26, 19, 12, 11,
10, 9, 8, 15, 16, 17, 18
}; };
static const u8 gUnknown_085C9A53[] = { // In the scrolling version the squares appear/disappear in a "random" order
0x00, 0x10, 0x29, 0x16, 0x2c, 0x02, 0x2b, 0x15, // dictated by the list below.
0x2e, 0x1b, 0x09, 0x30, 0x26, 0x05, 0x39, 0x3b, static const u8 sFrontierSquaresScroll_Positions[] = {
0x0c, 0x3f, 0x23, 0x1c, 0x0a, 0x35, 0x07, 0x31, 0, 16, 41, 22, 44, 2, 43, 21,
0x27, 0x17, 0x37, 0x01, 0x3e, 0x11, 0x3d, 0x1e, 46, 27, 9, 48, 38, 5, 57, 59,
0x06, 0x22, 0x0f, 0x33, 0x20, 0x3a, 0x0d, 0x2d, 12, 63, 35, 28, 10, 53, 7, 49,
0x25, 0x34, 0x0b, 0x18, 0x3c, 0x13, 0x38, 0x21, 39, 23, 55, 1, 62, 17, 61, 30,
0x1d, 0x32, 0x28, 0x36, 0x0e, 0x03, 0x2f, 0x14, 6, 34, 15, 51, 32, 58, 13, 45,
0x12, 0x19, 0x04, 0x24, 0x1a, 0x2a, 0x1f, 0x08 37, 52, 11, 24, 60, 19, 56, 33,
29, 50, 40, 54, 14, 3, 47, 20,
18, 25, 4, 36, 26, 42, 31, 8
}; };
//--------------------------- //---------------------------
@@ -1036,7 +1073,7 @@ static void Task_BattleTransition(u8 taskId)
static bool8 Transition_StartIntro(struct Task *task) static bool8 Transition_StartIntro(struct Task *task)
{ {
SetWeatherScreenFadeOut(); SetWeatherScreenFadeOut();
CpuCopy32(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); CpuCopy32(gPlttBufferFaded, gPlttBufferUnfaded, sizeof(gPlttBufferUnfaded));
if (sTasks_Intro[task->tTransitionId] != NULL) if (sTasks_Intro[task->tTransitionId] != NULL)
{ {
CreateTask(sTasks_Intro[task->tTransitionId], 4); CreateTask(sTasks_Intro[task->tTransitionId], 4);
@@ -3158,40 +3195,40 @@ static bool8 RectangularSpiral_Init(struct Task *task)
GetBg0TilesDst(&tilemap, &tileset); GetBg0TilesDst(&tilemap, &tileset);
CpuCopy16(sShrinkingBoxTileset, tileset, 0x20); CpuCopy16(sShrinkingBoxTileset, tileset, 0x20);
CpuCopy16(sShrinkingBoxTileset + 0x70, tileset + 0x20, 0x20); CpuCopy16(&sShrinkingBoxTileset[0x70], &tileset[0x20], 0x20);
CpuFill16(0xF0 << 8, tilemap, BG_SCREEN_SIZE); CpuFill16(0xF0 << 8, tilemap, BG_SCREEN_SIZE);
LoadPalette(sFieldEffectPal_Pokeball, 0xF0, sizeof(sFieldEffectPal_Pokeball)); LoadPalette(sFieldEffectPal_Pokeball, 0xF0, sizeof(sFieldEffectPal_Pokeball));
task->data[3] = 1; task->data[3] = 1;
task->tState++; task->tState++;
// Top left // Line starting in top left
sRectangularSpiralLines[0].state = 0; sRectangularSpiralLines[0].state = SPIRAL_INWARD_START;
sRectangularSpiralLines[0].position = -1; sRectangularSpiralLines[0].position = -1;
sRectangularSpiralLines[0].moveIdx = 1; sRectangularSpiralLines[0].moveIdx = 1;
sRectangularSpiralLines[0].skipPosition = 308; sRectangularSpiralLines[0].reboundPosition = 308;
sRectangularSpiralLines[0].field_8 = 0; sRectangularSpiralLines[0].outward = FALSE;
// Bottom right // Line starting in bottom right
sRectangularSpiralLines[1].state = 0; sRectangularSpiralLines[1].state = SPIRAL_INWARD_START;
sRectangularSpiralLines[1].position = -1; sRectangularSpiralLines[1].position = -1;
sRectangularSpiralLines[1].moveIdx = 1; sRectangularSpiralLines[1].moveIdx = 1;
sRectangularSpiralLines[1].skipPosition = 308; sRectangularSpiralLines[1].reboundPosition = 308;
sRectangularSpiralLines[1].field_8 = 0; sRectangularSpiralLines[1].outward = FALSE;
// Top right // Line starting in top right
sRectangularSpiralLines[2].state = 0; sRectangularSpiralLines[2].state = SPIRAL_INWARD_START;
sRectangularSpiralLines[2].position = -3; sRectangularSpiralLines[2].position = -3;
sRectangularSpiralLines[2].moveIdx = 1; sRectangularSpiralLines[2].moveIdx = 1;
sRectangularSpiralLines[2].skipPosition = 307; sRectangularSpiralLines[2].reboundPosition = 307;
sRectangularSpiralLines[2].field_8 = 0; sRectangularSpiralLines[2].outward = FALSE;
// Bottom left // Line starting in bottom left
sRectangularSpiralLines[3].state = 0; sRectangularSpiralLines[3].state = SPIRAL_INWARD_START;
sRectangularSpiralLines[3].position = -3; sRectangularSpiralLines[3].position = -3;
sRectangularSpiralLines[3].moveIdx = 1; sRectangularSpiralLines[3].moveIdx = 1;
sRectangularSpiralLines[3].skipPosition = 307; sRectangularSpiralLines[3].reboundPosition = 307;
sRectangularSpiralLines[3].field_8 = 0; sRectangularSpiralLines[3].outward = FALSE;
return FALSE; return FALSE;
} }
@@ -3219,7 +3256,7 @@ static bool8 RectangularSpiral_Main(struct Task *task)
done = FALSE; done = FALSE;
position = sRectangularSpiralLines[j].position; position = sRectangularSpiralLines[j].position;
// Invert position for the two bottom lines // Invert position for the two lines that start at the bottom.
if ((j % 2) == 1) if ((j % 2) == 1)
position = 637 - position; position = 637 - position;
@@ -3248,6 +3285,10 @@ static bool8 RectangularSpiral_End(struct Task *task)
static bool16 UpdateRectangularSpiralLine(const s16 * const *moveDataTable, struct RectangularSpiralLine *line) static bool16 UpdateRectangularSpiralLine(const s16 * const *moveDataTable, struct RectangularSpiralLine *line)
{ {
const s16 *moveData = moveDataTable[line->state]; const s16 *moveData = moveDataTable[line->state];
// Has spiral finished?
// Note that most move data arrays endsin SPIRAL_END but it is
// only ever reached on the final array of spiraling outward.
if (moveData[line->moveIdx] == SPIRAL_END) if (moveData[line->moveIdx] == SPIRAL_END)
return FALSE; return FALSE;
@@ -3257,18 +3298,22 @@ static bool16 UpdateRectangularSpiralLine(const s16 * const *moveDataTable, stru
sDebug_RectangularSpiralData = moveData[2]; sDebug_RectangularSpiralData = moveData[2];
sDebug_RectangularSpiralData = moveData[3]; sDebug_RectangularSpiralData = moveData[3];
// Note that for the two lines originating at the bottom the
// position is inverted, so the directions are flipped.
// i.e. position += 1 is right for the top lines and left
// for their inverted partners on the bottom.
switch (moveData[0]) switch (moveData[0])
{ {
case 1: case MOVE_RIGHT:
line->position += 1; line->position += 1;
break; break;
case 2: case MOVE_LEFT:
line->position -= 1; line->position -= 1;
break; break;
case 3: case MOVE_UP:
line->position -= 32; line->position -= 32;
break; break;
case 4: case MOVE_DOWN:
line->position += 32; line->position += 32;
break; break;
} }
@@ -3278,31 +3323,40 @@ static bool16 UpdateRectangularSpiralLine(const s16 * const *moveDataTable, stru
if (line->position >= 640 || moveData[line->moveIdx] == SPIRAL_END) if (line->position >= 640 || moveData[line->moveIdx] == SPIRAL_END)
return FALSE; return FALSE;
if (line->field_8 == 0 && moveData[line->moveIdx] == SPIRAL_SKIP) if (!line->outward && moveData[line->moveIdx] == SPIRAL_REBOUND)
{ {
line->field_8 = 1; // Line has reached the final point of spiraling inward.
// Time to flip and start spiraling outward.
line->outward = TRUE;
line->moveIdx = 1; line->moveIdx = 1;
line->position = line->skipPosition; line->position = line->reboundPosition;
line->state = 4; line->state = SPIRAL_OUTWARD_START;
} }
// Reached move target, advance to next movement.
if (line->position == moveData[line->moveIdx]) if (line->position == moveData[line->moveIdx])
{ {
line->state++; line->state++;
if (line->field_8 == 1) if (line->outward == TRUE)
{ {
if (line->state > 7) if (line->state > SPIRAL_OUTWARD_END)
{ {
// Still spiraling outward, loop back to the first state
// but use the second set of move targets.
// For example, the 28 in sRectangularSpiral_Major_OutwardUp
line->moveIdx++; line->moveIdx++;
line->state = 4; line->state = SPIRAL_OUTWARD_START;
} }
} }
else else
{ {
if (line->state > 3) if (line->state > SPIRAL_INWARD_END)
{ {
// Still spiraling inward, loop back to the first state
// but use the second set of move targets.
// For example, the 275 in sRectangularSpiral_Major_InwardRight
line->moveIdx++; line->moveIdx++;
line->state = 0; line->state = SPIRAL_INWARD_START;
} }
} }
} }
@@ -4181,6 +4235,7 @@ static bool8 UpdateBlackWipe(s16 *data, bool8 xExact, bool8 yExact)
// B_TRANSITION_FRONTIER_LOGO_WIGGLE // B_TRANSITION_FRONTIER_LOGO_WIGGLE
//----------------------------------- //-----------------------------------
#define tSinIndex data[4]
#define tAmplitude data[5] #define tAmplitude data[5]
static bool8 FrontierLogoWiggle_Init(struct Task *task) static bool8 FrontierLogoWiggle_Init(struct Task *task)
@@ -4203,7 +4258,7 @@ static bool8 FrontierLogoWiggle_SetGfx(struct Task *task)
GetBg0TilesDst(&tilemap, &tileset); GetBg0TilesDst(&tilemap, &tileset);
LZ77UnCompVram(sFrontierLogo_Tilemap, tilemap); LZ77UnCompVram(sFrontierLogo_Tilemap, tilemap);
SetSinWave(gScanlineEffectRegBuffers[0], 0, task->data[4], 0x84, task->tAmplitude, DISPLAY_HEIGHT); SetSinWave(gScanlineEffectRegBuffers[0], 0, task->tSinIndex, 132, task->tAmplitude, DISPLAY_HEIGHT);
task->tState++; task->tState++;
return TRUE; return TRUE;
@@ -4214,6 +4269,7 @@ static void Task_FrontierLogoWiggle(u8 taskId)
while (sFrontierLogoWiggle_Funcs[gTasks[taskId].tState](&gTasks[taskId])); while (sFrontierLogoWiggle_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
} }
#undef tSinIndex
#undef tAmplitude #undef tAmplitude
//--------------------------------- //---------------------------------
@@ -4270,7 +4326,7 @@ static bool8 FrontierLogoWave_SetGfx(struct Task *task)
return TRUE; return TRUE;
} }
static bool8 FrontierLogoWave_Func3(struct Task *task) static bool8 FrontierLogoWave_InitScanline(struct Task *task)
{ {
u8 i; u8 i;
@@ -4285,7 +4341,7 @@ static bool8 FrontierLogoWave_Func3(struct Task *task)
return TRUE; return TRUE;
} }
static bool8 FrontierLogoWave_Func4(struct Task *task) static bool8 FrontierLogoWave_Main(struct Task *task)
{ {
u8 i; u8 i;
u16 sinVal, amplitude, sinSpread; u16 sinVal, amplitude, sinSpread;
@@ -4300,8 +4356,8 @@ static bool8 FrontierLogoWave_Func4(struct Task *task)
if (task->tTimer >= 70) if (task->tTimer >= 70)
{ {
// Decrease amount logo moves up and down // Decrease amount of logo movement and distortion
// until it rests in the middle of the screen. // until it rests normally in the middle of the screen.
if (task->tAmplitudeVal - 384 >= 0) if (task->tAmplitudeVal - 384 >= 0)
task->tAmplitudeVal -= 384; task->tAmplitudeVal -= 384;
else else
@@ -4319,7 +4375,7 @@ static bool8 FrontierLogoWave_Func4(struct Task *task)
sTransitionData->BLDALPHA = BLDALPHA_BLEND(task->tBlendTarget2, task->tBlendTarget1); sTransitionData->BLDALPHA = BLDALPHA_BLEND(task->tBlendTarget2, task->tBlendTarget1);
} }
// Move logo up and down // Move logo up and down and distort it
for (i = 0; i < DISPLAY_HEIGHT; i++, sinVal += sinSpread) for (i = 0; i < DISPLAY_HEIGHT; i++, sinVal += sinSpread)
{ {
s16 index = sinVal / 256; s16 index = sinVal / 256;
@@ -4369,10 +4425,6 @@ static void HBlankCB_FrontierLogoWave(void)
// and B_TRANSITION_FRONTIER_SQUARES_SPIRAL // and B_TRANSITION_FRONTIER_SQUARES_SPIRAL
//---------------------------------------------------------------------- //----------------------------------------------------------------------
#define NUM_SQUARES_PER_ROW 7
#define NUM_SQUARES_PER_COL 5
#define SQUARE_SIZE 4
#define tPosX data[2] #define tPosX data[2]
#define tPosY data[3] #define tPosY data[3]
#define tRowPos data[4] #define tRowPos data[4]
@@ -4402,13 +4454,13 @@ static bool8 FrontierSquares_Init(struct Task *task)
GetBg0TilesDst(&tilemap, &tileset); GetBg0TilesDst(&tilemap, &tileset);
LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset); LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);
FillBgTilemapBufferRect(0, 1, 0, 0, 1, 0x20, 0xF); FillBgTilemapBufferRect(0, 1, 0, 0, MARGIN_SIZE, 32, 15);
FillBgTilemapBufferRect(0, 1, 0x1D, 0, 1, 0x20, 0xF); FillBgTilemapBufferRect(0, 1, 30 - MARGIN_SIZE, 0, MARGIN_SIZE, 32, 15);
CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(0);
LoadPalette(sFrontierSquares_Palette, 0xF0, sizeof(sFrontierSquares_Palette)); LoadPalette(sFrontierSquares_Palette, 0xF0, sizeof(sFrontierSquares_Palette));
task->tPosX = 1; task->tPosX = MARGIN_SIZE;
task->tPosY = 0; task->tPosY = 0;
task->tRowPos = 0; task->tRowPos = 0;
task->tShrinkDelay = 10; task->tShrinkDelay = 10;
@@ -4429,7 +4481,7 @@ static bool8 FrontierSquares_Draw(struct Task *task)
task->tPosX += SQUARE_SIZE; task->tPosX += SQUARE_SIZE;
if (++task->tRowPos == NUM_SQUARES_PER_ROW) if (++task->tRowPos == NUM_SQUARES_PER_ROW)
{ {
task->tPosX = 1; task->tPosX = MARGIN_SIZE;
task->tPosY += SQUARE_SIZE; task->tPosY += SQUARE_SIZE;
task->tRowPos = 0; task->tRowPos = 0;
if (task->tPosY >= NUM_SQUARES_PER_COL * SQUARE_SIZE) if (task->tPosY >= NUM_SQUARES_PER_COL * SQUARE_SIZE)
@@ -4452,8 +4504,8 @@ static bool8 FrontierSquares_Shrink(struct Task *task)
case 0: case 0:
for (i = 250; i < 255; i++) for (i = 250; i < 255; i++)
{ {
gPlttBufferUnfaded[i] = 0; gPlttBufferUnfaded[i] = RGB_BLACK;
gPlttBufferFaded[i] = 0; gPlttBufferFaded[i] = RGB_BLACK;
} }
break; break;
case 1: case 1:
@@ -4467,7 +4519,7 @@ static bool8 FrontierSquares_Shrink(struct Task *task)
LZ77UnCompVram(sFrontierSquares_Shrink2_Tileset, tileset); LZ77UnCompVram(sFrontierSquares_Shrink2_Tileset, tileset);
break; break;
default: default:
FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 0x20, 0x20); FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 32, 32);
CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(0);
task->tState++; task->tState++;
return FALSE; return FALSE;
@@ -4487,6 +4539,9 @@ static bool8 FrontierSquares_Shrink(struct Task *task)
#undef tShrinkDelayTimer #undef tShrinkDelayTimer
#undef tShrinkDelay #undef tShrinkDelay
#define tSquareNum data[2]
#define tFadeFlag data[3]
static bool8 FrontierSquaresSpiral_Init(struct Task *task) static bool8 FrontierSquaresSpiral_Init(struct Task *task)
{ {
u16 *tilemap, *tileset; u16 *tilemap, *tileset;
@@ -4494,83 +4549,81 @@ static bool8 FrontierSquaresSpiral_Init(struct Task *task)
GetBg0TilesDst(&tilemap, &tileset); GetBg0TilesDst(&tilemap, &tileset);
LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset); LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);
FillBgTilemapBufferRect(0, 1, 0, 0, 1, 0x20, 0xF); FillBgTilemapBufferRect(0, 1, 0, 0, MARGIN_SIZE, 32, 15);
FillBgTilemapBufferRect(0, 1, 0x1D, 0, 1, 0x20, 0xF); FillBgTilemapBufferRect(0, 1, 30 - MARGIN_SIZE, 0, MARGIN_SIZE, 32, 15);
CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(0);
LoadPalette(sFrontierSquares_Palette, 0xE0, sizeof(sFrontierSquares_Palette)); LoadPalette(sFrontierSquares_Palette, 0xE0, sizeof(sFrontierSquares_Palette));
LoadPalette(sFrontierSquares_Palette, 0xF0, sizeof(sFrontierSquares_Palette)); LoadPalette(sFrontierSquares_Palette, 0xF0, sizeof(sFrontierSquares_Palette));
BlendPalette(0xE0, 16, 8, 0); BlendPalette(0xE0, 16, 8, RGB_BLACK);
task->data[2] = 34; task->tSquareNum = NUM_SQUARES - 1;
task->data[3] = 0; task->tFadeFlag = 0;
task->tState++; task->tState++;
return FALSE; return FALSE;
} }
static bool8 FrontierSquaresSpiral_Func2(struct Task *task) static bool8 FrontierSquaresSpiral_Outward(struct Task *task)
{ {
u8 var = gUnknown_085C9A30[task->data[2]]; u8 pos = sFrontierSquaresSpiral_Positions[task->tSquareNum];
u8 varMod = var % 7; u8 x = pos % NUM_SQUARES_PER_ROW;
u8 varDiv = var / 7; u8 y = pos / NUM_SQUARES_PER_ROW;
CopyRectToBgTilemapBufferRect(0, &sFrontierSquares_Tilemap, 0, 0, 4, 4, 4 * varMod + 1, 4 * varDiv, 4, 4, 0xF, 0, 0); CopyRectToBgTilemapBufferRect(0, sFrontierSquares_Tilemap, 0, 0,
SQUARE_SIZE, SQUARE_SIZE,
SQUARE_SIZE * x + MARGIN_SIZE, SQUARE_SIZE * y,
SQUARE_SIZE, SQUARE_SIZE,
15, 0, 0);
CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(0);
if (--task->data[2] < 0) if (--task->tSquareNum < 0)
task->tState++; task->tState++;
return FALSE; return FALSE;
} }
static bool8 FrontierSquaresSpiral_Func3(struct Task *task) // Now that the overworld is completely covered by the squares,
// set it to black so it's not revealed when the squares are removed.
static bool8 FrontierSquaresSpiral_SetBlack(struct Task *task)
{ {
BlendPalette(0xE0, 16, 3, 0); BlendPalette(0xE0, 16, 3, RGB_BLACK);
BlendPalettes(PALETTES_ALL & ~(1 << 15 | 1 << 14), 16, RGB_BLACK); BlendPalettes(PALETTES_ALL & ~(1 << 15 | 1 << 14), 16, RGB_BLACK);
task->data[2] = 0; task->tSquareNum = 0;
task->data[3] = 0; task->tFadeFlag = 0;
task->tState++; task->tState++;
return FALSE; return FALSE;
} }
static bool8 FrontierSquaresSpiral_Func4(struct Task *task) // Spiral inward erasing the squares
static bool8 FrontierSquaresSpiral_Inward(struct Task *task)
{ {
if ((task->data[3] ^= 1)) // Each square is faded first, then the one that was faded last move is erased.
if (task->tFadeFlag ^= 1)
{ {
CopyRectToBgTilemapBufferRect( // Shade square
0, CopyRectToBgTilemapBufferRect(0, sFrontierSquares_Tilemap, 0, 0,
sFrontierSquares_Tilemap, SQUARE_SIZE, SQUARE_SIZE,
0, SQUARE_SIZE * (sFrontierSquaresSpiral_Positions[task->tSquareNum] % NUM_SQUARES_PER_ROW) + MARGIN_SIZE,
0, SQUARE_SIZE * (sFrontierSquaresSpiral_Positions[task->tSquareNum] / NUM_SQUARES_PER_ROW),
4, SQUARE_SIZE, SQUARE_SIZE,
4, 14, 0, 0);
4 * (gUnknown_085C9A30[task->data[2]] % 7) + 1,
4 * (gUnknown_085C9A30[task->data[2]] / 7),
4,
4,
0xE,
0,
0);
} }
else else
{ {
if (task->data[2] > 0) if (task->tSquareNum > 0)
{ {
FillBgTilemapBufferRect( // Erase square
0, FillBgTilemapBufferRect(0, 1,
1, SQUARE_SIZE * (sFrontierSquaresSpiral_Positions[task->tSquareNum - 1] % NUM_SQUARES_PER_ROW) + MARGIN_SIZE,
4 * (gUnknown_085C9A30[task->data[2] - 1] % 7) + 1, SQUARE_SIZE * (sFrontierSquaresSpiral_Positions[task->tSquareNum - 1] / NUM_SQUARES_PER_ROW),
4 * (gUnknown_085C9A30[task->data[2] - 1] / 7), SQUARE_SIZE, SQUARE_SIZE,
4, 15);
4,
0xF);
} }
task->tSquareNum++;
task->data[2]++;
} }
if (task->data[2] > 34) if (task->tSquareNum >= NUM_SQUARES)
task->tState++; task->tState++;
CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(0);
@@ -4579,26 +4632,30 @@ static bool8 FrontierSquaresSpiral_Func4(struct Task *task)
static bool8 FrontierSquares_End(struct Task *task) static bool8 FrontierSquares_End(struct Task *task)
{ {
FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 0x20, 0x20); FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 32, 32);
CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(0);
BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);
DestroyTask(FindTaskIdByFunc(task->func)); DestroyTask(FindTaskIdByFunc(task->func));
return FALSE; return FALSE;
} }
// sub task for phase2 32 #undef tSquareNum
#define tSub32_X_delta data[0] #undef tFadeFlag
#define tSub32_Y_delta data[1]
#define tSub32_Bool data[2]
static void sub_814ABE4(u8 taskId) #define tScrollXDir data[0]
#define tScrollYDir data[1]
#define tScrollUpdateFlag data[2]
#define tSquareNum data[2]
static void Task_ScrollBg(u8 taskId)
{ {
if (!(gTasks[taskId].tSub32_Bool ^= 1)) if (!(gTasks[taskId].tScrollUpdateFlag ^= 1))
{ {
SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_X); SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_X);
SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_Y); SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_Y);
gBattle_BG0_X += gTasks[taskId].tSub32_X_delta; gBattle_BG0_X += gTasks[taskId].tScrollXDir;
gBattle_BG0_Y += gTasks[taskId].tSub32_Y_delta; gBattle_BG0_Y += gTasks[taskId].tScrollYDir;
} }
} }
@@ -4609,7 +4666,7 @@ static bool8 FrontierSquaresScroll_Init(struct Task *task)
GetBg0TilesDst(&tilemap, &tileset); GetBg0TilesDst(&tilemap, &tileset);
LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset); LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);
CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(0);
LoadPalette(sFrontierSquares_Palette, 0xF0, sizeof(sFrontierSquares_Palette)); LoadPalette(sFrontierSquares_Palette, 0xF0, sizeof(sFrontierSquares_Palette));
@@ -4618,25 +4675,27 @@ static bool8 FrontierSquaresScroll_Init(struct Task *task)
SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_X); SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_X);
SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_Y); SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_Y);
task->data[2] = 0; task->tSquareNum = 0;
taskId = CreateTask(sub_814ABE4, 1);
// Start scrolling bg in a random direction.
taskId = CreateTask(Task_ScrollBg, 1);
switch (Random() % 4) switch (Random() % 4)
{ {
case 0: case 0: // Down/right
gTasks[taskId].tSub32_X_delta = 1; gTasks[taskId].tScrollXDir = 1;
gTasks[taskId].tSub32_Y_delta = 1; gTasks[taskId].tScrollYDir = 1;
break; break;
case 1: case 1: // Up/left
gTasks[taskId].tSub32_X_delta = -1; gTasks[taskId].tScrollXDir = -1;
gTasks[taskId].tSub32_Y_delta = -1; gTasks[taskId].tScrollYDir = -1;
break; break;
case 2: case 2: // Up/right
gTasks[taskId].tSub32_X_delta = 1; gTasks[taskId].tScrollXDir = 1;
gTasks[taskId].tSub32_Y_delta = -1; gTasks[taskId].tScrollYDir = -1;
break; break;
default: default: // Down/left
gTasks[taskId].tSub32_X_delta = -1; gTasks[taskId].tScrollXDir = -1;
gTasks[taskId].tSub32_Y_delta = 1; gTasks[taskId].tScrollYDir = 1;
break; break;
} }
@@ -4644,65 +4703,57 @@ static bool8 FrontierSquaresScroll_Init(struct Task *task)
return FALSE; return FALSE;
} }
static bool8 FrontierSquaresScroll_Func2(struct Task *task) static bool8 FrontierSquaresScroll_Draw(struct Task *task)
{ {
u8 var = gUnknown_085C9A53[task->data[2]]; u8 pos = sFrontierSquaresScroll_Positions[task->tSquareNum];
u8 varDiv = var / 8; u8 x = pos / (NUM_SQUARES_PER_ROW + 1); // +1 because during scroll an additional column covers the margin.
u8 varAnd = var & 7; u8 y = pos % (NUM_SQUARES_PER_ROW + 1);
CopyRectToBgTilemapBufferRect( CopyRectToBgTilemapBufferRect(0, &sFrontierSquares_Tilemap, 0, 0,
0, SQUARE_SIZE, SQUARE_SIZE,
&sFrontierSquares_Tilemap, SQUARE_SIZE * x + MARGIN_SIZE, SQUARE_SIZE * y,
0, SQUARE_SIZE, SQUARE_SIZE,
0, 15, 0, 0);
4,
4,
4 * varDiv + 1,
4 * varAnd,
4,
4,
0xF,
0,
0);
CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(0);
if (++task->data[2] > 63) if (++task->tSquareNum >= (int)ARRAY_COUNT(sFrontierSquaresScroll_Positions))
task->tState++; task->tState++;
return 0; return 0;
} }
static bool8 FrontierSquaresScroll_Func3(struct Task *task) // Now that the overworld is completely covered by the squares,
// set it to black so it's not revealed when the squares are removed.
static bool8 FrontierSquaresScroll_SetBlack(struct Task *task)
{ {
BlendPalettes(PALETTES_ALL & ~(1 << 15), 16, RGB_BLACK); BlendPalettes(PALETTES_ALL & ~(1 << 15), 16, RGB_BLACK);
task->data[2] = 0; task->tSquareNum = 0;
task->tState++; task->tState++;
return FALSE; return FALSE;
} }
static bool8 FrontierSquaresScroll_Func4(struct Task *task) static bool8 FrontierSquaresScroll_Erase(struct Task *task)
{ {
u8 var = gUnknown_085C9A53[task->data[2]]; u8 pos = sFrontierSquaresScroll_Positions[task->tSquareNum];
u8 varDiv = var / 8; u8 x = pos / (NUM_SQUARES_PER_ROW + 1);
u8 varAnd = var % 8; u8 y = pos % (NUM_SQUARES_PER_ROW + 1);
FillBgTilemapBufferRect(0, 1, 4 * varDiv + 1, 4 * varAnd, 4, 4, 0xF); FillBgTilemapBufferRect(0, 1,
SQUARE_SIZE * x + MARGIN_SIZE, SQUARE_SIZE * y,
SQUARE_SIZE, SQUARE_SIZE,
15);
CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(0);
if (++task->data[2] > 63) if (++task->tSquareNum >= (int)ARRAY_COUNT(sFrontierSquaresScroll_Positions))
{ {
DestroyTask(FindTaskIdByFunc(sub_814ABE4)); DestroyTask(FindTaskIdByFunc(Task_ScrollBg));
task->tState++; task->tState++;
} }
return FALSE; return FALSE;
} }
#undef tSub32_X_delta
#undef tSub32_Y_delta
#undef tSub32_Bool
static bool8 FrontierSquaresScroll_End(struct Task *task) static bool8 FrontierSquaresScroll_End(struct Task *task)
{ {
gBattle_BG0_X = 0; gBattle_BG0_X = 0;
@@ -4710,7 +4761,7 @@ static bool8 FrontierSquaresScroll_End(struct Task *task)
SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0);
SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_Y); SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_Y);
FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 0x20, 0x20); FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 32, 32);
CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(0);
BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);
@@ -4721,3 +4772,8 @@ static bool8 FrontierSquaresScroll_End(struct Task *task)
#endif #endif
return FALSE; return FALSE;
} }
#undef tScrollXDir
#undef tScrollYDir
#undef tScrollUpdateFlag
#undef tSquareNum