diff --git a/SabreTools.Core/Enums.cs b/SabreTools.Core/Enums.cs index fab92427..a9a4bb34 100644 --- a/SabreTools.Core/Enums.cs +++ b/SabreTools.Core/Enums.cs @@ -891,7 +891,7 @@ namespace SabreTools.Core #region Common - DatItem_Type, + Type, #endregion @@ -900,172 +900,172 @@ namespace SabreTools.Core #region Actionable // Rom - DatItem_Name, - DatItem_Bios, - DatItem_Size, - DatItem_CRC, - DatItem_MD5, + Name, + Bios, + Size, + CRC, + MD5, #if NET_FRAMEWORK - DatItem_RIPEMD160, + RIPEMD160, #endif - DatItem_SHA1, - DatItem_SHA256, - DatItem_SHA384, - DatItem_SHA512, - DatItem_SpamSum, - DatItem_Merge, - DatItem_Region, - DatItem_Offset, - DatItem_Date, - DatItem_Status, - DatItem_Optional, - DatItem_Inverted, + SHA1, + SHA256, + SHA384, + SHA512, + SpamSum, + Merge, + Region, + Offset, + Date, + Status, + Optional, + Inverted, // Rom (AttractMode) - DatItem_AltName, - DatItem_AltTitle, + AltName, + AltTitle, // Rom (OpenMSX) - DatItem_Original, - DatItem_OpenMSXSubType, - DatItem_OpenMSXType, - DatItem_Remark, - DatItem_Boot, + Original, + OpenMSXSubType, + OpenMSXType, + Remark, + Boot, // Rom (SoftwareList) - DatItem_LoadFlag, - DatItem_Value, + LoadFlag, + Value, // Disk - DatItem_Index, - DatItem_Writable, + Index, + Writable, #endregion #region Auxiliary // Adjuster - DatItem_Default, + Default, // Analog - DatItem_Analog_Mask, + Analog_Mask, // BiosSet - DatItem_Description, + Description, // Chip - DatItem_Tag, - DatItem_ChipType, - DatItem_Clock, + Tag, + ChipType, + Clock, // Condition - DatItem_Mask, - DatItem_Relation, - DatItem_Condition_Tag, - DatItem_Condition_Mask, - DatItem_Condition_Relation, - DatItem_Condition_Value, + Mask, + Relation, + Condition_Tag, + Condition_Mask, + Condition_Relation, + Condition_Value, // Control - DatItem_Control_Type, - DatItem_Control_Player, - DatItem_Control_Buttons, - DatItem_Control_RequiredButtons, - DatItem_Control_Minimum, - DatItem_Control_Maximum, - DatItem_Control_Sensitivity, - DatItem_Control_KeyDelta, - DatItem_Control_Reverse, - DatItem_Control_Ways, - DatItem_Control_Ways2, - DatItem_Control_Ways3, + Control_Type, + Control_Player, + Control_Buttons, + Control_RequiredButtons, + Control_Minimum, + Control_Maximum, + Control_Sensitivity, + Control_KeyDelta, + Control_Reverse, + Control_Ways, + Control_Ways2, + Control_Ways3, // DataArea - DatItem_AreaName, - DatItem_AreaSize, - DatItem_AreaWidth, - DatItem_AreaEndianness, + AreaName, + AreaSize, + AreaWidth, + AreaEndianness, // Device - DatItem_DeviceType, - DatItem_FixedImage, - DatItem_Mandatory, - DatItem_Interface, + DeviceType, + FixedImage, + Mandatory, + Interface, // Display - DatItem_DisplayType, - DatItem_Rotate, - DatItem_FlipX, - DatItem_Width, - DatItem_Height, - DatItem_Refresh, - DatItem_PixClock, - DatItem_HTotal, - DatItem_HBEnd, - DatItem_HBStart, - DatItem_VTotal, - DatItem_VBEnd, - DatItem_VBStart, + DisplayType, + Rotate, + FlipX, + Width, + Height, + Refresh, + PixClock, + HTotal, + HBEnd, + HBStart, + VTotal, + VBEnd, + VBStart, // Driver - DatItem_SupportStatus, - DatItem_EmulationStatus, - DatItem_CocktailStatus, - DatItem_SaveStateStatus, + SupportStatus, + EmulationStatus, + CocktailStatus, + SaveStateStatus, // Extension - DatItem_Extension_Name, + Extension_Name, // Feature - DatItem_FeatureType, - DatItem_FeatureStatus, - DatItem_FeatureOverall, + FeatureType, + FeatureStatus, + FeatureOverall, // Input - DatItem_Service, - DatItem_Tilt, - DatItem_Players, - DatItem_Coins, + Service, + Tilt, + Players, + Coins, // Instance - DatItem_Instance_Name, - DatItem_Instance_BriefName, + Instance_Name, + Instance_BriefName, // Location - DatItem_Location_Name, - DatItem_Location_Number, - DatItem_Location_Inverted, + Location_Name, + Location_Number, + Location_Inverted, // Part - DatItem_Part_Name, - DatItem_Part_Interface, + Part_Name, + Part_Interface, // PartFeature - DatItem_Part_Feature_Name, - DatItem_Part_Feature_Value, + Part_Feature_Name, + Part_Feature_Value, // RamOption - DatItem_Content, + Content, // Release - DatItem_Language, + Language, // Setting - DatItem_Setting_Name, - DatItem_Setting_Value, - DatItem_Setting_Default, + Setting_Name, + Setting_Value, + Setting_Default, // SlotOption - DatItem_SlotOption_Name, - DatItem_SlotOption_DeviceName, - DatItem_SlotOption_Default, + SlotOption_Name, + SlotOption_DeviceName, + SlotOption_Default, // SoftwareList - DatItem_SoftwareListStatus, - DatItem_Filter, + SoftwareListStatus, + Filter, // Sound - DatItem_Channels, + Channels, #endregion diff --git a/SabreTools.Core/Tools/Converters.cs b/SabreTools.Core/Tools/Converters.cs index 710ca78d..fc6b3470 100644 --- a/SabreTools.Core/Tools/Converters.cs +++ b/SabreTools.Core/Tools/Converters.cs @@ -133,6 +133,675 @@ namespace SabreTools.Core.Tools #endif } + /// + /// Get DatHeaderField value from input string + /// + /// String to get value from + /// DatHeaderField value corresponding to the string + public static DatHeaderField AsDatHeaderField(this string input) + { + // If the input is empty, we return null + if (string.IsNullOrEmpty(input)) + return DatHeaderField.NULL; + + // Normalize the input + input = input.ToLowerInvariant(); + + // Create regex + string headerRegex = @"^(dat|header|datheader)[.\-_\s]"; + + // If we don't have a header field, skip + if (!Regex.IsMatch(input, headerRegex)) + return DatHeaderField.NULL; + + // Replace the match and re-normalize + string headerInput = Regex.Replace(input, headerRegex, string.Empty) + .Replace(' ', '_') + .Replace('-', '_') + .Replace('.', '_'); + + switch (headerInput) + { + #region Common + + case "file": + case "filename": + case "file_name": + return DatHeaderField.FileName; + + case "dat": + case "datname": + case "dat_name": + case "internalname": + case "internal_name": + return DatHeaderField.Name; + + case "desc": + case "description": + return DatHeaderField.Description; + + case "root": + case "rootdir": + case "root_dir": + case "rootdirectory": + case "root_directory": + return DatHeaderField.RootDir; + + case "category": + return DatHeaderField.Category; + + case "version": + return DatHeaderField.Version; + + case "date": + case "timestamp": + case "time_stamp": + return DatHeaderField.Date; + + case "author": + return DatHeaderField.Author; + + case "email": + case "e_mail": + return DatHeaderField.Email; + + case "homepage": + case "home_page": + return DatHeaderField.Homepage; + + case "url": + return DatHeaderField.Url; + + case "comment": + return DatHeaderField.Comment; + + case "header": + case "headerskipper": + case "header_skipper": + case "skipper": + return DatHeaderField.HeaderSkipper; + + case "dattype": + case "type": + case "superdat": + return DatHeaderField.Type; + + case "forcemerging": + case "force_merging": + return DatHeaderField.ForceMerging; + + case "forcenodump": + case "force_nodump": + return DatHeaderField.ForceNodump; + + case "forcepacking": + case "force_packing": + return DatHeaderField.ForcePacking; + + #endregion + + #region ListXML + + case "debug": + return DatHeaderField.Debug; + + case "mameconfig": + case "mame_config": + return DatHeaderField.MameConfig; + + #endregion + + #region Logiqx + + case "build": + return DatHeaderField.Build; + + case "rommode": + case "rom_mode": + return DatHeaderField.RomMode; + + case "biosmode": + case "bios_mode": + return DatHeaderField.BiosMode; + + case "samplemode": + case "sample_mode": + return DatHeaderField.SampleMode; + + case "lockrommode": + case "lockrom_mode": + case "lock_rommode": + case "lock_rom_mode": + return DatHeaderField.LockRomMode; + + case "lockbiosmode": + case "lockbios_mode": + case "lock_biosmode": + case "lock_bios_mode": + return DatHeaderField.LockBiosMode; + + case "locksamplemode": + case "locksample_mode": + case "lock_samplemode": + case "lock_sample_mode": + return DatHeaderField.LockSampleMode; + + #endregion + + #region OfflineList + + case "system": + case "plugin": // Used with RomCenter + return DatHeaderField.System; + + case "screenshotwidth": + case "screenshotswidth": + case "screenshot_width": + case "screenshots_width": + return DatHeaderField.ScreenshotsWidth; + + case "screenshotheight": + case "screenshotsheight": + case "screenshot_height": + case "screenshots_height": + return DatHeaderField.ScreenshotsHeight; + + case "info_name": + case "infos_name": + return DatHeaderField.Info_Name; + + case "info_visible": + case "infos_visible": + return DatHeaderField.Info_Visible; + + case "info_isnamingoption": + case "info_is_naming_option": + case "infos_isnamingoption": + case "infos_is_naming_option": + return DatHeaderField.Info_IsNamingOption; + + case "info_default": + case "infos_default": + return DatHeaderField.Info_Default; + + case "canopen": + case "can_open": + return DatHeaderField.CanOpen; + + case "romtitle": + case "rom_title": + return DatHeaderField.RomTitle; + + #endregion + + #region RomCenter + + case "rcversion": + case "rc_version": + case "romcenterversion": + case "romcenter_version": + case "rom_center_version": + return DatHeaderField.RomCenterVersion; + + #endregion + + default: + return DatHeaderField.NULL; + } + } + + /// + /// Get DatItemField value from input string + /// + /// String to get value from + /// DatItemField value corresponding to the string + public static DatItemField AsDatItemField(this string input) + { + // If the input is empty, we return null + if (string.IsNullOrEmpty(input)) + return DatItemField.NULL; + + // Normalize the input + input = input.ToLowerInvariant(); + + // Create regex + string datItemRegex = @"^(item|datitem)[.\-_\s]"; + + // If we don't have an item field, skip + if (!Regex.IsMatch(input, datItemRegex)) + return DatItemField.NULL; + + // Replace the match and re-normalize + string itemInput = Regex.Replace(input, datItemRegex, string.Empty) + .Replace(' ', '_') + .Replace('-', '_') + .Replace('.', '_'); + + switch (itemInput) + { + #region Common + + case "type": + return DatItemField.Type; + + #endregion + + #region Item-Specific + + #region Actionable + + // Rom + case "name": + return DatItemField.Name; + + case "bios": + return DatItemField.Bios; + + case "size": + return DatItemField.Size; + + case "crc": + case "crc32": + return DatItemField.CRC; + + case "md5": + case "md5_hash": + return DatItemField.MD5; + +#if NET_FRAMEWORK + case "ripemd160": + case "ripemd160_hash": + return DatItemField.RIPEMD160; +#endif + + case "sha1": + case "sha_1": + case "sha1hash": + case "sha1_hash": + case "sha_1hash": + case "sha_1_hash": + return DatItemField.SHA1; + + case "sha256": + case "sha_256": + case "sha256hash": + case "sha256_hash": + case "sha_256hash": + case "sha_256_hash": + return DatItemField.SHA256; + + case "sha384": + case "sha_384": + case "sha384hash": + case "sha384_hash": + case "sha_384hash": + case "sha_384_hash": + return DatItemField.SHA384; + + case "sha512": + case "sha_512": + case "sha512hash": + case "sha512_hash": + case "sha_512hash": + case "sha_512_hash": + return DatItemField.SHA512; + + case "spamsum": + case "spam_sum": + return DatItemField.SpamSum; + + case "merge": + case "mergetag": + case "merge_tag": + return DatItemField.Merge; + + case "region": + return DatItemField.Region; + + case "offset": + return DatItemField.Offset; + + case "date": + return DatItemField.Date; + + case "status": + return DatItemField.Status; + + case "optional": + return DatItemField.Optional; + + case "inverted": + return DatItemField.Inverted; + + // Rom (AttractMode) + case "altname": + case "alt name": + case "alt-name": + case "altromname": + case "alt romname": + case "alt-romname": + return DatItemField.AltName; + + case "alttitle": + case "alt title": + case "alt-title": + case "altromtitle": + case "alt romtitle": + case "alt-romtitle": + return DatItemField.AltTitle; + + // Rom (OpenMSX) + case "original": + return DatItemField.Original; + + case "subtype": + case "sub_type": + case "openmsxsubtype": + case "openmsx_subtype": + return DatItemField.OpenMSXSubType; + + case "openmsxtype": + case "openmsx_type": + return DatItemField.OpenMSXType; + + case "remark": + return DatItemField.Remark; + + case "boot": + return DatItemField.Boot; + + // Rom (SoftwareList) + case "areaname": + case "area_name": + return DatItemField.AreaName; + + case "areasize": + case "area_size": + return DatItemField.AreaSize; + + case "areawidth": + case "area_width": + return DatItemField.AreaWidth; + + case "areaendinanness": + case "area_endianness": + return DatItemField.AreaEndianness; + + case "loadflag": + case "load_flag": + return DatItemField.LoadFlag; + + case "partname": + case "part_name": + return DatItemField.Part_Name; + + case "partinterface": + case "part_interface": + return DatItemField.Part_Interface; + + case "part_feature_name": + return DatItemField.Part_Feature_Name; + + case "part_feature_value": + return DatItemField.Part_Feature_Value; + + case "value": + return DatItemField.Value; + + // Disk + case "index": + return DatItemField.Index; + + case "writable": + return DatItemField.Writable; + + #endregion + + #region Auxiliary + + // Adjuster + case "default": + return DatItemField.Default; + + // Analog + case "analog_mask": + return DatItemField.Analog_Mask; + + // BiosSet + case "description": + case "biosdescription": + case "bios_description": + return DatItemField.Description; + + // Chip + case "tag": + return DatItemField.Tag; + + case "chiptype": + case "chip_type": + return DatItemField.ChipType; + + case "clock": + return DatItemField.Clock; + + // Condition + case "mask": + return DatItemField.Mask; + + case "relation": + return DatItemField.Relation; + + case "condition_tag": + return DatItemField.Condition_Tag; + + case "condition_mask": + return DatItemField.Condition_Mask; + + case "condition_relation": + return DatItemField.Condition_Relation; + + case "condition_value": + return DatItemField.Condition_Value; + + // Control + case "control_type": + return DatItemField.Control_Type; + + case "control_player": + return DatItemField.Control_Player; + + case "control_buttons": + return DatItemField.Control_Buttons; + + case "control_reqbuttons": + return DatItemField.Control_RequiredButtons; + + case "control_minimum": + return DatItemField.Control_Minimum; + + case "control_maximum": + return DatItemField.Control_Maximum; + + case "control_sensitivity": + return DatItemField.Control_Sensitivity; + + case "control_keydelta": + return DatItemField.Control_KeyDelta; + + case "control_reverse": + return DatItemField.Control_Reverse; + + case "control_ways": + return DatItemField.Control_Ways; + + case "control_ways2": + return DatItemField.Control_Ways2; + + case "control_ways3": + return DatItemField.Control_Ways3; + + // Device + case "devicetype": + return DatItemField.DeviceType; + + case "fixedimage": + return DatItemField.FixedImage; + + case "mandatory": + return DatItemField.Mandatory; + + case "interface": + return DatItemField.Interface; + + // Display + case "displaytype": + return DatItemField.DisplayType; + + case "rotate": + return DatItemField.Rotate; + + case "flipx": + return DatItemField.FlipX; + + case "width": + return DatItemField.Width; + + case "height": + return DatItemField.Height; + + case "refresh": + return DatItemField.Refresh; + + case "pixclock": + return DatItemField.PixClock; + + case "htotal": + return DatItemField.HTotal; + + case "hbend": + return DatItemField.HBEnd; + + case "hbstart": + return DatItemField.HBStart; + + case "vtotal": + return DatItemField.VTotal; + + case "vbend": + return DatItemField.VBEnd; + + case "vbstart": + return DatItemField.VBStart; + + // Driver + case "supportstatus": + return DatItemField.SupportStatus; + + case "emulationstatus": + return DatItemField.EmulationStatus; + + case "cocktailstatus": + return DatItemField.CocktailStatus; + + case "savestatestatus": + return DatItemField.SaveStateStatus; + + // Extension + case "extension_name": + return DatItemField.Extension_Name; + + // Feature + case "featuretype": + return DatItemField.FeatureType; + + case "featurestatus": + return DatItemField.FeatureStatus; + + case "featureoverall": + return DatItemField.FeatureOverall; + + // Input + case "service": + return DatItemField.Service; + + case "tilt": + return DatItemField.Tilt; + + case "players": + return DatItemField.Players; + + case "coins": + return DatItemField.Coins; + + // Instance + case "instance_name": + return DatItemField.Instance_Name; + + case "instance_briefname": + return DatItemField.Instance_BriefName; + + // Location + case "location_name": + return DatItemField.Location_Name; + + case "location_number": + return DatItemField.Location_Number; + + case "location_inverted": + return DatItemField.Location_Inverted; + + // RamOption + case "content": + return DatItemField.Content; + + // Release + case "language": + return DatItemField.Language; + + // Setting + case "setting_name": + case "value_name": + return DatItemField.Setting_Name; + + case "setting_value": + case "value_value": + return DatItemField.Setting_Value; + + case "setting_default": + case "value_default": + return DatItemField.Setting_Default; + + // SlotOption + case "slotoption_name": + return DatItemField.SlotOption_Name; + + case "slotoption_devicename": + return DatItemField.SlotOption_DeviceName; + + case "slotoption_default": + return DatItemField.SlotOption_Default; + + // SoftwareList + case "softwareliststatus": + case "softwarelist_status": + return DatItemField.SoftwareListStatus; + + case "filter": + return DatItemField.Filter; + + // Sound + case "channels": + return DatItemField.Channels; + + #endregion + + #endregion // Item-Specific + + default: + return DatItemField.NULL; + } + } + /// /// Get DeviceType value from input string /// @@ -1853,6 +2522,194 @@ namespace SabreTools.Core.Tools #endif } + /// + /// Get MachineField value from input string + /// + /// String to get value from + /// MachineField value corresponding to the string + public static MachineField AsMachineField(this string input) + { + // If the input is empty, we return null + if (string.IsNullOrEmpty(input)) + return MachineField.NULL; + + // Normalize the input + input = input.ToLowerInvariant(); + + // Create regex + string machineRegex = @"^(game|machine)[.\-_\s]"; + + // If we don't have a machine field, skip + if (!Regex.IsMatch(input, machineRegex)) + return MachineField.NULL; + + // Replace the match and re-normalize + string machineInput = Regex.Replace(input, machineRegex, string.Empty) + .Replace(' ', '_') + .Replace('-', '_') + .Replace('.', '_'); + + switch (machineInput) + { + #region Common + + case "name": + return MachineField.Name; + + case "comment": + case "extra": // Used with AttractMode + return MachineField.Comment; + + case "desc": + case "description": + return MachineField.Description; + + case "year": + return MachineField.Year; + + case "manufacturer": + return MachineField.Manufacturer; + + case "publisher": + return MachineField.Publisher; + + case "category": + return MachineField.Category; + + case "romof": + case "rom_of": + return MachineField.RomOf; + + case "cloneof": + case "clone_of": + return MachineField.CloneOf; + + case "sampleof": + case "sample_of": + return MachineField.SampleOf; + + case "type": + return MachineField.Type; + + #endregion + + #region AttractMode + + case "players": + return MachineField.Players; + + case "rotation": + return MachineField.Rotation; + + case "control": + return MachineField.Control; + + case "amstatus": + case "am_status": + case "gamestatus": + case "supportstatus": + case "support_status": + return MachineField.Status; + + case "displaycount": + return MachineField.DisplayCount; + + case "displaytype": + return MachineField.DisplayType; + + case "buttons": + return MachineField.Buttons; + + #endregion + + #region ListXML + + case "sourcefile": + case "source_file": + return MachineField.SourceFile; + + case "runnable": + return MachineField.Runnable; + + #endregion + + #region Logiqx + + case "board": + return MachineField.Board; + + case "rebuildto": + case "rebuild_to": + return MachineField.RebuildTo; + + #endregion + + #region Logiqx EmuArc + + case "titleid": + case "title_id": + return MachineField.TitleID; + + case "developer": + return MachineField.Developer; + + case "genre": + return MachineField.Genre; + + case "subgenre": + case "sub_genre": + return MachineField.Subgenre; + + case "ratings": + return MachineField.Ratings; + + case "score": + return MachineField.Score; + + case "enabled": + return MachineField.Enabled; + + case "crc": + case "hascrc": + case "has_crc": + return MachineField.CRC; + + case "relatedto": + case "related_to": + return MachineField.RelatedTo; + + #endregion + + #region OpenMSX + + case "genmsxid": + case "genmsx_id": + case "gen_msxid": + case "gen_msx_id": + return MachineField.GenMSXID; + + case "system": + case "msxsystem": + case "msx_system": + return MachineField.System; + + case "country": + return MachineField.Country; + + #endregion + + #region SoftwareList + + case "supported": + return MachineField.Supported; + + #endregion + + default: + return MachineField.NULL; + } + } + /// /// Get MachineType value from input string /// @@ -2226,8 +3083,6 @@ namespace SabreTools.Core.Tools #region Enum to String - // TODO: Field -> string - /// /// Get string value from input ChipType ///