Cheats/Patches (#493)

* Cheats/Patches

Adds the possibility of applying cheats/patches according to the specific game serial+version

The logic for adding modifications has not yet been implemented!

Interface based on issues/372 https://github.com/shadps4-emu/shadPS4/issues/372

[X]Front-end
[]Back-end

Create a synchronized fork of the cheats/patches repository

* Clang Format

* separate files

The code has been separated into separate files as suggested by georgemoralis.
Added the Patch tab, which has not been implemented yet.
Added the 'applyCheat' area to apply the modification, not implemented yet...
And added LOG_INFO.

* reuse

* initial implementation of cheat functionality

* Update cheats_patches.cpp

sets all added buttons to the size of the largest button.
and fixes some aesthetic issues.

* move eboot_address to module.h

fixes the non-qt builds and makes more sense to be there anyway

* Patchs menu and fixes

adds the possibility to download Patches, it does not modify the memory yet.
and some other fixes

* MemoryPatcher namespace, activate cheats on start

* format

* initial patch implementation

* format

* format again...

* convertValueToHex

* Fixes

Choosing which cheat file to use.
And some other fixes

* fix bytes16, bytes32, bytes64 type patches

If a patch is any of these types we convert it from little endian to big endian

* format

* format again :(

* Implement pattern scanning for mask type patches

* add check to stop patches applying to wrong game

previously if you added a patch to a game, but closed the window and opened a different game it would still try to apply the patch, this is now fixed

* format

* Fix 'Hint' 0x400000 |  and Author

* Management |save checkbox | shadps4 repository

MENU - Cheats/Patches Management (implementing Patches)
save patches checkbox
add shadps4 repository

* Load saved patches, miscellaneous fixes

* Fix an issue with mask patches not being saved

* format + remove debug log

* multiple patches | TR translation for cheats/patches

* clang

* ENABLE_QT_GUI

* OK

* move memory_patcher to qt_gui

* clang

* add cheats hu_HU

* fix log

* Remove the item from the patchesListView if no patches were added (the game has patches, but not for the current version)

---------

Co-authored-by: CrazyBloo <CrazyBloo@users.noreply.github.com>
This commit is contained in:
DanielSvoboda 2024-08-29 01:18:50 -03:00 committed by GitHub
parent a6a9fff666
commit 614a23b369
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
35 changed files with 12003 additions and 798 deletions

View file

@ -81,67 +81,72 @@
<context>
<name>GuiContextMenus</name>
<message>
<location filename="../gui_context_menus.h" line="39"/>
<location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source>
<translation>Crear acceso directo</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="40"/>
<location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source>
<translation>Abrir carpeta del juego</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="41"/>
<location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Trucos / Parches</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source>
<translation>Vista SFO</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="42"/>
<location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source>
<translation>Ver trofeos</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="50"/>
<location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source>
<translation>Copiar información</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="51"/>
<location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source>
<translation>Copiar nombre</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="52"/>
<location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source>
<translation>Copiar serial</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="53"/>
<location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source>
<translation>Copiar todo</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="173"/>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
<translation>Acceso directo creado</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="174"/>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>¡Acceso directo creado con éxito!\n %1</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="177"/>
<location filename="../gui_context_menus.h" line="199"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="178"/>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>¡Error al crear el acceso directo!\n %1</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="253"/>
<location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source>
<translation>Instalar PKG</translation>
</message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source>
<translation>Carpeta de instalación de los juegos</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Descargar Trucos / Parches</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source>
@ -488,4 +498,395 @@
<translation>Habilitar depuración de RenderDoc</translation>
</message>
</context>
</TS>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Versión de Vulkan no soportada</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Descargar trucos para todos los juegos instalados</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Descargar parches para todos los juegos</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Descarga completa</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Has descargado trucos para todos los juegos que tienes instalados.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>¡Parches descargados exitosamente!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Todos los parches disponibles para todos los juegos han sido descargados.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Juegos: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>Archivo PKG (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>Archivos ELF (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Inicio del juego</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>¡Solo se puede seleccionar un archivo!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>Extracción de PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="633"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source>
<translation>¡Parche detectado!\n¡La versión de PKG y del juego coinciden!: %1\n¿Te gustaría </translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>¿sobrescribir?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>¡Parche detectado!\nLa versión de PKG %1 es más antigua </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>que la versión instalada!: %2\n¿Te gustaría </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>¿sobrescribir?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source>
<translation>¡Parche detectado!\nJuego está instalado: %1\n¿Te gustaría </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source>
<translation>¿instalar el parche: %2?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="659"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source>
<translation>Juego ya instalado\n%1\n¿Te gustaría sobrescribirlo?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG es un parche, ¡por favor instala el juego primero!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>ERROR PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Extrayendo PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Extracción terminada</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Juego instalado exitosamente en %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>El archivo no parece ser un archivo PKG válido</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Trucos / Parches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Los cheats/patches son experimentales.\nÚselos con precaución.\n\nDescargue los cheats individualmente seleccionando el repositorio y haciendo clic en el botón de descarga.\nEn la pestaña Patches, puede descargar todos los patches a la vez, elegir cuáles desea usar y guardar la selección.\n\nComo no desarrollamos los Cheats/Patches,\npor favor informe los problemas al autor del cheat.\n\n¿Creaste un nuevo cheat? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>No hay imagen disponible</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Serie: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Versión: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Tamaño: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Seleccionar archivo de trucos:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Repositorio:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Descargar trucos</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Eliminar archivo</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>No se han seleccionado archivos.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Puedes eliminar los trucos que no quieras después de descargarlos.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>¿Deseas eliminar el archivo seleccionado?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Seleccionar archivo de parche:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Descargar parches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Guardar</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Trucos</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Parche</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>No se ha seleccionado ningún parche.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>No se puede abrir files.json para lectura.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>No se encontró ningún archivo de parche para la serie actual.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>No se puede abrir el archivo para lectura.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>No se puede abrir el archivo para escritura.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>Error al analizar XML: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Éxito</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Opciones guardadas exitosamente.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Fuente inválida</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>La fuente seleccionada es inválida.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>El archivo ya existe</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>El archivo ya existe. ¿Deseas reemplazarlo?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Error al guardar el archivo:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Error al descargar el archivo:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Trucos no encontrados</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>No se encontraron trucos para este juego en esta versión del repositorio seleccionado,intenta con otro repositorio o con una versión diferente del juego.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Trucos descargados exitosamente</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Has descargado exitosamente los trucos para esta versión del juego desde el repositorio seleccionado. Puedes intentar descargar desde otro repositorio; si está disponible, también será posible usarlo seleccionando el archivo de la lista.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Error al guardar:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Error al descargar:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Descarga completa</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>¡Parches descargados exitosamente! Todos los parches disponibles para todos los juegos han sido descargados, no es necesario descargarlos individualmente para cada juego como ocurre con los trucos.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Error al analizar los datos JSON del HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Error al recuperar la página HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Error al abrir el archivo:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>ERROR XML:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Error al abrir files.json para escritura</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Autor: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>El directorio no existe:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Error al abrir files.json para lectura.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Nombre:</translation>
</message>
</context>
</TS>