FINAL FANTASY

FINAL FANTASY

Not enough ratings
How to hack the player move speed to reduce judder at 60hz
By eyrie0
Since a lot of people don't have high refresh rate monitors, I was able to track down how the player move speed works. Hacking this speed will fix judder in the horizontal and vertical directions, but not in the diagonals.
   
Award
Favorite
Favorited
Unfavorite
Edit GameAssembly.dll in a hex editor
First, open GameAssembly.dll in a hex editor. I use HxD.

The player move speed for the Final Fantasy pixel remasters is calculated using this formula:

Base Seconds Per Tile / State Multiplier

The default values are 0.24 seconds per tile with a 1.2 multiplier for standard walk and a 2.4 multiplier for in-town run.

The base speed is stored at [GameAssembly.dll+188FCF8] in memory, and at offset 188E8F8 in the dll. It is stored as a float so you'll need to use a float to hex calculator to change the values in the file (e.g, https://gregstoll.com/~gregstoll/floattohex ).

The default value of 0.24 is 0x3e75c28f in hex, which means we need to search for 8f c2 75 3e in the dll because it's stored in little endian order.



The multipliers are stored in a lookup table found at GameAssembly.dll+B44DB0 in memory, and at offset B441B0 in the dll file.

GameAssembly.dll+B44DB0 - C7 81 A4000000 00008040 - mov [rcx+000000A4],40800000 { 4.00 } GameAssembly.dll+B44DBA - C3 - ret GameAssembly.dll+B44DBB - C7 81 A4000000 9A991940 - mov [rcx+000000A4],4019999A { 2.40 } GameAssembly.dll+B44DC5 - C3 - ret GameAssembly.dll+B44DC6 - C7 81 A4000000 6666E63F - mov [rcx+000000A4],3FE66666 { 1.80 } GameAssembly.dll+B44DD0 - C3 - ret GameAssembly.dll+B44DD1 - C7 81 A4000000 9A99993F - mov [rcx+000000A4],3F99999A { 1.20 }

The 4.0 multiplier is airship speed, and I don't know what the 1.8 one is used for. The ship uses 2.4.

Based on these defaults, the standard walk speed is 80 pixels per second: 0.24 / 1.2 = 0.2 seconds per tile = 5 tiles per second = 80 pixels per second.

If we increase the standard walk speed to 120 pixels per second, it prevents scrolling judder at 60hz. Unfortunately the diagonal movement reduces the horzontal/vertical speed by 1 / sqrt(2) since it's trying to make the diagonal motion the same speed as the normal horizontal/vertical motion. So this method still has judder with diagonal motion.

To get 120 pixels per second, we need a base speed of 0.16. This is 0x3e23d70a in hex, so we need to edit our bytes to be 0a d7 23 3e.



Once this is done, the airship motion will still have judder. If we change its multiple to 2.4, we can fix that as well, but the airship will be slower. It seems like 3.6 or 4.8 should fix it as well, but it did not on my machine. I've provided values below in case you want to try it, though.

To change the airship multiplier, search for:

C7 81 A4 00 00 00 00 00 80 40



And replace it with one of the following:

C7 81 A4 00 00 00 9a 99 19 40 // 2.4
C7 81 A4 00 00 00 66 66 66 40 // 3.6
C7 81 A4 00 00 00 9a 99 99 40 // 4.8



Save the dll and run the game, and now your character will walk faster, and non-diagonal judder should be gone!
26 Comments
mOnocularJohn Mar 17 @ 5:46pm 
Would be nice if Squenix just used a tiny portion of the profit they made from the game to fix this issue so it's butter smooth like on the SNES. It would probably take like, one day.
BONKERS Nov 16, 2021 @ 11:34pm 
Is there anyway there is also a value for the pixels per second of cutscenes with automatic movement like the intro to fix the stuttering for those as well?
the_randomizer1889 Sep 13, 2021 @ 6:16am 
It's be nice if people could upload files for use to drag and drop.
Thirteen1355 Sep 12, 2021 @ 5:58am 
I'm very sorry, but I'm not sure what you have been smoking haha. The player walks waay too fast with this change (almost double speed), running looks crazy, and it also doesn't fix the juttering.
Mandras Sep 11, 2021 @ 6:09am 
With 60hz displays wouldn't it make sense to reduce the base speed to 60 pixels per second? While slower, this is the speed the NES game uses and it gives smooth scrolling, and you can always use the run button.

replace:
8f c2 75 3e

with:
0a d7 a3 3e
Atom Aug 26, 2021 @ 8:05pm 
Just wanted to note that this guide still works after the patch, just ctrl+f the relevant hex values. The offsets might be different, I'm not sure.

Also it seems the dll for FFII and III now have the same set of bytes for the airship as FF1 so the same switch works there for me.
exodus Aug 16, 2021 @ 7:50am 
For anyone with a GSync/Freesync monitor, after applying these values, use RTSS to limit your framerate to 58fps for a perfect stutter free experience.
Timedye Aug 16, 2021 @ 2:06am 
@Kaikou - Is it possible that the 1.8 speed is for movement in the canoe? Because I notice some stutter still happens while using the canoe. Would adjusting that 1.8 speed fix the canoe stutter, maybe?
Timedye Aug 16, 2021 @ 2:03am 
So is there something more that needs to be done for the airship to get it to stop stuttering? Because no matter which of the three values I use, the game continues to stutter when using the airship. It definitely moves slower with the one that's suggested to work, but the stutter is still there too.
Timedye Aug 8, 2021 @ 10:00pm 
I'd already beat Final Fantasy by the time you posted this, but the same values work in the dll for Final Fantasy II. I don't much like diagonal movement anyway in these games. Thanks for this!