diff --git a/include/overlay008/ov8_02249960.h b/include/overlay008/ov8_02249960.h index b3faf2d195..edbb2ad325 100644 --- a/include/overlay008/ov8_02249960.h +++ b/include/overlay008/ov8_02249960.h @@ -16,10 +16,27 @@ enum EternaClockState { ETERNA_CLOCK_MAX, }; +enum PastoriaGymPressedButton { + PASTORIA_ORANGE_BUTTON_PRESSED = 0, + PASTORIA_GREEN_BUTTON_PRESSED, + PASTORIA_BLUE_BUTTON_PRESSED, +}; + +enum PastoriaGymButtonGroup { + PASTORIA_NO_BUTTON_GROUP = 0, + PASTORIA_BLUE_BUTTON_GROUP, + PASTORIA_GREEN_BUTTON_GROUP, + PASTORIA_ORANGE_BUTTON_GROUP, +}; + typedef struct EternaGymClockPersistedFeature { u32 state; } EternaGymClockPersistedFeature; +typedef struct PastoriaGymPersistedFeature { + u8 pressedButton; +} PastoriaGymPersistedFeature; + void PastoriaGym_PressButton(FieldSystem *fieldSystem); BOOL PastoriaGym_DynamicMapFeaturesCheckCollision(FieldSystem *fieldSystem, const int tileX, const int tileZ, const fx32 height, BOOL *isColliding); void PastoriaGym_DynamicMapFeaturesInit(FieldSystem *fieldSystem); diff --git a/include/struct_defs/struct_02071B10.h b/include/struct_defs/struct_02071B10.h deleted file mode 100644 index 75af80e666..0000000000 --- a/include/struct_defs/struct_02071B10.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_02071B10_H -#define POKEPLATINUM_STRUCT_02071B10_H - -typedef struct { - u8 unk_00; -} UnkStruct_02071B10; - -#endif // POKEPLATINUM_STRUCT_02071B10_H diff --git a/src/overlay005/map_prop_animation.c b/src/overlay005/map_prop_animation.c index f87c082285..d942486ca0 100644 --- a/src/overlay005/map_prop_animation.c +++ b/src/overlay005/map_prop_animation.c @@ -1,10 +1,11 @@ #include "overlay005/map_prop_animation.h" #include -#include #include "constants/heap.h" +#include "overlay008/ov8_02249960.h" + #include "heap.h" #include "narc.h" #include "sound_playback.h" @@ -94,7 +95,7 @@ MapPropAnimationManager *MapPropAnimationManager_New(void) manager->animations[i].loopCount = -1; manager->animations[i].looping = FALSE; manager->animations[i].reversed = FALSE; - manager->animations[i].pastoriaGymButtonGroup = 0; + manager->animations[i].pastoriaGymButtonGroup = PASTORIA_NO_BUTTON_GROUP; } for (i = 0; i < MAP_PROP_ANIMATION_MANAGER_MAX_BICYCLE_SLOPE_ANIMATIONS; i++) { @@ -154,7 +155,7 @@ MapPropAnimation *MapPropAnimationManager_LoadPropAnimationForOneShot(const int } for (i = 0; i < MAP_PROP_ANIMATION_MANAGER_MAX_ANIMATIONS; i++) { - if (pastoriaGymButtonGroup != 0 && manager->animations[i].pastoriaGymButtonGroup == pastoriaGymButtonGroup) { + if (pastoriaGymButtonGroup != PASTORIA_NO_BUTTON_GROUP && manager->animations[i].pastoriaGymButtonGroup == pastoriaGymButtonGroup) { GF_ASSERT(FALSE); } } @@ -212,7 +213,7 @@ void MapPropAnimationManager_LoadPropAnimations(const int mapPropModelID, NNSG3d manager->animations[j].currentLoop = 0; manager->animations[j].animeArchiveID = animeArchiveID; manager->animations[j].reversed = FALSE; - manager->animations[j].pastoriaGymButtonGroup = 0; + manager->animations[j].pastoriaGymButtonGroup = PASTORIA_NO_BUTTON_GROUP; manager->animations[j].animationFile = MapPropAnimation_LoadAnimationObj(manager->animeNARC, animeArchiveID, mapPropModel, &manager->animations[j].animationObj, mapPropTexture, &manager->allocator); manager->animations[j].loopCount = -1; manager->animations[j].looping = TRUE; @@ -340,7 +341,7 @@ void MapPropAnimationManager_UnloadAllAnimations(MapPropAnimationManager *manage } manager->animations[i].loaded = FALSE; - manager->animations[i].pastoriaGymButtonGroup = 0; + manager->animations[i].pastoriaGymButtonGroup = PASTORIA_NO_BUTTON_GROUP; } } } @@ -361,7 +362,7 @@ void MapPropAnimationManager_UnloadAnimation(MapPropAnimation *animation, MapPro } animation->loaded = FALSE; - animation->pastoriaGymButtonGroup = 0; + animation->pastoriaGymButtonGroup = PASTORIA_NO_BUTTON_GROUP; } } @@ -397,7 +398,7 @@ void MapPropAnimationManager_Free(MapPropAnimationManager *manager) MapPropAnimation *MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(const int pastoriaGymButtonGroup, MapPropAnimationManager *manager) { - GF_ASSERT(pastoriaGymButtonGroup != 0); + GF_ASSERT(pastoriaGymButtonGroup != PASTORIA_NO_BUTTON_GROUP); MapPropAnimation *animation = NULL; for (int i = 0; i < MAP_PROP_ANIMATION_MANAGER_MAX_ANIMATIONS; i++) { diff --git a/src/overlay008/ov8_02249960.c b/src/overlay008/ov8_02249960.c index 6349ab6347..0a7c48399a 100644 --- a/src/overlay008/ov8_02249960.c +++ b/src/overlay008/ov8_02249960.c @@ -10,7 +10,6 @@ #include "struct_decls/struct_02061830_decl.h" #include "struct_decls/struct_02061AB4_decl.h" -#include "struct_defs/struct_02071B10.h" #include "struct_defs/struct_02071B30.h" #include "struct_defs/struct_02071B6C.h" #include "struct_defs/struct_02071BF8.h" @@ -78,6 +77,12 @@ #define ETERNA_CLOCK_NO_HOUR_HAND_JUMP { -1, -1, 2 } +#define PASTORIA_WATER_HEIGHT_LOW 0 +#define PASTORIA_WATER_HEIGHT_MIDDLE (MAP_OBJECT_TILE_SIZE * 2) +#define PASTORIA_WATER_HEIGHT_HIGH (MAP_OBJECT_TILE_SIZE * 4) + +#define PASTORIA_WATER_PLATE_INDEX 0 + typedef struct { int unk_00; } UnkStruct_ov8_0224997C; @@ -313,15 +318,15 @@ void include_ov8_02249960(void); static u8 ov8_02249960(const u8 param0, const int param1); static void ov8_0224996C(const u8 param0, int *param1); -static BOOL ov8_02249A94(FieldTask *param0); -static BOOL ov8_02249B74(FieldTask *param0); -static BOOL ov8_02249CD8(FieldTask *param0); -static void ov8_02249F14(const u8 param0, MapPropAnimationManager *param1); -static BOOL ov8_0224A018(FieldTask *param0); -static BOOL ov8_0224A0E8(FieldTask *param0); -static BOOL ov8_0224A4FC(FieldTask *param0); -static BOOL ov8_0224A620(FieldTask *param0); -static BOOL ov8_0224A770(FieldTask *param0); +static BOOL PastoriaGym_PressOrangeButton(FieldTask *taskMan); +static BOOL PastoriaGym_PressGreenButton(FieldTask *taskMan); +static BOOL PastoriaGym_PressBlueButton(FieldTask *taskMan); +static void PastoriaGym_UpdateButtonAnimations(const u8 pressedButton, MapPropAnimationManager *mapPropAnimMan); +static BOOL ov8_0224A018(FieldTask *taskMan); +static BOOL ov8_0224A0E8(FieldTask *taskMan); +static BOOL ov8_0224A4FC(FieldTask *taskMan); +static BOOL ov8_0224A620(FieldTask *taskMan); +static BOOL ov8_0224A770(FieldTask *taskMan); static BOOL ov8_0224ADE8(FieldTask *param0); static void ov8_0224B8D0(UnkStruct_ov8_0224B8D0 *param0); static void ov8_0224B958(UnkStruct_ov8_0224B8D0 *param0); @@ -332,7 +337,7 @@ static BOOL ov8_0224C0C8(UnkStruct_ov8_0224C098 *param0, UnkStruct_ov8_0224B80C static void ov8_0224C0FC(UnkStruct_ov8_0224C098 *param0, int param1); static void ov8_0224C11C(UnkStruct_ov8_0224C098 *param0, int param1); static void ov8_0224C170(UnkStruct_ov8_0224C098 *param0, fx32 param1); -static void ov8_0224C3B0(SysTask *param0, void *param1); +static void ov8_0224C3B0(SysTask *task, void *param1); static void ov8_0224C3B4(UnkStruct_ov8_0224C444 *param0); static void ov8_0224C444(UnkStruct_ov8_0224C444 *param0); static void ov8_0224C4F8(UnkStruct_ov8_0224C444 *param0); @@ -368,25 +373,21 @@ void PastoriaGym_PressButton(FieldSystem *fieldSystem) hasCollisionHit = FieldSystem_FindCollidingLoadedMapPropByModelIDs(fieldSystem, pastoriaButtonTypes, NELEMS(pastoriaButtonTypes), &terrainCollision, NULL, &mapPropModelID); if (hasCollisionHit) { - UnkStruct_ov8_0224997C *v6; - PersistedMapFeatures *v7; - UnkStruct_02071B10 *v8; + PersistedMapFeatures *mapFeatures = MiscSaveBlock_GetPersistedMapFeatures(FieldSystem_GetSaveData(fieldSystem)); + PastoriaGymPersistedFeature *feature = PersistedMapFeatures_GetBuffer(mapFeatures, DYNAMIC_MAP_FEATURES_PASTORIA_GYM); - v7 = MiscSaveBlock_GetPersistedMapFeatures(FieldSystem_GetSaveData(fieldSystem)); - v8 = (UnkStruct_02071B10 *)PersistedMapFeatures_GetBuffer(v7, DYNAMIC_MAP_FEATURES_PASTORIA_GYM); - - v6 = Heap_AllocAtEnd(HEAP_ID_FIELD2, sizeof(UnkStruct_ov8_0224997C)); - v6->unk_00 = 0; + int *waterMoveTaskState = Heap_AllocAtEnd(HEAP_ID_FIELD2, sizeof(int)); + *waterMoveTaskState = 0; if (mapPropModelID == pastoria_gym_blue_button_nsbmd) { - FieldTask_InitCall(fieldSystem->task, ov8_02249CD8, v6); - v8->unk_00 = 2; + FieldTask_InitCall(fieldSystem->task, PastoriaGym_PressBlueButton, waterMoveTaskState); + feature->pressedButton = PASTORIA_BLUE_BUTTON_PRESSED; } else if (mapPropModelID == pastoria_gym_green_button_nsbmd) { - FieldTask_InitCall(fieldSystem->task, ov8_02249B74, v6); - v8->unk_00 = 1; + FieldTask_InitCall(fieldSystem->task, PastoriaGym_PressGreenButton, waterMoveTaskState); + feature->pressedButton = PASTORIA_GREEN_BUTTON_PRESSED; } else if (mapPropModelID == pastoria_gym_orange_button_nsbmd) { - FieldTask_InitCall(fieldSystem->task, ov8_02249A94, v6); - v8->unk_00 = 0; + FieldTask_InitCall(fieldSystem->task, PastoriaGym_PressOrangeButton, waterMoveTaskState); + feature->pressedButton = PASTORIA_ORANGE_BUTTON_PRESSED; } else { GF_ASSERT(FALSE); } @@ -398,17 +399,17 @@ BOOL PastoriaGym_DynamicMapFeaturesCheckCollision(FieldSystem *fieldSystem, cons u8 tileBehavior = TerrainCollisionManager_GetTileBehavior(fieldSystem, tileX, tileZ); if (TileBehavior_IsPastoriaGymHighGround(tileBehavior)) { - if (height != MAP_OBJECT_TILE_SIZE * 0) { + if (height != PASTORIA_WATER_HEIGHT_LOW) { *isColliding = TRUE; return TRUE; } } else if (TileBehavior_IsPastoriaGymMiddleGround(tileBehavior)) { - if (height != MAP_OBJECT_TILE_SIZE * 2) { + if (height != PASTORIA_WATER_HEIGHT_MIDDLE) { *isColliding = TRUE; return TRUE; } } else if (TileBehavior_IsPastoriaGymLowGround(tileBehavior)) { - if (height != MAP_OBJECT_TILE_SIZE * 4) { + if (height != PASTORIA_WATER_HEIGHT_HIGH) { *isColliding = TRUE; return TRUE; } @@ -418,329 +419,285 @@ BOOL PastoriaGym_DynamicMapFeaturesCheckCollision(FieldSystem *fieldSystem, cons return FALSE; } -static BOOL ov8_02249A94(FieldTask *taskMan) +static BOOL PastoriaGym_PressOrangeButton(FieldTask *taskMan) { - MapProp *v0; FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - UnkStruct_ov8_0224997C *v2 = FieldTask_GetEnv(taskMan); + int *state = FieldTask_GetEnv(taskMan); - switch (v2->unk_00) { + switch (*state) { case 0: - - ov8_02249F14(0, fieldSystem->mapPropAnimMan); - (v2->unk_00)++; + PastoriaGym_UpdateButtonAnimations(PASTORIA_ORANGE_BUTTON_PRESSED, fieldSystem->mapPropAnimMan); + (*state)++; break; case 1: { - MapPropAnimation *v3; - MapPropAnimation *v4; - MapPropAnimation *v5; + MapPropAnimation *blueButtonGroup = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(PASTORIA_BLUE_BUTTON_GROUP, fieldSystem->mapPropAnimMan); + MapPropAnimation *greenButtonGroup = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(PASTORIA_GREEN_BUTTON_GROUP, fieldSystem->mapPropAnimMan); + MapPropAnimation *orangeButtonGroup = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(PASTORIA_ORANGE_BUTTON_GROUP, fieldSystem->mapPropAnimMan); - v3 = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(1, fieldSystem->mapPropAnimMan); - v4 = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(2, fieldSystem->mapPropAnimMan); - v5 = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(3, fieldSystem->mapPropAnimMan); + if (MapPropAnimation_IsLoopFinished(blueButtonGroup) && MapPropAnimation_IsLoopFinished(greenButtonGroup) && MapPropAnimation_IsLoopFinished(orangeButtonGroup)) { + MapProp *waterProp = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, pastoria_gym_water_floor_nsbmd); - if (MapPropAnimation_IsLoopFinished(v3) && MapPropAnimation_IsLoopFinished(v4) && MapPropAnimation_IsLoopFinished(v5)) { - v0 = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, pastoria_gym_water_floor_nsbmd); + VecFx32 waterPropPosition; + waterPropPosition = MapProp_GetPosition(waterProp); + waterPropPosition.y -= FX32_ONE; - { - VecFx32 v6; - - v6 = MapProp_GetPosition(v0); - v6.y -= (FX32_ONE); - - if (v6.y <= (FX32_ONE * 0)) { - v6.y = (FX32_ONE * 0); - (v2->unk_00)++; - } - - MapProp_SetPosition(v0, &v6); + if (waterPropPosition.y <= PASTORIA_WATER_HEIGHT_LOW) { + waterPropPosition.y = PASTORIA_WATER_HEIGHT_LOW; + (*state)++; } + + MapProp_SetPosition(waterProp, &waterPropPosition); } } break; case 2: - DynamicTerrainHeightManager_SetHeight(0, (FX32_ONE * 16 * 0), fieldSystem->dynamicTerrainHeightMan); - Sound_StopEffect(1626, 0); - (v2->unk_00)++; + DynamicTerrainHeightManager_SetHeight(PASTORIA_WATER_PLATE_INDEX, PASTORIA_WATER_HEIGHT_LOW, fieldSystem->dynamicTerrainHeightMan); + Sound_StopEffect(SEQ_SE_DP_FW056, 0); + (*state)++; break; case 3: - Heap_Free(v2); - return 1; + Heap_Free(state); + return TRUE; } - return 0; + return FALSE; } -static BOOL ov8_02249B74(FieldTask *taskMan) +static BOOL PastoriaGym_PressGreenButton(FieldTask *taskMan) { - MapProp *v0; FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - UnkStruct_ov8_0224997C *v2 = FieldTask_GetEnv(taskMan); + int *state = FieldTask_GetEnv(taskMan); - switch (v2->unk_00) { + switch (*state) { case 0: - ov8_02249F14(1, fieldSystem->mapPropAnimMan); - (v2->unk_00)++; + PastoriaGym_UpdateButtonAnimations(PASTORIA_GREEN_BUTTON_PRESSED, fieldSystem->mapPropAnimMan); + (*state)++; break; case 1: { - MapPropAnimation *v3; - MapPropAnimation *v4; - MapPropAnimation *v5; + MapPropAnimation *blueButtonGroup = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(PASTORIA_BLUE_BUTTON_GROUP, fieldSystem->mapPropAnimMan); + MapPropAnimation *greenButtonGroup = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(PASTORIA_GREEN_BUTTON_GROUP, fieldSystem->mapPropAnimMan); + MapPropAnimation *orangeButtonGroup = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(PASTORIA_ORANGE_BUTTON_GROUP, fieldSystem->mapPropAnimMan); - v3 = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(1, fieldSystem->mapPropAnimMan); - v4 = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(2, fieldSystem->mapPropAnimMan); - v5 = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(3, fieldSystem->mapPropAnimMan); + if (MapPropAnimation_IsLoopFinished(blueButtonGroup) && MapPropAnimation_IsLoopFinished(greenButtonGroup) && MapPropAnimation_IsLoopFinished(orangeButtonGroup)) { + MapProp *waterProp = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, pastoria_gym_water_floor_nsbmd); - if (MapPropAnimation_IsLoopFinished(v3) && MapPropAnimation_IsLoopFinished(v4) && MapPropAnimation_IsLoopFinished(v5)) { - v0 = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, pastoria_gym_water_floor_nsbmd); - { - VecFx32 v6; + VecFx32 waterPropPosition; + waterPropPosition = MapProp_GetPosition(waterProp); - v6 = MapProp_GetPosition(v0); - - if (v6.y == (FX32_ONE * 0)) { - (v2->unk_00) = 2; - } else if (v6.y == (FX32_ONE * 16 * 2)) { - Heap_Free(v2); - return 1; - } else if (v6.y == (FX32_ONE * 16 * 4)) { - (v2->unk_00) = 3; - } else { - GF_ASSERT(0); - } + if (waterPropPosition.y == PASTORIA_WATER_HEIGHT_LOW) { + *state = 2; + } else if (waterPropPosition.y == PASTORIA_WATER_HEIGHT_MIDDLE) { + Heap_Free(state); + return TRUE; + } else if (waterPropPosition.y == PASTORIA_WATER_HEIGHT_HIGH) { + *state = 3; + } else { + GF_ASSERT(0); } } } break; - case 2: - v0 = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, pastoria_gym_water_floor_nsbmd); + case 2: { + MapProp *waterProp = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, pastoria_gym_water_floor_nsbmd); - { - VecFx32 v7; + VecFx32 waterPropPosition; + waterPropPosition = MapProp_GetPosition(waterProp); + waterPropPosition.y += FX32_ONE; - v7 = MapProp_GetPosition(v0); - v7.y += (FX32_ONE); - - if (v7.y >= (FX32_ONE * 16 * 2)) { - v7.y = (FX32_ONE * 16 * 2); - (v2->unk_00) = 4; - } - - MapProp_SetPosition(v0, &v7); + if (waterPropPosition.y >= PASTORIA_WATER_HEIGHT_MIDDLE) { + waterPropPosition.y = PASTORIA_WATER_HEIGHT_MIDDLE; + *state = 4; } - break; - case 3: - v0 = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, pastoria_gym_water_floor_nsbmd); - { - VecFx32 v8; + MapProp_SetPosition(waterProp, &waterPropPosition); + } break; + case 3: { + MapProp *waterProp = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, pastoria_gym_water_floor_nsbmd); - v8 = MapProp_GetPosition(v0); - v8.y -= (FX32_ONE); + VecFx32 waterPropPosition; + waterPropPosition = MapProp_GetPosition(waterProp); + waterPropPosition.y -= FX32_ONE; - if (v8.y <= (FX32_ONE * 16 * 2)) { - v8.y = (FX32_ONE * 16 * 2); - (v2->unk_00) = 4; - } - - MapProp_SetPosition(v0, &v8); + if (waterPropPosition.y <= PASTORIA_WATER_HEIGHT_MIDDLE) { + waterPropPosition.y = PASTORIA_WATER_HEIGHT_MIDDLE; + *state = 4; } - break; + + MapProp_SetPosition(waterProp, &waterPropPosition); + } break; case 4: - DynamicTerrainHeightManager_SetHeight(0, (FX32_ONE * 16 * 2), fieldSystem->dynamicTerrainHeightMan); - Sound_StopEffect(1626, 0); - (v2->unk_00)++; + DynamicTerrainHeightManager_SetHeight(PASTORIA_WATER_PLATE_INDEX, PASTORIA_WATER_HEIGHT_MIDDLE, fieldSystem->dynamicTerrainHeightMan); + Sound_StopEffect(SEQ_SE_DP_FW056, 0); + (*state)++; break; case 5: - Heap_Free(v2); - return 1; + Heap_Free(state); + return TRUE; } - return 0; + return FALSE; } -static BOOL ov8_02249CD8(FieldTask *taskMan) +static BOOL PastoriaGym_PressBlueButton(FieldTask *taskMan) { - MapProp *v0; FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - UnkStruct_ov8_0224997C *v2 = FieldTask_GetEnv(taskMan); + int *state = FieldTask_GetEnv(taskMan); - switch (v2->unk_00) { + switch (*state) { case 0: - ov8_02249F14(2, fieldSystem->mapPropAnimMan); - (v2->unk_00)++; + PastoriaGym_UpdateButtonAnimations(PASTORIA_BLUE_BUTTON_PRESSED, fieldSystem->mapPropAnimMan); + (*state)++; break; case 1: { - MapPropAnimation *v3; - MapPropAnimation *v4; - MapPropAnimation *v5; + MapPropAnimation *blueButtonGroup = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(PASTORIA_BLUE_BUTTON_GROUP, fieldSystem->mapPropAnimMan); + MapPropAnimation *greenButtonGroup = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(PASTORIA_GREEN_BUTTON_GROUP, fieldSystem->mapPropAnimMan); + MapPropAnimation *orangeButtonGroup = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(PASTORIA_ORANGE_BUTTON_GROUP, fieldSystem->mapPropAnimMan); - v3 = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(1, fieldSystem->mapPropAnimMan); - v4 = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(2, fieldSystem->mapPropAnimMan); - v5 = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(3, fieldSystem->mapPropAnimMan); + if (MapPropAnimation_IsLoopFinished(blueButtonGroup) && MapPropAnimation_IsLoopFinished(greenButtonGroup) && MapPropAnimation_IsLoopFinished(orangeButtonGroup)) { + MapProp *waterProp = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, pastoria_gym_water_floor_nsbmd); - if (MapPropAnimation_IsLoopFinished(v3) && MapPropAnimation_IsLoopFinished(v4) && MapPropAnimation_IsLoopFinished(v5)) { - v0 = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, pastoria_gym_water_floor_nsbmd); + VecFx32 waterPropPosition; + waterPropPosition = MapProp_GetPosition(waterProp); + waterPropPosition.y += FX32_ONE; - { - VecFx32 v6; - - v6 = MapProp_GetPosition(v0); - v6.y += (FX32_ONE); - - if (v6.y >= (FX32_ONE * 16 * 4)) { - v6.y = (FX32_ONE * 16 * 4); - (v2->unk_00)++; - } - - MapProp_SetPosition(v0, &v6); + if (waterPropPosition.y >= PASTORIA_WATER_HEIGHT_HIGH) { + waterPropPosition.y = PASTORIA_WATER_HEIGHT_HIGH; + (*state)++; } + + MapProp_SetPosition(waterProp, &waterPropPosition); } } break; case 2: - DynamicTerrainHeightManager_SetHeight(0, (FX32_ONE * 16 * 4), fieldSystem->dynamicTerrainHeightMan); - Sound_StopEffect(1626, 0); - (v2->unk_00)++; + DynamicTerrainHeightManager_SetHeight(PASTORIA_WATER_PLATE_INDEX, PASTORIA_WATER_HEIGHT_HIGH, fieldSystem->dynamicTerrainHeightMan); + Sound_StopEffect(SEQ_SE_DP_FW056, 0); + (*state)++; break; case 3: - Heap_Free(v2); - return 1; + Heap_Free(state); + return TRUE; } - return 0; + return FALSE; } void PastoriaGym_DynamicMapFeaturesInit(FieldSystem *fieldSystem) { - u8 v0; - MapProp *v1; - fx32 v2; - fx32 v3; - BOOL v4, v5, v6; - PersistedMapFeatures *v7 = MiscSaveBlock_GetPersistedMapFeatures(FieldSystem_GetSaveData(fieldSystem)); - UnkStruct_02071B10 *v8 = (UnkStruct_02071B10 *)PersistedMapFeatures_GetBuffer(v7, DYNAMIC_MAP_FEATURES_PASTORIA_GYM); + PersistedMapFeatures *mapFeatures = MiscSaveBlock_GetPersistedMapFeatures(FieldSystem_GetSaveData(fieldSystem)); + PastoriaGymPersistedFeature *feature = PersistedMapFeatures_GetBuffer(mapFeatures, DYNAMIC_MAP_FEATURES_PASTORIA_GYM); - { - VecFx32 v9 = { FX32_ONE * 16 * 16, 0, FX32_ONE * 16 * 16 }; - MapPropManager_LoadOne(fieldSystem->mapPropManager, fieldSystem->areaDataManager, 242, &v9, NULL, fieldSystem->mapPropAnimMan); - } + VecFx32 iniWaterPropPosition = { FX32_CONST(256), 0, FX32_CONST(256) }; + MapPropManager_LoadOne(fieldSystem->mapPropManager, fieldSystem->areaDataManager, pastoria_gym_water_floor_nsbmd, &iniWaterPropPosition, NULL, fieldSystem->mapPropAnimMan); - DynamicTerrainHeightManager_SetPlate(0, 1, 2, 25, 38, (FX32_ONE * 16 * 0), fieldSystem->dynamicTerrainHeightMan); + DynamicTerrainHeightManager_SetPlate(PASTORIA_WATER_PLATE_INDEX, 1, 2, 25, 38, 0, fieldSystem->dynamicTerrainHeightMan); - v0 = v8->unk_00; - - switch (v0) { - case 0: - v2 = (FX32_ONE * 0); - v3 = (FX32_ONE * 16 * 0); - v4 = 1; - v5 = 1; - v6 = 0; + fx32 waterPosition, waterHeight; + BOOL blueButtonIsUp, greenButtonIsUp, orangeButtonIsUp; + switch (feature->pressedButton) { + case PASTORIA_ORANGE_BUTTON_PRESSED: + waterPosition = PASTORIA_WATER_HEIGHT_LOW; + waterHeight = PASTORIA_WATER_HEIGHT_LOW; + blueButtonIsUp = TRUE; + greenButtonIsUp = TRUE; + orangeButtonIsUp = FALSE; break; - case 1: - v2 = (FX32_ONE * 16 * 2); - v3 = (FX32_ONE * 16 * 2); - v4 = 1; - v5 = 0; - v6 = 1; + case PASTORIA_GREEN_BUTTON_PRESSED: + waterPosition = PASTORIA_WATER_HEIGHT_MIDDLE; + waterHeight = PASTORIA_WATER_HEIGHT_MIDDLE; + blueButtonIsUp = TRUE; + greenButtonIsUp = FALSE; + orangeButtonIsUp = TRUE; break; - case 2: - v2 = (FX32_ONE * 16 * 4); - v3 = (FX32_ONE * 16 * 4); - v4 = 0; - v5 = 1; - v6 = 1; + case PASTORIA_BLUE_BUTTON_PRESSED: + waterPosition = PASTORIA_WATER_HEIGHT_HIGH; + waterHeight = PASTORIA_WATER_HEIGHT_HIGH; + blueButtonIsUp = FALSE; + greenButtonIsUp = TRUE; + orangeButtonIsUp = TRUE; break; default: GF_ASSERT(FALSE); - v2 = (FX32_ONE * 0); - v3 = (FX32_ONE * 16 * 0); - v4 = 1; - v5 = 1; - v6 = 0; + waterPosition = PASTORIA_WATER_HEIGHT_LOW; + waterHeight = PASTORIA_WATER_HEIGHT_LOW; + blueButtonIsUp = TRUE; + greenButtonIsUp = TRUE; + orangeButtonIsUp = FALSE; } - v1 = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, pastoria_gym_water_floor_nsbmd); + MapProp *waterProp = MapPropManager_FindLoadedPropByModelID(fieldSystem->mapPropManager, pastoria_gym_water_floor_nsbmd); - { - VecFx32 v10; + VecFx32 waterPropPosition; + waterPropPosition = MapProp_GetPosition(waterProp); + waterPropPosition.y = waterPosition; - v10 = MapProp_GetPosition(v1); - v10.y = v2; + MapProp_SetPosition(waterProp, &waterPropPosition); - MapProp_SetPosition(v1, &v10); - } + DynamicTerrainHeightManager_SetHeight(PASTORIA_WATER_PLATE_INDEX, waterHeight, fieldSystem->dynamicTerrainHeightMan); - DynamicTerrainHeightManager_SetHeight(0, v3, fieldSystem->dynamicTerrainHeightMan); + MapPropAnimation *animation; + animation = MapPropAnimationManager_GetAnimation(pastoria_gym_blue_button_nsbmd, 0, fieldSystem->mapPropAnimMan); - { - MapPropAnimation *v11; + MapPropAnimation_SetPastoriaGymButtonGroup(animation, PASTORIA_BLUE_BUTTON_GROUP); + MapPropAnimation_SetReversed(animation, blueButtonIsUp); + MapPropAnimation_SetLoopCount(animation, 1); + MapPropAnimation_SetAnimationPaused(animation, TRUE); + MapPropAnimation_GoToLastFrame(animation); - v11 = MapPropAnimationManager_GetAnimation(239, 0, fieldSystem->mapPropAnimMan); + animation = MapPropAnimationManager_GetAnimation(pastoria_gym_green_button_nsbmd, 0, fieldSystem->mapPropAnimMan); - MapPropAnimation_SetPastoriaGymButtonGroup(v11, 1); - MapPropAnimation_SetReversed(v11, v4); - MapPropAnimation_SetLoopCount(v11, 1); - MapPropAnimation_SetAnimationPaused(v11, 1); - MapPropAnimation_GoToLastFrame(v11); + MapPropAnimation_SetPastoriaGymButtonGroup(animation, PASTORIA_GREEN_BUTTON_GROUP); + MapPropAnimation_SetReversed(animation, greenButtonIsUp); + MapPropAnimation_SetLoopCount(animation, 1); + MapPropAnimation_SetAnimationPaused(animation, TRUE); + MapPropAnimation_GoToLastFrame(animation); - v11 = MapPropAnimationManager_GetAnimation(240, 0, fieldSystem->mapPropAnimMan); + animation = MapPropAnimationManager_GetAnimation(pastoria_gym_orange_button_nsbmd, 0, fieldSystem->mapPropAnimMan); - MapPropAnimation_SetPastoriaGymButtonGroup(v11, 2); - MapPropAnimation_SetReversed(v11, v5); - MapPropAnimation_SetLoopCount(v11, 1); - MapPropAnimation_SetAnimationPaused(v11, 1); - MapPropAnimation_GoToLastFrame(v11); - - v11 = MapPropAnimationManager_GetAnimation(241, 0, fieldSystem->mapPropAnimMan); - - MapPropAnimation_SetPastoriaGymButtonGroup(v11, 3); - MapPropAnimation_SetReversed(v11, v6); - MapPropAnimation_SetLoopCount(v11, 1); - MapPropAnimation_SetAnimationPaused(v11, 1); - MapPropAnimation_GoToLastFrame(v11); - } + MapPropAnimation_SetPastoriaGymButtonGroup(animation, PASTORIA_ORANGE_BUTTON_GROUP); + MapPropAnimation_SetReversed(animation, orangeButtonIsUp); + MapPropAnimation_SetLoopCount(animation, 1); + MapPropAnimation_SetAnimationPaused(animation, TRUE); + MapPropAnimation_GoToLastFrame(animation); } -static void ov8_02249F14(const u8 param0, MapPropAnimationManager *param1) +static void PastoriaGym_UpdateButtonAnimations(const u8 pressedButton, MapPropAnimationManager *mapPropAnimMan) { - MapPropAnimation *v0; - int v1, v2, v3; - - if (param0 == 2) { - v1 = 1; - v2 = 2; - v3 = 3; - } else if (param0 == 1) { - v1 = 2; - v2 = 1; - v3 = 3; - } else if (param0 == 0) { - v1 = 3; - v2 = 1; - v3 = 2; + int pressedButtonGroup, unpressedGroup1, unpressedGroup2; + if (pressedButton == PASTORIA_BLUE_BUTTON_PRESSED) { + pressedButtonGroup = PASTORIA_BLUE_BUTTON_GROUP; + unpressedGroup1 = PASTORIA_GREEN_BUTTON_GROUP; + unpressedGroup2 = PASTORIA_ORANGE_BUTTON_GROUP; + } else if (pressedButton == PASTORIA_GREEN_BUTTON_PRESSED) { + pressedButtonGroup = PASTORIA_GREEN_BUTTON_GROUP; + unpressedGroup1 = PASTORIA_BLUE_BUTTON_GROUP; + unpressedGroup2 = PASTORIA_ORANGE_BUTTON_GROUP; + } else if (pressedButton == PASTORIA_ORANGE_BUTTON_PRESSED) { + pressedButtonGroup = PASTORIA_ORANGE_BUTTON_GROUP; + unpressedGroup1 = PASTORIA_BLUE_BUTTON_GROUP; + unpressedGroup2 = PASTORIA_GREEN_BUTTON_GROUP; } else { GF_ASSERT(0); } - v0 = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(v1, param1); + MapPropAnimation *mapPropAnimation; + mapPropAnimation = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(pressedButtonGroup, mapPropAnimMan); - MapPropAnimation_SetReversed(v0, 0); - MapPropAnimation_GoToFirstFrame(v0); - MapPropAnimation_SetAnimationPaused(v0, 0); - MapPropAnimation_StartLoop(v0); + MapPropAnimation_SetReversed(mapPropAnimation, FALSE); + MapPropAnimation_GoToFirstFrame(mapPropAnimation); + MapPropAnimation_SetAnimationPaused(mapPropAnimation, FALSE); + MapPropAnimation_StartLoop(mapPropAnimation); - v0 = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(v2, param1); + mapPropAnimation = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(unpressedGroup1, mapPropAnimMan); - MapPropAnimation_SetReversed(v0, 1); - MapPropAnimation_GoToFirstFrame(v0); - MapPropAnimation_SetAnimationPaused(v0, 0); - MapPropAnimation_StartLoop(v0); + MapPropAnimation_SetReversed(mapPropAnimation, TRUE); + MapPropAnimation_GoToFirstFrame(mapPropAnimation); + MapPropAnimation_SetAnimationPaused(mapPropAnimation, FALSE); + MapPropAnimation_StartLoop(mapPropAnimation); - v0 = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(v3, param1); + mapPropAnimation = MapPropAnimationManager_GetAnimationByPastoriaGymButtonGroup(unpressedGroup2, mapPropAnimMan); - MapPropAnimation_SetReversed(v0, 1); - MapPropAnimation_GoToFirstFrame(v0); - MapPropAnimation_SetAnimationPaused(v0, 0); - MapPropAnimation_StartLoop(v0); + MapPropAnimation_SetReversed(mapPropAnimation, TRUE); + MapPropAnimation_GoToFirstFrame(mapPropAnimation); + MapPropAnimation_SetAnimationPaused(mapPropAnimation, FALSE); + MapPropAnimation_StartLoop(mapPropAnimation); Sound_PlayEffect(SEQ_SE_DP_FW056); } @@ -809,7 +766,7 @@ static BOOL ov8_0224A018(FieldTask *taskMan) } } break; case 2: - DynamicTerrainHeightManager_SetHeight(0, (FX32_ONE * 16 * 10), fieldSystem->dynamicTerrainHeightMan); + DynamicTerrainHeightManager_SetHeight(0, FX32_ONE * 16 * 10, fieldSystem->dynamicTerrainHeightMan); PlayerAvatar_SetHeightCalculationEnabledAndUpdate(fieldSystem->playerAvatar, TRUE); Sound_PlayEffect(SEQ_SE_DP_KI_GASYAN); (v2->unk_00)++; @@ -854,7 +811,7 @@ static BOOL ov8_0224A0E8(FieldTask *taskMan) } } break; case 2: - DynamicTerrainHeightManager_SetHeight(0, (FX32_ONE * 16 * 0), fieldSystem->dynamicTerrainHeightMan); + DynamicTerrainHeightManager_SetHeight(0, FX32_ONE * 16 * 0, fieldSystem->dynamicTerrainHeightMan); PlayerAvatar_SetHeightCalculationEnabledAndUpdate(fieldSystem->playerAvatar, TRUE); Sound_PlayEffect(SEQ_SE_DP_KI_GASYAN); (v2->unk_00)++; @@ -2743,7 +2700,7 @@ static BOOL ov8_0224B370(UnkStruct_ov8_0224AF00 *param0, const fx32 param1, cons if ((v1 != param1) || (v2 != param2)) { fx32 v3, v4; - ov8_0224AF00(param0, (FX32_ONE * 2)); + ov8_0224AF00(param0, FX32_ONE * 2); v3 = param0->fxHour; v4 = param0->fxMinute; @@ -3161,7 +3118,7 @@ static void ov8_0224B958(UnkStruct_ov8_0224B8D0 *param0) UnkStruct_ov8_0224B8A0 *v5 = param0->unk_04; UnkStruct_ov8_0224BCA8 *v6 = param0->unk_10C; - while (MapObjectMan_FindObjectWithStatus(mapObjMan, &v2, &v0, (1 << 0)) == 1) { + while (MapObjectMan_FindObjectWithStatus(mapObjMan, &v2, &v0, 1 << 0) == 1) { if (MapObject_GetLocalID(v2) == 0xfd) { if (MapObject_GetDataAt(v2, 0) == 0) { ov8_0224B80C(&v5->unk_08, v2, fieldSystem); @@ -3904,7 +3861,7 @@ static void ov8_0224C444(UnkStruct_ov8_0224C444 *param0) v1 = 0; v3 = MapObjectMan_GetTaskBasePriority(mapObjMan) + 2; - while (MapObjectMan_FindObjectWithStatus(mapObjMan, &v5, &v0, (1 << 0))) { + while (MapObjectMan_FindObjectWithStatus(mapObjMan, &v5, &v0, 1 << 0)) { v4 = MapObject_GetLocalID(v5); v6->unk_08 = MapObject_GetDataAt(v5, 0); @@ -3970,7 +3927,7 @@ BOOL ov8_0224C51C(FieldSystem *fieldSystem) v2 = 2; v1 = Direction_GetOpposite(MapObject_GetFacingDir(v8)); - while (MapObjectMan_FindObjectWithStatus(mapObjMan, &v7, &v0, (1 << 0))) { + while (MapObjectMan_FindObjectWithStatus(mapObjMan, &v7, &v0, 1 << 0)) { if ((v7 != v8) && (FieldSystem_IsTrainerDefated(fieldSystem, v7) == 1)) { v3 = MapObject_GetDistanceToPlayer(v7, playerAvatar, v1, v2); diff --git a/src/persisted_map_features_init.c b/src/persisted_map_features_init.c index 16c536b9fd..3736f4888a 100644 --- a/src/persisted_map_features_init.c +++ b/src/persisted_map_features_init.c @@ -6,7 +6,6 @@ #include "constants/field/dynamic_map_features.h" #include "constants/great_marsh_tram.h" -#include "struct_defs/struct_02071B10.h" #include "struct_defs/struct_02071B30.h" #include "struct_defs/struct_02071B6C.h" #include "struct_defs/struct_02071BF8.h" @@ -57,8 +56,8 @@ void PersistedMapFeatures_InitForPastoriaGym(FieldSystem *fieldSystem) PersistedMapFeatures *persistedMapFeatures = MiscSaveBlock_GetPersistedMapFeatures(FieldSystem_GetSaveData(fieldSystem)); PersistedMapFeatures_InitWithID(persistedMapFeatures, DYNAMIC_MAP_FEATURES_PASTORIA_GYM); - UnkStruct_02071B10 *data = PersistedMapFeatures_GetBuffer(persistedMapFeatures, DYNAMIC_MAP_FEATURES_PASTORIA_GYM); - data->unk_00 = 1; + PastoriaGymPersistedFeature *feature = PersistedMapFeatures_GetBuffer(persistedMapFeatures, DYNAMIC_MAP_FEATURES_PASTORIA_GYM); + feature->pressedButton = PASTORIA_GREEN_BUTTON_PRESSED; } void PersistedMapFeatures_InitForCanalaveGym(FieldSystem *fieldSystem)