diff --git a/SabreTools.Library/DatFiles/DatFile.cs b/SabreTools.Library/DatFiles/DatFile.cs index 0ee6b444..91a0366d 100644 --- a/SabreTools.Library/DatFiles/DatFile.cs +++ b/SabreTools.Library/DatFiles/DatFile.cs @@ -1626,8 +1626,9 @@ namespace SabreTools.Library.DatFiles /// Filter object to be passed to the DatItem level /// Type of the split that should be performed (split, merged, fully merged) /// ReplaceMode representing what should be updated [only for base replacement] + /// True if descriptions should only be replaced if the game name is the same, false otherwise [only for base replacement] public void DetermineUpdateType(List inputPaths, List basePaths, string outDir, UpdateMode updateMode, bool inplace, bool skip, - bool bare, bool clean, bool remUnicode, bool descAsName, Filter filter, SplitType splitType, ReplaceMode replaceMode) + bool bare, bool clean, bool remUnicode, bool descAsName, Filter filter, SplitType splitType, ReplaceMode replaceMode, bool onlySame) { // Ensure we only have files in the inputs List inputFileNames = Utilities.GetOnlyFilesFromInputs(inputPaths, appendparent: true); @@ -1681,7 +1682,7 @@ namespace SabreTools.Library.DatFiles else if ((updateMode & UpdateMode.BaseReplace) != 0 || (updateMode & UpdateMode.ReverseBaseReplace) != 0) { - BaseReplace(inputFileNames, baseFileNames, outDir, inplace, clean, remUnicode, descAsName, filter, splitType, replaceMode); + BaseReplace(inputFileNames, baseFileNames, outDir, inplace, clean, remUnicode, descAsName, filter, splitType, replaceMode, onlySame); } return; @@ -1764,8 +1765,9 @@ namespace SabreTools.Library.DatFiles /// True if all games should be replaced by '!', false otherwise /// String representing root directory to compare against for length calculation /// ReplaceMode representing what should be updated + /// True if descriptions should only be replaced if the game name is the same, false otherwise public void BaseReplace(List inputFileNames, List baseFileNames, string outDir, bool inplace, bool clean, bool remUnicode, - bool descAsName, Filter filter, SplitType splitType, ReplaceMode replaceMode) + bool descAsName, Filter filter, SplitType splitType, ReplaceMode replaceMode, bool onlySame) { // First we want to parse all of the base DATs into the input InternalStopwatch watch = new InternalStopwatch("Populating base DAT for replacement..."); @@ -1922,7 +1924,10 @@ namespace SabreTools.Library.DatFiles { if ((replaceMode & ReplaceMode.Description) != 0) { - newDatItem.MachineDescription = this[key][0].MachineDescription; + if (!onlySame || (onlySame && newDatItem.MachineName == newDatItem.MachineDescription)) + { + newDatItem.MachineDescription = this[key][0].MachineDescription; + } } if ((replaceMode & ReplaceMode.Year) != 0) { diff --git a/SabreTools/SabreTools.Help.cs b/SabreTools/SabreTools.Help.cs index 45b6b43a..578183c1 100644 --- a/SabreTools/SabreTools.Help.cs +++ b/SabreTools/SabreTools.Help.cs @@ -482,6 +482,17 @@ namespace SabreTools null); } } + private static Feature onlySameFlag + { + get + { + return new Feature( + new List() { "-ons", "--only-same" }, + "Only update description if machine name matches description", + FeatureType.Flag, + null); + } + } private static Feature outputAllFlag { get @@ -2261,6 +2272,7 @@ namespace SabreTools update["base-replace"].AddFeature("update-names", updateNamesFlag); update["base-replace"].AddFeature("update-hashes", updateHashesFlag); update["base-replace"].AddFeature("update-description", updateDescriptionFlag); + update["base-replace"]["update-description"].AddFeature("only-same", onlySameFlag); update["base-replace"].AddFeature("update-year", updateYearFlag); update["base-replace"].AddFeature("update-manufacturer", updateManufacturerFlag); update.AddFeature("reverse-base-replace", reverseBaseReplaceFlag); @@ -2268,6 +2280,7 @@ namespace SabreTools update["reverse-base-replace"].AddFeature("update-names", updateNamesFlag); update["reverse-base-replace"].AddFeature("update-hashes", updateHashesFlag); update["reverse-base-replace"].AddFeature("update-description", updateDescriptionFlag); + update["reverse-base-replace"]["update-description"].AddFeature("only-same", onlySameFlag); update["reverse-base-replace"].AddFeature("update-year", updateYearFlag); update["reverse-base-replace"].AddFeature("update-manufacturer", updateManufacturerFlag); update.AddFeature("game-name", gameNameListInput); diff --git a/SabreTools/SabreTools.Inits.cs b/SabreTools/SabreTools.Inits.cs index 0602e087..b5f888a9 100644 --- a/SabreTools/SabreTools.Inits.cs +++ b/SabreTools/SabreTools.Inits.cs @@ -235,6 +235,7 @@ namespace SabreTools /// True if we should remove non-ASCII characters from output, false otherwise (default) /// True if descriptions should be used as names, false otherwise (default) /// ReplaceMode representing what should be updated [only for base replacement] + /// True if descriptions should only be replaced if the game name is the same, false otherwise [only for base replacement] private static void InitUpdate( List inputPaths, List basePaths, @@ -257,7 +258,8 @@ namespace SabreTools bool clean, bool remUnicode, bool descAsName, - ReplaceMode replaceMode) + ReplaceMode replaceMode, + bool onlySame) { // Normalize the extensions datHeader.AddExtension = (String.IsNullOrWhiteSpace(datHeader.AddExtension) || datHeader.AddExtension.StartsWith(".") @@ -311,7 +313,7 @@ namespace SabreTools DatFile userInputDat = new DatFile(datHeader); userInputDat.DetermineUpdateType(inputPaths, basePaths, outDir, updateMode, inplace, skip, bare, clean, - remUnicode, descAsName, filter, splitType, replaceMode); + remUnicode, descAsName, filter, splitType, replaceMode, onlySame); } /// diff --git a/SabreTools/SabreTools.cs b/SabreTools/SabreTools.cs index 1f699f79..3b432984 100644 --- a/SabreTools/SabreTools.cs +++ b/SabreTools/SabreTools.cs @@ -88,6 +88,7 @@ namespace SabreTools inverse = false, noAutomaticDate = false, nostore = false, + onlySame = false, quickScan = false, removeUnicode = false, showBaddumpColumn = false, @@ -311,6 +312,9 @@ namespace SabreTools case "no-store-header": nostore = true; break; + case "only-same": + onlySame = true; + break; case "output-all": datHeader.DatFormat |= DatFormat.ALL; break; @@ -774,7 +778,7 @@ namespace SabreTools case "Update": VerifyInputs(inputs, feature); InitUpdate(inputs, basePaths, datHeader, updateMode, inplace, skipFirstOutput, noAutomaticDate, filter, - splitType, outDir, cleanGameNames, removeUnicode, descAsName, replaceMode); + splitType, outDir, cleanGameNames, removeUnicode, descAsName, replaceMode, onlySame); break; // If we're using the verifier case "Verify":