diff --git a/include/bike.h b/include/bike.h index d6021f5e4..cd079477e 100644 --- a/include/bike.h +++ b/include/bike.h @@ -6,11 +6,11 @@ // Player speeds enum { - SPEED_STANDING, - SPEED_NORMAL, - SPEED_FAST, - SPEED_FASTER, - SPEED_FASTEST, + PLAYER_SPEED_STANDING, + PLAYER_SPEED_NORMAL, + PLAYER_SPEED_FAST, + PLAYER_SPEED_FASTER, + PLAYER_SPEED_FASTEST, }; enum { diff --git a/include/constants/metatile_labels.h b/include/constants/metatile_labels.h index 86873cbf4..53de3a62c 100644 --- a/include/constants/metatile_labels.h +++ b/include/constants/metatile_labels.h @@ -35,6 +35,10 @@ // gTileset_DepartmentStore #define METATILE_DepartmentStore_ElevatorDoor 0x28D +// gTileset_Fallarbor +#define METATILE_Fallarbor_AshGrass 0x20A +#define METATILE_Fallarbor_NormalGrass 0x212 + // gTileset_FuchsiaCity #define METATILE_FuchsiaCity_Door 0x2BF #define METATILE_FuchsiaCity_SafariZoneDoor 0x2D2 @@ -74,6 +78,9 @@ #define METATILE_GenericBuilding1_PlayersPCOff 0x28F #define METATILE_GenericBuilding1_PlayersPCOn 0x28A +// gTileset_Lavaridge +#define METATILE_Lavaridge_NormalGrass 0x206 + // gTileset_LavenderTown #define METATILE_LavenderTown_Door 0x2A2 @@ -84,6 +91,9 @@ // gTileset_MtEmber #define METATILE_MtEmber_CaveEntrance 0x346 +// gTileset_Pacifidlog +#define METATILE_Pacifidlog_SkyPillar_CrackedFloor_Hole 0x237 + // gTileset_PalletTown #define METATILE_PalletTown_Door 0x2A3 #define METATILE_PalletTown_OaksLabDoor 0x2AC @@ -165,6 +175,10 @@ #define METATILE_PokemonMansion_Wall_EndPost_Bottom 0x2AD #define METATILE_PokemonMansion_Wall_EndPost_Mid 0x2A5 +// gTileset_RSCave +#define METATILE_RSCave_CrackedFloor 0x22F +#define METATILE_RSCave_CrackedFloor_Hole 0x206 + // gTileset_SSAnne #define METATILE_SSAnne_Door 0x281 diff --git a/src/bike.c b/src/bike.c index ddaae0fa6..be9cd8e50 100644 --- a/src/bike.c +++ b/src/bike.c @@ -338,7 +338,7 @@ void BikeClearState(u32 directionHistory, u32 abStartSelectHistory) gPlayerAvatar.acroBikeState = BIKE_STATE_NORMAL; gPlayerAvatar.newDirBackup = 0; gPlayerAvatar.bikeFrameCounter = 0; - gPlayerAvatar.bikeSpeed = SPEED_STANDING; + gPlayerAvatar.bikeSpeed = PLAYER_SPEED_STANDING; gPlayerAvatar.directionHistory = directionHistory; gPlayerAvatar.abStartSelectHistory = abStartSelectHistory; gPlayerAvatar.lastSpinTile = 0; @@ -355,21 +355,21 @@ void Bike_UpdateBikeCounterSpeed(u8 counter) static void Bike_SetBikeStill(void) { gPlayerAvatar.bikeFrameCounter = 0; - gPlayerAvatar.bikeSpeed = SPEED_STANDING; + gPlayerAvatar.bikeSpeed = PLAYER_SPEED_STANDING; } s16 GetPlayerSpeed(void) { - s16 machBikeSpeeds[] = { SPEED_NORMAL, SPEED_FAST, SPEED_FASTEST }; + s16 machBikeSpeeds[] = { PLAYER_SPEED_NORMAL, PLAYER_SPEED_FAST, PLAYER_SPEED_FASTEST }; if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) return machBikeSpeeds[gPlayerAvatar.bikeFrameCounter]; else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) - return SPEED_FASTER; + return PLAYER_SPEED_FASTER; else if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_DASH)) - return SPEED_FAST; + return PLAYER_SPEED_FAST; else - return SPEED_NORMAL; + return PLAYER_SPEED_NORMAL; } void Bike_HandleBumpySlopeJump(void) diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 41ef6ab9c..6ef78e6f3 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -103,7 +103,7 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) } if ((tileTransitionState == T_TILE_CENTER && forcedMove == FALSE) || tileTransitionState == T_NOT_MOVING) { - if (GetPlayerSpeed() != 4) + if (GetPlayerSpeed() != PLAYER_SPEED_FASTEST) { if ((newKeys & START_BUTTON) && !(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED)) input->pressedStartButton = TRUE; diff --git a/src/field_tasks.c b/src/field_tasks.c index 5c60b98b9..ad32f45b3 100644 --- a/src/field_tasks.c +++ b/src/field_tasks.c @@ -15,7 +15,20 @@ #include "constants/metatile_labels.h" #include "constants/songs.h" -// TODO: Metatile IDs in this file +/* This file handles some persistent tasks that run in the overworld. + * - Task_RunTimeBasedEvents: Triggers ambient cries. In RSE, this also periodically updates local time and RTC events. + * - Task_RunPerStepCallback: Calls one of the functions in sPerStepCallbacks, listed below... + * . DummyPerStepCallback: Default, does nothing. Includes functionality from RS that was removed. + * . AshGrassPerStepCallback: Leftover from RS. Removes the ash from ash-covered grass that the player steps on. + * . IcefallCaveIcePerStepCallback: Cracks/breaks ice in Icefall Cave that the player steps on. + * . CrackedFloorPerStepCallback: Leftover from RS. Breaks cracked floors that the player steps on. + * + * NOTE: "PerStep" is perhaps misleading. One function in sPerStepCallbacks is called + * every frame while in the overworld by Task_RunPerStepCallback regardless of + * whether or not steps are being taken. However, nearly all of the functions in + * the table check if the player has moved from their previous position before + * doing anything else. + */ static void DummyPerStepCallback(u8 taskId); static void AshGrassPerStepCallback(u8 taskId); @@ -34,7 +47,8 @@ static const TaskFunc sPerStepCallbacks[] = [STEP_CB_CRACKED_FLOOR] = CrackedFloorPerStepCallback }; -static const u8 sIcefallCaveIceTileCoords[][2] = +// The positions of each map space with crackable ice in Icefall Cave. +static const u8 sIcefallCaveIceCoords[][2] = { { 8, 3 }, { 10, 5 }, @@ -47,56 +61,53 @@ static const u8 sIcefallCaveIceTileCoords[][2] = { 8, 14 } }; +#define tCallbackId data[0] + static void Task_RunPerStepCallback(u8 taskId) { - int idx = gTasks[taskId].data[0]; + int idx = gTasks[taskId].tCallbackId; sPerStepCallbacks[idx](taskId); } +#define tAmbientCryState data[1] +#define tAmbientCryDelay data[2] + +// RTC functionality from RS was removed here. static void Task_RunTimeBasedEvents(u8 taskId) { s16 *data = gTasks[taskId].data; - if (!ArePlayerFieldControlsLocked()) - { - if (!QL_IS_PLAYBACK_STATE) - { - UpdateAmbientCry(&data[1], &data[2]); - } - } + if (!ArePlayerFieldControlsLocked() && !QL_IS_PLAYBACK_STATE) + UpdateAmbientCry(&tAmbientCryState, &tAmbientCryDelay); } void SetUpFieldTasks(void) { if (!FuncIsActiveTask(Task_RunPerStepCallback)) { - u8 taskId = CreateTask(Task_RunPerStepCallback, 0x50); - gTasks[taskId].data[0] = 0; + u8 taskId = CreateTask(Task_RunPerStepCallback, 80); + gTasks[taskId].tCallbackId = STEP_CB_DUMMY; } if (!FuncIsActiveTask(Task_RunTimeBasedEvents)) - CreateTask(Task_RunTimeBasedEvents, 0x50); + CreateTask(Task_RunTimeBasedEvents, 80); } void ActivatePerStepCallback(u8 callbackId) { u8 taskId = FindTaskIdByFunc(Task_RunPerStepCallback); - if (taskId != 0xff) + if (taskId != TASK_NONE) { s32 i; s16 *data = gTasks[taskId].data; - for (i = 0; i < 16; i++) + for (i = 0; i < NUM_TASK_DATA; i++) data[i] = 0; - if (callbackId >= NELEMS(sPerStepCallbacks)) - { - data[0] = 0; - } + if (callbackId >= ARRAY_COUNT(sPerStepCallbacks)) + tCallbackId = STEP_CB_DUMMY; else - { - data[0] = callbackId; - } + tCallbackId = callbackId; } } @@ -106,29 +117,31 @@ void ResetFieldTasksArgs(void) s16 *data; taskId = FindTaskIdByFunc(Task_RunPerStepCallback); - if (taskId != 0xff) - { + if (taskId != TASK_NONE) data = gTasks[taskId].data; - } + taskId = FindTaskIdByFunc(Task_RunTimeBasedEvents); - if (taskId != 0xff) + if (taskId != TASK_NONE) { data = gTasks[taskId].data; - data[1] = 0; - data[2] = 0; + tAmbientCryState = 0; + tAmbientCryDelay = 0; } } +#undef tAmbientCryState +#undef tAmbientCryDelay + static void DummyPerStepCallback(u8 taskId) { } -static void MarkIcefallCaveCoordVisited(s16 x, s16 y) +static void MarkIcePuzzleCoordVisited(s16 x, s16 y) { - u8 i = 0; - for (; i < NELEMS(sIcefallCaveIceTileCoords); ++i) + u8 i; + for (i = 0; i < ARRAY_COUNT(sIcefallCaveIceCoords); i++) { - if (sIcefallCaveIceTileCoords[i][0] + 7 == x && sIcefallCaveIceTileCoords[i][1] + 7 == y) + if (sIcefallCaveIceCoords[i][0] + MAP_OFFSET == x && sIcefallCaveIceCoords[i][1] + MAP_OFFSET == y) { FlagSet(i + 1); break; @@ -138,118 +151,156 @@ static void MarkIcefallCaveCoordVisited(s16 x, s16 y) void SetIcefallCaveCrackedIceMetatiles(void) { - u8 i = 0; - for (; i < NELEMS(sIcefallCaveIceTileCoords); ++i) + u8 i; + for (i = 0; i < ARRAY_COUNT(sIcefallCaveIceCoords); i++) { if (FlagGet(i + 1) == TRUE) { - int x = sIcefallCaveIceTileCoords[i][0] + 7; - int y = sIcefallCaveIceTileCoords[i][1] + 7; + int x = sIcefallCaveIceCoords[i][0] + MAP_OFFSET; + int y = sIcefallCaveIceCoords[i][1] + MAP_OFFSET; MapGridSetMetatileIdAt(x, y, METATILE_SeafoamIslands_CrackedIce); } } } +#define tState data[1] +#define tPrevX data[2] +#define tPrevY data[3] +#define tIceX data[4] +#define tIceY data[5] +#define tDelay data[6] + static void IcefallCaveIcePerStepCallback(u8 taskId) { s16 x, y; u8 tileBehavior; u16 *iceStepCount; s16 *data = gTasks[taskId].data; - switch (data[1]) + switch (tState) { case 0: PlayerGetDestCoords(&x, &y); - data[2] = x; - data[3] = y; - data[1] = 1; + tPrevX = x; + tPrevY = y; + tState = 1; break; case 1: PlayerGetDestCoords(&x, &y); - if (x != data[2] || y != data[3]) + // End if player hasn't moved + if (x == tPrevX && y == tPrevY) + return; + + tPrevX = x; + tPrevY = y; + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if (MetatileBehavior_IsThinIce(tileBehavior) == TRUE) { - data[2] = x; - data[3] = y; - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - if (MetatileBehavior_IsThinIce(tileBehavior) == TRUE) - { - MarkIcefallCaveCoordVisited(x, y); - data[6] = 4; - data[1] = 2; - data[4] = x; - data[5] = y; - } - else if (MetatileBehavior_IsCrackedIce(tileBehavior) == TRUE) - { - data[6] = 4; - data[1] = 3; - data[4] = x; - data[5] = y; - } + // Thin ice, set it to cracked ice + MarkIcePuzzleCoordVisited(x, y); + tDelay = 4; + tState = 2; + tIceX = x; + tIceY = y; + } + else if (MetatileBehavior_IsCrackedIce(tileBehavior) == TRUE) + { + // Cracked ice, set it to broken ice + tDelay = 4; + tState = 3; + tIceX = x; + tIceY = y; } break; case 2: - if (data[6] != 0) + if (tDelay != 0) { - data[6]--; + tDelay--; } else { - x = data[4]; - y = data[5]; + // Crack ice + x = tIceX; + y = tIceY; PlaySE(SE_ICE_CRACK); MapGridSetMetatileIdAt(x, y, METATILE_SeafoamIslands_CrackedIce); CurrentMapDrawMetatileAt(x, y); - data[1] = 1; + tState = 1; } break; case 3: - if (data[6] != 0) + if (tDelay != 0) { - data[6]--; + tDelay--; } else { - x = data[4]; - y = data[5]; + // Break ice + x = tIceX; + y = tIceY; PlaySE(SE_ICE_BREAK); MapGridSetMetatileIdAt(x, y, METATILE_SeafoamIslands_IceHole); CurrentMapDrawMetatileAt(x, y); VarSet(VAR_TEMP_1, 1); - data[1] = 1; + tState = 1; } break; } } -// This is leftover from pokeruby and effectively a no-op. +#undef tState +#undef tPrevX +#undef tPrevY +#undef tIceX +#undef tIceY +#undef tDelay + +#define tPrevX data[1] +#define tPrevY data[2] + +// Unused. For some reason this was not dummied out like the other RSE-exclusive step callbacks. static void AshGrassPerStepCallback(u8 taskId) { s16 x, y; u16 *ashGatherCount; s16 *data = gTasks[taskId].data; PlayerGetDestCoords(&x, &y); - if (x != data[1] || y != data[2]) + + // End if player hasn't moved + if (x == tPrevX && y == tPrevY) + return; + + tPrevX = x; + tPrevY = y; + if (MetatileBehavior_IsAshGrass((u8)MapGridGetMetatileBehaviorAt(x, y))) { - data[1] = x; - data[2] = y; - if (MetatileBehavior_IsAshGrass((u8)MapGridGetMetatileBehaviorAt(x, y))) - { - if (MapGridGetMetatileIdAt(x, y) == 0x20a) - StartAshFieldEffect(x, y, 0x212, 4); - else - StartAshFieldEffect(x, y, 0x206, 4); - } + // Remove ash from grass + if (MapGridGetMetatileIdAt(x, y) == METATILE_Fallarbor_AshGrass) + StartAshFieldEffect(x, y, METATILE_Fallarbor_NormalGrass, 4); + else + StartAshFieldEffect(x, y, METATILE_Lavaridge_NormalGrass, 4); } } +#undef tPrevX +#undef tPrevY + +// Unused. For some reason these were not dummied out like the other RSE-exclusive step callbacks. static void SetCrackedFloorHoleMetatile(s16 x, s16 y) { - MapGridSetMetatileIdAt(x, y, MapGridGetMetatileIdAt(x, y) == 0x22f ? 0x206 : 0x237); + MapGridSetMetatileIdAt(x, y, MapGridGetMetatileIdAt(x, y) == METATILE_RSCave_CrackedFloor ? METATILE_RSCave_CrackedFloor_Hole : METATILE_Pacifidlog_SkyPillar_CrackedFloor_Hole); CurrentMapDrawMetatileAt(x, y); } -// This is leftover from pokeruby and effectively a no-op. +#define tPrevX data[2] +#define tPrevY data[3] +#define tFloor1Delay data[4] +#define tFloor1X data[5] +#define tFloor1Y data[6] +#define tFloor2Delay data[7] +#define tFloor2X data[8] +#define tFloor2Y data[9] + +// Unused. See above. static void CrackedFloorPerStepCallback(u8 taskId) { s16 x, y; @@ -257,40 +308,44 @@ static void CrackedFloorPerStepCallback(u8 taskId) s16 *data = gTasks[taskId].data; PlayerGetDestCoords(&x, &y); behavior = MapGridGetMetatileBehaviorAt(x, y); - if (data[4] != 0 && (--data[4]) == 0) - SetCrackedFloorHoleMetatile(data[5], data[6]); - if (data[7] != 0 && (--data[7]) == 0) - SetCrackedFloorHoleMetatile(data[8], data[9]); + // Update up to 2 previous cracked floor spaces + if (tFloor1Delay != 0 && (--tFloor1Delay) == 0) + SetCrackedFloorHoleMetatile(tFloor1X, tFloor1Y); + if (tFloor2Delay != 0 && (--tFloor2Delay) == 0) + SetCrackedFloorHoleMetatile(tFloor2X, tFloor2Y); - if ((x != data[2] || y != data[3])) + // End if player hasn't moved + if (x == tPrevX && y == tPrevY) + return; + + tPrevX = x; + tPrevY = y; + if (MetatileBehavior_IsCrackedFloor(behavior)) { - data[2] = x; - data[3] = y; - if (MetatileBehavior_IsCrackedFloor(behavior)) - { - if (GetPlayerSpeed() != 4) - VarSet(VAR_ICE_STEP_COUNT, 0); + if (GetPlayerSpeed() != PLAYER_SPEED_FASTEST) + VarSet(VAR_ICE_STEP_COUNT, 0); // this var does double duty - if (data[4] == 0) - { - data[4] = 3; - data[5] = x; - data[6] = y; - } - else if (data[7] == 0) - { - data[7] = 3; - data[8] = x; - data[9] = y; - } + if (tFloor1Delay == 0) + { + tFloor1Delay = 3; + tFloor1X = x; + tFloor1Y = y; + } + else if (tFloor2Delay == 0) + { + tFloor2Delay = 3; + tFloor2X = x; + tFloor2Y = y; } } } -// Unused -static void SetHasPokedexAndPokemon(void) -{ - FlagSet(FLAG_SYS_POKEDEX_GET); - FlagSet(FLAG_SYS_POKEMON_GET); -} +#undef tPrevX +#undef tPrevY +#undef tFloor1Delay +#undef tFloor1X +#undef tFloor1Y +#undef tFloor2Delay +#undef tFloor2X +#undef tFloor2Y diff --git a/src/start_menu.c b/src/start_menu.c index c6a1c5c08..f39176ccc 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -184,6 +184,13 @@ static ALIGNED(2) const u8 sTextColor_StatName[] = { 1, 2, 3 }; static ALIGNED(2) const u8 sTextColor_StatValue[] = { 1, 4, 5 }; static ALIGNED(2) const u8 sTextColor_LocationHeader[] = { 1, 6, 7 }; +// Unused +static void SetHasPokedexAndPokemon(void) +{ + FlagSet(FLAG_SYS_POKEDEX_GET); + FlagSet(FLAG_SYS_POKEMON_GET); +} + static void SetUpStartMenu(void) { sNumStartMenuItems = 0;