summaryrefslogtreecommitdiff
path: root/src/fldeff_escalator.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fldeff_escalator.c')
-rw-r--r--src/fldeff_escalator.c207
1 files changed, 117 insertions, 90 deletions
diff --git a/src/fldeff_escalator.c b/src/fldeff_escalator.c
index 10fb78ee2..7a96eaa82 100644
--- a/src/fldeff_escalator.c
+++ b/src/fldeff_escalator.c
@@ -8,161 +8,188 @@
static EWRAM_DATA u8 sEscalatorAnim_TaskId = 0;
-static void sub_80E12E8(u8 taskId, const s16 *list, u16 isImpassableFlag)
-{
- s16 r5 = gTasks[taskId].data[4] - 1;
- s16 r3 = gTasks[taskId].data[5] - 1;
- s16 r4 = gTasks[taskId].data[1];
- s16 y;
- s16 x;
+static void SetEscalatorMetatile(u8 taskId, const s16 *metatileIds, u16 metatileMasks);
+static void Task_DrawEscalator(u8 taskId);
+static void Task_DrawTeleporterHousing(u8 taskId);
+static void Task_DrawTeleporterCable(u8 taskId);
+
+#define ESCALATOR_STAGES 3
+#define LAST_ESCALATOR_STAGE (ESCALATOR_STAGES - 1)
+
+static const u16 sEscalatorMetatiles_1F_0[ESCALATOR_STAGES] = {
+ METATILE_PokemonCenter_Escalator1F_Tile0_Frame2,
+ METATILE_PokemonCenter_Escalator1F_Tile0_Frame1,
+ METATILE_PokemonCenter_Escalator1F_Tile0_Frame0
+};
+
+static const u16 sEscalatorMetatiles_1F_1[ESCALATOR_STAGES] = {
+ METATILE_PokemonCenter_Escalator1F_Tile1_Frame2,
+ METATILE_PokemonCenter_Escalator1F_Tile1_Frame1,
+ METATILE_PokemonCenter_Escalator1F_Tile1_Frame0
+};
+
+static const u16 sEscalatorMetatiles_1F_2[ESCALATOR_STAGES] = {
+ METATILE_PokemonCenter_Escalator1F_Tile2_Frame2,
+ METATILE_PokemonCenter_Escalator1F_Tile2_Frame1,
+ METATILE_PokemonCenter_Escalator1F_Tile2_Frame0
+};
+
+static const u16 sEscalatorMetatiles_1F_3[ESCALATOR_STAGES] = {
+ METATILE_PokemonCenter_Escalator1F_Tile3_Frame2,
+ METATILE_PokemonCenter_Escalator1F_Tile3_Frame1,
+ METATILE_PokemonCenter_Escalator1F_Tile3_Frame0
+};
- if (gTasks[taskId].data[2] == 0)
+static const u16 sEscalatorMetatiles_2F_0[ESCALATOR_STAGES] = {
+ METATILE_PokemonCenter_Escalator2F_Tile0_Frame0,
+ METATILE_PokemonCenter_Escalator2F_Tile0_Frame1,
+ METATILE_PokemonCenter_Escalator2F_Tile0_Frame2
+};
+
+static const u16 sEscalatorMetatiles_2F_1[ESCALATOR_STAGES] = {
+ METATILE_PokemonCenter_Escalator2F_Tile1_Frame0,
+ METATILE_PokemonCenter_Escalator2F_Tile1_Frame1,
+ METATILE_PokemonCenter_Escalator2F_Tile1_Frame2
+};
+
+static const u16 sEscalatorMetatiles_2F_2[ESCALATOR_STAGES] = {
+ METATILE_PokemonCenter_Escalator2F_Tile2_Frame0,
+ METATILE_PokemonCenter_Escalator2F_Tile2_Frame1,
+ METATILE_PokemonCenter_Escalator2F_Tile2_Frame2
+};
+
+#define tState data[0]
+#define tTransitionStage data[1]
+#define tGoingUp data[2]
+#define tDrawingEscalator data[3]
+#define tPlayerX data[4]
+#define tPlayerY data[5]
+
+static void SetEscalatorMetatile(u8 taskId, const s16 *metatileIds, u16 metatileMasks)
+{
+ s16 x = gTasks[taskId].tPlayerX - 1;
+ s16 y = gTasks[taskId].tPlayerY - 1;
+ s16 transitionStage = gTasks[taskId].tTransitionStage;
+ s16 i;
+ s16 j;
+
+ // Check all the escalator sections and only progress the selected one to the next stage
+ if (!gTasks[taskId].tGoingUp)
{
- for (y = 0; y < 3; y++)
+ for (i = 0; i < 3; i++)
{
- for (x = 0; x < 3; x++)
+ for (j = 0; j < 3; j++)
{
- s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y);
+ s16 metatileId = MapGridGetMetatileIdAt(x + j, y + i);
- if (list[r4] == metatileId)
+ if (metatileIds[transitionStage] == metatileId)
{
- if (r4 != 2)
- MapGridSetMetatileIdAt(r5 + x, r3 + y, isImpassableFlag | list[r4 + 1]);
+ if (transitionStage != LAST_ESCALATOR_STAGE)
+ MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[transitionStage + 1]);
else
- MapGridSetMetatileIdAt(r5 + x, r3 + y, isImpassableFlag | list[0]);
+ MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[0]);
}
}
}
}
else
{
- for (y = 0; y < 3; y++)
+ for (i = 0; i < 3; i++)
{
- for (x = 0; x < 3; x++)
+ for (j = 0; j < 3; j++)
{
- s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y);
+ s16 metatileId = MapGridGetMetatileIdAt(x + j, y + i);
- if (list[2 - r4] == metatileId)
+ if (metatileIds[LAST_ESCALATOR_STAGE - transitionStage] == metatileId)
{
- if (r4 != 2)
- MapGridSetMetatileIdAt(r5 + x, r3 + y, isImpassableFlag | list[1 - r4]);
+ if (transitionStage != LAST_ESCALATOR_STAGE)
+ MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[1 - transitionStage]);
else
- MapGridSetMetatileIdAt(r5 + x, r3 + y, isImpassableFlag | list[2]);
+ MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[LAST_ESCALATOR_STAGE]);
}
}
}
}
}
-static const u16 sElevatorMetatiles_1F_0[] = {
- METATILE_ID(PokemonCenter, Elevator1F_Tile0_Frame2),
- METATILE_ID(PokemonCenter, Elevator1F_Tile0_Frame1),
- METATILE_ID(PokemonCenter, Elevator1F_Tile0_Frame0)
-};
-
-static const u16 sElevatorMetatiles_1F_1[] = {
- METATILE_ID(PokemonCenter, Elevator1F_Tile1_Frame2),
- METATILE_ID(PokemonCenter, Elevator1F_Tile1_Frame1),
- METATILE_ID(PokemonCenter, Elevator1F_Tile1_Frame0)
-};
-
-static const u16 sElevatorMetatiles_1F_2[] = {
- METATILE_ID(PokemonCenter, Elevator1F_Tile2_Frame2),
- METATILE_ID(PokemonCenter, Elevator1F_Tile2_Frame1),
- METATILE_ID(PokemonCenter, Elevator1F_Tile2_Frame0)
-};
-
-static const u16 sElevatorMetatiles_1F_3[] = {
- METATILE_ID(PokemonCenter, Elevator1F_Tile3_Frame2),
- METATILE_ID(PokemonCenter, Elevator1F_Tile3_Frame1),
- METATILE_ID(PokemonCenter, Elevator1F_Tile3_Frame0)
-};
-
-static const u16 sElevatorMetatiles_2F_0[] = {
- METATILE_ID(PokemonCenter, Elevator2F_Tile0_Frame0),
- METATILE_ID(PokemonCenter, Elevator2F_Tile0_Frame1),
- METATILE_ID(PokemonCenter, Elevator2F_Tile0_Frame2)
-};
-
-static const u16 sElevatorMetatiles_2F_1[] = {
- METATILE_ID(PokemonCenter, Elevator2F_Tile1_Frame0),
- METATILE_ID(PokemonCenter, Elevator2F_Tile1_Frame1),
- METATILE_ID(PokemonCenter, Elevator2F_Tile1_Frame2)
-};
-
-static const u16 sElevatorMetatiles_2F_2[] = {
- METATILE_ID(PokemonCenter, Elevator2F_Tile2_Frame0),
- METATILE_ID(PokemonCenter, Elevator2F_Tile2_Frame1),
- METATILE_ID(PokemonCenter, Elevator2F_Tile2_Frame2)
-};
-
-static void sub_80E1444(u8 taskId)
+static void Task_DrawEscalator(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- data[3] = 1;
+ tDrawingEscalator = TRUE;
- switch (data[0])
+ // Set tile for each section of the escalator in sequence for current transition stage
+ switch (tState)
{
case 0:
- sub_80E12E8(taskId, sElevatorMetatiles_1F_0, 0);
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_1F_0, 0);
break;
case 1:
- sub_80E12E8(taskId, sElevatorMetatiles_1F_1, 0);
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_1F_1, 0);
break;
case 2:
- sub_80E12E8(taskId, sElevatorMetatiles_1F_2, METATILE_COLLISION_MASK);
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_1F_2, METATILE_COLLISION_MASK);
break;
case 3:
- sub_80E12E8(taskId, sElevatorMetatiles_1F_3, 0);
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_1F_3, 0);
break;
case 4:
- sub_80E12E8(taskId, sElevatorMetatiles_2F_0, METATILE_COLLISION_MASK);
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_2F_0, METATILE_COLLISION_MASK);
break;
case 5:
- sub_80E12E8(taskId, sElevatorMetatiles_2F_1, 0);
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_2F_1, 0);
break;
case 6:
- sub_80E12E8(taskId, sElevatorMetatiles_2F_2, 0);
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_2F_2, 0);
break;
}
- data[0] = (data[0] + 1) & 7;
- if (!data[0])
+ tState = (tState + 1) & 7;
+
+ // If all metatiles of the escalator have been set, draw map and progress to next stage
+ if (tState == 0)
{
DrawWholeMapView();
- data[1] = (data[1] + 1) % 3;
- data[3] = 0;
+ tTransitionStage = (tTransitionStage + 1) % ESCALATOR_STAGES;
+ tDrawingEscalator = FALSE;
}
}
-static u8 sub_80E150C(u16 var)
+static u8 CreateEscalatorTask(bool16 goingUp)
{
- u8 taskId = CreateTask(sub_80E1444, 0);
+ u8 taskId = CreateTask(Task_DrawEscalator, 0);
s16 *data = gTasks[taskId].data;
- PlayerGetDestCoords(&data[4], &data[5]);
- data[0] = 0;
- data[1] = 0;
- data[2] = var;
- sub_80E1444(taskId);
+ PlayerGetDestCoords(&tPlayerX, &tPlayerY);
+ tState = 0;
+ tTransitionStage = 0;
+ tGoingUp = goingUp;
+ Task_DrawEscalator(taskId);
return taskId;
}
-void sub_80E1558(u8 var)
+void StartEscalator(bool8 goingUp)
{
- sEscalatorAnim_TaskId = sub_80E150C(var);
+ sEscalatorAnim_TaskId = CreateEscalatorTask(goingUp);
}
-void sub_80E1570(void)
+void StopEscalator(void)
{
DestroyTask(sEscalatorAnim_TaskId);
}
-bool8 sub_80E1584(void)
+bool8 IsEscalatorMoving(void)
{
- if (gTasks[sEscalatorAnim_TaskId].data[3] == 0 && gTasks[sEscalatorAnim_TaskId].data[1] == 2)
+ if (gTasks[sEscalatorAnim_TaskId].tDrawingEscalator == FALSE
+ && gTasks[sEscalatorAnim_TaskId].tTransitionStage == LAST_ESCALATOR_STAGE)
return FALSE;
else
return TRUE;
}
+
+#undef tState
+#undef tTransitionStage
+#undef tGoingUp
+#undef tDrawingEscalator
+#undef tPlayerX
+#undef tPlayerY