summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@users.noreply.github.com>2020-02-26 13:57:36 -0500
committerGitHub <noreply@github.com>2020-02-26 13:57:36 -0500
commit13f14218e139f4a552dd88dc1049e958005597d9 (patch)
treebf4970ce154b7ce0c2e5c4c59bbf2b063316d00a /src
parent84d7206b5b79687f957ed6f2eed1f4f1c25b4dad (diff)
parent20118dbc3126813dd382222706b58e8882b4218b (diff)
Merge pull request #268 from GriffinRichards/doc-routes4
Document Routes 20-25, teleporter/escalator anim
Diffstat (limited to 'src')
-rw-r--r--src/sea_cottage_special_anim.c262
-rw-r--r--src/special_field_anim.c341
2 files changed, 341 insertions, 262 deletions
diff --git a/src/sea_cottage_special_anim.c b/src/sea_cottage_special_anim.c
deleted file mode 100644
index c63974a1f..000000000
--- a/src/sea_cottage_special_anim.c
+++ /dev/null
@@ -1,262 +0,0 @@
-#include "global.h"
-#include "event_data.h"
-#include "task.h"
-#include "field_player_avatar.h"
-#include "fieldmap.h"
-#include "field_camera.h"
-
-static EWRAM_DATA u8 gUnknown_2039984 = 0;
-
-static void sub_809C1D8(u8 taskId, const s16 *a1, u16 a2);
-static void sub_809C334(u8 taskId);
-static void sub_809C500(u8 taskId);
-static void sub_809C640(u8 taskId);
-
-static const u16 gUnknown_83DF0D4[] = {0x0308, 0x030a, 0x02d0};
-static const u16 gUnknown_83DF0DA[] = {0x0309, 0x030b, 0x02d1};
-static const u16 gUnknown_83DF0E0[] = {0x0310, 0x0312, 0x02d8};
-static const u16 gUnknown_83DF0E6[] = {0x0311, 0x0313, 0x02d9};
-static const u16 gUnknown_83DF0EC[] = {0x02e3, 0x0316, 0x0314};
-static const u16 gUnknown_83DF0F2[] = {0x02e4, 0x0317, 0x0315};
-static const u16 gUnknown_83DF0F8[] = {0x02eb, 0x031e, 0x031c};
-
-// Functions
-static void sub_809C1D8(u8 taskId, const s16 *a1, u16 a2)
-{
- s16 r5, r3, r4;
- s16 i, j;
-
- r5 = gTasks[taskId].data[4] - 1;
- r3 = gTasks[taskId].data[5] - 1;
- r4 = gTasks[taskId].data[1];
-
- if (gTasks[taskId].data[2] == 0)
- {
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < 3; j++)
- {
- s32 id = MapGridGetMetatileIdAt(r5 + j, r3 + i);
-
- if (a1[r4] == (s16)id)
- {
- if (r4 != 2)
- MapGridSetMetatileIdAt(r5 + j, r3 + i, a2 | a1[r4 + 1]);
- else
- MapGridSetMetatileIdAt(r5 + j, r3 + i, a2 | a1[0]);
- }
- }
- }
- }
- else
- {
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < 3; j++)
- {
- s32 id = MapGridGetMetatileIdAt(r5 + j, r3 + i);
-
- if (a1[2 - r4] == (s16)id)
- {
- if (r4 != 2)
- MapGridSetMetatileIdAt(r5 + j, r3 + i, a2 | a1[1 - r4]);
- else
- MapGridSetMetatileIdAt(r5 + j, r3 + i, a2 | a1[2]);
- }
- }
- }
- }
-}
-
-static void sub_809C334(u8 taskId)
-{
- s16 *data = gTasks[taskId].data;
- u16 v1;
-
- data[3] = 1;
- switch (data[0])
- {
- case 0:
- sub_809C1D8(taskId, gUnknown_83DF0D4, 0);
- break;
- case 1:
- sub_809C1D8(taskId, gUnknown_83DF0DA, 0);
- break;
- case 2:
- sub_809C1D8(taskId, gUnknown_83DF0E0, 0xC00);
- break;
- case 3:
- sub_809C1D8(taskId, gUnknown_83DF0E6, 0);
- break;
- case 4:
- sub_809C1D8(taskId, gUnknown_83DF0EC, 0xC00);
- break;
- case 5:
- sub_809C1D8(taskId, gUnknown_83DF0F2, 0);
- break;
- case 6:
- sub_809C1D8(taskId, gUnknown_83DF0F8, 0);
- default:
- break;
- }
-
- data[0] = (data[0] + 1) & 7;
- v1 = data[0] & 7;
- if (v1 == 0)
- {
- DrawWholeMapView();
- data[1] = (data[1] + 1) % 3;
- data[3] = v1;
- }
-}
-
-static u8 sub_809C3FC(u16 a0)
-{
- u8 taskId;
- s16 *data;
-
- taskId = CreateTask(sub_809C334, 0);
- data = gTasks[taskId].data;
- PlayerGetDestCoords(&data[4], &data[5]);
- data[0] = 0;
- data[1] = 0;
- data[2] = a0;
- sub_809C334(taskId);
- return taskId;
-}
-
-void sub_809C448(u8 a0)
-{
- u8 taskId;
-
- taskId = sub_809C3FC(a0);
- gUnknown_2039984 = taskId;
-}
-
-void sub_809C460(void)
-{
- DestroyTask(gUnknown_2039984);
-}
-
-bool8 sub_809C474(void)
-{
- if (gTasks[gUnknown_2039984].data[3] == 0)
- {
- if (gTasks[gUnknown_2039984].data[1] != 2)
- return TRUE;
- return FALSE;
- }
- else
- {
- return TRUE;
- }
-}
-
-// special 0x1b5 - creates a tile animaiton one block left two-four up the player
-void sub_809C4A8(void)
-{
- u8 taskId;
- s16 *data;
-
- taskId = CreateTask(sub_809C500, 0);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[1] = 0;
- data = gTasks[taskId].data;
- PlayerGetDestCoords(&data[2], &data[3]);
- if (gSpecialVar_0x8004 == 0)
- {
- gTasks[taskId].data[2] += 6;
- gTasks[taskId].data[3] -= 5;
- }
- else
- {
- gTasks[taskId].data[2]--;
- gTasks[taskId].data[3] -= 5;
- }
-}
-
-static void sub_809C500(u8 taskId)
-{
- s16 *data = gTasks[taskId].data;
-
- if (data[0] == 0)
- {
- if ((data[1] & 1) == 0)
- {
- MapGridSetMetatileIdAt(data[2], data[3], 0xEB5);
- MapGridSetMetatileIdAt(data[2], data[3] + 2, 0xEB7);
- }
- else
- {
- MapGridSetMetatileIdAt(data[2], data[3], 0xEB6);
- MapGridSetMetatileIdAt(data[2], data[3] + 2, 0xEB8);
- }
- CurrentMapDrawMetatileAt(data[2], data[3]);
- CurrentMapDrawMetatileAt(data[2], data[3] + 2);
- }
-
- data[0]++;
- if (data[0] != 0x10)
- return;
-
- data[0] = 0;
- data[1]++;
- if (data[1] != 0xD)
- return;
-
- MapGridSetMetatileIdAt(data[2], data[3], 0xE8A);
- MapGridSetMetatileIdAt(data[2], data[3] + 2, 0xE96);
- CurrentMapDrawMetatileAt(data[2], data[3]);
- CurrentMapDrawMetatileAt(data[2], data[3] + 2);
- DestroyTask(taskId);
-}
-
-// special 0x1B7 - creates a tile animation two-six blocks right from the top-left corner of the screen
-void sub_809C5FC(void)
-{
- u8 taskId;
- s16 *data;
-
- taskId = CreateTask(sub_809C640, 0);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[1] = 0;
- data = gTasks[taskId].data;
- PlayerGetDestCoords(&data[2], &data[3]);
- gTasks[taskId].data[2] += 4;
- gTasks[taskId].data[3] -= 5;
-}
-
-static void sub_809C640(u8 taskId)
-{
- s16 *data = gTasks[taskId].data;
-
- if (data[0] == 0)
- {
- if (data[1] != 0)
- {
- MapGridSetMetatileIdAt(data[2], data[3], 0xE85);
- MapGridSetMetatileIdAt(data[2], data[3] + 1, 0xEB4);
- CurrentMapDrawMetatileAt(data[2], data[3]);
- CurrentMapDrawMetatileAt(data[2], data[3] + 1);
- if (data[1] == 4)
- {
- DestroyTask(taskId);
- return;
- }
-
- data[2]--;
- }
- MapGridSetMetatileIdAt(data[2], data[3], 0xEB9);
- MapGridSetMetatileIdAt(data[2], data[3] + 1, 0xEBA);
- CurrentMapDrawMetatileAt(data[2], data[3]);
- CurrentMapDrawMetatileAt(data[2], data[3] + 1);
- }
-
- data[0]++;
- if (data[0] == 4)
- {
- data[0] = 0;
- data[1]++;
- }
-}
-
diff --git a/src/special_field_anim.c b/src/special_field_anim.c
new file mode 100644
index 000000000..4193f0b5a
--- /dev/null
+++ b/src/special_field_anim.c
@@ -0,0 +1,341 @@
+#include "global.h"
+#include "event_data.h"
+#include "task.h"
+#include "field_player_avatar.h"
+#include "fieldmap.h"
+#include "field_camera.h"
+#include "constants/metatile_labels.h"
+
+static EWRAM_DATA u8 sEscalatorTaskId = 0;
+
+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_BottomNextRail[ESCALATOR_STAGES] =
+{
+ METATILE_PokemonCenter_Escalator_BottomNextRail_Transition2,
+ METATILE_PokemonCenter_Escalator_BottomNextRail_Transition1,
+ METATILE_PokemonCenter_Escalator_BottomNextRail_Normal
+};
+
+static const u16 sEscalatorMetatiles_BottomRail[ESCALATOR_STAGES] =
+{
+ METATILE_PokemonCenter_Escalator_BottomRail_Transition2,
+ METATILE_PokemonCenter_Escalator_BottomRail_Transition1,
+ METATILE_PokemonCenter_Escalator_BottomRail_Normal
+};
+
+static const u16 sEscalatorMetatiles_BottomNext[ESCALATOR_STAGES] =
+{
+ METATILE_PokemonCenter_Escalator_BottomNext_Transition2,
+ METATILE_PokemonCenter_Escalator_BottomNext_Transition1,
+ METATILE_PokemonCenter_Escalator_BottomNext_Normal
+};
+
+static const u16 sEscalatorMetatiles_Bottom[ESCALATOR_STAGES] =
+{
+ METATILE_PokemonCenter_Escalator_Bottom_Transition2,
+ METATILE_PokemonCenter_Escalator_Bottom_Transition1,
+ METATILE_PokemonCenter_Escalator_Bottom_Normal
+};
+
+static const u16 sEscalatorMetatiles_TopNext[ESCALATOR_STAGES] =
+{
+ METATILE_PokemonCenter_Escalator_TopNext_Normal,
+ METATILE_PokemonCenter_Escalator_TopNext_Transition1,
+ METATILE_PokemonCenter_Escalator_TopNext_Transition2
+};
+
+static const u16 sEscalatorMetatiles_Top[ESCALATOR_STAGES] =
+{
+ METATILE_PokemonCenter_Escalator_Top_Normal,
+ METATILE_PokemonCenter_Escalator_Top_Transition1,
+ METATILE_PokemonCenter_Escalator_Top_Transition2
+};
+
+static const u16 sEscalatorMetatiles_TopNextRail[ESCALATOR_STAGES] =
+{
+ METATILE_PokemonCenter_Escalator_TopNextRail_Normal,
+ METATILE_PokemonCenter_Escalator_TopNextRail_Transition1,
+ METATILE_PokemonCenter_Escalator_TopNextRail_Transition2
+};
+
+#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, y, transitionStage;
+ s16 i, j;
+
+ x = gTasks[taskId].tPlayerX - 1;
+ y = gTasks[taskId].tPlayerY - 1;
+ transitionStage = gTasks[taskId].tTransitionStage;
+
+ // Check all the escalator sections and only progress the selected one to the next stage
+ if (!gTasks[taskId].tGoingUp)
+ {
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < 3; j++)
+ {
+ s32 id = MapGridGetMetatileIdAt(x + j, y + i);
+
+ if (metatileIds[transitionStage] == (s16)id)
+ {
+ if (transitionStage != LAST_ESCALATOR_STAGE)
+ MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[transitionStage + 1]);
+ else
+ MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[0]);
+ }
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < 3; j++)
+ {
+ s32 id = MapGridGetMetatileIdAt(x + j, y + i);
+
+ if (metatileIds[LAST_ESCALATOR_STAGE - transitionStage] == (s16)id)
+ {
+ if (transitionStage != LAST_ESCALATOR_STAGE)
+ MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[1 - transitionStage]);
+ else
+ MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[LAST_ESCALATOR_STAGE]);
+ }
+ }
+ }
+ }
+}
+
+static void Task_DrawEscalator(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u16 state;
+
+ tDrawingEscalator = TRUE;
+
+ // Set tile for each section of the escalator in sequence for current transition stage
+ switch (tState)
+ {
+ case 0:
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_BottomNextRail, 0);
+ break;
+ case 1:
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_BottomRail, 0);
+ break;
+ case 2:
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_BottomNext, METATILE_COLLISION_MASK);
+ break;
+ case 3:
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_Bottom, 0);
+ break;
+ case 4:
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_TopNext, METATILE_COLLISION_MASK);
+ break;
+ case 5:
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_Top, 0);
+ break;
+ case 6:
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_TopNextRail, 0);
+ default:
+ break;
+ }
+
+ tState = (tState + 1) & 7;
+ state = tState & 7;
+
+ // If all sections of the escalator have been set, draw map and progress to next stage
+ if (state == 0)
+ {
+ DrawWholeMapView();
+ tTransitionStage = (tTransitionStage + 1) % ESCALATOR_STAGES;
+ tDrawingEscalator = FALSE;
+ }
+}
+
+static u8 CreateEscalatorTask(bool16 goingUp)
+{
+ u8 taskId;
+ s16 *data;
+
+ taskId = CreateTask(Task_DrawEscalator, 0);
+ data = gTasks[taskId].data;
+ PlayerGetDestCoords(&tPlayerX, &tPlayerY);
+ tState = 0;
+ tTransitionStage = 0;
+ tGoingUp = goingUp;
+ Task_DrawEscalator(taskId);
+ return taskId;
+}
+
+void StartEscalator(bool8 goingUp)
+{
+ u8 taskId;
+
+ taskId = CreateEscalatorTask(goingUp);
+ sEscalatorTaskId = taskId;
+}
+
+void StopEscalator(void)
+{
+ DestroyTask(sEscalatorTaskId);
+}
+
+bool8 IsEscalatorMoving(void)
+{
+ if (gTasks[sEscalatorTaskId].tDrawingEscalator == FALSE)
+ {
+ if (gTasks[sEscalatorTaskId].tTransitionStage != LAST_ESCALATOR_STAGE)
+ return TRUE;
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+#undef tState
+#undef tTransitionStage
+#undef tGoingUp
+#undef tDrawingEscalator
+#undef tPlayerX
+#undef tPlayerY
+
+#define tTimer data[0]
+#define tState data[1]
+#define tX data[2]
+#define tY data[3]
+
+void AnimateTeleporterHousing(void)
+{
+ u8 taskId;
+ s16 *data;
+
+ taskId = CreateTask(Task_DrawTeleporterHousing, 0);
+ gTasks[taskId].tTimer = 0;
+ gTasks[taskId].tState = 0;
+ data = gTasks[taskId].data;
+ PlayerGetDestCoords(&tX, &tY);
+
+ // Set the coords of whichever teleporter is being animated
+ // 0 for the right teleporter, 1 for the left teleporter
+ if (gSpecialVar_0x8004 == 0)
+ {
+ gTasks[taskId].tX += 6;
+ gTasks[taskId].tY -= 5;
+ }
+ else
+ {
+ gTasks[taskId].tX -= 1;
+ gTasks[taskId].tY -= 5;
+ }
+}
+
+static void Task_DrawTeleporterHousing(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (tTimer == 0)
+ {
+ // Alternate the teleporter light / brightness of the teleporter door
+ if ((tState & 1) == 0)
+ {
+ MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Light_Yellow | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(tX, tY + 2, METATILE_SeaCottage_Teleporter_Door_HalfGlowing | METATILE_COLLISION_MASK);
+ }
+ else
+ {
+ MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Light_Red | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(tX, tY + 2, METATILE_SeaCottage_Teleporter_Door_FullGlowing | METATILE_COLLISION_MASK);
+ }
+ CurrentMapDrawMetatileAt(tX, tY);
+ CurrentMapDrawMetatileAt(tX, tY + 2);
+ }
+
+ tTimer++;
+ if (tTimer != 16)
+ return;
+
+ tTimer = 0;
+ tState++;
+ if (tState != 13)
+ return;
+
+ MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Light_Green | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(tX, tY + 2, METATILE_SeaCottage_Teleporter_Door | METATILE_COLLISION_MASK);
+ CurrentMapDrawMetatileAt(tX, tY);
+ CurrentMapDrawMetatileAt(tX, tY + 2);
+ DestroyTask(taskId);
+}
+
+void AnimateTeleporterCable(void)
+{
+ u8 taskId;
+ s16 *data;
+
+ taskId = CreateTask(Task_DrawTeleporterCable, 0);
+ gTasks[taskId].tTimer = 0;
+ gTasks[taskId].tState = 0;
+ data = gTasks[taskId].data;
+ PlayerGetDestCoords(&tX, &tY);
+ gTasks[taskId].tX += 4;
+ gTasks[taskId].tY -= 5;
+}
+
+static void Task_DrawTeleporterCable(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (tTimer == 0)
+ {
+ if (tState != 0)
+ {
+ // Set default cable tiles to clear the ball
+ MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Cable_Top | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(tX, tY + 1, METATILE_SeaCottage_Teleporter_Cable_Bottom | METATILE_COLLISION_MASK);
+ CurrentMapDrawMetatileAt(tX, tY);
+ CurrentMapDrawMetatileAt(tX, tY + 1);
+
+ // End after drawing 4 times (length of the cable)
+ if (tState == 4)
+ {
+ DestroyTask(taskId);
+ return;
+ }
+
+ tX--;
+ }
+
+ // Draw the cable ball
+ MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_CableBall_Top | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(tX, tY + 1, METATILE_SeaCottage_Teleporter_CableBall_Bottom | METATILE_COLLISION_MASK);
+ CurrentMapDrawMetatileAt(tX, tY);
+ CurrentMapDrawMetatileAt(tX, tY + 1);
+ }
+
+ tTimer++;
+ if (tTimer == 4)
+ {
+ tTimer = 0;
+ tState++;
+ }
+}
+
+#undef tTimer
+#undef tState
+#undef tX
+#undef tY