From c23b4e10203acc2e0d5c488e9f9013d0328f481f Mon Sep 17 00:00:00 2001 From: LillyJadeKatrin Date: Sat, 17 May 2025 12:52:58 -0400 Subject: [PATCH] RetroAchievements: Updated PatchAllowlistTest to generate new allowlist Refactors the PatchAllowlistTest to streamline the experience for developers. Instead of a textual description of what needs to change in ApprovedInis.json for RetroAchievements compatibility, the test will now generate a replacement file and instruct the coder where to copy it in their local branch, and what to update APPROVED_LIST_HASH to. The result should be easier and more instructive for developers to make changes, while still maintaining that allowed codes cannot be added or modified without recompiling Dolphin. As ApprovedInis.json no longer needs to be user-readable for this process, it no longer contains titles or pretty formatting and as such is updated in this commit, hash included. --- Data/Sys/ApprovedInis.json | 1047 +----------------- Source/Core/Core/AchievementManager.h | 4 +- Source/UnitTests/Core/PatchAllowlistTest.cpp | 118 +- Source/UnitTests/UnitTests.vcxproj | 1 + 4 files changed, 44 insertions(+), 1126 deletions(-) diff --git a/Data/Sys/ApprovedInis.json b/Data/Sys/ApprovedInis.json index a73ed032f0..abcc1133b6 100644 --- a/Data/Sys/ApprovedInis.json +++ b/Data/Sys/ApprovedInis.json @@ -1,1046 +1 @@ -{ - "D43J01": { - "title": "ZELDA OCARINA MULTI PACK", - "CAB9CED2D904F12CCB21F5B1DE9B5433620C3E13": "loophack" - }, - "DPOJ8P": { - "title": "PHANTASY STAR ONLINE EPISODE I&II TRIAL EDITION", - "90BA66E25640A538FEFA6693715718139079FA7B": "Bypass Modem Detection" - }, - "G2BE5G": { - "title": "Black & Bruised", - "7FFF6BDD93713BEDFD23739C32B86153FA19AEA0": "Disable interlaced rendering" - }, - "G2BP7D": { - "title": "Black & Bruised", - "56E85D7285F10348E1E5354E379918D07E79EDA9": "Disable interlaced rendering" - }, - "G2VE08": { - "title": "Viewtiful Joe 2", - "3ED033396382424533A263A39687A0961EC994A6": "16:9 Widescreen" - }, - "G2VP08": { - "title": "Viewtiful Joe 2", - "EEBC3C5F04BB70AFCA1A4C3D638335CDC9142BA2": "16:9 Widescreen" - }, - "G3RP52": { - "title": "Shrek 2", - "7F6B7743F0DDD3704B15882330E490103AE24E36": "16:9 Widescreen", - "4C9A8572A35F1DB85BBB2F32ED34288A343F1FC0": "60fps" - }, - "G3YP52": { - "title": "Shrek SuperSlam (PAL)", - "FD61581C593EA34DD358AE33819FAB310F2CE961": "Force PAL60", - "3D102AFEE2F4945894E74BB702ED3ED2294C6FEC": "16:9 Widescreen" - }, - "G4AEE9": { - "title": "Harvest Moon: Magical Melody", - "8C2564CF47BB6A9B57D712C90E17F459B0BB6CCD": "16:9 Aspect Ratio Fix" - }, - "G4ME69": { - "title": "The Sims: Bustin Out GameCube", - "6FC6E5D91693FAABE25CC721F2121CB0B5CA9D12": "16:9 Widescreen" - }, - "G5SE7D": { - "title": "Spyro: A Hero's Tail", - "16119398BFE241A84151C046E0BC5BCF89D22049": "16:9 Widescreen", - "A5F2FB2B3BFF61F34F8AB1DD5A912A0FD8DFA720": "Remove Bloom" - }, - "G5SP7D": { - "title": "Spyro: A Hero's Tail", - "718AA8BD831961C33114852FDA75BB58F768F46A": "16:9 Widescreen" - }, - "G8ME01": { - "title": "Paper Mario", - "F6E8264CF14D0189219C1E2D20C4182F190F4B88": "16:9 Aspect Ratio Fix - Normal HUD", - "8C2FC3FC6F7766AA8E87425BF3BDD2E46E73DE71": "16:9 Aspect Ratio Fix - Centered HUD", - "8EA4C7B80ADE3E8FEC28EEFA3A046B6B04162E81": "16:9 Aspect Ratio Fix - Stretched HUD", - "AE3DBE2604CA0660165CA870C4B80E2B523C9475": "16:9 Aspect Ratio Fix - Centered HUD with letterboxing" - }, - "G8MJ01": { - "title": "Paper Mario", - "631CE99BDE3F1475303C00C67E3C130D4EB2547B": "16:9 Aspect Ratio Fix - Normal HUD", - "B3181CA1AAB11EAE9132184DA48D76E775AC0A24": "16:9 Aspect Ratio Fix - Centered HUD", - "81F7AD591F12A01DE82850457ECF147998D1238F": "16:9 Aspect Ratio Fix - Stretched HUD", - "904C0EEEF16D761F7BDF7099DEB384DD9AB26E00": "16:9 Aspect Ratio Fix - Centered HUD with letterboxing" - }, - "G8MP01": { - "title": "Paper Mario", - "FB26AA84B0CB787705E84E869B649307776A2839": "16:9 Aspect Ratio Fix - Normal HUD", - "75AF5D7FA49BE9C3C73EA1482B49CD9B36CE817E": "16:9 Aspect Ratio Fix - Centered HUD", - "C5F8A81520193418C07C7BC4881F02BE9C4DC9BC": "16:9 Aspect Ratio Fix - Stretched HUD", - "C2E5003E74551DF693A7CB814850CA51D77549EF": "16:9 Aspect Ratio Fix - Centered HUD with letterboxing" - }, - "G9SE8P": { - "title": "Sonic Heroes", - "CD043229AC47AC93D537B6A0725A2D0BB6FEF4E8": "16:9 Widescreen" - }, - "G9SJ8P": { - "title": "Sonic Heroes", - "C55EF90B542AA3973352A232629A828BC22A8509": "16:9 Widescreen" - }, - "G9SP8P": { - "title": "Sonic Heroes", - "9521774ADEE769CFCCE86F8170FE626387E73019": "16:9 Widescreen" - }, - "GAFE01": { - "title": "Animal Crossing", - "D24F6D9BE5D79D3C795C2844634A0214BB68B5DA": "16:9 Widescreen", - "F9A812FF62A20D5440CAB79DB6AFAE068457A10E": "Make Game Save Copyable (donny2112)" - }, - "GAL": { - "title": "Super Smash Bros Melee", - "DBDB50216B22CDFFF77BDD80261CD0FF75803D3B": "Trophy Viewer" - }, - "GALE01r0": { - "title": "Super Smash Bros. Melee", - "9DC8D90D986FAC175F45006AFF20CF00EDFBE053": "Normal C Stick Functionality in Singleplayer Modes", - "18B4159E77013EDFE499A33281B771C442970E3B": "Proper 16:9 Widescreen Support", - "DC2BCA7D99EBDE1DC7C68CA6AC7F543B93FD6A67": "Properly Display in 4:3" - }, - "GALE01r1": { - "title": "Super Smash Bros. Melee", - "F6030959C1CAC92F37287D556F18B3C5298FAD5B": "Normal C Stick Functionality in Singleplayer Modes" - }, - "GALE01r2": { - "title": "Super Smash Bros. Melee", - "CEDF18354CDCFC49398551C629E51B053331A55B": "Proper 16:9 Widescreen Support", - "6B92D95F0EEA165EA84FD753F74B0A9E2079C2D7": "PAL Stock Icons", - "BCD918A72368B2A30E797C76994E7539A1C0B5D9": "Normal C Stick Functionality in Singleplayer Modes [Zauron]", - "CFDEEA8AD2A99394BFFEA7211EF03394E7471FA9": "Disable Rumble", - "D32ED4CD685F3FF649F7E749E8C182C657013918": "Widescreen Support v1.2 [Dan Salvato]" - }, - "GALP01": { - "title": "Super Smash Bros. Melee", - "BFCBE098FE8679B9140A48EA1D8620D5A369697C": "Proper 16:9 Widescreen Support", - "5BA2933B8365E21553AA273B91954A4C722B1035": "Properly Display in 4:3", - "4817F202678559291F9F76B46DC7561A45D00B77": "Normal C Stick Functionality in Singleplayer Modes" - }, - "GAZE69": { - "title": "Harry Potter and the Prisoner of Azkaban", - "BC281053C5266B21FDDC6C8996A6021DEA03D459": "60FPS" - }, - "GBLE52": { - "title": "BLOODY ROAR(R): PRIMAL FURY", - "C0F3AB3BBC9B21F4BF25F44E48CF1CD36D2B3F45": "16:9 Widescreen" - }, - "GBLP52": { - "title": "BLOODY ROAR(R): PRIMAL FURY", - "797040CB097BFD369490A1BE29659929D76CE6F7": "16:9 Widescreen" - }, - "GBRJ18": { - "title": "BLOODY ROAR(R): PRIMAL FURY", - "B3C867AB34D90E2E9C5B799D800F4C191DE279FA": "16:9 Widescreen" - }, - "GBSE8P": { - "title": "BEACH SPIKERS", - "4148D453F61A5B81E53669335BC667E651865C76": "16:9 Widescreen" - }, - "GBSP8P": { - "title": "BEACH SPIKERS", - "6CB029AE768BA5B9995D5F12C1EBB37B3D1FE242": "16:9 Widescreen" - }, - "GC6E01": { - "title": "Pokémon Colosseum", - "2F64F98686E62B60E466E931A9EBCD19A750FF4E": "Allow Memory Card saving with Savestates", - "DE932CCAD1B5EB1FAA8D08733BD0D3940C78382A": "16:9 Widescreen" - }, - "GC6J01": { - "title": "ポケモンコロシアム", - "D8F327304A88FBC717BB1F775494C5F864B9E8D2": "Allow Memory Card saving with Savestates", - "5CB4934396ABD43F7147EA13521C952728933874": "16:9 Widescreen" - }, - "GC6P01": { - "title": "Pokémon Colosseum", - "EDEE0E28EEA1834868F2865336290FFBDFB9C6DA": "Allow Memory Card saving with Savestates", - "05C9016BF58A628A3FD7B16E1B9BB0769A14846F": "16:9 Widescreen [Ralf]" - }, - "GC8JA4": { - "title": "クラッシュ・バンディクー 爆走!ニトロカート", - "843297019804192AF1FC660BC85F4B10891D0BA3": "Fix C4 texture tiling (used for buttons and some character icons)" - }, - "GCBE7D": { - "title": "Crash Bandicoot: The Wrath of Cortex", - "478DA1D596D8513C343850719155813CB61A56DD": "16:9 Widescreen" - }, - "GCBP7D": { - "title": "Crash Bandicoot: The Wrath of Cortex", - "478DA1D596D8513C343850719155813CB61A56DD": "16:9 Widescreen", - "DF2C4DDF082C9E67919443C5ACC485AB2CF7F8D0": "60Hz" - }, - "GCCE01": { - "title": "FINAL FANTASY Crystal Chronicles", - "6C107FEC15C76201233CA2645EB5FAB4FF9751CE": "Fix buffer overrun bug (crash at Goblin Wall)", - "483BDB94615C690045C3759795AF13CE76552286": "Fix GBA connections", - "BA0066518E7EA8599A81F8496BD39DE20CC369D6": "16:9 Widescreen" - }, - "GCCJGC": { - "title": "FINAL FANTASY Crystal Chronicles", - "4C104D24329172F5D0F8649DE9423B931FE72CA3": "Fix GBA connections" - }, - "GCCP01": { - "title": "FINAL FANTASY Crystal Chronicles", - "2EAA60A8A115AD68A795109FB59E4A726D29016D": "Fix GBA connections", - "2580E7379633CF4DE13B9EC945DB17543477828A": "16:9 Widescreen" - }, - "GCN": { - "title": "Crash Nitro Kart", - "601FE183C9524ACCF068874DABD73921C86769CF": "Fix C4 texture tiling (used for buttons and some character icons)" - }, - "GCVEEB": { - "title": "Cubivore", - "ADA686C90189D1D7D23E23E525EFC96EFA104BB9": "16:9 Widescreen" - }, - "GD7E70": { - "title": "Dragon Ball Z: Budokai", - "95A17AFAAFD83E96CD1CC6242B8667F6A3DC8416": "Deinterlacing Fix" - }, - "GDREAF": { - "title": "Dead to Rights", - "F8EAE60FEB0CFB4477FDC4B9E136B63F68DFA63A": "Fix audio issues" - }, - "GDRP69": { - "title": "Dead to Rights", - "E23D98B2CE185C3993A40F2495D37E41B971BF91": "Fix audio issues" - }, - "GEDE01": { - "title": "Eternal Darkness", - "21068C3CE905FB0CFFAA7408A93154AF8A5295A2": "Fix startup hang" - }, - "GEDJ01": { - "title": "Eternal Darkness", - "7061F3CF11BF64D3BA7F32CCF2BAC42FF3614AB6": "Fix startup hang" - }, - "GEDP01": { - "title": "Eternal Darkness", - "6F1B00517CBA30BEB738EAA90E71221378CD570D": "Fix startup hang" - }, - "GEME7F": { - "title": "Egg Mania: Eggstreme Madness", - "CB04E00918C9C0F161715D21D046ED6620F7ADEF": "Force Progressive Scan" - }, - "GEMJ28": { - "title": "Egg Mania: Eggstreme Madness", - "CC2057185BB10DAD4A361412D024DFD586EE0130": "Force Progressive Scan" - }, - "GEZE8P": { - "title": "BillyHatcher", - "5CEBCFBEA4E444495D2FD6D8B6607DFB2349CC1B": "16:9 Widescreen [gamemasterplc]" - }, - "GF7E01": { - "title": "STARFOX ASSAULT", - "C59CCA3EF8A5E97B32EB64DB9AE80E652ED281C6": "16:9 Widescreen [gamemasterplc]" - }, - "GF7P01": { - "title": "STARFOX ASSAULT", - "1230053B5C347B62E432EFD6635433A183D18619": "16:9 Widescreen [gamemasterplc]" - }, - "GFQEA4": { - "title": "Frogger's Adventures: The Rescue", - "5CD9568CE58EF82EB371594667015C9B799454B9": "16:9 Widescreen" - }, - "GFZJ01": { - "title": "F-Zero GX", - "F659D22CB1DFF15C3915D7630D838EED8DB0BA48": "Make Save Copyable" - }, - "GFZP01": { - "title": "F-Zero GX", - "F659D22CB1DFF15C3915D7630D838EED8DB0BA48": "Make Save Copyable" - }, - "GGTE01": { - "title": "ChibiRobo!", - "EF128E7A9C22676834F558BA0F0F7FD8B9028727": "16:9 Widescreen [darkludx]", - "5232A937D1D813FF58DD71D716284ED6AB535689": "Simple 60FPS", - "D40344111D989EA009901F8B1C45B5AC8D39E6D2": "Experimental 60fps" - }, - "GGTJ01": { - "title": "ChibiRobo!", - "D62E777A2F019D7BD0AFFBCE876BD9AE408F1667": "Simple 60FPS", - "BEC2310911003AF9E4B984A4051E0F885B8CC825": "Experimental 60fps" - }, - "GGTP01": { - "title": "ChibiRobo!", - "FA9CD330ECDA01275DA88BD0803DE47757D16A4E": "16:9 Widescreen", - "43FAD0DDD130BE1E4C8C7603EF6CA7DAA0DF5EE9": "Simple 60FPS", - "EB1ACD613BB432A3391CFFF1F0145A6ACE66B210": "Experimental 60fps" - }, - "GGVD78": { - "title": "The SpongeBob SquarePants Movie", - "FE52240DF6D132C15A8324E8A477F2BF2250D208": "EFB Copy Fix", - "9D07DBB5EC2FAA47F2E4587FBD75FD6F3E7E91B0": "16:9 Widescreen" - }, - "GGVE78": { - "title": "The SpongeBob SquarePants Movie", - "5E38E10829D5F77243C95E9E41518BB3ADE24139": "EFB Copy Fix", - "86E561452235BF88D41884558EF34F54CE0FEB48": "16:9 Widescreen" - }, - "GGVP78": { - "title": "The SpongeBob SquarePants Movie", - "5E38E10829D5F77243C95E9E41518BB3ADE24139": "EFB Copy Fix", - "F9B2108D833084FA36A53E00F1647A9579F847D3": "16:9 Widescreen" - }, - "GGVX78": { - "title": "The SpongeBob SquarePants Movie", - "740F2D1C01DA39D1760D96B03974A48E6F74578D": "EFB Copy Fix" - }, - "GHAE08": { - "title": "Resident Evil 2", - "9799AFF8463EC86C9230E31E2627E141F0C129D3": "Fix audio issues" - }, - "GHAJ08": { - "title": "Biohazard 2", - "B45A8FC32D14567B8D6C95F303E00A72C0E1D344": "Fix audio issues" - }, - "GHAP08": { - "title": "Resident Evil 2", - "BC7F3CFC97593AA2055C370C175950DC478D2709": "Fix audio issues" - }, - "GHLE69": { - "title": "Harry Potter and the Sorcerer's Stone", - "742BFC79D8F0BA5D6215772B58F5A0EADD7BFAFF": "16:9 Widescreen" - }, - "GHQE7D": { - "title": "The Simpsons: Hit & Run", - "520E5F718D3BD1291C55021776091E0DE0FB4822": "16:9 Widescreen" - }, - "GHQP7D": { - "title": "The Simpsons: Hit & Run", - "AAE14CDC13A0C082A850DED85417100A8C8A0687": "16:9 Widescreen", - "884A33613AE8D916128E3FF39B3AA9F63DAADC58": "60Hz" - }, - "GHSE69": { - "title": "Harry Potter and the Chamber of Secrets", - "3538CDBD13FA939B7BA5F0F82253401AFDD1E2CD": "16:9 Widescreen" - }, - "GHSP69": { - "title": "Harry Potter and the Chamber of Secrets", - "409754E2EBB6F05DEE1AFC647E25B15D462638FF": "16:9 Widescreen" - }, - "GICD78": { - "title": "The Incredibles", - "3A94591A149AE88C150AB3320BBC909FE54BAEA5": "EFB Copy Fix" - }, - "GICE78": { - "title": "The Incredibles", - "5BF55685B8867A85EAA9C86571309B17BF7DED32": "EFB Copy Fix" - }, - "GICF78": { - "title": "The Incredibles", - "85AABAEB9A59C4F96D9330A3B884F6D757DA1683": "EFB Copy Fix" - }, - "GICH78": { - "title": "The Incredibles", - "3A94591A149AE88C150AB3320BBC909FE54BAEA5": "EFB Copy Fix" - }, - "GICJG9": { - "title": "The Incredibles", - "969134EA21A160EBDA91C0870266E7D1707FDC43": "EFB Copy Fix" - }, - "GICP78": { - "title": "The Incredibles", - "13B158CF41F5412BC637F50644193D43CC3DA49A": "EFB Copy Fix" - }, - "GIQE78": { - "title": "The Incredibles: Rise of the Underminer", - "E15AA1E30D26E5735D68AAADE436E7B7E4A33A35": "EFB Copy Fix" - }, - "GIQJ8P": { - "title": "The Incredibles: Rise of the Underminer", - "FFFCB76E98DDB06A7BBBC0AA73C869C87EB787D6": "EFB Copy Fix" - }, - "GIQX78": { - "title": "The Incredibles: Rise of the Underminer", - "485DA99FAB35646DAA2A138B0315361495ABE778": "EFB Copy Fix" - }, - "GIQY78": { - "title": "The Incredibles: Rise of the Underminer", - "485DA99FAB35646DAA2A138B0315361495ABE778": "EFB Copy Fix" - }, - "GK2": { - "title": "Spider-Man 2", - "6B4C59C2A2C5D71C7A38C8513A76E6467E307A26": "16:9 Widescreen [Vague Rant]" - }, - "GK2E52": { - "title": "Spider-Man 2", - "8F2397930A50C3C176188526EB9612578F9CBCE5": "60 FPS" - }, - "GK4": { - "title": "Baten Kaitos Origins", - "4652969A4DA869FD28F2CAA3869A38F5C2AAFEB1": "16:9 Widescreen" - }, - "GKB": { - "title": "Baten Kaitos Eternal Wings and the Lost Ocean", - "4652969A4DA869FD28F2CAA3869A38F5C2AAFEB1": "16:9 Widescreen Region-Free" - }, - "GKBPAF": { - "title": "Baten Kaitos Eternal Wings and the Lost Ocean", - "8E4E0ABA0E6D102A33206F34F4DEE63159B3CB4F": "60Hz" - }, - "GKDP01": { - "title": "Doshin the Giant", - "DF4657937DE730107B636C73E959277EB963D210": "16:9 Widescreen", - "6740D7B914CC897AF50798C0AB391965294FD1E1": "60Hz" - }, - "GKWJ18": { - "title": "DreamMix TV World Fighters", - "696570101FA040778EAD310377C484C846D87430": "16:9 Widescreen" - }, - "GKRPB2": { - "title": "Ribbit King", - "40D06A5C7A3D873ABC73DEDF573738C2E3E37FF0": "60Hz", - "69C01A4F91D991CF866237FED94A138308FC104F": "16:9 Widescreen" - }, - "GKYE01": { - "title": "Kirby Air Ride", - "6520EF1B7D88F00747B120A3A010458602ED989D": "16:9 Widescreen" - }, - "GKYJ01": { - "title": "Kirby Air Ride", - "47B8EF7D02831AA5C375C698797BF2D5475FEFF2": "16:9 Widescreen" - }, - "GKYP01": { - "title": "Kirby Air Ride", - "69413C75036D2975716066E6574461B981FF0124": "16:9 Widescreen" - }, - "GLEE08": { - "title": "Resident Evil 3: Nemesis", - "7355F358CAC6F418D37E4C23E64F7867D46E4FC9": "Fix audio issues" - }, - "GLEJ08": { - "title": "BioHazard 3: Last Escape", - "12B24A6D7389A2AC5AB75FC0BF8493E7661F2A73": "Fix audio issues" - }, - "GLEP08": { - "title": "Resident Evil 3: Nemesis", - "81BD39F5527552DE89E3B59BA86298900F0A3168": "Fix audio issues" - }, - "GLSD64": { - "title": "Gladius", - "5E2A73717BD66EF647846DD64C33BC80AD9B5227": "Fix freeze in opening cutscene" - }, - "GLSE64": { - "title": "Gladius", - "1CE78E7954415A44DF693C0BB879AA5A4FF059A3": "Fix freeze in opening cutscene" - }, - "GLSF64": { - "title": "Gladius", - "009B0C4AD80A9C28C987934D254C2C4AACC9A07A": "Fix freeze in opening cutscene" - }, - "GLSP64": { - "title": "Gladius", - "3D0894616C9A7FA5ED91C1D2F461BF14DF47ECEC": "Fix freeze in opening cutscene", - "8E7A544C10E7A5E2F0304A0D2586879627EF6586": "16:9 Widescreen", - "B67144E87B54246137142992A3BC83DC13BE68A7": "60Hz" - }, - "GM4E01": { - "title": "Mario Kart: Double Dash!!", - "78BE50F93E81A1972CA31ABC318949E366E82BD0": "16:9 Widescreen v2", - "87D1A6A3E29ADA03B0D29C2F1841C18E62DB0A15": "16:9 Menu Backgrounds Add-On" - }, - "GM4P01": { - "title": "Mario Kart: Double Dash!!", - "6D950B6EEFD6D304E1A424355B74A595D32BDF2F": "16:9 Widescreen v2", - "87D1A6A3E29ADA03B0D29C2F1841C18E62DB0A15": "16:9 Menu Backgrounds Add-On" - }, - "GMBE8P": { - "title": "Super Monkey Ball", - "D12DE9E3941BCE6EB50B8DA92140E09AFC0104C8": "16:9 Widescreen", - "0151A6683E1FBFD20096807C54A6952C4A4BAD40": "NA Stretched HUD" - }, - "GMBP8P": { - "title": "Super Monkey Ball", - "8A688981F33A2C53882EF08FCF20B88AD43EF417": "16:9 Widescreen" - }, - "GMOP70": { - "title": "Micro Machines", - "CE4D298616BD42E4D8F8936B325CD1FD7F5B956B": "16:9 Widescreen", - "0CD2CC787A5FF551901E41C85C8AAC02017ECB89": "60Hz" - }, - "GMPE01": { - "title": "Mario Party 4", - "D7249AC3C949FEB860CF4350C5B7B79AC16569F1": "QOL - Show Controller Port Number of Who Paused", - "E232B27564E9AA0C32DE163C9C056317A7B2B12E": "QOL - Allow Digital Presses for Map Screen", - "59607671BFC4717ACAF9807BB7EB0D9F982866D4": "QOL - Automatically Advance Text Boxes", - "CAEA37F3FEF89400513353EB85875F2A3AF4C03E": "QOL - Disable Advance on Results", - "F75FBBD838C5B84FF687962FBA9195B217DE132C": "QOL - Faster Boot Time", - "19F264DE7F07EAC9433CA4B591BEBA1EC976C9F1": "QOL - Increased Board Speed", - "C70391D4961A0E820DE40141C89341369A9F021B": "QOL - Increased Taunt Capabilities", - "F4E6913CF034E5778B9F9CA5FF448FF1B78B3333": "QOL - Instant Text Display", - "93621947019532F02C25937FD3EEEE21A788CB07": "QOL - Rumble Always Off", - "4F98592DB3DEE3857469A8D8605FAF4BD6F7C76D": "16:9 Widescreen" - }, - "GMPJ01": { - "title": "Mario Party 4", - "A795811F2F0C92D9DCABDE97D9E39B47B1DBCEFD": "16:9 Widescreen" - }, - "GMPP01": { - "title": "Mario Party 4", - "A795811F2F0C92D9DCABDE97D9E39B47B1DBCEFD": "16:9 Widescreen" - }, - "GMSE01": { - "title": "Super Mario Sunshine", - "BD718F961DBA5372B1D0257D454D535746C453A0": "Widescreen", - "2805B1A0DD53EB64877D375D10F667700955720F": "60FPS" - }, - "GMSJ01": { - "title": "Super Mario Sunshine", - "E8112A01040A06460E368F142C5D1FD0B4085D94": "16:9 Widescreen" - }, - "GMSJ01r0": { - "title": "Super Mario Sunshine", - "9894B5B6B5215844D48411021FF8EECFE851D79D": "60FPS" - }, - "GMSJ01r1": { - "title": "Super Mario Sunshine", - "2DB69DB7A3753D543CD85CA4C77B4EF0AED7486E": "60FPS" - }, - "GMSP01": { - "title": "Super Mario Sunshine", - "0B7B89BF0868393076EF5F9DBD689DD0EDBCB84C": "Widescreen", - "D07009B710B3BBC6B12E54ED6A7969D58197EDAF": "60FPS" - }, - "GNHE5d": { - "title": "NHL HITZ 2002", - "89393A24E2336841AA4CD0AD3BE1C9A66B89E9EF": "Nop Hack" - }, - "GOCE5D": { - "title": "RoadKill", - "E4D800B90F16A15D9252EED1B2A23AEAF5CD230A": "16:9 Widescreen" - }, - "GOME01": { - "title": "Mario Power Tennis", - "C33CBBF6F22195BF626104B4827200B3EE1CF30C": "16:9 Widescreen" - }, - "GOMP01": { - "title": "Mario Power Tennis", - "874784CCD4AC3DC9C69654E471C18AD0F5E4D9AE": "16:9 Widescreen" - }, - "GONE69": { - "title": "Medal of Honor: European Assault", - "6412A67E1C26E146A9526AFC9F0EE517B214069D": "Widescreen Hack Culling" - }, - "GP4J18": { - "title": "Hudson Selection Vol. 3: Bonk's Adventure", - "BF4D2D6AF66F285E81173B3B20D5369DB6FB351B": "16:9 Widescreen" - }, - "GP5E01": { - "title": "Mario Party 5", - "5BA3648D18346EDC97B23475D4748C637E6095A2": "QOL - Show Controller Port Number of Who Paused", - "41EF84663008668682BB75DC8B874E38669AE041": "QOL - Automatically Advance Text Boxes", - "6C36BEFE751131298BC8B39012892F6A6903CE60": "QOL - Disable Advance on Results", - "8E952E6E12639AC20F6F9FDD150C12F0C294DF43": "QOL - Faster Boot Time", - "4BD72B8ED75ED8EFB3329C104BAD114FDDB8AD2C": "QOL - Increased Board Speed", - "C5BA3C9D386D09DD6CB9242A12A0D041BEB93160": "QOL - Increased Capsule Throwing Speed", - "C360EBDDCB0237076052C983BD9719411CA67CDE": "QOL - Increased Taunt Capabilities", - "2CD4A06A3B9C18CC9EA2A2DEBD96E066CD1D700A": "QOL - Instant Text Display", - "5ED053787332DB5EEB8B963BA5DF197B58C6BB75": "16:9 Widescreen" - }, - "GP5J01": { - "title": "Mario Party 5", - "81E69B6BEE85E06805EC24E1CFEA9405BF459DF8": "16:9 Widescreen" - }, - "GP5P01": { - "title": "Mario Party 5", - "FD4FCCB97C06F0173A30D4CC9A99422B2C0ABA9B": "16:9 Widescreen" - }, - "GP6E01": { - "title": "Mario Party 6", - "E645DF70CE0266D174D917A817A7FBEEE974A9F0": "QOL - Auto Advance Text Boxes", - "B089A3C80D5DA86ABF6258F8BFB1DC78BB54A973": "QOL - Faster Boot Time", - "798E566B621F6A32BF23C588E76EAC0776E2A8A3": "QOL - Disable Advance on Results", - "501C52ACF117950888A66DB2BEDBDFD7D9B20235": "QOL - Increased Board Speed", - "845F439278DA8CBC225658FF4E2F82D707422BFB": "QOL - Increased Orb Throwing Speed", - "0AED27341A06186AD92D5725C0B9693CA8F85B7B": "QOL - Increased Taunt Capabilities", - "5AAC4E21927D4AEE7AC329CE793D4CDAEDDF7A3F": "QOL - Instant Text Display", - "DF5D2F068D76ABF2B1C294D413B9154B8C356929": "QOL - Show Controller Port Number of Who Paused", - "B502AF0887792E9B140516D14BA75F99772C17BE": "16:9 Widescreen" - }, - "GP6J01": { - "title": "Mario Party 6", - "88F50F8298F82E3E5C161277BD4A985CE893A9D0": "16:9 Widescreen" - }, - "GP6P01": { - "title": "Mario Party 6", - "DCCE59CA987624C753F0A86BEBA4287635901C93": "16:9 Widescreen", - "138A86D43B5830BFE1926F58C0A4FBE2971BB02D": "Remove Black Bars" - }, - "GP7E01": { - "title": "Mario Party 7", - "5E6F8C6C87D5944DB18A4E4F9A45F61EE87A4163": "QOL - Show Controller Port Number of Who Paused", - "82338AB5D82A7F398B4EB674CA4866DD1F4A1E65": "QOL - Auto Advance Text Boxes", - "D2F9CC0B9E52136E77187395FB7DA9B64B2C3B30": "QOL - Controller Options Always Acesssible", - "1939B5C575AE8FF6890BDDDD1B3FEA472D8CABA0": "QOL - Faster Boot Time", - "A644551162A61DE7997B2A84F5BFDEFFD3FC2FB5": "QOL - Disable Advance on Results", - "7E06A2EBCFECADB8074152B489984237A6FE9F21": "QOL - Increased Board Speed", - "6671BEE71920D6B845AE1257AFE3AB3B95CD6FBD": "QOL - Increased Orb Throwing Speed", - "9F60923F95FFE709CCD06966CD2DF743263934D1": "QOL - Increased Taunt Capabilities", - "48FA6002E42DA9BB83ABC980A32C60CE3B21C4FC": "QOL - Instant Text Display", - "87EBF72D90503EBC5CE9BC994795669E48A92A4A": "16:9 Widescreen" - }, - "GP7J01": { - "title": "Mario Party 7", - "A081F0729068D233E99DC00C64E36CA33C945640": "16:9 Widescreen" - }, - "GP7P01": { - "title": "Mario Party 7", - "75D6CDA4EA301A71F7701A0487544E79136850B9": "16:9 Widescreen", - "6D0D5B7CA58C38A3147F8ED981B5B21CC6C519CD": "60Hz" - }, - "GPIE01": { - "title": "Pikmin v1.1 NTSC", - "A25CDDB79991F090BD7F12840AD06F13BD5CCF95": "No Blur" - }, - "GPIE01r0": { - "title": "Pikmin v1.0 NTSC", - "2B58166A66644F984E64077A6245C94C79B51063": "16:9 Widescreen" - }, - "GPIE01r1": { - "title": "Pikmin v1.1 NTSC", - "9A1545AB4E2B9216B95AFFA83420D723512DA8C8": "16:9 Widescreen", - "3337C767EAA21D30C6CFEAE9985FFCABFC63E2E3": "60FPS", - "CBD15E9104929F0631713AE482475CB2B90E71F2": "Disable Pikmin optimizations" - }, - "GPIP01": { - "title": "Pikmin PAL", - "4ED79A548DBD7DBD35928A2F1138315FF103E260": "Turn off blur", - "5AE44D5B0E0D4C412B453B95CF5A41DBA4D685E6": "16:9 Widescreen", - "AE59FF751E167632AE283F38CC4B96BDF7B9B81F": "60Hz" - }, - "GPNE08": { - "title": "P.N.03", - "ED3D9BB08C5F1D21BC8D5C73155C00E3C25C466F": "16:9 Widescreen [Ralf, darkludx]" - }, - "GPNP08": { - "title": "P.N.03", - "469B18FE8219031D355557B836EF02B625040A4F": "16:9 Widescreen [Ralf]" - }, - "GPOE8P": { - "title": "PHANTASY STAR ONLINE EPISODE I&II", - "17EB6CFB408EF27D44C053A1336C3B87B6A05018": "Save Validation Code v1.2/Plus", - "304DB311F2107E88EBCE058535B266F9263AA8E2": "Make Save Copyable NTSC Port - PLUS/1.2", - "9F6259132453DCC0607EAB35DB182C76818F2F9F": "Save Validation Code v 1.0/v1.1", - "7A4B3E596BA4FDA8F3FCF984079B3F44CB2D6AB3": "Make Save Copyable NTSC Port - 1.0/1.1" - }, - "GPOE8Pr0": { - "title": "PHANTASY STAR ONLINE EPISODE I&II", - "99986BB1D4ABE45C429D48B01BFB578FEA69C14F": "16:9 Widescreen" - }, - "GPOE8Pr1": { - "title": "PHANTASY STAR ONLINE EPISODE I&II", - "5563671A6702785FFE106DAB7EF3F4FE6D9F705B": "16:9 Widescreen (Plus) [Ralf]" - }, - "GPOP8P": { - "title": "PHANTASY STAR ONLINE EPISODE I&II", - "40EC1590DB26C7C58D00E3065F1E404341EF0E73": "Game Save Valid", - "2F5FB98927DAFF141D1CCD1EACA8AF626397E284": "Game Save copyable", - "DF133C61C29D5CFA87A2A785C962C205F80E6D04": "16:9 Widescreen" - }, - "GPVE01": { - "title": "PIKMIN 2 NTSC", - "E5B51080CFD518FE584CF3B61A1099CD032479D6": "16:9 Widescreen", - "271C40F5FC113896717DB0EEFED42E788CA3AC81": "60 FPS" - }, - "GPVP01": { - "title": "PIKMIN 2 PAL", - "78F3C9A789827B063A6701987262276A66ABD82B": "16:9 Widescreen" - }, - "GQPE78": { - "title": "SpongeBob SquarePants: Battle for Bikini Bottom", - "880B114E9A308084CAB92C004A9EE067B371C310": "EFB Copy Fix" - }, - "GQPP78": { - "title": "SpongeBob SquarePants: Battle for Bikini Bottom", - "5D9A14954AE8D639C9B254F3BA73A70F284BBC8D": "EFB Copy Fix" - }, - "GQSDAF": { - "title": "TALES OF SYMPHONIA 1", - "CA82C44B2E8FC5C184E3FF935BC89661B7DB55D6": "16:9 Widescreen", - "952165FD78543EB6D2F5230F7570B0513773D332": "60Hz", - "DEB7DF358423F0EF30C9FD49F4F14590836D52A6": "No Blur" - }, - "GQSEAF": { - "title": "TALES OF SYMPHONIA 1", - "EF448CF1FA6A15EB2661EA5338703C13D52EF65B": "Remove Blur", - "48AFE1D32843C6B5AD4337A49F15FD447DF2A752": "16:9 Widescreen" - }, - "GQSFAF": { - "title": "TALES OF SYMPHONIA 1", - "76C30E1737CC5C3B5DE32532B5F9A5CD50B690F8": "16:9 Widescreen", - "986BAE5103CDE9286D2D34FD28FE2540D0759AAB": "No Blur" - }, - "GR2E52": { - "title": "Lost Kingdoms II", - "5F55CE7DA7E1E3261CF2FF88F34CDA63BA511003": "16:9 Widescreen" - }, - "GR2J52": { - "title": "Lost Kingdoms II", - "D3C6FA690BED07BFA65C2E1FCDE2FFA5AA0EEEE4": "16:9 Widescreen" - }, - "GR2P52": { - "title": "Lost Kingdoms II", - "D7BCADD4E76B5E3F7D9D463F55A2777528E37E94": "16:9 Widescreen" - }, - "GRNE52": { - "title": "LOST KINGDOMS", - "483D74C47AD1012606D591A226AB3144C7FB201C": "16:9 Widescreen" - }, - "GRNJ52": { - "title": "LOST KINGDOMS", - "949281B7221B20680B7BC29E4754B73A326EBE85": "16:9 Widescreen" - }, - "GRNP52": { - "title": "LOST KINGDOMS", - "11051B094FE5A8B2E73060BFF786C1588E36979A": "16:9 Widescreen" - }, - "GROE5Z": { - "title": "Road Trip: The Arcade Edition", - "FADBAB5EC280CF8ED4C9536A33F4184BA210C9B0": "16:9 Widescreen" - }, - "GRYE41": { - "title": "Rayman Arena", - "AF0A575EB6071EAC0D2EC3D2EA30A23EB05A4192": "Disable Culling to Fix Rise and Shrine Hang" - }, - "GSAE01r0": { - "title": "Star Fox Adventures", - "0D529180B9B28BB06E21EDBDBA61C17EEF0FFB7F": "viWidth 704 Aspect Ratio Fix" - }, - "GSAE01r1": { - "title": "Star Fox Adventures", - "CB15ED22625690A5DBE4607FE30160125421461D": "viWidth 704 Aspect Ratio Fix" - }, - "GSAP01": { - "title": "Star Fox Adventures", - "749EDA62B1B73354599929F1B50E992E111C5493": "viWidth 704 Aspect Ratio Fix" - }, - "GSNE8P": { - "title": "Sonic Adventure 2 Battle", - "D90F66C0D46D9BEF27C8E13BC8804DB1F382C8B1": "60Hz Aspect Ratio Fix", - "CFDF3FA5B48B347E49E8E521D7BE47FCC9A5CBF4": "16:9 Widescreen" - }, - "GSNJ8P": { - "title": "Sonic Adventure 2 Battle", - "98DF9D67DE77F66A4B09F25C5621805DEB40865B": "60Hz Aspect Ratio Fix" - }, - "GSNP8P": { - "title": "Sonic Adventure 2 Battle", - "D90F66C0D46D9BEF27C8E13BC8804DB1F382C8B1": "60Hz Aspect Ratio Fix" - }, - "GSO": { - "title": "Sonic Mega Collection (US)", - "0D60D0593F6DA28B1236381B22082506B9533F0E": "16:9 Widescreen Region Free" - }, - "GSPE69": { - "title": "The Simpsons: Road Rage", - "80E18A8963F4EFD3C03494C95934452FCB6E521B": "16:9 Widescreen" - }, - "GSPP69": { - "title": "The Simpsons: Road Rage", - "162E87E9F5511CD82216811055836C11B374C45B": "16:9 Widescreen", - "E5DF2DF34D2F0BDEE4205C891576511EC572C5DC": "60Hz" - }, - "GSWE64": { - "title": "Star Wars Rogue Squadron II: Rogue Leader", - "6480326CCA8FF64A4868EC6E9FDE9F38819A75A1": "16:9 Widescreen", - "85F65E4B627641862C1A6091D29A3BB0626B04C3": "Disable Dithering" - }, - "GTEE01": { - "title": "1080: Avalanche", - "6B57EBCB9CC0ACE2EDA0F13E3F1F55F3FABC3A26": "16:9 Widescreen" - }, - "GTEP01": { - "title": "1080: Avalanche", - "72785784363C46180AF8E388348FD77667E7D382": "16:9 Widescreen" - }, - "GTOJAF": { - "title": "TALES OF SYMPHONIA 1", - "53A2EDF113F2ED7E54A16AA0E73FDB2C44C79DE5": "Remove Blur" - }, - "GTZE41": { - "title": "Disney's Tarzan Untamed", - "ECCE87E0006475C73E7D936AA0150BD20166F9EF": "16:9 Widescreen" - }, - "GTZP41": { - "title": "Disney's Tarzan Untamed", - "62D8F159B93167171E0860D96C4BB32A5BF5648B": "16:9 Widescreen" - }, - "GU2D78": { - "title": "2 Games in 1: The Incredibles / Finding Nemo", - "CFF4C3F932B08732627572EDA1A0CD2D9C71AE0C": "EFB Copy Fix" - }, - "GU2F78": { - "title": "2 Games in 1: The Incredibles / Finding Nemo", - "CFF4C3F932B08732627572EDA1A0CD2D9C71AE0C": "EFB Copy Fix" - }, - "GU3D78": { - "title": "2 Games in 1: The SpongeBob SquarePants Movie / Tak 2: The Staff of Dreams", - "8A0E3114862ADFE421874211BD6F5220AA425BF5": "EFB Copy Fix" - }, - "GU3X78": { - "title": "2 Games in 1: The SpongeBob SquarePants Movie / Tak 2: The Staff of Dreams", - "E3303FDAE7ECA17A72EDC440C32D94648A6453A0": "EFB Copy Fix" - }, - "GU4Y78": { - "title": "2 Games in 1: Nickelodeon SpongeBob Schwammkopf: Der Film + Nickelodeon SpongeBob Schwammkopf: Schlacht um Bikini Bottom", - "D54767785E139A8BC8C4B75573FBD5A0B686D8E3": "EFB Copy Fix" - }, - "GUNE5Dr0": { - "title": "Gauntlet - Dark Legacy", - "C942EBCBE8A487C25E296EC1FAC2358DA1487DBD": "16:9 Widescreen", - "A441630EC5FF0EB74D2243A3092D22E69C6BEA02": "60Hz" - }, - "GUNE5Dr1": { - "title": "Gauntlet - Dark Legacy", - "39BD84CBE2AFACFEDEC5E9020D1A8B0D36DD53F9": "16:9 Widescreen", - "05779F1A3D0C43305D52A95447D612CB424942C0": "60Hz" - }, - "GUNP5D": { - "title": "Gauntlet - Dark Legacy", - "FE3BA1DAA1AF278A7839E27BF466B0BA0B390EC2": "16:9 Widescreen", - "3B20499A3F8D1D7CCA5B0015F2D80ECED25842A6": "50Hz" - }, - "GV4E69": { - "title": "MVP Baseball 2005", - "8679891FCAA250FCFF670B26E0CB9875900D17FD": "Fix 2D Rendering" - }, - "GVJE08": { - "title": "Viewtiful Joe", - "09EFDA75D876A675121C8344D8FDD09A70A1A846": "16:9 Widescreen" - }, - "GVJP08": { - "title": "Viewtiful Joe", - "93938F4C6112C91549F2B52E6259170F7501EC07": "16:9 Widescreen" - }, - "GVPE69": { - "title": "MVP Baseball 2004", - "3159CA79B0A890131763EA6CB163684BEE886E3F": "Fix 2D Rendering" - }, - "GVSE8P": { - "title": "Virtua Striker 2002", - "4CE9C491160A4B631142EE9CE802C694163F1CA3": "16:9 Widescreen" - }, - "GWRE01": { - "title": "WAVE RACE / BLUE STORM", - "AC42770B06662BE1DC863EC80F44B5E034C63664": "16:9 Widescreen" - }, - "GWRP01": { - "title": "WAVE RACE / BLUE STORM", - "9DDDFAB28C4BD35CF64050E1EF684DC042B1AFFA": "16:9 Widescreen" - }, - "GWWE01": { - "title": "WARIO WORLD", - "98B2E75D8E1CED4A964D3129A5DC10E30538CAA6": "16:9 Widescreen" - }, - "GWWJ01": { - "title": "WARIO WORLD", - "2DAD9A5E2A140F02CCBA727C4BE7C74BAC156778": "16:9 Widescreen" - }, - "GWWP01": { - "title": "WARIO WORLD", - "2DAD9A5E2A140F02CCBA727C4BE7C74BAC156778": "16:9 Widescreen" - }, - "GWZE01": { - "title": "Dance Dance Revolution: Mario Mix", - "9EFC191DE6D21A1681FE241AB2EE4A131259F317": "16:9 Widescreen" - }, - "GXCE01": { - "title": "Custom Robo", - "901A1E78A3A0124F55548507D3B3707125C64A8A": "16:9 Widescreen" - }, - "GXSE8P": { - "title": "Sonic Adventure DX", - "4214C74DFB8A74FC3AA4A643E869BC4D9A38EDA0": "Aspect Ratio Fix", - "F50BBA440184FC77A4DFFAA58FF2BB888E2E072F": "16:9 Widescreen" - }, - "GXSJ8P": { - "title": "Sonic Adventure DX", - "227909607984BBC3D36AAC7DB9DFE385F3363C49": "Aspect Ratio Fix" - }, - "GXXE01": { - "title": "Pokémon XD: Gale of Darkness", - "64FAA15062F0D0C319F904BBDE9C4489A25D6369": "Allow Memory Card saving with Savestates", - "2CA66DFAB3CC67D76AE06A378B1F0E9CBA5F3D68": "16:9 Widescreen" - }, - "GXXJ01": { - "title": "ポケモンXD 闇の旋風ダーク・ルギア", - "8293802260536FA2EF2EFDAB5266DE36BB88DE1B": "Allow Memory Card saving with Savestates" - }, - "GXXP01": { - "title": "Pokémon XD: Gale of Darkness", - "3CAFBC4AE6FC5CE9F53377F86AB5BD8F1BC8861A": "Allow Memory Card saving with Savestates", - "02716B2585BEE74F8FCDD97A78F6A0D3DC7F331B": "16:9 Widescreen" - }, - "GYFPA4": { - "title": "Yu-Gi-Oh! The Falsebound Kingdom", - "402ED10AC842041AB4B39AE8F2D81B2D7AEF9CB4": "60Hz" - }, - "GZ2E01": { - "title": "The Legend of Zelda: Twilight Princess [GC]", - "FCB673D46E716C7F63C618B8D8BF83AEE0B501F0": "Hyrule Field Speed Hack", - "E7521ED27BFC972628906CBE8D5403ED57253BB8": "16:9 Widescreen v2" - }, - "GZ2J01": { - "title": "The Legend of Zelda: Twilight Princess [GC]", - "FCB673D46E716C7F63C618B8D8BF83AEE0B501F0": "Hyrule Field Speed Hack", - "F985A0A58D8E2B23E8A557FAFF8D367AFFEADD07": "16:9 Widescreen" - }, - "GZ2P01": { - "title": "The Legend of Zelda: Twilight Princess [GC]", - "0F63623D4D984B7706F718F57C0ABDB6DBADCF8D": "Hyrule Field Speed Hack", - "CAC38B0D334B925A57AA3118D35932B8A185137E": "16:9 Widescreen v2" - }, - "GZ3E70": { - "title": "Dragon Ball Z 2", - "167F9E9A9B372CB3A01F308B46FF1403F8599C51": "16:9 Widescreen", - "2E163CB5FE724EB49B31CF607E5B9AFDA031DDD5": "Deinterlacing Fix" - }, - "GZDP70": { - "title": "Godzilla: Destroy All Monsters Melee", - "2E424E0BBAE6EF5D6A8FB4224EA1D0746BAC37D3": "16:9 Widescreen" - }, - "GZLE01": { - "title": "The Legend of Zelda The Wind Waker", - "78EA34CEF8E01701491C280F155F1C12EC9BF1A2": "Remove Distance Blur", - "9FA864EE7DD8CE7FF538EB4E0243F20137430BD8": "16:9 Widescreen" - }, - "GZLJ01": { - "title": "The Legend of Zelda The Wind Waker", - "E03B61989025CA33937E63A057E6E40A403811BC": "16:9 Widescreen" - }, - "GZLP01": { - "title": "The Legend of Zelda The Wind Waker", - "14BECBEA4DD281EBD0F7FE7DEE8020B6F2418ACD": "Remove Distance Blur", - "3EFFF6C52B5633A1729FAA6883D8579E77F7D057": "16:9 Widescreen" - }, - "GZPE70": { - "title": "Zapper: One Wicked Cricket", - "7142F2495507AC7136992128ED0FCA6BC72B61F4": "16:9 Widescreen" - }, - "GZPP70": { - "title": "Zapper: One Wicked Cricket", - "591FD6C9668C79FF1CE8558EBED2486A7A327F05": "16:9 Widescreen", - "A59B84DB5486521AEE1C23B6C741ECD35216E5AD": "60Hz" - }, - "GZSE70": { - "title": "Zoids: Battle Legends", - "8E86EAC7EA4F4D2854DD9020CD795630CA64C4EE": "16:9 Widescreen" - }, - "HAF": { - "title": "Forecast Channel", - "181195871F63B89B1CF09AFA4420CF89B9883108": "BufferPatch" - }, - "HAL": { - "title": "Region Select", - "AD12237401ABE9FE4A545AADB5C5AE10355E2076": "RSAPatch" - }, - "RGQE70": { - "title": "Ghostbusters", - "5F4CF8D4DA19A0FF74FF9EB925AC0236069BFD59": "crashfix" - }, - "RLEEFS": { - "title": "Ten Pin Alley 2", - "793642AC6862C2F3412035A9E3D7172CC4A1D5C7": "Fix crash on main menu" - }, - "RM8E01": { - "title": "Mario Party 8", - "BCC4279F8B28636AD773F01540E78DF40EAD6087": "QOL - Faster Boot Time", - "B65AF1819966CD3435D88801E8C79704E3A52DB5": "QOL - Increased Board Speed", - "66495D7CB532FAE778AFC22CF45D17D0FFDE5310": "QOL - Increased Taunt Capabilities", - "B4186DDC54F33F4D6A22188EF50CEB43FB205673": "QOL - Increased Text Display", - "9D90A9C66AE8AD91B201B40C4145D1323B701A77": "QOL - Invert IR Stick for GameCube Mod", - "330DD53AB993A99576564FEFD222D7BD211B878F": "QOL - Remove Explanations", - "25223F9EFAABF601CAC7810004F124E4056598B1": "Extra - Disable Music", - "E61344EB1542A78D497981C307B6549985C7A05A": "16:9 Widescreen" - }, - "RM8J01": { - "title": "Mario Party 8", - "A140BDCB8E1721CB6B4CD878E412113322258B57": "16:9 Widescreen" - }, - "RM8P01": { - "title": "Mario Party 8", - "F664C32AFD3D785FC6E04D8990A3FA1C72A18C5C": "16:9 Widescreen" - }, - "RMHE08": { - "title": "Monster Hunter Tri", - "CCF233DA57B3E75221870DE502955114B0D4E7FA": "Bloom OFF" - }, - "RMHJ08": { - "title": "Monster Hunter Tri", - "29D3625B7ED577587E56AA07CB0EB8C47C97E823": "Bloom OFF" - }, - "RMHP08": { - "title": "Monster Hunter Tri", - "1720C1173D4698167080DBFC4232F21757C4DA08": "Bloom OFF" - }, - "RO2P7N": { - "title": "OFF ROAD", - "EEE9C8DE4671C18DD7F81DD08D39B64C57600DEA": "Hangfix" - }, - "RPBE01": { - "title": "Pokemon Battle Revolution", - "775ABECA6073E02C5C68CF4D644194D966A418F5": "Fix black screen effects" - }, - "RPBJ01r0": { - "title": "Pokemon Battle Revolution", - "0EAB5D8DE827894AFEF97C10ACB67378E6983323": "Fix black screen effects" - }, - "RPBJ01r1": { - "title": "Pokemon Battle Revolution", - "4905E08643E9D00136F7EAF51978CF2F54D10D07": "Fix black screen effects" - }, - "RPBJ01r2": { - "title": "Pokemon Battle Revolution", - "4905E08643E9D00136F7EAF51978CF2F54D10D07": "Fix black screen effects" - }, - "RPBP01": { - "title": "Pokemon Battle Revolution", - "82AEB60F9A9083F93060531A970FFAABE0833A40": "Fix black screen effects" - }, - "RTH": { - "title": "Tony Hawk's Downhill Jam", - "812EE46AC967BFCD239335B10A664D71A93E8175": "Disable blur" - }, - "RX4E4Z": { - "title": "Casper's Scare School: Spooky Sports Day", - "9E4E0F1465A9A1E85349DBA3B1278AC215A97DBB": "Fix file reads (dcache bypass)" - }, - "RX4PMT": { - "title": "Casper's Scare School: Spooky Sports Day", - "EE85907C03F0295794821383B93F8D5B91D2697A": "Fix file reads (dcache bypass)" - }, - "RZDE01r0": { - "title": "The Legend of Zelda: Twilight Princess [Wii]", - "15EAD073414C9903D6CAE5229DCE582BD17A9162": "Hyrule Field Speed Hack" - }, - "RZDE01r2": { - "title": "The Legend of Zelda: Twilight Princess [Wii]", - "27395CC8BC2C51201D566657D31A471A850482FB": "Hyrule Field Speed Hack" - }, - "RZDJ01": { - "title": "The Legend of Zelda: Twilight Princess [Wii]", - "B3F7473F8C911A32F1D616491C9E78EBBD7A6309": "Hyrule Field Speed Hack" - }, - "RZDK01": { - "title": "The Legend of Zelda: Twilight Princess [Wii]", - "A280C0114B800D7DC056ECFB5E482229DA0B1550": "Hyrule Field Speed Hack" - }, - "RZDP01": { - "title": "The Legend of Zelda: Twilight Princess [Wii]", - "2A83ADFB760F9498841ED0ED68B0C0438232472C": "Hyrule Field Speed Hack" - }, - "SAOE78": { - "title": "Monster High: Ghoul Spirit", - "EA11FA4908FB20B61876ACD360EC7657A6D39FB2": "Fix crash on boot" - }, - "SAOEVZ": { - "title": "Monster High: Ghoul Spirit", - "AA55C214DE7545DE0E203CC39F06BF3D31451BE9": "Fix crash on boot" - }, - "SGLEA4": { - "title": "Gormiti: The Lords of Nature!", - "258378187ACF475A55EFEAF8A703681252E014C3": "Fix black screen" - }, - "SGLPA4": { - "title": "Gormiti: The Lords of Nature!", - "6F8CD59D897338CA90939149E1A62588620C6D88": "Fix black screen" - } -} +{"D43J01":{"loophack":"CAB9CED2D904F12CCB21F5B1DE9B5433620C3E13"},"DPOJ8P":{"Bypass Modem Detection":"90BA66E25640A538FEFA6693715718139079FA7B"},"G2BE5G":{"Disable interlaced rendering":"7FFF6BDD93713BEDFD23739C32B86153FA19AEA0"},"G2BP7D":{"Disable interlaced rendering":"56E85D7285F10348E1E5354E379918D07E79EDA9"},"G2VE08":{"16:9 Widescreen":"3ED033396382424533A263A39687A0961EC994A6"},"G2VP08":{"16:9 Widescreen":"EEBC3C5F04BB70AFCA1A4C3D638335CDC9142BA2"},"G3RP52":{"16:9 Widescreen":"7F6B7743F0DDD3704B15882330E490103AE24E36","60fps":"4C9A8572A35F1DB85BBB2F32ED34288A343F1FC0"},"G3YP52":{"16:9 Widescreen":"3D102AFEE2F4945894E74BB702ED3ED2294C6FEC","Force PAL60":"FD61581C593EA34DD358AE33819FAB310F2CE961"},"G4AEE9":{"16:9 Aspect Ratio Fix":"8C2564CF47BB6A9B57D712C90E17F459B0BB6CCD"},"G4ME69":{"16:9 Widescreen":"6FC6E5D91693FAABE25CC721F2121CB0B5CA9D12"},"G5SE7D":{"16:9 Widescreen":"16119398BFE241A84151C046E0BC5BCF89D22049","Remove Bloom":"A5F2FB2B3BFF61F34F8AB1DD5A912A0FD8DFA720"},"G5SP7D":{"16:9 Widescreen":"718AA8BD831961C33114852FDA75BB58F768F46A"},"G8ME01":{"16:9 Aspect Ratio Fix - Centered HUD":"8C2FC3FC6F7766AA8E87425BF3BDD2E46E73DE71","16:9 Aspect Ratio Fix - Centered HUD with letterboxing":"AE3DBE2604CA0660165CA870C4B80E2B523C9475","16:9 Aspect Ratio Fix - Normal HUD":"F6E8264CF14D0189219C1E2D20C4182F190F4B88","16:9 Aspect Ratio Fix - Stretched HUD":"8EA4C7B80ADE3E8FEC28EEFA3A046B6B04162E81"},"G8MJ01":{"16:9 Aspect Ratio Fix - Centered HUD":"B3181CA1AAB11EAE9132184DA48D76E775AC0A24","16:9 Aspect Ratio Fix - Centered HUD with letterboxing":"904C0EEEF16D761F7BDF7099DEB384DD9AB26E00","16:9 Aspect Ratio Fix - Normal HUD":"631CE99BDE3F1475303C00C67E3C130D4EB2547B","16:9 Aspect Ratio Fix - Stretched HUD":"81F7AD591F12A01DE82850457ECF147998D1238F"},"G8MP01":{"16:9 Aspect Ratio Fix - Centered HUD":"75AF5D7FA49BE9C3C73EA1482B49CD9B36CE817E","16:9 Aspect Ratio Fix - Centered HUD with letterboxing":"C2E5003E74551DF693A7CB814850CA51D77549EF","16:9 Aspect Ratio Fix - Normal HUD":"FB26AA84B0CB787705E84E869B649307776A2839","16:9 Aspect Ratio Fix - Stretched HUD":"C5F8A81520193418C07C7BC4881F02BE9C4DC9BC"},"G9SE8P":{"16:9 Widescreen":"CD043229AC47AC93D537B6A0725A2D0BB6FEF4E8"},"G9SJ8P":{"16:9 Widescreen":"C55EF90B542AA3973352A232629A828BC22A8509"},"G9SP8P":{"16:9 Widescreen":"9521774ADEE769CFCCE86F8170FE626387E73019"},"GAFE01":{"16:9 Widescreen":"D24F6D9BE5D79D3C795C2844634A0214BB68B5DA","Make Game Save Copyable (donny2112)":"F9A812FF62A20D5440CAB79DB6AFAE068457A10E"},"GAL":{"Trophy Viewer":"DBDB50216B22CDFFF77BDD80261CD0FF75803D3B"},"GALE01r0":{"Normal C Stick Functionality in Singleplayer Modes":"9DC8D90D986FAC175F45006AFF20CF00EDFBE053","Proper 16:9 Widescreen Support":"18B4159E77013EDFE499A33281B771C442970E3B","Properly Display in 4:3":"DC2BCA7D99EBDE1DC7C68CA6AC7F543B93FD6A67"},"GALE01r1":{"Normal C Stick Functionality in Singleplayer Modes":"F6030959C1CAC92F37287D556F18B3C5298FAD5B"},"GALE01r2":{"Disable Rumble":"CFDEEA8AD2A99394BFFEA7211EF03394E7471FA9","Normal C Stick Functionality in Singleplayer Modes":"BCD918A72368B2A30E797C76994E7539A1C0B5D9","PAL Stock Icons":"6B92D95F0EEA165EA84FD753F74B0A9E2079C2D7","Proper 16:9 Widescreen Support":"CEDF18354CDCFC49398551C629E51B053331A55B","Widescreen Support v1.2 [Dan Salvato]":"D32ED4CD685F3FF649F7E749E8C182C657013918"},"GALP01":{"Normal C Stick Functionality in Singleplayer Modes":"4817F202678559291F9F76B46DC7561A45D00B77","Proper 16:9 Widescreen Support":"BFCBE098FE8679B9140A48EA1D8620D5A369697C","Properly Display in 4:3":"5BA2933B8365E21553AA273B91954A4C722B1035"},"GAZE69":{"60FPS":"BC281053C5266B21FDDC6C8996A6021DEA03D459"},"GBLE52":{"16:9 Widescreen":"C0F3AB3BBC9B21F4BF25F44E48CF1CD36D2B3F45"},"GBLP52":{"16:9 Widescreen":"797040CB097BFD369490A1BE29659929D76CE6F7"},"GBRJ18":{"16:9 Widescreen":"B3C867AB34D90E2E9C5B799D800F4C191DE279FA"},"GBSE8P":{"16:9 Widescreen":"4148D453F61A5B81E53669335BC667E651865C76"},"GBSP8P":{"16:9 Widescreen":"6CB029AE768BA5B9995D5F12C1EBB37B3D1FE242"},"GC6E01":{"16:9 Widescreen":"DE932CCAD1B5EB1FAA8D08733BD0D3940C78382A","Allow Memory Card saving with Savestates":"2F64F98686E62B60E466E931A9EBCD19A750FF4E"},"GC6J01":{"16:9 Widescreen":"5CB4934396ABD43F7147EA13521C952728933874","Allow Memory Card saving with Savestates":"D8F327304A88FBC717BB1F775494C5F864B9E8D2"},"GC6P01":{"16:9 Widescreen [Ralf]":"05C9016BF58A628A3FD7B16E1B9BB0769A14846F","Allow Memory Card saving with Savestates":"EDEE0E28EEA1834868F2865336290FFBDFB9C6DA"},"GC8JA4":{"Fix C4 texture tiling (used for buttons and some character icons)":"843297019804192AF1FC660BC85F4B10891D0BA3"},"GCBE7D":{"16:9 Widescreen":"478DA1D596D8513C343850719155813CB61A56DD"},"GCBP7D":{"16:9 Widescreen":"478DA1D596D8513C343850719155813CB61A56DD","60Hz":"DF2C4DDF082C9E67919443C5ACC485AB2CF7F8D0"},"GCCE01":{"16:9 Widescreen":"BA0066518E7EA8599A81F8496BD39DE20CC369D6","Fix GBA connections":"483BDB94615C690045C3759795AF13CE76552286","Fix buffer overrun bug (crash at Goblin Wall)":"6C107FEC15C76201233CA2645EB5FAB4FF9751CE"},"GCCJGC":{"Fix GBA connections":"4C104D24329172F5D0F8649DE9423B931FE72CA3"},"GCCP01":{"16:9 Widescreen":"2580E7379633CF4DE13B9EC945DB17543477828A","Fix GBA connections":"2EAA60A8A115AD68A795109FB59E4A726D29016D"},"GCN":{"Fix C4 texture tiling (used for buttons and some character icons)":"601FE183C9524ACCF068874DABD73921C86769CF"},"GCVEEB":{"16:9 Widescreen":"ADA686C90189D1D7D23E23E525EFC96EFA104BB9"},"GD7E70":{"Deinterlacing Fix":"95A17AFAAFD83E96CD1CC6242B8667F6A3DC8416"},"GDREAF":{"Fix audio issues":"F8EAE60FEB0CFB4477FDC4B9E136B63F68DFA63A"},"GDRP69":{"Fix audio issues":"E23D98B2CE185C3993A40F2495D37E41B971BF91"},"GEDE01":{"Fix startup hang":"21068C3CE905FB0CFFAA7408A93154AF8A5295A2"},"GEDJ01":{"Fix startup hang":"7061F3CF11BF64D3BA7F32CCF2BAC42FF3614AB6"},"GEDP01":{"Fix startup hang":"6F1B00517CBA30BEB738EAA90E71221378CD570D"},"GEME7F":{"Force Progressive Scan":"CB04E00918C9C0F161715D21D046ED6620F7ADEF"},"GEMJ28":{"Force Progressive Scan":"CC2057185BB10DAD4A361412D024DFD586EE0130"},"GEZE8P":{"16:9 Widescreen [gamemasterplc]":"5CEBCFBEA4E444495D2FD6D8B6607DFB2349CC1B"},"GF7E01":{"16:9 Widescreen [gamemasterplc]":"C59CCA3EF8A5E97B32EB64DB9AE80E652ED281C6"},"GF7P01":{"16:9 Widescreen [gamemasterplc]":"1230053B5C347B62E432EFD6635433A183D18619"},"GFQEA4":{"16:9 Widescreen":"5CD9568CE58EF82EB371594667015C9B799454B9"},"GFZJ01":{"Make Save Copyable":"F659D22CB1DFF15C3915D7630D838EED8DB0BA48"},"GFZP01":{"Make Save Copyable":"F659D22CB1DFF15C3915D7630D838EED8DB0BA48"},"GGTE01":{"16:9 Widescreen [darkludx]":"EF128E7A9C22676834F558BA0F0F7FD8B9028727","Experimental 60fps":"D40344111D989EA009901F8B1C45B5AC8D39E6D2","Simple 60FPS":"5232A937D1D813FF58DD71D716284ED6AB535689"},"GGTJ01":{"Experimental 60fps":"BEC2310911003AF9E4B984A4051E0F885B8CC825","Simple 60FPS":"D62E777A2F019D7BD0AFFBCE876BD9AE408F1667"},"GGTP01":{"16:9 Widescreen":"FA9CD330ECDA01275DA88BD0803DE47757D16A4E","Experimental 60fps":"EB1ACD613BB432A3391CFFF1F0145A6ACE66B210","Simple 60FPS":"43FAD0DDD130BE1E4C8C7603EF6CA7DAA0DF5EE9"},"GGVD78":{"16:9 Widescreen":"9D07DBB5EC2FAA47F2E4587FBD75FD6F3E7E91B0","EFB Copy Fix":"FE52240DF6D132C15A8324E8A477F2BF2250D208"},"GGVE78":{"16:9 Widescreen":"86E561452235BF88D41884558EF34F54CE0FEB48","EFB Copy Fix":"5E38E10829D5F77243C95E9E41518BB3ADE24139"},"GGVP78":{"16:9 Widescreen":"F9B2108D833084FA36A53E00F1647A9579F847D3","EFB Copy Fix":"5E38E10829D5F77243C95E9E41518BB3ADE24139"},"GGVX78":{"EFB Copy Fix":"740F2D1C01DA39D1760D96B03974A48E6F74578D"},"GHAE08":{"Fix audio issues":"9799AFF8463EC86C9230E31E2627E141F0C129D3"},"GHAJ08":{"Fix audio issues":"B45A8FC32D14567B8D6C95F303E00A72C0E1D344"},"GHAP08":{"Fix audio issues":"BC7F3CFC97593AA2055C370C175950DC478D2709"},"GHLE69":{"16:9 Widescreen":"742BFC79D8F0BA5D6215772B58F5A0EADD7BFAFF"},"GHQE7D":{"16:9 Widescreen":"520E5F718D3BD1291C55021776091E0DE0FB4822"},"GHQP7D":{"16:9 Widescreen":"AAE14CDC13A0C082A850DED85417100A8C8A0687","60Hz":"884A33613AE8D916128E3FF39B3AA9F63DAADC58"},"GHSE69":{"16:9 Widescreen":"3538CDBD13FA939B7BA5F0F82253401AFDD1E2CD"},"GHSP69":{"16:9 Widescreen":"409754E2EBB6F05DEE1AFC647E25B15D462638FF"},"GICD78":{"EFB Copy Fix":"3A94591A149AE88C150AB3320BBC909FE54BAEA5"},"GICE78":{"EFB Copy Fix":"5BF55685B8867A85EAA9C86571309B17BF7DED32"},"GICF78":{"EFB Copy Fix":"85AABAEB9A59C4F96D9330A3B884F6D757DA1683"},"GICH78":{"EFB Copy Fix":"3A94591A149AE88C150AB3320BBC909FE54BAEA5"},"GICJG9":{"EFB Copy Fix":"969134EA21A160EBDA91C0870266E7D1707FDC43"},"GICP78":{"EFB Copy Fix":"13B158CF41F5412BC637F50644193D43CC3DA49A"},"GIQE78":{"EFB Copy Fix":"E15AA1E30D26E5735D68AAADE436E7B7E4A33A35"},"GIQJ8P":{"EFB Copy Fix":"FFFCB76E98DDB06A7BBBC0AA73C869C87EB787D6"},"GIQX78":{"EFB Copy Fix":"485DA99FAB35646DAA2A138B0315361495ABE778"},"GIQY78":{"EFB Copy Fix":"485DA99FAB35646DAA2A138B0315361495ABE778"},"GK2":{"16:9 Widescreen [Vague Rant]":"6B4C59C2A2C5D71C7A38C8513A76E6467E307A26"},"GK2E52":{"60 FPS":"8F2397930A50C3C176188526EB9612578F9CBCE5"},"GK4":{"16:9 Widescreen":"4652969A4DA869FD28F2CAA3869A38F5C2AAFEB1"},"GKB":{"16:9 Widescreen Region-Free":"4652969A4DA869FD28F2CAA3869A38F5C2AAFEB1"},"GKBPAF":{"60Hz":"8E4E0ABA0E6D102A33206F34F4DEE63159B3CB4F"},"GKDP01":{"16:9 Widescreen":"DF4657937DE730107B636C73E959277EB963D210","60Hz":"6740D7B914CC897AF50798C0AB391965294FD1E1"},"GKRPB2":{"16:9 Widescreen":"69C01A4F91D991CF866237FED94A138308FC104F","60Hz":"40D06A5C7A3D873ABC73DEDF573738C2E3E37FF0"},"GKWJ18":{"16:9 Widescreen":"696570101FA040778EAD310377C484C846D87430"},"GKYE01":{"16:9 Widescreen":"6520EF1B7D88F00747B120A3A010458602ED989D"},"GKYJ01":{"16:9 Widescreen":"47B8EF7D02831AA5C375C698797BF2D5475FEFF2"},"GKYP01":{"16:9 Widescreen":"69413C75036D2975716066E6574461B981FF0124"},"GLEE08":{"Fix audio issues":"7355F358CAC6F418D37E4C23E64F7867D46E4FC9"},"GLEJ08":{"Fix audio issues":"12B24A6D7389A2AC5AB75FC0BF8493E7661F2A73"},"GLEP08":{"Fix audio issues":"81BD39F5527552DE89E3B59BA86298900F0A3168"},"GLSD64":{"Fix freeze in opening cutscene":"5E2A73717BD66EF647846DD64C33BC80AD9B5227"},"GLSE64":{"Fix freeze in opening cutscene":"1CE78E7954415A44DF693C0BB879AA5A4FF059A3"},"GLSF64":{"Fix freeze in opening cutscene":"009B0C4AD80A9C28C987934D254C2C4AACC9A07A"},"GLSP64":{"16:9 Widescreen":"8E7A544C10E7A5E2F0304A0D2586879627EF6586","60Hz":"B67144E87B54246137142992A3BC83DC13BE68A7","Fix freeze in opening cutscene":"3D0894616C9A7FA5ED91C1D2F461BF14DF47ECEC"},"GM4E01":{"16:9 Menu Backgrounds Add-On":"87D1A6A3E29ADA03B0D29C2F1841C18E62DB0A15","16:9 Widescreen v2":"78BE50F93E81A1972CA31ABC318949E366E82BD0"},"GM4P01":{"16:9 Menu Backgrounds Add-On":"87D1A6A3E29ADA03B0D29C2F1841C18E62DB0A15","16:9 Widescreen v2":"6D950B6EEFD6D304E1A424355B74A595D32BDF2F"},"GMBE8P":{"16:9 Widescreen":"D12DE9E3941BCE6EB50B8DA92140E09AFC0104C8","NA Stretched HUD":"0151A6683E1FBFD20096807C54A6952C4A4BAD40"},"GMBP8P":{"16:9 Widescreen":"8A688981F33A2C53882EF08FCF20B88AD43EF417"},"GMOP70":{"16:9 Widescreen":"CE4D298616BD42E4D8F8936B325CD1FD7F5B956B","60Hz":"0CD2CC787A5FF551901E41C85C8AAC02017ECB89"},"GMPE01":{"16:9 Widescreen":"4F98592DB3DEE3857469A8D8605FAF4BD6F7C76D","QOL - Allow Digital Presses for Map Screen":"E232B27564E9AA0C32DE163C9C056317A7B2B12E","QOL - Automatically Advance Text Boxes":"59607671BFC4717ACAF9807BB7EB0D9F982866D4","QOL - Disable Advance on Results":"CAEA37F3FEF89400513353EB85875F2A3AF4C03E","QOL - Faster Boot Time":"F75FBBD838C5B84FF687962FBA9195B217DE132C","QOL - Increased Board Speed":"19F264DE7F07EAC9433CA4B591BEBA1EC976C9F1","QOL - Increased Taunt Capabilities":"C70391D4961A0E820DE40141C89341369A9F021B","QOL - Instant Text Display":"F4E6913CF034E5778B9F9CA5FF448FF1B78B3333","QOL - Rumble Always Off":"93621947019532F02C25937FD3EEEE21A788CB07","QOL - Show Controller Port Number of Who Paused":"D7249AC3C949FEB860CF4350C5B7B79AC16569F1"},"GMPJ01":{"16:9 Widescreen":"A795811F2F0C92D9DCABDE97D9E39B47B1DBCEFD"},"GMPP01":{"16:9 Widescreen":"A795811F2F0C92D9DCABDE97D9E39B47B1DBCEFD"},"GMSE01":{"60FPS":"2805B1A0DD53EB64877D375D10F667700955720F","Widescreen":"BD718F961DBA5372B1D0257D454D535746C453A0"},"GMSJ01":{"16:9 Widescreen":"E8112A01040A06460E368F142C5D1FD0B4085D94"},"GMSJ01r0":{"60FPS":"9894B5B6B5215844D48411021FF8EECFE851D79D"},"GMSJ01r1":{"60FPS":"2DB69DB7A3753D543CD85CA4C77B4EF0AED7486E"},"GMSP01":{"60FPS":"D07009B710B3BBC6B12E54ED6A7969D58197EDAF","Widescreen":"0B7B89BF0868393076EF5F9DBD689DD0EDBCB84C"},"GNHE5d":{"Nop Hack":"89393A24E2336841AA4CD0AD3BE1C9A66B89E9EF"},"GOCE5D":{"16:9 Widescreen":"E4D800B90F16A15D9252EED1B2A23AEAF5CD230A"},"GOME01":{"16:9 Widescreen":"C33CBBF6F22195BF626104B4827200B3EE1CF30C"},"GOMP01":{"16:9 Widescreen":"874784CCD4AC3DC9C69654E471C18AD0F5E4D9AE"},"GONE69":{"Widescreen Hack Culling":"6412A67E1C26E146A9526AFC9F0EE517B214069D"},"GP4J18":{"16:9 Widescreen":"BF4D2D6AF66F285E81173B3B20D5369DB6FB351B"},"GP5E01":{"16:9 Widescreen":"5ED053787332DB5EEB8B963BA5DF197B58C6BB75","QOL - Automatically Advance Text Boxes":"41EF84663008668682BB75DC8B874E38669AE041","QOL - Disable Advance on Results":"6C36BEFE751131298BC8B39012892F6A6903CE60","QOL - Faster Boot Time":"8E952E6E12639AC20F6F9FDD150C12F0C294DF43","QOL - Increased Board Speed":"4BD72B8ED75ED8EFB3329C104BAD114FDDB8AD2C","QOL - Increased Capsule Throwing Speed":"C5BA3C9D386D09DD6CB9242A12A0D041BEB93160","QOL - Increased Taunt Capabilities":"C360EBDDCB0237076052C983BD9719411CA67CDE","QOL - Instant Text Display":"2CD4A06A3B9C18CC9EA2A2DEBD96E066CD1D700A","QOL - Show Controller Port Number of Who Paused":"5BA3648D18346EDC97B23475D4748C637E6095A2"},"GP5J01":{"16:9 Widescreen":"81E69B6BEE85E06805EC24E1CFEA9405BF459DF8"},"GP5P01":{"16:9 Widescreen":"FD4FCCB97C06F0173A30D4CC9A99422B2C0ABA9B"},"GP6E01":{"16:9 Widescreen":"B502AF0887792E9B140516D14BA75F99772C17BE","QOL - Auto Advance Text Boxes":"E645DF70CE0266D174D917A817A7FBEEE974A9F0","QOL - Disable Advance on Results":"798E566B621F6A32BF23C588E76EAC0776E2A8A3","QOL - Faster Boot Time":"B089A3C80D5DA86ABF6258F8BFB1DC78BB54A973","QOL - Increased Board Speed":"501C52ACF117950888A66DB2BEDBDFD7D9B20235","QOL - Increased Orb Throwing Speed":"845F439278DA8CBC225658FF4E2F82D707422BFB","QOL - Increased Taunt Capabilities":"0AED27341A06186AD92D5725C0B9693CA8F85B7B","QOL - Instant Text Display":"5AAC4E21927D4AEE7AC329CE793D4CDAEDDF7A3F","QOL - Show Controller Port Number of Who Paused":"DF5D2F068D76ABF2B1C294D413B9154B8C356929"},"GP6J01":{"16:9 Widescreen":"88F50F8298F82E3E5C161277BD4A985CE893A9D0"},"GP6P01":{"16:9 Widescreen":"DCCE59CA987624C753F0A86BEBA4287635901C93","Remove Black Bars":"138A86D43B5830BFE1926F58C0A4FBE2971BB02D"},"GP7E01":{"16:9 Widescreen":"87EBF72D90503EBC5CE9BC994795669E48A92A4A","QOL - Auto Advance Text Boxes":"82338AB5D82A7F398B4EB674CA4866DD1F4A1E65","QOL - Controller Options Always Acesssible":"D2F9CC0B9E52136E77187395FB7DA9B64B2C3B30","QOL - Disable Advance on Results":"A644551162A61DE7997B2A84F5BFDEFFD3FC2FB5","QOL - Faster Boot Time":"1939B5C575AE8FF6890BDDDD1B3FEA472D8CABA0","QOL - Increased Board Speed":"7E06A2EBCFECADB8074152B489984237A6FE9F21","QOL - Increased Orb Throwing Speed":"6671BEE71920D6B845AE1257AFE3AB3B95CD6FBD","QOL - Increased Taunt Capabilities":"9F60923F95FFE709CCD06966CD2DF743263934D1","QOL - Instant Text Display":"48FA6002E42DA9BB83ABC980A32C60CE3B21C4FC","QOL - Show Controller Port Number of Who Paused":"5E6F8C6C87D5944DB18A4E4F9A45F61EE87A4163"},"GP7J01":{"16:9 Widescreen":"A081F0729068D233E99DC00C64E36CA33C945640"},"GP7P01":{"16:9 Widescreen":"75D6CDA4EA301A71F7701A0487544E79136850B9","60Hz":"6D0D5B7CA58C38A3147F8ED981B5B21CC6C519CD"},"GPIE01":{"No Blur":"A25CDDB79991F090BD7F12840AD06F13BD5CCF95"},"GPIE01r0":{"16:9 Widescreen":"2B58166A66644F984E64077A6245C94C79B51063"},"GPIE01r1":{"16:9 Widescreen":"9A1545AB4E2B9216B95AFFA83420D723512DA8C8","60FPS":"3337C767EAA21D30C6CFEAE9985FFCABFC63E2E3","Disable Pikmin optimizations":"CBD15E9104929F0631713AE482475CB2B90E71F2"},"GPIP01":{"16:9 Widescreen":"5AE44D5B0E0D4C412B453B95CF5A41DBA4D685E6","60Hz":"AE59FF751E167632AE283F38CC4B96BDF7B9B81F","Turn off blur":"4ED79A548DBD7DBD35928A2F1138315FF103E260"},"GPNE08":{"16:9 Widescreen [Ralf, darkludx]":"ED3D9BB08C5F1D21BC8D5C73155C00E3C25C466F"},"GPNP08":{"16:9 Widescreen [Ralf]":"469B18FE8219031D355557B836EF02B625040A4F"},"GPOE8P":{"Make Save Copyable NTSC Port - 1.0\/1.1":"7A4B3E596BA4FDA8F3FCF984079B3F44CB2D6AB3","Make Save Copyable NTSC Port - PLUS\/1.2":"304DB311F2107E88EBCE058535B266F9263AA8E2","Save Validation Code v 1.0\/v1.1":"9F6259132453DCC0607EAB35DB182C76818F2F9F","Save Validation Code v1.2\/Plus":"17EB6CFB408EF27D44C053A1336C3B87B6A05018"},"GPOE8Pr0":{"16:9 Widescreen":"99986BB1D4ABE45C429D48B01BFB578FEA69C14F"},"GPOE8Pr1":{"16:9 Widescreen (Plus) [Ralf]":"5563671A6702785FFE106DAB7EF3F4FE6D9F705B"},"GPOP8P":{"16:9 Widescreen":"DF133C61C29D5CFA87A2A785C962C205F80E6D04","Game Save Valid":"40EC1590DB26C7C58D00E3065F1E404341EF0E73","Game Save copyable":"2F5FB98927DAFF141D1CCD1EACA8AF626397E284"},"GPVE01":{"16:9 Widescreen":"E5B51080CFD518FE584CF3B61A1099CD032479D6","60 FPS":"271C40F5FC113896717DB0EEFED42E788CA3AC81"},"GPVP01":{"16:9 Widescreen":"78F3C9A789827B063A6701987262276A66ABD82B"},"GQPE78":{"EFB Copy Fix":"880B114E9A308084CAB92C004A9EE067B371C310"},"GQPP78":{"EFB Copy Fix":"5D9A14954AE8D639C9B254F3BA73A70F284BBC8D"},"GQSDAF":{"16:9 Widescreen":"CA82C44B2E8FC5C184E3FF935BC89661B7DB55D6","60Hz":"952165FD78543EB6D2F5230F7570B0513773D332","No Blur":"DEB7DF358423F0EF30C9FD49F4F14590836D52A6"},"GQSEAF":{"16:9 Widescreen":"48AFE1D32843C6B5AD4337A49F15FD447DF2A752","Remove Blur":"EF448CF1FA6A15EB2661EA5338703C13D52EF65B"},"GQSFAF":{"16:9 Widescreen":"76C30E1737CC5C3B5DE32532B5F9A5CD50B690F8","No Blur":"986BAE5103CDE9286D2D34FD28FE2540D0759AAB"},"GR2E52":{"16:9 Widescreen":"5F55CE7DA7E1E3261CF2FF88F34CDA63BA511003"},"GR2J52":{"16:9 Widescreen":"D3C6FA690BED07BFA65C2E1FCDE2FFA5AA0EEEE4"},"GR2P52":{"16:9 Widescreen":"D7BCADD4E76B5E3F7D9D463F55A2777528E37E94"},"GRNE52":{"16:9 Widescreen":"483D74C47AD1012606D591A226AB3144C7FB201C"},"GRNJ52":{"16:9 Widescreen":"949281B7221B20680B7BC29E4754B73A326EBE85"},"GRNP52":{"16:9 Widescreen":"11051B094FE5A8B2E73060BFF786C1588E36979A"},"GROE5Z":{"16:9 Widescreen":"FADBAB5EC280CF8ED4C9536A33F4184BA210C9B0"},"GRYE41":{"Disable Culling to Fix Rise and Shrine Hang":"AF0A575EB6071EAC0D2EC3D2EA30A23EB05A4192"},"GSAE01r0":{"viWidth 704 Aspect Ratio Fix":"0D529180B9B28BB06E21EDBDBA61C17EEF0FFB7F"},"GSAE01r1":{"viWidth 704 Aspect Ratio Fix":"CB15ED22625690A5DBE4607FE30160125421461D"},"GSAP01":{"viWidth 704 Aspect Ratio Fix":"749EDA62B1B73354599929F1B50E992E111C5493"},"GSNE8P":{"16:9 Widescreen":"CFDF3FA5B48B347E49E8E521D7BE47FCC9A5CBF4","60Hz Aspect Ratio Fix":"D90F66C0D46D9BEF27C8E13BC8804DB1F382C8B1"},"GSNJ8P":{"60Hz Aspect Ratio Fix":"98DF9D67DE77F66A4B09F25C5621805DEB40865B"},"GSNP8P":{"60Hz Aspect Ratio Fix":"D90F66C0D46D9BEF27C8E13BC8804DB1F382C8B1"},"GSO":{"16:9 Widescreen Region Free":"0D60D0593F6DA28B1236381B22082506B9533F0E"},"GSPE69":{"16:9 Widescreen":"80E18A8963F4EFD3C03494C95934452FCB6E521B"},"GSPP69":{"16:9 Widescreen":"162E87E9F5511CD82216811055836C11B374C45B","60Hz":"E5DF2DF34D2F0BDEE4205C891576511EC572C5DC"},"GSWE64":{"16:9 Widescreen":"6480326CCA8FF64A4868EC6E9FDE9F38819A75A1","Disable Dithering":"85F65E4B627641862C1A6091D29A3BB0626B04C3"},"GTEE01":{"16:9 Widescreen":"6B57EBCB9CC0ACE2EDA0F13E3F1F55F3FABC3A26"},"GTEP01":{"16:9 Widescreen":"72785784363C46180AF8E388348FD77667E7D382"},"GTOJAF":{"Remove Blur":"53A2EDF113F2ED7E54A16AA0E73FDB2C44C79DE5"},"GTZE41":{"16:9 Widescreen":"ECCE87E0006475C73E7D936AA0150BD20166F9EF"},"GTZP41":{"16:9 Widescreen":"62D8F159B93167171E0860D96C4BB32A5BF5648B"},"GU2D78":{"EFB Copy Fix":"CFF4C3F932B08732627572EDA1A0CD2D9C71AE0C"},"GU2F78":{"EFB Copy Fix":"CFF4C3F932B08732627572EDA1A0CD2D9C71AE0C"},"GU3D78":{"EFB Copy Fix":"8A0E3114862ADFE421874211BD6F5220AA425BF5"},"GU3X78":{"EFB Copy Fix":"E3303FDAE7ECA17A72EDC440C32D94648A6453A0"},"GU4Y78":{"EFB Copy Fix":"D54767785E139A8BC8C4B75573FBD5A0B686D8E3"},"GUNE5Dr0":{"16:9 Widescreen":"C942EBCBE8A487C25E296EC1FAC2358DA1487DBD","60Hz":"A441630EC5FF0EB74D2243A3092D22E69C6BEA02"},"GUNE5Dr1":{"16:9 Widescreen":"39BD84CBE2AFACFEDEC5E9020D1A8B0D36DD53F9","60Hz":"05779F1A3D0C43305D52A95447D612CB424942C0"},"GUNP5D":{"16:9 Widescreen":"FE3BA1DAA1AF278A7839E27BF466B0BA0B390EC2","50Hz":"3B20499A3F8D1D7CCA5B0015F2D80ECED25842A6"},"GV4E69":{"Fix 2D Rendering":"8679891FCAA250FCFF670B26E0CB9875900D17FD"},"GVJE08":{"16:9 Widescreen":"09EFDA75D876A675121C8344D8FDD09A70A1A846"},"GVJP08":{"16:9 Widescreen":"93938F4C6112C91549F2B52E6259170F7501EC07"},"GVPE69":{"Fix 2D Rendering":"3159CA79B0A890131763EA6CB163684BEE886E3F"},"GVSE8P":{"16:9 Widescreen":"4CE9C491160A4B631142EE9CE802C694163F1CA3"},"GWRE01":{"16:9 Widescreen":"AC42770B06662BE1DC863EC80F44B5E034C63664"},"GWRP01":{"16:9 Widescreen":"9DDDFAB28C4BD35CF64050E1EF684DC042B1AFFA"},"GWWE01":{"16:9 Widescreen":"98B2E75D8E1CED4A964D3129A5DC10E30538CAA6"},"GWWJ01":{"16:9 Widescreen":"2DAD9A5E2A140F02CCBA727C4BE7C74BAC156778"},"GWWP01":{"16:9 Widescreen":"2DAD9A5E2A140F02CCBA727C4BE7C74BAC156778"},"GWZE01":{"16:9 Widescreen":"9EFC191DE6D21A1681FE241AB2EE4A131259F317"},"GXCE01":{"16:9 Widescreen":"901A1E78A3A0124F55548507D3B3707125C64A8A"},"GXSE8P":{"16:9 Widescreen":"F50BBA440184FC77A4DFFAA58FF2BB888E2E072F","Aspect Ratio Fix":"4214C74DFB8A74FC3AA4A643E869BC4D9A38EDA0"},"GXSJ8P":{"Aspect Ratio Fix":"227909607984BBC3D36AAC7DB9DFE385F3363C49"},"GXXE01":{"16:9 Widescreen":"2CA66DFAB3CC67D76AE06A378B1F0E9CBA5F3D68","Allow Memory Card saving with Savestates":"64FAA15062F0D0C319F904BBDE9C4489A25D6369"},"GXXJ01":{"Allow Memory Card saving with Savestates":"8293802260536FA2EF2EFDAB5266DE36BB88DE1B"},"GXXP01":{"16:9 Widescreen":"02716B2585BEE74F8FCDD97A78F6A0D3DC7F331B","Allow Memory Card saving with Savestates":"3CAFBC4AE6FC5CE9F53377F86AB5BD8F1BC8861A"},"GYFPA4":{"60Hz":"402ED10AC842041AB4B39AE8F2D81B2D7AEF9CB4"},"GZ2E01":{"16:9 Widescreen v2":"E7521ED27BFC972628906CBE8D5403ED57253BB8","Hyrule Field Speed Hack":"FCB673D46E716C7F63C618B8D8BF83AEE0B501F0"},"GZ2J01":{"16:9 Widescreen":"F985A0A58D8E2B23E8A557FAFF8D367AFFEADD07","Hyrule Field Speed Hack":"FCB673D46E716C7F63C618B8D8BF83AEE0B501F0"},"GZ2P01":{"16:9 Widescreen v2":"CAC38B0D334B925A57AA3118D35932B8A185137E","Hyrule Field Speed Hack":"0F63623D4D984B7706F718F57C0ABDB6DBADCF8D"},"GZ3E70":{"16:9 Widescreen":"167F9E9A9B372CB3A01F308B46FF1403F8599C51","Deinterlacing Fix":"2E163CB5FE724EB49B31CF607E5B9AFDA031DDD5"},"GZDP70":{"16:9 Widescreen":"2E424E0BBAE6EF5D6A8FB4224EA1D0746BAC37D3"},"GZLE01":{"16:9 Widescreen":"9FA864EE7DD8CE7FF538EB4E0243F20137430BD8","Remove Distance Blur":"78EA34CEF8E01701491C280F155F1C12EC9BF1A2"},"GZLJ01":{"16:9 Widescreen":"E03B61989025CA33937E63A057E6E40A403811BC"},"GZLP01":{"16:9 Widescreen":"3EFFF6C52B5633A1729FAA6883D8579E77F7D057","Remove Distance Blur":"14BECBEA4DD281EBD0F7FE7DEE8020B6F2418ACD"},"GZPE70":{"16:9 Widescreen":"7142F2495507AC7136992128ED0FCA6BC72B61F4"},"GZPP70":{"16:9 Widescreen":"591FD6C9668C79FF1CE8558EBED2486A7A327F05","60Hz":"A59B84DB5486521AEE1C23B6C741ECD35216E5AD"},"GZSE70":{"16:9 Widescreen":"8E86EAC7EA4F4D2854DD9020CD795630CA64C4EE"},"HAF":{"BufferPatch":"181195871F63B89B1CF09AFA4420CF89B9883108"},"HAL":{"RSAPatch":"AD12237401ABE9FE4A545AADB5C5AE10355E2076"},"RGQE70":{"crashfix":"5F4CF8D4DA19A0FF74FF9EB925AC0236069BFD59"},"RLEEFS":{"Fix crash on main menu":"793642AC6862C2F3412035A9E3D7172CC4A1D5C7"},"RM8E01":{"16:9 Widescreen":"E61344EB1542A78D497981C307B6549985C7A05A","Extra - Disable Music":"25223F9EFAABF601CAC7810004F124E4056598B1","QOL - Faster Boot Time":"BCC4279F8B28636AD773F01540E78DF40EAD6087","QOL - Increased Board Speed":"B65AF1819966CD3435D88801E8C79704E3A52DB5","QOL - Increased Taunt Capabilities":"66495D7CB532FAE778AFC22CF45D17D0FFDE5310","QOL - Increased Text Display":"B4186DDC54F33F4D6A22188EF50CEB43FB205673","QOL - Invert IR Stick for GameCube Mod":"9D90A9C66AE8AD91B201B40C4145D1323B701A77","QOL - Remove Explanations":"330DD53AB993A99576564FEFD222D7BD211B878F"},"RM8J01":{"16:9 Widescreen":"A140BDCB8E1721CB6B4CD878E412113322258B57"},"RM8P01":{"16:9 Widescreen":"F664C32AFD3D785FC6E04D8990A3FA1C72A18C5C"},"RMHE08":{"Bloom OFF":"CCF233DA57B3E75221870DE502955114B0D4E7FA"},"RMHJ08":{"Bloom OFF":"29D3625B7ED577587E56AA07CB0EB8C47C97E823"},"RMHP08":{"Bloom OFF":"1720C1173D4698167080DBFC4232F21757C4DA08"},"RO2P7N":{"Hangfix":"EEE9C8DE4671C18DD7F81DD08D39B64C57600DEA"},"RPBE01":{"Fix black screen effects":"775ABECA6073E02C5C68CF4D644194D966A418F5"},"RPBJ01r0":{"Fix black screen effects":"0EAB5D8DE827894AFEF97C10ACB67378E6983323"},"RPBJ01r1":{"Fix black screen effects":"4905E08643E9D00136F7EAF51978CF2F54D10D07"},"RPBJ01r2":{"Fix black screen effects":"4905E08643E9D00136F7EAF51978CF2F54D10D07"},"RPBP01":{"Fix black screen effects":"82AEB60F9A9083F93060531A970FFAABE0833A40"},"RTH":{"Disable blur":"812EE46AC967BFCD239335B10A664D71A93E8175"},"RX4E4Z":{"Fix file reads (dcache bypass)":"9E4E0F1465A9A1E85349DBA3B1278AC215A97DBB"},"RX4PMT":{"Fix file reads (dcache bypass)":"EE85907C03F0295794821383B93F8D5B91D2697A"},"RZDE01r0":{"Hyrule Field Speed Hack":"15EAD073414C9903D6CAE5229DCE582BD17A9162"},"RZDE01r2":{"Hyrule Field Speed Hack":"27395CC8BC2C51201D566657D31A471A850482FB"},"RZDJ01":{"Hyrule Field Speed Hack":"B3F7473F8C911A32F1D616491C9E78EBBD7A6309"},"RZDK01":{"Hyrule Field Speed Hack":"A280C0114B800D7DC056ECFB5E482229DA0B1550"},"RZDP01":{"Hyrule Field Speed Hack":"2A83ADFB760F9498841ED0ED68B0C0438232472C"},"SAOE78":{"Fix crash on boot":"EA11FA4908FB20B61876ACD360EC7657A6D39FB2"},"SAOEVZ":{"Fix crash on boot":"AA55C214DE7545DE0E203CC39F06BF3D31451BE9"},"SGLEA4":{"Fix black screen":"258378187ACF475A55EFEAF8A703681252E014C3"},"SGLPA4":{"Fix black screen":"6F8CD59D897338CA90939149E1A62588620C6D88"}} \ No newline at end of file diff --git a/Source/Core/Core/AchievementManager.h b/Source/Core/Core/AchievementManager.h index a8639899d3..c3b82f2be4 100644 --- a/Source/Core/Core/AchievementManager.h +++ b/Source/Core/Core/AchievementManager.h @@ -90,8 +90,8 @@ public: static constexpr std::string_view BLUE = "#0B71C1"; static constexpr std::string_view APPROVED_LIST_FILENAME = "ApprovedInis.json"; static const inline Common::SHA1::Digest APPROVED_LIST_HASH = { - 0xE1, 0x29, 0xD1, 0x33, 0x4D, 0xF2, 0xF8, 0xA8, 0x4E, 0xCA, - 0xF6, 0x87, 0xE6, 0xEC, 0xEC, 0xB3, 0x18, 0x69, 0x34, 0x45}; + 0x6D, 0x91, 0xF5, 0xC1, 0xE2, 0x4C, 0xC3, 0x39, 0xF5, 0x7F, + 0xEC, 0xA9, 0x8C, 0xA9, 0xBD, 0x61, 0x28, 0x54, 0x11, 0x62}; struct LeaderboardEntry { diff --git a/Source/UnitTests/Core/PatchAllowlistTest.cpp b/Source/UnitTests/Core/PatchAllowlistTest.cpp index 2aae282216..c2b6be61e6 100644 --- a/Source/UnitTests/Core/PatchAllowlistTest.cpp +++ b/Source/UnitTests/Core/PatchAllowlistTest.cpp @@ -18,6 +18,7 @@ #include "Common/IOFile.h" #include "Common/IniFile.h" #include "Common/JsonUtil.h" +#include "Core/AchievementManager.h" #include "Core/ActionReplay.h" #include "Core/CheatCodes.h" #include "Core/GeckoCode.h" @@ -35,46 +36,23 @@ using AllowList = std::map; template void ReadVerified(const Common::IniFile& ini, const std::string& filename, const std::string& section, bool enabled, std::vector* codes); -void CheckHash(const std::string& game_id, GameHashes* game_hashes, const std::string& hash, - const std::string& patch_name); TEST(PatchAllowlist, VerifyHashes) { - // Load allowlist - static constexpr std::string_view APPROVED_LIST_FILENAME = "ApprovedInis.json"; - picojson::value json_tree; - std::string error; + // Iterate over GameSettings directory + picojson::object new_allowlist; std::string cur_directory = File::GetExeDirectory() #if defined(__APPLE__) + DIR_SEP "Tests" // FIXME: Ugly hack. #endif ; std::string sys_directory = cur_directory + DIR_SEP "Sys"; - const auto& list_filepath = fmt::format("{}{}{}", sys_directory, DIR_SEP, APPROVED_LIST_FILENAME); - ASSERT_TRUE(JsonFromFile(list_filepath, &json_tree, &error)) - << "Failed to open file at " << list_filepath; - // Parse allowlist - Map> - ASSERT_TRUE(json_tree.is()); - AllowList allow_list; - for (const auto& entry : json_tree.get()) - { - ASSERT_TRUE(entry.second.is()); - GameHashes& game_entry = allow_list[entry.first]; - for (const auto& line : entry.second.get()) - { - ASSERT_TRUE(line.second.is()); - if (line.first == "title") - game_entry.game_title = line.second.get(); - else - game_entry.hashes[line.first] = line.second.get(); - } - } - // Iterate over GameSettings directory auto directory = File::ScanDirectoryTree(fmt::format("{}{}GameSettings", sys_directory, DIR_SEP), false); for (const auto& file : directory.children) { // Load ini file + picojson::object approved; Common::IniFile ini_file; ini_file.Load(file.physicalName, true); std::string game_id = file.virtualName.substr(0, file.virtualName.find_first_of('.')); @@ -90,9 +68,6 @@ TEST(PatchAllowlist, VerifyHashes) &geckos); ReadVerified(ini_file, game_id, "AR_RetroAchievements_Verified", true, &action_replays); - // Get game section from allow list - auto game_itr = allow_list.find(game_id); - bool itr_end = (game_itr == allow_list.end()); // Iterate over approved patches for (const auto& patch : patches) { @@ -110,8 +85,7 @@ TEST(PatchAllowlist, VerifyHashes) context->Update(Common::BitCastToArray(entry.conditional)); } auto digest = context->Finish(); - CheckHash(game_id, itr_end ? nullptr : &game_itr->second, - Common::SHA1::DigestToString(digest), patch.name); + approved[patch.name] = picojson::value(Common::SHA1::DigestToString(digest)); } // Iterate over approved geckos for (const auto& code : geckos) @@ -127,8 +101,7 @@ TEST(PatchAllowlist, VerifyHashes) context->Update(Common::BitCastToArray(entry.data)); } auto digest = context->Finish(); - CheckHash(game_id, itr_end ? nullptr : &game_itr->second, - Common::SHA1::DigestToString(digest), code.name); + approved[code.name] = picojson::value(Common::SHA1::DigestToString(digest)); } // Iterate over approved AR codes for (const auto& code : action_replays) @@ -144,27 +117,43 @@ TEST(PatchAllowlist, VerifyHashes) context->Update(Common::BitCastToArray(entry.value)); } auto digest = context->Finish(); - CheckHash(game_id, itr_end ? nullptr : &game_itr->second, - Common::SHA1::DigestToString(digest), code.name); + approved[code.name] = picojson::value(Common::SHA1::DigestToString(digest)); } - // Report missing patches in map - if (itr_end) - continue; - for (auto& remaining_hashes : game_itr->second.hashes) - { - ADD_FAILURE() << "Hash in list not approved in ini." << std::endl - << "Game ID: " << game_id << ":" << game_itr->second.game_title << std::endl - << "Code: " << remaining_hashes.first << ":" << remaining_hashes.second; - } - // Remove section from map - allow_list.erase(game_itr); + // Add approved patches and codes to tree + if (!approved.empty()) + new_allowlist[game_id] = picojson::value(approved); } - // Report remaining sections in map - for (auto& remaining_games : allow_list) + + // Hash new allowlist + std::string new_allowlist_str = picojson::value(new_allowlist).serialize(); + auto context = Common::SHA1::CreateContext(); + context->Update(new_allowlist_str); + auto digest = context->Finish(); + if (digest != AchievementManager::APPROVED_LIST_HASH) { - ADD_FAILURE() << "Game in list has no ini file." << std::endl - << "Game ID: " << remaining_games.first << ":" - << remaining_games.second.game_title; + ADD_FAILURE() << "Approved list hash does not match the one in AchievementMananger." + << std::endl + << "Please update APPROVED_LIST_HASH to the following:" << std::endl + << Common::SHA1::DigestToString(digest); + } + // Compare with old allowlist + static constexpr std::string_view APPROVED_LIST_FILENAME = "ApprovedInis.json"; + std::string old_allowlist; + std::string error; + const auto& list_filepath = fmt::format("{}{}{}", sys_directory, DIR_SEP, APPROVED_LIST_FILENAME); + if (!File::ReadFileToString(list_filepath, old_allowlist) || old_allowlist != new_allowlist_str) + { + static constexpr std::string_view NEW_APPROVED_LIST_FILENAME = "New-ApprovedInis.json"; + const auto& new_list_filepath = + fmt::format("{}{}{}", sys_directory, DIR_SEP, NEW_APPROVED_LIST_FILENAME); + if (!JsonToFile(new_list_filepath, picojson::value(new_allowlist), false)) + { + ADD_FAILURE() << "Failed to write new approved list to " << list_filepath; + } + ADD_FAILURE() << "Approved list needs to be updated. Please run this test in your" << std::endl + << "local environment and copy" << std::endl + << new_list_filepath << std::endl + << "to Data/Sys/ApprovedInis.json to pass this test."; } } @@ -202,30 +191,3 @@ void ReadVerified(const Common::IniFile& ini, const std::string& filename, } } } - -void CheckHash(const std::string& game_id, GameHashes* game_hashes, const std::string& hash, - const std::string& patch_name) -{ - // Check patch in list - if (game_hashes == nullptr) - { - // Report: no patches in game found in list - ADD_FAILURE() << "Approved hash missing from list." << std::endl - << "Game ID: " << game_id << std::endl - << "Code: \"" << hash << "\": \"" << patch_name << "\""; - return; - } - auto hash_itr = game_hashes->hashes.find(hash); - if (hash_itr == game_hashes->hashes.end()) - { - // Report: patch not found in list - ADD_FAILURE() << "Approved hash missing from list." << std::endl - << "Game ID: " << game_id << ":" << game_hashes->game_title << std::endl - << "Code: \"" << hash << "\": \"" << patch_name << "\""; - } - else - { - // Remove patch from map if found - game_hashes->hashes.erase(hash_itr); - } -} diff --git a/Source/UnitTests/UnitTests.vcxproj b/Source/UnitTests/UnitTests.vcxproj index b5e5256915..6725c1cc23 100644 --- a/Source/UnitTests/UnitTests.vcxproj +++ b/Source/UnitTests/UnitTests.vcxproj @@ -104,6 +104,7 @@ +