Skip to content

Commit

Permalink
60FPS: Fix las0_5 map softlock in FF7 (#585)
Browse files Browse the repository at this point in the history
  • Loading branch information
tangtang95 committed Jul 30, 2023
1 parent d9963bf commit c6cdca7
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 1 deletion.
1 change: 1 addition & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
- Input: Allow Cloud to walk/run based on the left analogue stick position ( https://github.com/julianxhokaxhiu/FFNx/issues/523 + https://github.com/julianxhokaxhiu/FFNx/issues/557 )
- Lighting: Fix model normal data inheritance
- Modding: Allow snowboard model swapping ( https://github.com/julianxhokaxhiu/FFNx/issues/440 )
- 60FPS: Fix softlock on one of the last map (las0_5) ( https://github.com/julianxhokaxhiu/FFNx/discussions/569 )

## FF8

Expand Down
1 change: 1 addition & 0 deletions src/ff7/field/enter.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ namespace ff7::field
for(auto &external_data : external_model_data){
external_data.moveFrameIndex = 0;
external_data.rotationMoveFrameIndex = 0;
external_data.prevCollisionRadius = 0;

external_data.blinkFrameIndex = BLINKING_FRAMES;
}
Expand Down
40 changes: 39 additions & 1 deletion src/ff7/field/model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,45 @@ namespace ff7::field
int frame_multiplier = get_frame_multiplier();
field_event_data* field_event_data_array = (*ff7_externals.field_event_data_ptr);

if(is_fps_running_more_than_original())

if(is_fps_running_more_than_original() && *ff7_externals.field_id == 748)
{
// Fix softlock related to this discussion https://github.com/julianxhokaxhiu/FFNx/discussions/569.
// The issue is due to the fact that when Cloud climb up, there is a mini auto movement which triggers a line making Cloud jump below.
// This script that makes Cloud jump below does not end well, which makes the next script overlapping with this.
// If the next script is to climb back up, there is a sort of race condition where the player movability is activated.
// Then if the player taps the DOWN button, it will go into a softlock.
//
// This logic is very fragile (might cause other softlock), so, the solution is to write another logic only for this map
int interpolationStep = external_model_data[model_id].moveFrameIndex + 1;
if(external_model_data[model_id].moveFrameIndex == 0)
{
external_model_data[model_id].initialPosition = field_event_data_array[model_id].model_pos;
ret = ff7_externals.field_update_single_model_position(model_id);
external_model_data[model_id].updateMovementReturnValue = ret;
external_model_data[model_id].finalPosition = field_event_data_array[model_id].model_pos;
external_model_data[model_id].prevCollisionRadius = field_event_data_array[model_id].collision_radius;
field_event_data_array[model_id].model_pos.x = external_model_data[model_id].initialPosition.x + ((external_model_data[model_id].finalPosition.x - external_model_data[model_id].initialPosition.x) * interpolationStep) / frame_multiplier;
field_event_data_array[model_id].model_pos.y = external_model_data[model_id].initialPosition.y + ((external_model_data[model_id].finalPosition.y - external_model_data[model_id].initialPosition.y) * interpolationStep) / frame_multiplier;
field_event_data_array[model_id].model_pos.z = external_model_data[model_id].initialPosition.z + ((external_model_data[model_id].finalPosition.z - external_model_data[model_id].initialPosition.z) * interpolationStep) / frame_multiplier;
field_event_data_array[model_id].collision_radius = 0;
}
else
{
ret = external_model_data[model_id].updateMovementReturnValue;
field_event_data_array[model_id].model_pos.x = external_model_data[model_id].initialPosition.x + ((external_model_data[model_id].finalPosition.x - external_model_data[model_id].initialPosition.x) * interpolationStep) / frame_multiplier;
field_event_data_array[model_id].model_pos.y = external_model_data[model_id].initialPosition.y + ((external_model_data[model_id].finalPosition.y - external_model_data[model_id].initialPosition.y) * interpolationStep) / frame_multiplier;
field_event_data_array[model_id].model_pos.z = external_model_data[model_id].initialPosition.z + ((external_model_data[model_id].finalPosition.z - external_model_data[model_id].initialPosition.z) * interpolationStep) / frame_multiplier;
}

if((external_model_data[model_id].moveFrameIndex + 1) % frame_multiplier == 0)
{
field_event_data_array[model_id].collision_radius = external_model_data[model_id].prevCollisionRadius;
}

external_model_data[model_id].moveFrameIndex = (external_model_data[model_id].moveFrameIndex + 1) % frame_multiplier;
}
else if(is_fps_running_more_than_original())
{
int interpolationStep = external_model_data[model_id].moveFrameIndex + 1;
if(external_model_data[model_id].moveFrameIndex == 0)
Expand Down
1 change: 1 addition & 0 deletions src/ff7/field/model.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ namespace ff7::field
vector3<int> finalPosition;
int wasNotCollidingWithTarget;
int updateMovementReturnValue;
int prevCollisionRadius;

int rotationMoveFrameIndex;

Expand Down

0 comments on commit c6cdca7

Please sign in to comment.