Yes, that 60 FPS cheat won't work On the Switch itself because of the V-Sync.60fps
580F0000 0CE891C0
580F1000 00000008
580F1000 00000018
580F1000 00000190
780F0000 00000294
640F0000 00000000 42700000
invalid
I think you're misunderstanding terms.Yes, that 60 FPS cheat won't work On the Switch itself because of the V-Sync.
You mean like that "FrameSkipping" thing?Probly you mean double buffer. So until game will reach locked 60 FPS, it will be 30 FPS.
And this is still something that is not figured out how to disable it. Emulator's code is not perfect and doesn't know what forces this double buffer, so it doesn't exist. The same thing is happening for Xenoblade Chronicles DE.
dmnt:cht has option to pause and resume, writing overlay for it should be simple.You mean like that "FrameSkipping" thing?
In New 3DS console, there are some games that are locked at 30 FPS but if we use 60 FPS cheat, the Game's FPS will drop straight to 30 if there are a lot of Effects going around but will go back to 60 if it's on a tight and light area.
But If we use 60 FPS cheat on Emulator with a Capable Device. The FPS will not drop straight Specifically to 30 FPS.
--------------------- MERGED ---------------------------
BTW, there's something I noticed on the Switch, When this Image appears;
It's seems like the Framerate is 60 at that moment. I tried to quickly go to Edizon to do some search but the problem is the game will keep running in the background... So I keep missing it... If only the game would pause just as you go to the home menu.
Please can you make a patch to run this game at 720p in handheld mode. Many thanks for your efforts.Ok, figured it out. It seems those clever guys either forgot that they have enabled in emulator options setting presentinterval always to 1, or emulator is now broken.
With attached exefs patch below your cheats are now working on hardware.
It seems it's not possible to get locked 60 without memory OC over 1600 MHz. It will fluctuate between 50 and 60 FPS even at 1963.5 MHz CPU and 1267.2 MHz GPU. There is no difference between those and 1785/921.
Wow you really are a God! Thank you for making this!Ok, figured it out. It seems those clever guys either forgot that they have enabled in emulator options setting presentinterval always to 1, or emulator is now broken.
With attached exefs patch below your cheats are now working on hardware.
It seems it's not possible to get locked 60 without memory OC over 1600 MHz. It will fluctuate between 50 and 60 FPS even at 1963.5 MHz CPU and 1267.2 MHz GPU. There is no difference between those and 1785/921.
[60 FPS native]
580F0000 0CD2DC58
780F0000 00000434
640F0000 00000000 42700000
python3 script.py pakfile.pak
import os
import sys
import zstd
import numpy
file = open(sys.argv[1], 'rb')
MAGIC = file.read(0x4)
if (MAGIC != b'KPKA'): raise ValueError("Wrong MAGIC")
version = numpy.fromfile(file, dtype=numpy.uint32, count=1)[0]
file_count = numpy.fromfile(file, dtype=numpy.uint32, count=1)[0]
file.seek(0x4, 1)
CRC_Name = []
offset = []
zsize = []
size = []
flag = []
null = False
file_result = 0
for i in range(0, file_count):
CRC_Name.append("%x" % (numpy.fromfile(file, dtype=numpy.uint64, count=1)[0]))
offset.append(numpy.fromfile(file, dtype=numpy.uint64, count=1)[0])
zsize.append(numpy.fromfile(file, dtype=numpy.uint64, count=1)[0])
size.append(numpy.fromfile(file, dtype=numpy.uint64, count=1)[0])
flag.append(numpy.fromfile(file, dtype=numpy.uint8, count=8)[0])
file.seek(0x8, 1)
if (os.path.isdir("output") == False):
os.makedirs("output")
for i in range(0, file_count):
file.seek(offset[i], 0)
if (flag[i] == 2):
buffer = file.read(zsize[i])
buffer_out = zstd.decompress(buffer)
elif (flag[i] == 0):
file.seek(offset[i], 0)
buffer_out = file.read(size[i])
else: raise ValueError("Wrong compression flag: %x" % (flag[i]))
if (len(buffer_out) != size[i]): raise ValueError("Wrong Uncompressed size")
for x in range(0,3):
if (buffer_out[x] == 0x0 or buffer_out[x] > 126): null = True
if (null == True):
new = open("output/%d-%x-%s.dat" % (i, offset[i], CRC_Name[i]), "wb")
if (flag[i] == 2): print("%d: %x-%s.dat, Compression: zstd, compressed size: %d, uncompressed size: %d" % (i, offset[i], CRC_Name[i], zsize[i], size[i]))
else: print("%d: %x-%s.dat, Compression: None, size: %d" % (i, offset[i], CRC_Name[i], size[i]))
else:
new = open("output/%d-%x-%s.%s" % (i, offset[i], CRC_Name[i], buffer_out[0:3].decode("ascii")), "wb")
if (flag[i] == 2): print("%d: %x-%s.%s, Compression: zstd, compressed size: %d, uncompressed size: %d" % (i, offset[i], CRC_Name[i], buffer_out[0:3].decode("ascii"), zsize[i], size[i]))
else: print("%d: %x-%s.%s, Compression: None, size: %d" % (i, offset[i], CRC_Name[i], buffer_out[0:3].decode("ascii"), size[i]))
new.write(buffer_out)
new.close()
null = False
file_result = file_result + 1
if (file_result != file_count): raise ValueError("Wrong file count. Expected: %d, unpacked: %d" % (file_count, file_result))
file.close()
Ok, figured it out. It seems those clever guys either forgot that they have enabled in emulator options setting presentinterval always to 1, or emulator is now broken.
With attached exefs patch below your cheats are now working on hardware.
It seems it's not possible to get locked 60 without memory OC over 1600 MHz. It will fluctuate between 50 and 60 FPS even at 1963.5 MHz CPU and 1267.2 MHz GPU. There is no difference between those and 1785/921.
It relies on buildid, so any difference in code makes it not working.thanks ,seem not work for "100BEF013050000" version
And exefs has plenty informations to figure out where settings are stored.
For example this is 60 FPS patch made from reading main
So wait until final release. There will be plenty of graphics cheats to look for.Code:[60 FPS native] 580F0000 0CD2DC58 780F0000 00000434 640F0000 00000000 42700000
Edit: Because I don't like how RE Tool manages to name files when there is no list, I have made my own python script for unpacking files.
It names file in this regard:
*order in pak file*-*offset of stored data*-*CRC Name*.*file type*
file type is guessed based on magic. If Magic cannot be properly converted to ascii, as type is used "dat"
Requirements: python3, zstd, numpy (and because numpy is broken on Windows, you won't use it by cmd. Use WSL or msys2)
Usage:
Code:python3 script.py pakfile.pak
Code:import os import sys import zstd import numpy file = open(sys.argv[1], 'rb') MAGIC = file.read(0x4) if (MAGIC != b'KPKA'): raise ValueError("Wrong MAGIC") version = numpy.fromfile(file, dtype=numpy.uint32, count=1)[0] file_count = numpy.fromfile(file, dtype=numpy.uint32, count=1)[0] file.seek(0x4, 1) CRC_Name = [] offset = [] zsize = [] size = [] flag = [] null = False file_result = 0 for i in range(0, file_count): CRC_Name.append("%x" % (numpy.fromfile(file, dtype=numpy.uint64, count=1)[0])) offset.append(numpy.fromfile(file, dtype=numpy.uint64, count=1)[0]) zsize.append(numpy.fromfile(file, dtype=numpy.uint64, count=1)[0]) size.append(numpy.fromfile(file, dtype=numpy.uint64, count=1)[0]) flag.append(numpy.fromfile(file, dtype=numpy.uint8, count=8)[0]) file.seek(0x8, 1) if (os.path.isdir("output") == False): os.makedirs("output") for i in range(0, file_count): file.seek(offset[i], 0) if (flag[i] == 2): buffer = file.read(zsize[i]) buffer_out = zstd.decompress(buffer) elif (flag[i] == 0): file.seek(offset[i], 0) buffer_out = file.read(size[i]) else: raise ValueError("Wrong compression flag: %x" % (flag[i])) if (len(buffer_out) != size[i]): raise ValueError("Wrong Uncompressed size") for x in range(0,3): if (buffer_out[x] == 0x0 or buffer_out[x] > 126): null = True if (null == True): new = open("output/%d-%x-%s.dat" % (i, offset[i], CRC_Name[i]), "wb") if (flag[i] == 2): print("%d: %x-%s.dat, Compression: zstd, compressed size: %d, uncompressed size: %d" % (i, offset[i], CRC_Name[i], zsize[i], size[i])) else: print("%d: %x-%s.dat, Compression: None, size: %d" % (i, offset[i], CRC_Name[i], size[i])) else: new = open("output/%d-%x-%s.%s" % (i, offset[i], CRC_Name[i], buffer_out[0:3].decode("ascii")), "wb") if (flag[i] == 2): print("%d: %x-%s.%s, Compression: zstd, compressed size: %d, uncompressed size: %d" % (i, offset[i], CRC_Name[i], buffer_out[0:3].decode("ascii"), zsize[i], size[i])) else: print("%d: %x-%s.%s, Compression: None, size: %d" % (i, offset[i], CRC_Name[i], buffer_out[0:3].decode("ascii"), size[i])) new.write(buffer_out) new.close() null = False file_result = file_result + 1 if (file_result != file_count): raise ValueError("Wrong file count. Expected: %d, unpacked: %d" % (file_count, file_result)) file.close()
Textures have mipmaps and are using swizzle.
I was using rawtexThat's amazing. I extracted textures with your script but find that those .tex files can't be decoded by any RE2/3 or DMC5 tex tools. You said they are using swizzle. Any suggestion on previewing or exporting them to PNGs?
I was using rawtex
It needs texconv downloaded in the same folder
Just write offset from where texture data starts (only tested one and it was at offset 0x1b0, format was iirc r8g8b8a8_unorm or b8g8r8a8_unorm). Tool will guess dimensions, but it's hit and miss. Output is dds.
Yup, this texture is BC1. But you have set wrong offset and dimensions.Thanks for your suggestion!
I tried to use Rawtex with some .tex files. But neither r8g8b8a8_unorm nor b8g8r8a8_unorm worked fine. The default bc1 format did the best but still not statisfying. Here is a sample. It almost gives right picture. May you have a look at it?
Wow, it's cool! Thanks a lot.Yup, this texture is BC1. But you have set wrong offset and dimensions.
In this case it's 0x38
View attachment 244331
Is there a common method to find/calc the offset?Yup, this texture is BC1. But you have set wrong offset and dimensions.
In this case it's 0x38
View attachment 244331
Well, it must be, but I didn't dig into how tex looks like.Is there a common method to find/calc the offset?