Label data for elevator effects

This commit is contained in:
GriffinR
2023-02-01 10:37:11 -05:00
parent 27a5e05f75
commit 43af7d46ca
+79 -45
View File
@@ -1664,7 +1664,7 @@ void OffsetCameraForBattle(void)
SetCameraPanning(8, 0); SetCameraPanning(8, 0);
} }
const struct WindowTemplate gElevatorFloor_WindowTemplate = static const struct WindowTemplate sWindowTemplate_ElevatorFloor =
{ {
.bg = 0, .bg = 0,
.tilemapLeft = 21, .tilemapLeft = 21,
@@ -1675,7 +1675,7 @@ const struct WindowTemplate gElevatorFloor_WindowTemplate =
.baseBlock = 8, .baseBlock = 8,
}; };
const u8 *const gDeptStoreFloorNames[] = static const u8 *const sDeptStoreFloorNames[] =
{ {
[DEPT_STORE_FLOORNUM_B4F] = gText_B4F, [DEPT_STORE_FLOORNUM_B4F] = gText_B4F,
[DEPT_STORE_FLOORNUM_B3F] = gText_B3F, [DEPT_STORE_FLOORNUM_B3F] = gText_B3F,
@@ -1695,7 +1695,11 @@ const u8 *const gDeptStoreFloorNames[] =
[DEPT_STORE_FLOORNUM_ROOFTOP] = gText_Rooftop [DEPT_STORE_FLOORNUM_ROOFTOP] = gText_Rooftop
}; };
static const u16 sElevatorWindowTiles_Ascending[][3] = #define ELEVATOR_WINDOW_WIDTH 3
#define ELEVATOR_WINDOW_HEIGHT 3
#define ELEVATOR_LIGHT_STAGES 3
static const u16 sElevatorWindowTiles_Ascending[ELEVATOR_WINDOW_HEIGHT][ELEVATOR_LIGHT_STAGES] =
{ {
{ {
METATILE_BattleFrontier_Elevator_Top0, METATILE_BattleFrontier_Elevator_Top0,
@@ -1714,7 +1718,7 @@ static const u16 sElevatorWindowTiles_Ascending[][3] =
}, },
}; };
static const u16 sElevatorWindowTiles_Descending[][3] = static const u16 sElevatorWindowTiles_Descending[ELEVATOR_WINDOW_HEIGHT][ELEVATOR_LIGHT_STAGES] =
{ {
{ {
METATILE_BattleFrontier_Elevator_Top0, METATILE_BattleFrontier_Elevator_Top0,
@@ -1798,53 +1802,66 @@ u16 GetDeptStoreDefaultFloorChoice(void)
return sLilycoveDeptStore_DefaultFloorChoice; return sLilycoveDeptStore_DefaultFloorChoice;
} }
// Task data for Task_MoveElevator
#define tTimer data[1]
#define tMoveCounter data[2]
#define tVerticalPan data[4]
#define tTotalMoves data[5]
#define tDescending data[6]
// The maximum considered difference between floors.
// Elevator trips with a larger difference are treated the same
// (i.e. traveling 9 floors and 200 floors would take the same amount of time).
#define MAX_ELEVATOR_TRIP 9
// gSpecialVar_0x8005 here is expected to be the current floor number, and
// gSpecialVar_0x8006 is expected to be the destination floor number.
void MoveElevator(void) void MoveElevator(void)
{ {
static const u8 sElevatorTripLength[] = { 8, 16, 24, 32, 38, 46, 52, 56, 57 }; static const u8 sElevatorTripLength[MAX_ELEVATOR_TRIP] = { 8, 16, 24, 32, 38, 46, 52, 56, 57 };
s16 *data = gTasks[CreateTask(Task_MoveElevator, 9)].data; s16 *data = gTasks[CreateTask(Task_MoveElevator, 9)].data;
u16 floorDelta; u16 floorDelta;
data[1] = 0; tTimer = 0;
data[2] = 0; tMoveCounter = 0;
data[4] = 1; tVerticalPan = 1;
// descending
if (gSpecialVar_0x8005 > gSpecialVar_0x8006) if (gSpecialVar_0x8005 > gSpecialVar_0x8006)
{ {
floorDelta = gSpecialVar_0x8005 - gSpecialVar_0x8006; floorDelta = gSpecialVar_0x8005 - gSpecialVar_0x8006;
data[6] = TRUE; tDescending = TRUE;
} }
else else
{ {
floorDelta = gSpecialVar_0x8006 - gSpecialVar_0x8005; floorDelta = gSpecialVar_0x8006 - gSpecialVar_0x8005;
data[6] = FALSE; tDescending = FALSE;
} }
if (floorDelta > 8) if (floorDelta > MAX_ELEVATOR_TRIP - 1)
floorDelta = 8; floorDelta = MAX_ELEVATOR_TRIP - 1;
data[5] = sElevatorTripLength[floorDelta]; tTotalMoves = sElevatorTripLength[floorDelta];
SetCameraPanningCallback(NULL); SetCameraPanningCallback(NULL);
MoveElevatorWindowLights(floorDelta, data[6]); MoveElevatorWindowLights(floorDelta, tDescending);
PlaySE(SE_ELEVATOR); PlaySE(SE_ELEVATOR);
} }
static void Task_MoveElevator(u8 taskId) static void Task_MoveElevator(u8 taskId)
{ {
s16 *data = gTasks[taskId].data; s16 *data = gTasks[taskId].data;
data[1]++; tTimer++;
if (data[1] % 3 == 0) if (tTimer % 3 == 0)
{ {
data[1] = 0; tTimer = 0;
data[2]++; tMoveCounter++;
data[4] = -data[4]; tVerticalPan = -tVerticalPan;
SetCameraPanning(0, data[4]); SetCameraPanning(0, tVerticalPan);
// arrived at floor if (tMoveCounter == tTotalMoves)
if (data[2] == data[5])
{ {
// Arrived at floor
PlaySE(SE_DING_DONG); PlaySE(SE_DING_DONG);
DestroyTask(taskId); DestroyTask(taskId);
ScriptContext_Enable(); ScriptContext_Enable();
@@ -1853,18 +1870,24 @@ static void Task_MoveElevator(u8 taskId)
} }
} }
#undef tTimer
#undef tMoveCounter
#undef tVerticalPan
#undef tTotalMoves
#undef tDescending
void ShowDeptStoreElevatorFloorSelect(void) void ShowDeptStoreElevatorFloorSelect(void)
{ {
int xPos; int xPos;
sTutorMoveAndElevatorWindowId = AddWindow(&gElevatorFloor_WindowTemplate); sTutorMoveAndElevatorWindowId = AddWindow(&sWindowTemplate_ElevatorFloor);
SetStandardWindowBorderStyle(sTutorMoveAndElevatorWindowId, FALSE); SetStandardWindowBorderStyle(sTutorMoveAndElevatorWindowId, FALSE);
xPos = GetStringCenterAlignXOffset(FONT_NORMAL, gText_ElevatorNowOn, 64); xPos = GetStringCenterAlignXOffset(FONT_NORMAL, gText_ElevatorNowOn, 64);
AddTextPrinterParameterized(sTutorMoveAndElevatorWindowId, FONT_NORMAL, gText_ElevatorNowOn, xPos, 1, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(sTutorMoveAndElevatorWindowId, FONT_NORMAL, gText_ElevatorNowOn, xPos, 1, TEXT_SKIP_DRAW, NULL);
xPos = GetStringCenterAlignXOffset(FONT_NORMAL, gDeptStoreFloorNames[gSpecialVar_0x8005], 64); xPos = GetStringCenterAlignXOffset(FONT_NORMAL, sDeptStoreFloorNames[gSpecialVar_0x8005], 64);
AddTextPrinterParameterized(sTutorMoveAndElevatorWindowId, FONT_NORMAL, gDeptStoreFloorNames[gSpecialVar_0x8005], xPos, 17, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(sTutorMoveAndElevatorWindowId, FONT_NORMAL, sDeptStoreFloorNames[gSpecialVar_0x8005], xPos, 17, TEXT_SKIP_DRAW, NULL);
PutWindowTilemap(sTutorMoveAndElevatorWindowId); PutWindowTilemap(sTutorMoveAndElevatorWindowId);
CopyWindowToVram(sTutorMoveAndElevatorWindowId, COPYWIN_FULL); CopyWindowToVram(sTutorMoveAndElevatorWindowId, COPYWIN_FULL);
@@ -1876,17 +1899,23 @@ void CloseDeptStoreElevatorWindow(void)
RemoveWindow(sTutorMoveAndElevatorWindowId); RemoveWindow(sTutorMoveAndElevatorWindowId);
} }
// Task data for Task_MoveElevatorWindowLights
#define tMoveCounter data[0]
#define tTimer data[1]
#define tDescending data[2]
#define tTotalMoves data[3]
static void MoveElevatorWindowLights(u16 floorDelta, bool8 descending) static void MoveElevatorWindowLights(u16 floorDelta, bool8 descending)
{ {
static const u8 sElevatorLightCycles[] = { 3, 6, 9, 12, 15, 18, 21, 24, 27 }; static const u8 sElevatorLightCycles[MAX_ELEVATOR_TRIP] = { 3, 6, 9, 12, 15, 18, 21, 24, 27 };
if (FuncIsActiveTask(Task_MoveElevatorWindowLights) != TRUE) if (FuncIsActiveTask(Task_MoveElevatorWindowLights) != TRUE)
{ {
u8 taskId = CreateTask(Task_MoveElevatorWindowLights, 8); u8 taskId = CreateTask(Task_MoveElevatorWindowLights, 8);
gTasks[taskId].data[0] = 0; gTasks[taskId].tMoveCounter = 0;
gTasks[taskId].data[1] = 0; gTasks[taskId].tTimer = 0;
gTasks[taskId].data[2] = descending; gTasks[taskId].tDescending = descending;
gTasks[taskId].data[3] = sElevatorLightCycles[floorDelta]; gTasks[taskId].tTotalMoves = sElevatorLightCycles[floorDelta];
} }
} }
@@ -1895,36 +1924,41 @@ static void Task_MoveElevatorWindowLights(u8 taskId)
u8 x, y; u8 x, y;
s16 *data = gTasks[taskId].data; s16 *data = gTasks[taskId].data;
if (data[1] == 6) if (tTimer == 6)
{ {
data[0]++; tMoveCounter++;
// ascending if (!tDescending)
if (data[2] == FALSE)
{ {
for (y = 0; y < 3; y++) // Ascending
for (y = 0; y < ELEVATOR_WINDOW_HEIGHT; y++)
{ {
for (x = 0; x < 3; x++) for (x = 0; x < ELEVATOR_WINDOW_WIDTH; x++)
MapGridSetMetatileIdAt(x + MAP_OFFSET + 1, y + MAP_OFFSET, sElevatorWindowTiles_Ascending[y][data[0] % 3] | MAPGRID_COLLISION_MASK); MapGridSetMetatileIdAt(x + MAP_OFFSET + 1, y + MAP_OFFSET, sElevatorWindowTiles_Ascending[y][tMoveCounter % ELEVATOR_LIGHT_STAGES] | MAPGRID_COLLISION_MASK);
} }
} }
// descending
else else
{ {
for (y = 0; y < 3; y++) // Descending
for (y = 0; y < ELEVATOR_WINDOW_HEIGHT; y++)
{ {
for (x = 0; x < 3; x++) for (x = 0; x < ELEVATOR_WINDOW_WIDTH; x++)
MapGridSetMetatileIdAt(x + MAP_OFFSET + 1, y + MAP_OFFSET, sElevatorWindowTiles_Descending[y][data[0] % 3] | MAPGRID_COLLISION_MASK); MapGridSetMetatileIdAt(x + MAP_OFFSET + 1, y + MAP_OFFSET, sElevatorWindowTiles_Descending[y][tMoveCounter % ELEVATOR_LIGHT_STAGES] | MAPGRID_COLLISION_MASK);
} }
} }
DrawWholeMapView(); DrawWholeMapView();
data[1] = 0; tTimer = 0;
if (data[0] == data[3]) if (tMoveCounter == tTotalMoves)
DestroyTask(taskId); DestroyTask(taskId);
} }
data[1]++; tTimer++;
} }
#undef tMoveCounter
#undef tTimer
#undef tDescending
#undef tTotalMoves
void BufferVarsForIVRater(void) void BufferVarsForIVRater(void)
{ {
u8 i; u8 i;