From a515672d4d225698b6b79b85aa478c9ce14d52e9 Mon Sep 17 00:00:00 2001 From: CasualPokePlayer <50538166+CasualPokePlayer@users.noreply.github.com> Date: Sun, 28 Aug 2022 02:56:31 -0700 Subject: [PATCH] fix #3159 --- .../config/FirmwaresConfig.cs | 4 +++- .../Database/FirmwareDatabase.cs | 14 +++++++++++++- .../Database/FirmwareOption.cs | 19 ++++++++++++++++++- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/BizHawk.Client.EmuHawk/config/FirmwaresConfig.cs b/src/BizHawk.Client.EmuHawk/config/FirmwaresConfig.cs index 2467090b3c..ece03ac5fb 100644 --- a/src/BizHawk.Client.EmuHawk/config/FirmwaresConfig.cs +++ b/src/BizHawk.Client.EmuHawk/config/FirmwaresConfig.cs @@ -545,7 +545,9 @@ namespace BizHawk.Client.EmuHawk olvi.SubItems.Add(new ListViewItem.ListViewSubItem()); olvi.SubItems.Add(new ListViewItem.ListViewSubItem()); olvi.SubItems.Add(new ListViewItem.ListViewSubItem()); - var ff = FirmwareDatabase.FirmwareFilesByHash[o.Hash]; + var ff = o.Hash is SHA1Checksum.Dummy + ? FirmwareDatabase.FirmwareFilesWithDummyHash[o] + : FirmwareDatabase.FirmwareFilesByHash[o.Hash]; olvi.ImageIndex = (int) (o.Status is FirmwareOptionStatus.Bad ? FirmwareOptionStatus.Unset : o.Status); // if bad, use unset's red '!' to differentiate from unacceptable olvi.ToolTipText = StatusDescs[o.Status]; olvi.SubItems[0].Text = ff.Size.ToString(); diff --git a/src/BizHawk.Emulation.Common/Database/FirmwareDatabase.cs b/src/BizHawk.Emulation.Common/Database/FirmwareDatabase.cs index 095b288279..00a8c9ff55 100644 --- a/src/BizHawk.Emulation.Common/Database/FirmwareDatabase.cs +++ b/src/BizHawk.Emulation.Common/Database/FirmwareDatabase.cs @@ -16,6 +16,8 @@ namespace BizHawk.Emulation.Common public static readonly IReadOnlyDictionary FirmwareFilesByHash; + public static readonly IReadOnlyDictionary FirmwareFilesWithDummyHash; + public static readonly IReadOnlyCollection FirmwareOptions; public static readonly IReadOnlyCollection FirmwareRecords; @@ -26,6 +28,7 @@ namespace BizHawk.Emulation.Common { List allPatches = new(); Dictionary filesByHash = new(); + Dictionary filesWithDummyHash = new(); List options = new(); List records = new(); @@ -45,7 +48,15 @@ namespace BizHawk.Emulation.Common isBad: isBad); void Option(string systemId, string id, in FirmwareFile ff, FirmwareOptionStatus status = FirmwareOptionStatus.Acceptable) - => options.Add(new(new(systemId, id), ff.Hash, ff.Size, ff.IsBad ? FirmwareOptionStatus.Bad : status)); + { + options.Add(new(new(systemId, id), ff.Hash, ff.Size, ff.IsBad ? FirmwareOptionStatus.Bad : status)); + if (ff.Hash is SHA1Checksum.Dummy) + { + // these shouldn't have more than 1 option + // as these files represent an impossible to hash firmware + filesWithDummyHash[options[options.Count - 1]] = ff; + } + } void Firmware(string systemId, string id, string desc) => records.Add(new(new(systemId, id), desc)); @@ -463,6 +474,7 @@ namespace BizHawk.Emulation.Common AllPatches = allPatches; FirmwareFilesByHash = filesByHash; + FirmwareFilesWithDummyHash = filesWithDummyHash; FirmwareOptions = options; FirmwareRecords = records; } diff --git a/src/BizHawk.Emulation.Common/Database/FirmwareOption.cs b/src/BizHawk.Emulation.Common/Database/FirmwareOption.cs index a0576b2a59..fa5ec1dc1e 100644 --- a/src/BizHawk.Emulation.Common/Database/FirmwareOption.cs +++ b/src/BizHawk.Emulation.Common/Database/FirmwareOption.cs @@ -1,7 +1,15 @@ +using System; + namespace BizHawk.Emulation.Common { - public readonly struct FirmwareOption + public readonly struct FirmwareOption : IEquatable { + public static bool operator ==(FirmwareOption a, FirmwareOption b) + => a.Equals(b); + + public static bool operator !=(FirmwareOption a, FirmwareOption b) + => !(a == b); + public readonly string Hash; public readonly FirmwareID ID; @@ -19,5 +27,14 @@ namespace BizHawk.Emulation.Common Size = size; Status = status; } + + public bool Equals(FirmwareOption other) + => Hash == other.Hash && ID == other.ID && Size == other.Size && Status == other.Status; + + public readonly override bool Equals(object? obj) + => obj is FirmwareOption fr && Equals(fr); + + public readonly override int GetHashCode() + => HashCode.Combine(Hash, ID, Size, Status); } }