diff --git a/SabreTools.Library/DatFiles/ItemDictionary.cs b/SabreTools.Library/DatFiles/ItemDictionary.cs index f39e2599..d12309dd 100644 --- a/SabreTools.Library/DatFiles/ItemDictionary.cs +++ b/SabreTools.Library/DatFiles/ItemDictionary.cs @@ -167,6 +167,12 @@ namespace SabreTools.Library.DatFiles [JsonIgnore] public long SoftwareListCount { get; private set; } = 0; + /// + /// Number of Sound items + /// + [JsonIgnore] + public long SoundCount { get; private set; } = 0; + /// /// Number of machines /// @@ -569,6 +575,9 @@ namespace SabreTools.Library.DatFiles case ItemType.SoftwareList: SoftwareListCount++; break; + case ItemType.Sound: + SoundCount++; + break; } } @@ -719,6 +728,9 @@ namespace SabreTools.Library.DatFiles case ItemType.SoftwareList: SoftwareListCount--; break; + case ItemType.Sound: + SoundCount--; + break; } } diff --git a/SabreTools.Library/DatFiles/Json.cs b/SabreTools.Library/DatFiles/Json.cs index 1dd426e8..7aaa8be0 100644 --- a/SabreTools.Library/DatFiles/Json.cs +++ b/SabreTools.Library/DatFiles/Json.cs @@ -256,6 +256,9 @@ namespace SabreTools.Library.DatFiles case ItemType.SoftwareList: datItem = datItemObj.ToObject(); break; + case ItemType.Sound: + datItem = datItemObj.ToObject(); + break; } } diff --git a/SabreTools.Library/DatFiles/Listxml.cs b/SabreTools.Library/DatFiles/Listxml.cs index e66526c2..d2e8d5c4 100644 --- a/SabreTools.Library/DatFiles/Listxml.cs +++ b/SabreTools.Library/DatFiles/Listxml.cs @@ -369,7 +369,21 @@ namespace SabreTools.Library.DatFiles }); reader.Read(); + break; + case "sound": + datItems.Add(new Sound + { + Channels = reader.GetAttribute("channels"), + + Source = new Source + { + Index = indexId, + Name = filename, + }, + }); + + reader.Read(); break; case "display": @@ -398,19 +412,6 @@ namespace SabreTools.Library.DatFiles reader.Read(); break; - case "sound": - var sound = new Sound(); - sound.Channels = reader.GetAttribute("channels"); - - // Ensure the list exists - if (machine.Sounds == null) - machine.Sounds = new List(); - - machine.Sounds.Add(sound); - - reader.Read(); - break; - case "condition": var condition = new Condition(); condition.Tag = reader.GetAttribute("tag"); @@ -1223,18 +1224,6 @@ namespace SabreTools.Library.DatFiles xtw.WriteEndElement(); } } - if (datItem.Machine.Sounds != null) - { - foreach (var sound in datItem.Machine.Sounds) - { - xtw.WriteStartElement("sound"); - - xtw.WriteOptionalAttributeString("channels", sound.Channels); - - // End sound - xtw.WriteEndElement(); - } - } if (datItem.Machine.Conditions != null) { foreach (var condition in datItem.Machine.Conditions) @@ -1653,6 +1642,13 @@ namespace SabreTools.Library.DatFiles xtw.WriteOptionalAttributeString("filter", softwareList.Filter); xtw.WriteEndElement(); break; + + case ItemType.Sound: + var sound = datItem as Sound; + xtw.WriteStartElement("sound"); + xtw.WriteOptionalAttributeString("channels", sound.Channels); + xtw.WriteEndElement(); + break; } xtw.Flush(); diff --git a/SabreTools.Library/DatFiles/SabreDat.cs b/SabreTools.Library/DatFiles/SabreDat.cs index 758b0b41..8deb4728 100644 --- a/SabreTools.Library/DatFiles/SabreDat.cs +++ b/SabreTools.Library/DatFiles/SabreDat.cs @@ -1489,6 +1489,14 @@ namespace SabreTools.Library.DatFiles xtw.WriteOptionalAttributeString("sha512", softwareList.Filter); xtw.WriteEndElement(); break; + + case ItemType.Sound: + var sound = datItem as Sound; + xtw.WriteStartElement("file"); + xtw.WriteAttributeString("type", "sound"); + xtw.WriteOptionalAttributeString("channels", sound.Channels); + xtw.WriteEndElement(); + break; } xtw.Flush(); diff --git a/SabreTools.Library/DatItems/Auxiliary.cs b/SabreTools.Library/DatItems/Auxiliary.cs index c1df539a..f42cedb2 100644 --- a/SabreTools.Library/DatItems/Auxiliary.cs +++ b/SabreTools.Library/DatItems/Auxiliary.cs @@ -311,17 +311,6 @@ namespace SabreTools.Library.DatItems public bool? Default { get; set; } } - /// - /// Represents one ListXML sound - /// - /// TODO: Promote to DatItem level - [JsonObject("sound")] - public class Sound - { - [JsonProperty("channels")] - public string Channels { get; set; } // TODO: Int32? - } - #endregion #region OpenMSX diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs index dd9a6364..0b76e491 100644 --- a/SabreTools.Library/DatItems/DatItem.cs +++ b/SabreTools.Library/DatItems/DatItem.cs @@ -503,6 +503,9 @@ namespace SabreTools.Library.DatItems case ItemType.SoftwareList: return new SoftwareList(); + case ItemType.Sound: + return new Sound(); + default: return new Rom(); } @@ -525,6 +528,7 @@ namespace SabreTools.Library.DatItems ItemType.Sample => new Sample(), ItemType.Slot => new Slot(), ItemType.SoftwareList => new SoftwareList(), + ItemType.Sound => new Sound(), _ => new Rom(), }; #endif diff --git a/SabreTools.Library/DatItems/Enums.cs b/SabreTools.Library/DatItems/Enums.cs index b7df48a6..5b8bb133 100644 --- a/SabreTools.Library/DatItems/Enums.cs +++ b/SabreTools.Library/DatItems/Enums.cs @@ -146,10 +146,6 @@ namespace SabreTools.Library.DatItems Machine_Display_VBEnd, Machine_Display_VBStart, - // Sounds - Machine_Sounds, - Machine_Sound_Channels, - // Conditions Machine_Conditions, Machine_Condition_Tag, @@ -398,6 +394,9 @@ namespace SabreTools.Library.DatItems DatItem_SoftwareListStatus, DatItem_Filter, + // Sounds + DatItem_Channels, + #endregion #endregion // Item-Specific @@ -446,6 +445,7 @@ namespace SabreTools.Library.DatItems Sample, Slot, SoftwareList, + Sound, Blank = 99, // This is not a real type, only used internally } diff --git a/SabreTools.Library/DatItems/Machine.cs b/SabreTools.Library/DatItems/Machine.cs index 45c88cf0..58a9b3df 100644 --- a/SabreTools.Library/DatItems/Machine.cs +++ b/SabreTools.Library/DatItems/Machine.cs @@ -158,12 +158,6 @@ namespace SabreTools.Library.DatItems [JsonProperty("displays", DefaultValueHandling = DefaultValueHandling.Ignore)] public List Displays { get; set; } = null; - /// - /// List of associated sounds - /// - [JsonProperty("sounds", DefaultValueHandling = DefaultValueHandling.Ignore)] - public List Sounds { get; set; } = null; - /// /// List of associated conditions /// @@ -553,7 +547,6 @@ namespace SabreTools.Library.DatItems SourceFile = this.SourceFile, Runnable = this.Runnable, Displays = this.Displays, - Sounds = this.Sounds, Conditions = this.Conditions, Inputs = this.Inputs, Ports = this.Ports, @@ -1039,34 +1032,6 @@ namespace SabreTools.Library.DatItems #endregion - #region Sounds - - // Machine_Sounds - if (filter.Machine_Sounds.MatchesNeutral(null, Sounds?.Any() ?? null) == false) - return false; - - // Machine_Sound_Channels - if (Sounds?.Any() == true) - { - bool anyPositive = false; - bool anyNegative = false; - - foreach (var sound in Sounds) - { - if (filter.Machine_Sound_Channels.MatchesPositiveSet(sound?.Channels) != false) - anyPositive = true; - if (filter.Machine_Sound_Channels.MatchesNegativeSet(sound?.Channels) == true) - anyNegative = true; - } - - if (!anyPositive) - return false; - if (anyNegative) - return false; - } - - #endregion - #region Conditions // Machine_Conditions diff --git a/SabreTools.Library/DatItems/Sound.cs b/SabreTools.Library/DatItems/Sound.cs new file mode 100644 index 00000000..16d9bb6c --- /dev/null +++ b/SabreTools.Library/DatItems/Sound.cs @@ -0,0 +1,173 @@ +using System.Collections.Generic; +using System.Linq; + +using SabreTools.Library.Filtering; +using Newtonsoft.Json; + +namespace SabreTools.Library.DatItems +{ + /// + /// Represents the sound output for a machine + /// + [JsonObject("sound")] + public class Sound : DatItem + { + #region Fields + + /// + /// Number of channels + /// + [JsonProperty("channels")] + public string Channels { get; set; } // TODO: Int32? + + #endregion + + #region Accessors + + /// + /// Set fields with given values + /// + /// Mappings dictionary + public override void SetFields(Dictionary mappings) + { + // Set base fields + base.SetFields(mappings); + + // Handle Sample-specific fields + if (mappings.Keys.Contains(Field.DatItem_Channels)) + Channels = mappings[Field.DatItem_Channels]; + } + + #endregion + + #region Constructors + + /// + /// Create a default, empty Sound object + /// + public Sound() + { + ItemType = ItemType.Sound; + } + + #endregion + + #region Cloning Methods + + public override object Clone() + { + return new Sound() + { + ItemType = this.ItemType, + DupeType = this.DupeType, + + AltName = this.AltName, + AltTitle = this.AltTitle, + + Original = this.Original, + OpenMSXSubType = this.OpenMSXSubType, + OpenMSXType = this.OpenMSXType, + Remark = this.Remark, + Boot = this.Boot, + + Part = this.Part, + Features = this.Features, + AreaName = this.AreaName, + AreaSize = this.AreaSize, + AreaWidth = this.AreaWidth, + AreaEndianness = this.AreaEndianness, + Value = this.Value, + LoadFlag = this.LoadFlag, + + Machine = this.Machine.Clone() as Machine, + Source = this.Source.Clone() as Source, + Remove = this.Remove, + + Channels = this.Channels, + }; + } + + #endregion + + #region Comparision Methods + + public override bool Equals(DatItem other) + { + // If we don't have a Sound, return false + if (ItemType != other.ItemType) + return false; + + // Otherwise, treat it as a Sound + Sound newOther = other as Sound; + + // If the Sound information matches + return (Channels == newOther.Channels); + } + + #endregion + + #region Filtering + + /// + /// Check to see if a DatItem passes the filter + /// + /// Filter to check against + /// True if the item passed the filter, false otherwise + public override bool PassesFilter(Filter filter) + { + // Check common fields first + if (!base.PassesFilter(filter)) + return false; + + // Filter on channels + if (filter.DatItem_Channels.MatchesPositiveSet(Channels) == false) + return false; + if (filter.DatItem_Channels.MatchesNegativeSet(Channels) == true) + return false; + + return true; + } + + /// + /// Remove fields from the DatItem + /// + /// List of Fields to remove + public override void RemoveFields(List fields) + { + // Remove common fields first + base.RemoveFields(fields); + + // Remove the fields + if (fields.Contains(Field.DatItem_Channels)) + Channels = null; + } + + #endregion + + #region Sorting and Merging + + /// + /// Replace fields from another item + /// + /// DatItem to pull new information from + /// List of Fields representing what should be updated + public override void ReplaceFields(DatItem item, List fields) + { + // Replace common fields first + base.ReplaceFields(item, fields); + + // If we don't have a Sound to replace from, ignore specific fields + if (item.ItemType != ItemType.Sound) + return; + + // Cast for easier access + Sound newItem = item as Sound; + + // Replace the fields + if (fields.Contains(Field.DatItem_Channels)) + Channels = newItem.Channels; + } + + #endregion + } +} diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs index c6001628..2eac69ee 100644 --- a/SabreTools.Library/Filtering/Filter.cs +++ b/SabreTools.Library/Filtering/Filter.cs @@ -68,10 +68,6 @@ namespace SabreTools.Library.Filtering public FilterItem Machine_Display_VBEnd { get; private set; } = new FilterItem(); public FilterItem Machine_Display_VBStart { get; private set; } = new FilterItem(); - // Sounds - public FilterItem Machine_Sounds { get; private set; } = new FilterItem() { Neutral = null }; - public FilterItem Machine_Sound_Channels { get; private set; } = new FilterItem(); - // Conditions public FilterItem Machine_Conditions { get; private set; } = new FilterItem() { Neutral = null }; public FilterItem Machine_Condition_Tag { get; private set; } = new FilterItem(); @@ -320,6 +316,9 @@ namespace SabreTools.Library.Filtering public FilterItem DatItem_SoftwareListStatus { get; private set; } = new FilterItem() { Positive = SoftwareListStatus.NULL, Negative = SoftwareListStatus.NULL }; public FilterItem DatItem_Filter { get; private set; } = new FilterItem(); + // Sound + public FilterItem DatItem_Channels { get; private set; } = new FilterItem(); + #endregion #endregion // Item-Specific @@ -653,21 +652,6 @@ namespace SabreTools.Library.Filtering Machine_Display_VBStart.PositiveSet.Add(value); break; - // Sounds - case Field.Machine_Sounds: - if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase)) - Machine_Sounds.Neutral = false; - else - Machine_Sounds.Neutral = true; - break; - - case Field.Machine_Sound_Channels: - if (negate) - Machine_Sound_Channels.NegativeSet.Add(value); - else - Machine_Sound_Channels.PositiveSet.Add(value); - break; - // Conditions case Field.Machine_Conditions: if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase)) @@ -1802,11 +1786,19 @@ namespace SabreTools.Library.Filtering DatItem_Filter.PositiveSet.Add(value); break; - #endregion + // Sound + case Field.DatItem_Channels: + if (negate) + DatItem_Channels.NegativeSet.Add(value); + else + DatItem_Channels.PositiveSet.Add(value); + break; - #endregion // Item-Specifics + #endregion - #endregion // DatItem Filters + #endregion // Item-Specifics + + #endregion // DatItem Filters } } diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs index a211b96c..ab95deb6 100644 --- a/SabreTools.Library/Tools/Converters.cs +++ b/SabreTools.Library/Tools/Converters.cs @@ -500,12 +500,6 @@ namespace SabreTools.Library.Tools case "display_vbstart": return Field.Machine_Display_VBStart; - case "sounds": - return Field.Machine_Sounds; - - case "sound_channels": - return Field.Machine_Sound_Channels; - case "conditions": return Field.Machine_Conditions; @@ -1049,9 +1043,13 @@ namespace SabreTools.Library.Tools case "filter": return Field.DatItem_Filter; - #endregion + // Sound + case "channels": + return Field.DatItem_Channels; - #endregion // Item-Specific + #endregion + + #endregion // Item-Specific } } @@ -1584,6 +1582,8 @@ namespace SabreTools.Library.Tools return ItemType.Slot; case "softwarelist": return ItemType.SoftwareList; + case "sound": + return ItemType.Sound; default: return null; } @@ -1606,6 +1606,7 @@ namespace SabreTools.Library.Tools "sample" => ItemType.Sample, "slot" => ItemType.Slot, "softwarelist" => ItemType.SoftwareList, + "sound" => ItemType.Sound, _ => null, }; #endif @@ -2029,6 +2030,8 @@ namespace SabreTools.Library.Tools return "slot"; case ItemType.SoftwareList: return "softwarelist"; + case ItemType.Sound: + return "sound"; default: return null; } @@ -2051,6 +2054,7 @@ namespace SabreTools.Library.Tools ItemType.Sample => "sample", ItemType.Slot => "slot", ItemType.SoftwareList => "softwarelist", + ItemType.Sound => "sound", _ => null, }; #endif