diff --git a/SabreTools.Library/DatFiles/AttractMode.cs b/SabreTools.Library/DatFiles/AttractMode.cs index 7c8fdd64..70eafcbb 100644 --- a/SabreTools.Library/DatFiles/AttractMode.cs +++ b/SabreTools.Library/DatFiles/AttractMode.cs @@ -99,6 +99,9 @@ namespace SabreTools.Library.DatFiles Buttons = gameinfo[16], }, + AltName = gameinfo[13], + AltTitle = gameinfo[14], + Source = new Source { Index = indexId, @@ -277,8 +280,8 @@ namespace SabreTools.Library.DatFiles datItem.GetField(Field.Status, Header.ExcludeFields), datItem.GetField(Field.DisplayCount, Header.ExcludeFields), datItem.GetField(Field.DisplayType, Header.ExcludeFields), - string.Empty, // datItem.GetField(Field.AltRomname, Header.ExcludeFields), - string.Empty, // datItem.GetField(Field.AltTitle, Header.ExcludeFields), + datItem.GetField(Field.AltName, Header.ExcludeFields), + datItem.GetField(Field.AltTitle, Header.ExcludeFields), datItem.GetField(Field.Comment, Header.ExcludeFields), datItem.GetField(Field.Buttons, Header.ExcludeFields), }; diff --git a/SabreTools.Library/DatFiles/Json.cs b/SabreTools.Library/DatFiles/Json.cs index a4fffea6..0282f67d 100644 --- a/SabreTools.Library/DatFiles/Json.cs +++ b/SabreTools.Library/DatFiles/Json.cs @@ -665,6 +665,8 @@ namespace SabreTools.Library.DatFiles long size = -1; long? areaSize = null; string name = null, + altName = null, + altTitle = null, partName = null, partInterface = null, areaName = null, @@ -702,6 +704,8 @@ namespace SabreTools.Library.DatFiles datItem.Source = new Source { Index = indexId, Name = filename }; datItem.Name = name; + datItem.AltName = altName; + datItem.AltTitle = altTitle; datItem.PartName = partName; datItem.PartInterface = partInterface; datItem.Features = features; @@ -781,6 +785,14 @@ namespace SabreTools.Library.DatFiles name = jtr.ReadAsString(); break; + case "alt_romname": + altName = jtr.ReadAsString(); + break; + + case "alt_title": + altTitle = jtr.ReadAsString(); + break; + case "partname": partName = jtr.ReadAsString(); break; @@ -1841,6 +1853,16 @@ namespace SabreTools.Library.DatFiles break; } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.AltName, Header.ExcludeFields))) + { + jtw.WritePropertyName("alt_romname"); + jtw.WriteValue(datItem.AltName); + } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.AltTitle, Header.ExcludeFields))) + { + jtw.WritePropertyName("alt_title"); + jtw.WriteValue(datItem.AltTitle); + } if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.PartName, Header.ExcludeFields))) { jtw.WritePropertyName("partname"); diff --git a/SabreTools.Library/DatFiles/SeparatedValue.cs b/SabreTools.Library/DatFiles/SeparatedValue.cs index 77558764..d663740f 100644 --- a/SabreTools.Library/DatFiles/SeparatedValue.cs +++ b/SabreTools.Library/DatFiles/SeparatedValue.cs @@ -82,6 +82,8 @@ namespace SabreTools.Library.DatFiles optional = null, inverted = null; string name = null, + altName = null, + altTitle = null, partName = null, partInterface = null, areaName = null, @@ -425,14 +427,32 @@ namespace SabreTools.Library.DatFiles #region DatItem - case "DatItem.Type": - itemType = value.AsItemType() ?? ItemType.Rom; - break; + #region Common case "DatItem.Name": name = value; break; + case "DatItem.Type": + itemType = value.AsItemType() ?? ItemType.Rom; + break; + + #endregion + + #region AttractMode + + case "DatItem.AltName": + altName = value; + break; + + case "DatItem.AltTitle": + altTitle = value; + break; + + #endregion + + #region SoftwareList + case "DatItem.PartName": partName = value; break; @@ -464,6 +484,8 @@ namespace SabreTools.Library.DatFiles break; + #endregion + case "DatItem.Default": def = value.AsYesNo(); break; @@ -552,7 +574,7 @@ namespace SabreTools.Library.DatFiles inverted = value.AsYesNo(); break; - #endregion + #endregion // DatItem case "INVALID": default: @@ -568,6 +590,8 @@ namespace SabreTools.Library.DatFiles Archive archive = new Archive() { Name = name, + AltName = altName, + AltTitle = altTitle, PartName = partName, PartInterface = partInterface, Features = features, @@ -589,6 +613,8 @@ namespace SabreTools.Library.DatFiles BiosSet biosset = new BiosSet() { Name = name, + AltName = altName, + AltTitle = altTitle, PartName = partName, PartInterface = partInterface, Features = features, @@ -613,6 +639,8 @@ namespace SabreTools.Library.DatFiles Disk disk = new Disk() { Name = name, + AltName = altName, + AltTitle = altTitle, PartName = partName, PartInterface = partInterface, Features = features, @@ -649,6 +677,8 @@ namespace SabreTools.Library.DatFiles Release release = new Release() { Name = name, + AltName = altName, + AltTitle = altTitle, PartName = partName, PartInterface = partInterface, Features = features, @@ -675,6 +705,8 @@ namespace SabreTools.Library.DatFiles Rom rom = new Rom() { Name = name, + AltName = altName, + AltTitle = altTitle, PartName = partName, PartInterface = partInterface, Features = features, @@ -715,6 +747,8 @@ namespace SabreTools.Library.DatFiles Sample sample = new Sample() { Name = name, + AltName = altName, + AltTitle = altTitle, PartName = partName, PartInterface = partInterface, Features = features, @@ -1066,6 +1100,8 @@ namespace SabreTools.Library.DatFiles #region DatItem + #region Common + case "itemtype": case "item type": case "type": @@ -1083,6 +1119,30 @@ namespace SabreTools.Library.DatFiles case "rom name": return "DatItem.Name"; + #endregion + + #region AttractMode + + case "altname": + case "alt name": + case "alt-name": + case "altromname": + case "alt romname": + case "alt-romname": + return "DatItem.AltName"; + + case "alttitle": + case "alt title": + case "alt-title": + case "altromtitle": + case "alt romtitle": + case "alt-romtitle": + return "DatItem.AltTitle"; + + #endregion + + #region SoftwareList + case "partname": case "part name": return "DatItem.PartName"; @@ -1102,6 +1162,8 @@ namespace SabreTools.Library.DatFiles case "area size": return "DatItem.AreaSize"; + #endregion + case "default": return "DatItem.Default"; @@ -1190,7 +1252,7 @@ namespace SabreTools.Library.DatFiles case "inverted": return "DatItem.Inverted"; - #endregion + #endregion // DatItem default: return "INVALID"; diff --git a/SabreTools.Library/DatItems/Archive.cs b/SabreTools.Library/DatItems/Archive.cs index 90609856..2f4df73b 100644 --- a/SabreTools.Library/DatItems/Archive.cs +++ b/SabreTools.Library/DatItems/Archive.cs @@ -28,6 +28,9 @@ ItemType = this.ItemType, DupeType = this.DupeType, + AltName = this.AltName, + AltTitle = this.AltTitle, + PartName = this.PartName, PartInterface = this.PartInterface, Features = this.Features, diff --git a/SabreTools.Library/DatItems/BiosSet.cs b/SabreTools.Library/DatItems/BiosSet.cs index ff4ceece..c4f56004 100644 --- a/SabreTools.Library/DatItems/BiosSet.cs +++ b/SabreTools.Library/DatItems/BiosSet.cs @@ -85,6 +85,9 @@ namespace SabreTools.Library.DatItems ItemType = this.ItemType, DupeType = this.DupeType, + AltName = this.AltName, + AltTitle = this.AltTitle, + PartName = this.PartName, PartInterface = this.PartInterface, Features = this.Features, diff --git a/SabreTools.Library/DatItems/Blank.cs b/SabreTools.Library/DatItems/Blank.cs index 0f15ca42..ef89de04 100644 --- a/SabreTools.Library/DatItems/Blank.cs +++ b/SabreTools.Library/DatItems/Blank.cs @@ -28,6 +28,9 @@ ItemType = this.ItemType, DupeType = this.DupeType, + AltName = this.AltName, + AltTitle = this.AltTitle, + PartName = this.PartName, PartInterface = this.PartInterface, Features = this.Features, diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs index f834a0f3..bf2bb082 100644 --- a/SabreTools.Library/DatItems/DatItem.cs +++ b/SabreTools.Library/DatItems/DatItem.cs @@ -21,7 +21,7 @@ namespace SabreTools.Library.DatItems { #region Fields - #region Standard item information + #region Common Fields /// /// Name of the item @@ -43,7 +43,7 @@ namespace SabreTools.Library.DatItems #endregion - #region Machine information + #region Machine Fields /// /// Machine values @@ -53,6 +53,22 @@ namespace SabreTools.Library.DatItems #endregion + #region AttractMode Fields + + /// + /// Alternate name for the item + /// + [JsonProperty("alt_romname")] + public string AltName { get; set; } + + /// + /// Alternate title for the item + /// + [JsonProperty("alt_title")] + public string AltTitle { get; set; } + + #endregion + #region SoftwareList Fields /// @@ -110,28 +126,25 @@ namespace SabreTools.Library.DatItems /// public static readonly List DatItemFields = new List() { + // Common Field.Name, + + // AttractMode + Field.AltName, + Field.AltTitle, + + //SoftwareList Field.PartName, Field.PartInterface, Field.Features, Field.AreaName, Field.AreaSize, + + // BiosSet Field.BiosDescription, Field.Default, - Field.Language, - Field.Date, - Field.Bios, - Field.Size, - Field.Offset, - Field.Merge, - Field.Region, - Field.Index, - Field.Writable, - Field.Optional, - Field.Status, - Field.Inverted, - Field.CRC, + // Disk Field.MD5, #if NET_FRAMEWORK Field.RIPEMD160, @@ -140,6 +153,23 @@ namespace SabreTools.Library.DatItems Field.SHA256, Field.SHA384, Field.SHA512, + Field.Merge, + Field.Region, + Field.Index, + Field.Writable, + Field.Optional, + Field.Status, + + // Release + Field.Language, + Field.Date, + + // Rom + Field.Bios, + Field.Size, + Field.CRC, + Field.Offset, + Field.Inverted, }; /// @@ -210,6 +240,12 @@ namespace SabreTools.Library.DatItems case Field.Name: fieldValue = Name; break; + case Field.AltName: + fieldValue = AltName; + break; + case Field.AltTitle: + fieldValue = AltTitle; + break; case Field.PartName: fieldValue = PartName; break; @@ -425,11 +461,7 @@ namespace SabreTools.Library.DatItems if (!Machine.PassesFilter(filter)) return false; - // Filter on item type - if (filter.ItemTypes.MatchesPositiveSet(ItemType.ToString()) == false) - return false; - if (filter.ItemTypes.MatchesNegativeSet(ItemType.ToString()) == true) - return false; + #region Common // Filter on item name if (filter.ItemName.MatchesPositiveSet(Name) == false) @@ -437,6 +469,32 @@ namespace SabreTools.Library.DatItems if (filter.ItemName.MatchesNegativeSet(Name) == true) return false; + // Filter on item type + if (filter.ItemTypes.MatchesPositiveSet(ItemType.ToString()) == false) + return false; + if (filter.ItemTypes.MatchesNegativeSet(ItemType.ToString()) == true) + return false; + + #endregion + + #region AttractMode + + // Filter on alt name + if (filter.AltName.MatchesPositiveSet(AltName) == false) + return false; + if (filter.AltName.MatchesNegativeSet(AltName) == true) + return false; + + // Filter on alt title + if (filter.AltTitle.MatchesPositiveSet(AltTitle) == false) + return false; + if (filter.AltTitle.MatchesNegativeSet(AltTitle) == true) + return false; + + #endregion + + #region SoftwareList + // Filter on part name if (filter.PartName.MatchesPositiveSet(PartName) == false) return false; @@ -463,6 +521,8 @@ namespace SabreTools.Library.DatItems else if (filter.AreaSize.MatchesNegative(null, AreaSize) == false) return false; + #endregion + return true; } @@ -475,9 +535,25 @@ namespace SabreTools.Library.DatItems // Remove machine fields Machine.RemoveFields(fields); + #region Common + if (fields.Contains(Field.Name)) Name = null; + #endregion + + #region AttractMode + + if (fields.Contains(Field.AltName)) + AltName = null; + + if (fields.Contains(Field.AltTitle)) + AltTitle = null; + + #endregion + + #region SoftwareList + if (fields.Contains(Field.PartName)) PartName = null; @@ -492,6 +568,8 @@ namespace SabreTools.Library.DatItems if (fields.Contains(Field.AreaSize)) AreaSize = null; + + #endregion } #endregion @@ -574,9 +652,25 @@ namespace SabreTools.Library.DatItems /// List of Fields representing what should be updated public virtual void ReplaceFields(DatItem item, List fields) { + #region Common + if (fields.Contains(Field.Name)) Name = item.Name; + #endregion + + #region AttractMode + + if (fields.Contains(Field.AltName)) + AltName = item.AltName; + + if (fields.Contains(Field.AltTitle)) + AltTitle = item.AltTitle; + + #endregion + + #region SoftwareList + if (fields.Contains(Field.PartName)) PartName = item.PartName; @@ -591,6 +685,8 @@ namespace SabreTools.Library.DatItems if (fields.Contains(Field.AreaSize)) AreaSize = item.AreaSize; + + #endregion } #endregion diff --git a/SabreTools.Library/DatItems/Disk.cs b/SabreTools.Library/DatItems/Disk.cs index 47de1d68..69d6e897 100644 --- a/SabreTools.Library/DatItems/Disk.cs +++ b/SabreTools.Library/DatItems/Disk.cs @@ -242,6 +242,9 @@ namespace SabreTools.Library.DatItems ItemType = this.ItemType, DupeType = this.DupeType, + AltName = this.AltName, + AltTitle = this.AltTitle, + PartName = this.PartName, PartInterface = this.PartInterface, Features = this.Features, @@ -281,6 +284,9 @@ namespace SabreTools.Library.DatItems ItemType = ItemType.Rom, DupeType = this.DupeType, + AltName = this.AltName, + AltTitle = this.AltTitle, + PartName = this.PartName, PartInterface = this.PartInterface, Features = this.Features, diff --git a/SabreTools.Library/DatItems/Enums.cs b/SabreTools.Library/DatItems/Enums.cs index 81d79edc..830570e2 100644 --- a/SabreTools.Library/DatItems/Enums.cs +++ b/SabreTools.Library/DatItems/Enums.cs @@ -20,6 +20,8 @@ namespace SabreTools.Library.DatItems /// /// List of valid field types within a DatItem/Machine /// + /// TODO: Should this be split into MachineField and DatItemField? + /// TODO: Should there also be a DatFileField? public enum Field : int { NULL = 0, @@ -67,8 +69,14 @@ namespace SabreTools.Library.DatItems #region DatItem // Common DatItem - ItemType, Name, + ItemType, + + // AttractMode DatItem + AltName, + AltTitle, + + // SoftwareList DatItem PartName, PartInterface, Features, diff --git a/SabreTools.Library/DatItems/Release.cs b/SabreTools.Library/DatItems/Release.cs index 01f37089..da3e6a76 100644 --- a/SabreTools.Library/DatItems/Release.cs +++ b/SabreTools.Library/DatItems/Release.cs @@ -107,6 +107,9 @@ namespace SabreTools.Library.DatItems ItemType = this.ItemType, DupeType = this.DupeType, + AltName = this.AltName, + AltTitle = this.AltTitle, + PartName = this.PartName, PartInterface = this.PartInterface, Features = this.Features, diff --git a/SabreTools.Library/DatItems/Rom.cs b/SabreTools.Library/DatItems/Rom.cs index 80f89c2a..1f40389d 100644 --- a/SabreTools.Library/DatItems/Rom.cs +++ b/SabreTools.Library/DatItems/Rom.cs @@ -308,6 +308,9 @@ namespace SabreTools.Library.DatItems ItemType = this.ItemType, DupeType = this.DupeType, + AltName = this.AltName, + AltTitle = this.AltTitle, + PartName = this.PartName, PartInterface = this.PartInterface, Features = this.Features, diff --git a/SabreTools.Library/DatItems/Sample.cs b/SabreTools.Library/DatItems/Sample.cs index c5b53252..a8e0d7eb 100644 --- a/SabreTools.Library/DatItems/Sample.cs +++ b/SabreTools.Library/DatItems/Sample.cs @@ -28,6 +28,9 @@ ItemType = this.ItemType, DupeType = this.DupeType, + AltName = this.AltName, + AltTitle = this.AltTitle, + PartName = this.PartName, PartInterface = this.PartInterface, Features = this.Features, diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs index bb8d7eaa..c1816af8 100644 --- a/SabreTools.Library/Filtering/Filter.cs +++ b/SabreTools.Library/Filtering/Filter.cs @@ -169,17 +169,35 @@ namespace SabreTools.Library.Filtering #region DatItem Filters - /// - /// Include or exclude item types - /// - public FilterItem ItemTypes { get; private set; } = new FilterItem(); + #region Common /// /// Include or exclude item names /// public FilterItem ItemName { get; private set; } = new FilterItem(); - // TODO: DatItem.Features - List> + /// + /// Include or exclude item types + /// + public FilterItem ItemTypes { get; private set; } = new FilterItem(); + + #endregion + + #region AttractMode + + /// + /// Include or exclude alt names + /// + public FilterItem AltName { get; private set; } = new FilterItem(); + + /// + /// Include or exclude alt titles + /// + public FilterItem AltTitle { get; private set; } = new FilterItem(); + + #endregion + + #region SoftwareList /// /// Include or exclude part names @@ -191,6 +209,8 @@ namespace SabreTools.Library.Filtering /// public FilterItem PartInterface { get; private set; } = new FilterItem(); + // TODO: DatItem.Features - List> + /// /// Include or exclude area names /// @@ -202,6 +222,8 @@ namespace SabreTools.Library.Filtering /// Positive means "Greater than or equal", Negative means "Less than or equal", Neutral means "Equal" public FilterItem AreaSize { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null }; + #endregion + /// /// Include or exclude items with the "Default" tag /// @@ -310,7 +332,7 @@ namespace SabreTools.Library.Filtering /// public FilterItem Inverted { get; private set; } = new FilterItem(); - #endregion + #endregion // DatItem Filters #region Manipulation Flags @@ -617,6 +639,15 @@ namespace SabreTools.Library.Filtering #region DatItem Filters + #region Common + + case Field.Name: + if (negate) + ItemName.NegativeSet.Add(value); + else + ItemName.PositiveSet.Add(value); + break; + case Field.ItemType: if (value.AsItemType() == null) return; @@ -627,13 +658,28 @@ namespace SabreTools.Library.Filtering ItemTypes.PositiveSet.Add(value); break; - case Field.Name: + #endregion + + #region AttractMode + + case Field.AltName: if (negate) - ItemName.NegativeSet.Add(value); + AltName.NegativeSet.Add(value); else - ItemName.PositiveSet.Add(value); + AltName.PositiveSet.Add(value); break; + case Field.AltTitle: + if (negate) + AltTitle.NegativeSet.Add(value); + else + AltTitle.PositiveSet.Add(value); + break; + + #endregion + + #region SoftwareList + case Field.PartName: if (negate) PartName.NegativeSet.Add(value); @@ -707,6 +753,8 @@ namespace SabreTools.Library.Filtering break; + #endregion + case Field.Default: if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase)) Default.Neutral = false; @@ -901,7 +949,7 @@ namespace SabreTools.Library.Filtering Inverted.Neutral = true; break; - #endregion + #endregion // DatItem Filters } } diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs index e86765ae..daf6a1ae 100644 --- a/SabreTools.Library/Tools/Converters.cs +++ b/SabreTools.Library/Tools/Converters.cs @@ -267,12 +267,62 @@ namespace SabreTools.Library.Tools #region DatItem + #region Common + + case "itemname": + case "item-name": + case "name": + return Field.Name; + case "itemtype": + case "item-type": + case "type": + return Field.ItemType; + + #endregion + + #region AttractMode + + case "altname": + case "alt name": + case "alt-name": + case "altromname": + case "alt romname": + case "alt-romname": + return Field.AltName; + + case "alttitle": + case "alt title": + case "alt-title": + case "altromtitle": + case "alt romtitle": + case "alt-romtitle": + return Field.AltTitle; + + #endregion + + #region SoftwareList + + case "partname": + case "part name": + case "part-name": + return Field.PartName; + case "partinterface": + case "part interface": + case "part-interface": + return Field.PartInterface; + case "features": + return Field.Features; case "areaname": + case "area name": case "area-name": return Field.AreaName; case "areasize": + case "area size": case "area-size": return Field.AreaSize; + + #endregion + case "bios": return Field.Bios; case "biosdescription": @@ -293,24 +343,14 @@ namespace SabreTools.Library.Tools case "less": case "size": return Field.Size; - case "features": - return Field.Features; case "index": return Field.Index; case "inverted": return Field.Inverted; - case "itemname": - case "item-name": - case "name": - return Field.Name; case "itemtatus": case "item-status": case "status": return Field.Status; - case "itemtype": - case "item-type": - case "type": - return Field.ItemType; case "language": return Field.Language; case "md5": @@ -323,12 +363,6 @@ namespace SabreTools.Library.Tools return Field.Offset; case "optional": return Field.Optional; - case "partinterface": - case "part-interface": - return Field.PartInterface; - case "partname": - case "part-name": - return Field.PartName; case "region": return Field.Region; #if NET_FRAMEWORK