From 4ad7736ca7f2d09f498cfce60e70b047fe6bed29 Mon Sep 17 00:00:00 2001 From: CasualPokePlayer <50538166+CasualPokePlayer@users.noreply.github.com> Date: Sat, 12 Aug 2023 04:22:46 -0700 Subject: [PATCH] add some kind of 3DS support to retroachievements, probably --- .../RetroAchievements/RCheevos.cs | 2 +- .../RetroAchievements.ConsoleID.cs | 1 + .../RetroAchievements.GameVerification.cs | 22 ++++++++++++++++++- .../RetroAchievements.Memory.cs | 2 +- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs index 5696b3e57c..4743b42705 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs @@ -15,7 +15,7 @@ namespace BizHawk.Client.EmuHawk { public partial class RCheevos : RetroAchievements { - private static readonly LibRCheevos _lib; + internal static readonly LibRCheevos _lib; static RCheevos() { diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.ConsoleID.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.ConsoleID.cs index 09931b352c..c7b8bf7276 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.ConsoleID.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.ConsoleID.cs @@ -130,6 +130,7 @@ namespace BizHawk.Client.EmuHawk VSystemID.Raw.Libretro => ConsoleID.UnknownConsoleID, VSystemID.Raw.Lynx => ConsoleID.Lynx, VSystemID.Raw.MSX => ConsoleID.MSX, + VSystemID.Raw.N3DS => ConsoleID.Nintendo3DS, VSystemID.Raw.N64 => ConsoleID.N64, VSystemID.Raw.NDS when Emu is NDS { IsDSi: true } => ConsoleID.DSi, VSystemID.Raw.NDS => ConsoleID.DS, diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs index 1c7deb7df2..d3b4e1dac5 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs @@ -284,6 +284,14 @@ namespace BizHawk.Client.EmuHawk return IdentifyHash(hash); } + private int Hash3DS(string path) + { + // 3DS is too big to hash as a byte array... + var hash = new byte[33]; + return RCheevos._lib.rc_hash_generate_from_file(hash, ConsoleID.Nintendo3DS, path) + ? IdentifyHash(Encoding.ASCII.GetString(hash, 0, 32)) : 0; + } + protected IReadOnlyList GetRAGameIds(IOpenAdvanced ioa, ConsoleID consoleID) { var ret = new List(); @@ -303,7 +311,7 @@ namespace BizHawk.Client.EmuHawk } else if (ext == ".xml") { - var xml = XmlGame.Create(new HawkFile(ioa.SimplePath)); + var xml = XmlGame.Create(new(ioa.SimplePath)); foreach (var kvp in xml.Assets) { if (consoleID is ConsoleID.Arcade) @@ -312,6 +320,12 @@ namespace BizHawk.Client.EmuHawk break; } + if (consoleID is ConsoleID.Nintendo3DS) + { + ret.Add(Hash3DS(kvp.Key)); + break; + } + ret.Add(Disc.IsValidExtension(Path.GetExtension(kvp.Key)) ? HashDisc(kvp.Key, consoleID) : IdentifyRom(kvp.Value)); @@ -325,6 +339,12 @@ namespace BizHawk.Client.EmuHawk break; } + if (consoleID is ConsoleID.Nintendo3DS) + { + ret.Add(Hash3DS(ioa.SimplePath)); + break; + } + if (Disc.IsValidExtension(Path.GetExtension(ext))) { ret.Add(HashDisc(ioa.SimplePath, consoleID)); diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.Memory.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.Memory.cs index d8522ee5e1..9859312234 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.Memory.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.Memory.cs @@ -363,7 +363,7 @@ namespace BizHawk.Client.EmuHawk ConsoleID.PlayStation, ConsoleID.Lynx, ConsoleID.Lynx, ConsoleID.NeoGeoPocket, ConsoleID.Jaguar, ConsoleID.JaguarCD, ConsoleID.DS, ConsoleID.DSi, ConsoleID.AppleII, ConsoleID.Vectrex, ConsoleID.Tic80, ConsoleID.PCEngine, - ConsoleID.Uzebox, + ConsoleID.Uzebox, ConsoleID.Nintendo3DS, }; // these consoles will use part of the system bus at an offset