RetroAchievements / RAIntegration

The DLL responsible to integrate emulators with RetroAchievements.org
https://retroachievements.org
MIT License
98 stars 22 forks source link

[Feature Request] Sanctioned Cheats #732

Closed Sanaki closed 3 years ago

Sanaki commented 3 years ago

Essentially the idea is to implement RetroArch's libretro cheat format (or functionally equivalent) in the integration, adapting both to allow the following flow:

Required work (presumed, and a bit daunting):

At a base level, this would allow simple QoL cheat usage despite having the cheat system locked down. Examples of this are various 60 FPS cheats for PPSSPP, widescreen cheats, anti-seizure cheats to suppress flashing effects, d-pad/touchless tweaks where applicable, and so on. Some games also require cheats or hacks to be playable at all, such as the Hilton training game on PSP and the Pokemon typing game on DS. A cheat could also be allowed to enable the infamous Snow Queen quest in Persona while playing on the US version of the game.

Many simple hacks that have had a tumultuous life cycle on RA would be usable as sanctioned cheats, such as the Zelda three heart hack. It could very easily be implemented as a spelunker mode cheat (death on taking any damage, regardless of your current/max health) with a subset (V2 feature) dedicated to completing tasks with it active. Numerous challenge modes could be implemented the same way, with a much lower bar to creation than rom hacking requires, and much easier compatibility once subset support is available.

Note: The libretro cheat format was specified above because it allows cheat chains and multi-write cheats, enabling functionality such as making the framerate 60 fps during gameplay but 30 fps during locked FMVs that would stutter wildly otherwise. Given that the format already exists, it seems that would be the easiest approach to implementing advanced functionality without needing to rewrite the spec.

televandalist commented 3 years ago

Worth noting that for some games, we could force debug activation to be false while requiring something else to be true and require the latter in achievement logic.