Document some overworld and field effects

This commit is contained in:
GriffinR
2020-06-19 19:58:56 -04:00
parent 46f4a4bbf7
commit 18d57a3802
71 changed files with 1379 additions and 1302 deletions
+122 -95
View File
@@ -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);
if (gTasks[taskId].data[2] == 0)
{
for (y = 0; y < 3; y++)
{
for (x = 0; x < 3; x++)
{
s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y);
#define ESCALATOR_STAGES 3
#define LAST_ESCALATOR_STAGE (ESCALATOR_STAGES - 1)
if (list[r4] == metatileId)
{
if (r4 != 2)
MapGridSetMetatileIdAt(r5 + x, r3 + y, isImpassableFlag | list[r4 + 1]);
else
MapGridSetMetatileIdAt(r5 + x, r3 + y, isImpassableFlag | list[0]);
}
}
}
}
else
{
for (y = 0; y < 3; y++)
{
for (x = 0; x < 3; x++)
{
s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y);
if (list[2 - r4] == metatileId)
{
if (r4 != 2)
MapGridSetMetatileIdAt(r5 + x, r3 + y, isImpassableFlag | list[1 - r4]);
else
MapGridSetMetatileIdAt(r5 + x, r3 + y, isImpassableFlag | list[2]);
}
}
}
}
}
static const u16 sElevatorMetatiles_1F_0[] = {
static const u16 sElevatorMetatiles_1F_0[ESCALATOR_STAGES] = {
METATILE_ID(PokemonCenter, Elevator1F_Tile0_Frame2),
METATILE_ID(PokemonCenter, Elevator1F_Tile0_Frame1),
METATILE_ID(PokemonCenter, Elevator1F_Tile0_Frame0)
};
static const u16 sElevatorMetatiles_1F_1[] = {
static const u16 sElevatorMetatiles_1F_1[ESCALATOR_STAGES] = {
METATILE_ID(PokemonCenter, Elevator1F_Tile1_Frame2),
METATILE_ID(PokemonCenter, Elevator1F_Tile1_Frame1),
METATILE_ID(PokemonCenter, Elevator1F_Tile1_Frame0)
};
static const u16 sElevatorMetatiles_1F_2[] = {
static const u16 sElevatorMetatiles_1F_2[ESCALATOR_STAGES] = {
METATILE_ID(PokemonCenter, Elevator1F_Tile2_Frame2),
METATILE_ID(PokemonCenter, Elevator1F_Tile2_Frame1),
METATILE_ID(PokemonCenter, Elevator1F_Tile2_Frame0)
};
static const u16 sElevatorMetatiles_1F_3[] = {
static const u16 sElevatorMetatiles_1F_3[ESCALATOR_STAGES] = {
METATILE_ID(PokemonCenter, Elevator1F_Tile3_Frame2),
METATILE_ID(PokemonCenter, Elevator1F_Tile3_Frame1),
METATILE_ID(PokemonCenter, Elevator1F_Tile3_Frame0)
};
static const u16 sElevatorMetatiles_2F_0[] = {
static const u16 sElevatorMetatiles_2F_0[ESCALATOR_STAGES] = {
METATILE_ID(PokemonCenter, Elevator2F_Tile0_Frame0),
METATILE_ID(PokemonCenter, Elevator2F_Tile0_Frame1),
METATILE_ID(PokemonCenter, Elevator2F_Tile0_Frame2)
};
static const u16 sElevatorMetatiles_2F_1[] = {
static const u16 sElevatorMetatiles_2F_1[ESCALATOR_STAGES] = {
METATILE_ID(PokemonCenter, Elevator2F_Tile1_Frame0),
METATILE_ID(PokemonCenter, Elevator2F_Tile1_Frame1),
METATILE_ID(PokemonCenter, Elevator2F_Tile1_Frame2)
};
static const u16 sElevatorMetatiles_2F_2[] = {
static const u16 sElevatorMetatiles_2F_2[ESCALATOR_STAGES] = {
METATILE_ID(PokemonCenter, Elevator2F_Tile2_Frame0),
METATILE_ID(PokemonCenter, Elevator2F_Tile2_Frame1),
METATILE_ID(PokemonCenter, Elevator2F_Tile2_Frame2)
};
static void sub_80E1444(u8 taskId)
#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 *data = gTasks[taskId].data;
s16 x = gTasks[taskId].tPlayerX - 1;
s16 y = gTasks[taskId].tPlayerY - 1;
s16 transitionStage = gTasks[taskId].tTransitionStage;
s16 i;
s16 j;
data[3] = 1;
switch (data[0])
// Check all the escalator sections and only progress the selected one to the next stage
if (!gTasks[taskId].tGoingUp)
{
case 0:
sub_80E12E8(taskId, sElevatorMetatiles_1F_0, 0);
break;
case 1:
sub_80E12E8(taskId, sElevatorMetatiles_1F_1, 0);
break;
case 2:
sub_80E12E8(taskId, sElevatorMetatiles_1F_2, METATILE_COLLISION_MASK);
break;
case 3:
sub_80E12E8(taskId, sElevatorMetatiles_1F_3, 0);
break;
case 4:
sub_80E12E8(taskId, sElevatorMetatiles_2F_0, METATILE_COLLISION_MASK);
break;
case 5:
sub_80E12E8(taskId, sElevatorMetatiles_2F_1, 0);
break;
case 6:
sub_80E12E8(taskId, sElevatorMetatiles_2F_2, 0);
break;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
s16 metatileId = MapGridGetMetatileIdAt(x + j, y + i);
if (metatileIds[transitionStage] == metatileId)
{
if (transitionStage != LAST_ESCALATOR_STAGE)
MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[transitionStage + 1]);
else
MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[0]);
}
}
}
}
data[0] = (data[0] + 1) & 7;
if (!data[0])
else
{
DrawWholeMapView();
data[1] = (data[1] + 1) % 3;
data[3] = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
s16 metatileId = MapGridGetMetatileIdAt(x + j, y + i);
if (metatileIds[LAST_ESCALATOR_STAGE - transitionStage] == metatileId)
{
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 u8 sub_80E150C(u16 var)
static void Task_DrawEscalator(u8 taskId)
{
u8 taskId = CreateTask(sub_80E1444, 0);
s16 *data = gTasks[taskId].data;
PlayerGetDestCoords(&data[4], &data[5]);
data[0] = 0;
data[1] = 0;
data[2] = var;
sub_80E1444(taskId);
tDrawingEscalator = TRUE;
// Set tile for each section of the escalator in sequence for current transition stage
switch (tState)
{
case 0:
SetEscalatorMetatile(taskId, sElevatorMetatiles_1F_0, 0);
break;
case 1:
SetEscalatorMetatile(taskId, sElevatorMetatiles_1F_1, 0);
break;
case 2:
SetEscalatorMetatile(taskId, sElevatorMetatiles_1F_2, METATILE_COLLISION_MASK);
break;
case 3:
SetEscalatorMetatile(taskId, sElevatorMetatiles_1F_3, 0);
break;
case 4:
SetEscalatorMetatile(taskId, sElevatorMetatiles_2F_0, METATILE_COLLISION_MASK);
break;
case 5:
SetEscalatorMetatile(taskId, sElevatorMetatiles_2F_1, 0);
break;
case 6:
SetEscalatorMetatile(taskId, sElevatorMetatiles_2F_2, 0);
break;
}
tState = (tState + 1) & 7;
// If all metatiles of the escalator have been set, draw map and progress to next stage
if (tState == 0)
{
DrawWholeMapView();
tTransitionStage = (tTransitionStage + 1) % ESCALATOR_STAGES;
tDrawingEscalator = FALSE;
}
}
static u8 CreateEscalatorTask(bool16 goingUp)
{
u8 taskId = CreateTask(Task_DrawEscalator, 0);
s16 *data = gTasks[taskId].data;
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