diff options
Diffstat (limited to 'src/fldeff_escalator.c')
-rw-r--r-- | src/fldeff_escalator.c | 207 |
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 |