Document some overworld and field effects
This commit is contained in:
+122
-95
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user