From 7329ad4784e1ae5854483973cd95a6cb8e7d6038 Mon Sep 17 00:00:00 2001 From: Kuruyia Date: Sat, 29 Mar 2025 10:20:11 +0100 Subject: [PATCH] Document platform lift MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This documents the `unk_0207160C.c` file, which is in charge of setting up and managing the platform lift dynamic map feature for maps that contains platform lifts (Iron Island and the Pokémon League). This does not manage platform lifts used by gyms. Signed-off-by: Kuruyia --- include/constants/field/map_prop.h | 6 +- include/platform_lift.h | 11 + include/unk_0207160C.h | 11 - platinum.us/main.lsf | 2 +- src/dynamic_map_features.c | 2 +- src/meson.build | 2 +- src/overlay008/ov8_02249960.c | 4 +- src/platform_lift.c | 499 +++++++++++++++++++++++++++++ src/scrcmd.c | 6 +- src/unk_0207160C.c | 453 -------------------------- 10 files changed, 521 insertions(+), 475 deletions(-) create mode 100644 include/platform_lift.h delete mode 100644 include/unk_0207160C.h create mode 100644 src/platform_lift.c delete mode 100644 src/unk_0207160C.c diff --git a/include/constants/field/map_prop.h b/include/constants/field/map_prop.h index 648ec13df5..770b8240bb 100644 --- a/include/constants/field/map_prop.h +++ b/include/constants/field/map_prop.h @@ -1,7 +1,7 @@ #ifndef POKEPLATINUM_CONSTANTS_FIELD_MAP_PROP_H #define POKEPLATINUM_CONSTANTS_FIELD_MAP_PROP_H -enum MapPropModelId { +enum MapPropModelID { // Model name: treeeff MAP_PROP_MODEL_HONEY_TREE = 26, // Model name: c2_s03a @@ -51,7 +51,7 @@ enum MapPropModelId { // Model name: table_l03 MAP_PROP_MODEL_DESK_DRAWER_LAPTOP_FACING_LEFT = 248, // Model name: lift_base01 - MAP_PROP_MODEL_IRON_ISLAND_LIFT_PLATFORM = 258, + MAP_PROP_MODEL_IRON_ISLAND_PLATFORM_LIFT = 258, // Model name: gym_door01 MAP_PROP_MODEL_HEARTHOME_GYM_INSIDE_DOOR = 260, // Model name: gym_door00 @@ -87,7 +87,7 @@ enum MapPropModelId { // Model name: ev_o01 MAP_PROP_MODEL_ELEVATOR_LIGHTS = 498, // Model name: leage_lift - MAP_PROP_MODEL_POKEMON_LEAGUE_LIFT_PLATFORM = 502, + MAP_PROP_MODEL_POKEMON_LEAGUE_PLATFORM_LIFT = 502, // Model name: leage_o03 MAP_PROP_MODEL_POKEMON_LEAGUE_HALL_OF_FAME_MACHINE = 507, // Model name: pc_mb diff --git a/include/platform_lift.h b/include/platform_lift.h new file mode 100644 index 0000000000..43c7d40cd4 --- /dev/null +++ b/include/platform_lift.h @@ -0,0 +1,11 @@ +#ifndef POKEPLATINUM_PLATFORM_LIFT_H +#define POKEPLATINUM_PLATFORM_LIFT_H + +#include "field/field_system_decl.h" + +void PlatformLift_DynamicMapFeaturesInit(FieldSystem *fieldSystem); +void PersistedMapFeatures_InitForPlatformLift(FieldSystem *fieldSystem); +u8 PlatformLift_WasNotUsedWhenEnteredMap(FieldSystem *fieldSystem); +void PlatformLift_Trigger(FieldSystem *fieldSystem); + +#endif // POKEPLATINUM_PLATFORM_LIFT_H diff --git a/include/unk_0207160C.h b/include/unk_0207160C.h deleted file mode 100644 index ff7673b41a..0000000000 --- a/include/unk_0207160C.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef POKEPLATINUM_UNK_0207160C_H -#define POKEPLATINUM_UNK_0207160C_H - -#include "field/field_system_decl.h" - -void PlatformLift_DynamicMapFeaturesInit(FieldSystem *fieldSystem); -void PersistedMapFeatures_InitForPlatformLift(FieldSystem *fieldSystem); -u8 sub_02071818(FieldSystem *fieldSystem); -void sub_0207183C(FieldSystem *fieldSystem); - -#endif // POKEPLATINUM_UNK_0207160C_H diff --git a/platinum.us/main.lsf b/platinum.us/main.lsf index d6a0e5e191..61f9933707 100644 --- a/platinum.us/main.lsf +++ b/platinum.us/main.lsf @@ -279,7 +279,7 @@ Static main Object main.nef.p/src_unk_0207070C.c.o Object main.nef.p/src_unk_020711C8.c.o Object main.nef.p/src_unk_020711EC.c.o - Object main.nef.p/src_unk_0207160C.c.o + Object main.nef.p/src_platform_lift.c.o Object main.nef.p/src_persisted_map_features_init.c.o Object main.nef.p/src_map_header_util.c.o Object main.nef.p/src_unk_02071D40.c.o diff --git a/src/dynamic_map_features.c b/src/dynamic_map_features.c index 5ba4088ba1..a82661bf72 100644 --- a/src/dynamic_map_features.c +++ b/src/dynamic_map_features.c @@ -14,8 +14,8 @@ #include "field_system.h" #include "persisted_map_features.h" +#include "platform_lift.h" #include "savedata_misc.h" -#include "unk_0207160C.h" const static DynamicMapFeaturesInitFunc sInitFuncs[DYNAMIC_MAP_FEATURES_COUNT] = { NULL, diff --git a/src/meson.build b/src/meson.build index 124f9c791c..e5e3494a66 100644 --- a/src/meson.build +++ b/src/meson.build @@ -266,7 +266,7 @@ pokeplatinum_c = files( 'unk_0207070C.c', 'unk_020711C8.c', 'unk_020711EC.c', - 'unk_0207160C.c', + 'platform_lift.c', 'persisted_map_features_init.c', 'map_header_util.c', 'unk_02071D40.c', diff --git a/src/overlay008/ov8_02249960.c b/src/overlay008/ov8_02249960.c index a70cdcfeeb..3c706a1802 100644 --- a/src/overlay008/ov8_02249960.c +++ b/src/overlay008/ov8_02249960.c @@ -780,7 +780,7 @@ static BOOL ov8_0224A018(FieldTask *taskMan) (v2->unk_00)++; break; case 1: { - v0 = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, MAP_PROP_MODEL_IRON_ISLAND_LIFT_PLATFORM); + v0 = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, MAP_PROP_MODEL_IRON_ISLAND_PLATFORM_LIFT); { VecFx32 v3; @@ -826,7 +826,7 @@ static BOOL ov8_0224A0E8(FieldTask *taskMan) (v2->unk_00)++; break; case 1: { - v0 = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, MAP_PROP_MODEL_IRON_ISLAND_LIFT_PLATFORM); + v0 = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, MAP_PROP_MODEL_IRON_ISLAND_PLATFORM_LIFT); { VecFx32 v3; diff --git a/src/platform_lift.c b/src/platform_lift.c new file mode 100644 index 0000000000..76c1990a6c --- /dev/null +++ b/src/platform_lift.c @@ -0,0 +1,499 @@ +#include "platform_lift.h" + +#include +#include + +#include "constants/field/dynamic_map_features.h" +#include "constants/field/map.h" +#include "constants/field/map_prop.h" +#include "constants/heap.h" +#include "generated/map_headers.h" + +#include "field/field_system.h" +#include "field/field_system_sub2_t.h" +#include "overlay005/dynamic_terrain_height.h" +#include "overlay005/map_prop.h" + +#include "field_system.h" +#include "field_task.h" +#include "heap.h" +#include "persisted_map_features.h" +#include "player_avatar.h" +#include "savedata_misc.h" +#include "terrain_collision_manager.h" +#include "unk_02005474.h" + +#define PLATFORM_LIFT_SIZE_X 3 +#define PLATFORM_LIFT_SIZE_Y 2 + +#define PLATFORM_LIFT_DYNAMIC_HEIGHT_PLATE_ID 0 + +#define PLATFORM_LIFT_IRON_ISLAND_B2F_LEFT_ROOM_POS_X (FX32_ONE * (16 * 19 + 8)) +#define PLATFORM_LIFT_IRON_ISLAND_B2F_LEFT_ROOM_POS_Z (FX32_ONE * (16 * (MAP_TILES_COUNT_Y + 12) + 8)) + +#define IRON_ISLAND_B1F_RIGHT_ROOM_BOTTOM_FLOOR_WARP_Z 26 +#define IRON_ISLAND_B2F_LEFT_ROOM_BOTTOM_FLOOR_WARP_Z (MAP_TILES_COUNT_Y * 1 + 16) +#define IRON_ISLAND_B3F_BOTTOM_FLOOR_WARP_Z 15 +#define POKEMON_LEAGUE_ELEVATOR_TO_ELITE_FOUR_ROOM_BOTTOM_FLOOR_WARP_Z 15 +#define POKEMON_LEAGUE_ELEVATOR_TO_CHAMPION_ROOM_BOTTOM_FLOOR_WARP_Z 23 +#define POKEMON_LEAGUE_CHAMPION_ROOM_BOTTOM_FLOOR_WARP_Z 18 + +enum PlatformLiftFloorID { + PLATFORM_LIFT_BOTTOM_FLOOR = 0, + PLATFORM_LIFT_TOP_FLOOR, + PLATFORM_LIFT_FLOOR_COUNT, +}; + +enum PlatformLiftID { + PLATFORM_LIFT_IRON_ISLAND_B1F_RIGHT_ROOM = 0, + PLATFORM_LIFT_IRON_ISLAND_B2F_LEFT_ROOM, + PLATFORM_LIFT_IRON_ISLAND_B3F, + PLATFORM_LIFT_POKEMON_LEAGUE_ELEVATOR_TO_AARON_ROOM, + PLATFORM_LIFT_POKEMON_LEAGUE_ELEVATOR_TO_BERTHA_ROOM, + PLATFORM_LIFT_POKEMON_LEAGUE_ELEVATOR_TO_FLINT_ROOM, + PLATFORM_LIFT_POKEMON_LEAGUE_ELEVATOR_TO_LUCIAN_ROOM, + PLATFORM_LIFT_POKEMON_LEAGUE_ELEVATOR_TO_CHAMPION_ROOM, + PLATFORM_LIFT_POKEMON_LEAGUE_CHAMPION_ROOM, + PLATFORM_LIFT_COUNT, +}; + +enum PlatformLiftKind { + PLATFORM_LIFT_KIND_IRON_ISLAND = 0, + PLATFORM_LIFT_KIND_POKEMON_LEAGUE, +}; + +enum PlatformLiftFieldTaskState { + PLATFORM_LIFT_STATE_START_MOVING = 0, + PLATFORM_LIFT_STATE_MOVE, + PLATFORM_LIFT_STATE_FINISH_MOVING, + PLATFORM_LIFT_STATE_END, +}; + +typedef struct PlatformLiftConfiguration { + fx32 floorHeights[PLATFORM_LIFT_FLOOR_COUNT]; + int startTileX; + int startTileZ; + BOOL preventGoingDown; + BOOL isIronIslandB2FLeftRoom; +} PlatformLiftConfiguration; + +typedef struct PlatformLiftPersistedData { + u16 floorID; + u16 id; + BOOL notUsedWhenEnteredMap; + int kind; +} PlatformLiftPersistedData; + +typedef struct PlatformLiftFieldTaskEnv { + int state; + fx32 targetHeight; + BOOL isIronIslandB2FLeftRoom; + int kind; +} PlatformLiftFieldTaskEnv; + +static BOOL FieldTask_PlatformLiftGoUp(FieldTask *taskMan); +static BOOL FieldTask_PlatformLiftGoDown(FieldTask *taskMan); +static void PlatformLift_PlaySoundEffect(const int platformLiftKind); +static void PlatformLift_StopSoundEffect(const int platformLiftKind); + +static const PlatformLiftConfiguration sPerMapPlatformLiftConfiguration[PLATFORM_LIFT_COUNT] = { + [PLATFORM_LIFT_IRON_ISLAND_B1F_RIGHT_ROOM] = { + .floorHeights = { (MAP_OBJECT_TILE_SIZE * 1), (MAP_OBJECT_TILE_SIZE * 9) }, + .startTileX = 10, + .startTileZ = 23, + .preventGoingDown = FALSE, + .isIronIslandB2FLeftRoom = FALSE, + }, + [PLATFORM_LIFT_IRON_ISLAND_B2F_LEFT_ROOM] = { + .floorHeights = { (MAP_OBJECT_TILE_SIZE * 1), (MAP_OBJECT_TILE_SIZE * 9) }, + .startTileX = 18, + .startTileZ = 44, + .preventGoingDown = FALSE, + .isIronIslandB2FLeftRoom = TRUE, + }, + [PLATFORM_LIFT_IRON_ISLAND_B3F] = { + .floorHeights = { (MAP_OBJECT_TILE_SIZE * 1), (MAP_OBJECT_TILE_SIZE * 9) }, + .startTileX = 8, + .startTileZ = 11, + .preventGoingDown = FALSE, + .isIronIslandB2FLeftRoom = FALSE, + }, + [PLATFORM_LIFT_POKEMON_LEAGUE_ELEVATOR_TO_AARON_ROOM] = { + .floorHeights = { (MAP_OBJECT_TILE_SIZE * 0), (MAP_OBJECT_TILE_SIZE * 10) }, + .startTileX = 3, + .startTileZ = 11, + .preventGoingDown = TRUE, + .isIronIslandB2FLeftRoom = FALSE, + }, + [PLATFORM_LIFT_POKEMON_LEAGUE_ELEVATOR_TO_BERTHA_ROOM] = { + .floorHeights = { (MAP_OBJECT_TILE_SIZE * 0), (MAP_OBJECT_TILE_SIZE * 5) }, + .startTileX = 3, + .startTileZ = 11, + .preventGoingDown = TRUE, + .isIronIslandB2FLeftRoom = FALSE, + }, + [PLATFORM_LIFT_POKEMON_LEAGUE_ELEVATOR_TO_FLINT_ROOM] = { + .floorHeights = { (MAP_OBJECT_TILE_SIZE * 0), (MAP_OBJECT_TILE_SIZE * 5) }, + .startTileX = 3, + .startTileZ = 11, + .preventGoingDown = TRUE, + .isIronIslandB2FLeftRoom = FALSE, + }, + [PLATFORM_LIFT_POKEMON_LEAGUE_ELEVATOR_TO_LUCIAN_ROOM] = { + .floorHeights = { (MAP_OBJECT_TILE_SIZE * 0), (MAP_OBJECT_TILE_SIZE * 5) }, + .startTileX = 3, + .startTileZ = 11, + .preventGoingDown = TRUE, + .isIronIslandB2FLeftRoom = FALSE, + }, + [PLATFORM_LIFT_POKEMON_LEAGUE_ELEVATOR_TO_CHAMPION_ROOM] = { + .floorHeights = { (MAP_OBJECT_TILE_SIZE * 0), (MAP_OBJECT_TILE_SIZE * 5) }, + .startTileX = 3, + .startTileZ = 19, + .preventGoingDown = TRUE, + .isIronIslandB2FLeftRoom = FALSE, + }, + [PLATFORM_LIFT_POKEMON_LEAGUE_CHAMPION_ROOM] = { + .floorHeights = { (MAP_OBJECT_TILE_SIZE * 0), (MAP_OBJECT_TILE_SIZE * 15) }, + .startTileX = 7, + .startTileZ = 8, + .preventGoingDown = TRUE, + .isIronIslandB2FLeftRoom = FALSE, + } +}; + +void PlatformLift_DynamicMapFeaturesInit(FieldSystem *fieldSystem) +{ + PersistedMapFeatures *persistedMapFeatures = MiscSaveBlock_GetPersistedMapFeatures(FieldSystem_GetSaveData(fieldSystem)); + PlatformLiftPersistedData *data = PersistedMapFeatures_GetBuffer(persistedMapFeatures, DYNAMIC_MAP_FEATURES_PLATFORM_LIFT_ROOM); + const PlatformLiftConfiguration *platformLiftConfiguration = &sPerMapPlatformLiftConfiguration[data->id]; + fx32 currentHeight = platformLiftConfiguration->floorHeights[data->floorID]; + + MapProp *platformLiftMapProp; + + if (platformLiftConfiguration->isIronIslandB2FLeftRoom) { + VecFx32 platformLiftInitialPosition = { + PLATFORM_LIFT_IRON_ISLAND_B2F_LEFT_ROOM_POS_X, + 0, + PLATFORM_LIFT_IRON_ISLAND_B2F_LEFT_ROOM_POS_Z + }; + + platformLiftInitialPosition.y = currentHeight; + MapPropManager_LoadOne(fieldSystem->mapPropManager, fieldSystem->areaDataManager, MAP_PROP_MODEL_IRON_ISLAND_PLATFORM_LIFT, &platformLiftInitialPosition, NULL, fieldSystem->mapPropAnimMan); + platformLiftMapProp = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, MAP_PROP_MODEL_IRON_ISLAND_PLATFORM_LIFT); + } else { + const int platformLiftModels[2] = { + MAP_PROP_MODEL_IRON_ISLAND_PLATFORM_LIFT, + MAP_PROP_MODEL_POKEMON_LEAGUE_PLATFORM_LIFT + }; + + BOOL platformLiftFound = FieldSystem_FindLoadedMapPropByModelIDs(fieldSystem, platformLiftModels, NELEMS(platformLiftModels), &platformLiftMapProp, NULL); + GF_ASSERT(platformLiftFound); + } + + VecFx32 platformLiftPosition; + platformLiftPosition = MapProp_GetPosition(platformLiftMapProp); + platformLiftPosition.y = currentHeight; + + MapProp_SetPosition(platformLiftMapProp, &platformLiftPosition); + DynamicTerrainHeightManager_SetPlate(PLATFORM_LIFT_DYNAMIC_HEIGHT_PLATE_ID, platformLiftConfiguration->startTileX, platformLiftConfiguration->startTileZ, PLATFORM_LIFT_SIZE_X, PLATFORM_LIFT_SIZE_Y, currentHeight, fieldSystem->dynamicTerrainHeightMan); +} + +void PersistedMapFeatures_InitForPlatformLift(FieldSystem *fieldSystem) +{ + PersistedMapFeatures *persistedMapFeatures = MiscSaveBlock_GetPersistedMapFeatures(FieldSystem_GetSaveData(fieldSystem)); + PersistedMapFeatures_InitWithID(persistedMapFeatures, DYNAMIC_MAP_FEATURES_PLATFORM_LIFT_ROOM); + + PlatformLiftPersistedData *data = PersistedMapFeatures_GetBuffer(persistedMapFeatures, DYNAMIC_MAP_FEATURES_PLATFORM_LIFT_ROOM); + data->notUsedWhenEnteredMap = TRUE; + data->kind = PLATFORM_LIFT_KIND_IRON_ISLAND; + + switch (fieldSystem->location->mapId) { + case MAP_HEADER_IRON_ISLAND_B1F_RIGHT_ROOM: + if (fieldSystem->location->z == IRON_ISLAND_B1F_RIGHT_ROOM_BOTTOM_FLOOR_WARP_Z) { + data->floorID = PLATFORM_LIFT_BOTTOM_FLOOR; + } else { + data->floorID = PLATFORM_LIFT_TOP_FLOOR; + } + + data->id = PLATFORM_LIFT_IRON_ISLAND_B1F_RIGHT_ROOM; + break; + + case MAP_HEADER_IRON_ISLAND_B2F_LEFT_ROOM: + if (fieldSystem->location->z == IRON_ISLAND_B2F_LEFT_ROOM_BOTTOM_FLOOR_WARP_Z) { + data->floorID = PLATFORM_LIFT_BOTTOM_FLOOR; + } else { + data->floorID = PLATFORM_LIFT_TOP_FLOOR; + } + + data->id = PLATFORM_LIFT_IRON_ISLAND_B2F_LEFT_ROOM; + break; + + case MAP_HEADER_IRON_ISLAND_B3F: + if (fieldSystem->location->z == IRON_ISLAND_B3F_BOTTOM_FLOOR_WARP_Z) { + data->floorID = PLATFORM_LIFT_BOTTOM_FLOOR; + } else { + data->floorID = PLATFORM_LIFT_TOP_FLOOR; + } + + data->id = PLATFORM_LIFT_IRON_ISLAND_B3F; + break; + + case MAP_HEADER_POKEMON_LEAGUE_ELEVATOR_TO_AARON_ROOM: + if (fieldSystem->location->z == POKEMON_LEAGUE_ELEVATOR_TO_ELITE_FOUR_ROOM_BOTTOM_FLOOR_WARP_Z) { + data->floorID = PLATFORM_LIFT_BOTTOM_FLOOR; + } else { + data->floorID = PLATFORM_LIFT_TOP_FLOOR; + data->notUsedWhenEnteredMap = FALSE; + } + + data->id = PLATFORM_LIFT_POKEMON_LEAGUE_ELEVATOR_TO_AARON_ROOM; + data->kind = PLATFORM_LIFT_KIND_POKEMON_LEAGUE; + break; + + case MAP_HEADER_POKEMON_LEAGUE_ELEVATOR_TO_BERTHA_ROOM: + if (fieldSystem->location->z == POKEMON_LEAGUE_ELEVATOR_TO_ELITE_FOUR_ROOM_BOTTOM_FLOOR_WARP_Z) { + data->floorID = PLATFORM_LIFT_BOTTOM_FLOOR; + } else { + data->floorID = PLATFORM_LIFT_TOP_FLOOR; + data->notUsedWhenEnteredMap = FALSE; + } + + data->id = PLATFORM_LIFT_POKEMON_LEAGUE_ELEVATOR_TO_BERTHA_ROOM; + data->kind = PLATFORM_LIFT_KIND_POKEMON_LEAGUE; + break; + + case MAP_HEADER_POKEMON_LEAGUE_ELEVATOR_TO_FLINT_ROOM: + if (fieldSystem->location->z == POKEMON_LEAGUE_ELEVATOR_TO_ELITE_FOUR_ROOM_BOTTOM_FLOOR_WARP_Z) { + data->floorID = PLATFORM_LIFT_BOTTOM_FLOOR; + } else { + data->floorID = PLATFORM_LIFT_TOP_FLOOR; + data->notUsedWhenEnteredMap = FALSE; + } + + data->id = PLATFORM_LIFT_POKEMON_LEAGUE_ELEVATOR_TO_FLINT_ROOM; + data->kind = PLATFORM_LIFT_KIND_POKEMON_LEAGUE; + break; + + case MAP_HEADER_POKEMON_LEAGUE_ELEVATOR_TO_LUCIAN_ROOM: + if (fieldSystem->location->z == POKEMON_LEAGUE_ELEVATOR_TO_ELITE_FOUR_ROOM_BOTTOM_FLOOR_WARP_Z) { + data->floorID = PLATFORM_LIFT_BOTTOM_FLOOR; + } else { + data->floorID = PLATFORM_LIFT_TOP_FLOOR; + data->notUsedWhenEnteredMap = FALSE; + } + + data->id = PLATFORM_LIFT_POKEMON_LEAGUE_ELEVATOR_TO_LUCIAN_ROOM; + data->kind = PLATFORM_LIFT_KIND_POKEMON_LEAGUE; + break; + + case MAP_HEADER_POKEMON_LEAGUE_ELEVATOR_TO_CHAMPION_ROOM: + if (fieldSystem->location->z == POKEMON_LEAGUE_ELEVATOR_TO_CHAMPION_ROOM_BOTTOM_FLOOR_WARP_Z) { + data->floorID = PLATFORM_LIFT_BOTTOM_FLOOR; + } else { + data->floorID = PLATFORM_LIFT_TOP_FLOOR; + data->notUsedWhenEnteredMap = FALSE; + } + + data->id = PLATFORM_LIFT_POKEMON_LEAGUE_ELEVATOR_TO_CHAMPION_ROOM; + data->kind = PLATFORM_LIFT_KIND_POKEMON_LEAGUE; + break; + + case MAP_HEADER_POKEMON_LEAGUE_CHAMPION_ROOM: + if (fieldSystem->location->z == POKEMON_LEAGUE_CHAMPION_ROOM_BOTTOM_FLOOR_WARP_Z) { + data->floorID = PLATFORM_LIFT_BOTTOM_FLOOR; + } else { + data->floorID = PLATFORM_LIFT_TOP_FLOOR; + data->notUsedWhenEnteredMap = FALSE; + } + + data->id = PLATFORM_LIFT_POKEMON_LEAGUE_CHAMPION_ROOM; + data->kind = PLATFORM_LIFT_KIND_POKEMON_LEAGUE; + break; + + default: + GF_ASSERT(FALSE); + } +} + +u8 PlatformLift_WasNotUsedWhenEnteredMap(FieldSystem *fieldSystem) +{ + PersistedMapFeatures *persistedMapFeatures = MiscSaveBlock_GetPersistedMapFeatures(FieldSystem_GetSaveData(fieldSystem)); + PlatformLiftPersistedData *data = PersistedMapFeatures_GetBuffer(persistedMapFeatures, DYNAMIC_MAP_FEATURES_PLATFORM_LIFT_ROOM); + + return data->notUsedWhenEnteredMap != FALSE; +} + +void PlatformLift_Trigger(FieldSystem *fieldSystem) +{ + PersistedMapFeatures *persistedMapFeatures = MiscSaveBlock_GetPersistedMapFeatures(FieldSystem_GetSaveData(fieldSystem)); + PlatformLiftPersistedData *data = PersistedMapFeatures_GetBuffer(persistedMapFeatures, DYNAMIC_MAP_FEATURES_PLATFORM_LIFT_ROOM); + + if (sPerMapPlatformLiftConfiguration[data->id].preventGoingDown && data->floorID == PLATFORM_LIFT_TOP_FLOOR) { + return; + } + + PlatformLiftFieldTaskEnv *taskEnv = Heap_AllocFromHeapAtEnd(HEAP_ID_FIELDMAP, sizeof(PlatformLiftFieldTaskEnv)); + taskEnv->state = PLATFORM_LIFT_STATE_START_MOVING; + taskEnv->isIronIslandB2FLeftRoom = sPerMapPlatformLiftConfiguration[data->id].isIronIslandB2FLeftRoom; + taskEnv->kind = data->kind; + + if (data->floorID == PLATFORM_LIFT_BOTTOM_FLOOR) { + taskEnv->targetHeight = sPerMapPlatformLiftConfiguration[data->id].floorHeights[PLATFORM_LIFT_TOP_FLOOR]; + FieldTask_InitCall(fieldSystem->task, FieldTask_PlatformLiftGoUp, taskEnv); + data->floorID = PLATFORM_LIFT_TOP_FLOOR; + } else { + taskEnv->targetHeight = sPerMapPlatformLiftConfiguration[data->id].floorHeights[PLATFORM_LIFT_BOTTOM_FLOOR]; + FieldTask_InitCall(fieldSystem->task, FieldTask_PlatformLiftGoDown, taskEnv); + data->floorID = PLATFORM_LIFT_BOTTOM_FLOOR; + } +} + +static BOOL FieldTask_PlatformLiftGoUp(FieldTask *taskMan) +{ + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); + PlatformLiftFieldTaskEnv *taskEnv = FieldTask_GetEnv(taskMan); + + switch (taskEnv->state) { + case PLATFORM_LIFT_STATE_START_MOVING: + sub_0205ED2C(fieldSystem->playerAvatar, 0); + PlatformLift_PlaySoundEffect(taskEnv->kind); + + taskEnv->state++; + break; + + case PLATFORM_LIFT_STATE_MOVE: { + MapProp *platformLiftMapProp; + + if (taskEnv->isIronIslandB2FLeftRoom) { + platformLiftMapProp = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, MAP_PROP_MODEL_IRON_ISLAND_PLATFORM_LIFT); + } else { + const int platformLiftModels[2] = { + MAP_PROP_MODEL_IRON_ISLAND_PLATFORM_LIFT, + MAP_PROP_MODEL_POKEMON_LEAGUE_PLATFORM_LIFT + }; + + BOOL platformLiftFound = FieldSystem_FindLoadedMapPropByModelIDs(fieldSystem, platformLiftModels, NELEMS(platformLiftModels), &platformLiftMapProp, NULL); + GF_ASSERT(platformLiftFound); + } + + fx32 heightIncrement; + VecFx32 platformLiftPosition; + platformLiftPosition = MapProp_GetPosition(platformLiftMapProp); + + if (taskEnv->kind == PLATFORM_LIFT_KIND_IRON_ISLAND) { + heightIncrement = FX32_ONE; + } else { + heightIncrement = FX32_ONE * 2; + } + + platformLiftPosition.y += heightIncrement; + + if (platformLiftPosition.y >= taskEnv->targetHeight) { + platformLiftPosition.y = taskEnv->targetHeight; + PlatformLift_StopSoundEffect(taskEnv->kind); + + taskEnv->state++; + } + + sub_0205ED0C(fieldSystem->playerAvatar, platformLiftPosition.y); + MapProp_SetPosition(platformLiftMapProp, &platformLiftPosition); + + break; + } + + case PLATFORM_LIFT_STATE_FINISH_MOVING: + DynamicTerrainHeightManager_SetHeight(PLATFORM_LIFT_DYNAMIC_HEIGHT_PLATE_ID, taskEnv->targetHeight, fieldSystem->dynamicTerrainHeightMan); + sub_0205ED48(fieldSystem->playerAvatar, 1); + Sound_PlayEffect(SEQ_SE_DP_KI_GASYAN); + + taskEnv->state++; + break; + + case PLATFORM_LIFT_STATE_END: + Heap_FreeToHeap(taskEnv); + return TRUE; + } + + return FALSE; +} + +static BOOL FieldTask_PlatformLiftGoDown(FieldTask *taskMan) +{ + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); + PlatformLiftFieldTaskEnv *taskEnv = FieldTask_GetEnv(taskMan); + + switch (taskEnv->state) { + case PLATFORM_LIFT_STATE_START_MOVING: + sub_0205ED2C(fieldSystem->playerAvatar, 0); + PlatformLift_PlaySoundEffect(taskEnv->kind); + + taskEnv->state++; + break; + + case PLATFORM_LIFT_STATE_MOVE: { + MapProp *platformLiftMapProp; + + if (taskEnv->isIronIslandB2FLeftRoom) { + platformLiftMapProp = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, MAP_PROP_MODEL_IRON_ISLAND_PLATFORM_LIFT); + } else { + const int platformLiftModels[2] = { + MAP_PROP_MODEL_IRON_ISLAND_PLATFORM_LIFT, + MAP_PROP_MODEL_POKEMON_LEAGUE_PLATFORM_LIFT + }; + + BOOL platformLiftFound = FieldSystem_FindLoadedMapPropByModelIDs(fieldSystem, platformLiftModels, NELEMS(platformLiftModels), &platformLiftMapProp, NULL); + GF_ASSERT(platformLiftFound); + } + + VecFx32 platformLiftPosition; + + platformLiftPosition = MapProp_GetPosition(platformLiftMapProp); + platformLiftPosition.y -= FX32_ONE; + + if (platformLiftPosition.y <= taskEnv->targetHeight) { + platformLiftPosition.y = taskEnv->targetHeight; + PlatformLift_StopSoundEffect(taskEnv->kind); + + taskEnv->state++; + } + + sub_0205ED0C(fieldSystem->playerAvatar, platformLiftPosition.y); + MapProp_SetPosition(platformLiftMapProp, &platformLiftPosition); + + break; + } + + case PLATFORM_LIFT_STATE_FINISH_MOVING: + DynamicTerrainHeightManager_SetHeight(PLATFORM_LIFT_DYNAMIC_HEIGHT_PLATE_ID, taskEnv->targetHeight, fieldSystem->dynamicTerrainHeightMan); + sub_0205ED48(fieldSystem->playerAvatar, 1); + Sound_PlayEffect(SEQ_SE_DP_KI_GASYAN); + + taskEnv->state++; + break; + + case PLATFORM_LIFT_STATE_END: + Heap_FreeToHeap(taskEnv); + return TRUE; + } + + return FALSE; +} + +static void PlatformLift_PlaySoundEffect(const int platformLiftKind) +{ + if (platformLiftKind == PLATFORM_LIFT_KIND_IRON_ISLAND) { + Sound_PlayEffect(SEQ_SE_DP_ELEBETA); + } else { + Sound_PlayEffect(SEQ_SE_DP_ELEBETA4); + } +} + +static void PlatformLift_StopSoundEffect(const int platformLiftKind) +{ + if (platformLiftKind == PLATFORM_LIFT_KIND_IRON_ISLAND) { + Sound_StopEffect(SEQ_SE_DP_ELEBETA, 0); + } else { + Sound_StopEffect(SEQ_SE_DP_ELEBETA4, 0); + } +} diff --git a/src/scrcmd.c b/src/scrcmd.c index ea03709d92..d2e6a31206 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -123,6 +123,7 @@ #include "party.h" #include "pc_boxes.h" #include "persisted_map_features_init.h" +#include "platform_lift.h" #include "player_avatar.h" #include "poffin.h" #include "pokedex.h" @@ -209,7 +210,6 @@ #include "unk_0206CCB0.h" #include "unk_0206F314.h" #include "unk_02070428.h" -#include "unk_0207160C.h" #include "unk_02071D40.h" #include "unk_020722AC.h" #include "unk_0207DA28.h" @@ -6754,7 +6754,7 @@ static BOOL InitPersistedMapFeaturesForPlatformLift(ScriptContext *ctx) static BOOL ScrCmd_25C(ScriptContext *ctx) { - sub_0207183C(ctx->fieldSystem); + PlatformLift_Trigger(ctx->fieldSystem); return 1; } @@ -6762,7 +6762,7 @@ static BOOL ScrCmd_25D(ScriptContext *ctx) { u16 *v0 = ScriptContext_GetVarPointer(ctx); - if (sub_02071818(ctx->fieldSystem)) { + if (PlatformLift_WasNotUsedWhenEnteredMap(ctx->fieldSystem)) { (*v0) = 1; } else { (*v0) = 0; diff --git a/src/unk_0207160C.c b/src/unk_0207160C.c deleted file mode 100644 index dab1922d9a..0000000000 --- a/src/unk_0207160C.c +++ /dev/null @@ -1,453 +0,0 @@ -#include "unk_0207160C.h" - -#include -#include - -#include "constants/field/dynamic_map_features.h" -#include "constants/field/map_prop.h" - -#include "field/field_system.h" -#include "field/field_system_sub2_t.h" -#include "overlay005/dynamic_terrain_height.h" -#include "overlay005/map_prop.h" - -#include "field_system.h" -#include "field_task.h" -#include "heap.h" -#include "persisted_map_features.h" -#include "player_avatar.h" -#include "savedata_misc.h" -#include "terrain_collision_manager.h" -#include "unk_02005474.h" - -typedef struct { - fx32 unk_00[2]; - int unk_08; - int unk_0C; - BOOL unk_10; - BOOL unk_14; -} UnkStruct_020F03F4; - -typedef struct { - u16 unk_00; - u16 unk_02; - BOOL unk_04; - int unk_08; -} UnkStruct_020716D4; - -typedef struct { - int unk_00; - fx32 unk_04; - BOOL unk_08; - int unk_0C; -} UnkStruct_020718D8; - -static BOOL sub_020718D8(FieldTask *taskMan); -static BOOL sub_020719D8(FieldTask *taskMan); -static void sub_02071ACC(const int param0); -static void sub_02071AEC(const int param0); - -static const UnkStruct_020F03F4 Unk_020F03F4[9] = { - { - { (FX32_ONE * 16 * 1), (FX32_ONE * 16 * 9) }, - 0xA, - 0x17, - 0x0, - 0x0, - }, - { - { (FX32_ONE * 16 * 1), (FX32_ONE * 16 * 9) }, - 0x12, - 0x2C, - 0x0, - 0x1, - }, - { - { (FX32_ONE * 16 * 1), (FX32_ONE * 16 * 9) }, - 0x8, - 0xB, - 0x0, - 0x0, - }, - { - { 0x0, (FX32_ONE * 16 * 10) }, - 0x3, - 0xB, - 0x1, - 0x0, - }, - { - { 0x0, (FX32_ONE * 16 * 5) }, - 0x3, - 0xB, - 0x1, - 0x0, - }, - { - { 0x0, (FX32_ONE * 16 * 5) }, - 0x3, - 0xB, - 0x1, - 0x0, - }, - { - { 0x0, (FX32_ONE * 16 * 5) }, - 0x3, - 0xB, - 0x1, - 0x0, - }, - { - { 0x0, (FX32_ONE * 16 * 5) }, - 0x3, - 0x13, - 0x1, - 0x0, - }, - { - { 0x0, (FX32_ONE * 16 * 15) }, - 0x7, - 0x8, - 0x1, - 0x0, - } -}; - -void PlatformLift_DynamicMapFeaturesInit(FieldSystem *fieldSystem) -{ - BOOL v0; - MapProp *v1; - PersistedMapFeatures *v2; - UnkStruct_020716D4 *v3; - const UnkStruct_020F03F4 *v4; - fx32 v5; - - v2 = MiscSaveBlock_GetPersistedMapFeatures(FieldSystem_GetSaveData(fieldSystem)); - v3 = (UnkStruct_020716D4 *)PersistedMapFeatures_GetBuffer(v2, DYNAMIC_MAP_FEATURES_PLATFORM_LIFT_ROOM); - v4 = &Unk_020F03F4[v3->unk_02]; - v5 = v4->unk_00[v3->unk_00]; - - if (v4->unk_14) { - VecFx32 v6 = { - (FX32_ONE * (16 * 19 + 8)), - 0, - (FX32_ONE * (16 * (32 + 12) + 8)) - }; - - v6.y = v5; - MapPropManager_LoadOne(fieldSystem->mapPropManager, fieldSystem->areaDataManager, MAP_PROP_MODEL_IRON_ISLAND_LIFT_PLATFORM, &v6, NULL, fieldSystem->mapPropAnimMan); - v1 = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, MAP_PROP_MODEL_IRON_ISLAND_LIFT_PLATFORM); - } else { - const int v7[2] = { - MAP_PROP_MODEL_IRON_ISLAND_LIFT_PLATFORM, - MAP_PROP_MODEL_POKEMON_LEAGUE_LIFT_PLATFORM - }; - - v0 = FieldSystem_FindLoadedMapPropByModelIDs(fieldSystem, v7, 2, &v1, NULL); - GF_ASSERT(v0); - } - - { - VecFx32 v8; - - v8 = MapProp_GetPosition(v1); - v8.y = v5; - - MapProp_SetPosition(v1, &v8); - } - - DynamicTerrainHeightManager_SetPlate(0, v4->unk_08, v4->unk_0C, 3, 2, v5, fieldSystem->dynamicTerrainHeightMan); -} - -void PersistedMapFeatures_InitForPlatformLift(FieldSystem *fieldSystem) -{ - PersistedMapFeatures *persistedMapFeatures = MiscSaveBlock_GetPersistedMapFeatures(FieldSystem_GetSaveData(fieldSystem)); - PersistedMapFeatures_InitWithID(persistedMapFeatures, DYNAMIC_MAP_FEATURES_PLATFORM_LIFT_ROOM); - - UnkStruct_020716D4 *data = PersistedMapFeatures_GetBuffer(persistedMapFeatures, DYNAMIC_MAP_FEATURES_PLATFORM_LIFT_ROOM); - data->unk_04 = 1; - data->unk_08 = 0; - - switch (fieldSystem->location->mapId) { - case 291: - if (fieldSystem->location->z == 26) { - data->unk_00 = 0; - } else { - data->unk_00 = 1; - } - - data->unk_02 = 0; - break; - case 293: - if (fieldSystem->location->z == (32 * 1 + 16)) { - data->unk_00 = 0; - } else { - data->unk_00 = 1; - } - - data->unk_02 = 1; - break; - case 294: - if (fieldSystem->location->z == 15) { - data->unk_00 = 0; - } else { - data->unk_00 = 1; - } - - data->unk_02 = 2; - break; - case 176: - if (fieldSystem->location->z == 15) { - data->unk_00 = 0; - } else { - data->unk_00 = 1; - data->unk_04 = 0; - } - - data->unk_02 = 3; - data->unk_08 = 1; - break; - case 178: - if (fieldSystem->location->z == 15) { - data->unk_00 = 0; - } else { - data->unk_00 = 1; - data->unk_04 = 0; - } - - data->unk_02 = 4; - data->unk_08 = 1; - break; - case 180: - if (fieldSystem->location->z == 15) { - data->unk_00 = 0; - } else { - data->unk_00 = 1; - data->unk_04 = 0; - } - - data->unk_02 = 5; - data->unk_08 = 1; - break; - case 182: - if (fieldSystem->location->z == 15) { - data->unk_00 = 0; - } else { - data->unk_00 = 1; - data->unk_04 = 0; - } - - data->unk_02 = 6; - data->unk_08 = 1; - break; - case 184: - if (fieldSystem->location->z == 23) { - data->unk_00 = 0; - } else { - data->unk_00 = 1; - data->unk_04 = 0; - } - - data->unk_02 = 7; - data->unk_08 = 1; - break; - case 185: - if (fieldSystem->location->z == 18) { - data->unk_00 = 0; - } else { - data->unk_00 = 1; - data->unk_04 = 0; - } - - data->unk_02 = 8; - data->unk_08 = 1; - break; - default: - GF_ASSERT(0); - } -} - -u8 sub_02071818(FieldSystem *fieldSystem) -{ - PersistedMapFeatures *v0; - UnkStruct_020716D4 *v1; - - v0 = MiscSaveBlock_GetPersistedMapFeatures(FieldSystem_GetSaveData(fieldSystem)); - v1 = (UnkStruct_020716D4 *)PersistedMapFeatures_GetBuffer(v0, DYNAMIC_MAP_FEATURES_PLATFORM_LIFT_ROOM); - - if (v1->unk_04) { - return 1; - } else { - return 0; - } -} - -void sub_0207183C(FieldSystem *fieldSystem) -{ - PersistedMapFeatures *v0; - UnkStruct_020716D4 *v1; - UnkStruct_020718D8 *v2; - - v0 = MiscSaveBlock_GetPersistedMapFeatures(FieldSystem_GetSaveData(fieldSystem)); - v1 = (UnkStruct_020716D4 *)PersistedMapFeatures_GetBuffer(v0, DYNAMIC_MAP_FEATURES_PLATFORM_LIFT_ROOM); - - if ((Unk_020F03F4[v1->unk_02].unk_10) && (v1->unk_00 == 1)) { - return; - } - - v2 = Heap_AllocFromHeapAtEnd(11, sizeof(UnkStruct_020718D8)); - v2->unk_00 = 0; - - { - v2->unk_08 = Unk_020F03F4[v1->unk_02].unk_14; - v2->unk_0C = v1->unk_08; - - if (v1->unk_00 == 0) { - v2->unk_04 = Unk_020F03F4[v1->unk_02].unk_00[1]; - FieldTask_InitCall(fieldSystem->task, sub_020718D8, v2); - v1->unk_00 = 1; - } else { - v2->unk_04 = Unk_020F03F4[v1->unk_02].unk_00[0]; - FieldTask_InitCall(fieldSystem->task, sub_020719D8, v2); - v1->unk_00 = 0; - } - } -} - -static BOOL sub_020718D8(FieldTask *taskMan) -{ - MapProp *v0; - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - UnkStruct_020718D8 *v2 = FieldTask_GetEnv(taskMan); - - switch (v2->unk_00) { - case 0: - sub_0205ED2C(fieldSystem->playerAvatar, 0); - sub_02071ACC(v2->unk_0C); - (v2->unk_00)++; - break; - case 1: { - if (v2->unk_08) { - v0 = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, MAP_PROP_MODEL_IRON_ISLAND_LIFT_PLATFORM); - } else { - const int v3[2] = { - MAP_PROP_MODEL_IRON_ISLAND_LIFT_PLATFORM, - MAP_PROP_MODEL_POKEMON_LEAGUE_LIFT_PLATFORM - }; - - BOOL v4 = FieldSystem_FindLoadedMapPropByModelIDs(fieldSystem, v3, 2, &v0, NULL); - GF_ASSERT(v4); - } - - { - fx32 v5; - VecFx32 v6; - - v6 = MapProp_GetPosition(v0); - - if (v2->unk_0C == 0) { - v5 = (FX32_ONE); - } else { - v5 = (FX32_ONE * 2); - } - - v6.y += v5; - - if (v6.y >= v2->unk_04) { - v6.y = v2->unk_04; - - sub_02071AEC(v2->unk_0C); - (v2->unk_00)++; - } - - sub_0205ED0C(fieldSystem->playerAvatar, v6.y); - MapProp_SetPosition(v0, &v6); - } - } break; - case 2: - DynamicTerrainHeightManager_SetHeight(0, v2->unk_04, fieldSystem->dynamicTerrainHeightMan); - sub_0205ED48(fieldSystem->playerAvatar, 1); - Sound_PlayEffect(SEQ_SE_DP_KI_GASYAN); - (v2->unk_00)++; - break; - case 3: - Heap_FreeToHeap(v2); - return 1; - } - - return 0; -} - -static BOOL sub_020719D8(FieldTask *taskMan) -{ - MapProp *v0; - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - UnkStruct_020718D8 *v2 = FieldTask_GetEnv(taskMan); - - switch (v2->unk_00) { - case 0: - sub_0205ED2C(fieldSystem->playerAvatar, 0); - sub_02071ACC(v2->unk_0C); - (v2->unk_00)++; - break; - case 1: { - if (v2->unk_08) { - v0 = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, MAP_PROP_MODEL_IRON_ISLAND_LIFT_PLATFORM); - } else { - const int v3[2] = { - MAP_PROP_MODEL_IRON_ISLAND_LIFT_PLATFORM, - MAP_PROP_MODEL_POKEMON_LEAGUE_LIFT_PLATFORM - }; - - BOOL v4 = FieldSystem_FindLoadedMapPropByModelIDs(fieldSystem, v3, 2, &v0, NULL); - GF_ASSERT(v4); - } - - { - VecFx32 v5; - - v5 = MapProp_GetPosition(v0); - v5.y -= (FX32_ONE); - - if (v5.y <= v2->unk_04) { - v5.y = v2->unk_04; - - sub_02071AEC(v2->unk_0C); - (v2->unk_00)++; - } - - sub_0205ED0C(fieldSystem->playerAvatar, v5.y); - MapProp_SetPosition(v0, &v5); - } - } break; - case 2: - DynamicTerrainHeightManager_SetHeight(0, v2->unk_04, fieldSystem->dynamicTerrainHeightMan); - sub_0205ED48(fieldSystem->playerAvatar, 1); - Sound_PlayEffect(SEQ_SE_DP_KI_GASYAN); - (v2->unk_00)++; - break; - case 3: - Heap_FreeToHeap(v2); - return 1; - } - - return 0; -} - -static void sub_02071ACC(const int param0) -{ - if (param0 == 0) { - Sound_PlayEffect(SEQ_SE_DP_ELEBETA); - } else { - Sound_PlayEffect(SEQ_SE_DP_ELEBETA4); - } -} - -static void sub_02071AEC(const int param0) -{ - if (param0 == 0) { - Sound_StopEffect(1553, 0); - } else { - Sound_StopEffect(1556, 0); - } -}