diff --git a/RombaSharp/RombaSharp.Inits.cs b/RombaSharp/RombaSharp.Inits.cs
index e111512e..0fc22124 100644
--- a/RombaSharp/RombaSharp.Inits.cs
+++ b/RombaSharp/RombaSharp.Inits.cs
@@ -66,8 +66,8 @@ namespace RombaSharp
foreach (string dir in onlyDirs)
{
// TODO: All instances of Hash.DeepHashes should be made into 0x0 eventually
- df.PopulateFromDir(dir, Hash.DeepHashes, false, false, SkipFileType.None, false, false, _tmpdir, false, null, true);
- df.PopulateFromDir(dir, Hash.DeepHashes, false, true, SkipFileType.None, false, false, _tmpdir, false, null, true);
+ df.PopulateFromDir(dir, Hash.DeepHashes, false, false, SkipFileType.None, false, false, _tmpdir, false, null, true, null);
+ df.PopulateFromDir(dir, Hash.DeepHashes, false, true, SkipFileType.None, false, false, _tmpdir, false, null, true, null);
}
// Create an empty Dat for files that need to be rebuilt
@@ -390,7 +390,7 @@ namespace RombaSharp
// Now run the D2D on the input and write out
// TODO: All instances of Hash.DeepHashes should be made into 0x0 eventually
datfile.PopulateFromDir(source, Hash.DeepHashes, true /* bare */, false /* archivesAsFiles */, SkipFileType.None, false /* addBlanks */,
- false /* addDate */, _tmpdir, false /* copyFiles */, null /* headerToCheckAgainst */, true /* chdsAsFiles */);
+ false /* addDate */, _tmpdir, false /* copyFiles */, null /* headerToCheckAgainst */, true /* chdsAsFiles */, null /* filter */);
datfile.Write(outDir: outdat);
}
@@ -897,7 +897,7 @@ namespace RombaSharp
// First get a list of SHA-1's from the input DATs
DatFile datroot = new DatFile { Type = "SuperDAT", };
// TODO: All instances of Hash.DeepHashes should be made into 0x0 eventually
- datroot.PopulateFromDir(_dats, Hash.DeepHashes, false, false, SkipFileType.None, false, false, _tmpdir, false, null, true);
+ datroot.PopulateFromDir(_dats, Hash.DeepHashes, false, false, SkipFileType.None, false, false, _tmpdir, false, null, true, null);
datroot.BucketBy(SortedBy.SHA1, DedupeType.None);
// Create a List of dat hashes in the database (SHA-1)
@@ -1013,7 +1013,7 @@ namespace RombaSharp
// Now rescan the depot itself
DatFile depot = new DatFile();
// TODO: All instances of Hash.DeepHashes should be made into 0x0 eventually
- depot.PopulateFromDir(depotname, Hash.DeepHashes, false, false, SkipFileType.None, false, false, _tmpdir, false, null, true);
+ depot.PopulateFromDir(depotname, Hash.DeepHashes, false, false, SkipFileType.None, false, false, _tmpdir, false, null, true, null);
depot.BucketBy(SortedBy.SHA1, DedupeType.None);
// Set the base queries to use
diff --git a/SabreTools.Library/DatFiles/DatFile.cs b/SabreTools.Library/DatFiles/DatFile.cs
index 3c8951bd..4a5183dc 100644
--- a/SabreTools.Library/DatFiles/DatFile.cs
+++ b/SabreTools.Library/DatFiles/DatFile.cs
@@ -3277,8 +3277,9 @@ namespace SabreTools.Library.DatFiles
/// True if files should be copied to the temp directory before hashing, false otherwise
/// Populated string representing the name of the skipper to use, a blank string to use the first available checker, null otherwise
/// True if CHDs should be treated like regular files, false otherwise
+ /// Filter object to be passed to the DatItem level
public bool PopulateFromDir(string basePath, Hash omitFromScan, bool bare, bool archivesAsFiles, SkipFileType skipFileType,
- bool addBlanks, bool addDate, string tempDir, bool copyFiles, string headerToCheckAgainst, bool chdsAsFiles)
+ bool addBlanks, bool addDate, string tempDir, bool copyFiles, string headerToCheckAgainst, bool chdsAsFiles, Filter filter)
{
// If the description is defined but not the name, set the name from the description
if (String.IsNullOrWhiteSpace(Name) && !String.IsNullOrWhiteSpace(Description))
@@ -3379,6 +3380,12 @@ namespace SabreTools.Library.DatFiles
Utilities.TryDeleteDirectory(tempDir);
}
+ // If we have a valid filter, perform the filtering now
+ if (filter != null && filter != default(Filter))
+ {
+ filter.FilterDatFile(this);
+ }
+
return true;
}
@@ -4523,8 +4530,9 @@ namespace SabreTools.Library.DatFiles
/// True to enable external scanning of archives, false otherwise
/// Populated string representing the name of the skipper to use, a blank string to use the first available checker, null otherwise
/// True if CHDs should be treated like regular files, false otherwise
+ /// Filter object to be passed to the DatItem level
/// True if verification was a success, false otherwise
- public bool VerifyGeneric(List inputs, bool hashOnly, bool quickScan, string headerToCheckAgainst, bool chdsAsFiles)
+ public bool VerifyGeneric(List inputs, bool hashOnly, bool quickScan, string headerToCheckAgainst, bool chdsAsFiles, Filter filter)
{
// TODO: We want the cross section of what's the folder and what's in the DAT. Right now, it just has what's in the DAT that's not in the folder
bool success = true;
@@ -4535,7 +4543,7 @@ namespace SabreTools.Library.DatFiles
{
// TODO: All instances of Hash.DeepHashes should be made into 0x0 eventually
PopulateFromDir(input, (quickScan ? Hash.SecureHashes : Hash.DeepHashes) /* omitFromScan */, true /* bare */, false /* archivesAsFiles */,
- SkipFileType.None, false /* addBlanks */, false /* addDate */, "" /* tempDir */, false /* copyFiles */, headerToCheckAgainst, chdsAsFiles);
+ SkipFileType.None, false /* addBlanks */, false /* addDate */, "" /* tempDir */, false /* copyFiles */, headerToCheckAgainst, chdsAsFiles, filter);
}
// Setup the fixdat
diff --git a/SabreTools.Library/README.1ST b/SabreTools.Library/README.1ST
index ed7b41e5..4b990700 100644
--- a/SabreTools.Library/README.1ST
+++ b/SabreTools.Library/README.1ST
@@ -330,6 +330,165 @@ Options:
compare against the input DATs. This flag forces all CHDs to be
treated like regular files.
+ -gn=, --game-name= Filter by game name
+ Include only items with this game name in the output. Additionally,
+ the user can specify an exact match or full C#-style regex for
+ pattern matching. Multiple instances of this flag are allowed.
+
+ -ngn=, --not-game-name= Filter by not game name
+ Include only items without this game name in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -gd=, --game-description= Filter by game description
+ Include only items with this game description in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -ngd=, --not-game-description= Filter by not game description
+ Include only items without this game description in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -ofg, --match-of-tags Allow cloneof and romof tags to match game name filters
+ If filter or exclude by game name is used, this flag will allow those
+ filters to be checked against the romof and cloneof tags as well.
+ This can allow for more advanced set-building, especially in
+ arcade-based sets.
+
+ -rn=, --item-name= Filter by item name
+ Include only items with this item name in the output. Additionally,
+ the user can specify an exact match or full C#-style regex for
+ pattern matching. Multiple instances of this flag are allowed.
+
+ -nrn=, --not-item-name= Filter by not item name
+ Include only items without this item name in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -rt=, --item-type= Filter by item type
+ Include only items with this item type in the output. Additionally,
+ the user can specify an exact match or full C#-style regex for
+ pattern matching. Multiple instances of this flag are allowed.
+
+ -nrt=, --not-item-type= Filter by not item type
+ Include only items without this item type in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -sgt=, --greater= Filter by size >=
+ Only include items whose size is greater than or equal to this value
+ in the output DAT. Users can specify either a regular integer number
+ or a number with a standard postfix. e.g. 8kb => 8000 or 8kib => 8192
+
+ -slt=, --less= Filter by size =<
+ Only include items whose size is less than or equal to this value in
+ the output DAT. Users can specify either a regular integer number or
+ a number with a standard postfix. e.g. 8kb => 8000 or 8kib => 8192
+
+ -seq=, --equal= Filter by size ==
+ Only include items of this exact size in the output DAT. Users can
+ specify either a regular integer number or a number with a standard
+ postfix. e.g. 8kb => 8000 or 8kib => 8192
+
+ -crc=, --crc= Filter by CRC hash
+ Include only items with this CRC hash in the output. Additionally,
+ the user can specify an exact match or full C#-style regex for
+ pattern matching. Multiple instances of this flag are allowed.
+
+ -ncrc=, --not-crc= Filter by not CRC hash
+ Include only items without this CRC hash in the output. Additionally,
+ the user can specify an exact match or full C#-style regex for
+ pattern matching. Multiple instances of this flag are allowed.
+
+ -md5=, --md5= Filter by MD5 hash
+ Include only items with this MD5 hash in the output. Additionally,
+ the user can specify an exact match or full C#-style regex for
+ pattern matching. Multiple instances of this flag are allowed.
+
+ -nmd5=, --not-md5= Filter by not MD5 hash
+ Include only items without this MD5 hash in the output. Additionally,
+ the user can specify an exact match or full C#-style regex for
+ pattern matching. Multiple instances of this flag are allowed.
+
+ -sha1=, --sha1= Filter by SHA-1 hash
+ Include only items with this SHA-1 hash in the output. Additionally,
+ the user can specify an exact match or full C#-style regex for
+ pattern matching. Multiple instances of this flag are allowed.
+
+ -nsha1=, --not-sha1= Filter by not SHA-1 hash
+ Include only items without this SHA-1 hash in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -sha256=, --sha256= Filter by SHA-256 hash
+ Include only items with this SHA-256 hash in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -nsha256=, --not-sha256= Filter by not SHA-256 hash
+ Include only items without this SHA-256 hash in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -sha384=, --sha384= Filter by SHA-384 hash
+ Include only items with this SHA-384 hash in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -nsha384=, --not-sha384= Filter by not SHA-384 hash
+ Include only items without this SHA-384 hash in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -sha512=, --sha512= Filter by SHA-512 hash
+ Include only items with this SHA-512 hash in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -nsha512=, --not-sha512= Filter by not SHA-512 hash
+ Include only items without this SHA-512 hash in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -is=, --status= Include only items with a given status
+ Include only items with this item status in the output. Multiple
+ instances of this flag are allowed.
+ Possible values are: None, Good, BadDump, Nodump, Verified
+
+ -nis=, --not-status= Exclude only items with a given status
+ Include only items without this item status in the output. Multiple
+ instances of this flag are allowed.
+ Possible values are: None, Good, BadDump, Nodump, Verified
+
+ -gt=, --game-type= Include only games with a given type
+ Include only items with this game type in the output. Multiple
+ instances of this flag are allowed.
+ Possible values are: None, Bios, Device, Mechanical
+
+ -ngt=, --not-game-type= Exclude only games with a given type
+ Include only items without this game type in the output. Multiple
+ instances of this flag are allowed.
+ Possible values are: None, Bios, Device, Mechanical
+
+ -run, --runnable Include only items that are marked runnable
+ This allows users to include only verified runnable games.
+
+ -nrun, --not-runnable Include only items that are not marked runnable
+ This allows users to include only unrunnable games.
+
-t=, --temp= Set the temporary directory to use
Optionally, a temp folder can be supplied in the case the default
temp directory is not preferred.
@@ -1368,6 +1527,165 @@ Options:
parent sets based on the cloneof and romof tags as well as device
references. This is incompatible with the other --dat-X flags.
+ -gn=, --game-name= Filter by game name
+ Include only items with this game name in the output. Additionally,
+ the user can specify an exact match or full C#-style regex for
+ pattern matching. Multiple instances of this flag are allowed.
+
+ -ngn=, --not-game-name= Filter by not game name
+ Include only items without this game name in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -gd=, --game-description= Filter by game description
+ Include only items with this game description in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -ngd=, --not-game-description= Filter by not game description
+ Include only items without this game description in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -ofg, --match-of-tags Allow cloneof and romof tags to match game name filters
+ If filter or exclude by game name is used, this flag will allow those
+ filters to be checked against the romof and cloneof tags as well.
+ This can allow for more advanced set-building, especially in
+ arcade-based sets.
+
+ -rn=, --item-name= Filter by item name
+ Include only items with this item name in the output. Additionally,
+ the user can specify an exact match or full C#-style regex for
+ pattern matching. Multiple instances of this flag are allowed.
+
+ -nrn=, --not-item-name= Filter by not item name
+ Include only items without this item name in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -rt=, --item-type= Filter by item type
+ Include only items with this item type in the output. Additionally,
+ the user can specify an exact match or full C#-style regex for
+ pattern matching. Multiple instances of this flag are allowed.
+
+ -nrt=, --not-item-type= Filter by not item type
+ Include only items without this item type in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -sgt=, --greater= Filter by size >=
+ Only include items whose size is greater than or equal to this value
+ in the output DAT. Users can specify either a regular integer number
+ or a number with a standard postfix. e.g. 8kb => 8000 or 8kib => 8192
+
+ -slt=, --less= Filter by size =<
+ Only include items whose size is less than or equal to this value in
+ the output DAT. Users can specify either a regular integer number or
+ a number with a standard postfix. e.g. 8kb => 8000 or 8kib => 8192
+
+ -seq=, --equal= Filter by size ==
+ Only include items of this exact size in the output DAT. Users can
+ specify either a regular integer number or a number with a standard
+ postfix. e.g. 8kb => 8000 or 8kib => 8192
+
+ -crc=, --crc= Filter by CRC hash
+ Include only items with this CRC hash in the output. Additionally,
+ the user can specify an exact match or full C#-style regex for
+ pattern matching. Multiple instances of this flag are allowed.
+
+ -ncrc=, --not-crc= Filter by not CRC hash
+ Include only items without this CRC hash in the output. Additionally,
+ the user can specify an exact match or full C#-style regex for
+ pattern matching. Multiple instances of this flag are allowed.
+
+ -md5=, --md5= Filter by MD5 hash
+ Include only items with this MD5 hash in the output. Additionally,
+ the user can specify an exact match or full C#-style regex for
+ pattern matching. Multiple instances of this flag are allowed.
+
+ -nmd5=, --not-md5= Filter by not MD5 hash
+ Include only items without this MD5 hash in the output. Additionally,
+ the user can specify an exact match or full C#-style regex for
+ pattern matching. Multiple instances of this flag are allowed.
+
+ -sha1=, --sha1= Filter by SHA-1 hash
+ Include only items with this SHA-1 hash in the output. Additionally,
+ the user can specify an exact match or full C#-style regex for
+ pattern matching. Multiple instances of this flag are allowed.
+
+ -nsha1=, --not-sha1= Filter by not SHA-1 hash
+ Include only items without this SHA-1 hash in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -sha256=, --sha256= Filter by SHA-256 hash
+ Include only items with this SHA-256 hash in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -nsha256=, --not-sha256= Filter by not SHA-256 hash
+ Include only items without this SHA-256 hash in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -sha384=, --sha384= Filter by SHA-384 hash
+ Include only items with this SHA-384 hash in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -nsha384=, --not-sha384= Filter by not SHA-384 hash
+ Include only items without this SHA-384 hash in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -sha512=, --sha512= Filter by SHA-512 hash
+ Include only items with this SHA-512 hash in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -nsha512=, --not-sha512= Filter by not SHA-512 hash
+ Include only items without this SHA-512 hash in the output.
+ Additionally, the user can specify an exact match or full C#-style
+ regex for pattern matching. Multiple instances of this flag are
+ allowed.
+
+ -is=, --status= Include only items with a given status
+ Include only items with this item status in the output. Multiple
+ instances of this flag are allowed.
+ Possible values are: None, Good, BadDump, Nodump, Verified
+
+ -nis=, --not-status= Exclude only items with a given status
+ Include only items without this item status in the output. Multiple
+ instances of this flag are allowed.
+ Possible values are: None, Good, BadDump, Nodump, Verified
+
+ -gt=, --game-type= Include only games with a given type
+ Include only items with this game type in the output. Multiple
+ instances of this flag are allowed.
+ Possible values are: None, Bios, Device, Mechanical
+
+ -ngt=, --not-game-type= Exclude only games with a given type
+ Include only items without this game type in the output. Multiple
+ instances of this flag are allowed.
+ Possible values are: None, Bios, Device, Mechanical
+
+ -run, --runnable Include only items that are marked runnable
+ This allows users to include only verified runnable games.
+
+ -nrun, --not-runnable Include only items that are not marked runnable
+ This allows users to include only unrunnable games.
+
** Section 3.0 - Examples
Here are a few usage examples based on features that are commonly used by most
diff --git a/SabreTools/SabreTools.Help.cs b/SabreTools/SabreTools.Help.cs
index 35a3073f..3167cadb 100644
--- a/SabreTools/SabreTools.Help.cs
+++ b/SabreTools/SabreTools.Help.cs
@@ -5,1826 +5,1826 @@ using SabreTools.Library.Help;
namespace SabreTools
{
- public partial class SabreTools
- {
- #region Private Flag features
+ public partial class SabreTools
+ {
+ #region Private Flag features
- private static Feature _addBlankFilesFlag
- {
- get
- {
- return new Feature(
- "add-blank-files",
- new List() { "-ab", "--add-blank-files" },
- "Output blank files for folders",
- FeatureType.Flag,
- longDescription: "If this flag is set, then blank entries will be created for each of the empty directories in the source. This is useful for tools that require all folders be accounted for in the output DAT.");
- }
- }
- private static Feature _addDateFlag
- {
- get
- {
- return new Feature(
- "add-date",
- new List() { "-ad", "--add-date" },
- "Add dates to items, where posible",
- FeatureType.Flag,
- longDescription: "If this flag is set, then the Date will be appended to each file information in the output DAT. The output format is standardized as \"yyyy/MM/dd HH:mm:ss\".");
- }
- }
- private static Feature _allStatsFlag
- {
- get
- {
- return new Feature(
- "all-stats",
- new List() { "-as", "--all-stats" },
- "Write all statistics to all available formats [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output all statistical information to all available formats. [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _archivesAsFilesFlag
- {
- get
- {
- return new Feature(
- "archives-as-files",
- new List() { "-aaf", "--archives-as-files" },
- "Treat archives as files",
- FeatureType.Flag,
- longDescription: "Instead of trying to enumerate the files within archives, treat the archives as files themselves. This is good for uncompressed sets that include archives that should be read as-is.");
- }
- }
- private static Feature _baddumpColumnFlag
- {
- get
- {
- return new Feature(
- "baddump-column",
- new List() { "-bc", "--baddump-column" },
- "Add baddump stats to output",
- FeatureType.Flag,
- longDescription: "Add a new column or field for counting the number of baddumps in the DAT.");
- }
- }
- private static Feature _baseFlag
- {
- get
- {
- return new Feature(
- "base",
- new List() { "-ba", "--base" },
- "Use source DAT as base name for outputs",
- FeatureType.Flag,
- longDescription: "If splitting an entire folder of DATs, some output files may be normally overwritten since the names would be the same. With this flag, the original DAT name is used in the output name, in the format of \"Original Name(Dir - Name)\". This can be used in conjunction with --short to output in the format of \"Original Name (Name)\" instead.");
- }
- }
- private static Feature _baseReplaceFlag
- {
- get
- {
- return new Feature(
- "base-replace",
- new List() { "-br", "--base-replace" },
- "Replace from base DATs in order",
- FeatureType.Flag,
- longDescription: "By default, no item names are changed except when there is a merge occurring. This flag enables users to define a DAT or set of base DATs to use as \"replacements\" for all input DATs. Note that the first found instance of an item in the base DAT(s) will be used and all others will be discarded. If no additional flag is given, it will default to updating names.");
- }
- }
- private static Feature _chdsAsFilesFlag
- {
- get
- {
- return new Feature(
- "chds-as-files",
- new List() { "-ic", "--chds-as-files" },
- "Treat CHDs as regular files",
- FeatureType.Flag,
- longDescription: "Normally, CHDs would be processed using their internal hash to compare against the input DATs. This flag forces all CHDs to be treated like regular files.");
- }
- }
- private static Feature _cleanFlag
- {
- get
- {
- return new Feature(
- "clean",
- new List() { "-clean", "--clean" },
- "Clean game names according to WoD standards",
- FeatureType.Flag,
- longDescription: "Game names will be sanitized to remove what the original WoD standards deemed as unneeded information, such as parenthesized or bracketed strings.");
- }
- }
- private static Feature _copyFilesFlag
- {
- get
- {
- return new Feature(
- "copy-files",
- new List() { "-cf", "--copy-files" },
- "Copy files to the temp directory before parsing",
- FeatureType.Flag,
- longDescription: "If this flag is set, then all files that are going to be parsed are moved to the temporary directory before being hashed. This can be helpful in cases where the temp folder is located on an SSD and the user wants to take advantage of this.");
- }
- }
- private static Feature _csvFlag
- {
- get
- {
- return new Feature(
- "csv",
- new List() { "-csv", "--csv" },
- "Output in Comma-Separated Value format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output all statistical information in standardized CSV format. [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _datDeviceNonMergedFlag
- {
- get
- {
- return new Feature(
- "dat-device-non-merged",
- new List() { "-dnd", "--dat-device-non-merged" },
- "Create device non-merged sets",
- FeatureType.Flag,
- longDescription: "Preprocess the DAT to have child sets contain all items from the device references. This is incompatible with the other --dat-X flags.");
- }
- }
- private static Feature _datFullNonMergedFlag
- {
- get
- {
- return new Feature(
- "dat-full-non-merged",
- new List() { "-df", "--dat-full-non-merged" },
- "Create fully non-merged sets",
- FeatureType.Flag,
- longDescription: "Preprocess the DAT to have child sets contain all items from the parent sets based on the cloneof and romof tags as well as device references. This is incompatible with the other --dat-X flags.");
- }
- }
- private static Feature _datMergedFlag
- {
- get
- {
- return new Feature(
- "dat-merged",
- new List() { "-dm", "--dat-merged" },
- "Force creating merged sets",
- FeatureType.Flag,
- longDescription: "Preprocess the DAT to have parent sets contain all items from the children based on the cloneof tag. This is incompatible with the other --dat-X flags.");
- }
- }
- private static Feature _datNonMergedFlag
- {
- get
- {
- return new Feature(
- "dat-non-merged",
- new List() { "-dnm", "--dat-non-merged" },
- "Force creating non-merged sets",
- FeatureType.Flag,
- longDescription: "Preprocess the DAT to have child sets contain all items from the parent set based on the romof and cloneof tags. This is incompatible with the other --dat-X flags.");
- }
- }
- private static Feature _datSplitFlag
- {
- get
- {
- return new Feature(
- "dat-split",
- new List() { "-ds", "--dat-split" },
- "Force creating split sets",
- FeatureType.Flag,
- longDescription: "Preprocess the DAT to remove redundant files between parents and children based on the romof and cloneof tags. This is incompatible with the other --dat-X flags.");
- }
- }
- private static Feature _dedupFlag
- {
- get
- {
- return new Feature(
- "dedup",
- new List() { "-dd", "--dedup" },
- "Enable deduping in the created DAT",
- FeatureType.Flag,
- longDescription: "For all outputted DATs, allow for hash deduping. This makes sure that there are effectively no duplicates in the output files. Cannot be used with game dedup.");
- }
- }
- private static Feature _deleteFlag
- {
- get
- {
- return new Feature(
- "delete",
- new List() { "-del", "--delete" },
- "Delete fully rebuilt input files",
- FeatureType.Flag,
- longDescription: "Optionally, the input files, once processed and fully matched, can be deleted. This can be useful when the original file structure is no longer needed or if there is limited space on the source drive.");
- }
- }
- private static Feature _depotFlag
- {
- get
- {
- return new Feature(
- "depot",
- new List() { "-dep", "--depot" },
- "Assume directories are romba depots",
- FeatureType.Flag,
- longDescription: "Normally, input directories will be treated with no special format. If this flag is used, all input directories will be assumed to be romba-style depots.");
- }
- }
- private static Feature _depreciatedFlag
- {
- get
- {
- return new Feature(
- "depreciated",
- new List() { "-dpc", "--depreciated" },
- "Output 'game' instead of 'machine'",
- FeatureType.Flag,
- longDescription: "By default, Logiqx XML DATs output with the more modern \"machine\" tag for each set. This flag allows users to output the older \"game\" tag instead, for compatibility reasons. [Logiqx only]");
- }
- }
- private static Feature _descriptionAsNameFlag
- {
- get
- {
- return new Feature(
- "description-as-name",
- new List() { "-dan", "--description-as-name" },
- "Use description instead of machine name",
- FeatureType.Flag,
- longDescription: "By default, all DATs are converted exactly as they are input. Enabling this flag allows for the machine names in the DAT to be replaced by the machine description instead. In most cases, this will result in no change in the output DAT, but a notable example would be a software list DAT where the machine names are generally DOS-friendly while the description is more complete.");
- }
- }
- private static Feature _diffAgainstFlag
- {
- get
- {
- return new Feature(
- "diff-against",
- new List() { "-dag", "--diff-against" },
- "Diff all inputs against a set of base DATs",
- FeatureType.Flag,
- "This flag will enable a special type of diffing in which a set of base DATs are used as a comparison point for each of the input DATs. This allows users to get a slightly different output to cascaded diffing, which may be more useful in some cases. This is heavily influenced by the diffing model used by Romba.");
- }
- }
- private static Feature _diffAllFlag
- {
- get
- {
- return new Feature(
- "diff-all",
- new List() { "-di", "--diff-all" },
- "Create diffdats from inputs (all standard outputs)",
- FeatureType.Flag,
- longDescription: "By default, all DATs are processed individually with the user-specified flags. With this flag enabled, input DATs are diffed against each other to find duplicates, no duplicates, and only in individuals.");
- }
- }
- private static Feature _diffCascadeFlag
- {
- get
- {
- return new Feature(
- "diff-cascade",
- new List() { "-dc", "--diff-cascade" },
- "Enable cascaded diffing",
- FeatureType.Flag,
- longDescription: "This flag allows for a special type of diffing in which the first DAT is considered a base, and for each additional input DAT, it only leaves the files that are not in one of the previous DATs. This can allow for the creation of rollback sets or even just reduce the amount of duplicates across multiple sets.");
- }
- }
- private static Feature _diffDuplicatesFlag
- {
- get
- {
- return new Feature(
- "diff-duplicates",
- new List() { "-did", "--diff-duplicates" },
- "Create diffdat containing just duplicates",
- FeatureType.Flag,
- longDescription: "All files that have duplicates outside of the original DAT are included.");
- }
- }
- private static Feature _diffIndividualsFlag
- {
- get
- {
- return new Feature(
- "diff-individuals",
- new List() { "-dii", "--diff-individuals" },
- "Create diffdats for individual DATs",
- FeatureType.Flag,
- longDescription: "All files that have no duplicates outside of the original DATs are put into DATs that are named after the source DAT.");
- }
- }
- private static Feature _diffNoDuplicatesFlag
- {
- get
- {
- return new Feature(
- "diff-no-duplicates",
- new List() { "-din", "--diff-no-duplicates" },
- "Create diffdat containing no duplicates",
- FeatureType.Flag,
- longDescription: "All files that have no duplicates outside of the original DATs are included.");
- }
- }
- private static Feature _diffReverseCascadeFlag
- {
- get
- {
- return new Feature(
- "diff-reverse-cascade",
- new List() { "-drc", "--diff-reverse-cascade" },
- "Enable reverse cascaded diffing",
- FeatureType.Flag,
- longDescription: "This flag allows for a special type of diffing in which the last DAT is considered a base, and for each additional input DAT, it only leaves the files that are not in one of the previous DATs. This can allow for the creation of rollback sets or even just reduce the amount of duplicates across multiple sets.");
- }
- }
- private static Feature _excludeOfFlag
- {
- get
- {
- return new Feature(
- "exclude-of",
- new List() { "-xof", "--exclude-of" },
- "Exclude romof, cloneof, sampleof tags",
- FeatureType.Flag,
- longDescription: "If this flag is enabled, then the romof, cloneof, and sampleof tags will be omitted from the outputted DAT.");
- }
- } // TODO: Remove
- private static Feature _extensionFlag
- {
- get
- {
- return new Feature(
- "extension",
- new List() { "-es", "--extension" },
- "Split DAT(s) by two file extensions",
- FeatureType.Flag,
- longDescription: "For a DAT, or set of DATs, allow for splitting based on a list of input extensions. This can allow for combined DAT files, such as those combining two separate systems, to be split. Files with any extensions not listed in the input lists will be included in both outputted DAT files.");
- }
- }
- private static Feature _gameDedupFlag
- {
- get
- {
- return new Feature(
- "game-dedup",
- new List() { "-gdd", "--game-dedup" },
- "Enable deduping within games in the created DAT",
- FeatureType.Flag,
- longDescription: "For all outputted DATs, allow for hash deduping but only within the games, and not across the entire DAT. This makes sure that there are effectively no duplicates within each of the output sets. Cannot be used with standard dedup.");
- }
- }
- private static Feature _gamePrefixFlag
- {
- get
- {
- return new Feature(
- "game-prefix",
- new List() { "-gp", "--game-prefix" },
- "Add game name as a prefix",
- FeatureType.Flag,
- longDescription: "This flag allows for the name of the game to be used as a prefix to each file.");
- }
- }
- private static Feature _hashFlag
- {
- get
- {
- return new Feature(
- "hash",
- new List() { "-hs", "--hash" },
- "Split DAT(s) or folder by best-available hashes",
- FeatureType.Flag,
- longDescription: "For a DAT, or set of DATs, allow for splitting based on the best available hash for each file within. The order of preference for the outputted DATs is as follows: Nodump, SHA-512, SHA-384, SHA-256, SHA-1, MD5, CRC (or worse).");
- }
- }
- private static Feature _hashOnlyFlag
- {
- get
- {
- return new Feature(
- "hash-only",
- new List() { "-ho", "--hash-only" },
- "Check files by hash only",
- FeatureType.Flag,
- longDescription: "This sets a mode where files are not checked based on name but rather hash alone. This allows verification of (possibly) incorrectly named folders and sets to be verified without worrying about the proper set structure to be there.");
- }
- }
- private static Feature _htmlFlag
- {
- get
- {
- return new Feature(
- "html",
- new List() { "-html", "--html" },
- "Output in HTML format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output all statistical information in standardized HTML format. [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _individualFlag
- {
- get
- {
- return new Feature(
- "individual",
- new List() { "-ind", "--individual" },
- "Process input DATs individually",
- FeatureType.Flag,
- longDescription: "In cases where DATs would be processed in bulk, this flag allows them to be processed on their own instead.");
- }
- }
- private static Feature _inplaceFlag
- {
- get
- {
- return new Feature(
- "inplace",
- new List() { "-ip", "--inplace" },
- "Write to the input directories, where possible",
- FeatureType.Flag,
- longDescription: "By default, files are written to the runtime directory (or the output directory, if set). This flag enables users to write out to the directory that the DATs originated from.");
- }
- }
- private static Feature _inverseFlag
- {
- get
- {
- return new Feature(
- "inverse",
- new List() { "-in", "--inverse" },
- "Rebuild only files not in DAT",
- FeatureType.Flag,
- longDescription: "Instead of the normal behavior of rebuilding using a DAT, this flag allows the user to use the DAT as a filter instead. All files that are found in the DAT will be skipped and everything else will be output in the selected format.");
- }
- }
- private static Feature _keepEmptyGamesFlag
- {
- get
- {
- return new Feature(
- "keep-empty-games",
- new List() { "-keg", "--keep-empty-games" },
- "Keep originally empty sets from the input(s)",
- FeatureType.Flag,
- longDescription: "Normally, any sets that are considered empty will not be included in the output, this flag allows these empty sets to be added to the output.");
- }
- }
- private static Feature _levelFlag
- {
- get
- {
- return new Feature(
- "level",
- new List() { "-ls", "--level" },
- "Split a SuperDAT or folder by lowest available level",
- FeatureType.Flag,
- longDescription: "For a DAT, or set of DATs, allow for splitting based on the lowest available level of game name. That is, if a game name is top/mid/last, then it will create an output DAT for the parent directory \"mid\" in a folder called \"top\" with a game called \"last\".");
- }
- }
- private static Feature _mergeFlag
- {
- get
- {
- return new Feature(
- "merge",
- new List() { "-m", "--merge" },
- "Merge the input DATs",
- FeatureType.Flag,
- longDescription: "By default, all DATs are processed individually with the user-specified flags. With this flag enabled, all of the input DATs are merged into a single output. This is best used with the dedup flag.");
- }
- }
- private static Feature _noAutomaticDateFlag
- {
- get
- {
- return new Feature(
- "no-automatic-date",
- new List() { "-b", "--no-automatic-date" },
- "Don't include date in file name",
- FeatureType.Flag,
- longDescription: "Normally, the DAT will be created with the date in the file name in brackets. This flag removes that instead of the default.");
- }
- }
- private static Feature _nodumpColumnFlag
- {
- get
- {
- return new Feature(
- "nodump-column",
- new List() { "-nc", "--nodump-column" },
- "Add statistics for nodumps to output",
- FeatureType.Flag,
- longDescription: "Add a new column or field for counting the number of nodumps in the DAT.");
- }
- }
- private static Feature _noStoreHeaderFlag
- {
- get
- {
- return new Feature(
- "no-store-header",
- new List() { "-nsh", "--no-store-header" },
- "Don't store the extracted header",
- FeatureType.Flag,
- longDescription: "By default, all headers that are removed from files are backed up in the database. This flag allows users to skip that step entirely, avoiding caching the headers at all.");
- }
- }
- private static Feature _notRunnableFlag
- {
- get
- {
- return new Feature(
- "not-runnable",
- new List() { "-nrun", "--not-runnable" },
- "Include only items that are not marked runnable",
- FeatureType.Flag,
- longDescription: "This allows users to include only unrunnable games.");
- }
- }
- private static Feature _matchOfTagsFlag
- {
- get
- {
- return new Feature(
- "match-of-tags",
- new List() { "-ofg", "--match-of-tags" },
- "Allow cloneof and romof tags to match game name filters",
- FeatureType.Flag,
- longDescription: "If filter or exclude by game name is used, this flag will allow those filters to be checked against the romof and cloneof tags as well. This can allow for more advanced set-building, especially in arcade-based sets.");
- }
- }
- private static Feature _oneRomPerGameFlag
- {
- get
- {
- return new Feature(
- "one-rom-per-game",
- new List() { "-orpg", "--one-rom-per-game" },
- "Try to ensure each rom has its own game",
- FeatureType.Flag,
- longDescription: "In some cases, it is beneficial to have every rom put into its own output set as a subfolder of the original parent. This flag enables outputting each rom to its own game for this purpose.");
- }
- }
- private static Feature _onlySameFlag
- {
- get
- {
- return new Feature(
- "only-same",
- new List() { "-ons", "--only-same" },
- "Only update description if machine name matches description",
- FeatureType.Flag,
- longDescription: "Normally, updating the description will always overwrite if the machine names are the same. With this flag, descriptions will only be overwritten if they are the same as the machine names.");
- }
- }
- private static Feature _outputAllFlag
- {
- get
- {
- return new Feature(
- "output-all",
- new List() { "-oa", "--output-all" },
- "Output in all formats [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in all formats [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputAttractmodeFlag
- {
- get
- {
- return new Feature(
- "output-attractmode",
- new List() { "-oam", "--output-attractmode" },
- "Output in AttractMode format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in AttractMode format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputCmpFlag
- {
- get
- {
- return new Feature(
- "output-cmp",
- new List() { "-oc", "--output-cmp" },
- "Output in CMP format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in ClrMamePro format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputCsvFlag
- {
- get
- {
- return new Feature(
- "output-csv",
- new List() { "-ocsv", "--output-csv" },
- "Output in CSV format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in CSV format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputDoscenterFlag
- {
- get
- {
- return new Feature(
- "output-doscenter",
- new List() { "-od", "--output-doscenter" },
- "Output in DOSCenter format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in DOSCenter format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputListromFlag
- {
- get
- {
- return new Feature(
- "output-listrom",
- new List() { "-olr", "--output-listrom" },
- "Output in MAME Listrom format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in MAME Listrom format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputListxmlFlag
- {
- get
- {
- return new Feature(
- "output-listxml",
- new List() { "-olx", "--output-listxml" },
- "Output in MAME Listxml format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in MAME Listxml format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputMd5Flag
- {
- get
- {
- return new Feature(
- "output-md5",
- new List() { "-omd5", "--output-md5" },
- "Output in MD5 format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in MD5 format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputMissFlag
- {
- get
- {
- return new Feature(
- "output-miss",
- new List() { "-om", "--output-miss" },
- "Output in Missfile format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in Missfile format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputOfflinelistFlag
- {
- get
- {
- return new Feature(
- "output-offlinelist",
- new List() { "-ool", "--output-offlinelist" },
- "Output in OfflineList format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in OfflineList format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputRomcenterFlag
- {
- get
- {
- return new Feature(
- "output-romcenter",
- new List() { "-or", "--output-romcenter" },
- "Output in RomCenter format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in RomCenter format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputSabredatFlag
- {
- get
- {
- return new Feature(
- "output-sabredat",
- new List() { "-os", "--output-sabredat" },
- "Output in SabreDat format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in SabreDat format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputSfvFlag
- {
- get
- {
- return new Feature(
- "output-sfv",
- new List() { "-osfv", "--output-sfv" },
- "Output in SFV format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in SFV format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputSha1Flag
- {
- get
- {
- return new Feature(
- "output-sha1",
- new List() { "-osha1", "--output-sha1" },
- "Output in SHA-1 format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in SHA-1 format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputSha256Flag
- {
- get
- {
- return new Feature(
- "output-sha256",
- new List() { "-osha256", "--output-sha256" },
- "Output in SHA-256 format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in SHA-256 format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputSha384Flag
- {
- get
- {
- return new Feature(
- "output-sha384",
- new List() { "-osha384", "--output-sha384" },
- "Output in SHA-256 format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in SHA-256 format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputSha512Flag
- {
- get
- {
- return new Feature(
- "output-sha512",
- new List() { "-osha512", "--output-sha512" },
- "Output in SHA-256 format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in SHA-256 format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputSoftwarelistFlag
- {
- get
- {
- return new Feature(
- "output-softwarelist",
- new List() { "-osl", "--output-softwarelist" },
- "Output in Softwarelist format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in Softwarelist format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputSsvFlag
- {
- get
- {
- return new Feature(
- "output-ssv",
- new List() { "-ossv", "--output-ssv" },
- "Output in SSV format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in SSV format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputTsvFlag
- {
- get
- {
- return new Feature(
- "output-tsv",
- new List() { "-otsv", "--output-tsv" },
- "Output in TSV format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in TSV format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _outputXmlFlag
- {
- get
- {
- return new Feature(
- "output-xml",
- new List() { "-ox", "--output-xml" },
- "Output in Logiqx XML format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output in Logiqx XML format [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _quickFlag
- {
- get
- {
- return new Feature(
- "quick",
- new List() { "-qs", "--quick" },
- "Enable quick scanning of archives",
- FeatureType.Flag,
- longDescription: "For all archives, if this flag is enabled, it will only use the header information to get the archive entries' file information. The upside to this is that it is the fastest option. On the downside, it can only get the CRC and size from most archive formats, leading to possible issues.");
- }
- }
- private static Feature _quotesFlag
- {
- get
- {
- return new Feature(
- "quotes",
- new List() { "-q", "--quotes" },
- "Double-quote each item",
- FeatureType.Flag,
- longDescription: "This flag surrounds the item by double-quotes, not including the prefix or postfix.");
- }
- }
- private static Feature _removeExtensionsFlag
- {
- get
- {
- return new Feature(
- "remove-extensions",
- new List() { "-rme", "--remove-extensions" },
- "Remove all extensions from all items",
- FeatureType.Flag,
- longDescription: "For each item, remove the extension.");
- }
- }
- private static Feature _removeMd5Flag
- {
- get
- {
- return new Feature(
- "remove-md5",
- new List() { "-rmd5", "--remove-md5" },
- "Remove MD5 hashes from the output",
- FeatureType.Flag,
- longDescription: "By default, all available hashes will be written out to the DAT. This will remove all MD5 hashes from the output file(s).");
- }
- } // TODO: Remove
- private static Feature _removeSha1Flag
- {
- get
- {
- return new Feature(
- "remove-sha1",
- new List() { "-rsha1", "--remove-sha1" },
- "Remove SHA-1 hashes from the output",
- FeatureType.Flag,
- longDescription: "By default, all available hashes will be written out to the DAT. This will remove all SHA-1 hashes from the output file(s).");
- }
- } // TODO: Remove
- private static Feature _removeSha256Flag
- {
- get
- {
- return new Feature(
- "remove-sha256",
- new List() { "-rsha256", "--remove-sha256" },
- "Remove SHA-256 hashes from the output",
- FeatureType.Flag,
- longDescription: "By default, all available hashes will be written out to the DAT. This will remove all SHA-256 hashes from the output file(s).");
- }
- } // TODO: Remove
- private static Feature _removeSha384Flag
- {
- get
- {
- return new Feature(
- "remove-sha384",
- new List() { "-rsha384", "--remove-sha384" },
- "Remove SHA-384 hashes from the output",
- FeatureType.Flag,
- longDescription: "By default, all available hashes will be written out to the DAT. This will remove all SHA-384 hashes from the output file(s).");
- }
- } // TODO: Remove
- private static Feature _removeSha512Flag
- {
- get
- {
- return new Feature(
- "remove-sha512",
- new List() { "-rsha512", "--remove-sha512" },
- "Remove SHA-512 hashes from the output",
- FeatureType.Flag,
- longDescription: "By default, all available hashes will be written out to the DAT. This will remove all SHA-512 hashes from the output file(s).");
- }
- } // TODO: Remove
- private static Feature _removeUnicodeFlag
- {
- get
- {
- return new Feature(
- "remove-unicode",
- new List() { "-ru", "--remove-unicode" },
- "Remove unicode characters from names",
- FeatureType.Flag,
- longDescription: "By default, the character set from the original file(s) will be used for item naming. This flag removes all Unicode characters from the item names, machine names, and machine descriptions.");
- }
- }
- private static Feature _reverseBaseReplaceFlag
- {
- get
- {
- return new Feature(
- "reverse-base-replace",
- new List() { "-rbr", "--reverse-base-replace" },
- "Replace item names from base DATs in reverse",
- FeatureType.Flag,
- longDescription: "By default, no item names are changed except when there is a merge occurring. This flag enables users to define a DAT or set of base DATs to use as \"replacements\" for all input DATs. Note that the first found instance of an item in the last base DAT(s) will be used and all others will be discarded. If no additional flag is given, it will default to updating names.");
- }
- }
- private static Feature _rombaFlag
- {
- get
- {
- return new Feature(
- "romba",
- new List() { "-ro", "--romba" },
- "Treat like a Romba depot (requires SHA-1)",
- FeatureType.Flag,
- longDescription: "This flag allows reading and writing of DATs and output files to and from a Romba-style depot. This also implies TorrentGZ input and output for physical files. Where appropriate, Romba depot files will be created as well.");
- }
- }
- private static Feature _romsFlag
- {
- get
- {
- return new Feature(
- "roms",
- new List() { "-r", "--roms" },
- "Output roms to miss instead of sets",
- FeatureType.Flag,
- longDescription: "By default, the outputted file will include the name of the game so this flag allows for the name of the rom to be output instead. [Missfile only]");
- }
- }
- private static Feature _runnableFlag
- {
- get
- {
- return new Feature(
- "runnable",
- new List() { "-run", "--runnable" },
- "Include only items that are marked runnable",
- FeatureType.Flag,
- longDescription: "This allows users to include only verified runnable games.");
- }
- }
- private static Feature _scanAllFlag
- {
- get
- {
- return new Feature(
- "scan-all",
- new List() { "-sa", "--scan-all" },
- "Set scanning levels for all archives to 0",
- FeatureType.Flag,
- longDescription: "This flag is the short equivalent to -7z=0 -gz=0 -rar=0 -zip=0 wrapped up. Generally this will be helpful in all cases where the content of the rebuild folder is not entirely known or is known to be mixed.");
- }
- }
- private static Feature _sceneDateStripFlag
- {
- get
- {
- return new Feature(
- "scene-date-strip",
- new List() { "-sds", "--scene-date-strip" },
- "Remove date from scene-named sets",
- FeatureType.Flag,
- longDescription: "If this flag is enabled, sets with \"scene\" names will have the date removed from the beginning. For example \"01.01.01-Game_Name-GROUP\" would become \"Game_Name-Group\".");
- }
- }
- private static Feature _shortFlag
- {
- get
- {
- return new Feature(
- "short",
- new List() { "-s", "--short" },
- "Use short output names",
- FeatureType.Flag,
- longDescription: "Instead of using ClrMamePro-style long names for DATs, use just the name of the folder as the name of the DAT. This can be used in conjunction with --base to output in the format of \"Original Name (Name)\" instead.");
- }
- }
- private static Feature _singleSetFlag
- {
- get
- {
- return new Feature(
- "single-set",
- new List() { "-si", "--single-set" },
- "All game names replaced by '!'",
- FeatureType.Flag,
- longDescription: "This is useful for keeping all roms in a DAT in the same archive or folder.");
- }
- }
- private static Feature _sizeFlag
- {
- get
- {
- return new Feature(
- "size",
- new List() { "-szs", "--size" },
- "Split DAT(s) or folder by file sizes",
- FeatureType.Flag,
- longDescription: "For a DAT, or set of DATs, allow for splitting based on the sizes of the files, specifically if the type is a Rom (most item types don't have sizes).");
- }
- }
- private static Feature _skipFirstOutputFlag
- {
- get
- {
- return new Feature(
- "skip-first-output",
- new List() { "-sf", "--skip-first-output" },
- "Skip output of first DAT",
- FeatureType.Flag,
- longDescription: "In times where the first DAT does not need to be written out a second time, this will skip writing it. This can often speed up the output process.");
- }
- }
- private static Feature _skipArchivesFlag
- {
- get
- {
- return new Feature(
- "skip-archives",
- new List() { "-ska", "--skip-archives" },
- "Skip all archives",
- FeatureType.Flag,
- longDescription: "Skip any files that are treated like archives");
- }
- }
- private static Feature _skipFilesFlag
- {
- get
- {
- return new Feature(
- "skip-files",
- new List() { "-skf", "--skip-files" },
- "Skip all non-archives",
- FeatureType.Flag,
- longDescription: "Skip any files that are not treated like archives");
- }
- }
- private static Feature _skipMd5Flag
- {
- get
- {
- return new Feature(
- "skip-md5",
- new List() { "-nm", "--skip-md5" },
- "Don't include MD5 in output",
- FeatureType.Flag,
- longDescription: "This allows the user to skip calculating the MD5 for each of the files which will speed up the creation of the DAT.");
- }
- }
- private static Feature _skipSha1Flag
- {
- get
- {
- return new Feature(
- "skip-sha1",
- new List() { "-ns", "--skip-sha1" },
- "Don't include SHA-1 in output",
- FeatureType.Flag,
- longDescription: "This allows the user to skip calculating the SHA-1 for each of the files which will speed up the creation of the DAT.");
- }
- }
- private static Feature _skipSha256Flag
- {
- get
- {
- return new Feature(
- "skip-sha256",
- new List() { "-ns256", "--skip-sha256" },
- "Include SHA-256 in output", // TODO: Invert this later
- FeatureType.Flag,
- longDescription: "This allows the user to skip calculating the SHA-256 for each of the files which will speed up the creation of the DAT.");
- }
- }
- private static Feature _skipSha384Flag
- {
- get
- {
- return new Feature(
- "skip-sha384",
- new List() { "-ns384", "--skip-sha384" },
- "Include SHA-384 in output", // TODO: Invert this later
- FeatureType.Flag,
- longDescription: "This allows the user to skip calculating the SHA-384 for each of the files which will speed up the creation of the DAT.");
- }
- }
- private static Feature _skipSha512Flag
- {
- get
- {
- return new Feature(
- "skip-sha512",
- new List() { "-ns512", "--skip-sha512" },
- "Include SHA-512 in output", // TODO: Invert this later
- FeatureType.Flag,
- longDescription: "This allows the user to skip calculating the SHA-512 for each of the files which will speed up the creation of the DAT.");
- }
- }
- private static Feature _superdatFlag
- {
- get
- {
- return new Feature(
- "superdat",
- new List() { "-sd", "--superdat" },
- "Enable SuperDAT creation",
- FeatureType.Flag,
- longDescription: "Set the type flag to \"SuperDAT\" for the output DAT as well as preserving the directory structure of the inputted folder, if applicable.");
- }
- }
- private static Feature _tarFlag
- {
- get
- {
- return new Feature(
- "tar",
- new List() { "-tar", "--tar" },
- "Enable Tape ARchive output",
- FeatureType.Flag,
- longDescription: "Instead of outputting the files to folder, files will be rebuilt to Tape ARchive (TAR) files. This format is a standardized storage archive without any compression, usually used with other compression formats around it. It is widely used in backup applications and source code archives.");
- }
- }
- private static Feature _textFlag
- {
- get
- {
- return new Feature(
- "text",
- new List() { "-txt", "--text" },
- "Output in generic text format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output all statistical information in generic text format. If no other format flags are enabled, this is the default output. [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _torrent7zipFlag
- {
- get
- {
- return new Feature(
- "torrent-7zip",
- new List() { "-t7z", "--torrent-7zip" },
- "Enable Torrent7Zip output",
- FeatureType.Flag,
- longDescription: "Instead of outputting the files to folder, files will be rebuilt to Torrent7Zip (T7Z) files. This format is based on the LZMA container format 7Zip, but with custom header information. This is currently unused by any major application. Currently does not produce proper Torrent-compatible outputs.");
- }
- }
- private static Feature _torrentGzipFlag
- {
- get
- {
- return new Feature(
- "torrent-gzip",
- new List() { "-tgz", "--torrent-gzip" },
- "Enable Torrent GZip output",
- FeatureType.Flag,
- longDescription: "Instead of outputting the files to folder, files will be rebuilt to TorrentGZ (TGZ) files. This format is based on the GZip archive format, but with custom header information and a file name replaced by the SHA-1 of the file inside. This is primarily used by external tool Romba (https://github.com/uwedeportivo/romba), but may be used more widely in the future.");
- }
- }
- private static Feature _torrentLrzipFlag
- {
- get
- {
- return new Feature(
- "torrent-lrzip",
- new List() { "-tlrz", "--torrent-lrzip" },
- "Enable Torrent Long-Range Zip output [UNIMPLEMENTED]",
- FeatureType.Flag,
- longDescription: "Instead of outputting the files to folder, files will be rebuilt to Torrent Long-Range Zip (TLRZ) files. This format is based on the LRZip file format as defined at https://github.com/ckolivas/lrzip but with custom header information. This is currently unused by any major application.");
- }
- }
- private static Feature _torrentLz4Flag
- {
- get
- {
- return new Feature(
- "torrent-lz4",
- new List() { "-tlz4", "--torrent-lz4" },
- "Enable Torrent LZ4 output [UNIMPLEMENTED]",
- FeatureType.Flag,
- longDescription: "Instead of outputting the files to folder, files will be rebuilt to Torrent LZ4 (TLZ4) files. This format is based on the LZ4 file format as defined at https://github.com/lz4/lz4 but with custom header information. This is currently unused by any major application.");
- }
- }
- private static Feature _torrentRarFlag
- {
- get
- {
- return new Feature(
- "torrent-rar",
- new List() { "-trar", "--torrent-rar" },
- "Enable Torrent RAR output [UNIMPLEMENTED]",
- FeatureType.Flag,
- longDescription: "Instead of outputting files to folder, files will be rebuilt to Torrent RAR (TRAR) files. This format is based on the RAR propietary format but with custom header information. This is currently unused by any major application.");
- }
- }
- private static Feature _torrentXzFlag
- {
- get
- {
- return new Feature(
- "torrent-xz",
- new List() { "-txz", "--torrent-xz" },
- "Enable Torrent XZ output [UNSUPPORTED]",
- FeatureType.Flag,
- longDescription: "Instead of outputting files to folder, files will be rebuilt to Torrent XZ (TXZ) files. This format is based on the LZMA container format XZ, but with custom header information. This is currently unused by any major application. Currently does not produce proper Torrent-compatible outputs.");
- }
- }
- private static Feature _torrentZipFlag
- {
- get
- {
- return new Feature(
- "torrent-zip",
- new List() { "-tzip", "--torrent-zip" },
- "Enable Torrent Zip output",
- FeatureType.Flag,
- longDescription: "Instead of outputting files to folder, files will be rebuilt to TorrentZip (TZip) files. This format is based on the ZIP archive format, but with custom header information. This is primarily used by external tool RomVault (http://www.romvault.com/) and is already widely used.");
- }
- }
- private static Feature _torrentZpaqFlag
- {
- get
- {
- return new Feature(
- "torrent-zpaq",
- new List() { "-tzpaq", "--torrent-zpaq" },
- "Enable Torrent ZPAQ output [UNIMPLEMENTED]",
- FeatureType.Flag,
- longDescription: "Instead of outputting the files to folder, files will be rebuilt to Torrent ZPAQ (TZPAQ) files. This format is based on the ZPAQ file format as defined at https://github.com/zpaq/zpaq but with custom header information. This is currently unused by any major application.");
- }
- }
- private static Feature _torrentZstdFlag
- {
- get
- {
- return new Feature(
- "torrent-zstd",
- new List() { "-tzstd", "--torrent-zstd" },
- "Enable Torrent Zstd output [UNIMPLEMENTED]",
- FeatureType.Flag,
- longDescription: "Instead of outputting the files to folder, files will be rebuilt to Torrent Zstd (TZstd) files. This format is based on the Zstd file format as defined at https://github.com/skbkontur/ZstdNet but with custom header information. This is currently unused by any major application.");
- }
- }
- private static Feature _trimFlag
- {
- get
- {
- return new Feature(
- "trim",
- new List() { "-trim", "--trim" },
- "Trim file names to fit NTFS length",
- FeatureType.Flag,
- longDescription: "In the cases where files will have too long a name, this allows for trimming the name of the files to the NTFS maximum length at most.");
- }
- }
- private static Feature _tsvFlag
- {
- get
- {
- return new Feature(
- "tsv",
- new List() { "-tsv", "--tsv" },
- "Output in Tab-Separated Value format [DEPRECIATED]",
- FeatureType.Flag,
- longDescription: "Output all statistical information in standardized TSV format. [DEPRECIATED]");
- }
- } // TODO: Remove
- private static Feature _typeFlag
- {
- get
- {
- return new Feature(
- "type",
- new List() { "-ts", "--type" },
- "Split DAT(s) or folder by file types (rom/disk)",
- FeatureType.Flag,
- longDescription: "For a DAT, or set of DATs, allow for splitting based on the types of the files, specifically if the type is a rom or a disk.");
- }
- }
- private static Feature _updateDatFlag
- {
- get
- {
- return new Feature(
- "update-dat",
- new List() { "-ud", "--update-dat" },
- "Output updated DAT to output directory",
- FeatureType.Flag,
- longDescription: "Once the files that were able to rebuilt are taken care of, a DAT of the files that could not be matched will be output to the output directory.");
- }
- }
- private static Feature _updateDescriptionFlag
- {
- get
- {
- return new Feature(
- "update-description",
- new List() { "-udd", "--update-description" },
- "Update machine descriptions from base DATs",
- FeatureType.Flag,
- longDescription: "This flag enables updating of machine descriptions from base DATs.");
- }
- }
- private static Feature _updateGameTypeFlag
- {
- get
- {
- return new Feature(
- "update-game-type",
- new List() { "-ugt", "--update-game-type" },
- "Update machine type from base DATs",
- FeatureType.Flag,
- longDescription: "This flag enables updating of machine type from base DATs.");
- }
- }
- private static Feature _updateHashesFlag
- {
- get
- {
- return new Feature(
- "update-hashes",
- new List() { "-uh", "--update-hashes" },
- "Update hashes from base DATs",
- FeatureType.Flag,
- longDescription: "This flag enables updating of hashes from base DATs.");
- }
- }
- private static Feature _updateManufacturerFlag
- {
- get
- {
- return new Feature(
- "update-manufacturer",
- new List() { "-um", "--update-manufacturer" },
- "Update machine manufacturers from base DATs",
- FeatureType.Flag,
- longDescription: "This flag enables updating of machine manufacturers from base DATs.");
- }
- }
- private static Feature _updateNamesFlag
- {
- get
- {
- return new Feature(
- "update-names",
- new List() { "-un", "--update-names" },
- "Update item names from base DATs",
- FeatureType.Flag,
- longDescription: "This flag enables updating of item names from base DATs.");
- }
- }
- private static Feature _updateParentsFlag
- {
- get
- {
- return new Feature(
- "update-parents",
- new List() { "-up", "--update-parents" },
- "Update machine parents from base DATs",
- FeatureType.Flag,
- longDescription: "This flag enables updating of machine parents (romof, cloneof, sampleof) from base DATs.");
- }
- }
- private static Feature _updateYearFlag
- {
- get
- {
- return new Feature(
- "update-year",
- new List() { "-uy", "--update-year" },
- "Update machine years from base DATs",
- FeatureType.Flag,
- longDescription: "This flag enables updating of machine years from base DATs.");
- }
- }
+ private static Feature _addBlankFilesFlag
+ {
+ get
+ {
+ return new Feature(
+ "add-blank-files",
+ new List() { "-ab", "--add-blank-files" },
+ "Output blank files for folders",
+ FeatureType.Flag,
+ longDescription: "If this flag is set, then blank entries will be created for each of the empty directories in the source. This is useful for tools that require all folders be accounted for in the output DAT.");
+ }
+ }
+ private static Feature _addDateFlag
+ {
+ get
+ {
+ return new Feature(
+ "add-date",
+ new List() { "-ad", "--add-date" },
+ "Add dates to items, where posible",
+ FeatureType.Flag,
+ longDescription: "If this flag is set, then the Date will be appended to each file information in the output DAT. The output format is standardized as \"yyyy/MM/dd HH:mm:ss\".");
+ }
+ }
+ private static Feature _allStatsFlag
+ {
+ get
+ {
+ return new Feature(
+ "all-stats",
+ new List() { "-as", "--all-stats" },
+ "Write all statistics to all available formats [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output all statistical information to all available formats. [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _archivesAsFilesFlag
+ {
+ get
+ {
+ return new Feature(
+ "archives-as-files",
+ new List() { "-aaf", "--archives-as-files" },
+ "Treat archives as files",
+ FeatureType.Flag,
+ longDescription: "Instead of trying to enumerate the files within archives, treat the archives as files themselves. This is good for uncompressed sets that include archives that should be read as-is.");
+ }
+ }
+ private static Feature _baddumpColumnFlag
+ {
+ get
+ {
+ return new Feature(
+ "baddump-column",
+ new List() { "-bc", "--baddump-column" },
+ "Add baddump stats to output",
+ FeatureType.Flag,
+ longDescription: "Add a new column or field for counting the number of baddumps in the DAT.");
+ }
+ }
+ private static Feature _baseFlag
+ {
+ get
+ {
+ return new Feature(
+ "base",
+ new List() { "-ba", "--base" },
+ "Use source DAT as base name for outputs",
+ FeatureType.Flag,
+ longDescription: "If splitting an entire folder of DATs, some output files may be normally overwritten since the names would be the same. With this flag, the original DAT name is used in the output name, in the format of \"Original Name(Dir - Name)\". This can be used in conjunction with --short to output in the format of \"Original Name (Name)\" instead.");
+ }
+ }
+ private static Feature _baseReplaceFlag
+ {
+ get
+ {
+ return new Feature(
+ "base-replace",
+ new List() { "-br", "--base-replace" },
+ "Replace from base DATs in order",
+ FeatureType.Flag,
+ longDescription: "By default, no item names are changed except when there is a merge occurring. This flag enables users to define a DAT or set of base DATs to use as \"replacements\" for all input DATs. Note that the first found instance of an item in the base DAT(s) will be used and all others will be discarded. If no additional flag is given, it will default to updating names.");
+ }
+ }
+ private static Feature _chdsAsFilesFlag
+ {
+ get
+ {
+ return new Feature(
+ "chds-as-files",
+ new List() { "-ic", "--chds-as-files" },
+ "Treat CHDs as regular files",
+ FeatureType.Flag,
+ longDescription: "Normally, CHDs would be processed using their internal hash to compare against the input DATs. This flag forces all CHDs to be treated like regular files.");
+ }
+ }
+ private static Feature _cleanFlag
+ {
+ get
+ {
+ return new Feature(
+ "clean",
+ new List() { "-clean", "--clean" },
+ "Clean game names according to WoD standards",
+ FeatureType.Flag,
+ longDescription: "Game names will be sanitized to remove what the original WoD standards deemed as unneeded information, such as parenthesized or bracketed strings.");
+ }
+ }
+ private static Feature _copyFilesFlag
+ {
+ get
+ {
+ return new Feature(
+ "copy-files",
+ new List() { "-cf", "--copy-files" },
+ "Copy files to the temp directory before parsing",
+ FeatureType.Flag,
+ longDescription: "If this flag is set, then all files that are going to be parsed are moved to the temporary directory before being hashed. This can be helpful in cases where the temp folder is located on an SSD and the user wants to take advantage of this.");
+ }
+ }
+ private static Feature _csvFlag
+ {
+ get
+ {
+ return new Feature(
+ "csv",
+ new List() { "-csv", "--csv" },
+ "Output in Comma-Separated Value format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output all statistical information in standardized CSV format. [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _datDeviceNonMergedFlag
+ {
+ get
+ {
+ return new Feature(
+ "dat-device-non-merged",
+ new List() { "-dnd", "--dat-device-non-merged" },
+ "Create device non-merged sets",
+ FeatureType.Flag,
+ longDescription: "Preprocess the DAT to have child sets contain all items from the device references. This is incompatible with the other --dat-X flags.");
+ }
+ }
+ private static Feature _datFullNonMergedFlag
+ {
+ get
+ {
+ return new Feature(
+ "dat-full-non-merged",
+ new List() { "-df", "--dat-full-non-merged" },
+ "Create fully non-merged sets",
+ FeatureType.Flag,
+ longDescription: "Preprocess the DAT to have child sets contain all items from the parent sets based on the cloneof and romof tags as well as device references. This is incompatible with the other --dat-X flags.");
+ }
+ }
+ private static Feature _datMergedFlag
+ {
+ get
+ {
+ return new Feature(
+ "dat-merged",
+ new List() { "-dm", "--dat-merged" },
+ "Force creating merged sets",
+ FeatureType.Flag,
+ longDescription: "Preprocess the DAT to have parent sets contain all items from the children based on the cloneof tag. This is incompatible with the other --dat-X flags.");
+ }
+ }
+ private static Feature _datNonMergedFlag
+ {
+ get
+ {
+ return new Feature(
+ "dat-non-merged",
+ new List() { "-dnm", "--dat-non-merged" },
+ "Force creating non-merged sets",
+ FeatureType.Flag,
+ longDescription: "Preprocess the DAT to have child sets contain all items from the parent set based on the romof and cloneof tags. This is incompatible with the other --dat-X flags.");
+ }
+ }
+ private static Feature _datSplitFlag
+ {
+ get
+ {
+ return new Feature(
+ "dat-split",
+ new List() { "-ds", "--dat-split" },
+ "Force creating split sets",
+ FeatureType.Flag,
+ longDescription: "Preprocess the DAT to remove redundant files between parents and children based on the romof and cloneof tags. This is incompatible with the other --dat-X flags.");
+ }
+ }
+ private static Feature _dedupFlag
+ {
+ get
+ {
+ return new Feature(
+ "dedup",
+ new List() { "-dd", "--dedup" },
+ "Enable deduping in the created DAT",
+ FeatureType.Flag,
+ longDescription: "For all outputted DATs, allow for hash deduping. This makes sure that there are effectively no duplicates in the output files. Cannot be used with game dedup.");
+ }
+ }
+ private static Feature _deleteFlag
+ {
+ get
+ {
+ return new Feature(
+ "delete",
+ new List() { "-del", "--delete" },
+ "Delete fully rebuilt input files",
+ FeatureType.Flag,
+ longDescription: "Optionally, the input files, once processed and fully matched, can be deleted. This can be useful when the original file structure is no longer needed or if there is limited space on the source drive.");
+ }
+ }
+ private static Feature _depotFlag
+ {
+ get
+ {
+ return new Feature(
+ "depot",
+ new List() { "-dep", "--depot" },
+ "Assume directories are romba depots",
+ FeatureType.Flag,
+ longDescription: "Normally, input directories will be treated with no special format. If this flag is used, all input directories will be assumed to be romba-style depots.");
+ }
+ }
+ private static Feature _depreciatedFlag
+ {
+ get
+ {
+ return new Feature(
+ "depreciated",
+ new List() { "-dpc", "--depreciated" },
+ "Output 'game' instead of 'machine'",
+ FeatureType.Flag,
+ longDescription: "By default, Logiqx XML DATs output with the more modern \"machine\" tag for each set. This flag allows users to output the older \"game\" tag instead, for compatibility reasons. [Logiqx only]");
+ }
+ }
+ private static Feature _descriptionAsNameFlag
+ {
+ get
+ {
+ return new Feature(
+ "description-as-name",
+ new List() { "-dan", "--description-as-name" },
+ "Use description instead of machine name",
+ FeatureType.Flag,
+ longDescription: "By default, all DATs are converted exactly as they are input. Enabling this flag allows for the machine names in the DAT to be replaced by the machine description instead. In most cases, this will result in no change in the output DAT, but a notable example would be a software list DAT where the machine names are generally DOS-friendly while the description is more complete.");
+ }
+ }
+ private static Feature _diffAgainstFlag
+ {
+ get
+ {
+ return new Feature(
+ "diff-against",
+ new List() { "-dag", "--diff-against" },
+ "Diff all inputs against a set of base DATs",
+ FeatureType.Flag,
+ "This flag will enable a special type of diffing in which a set of base DATs are used as a comparison point for each of the input DATs. This allows users to get a slightly different output to cascaded diffing, which may be more useful in some cases. This is heavily influenced by the diffing model used by Romba.");
+ }
+ }
+ private static Feature _diffAllFlag
+ {
+ get
+ {
+ return new Feature(
+ "diff-all",
+ new List() { "-di", "--diff-all" },
+ "Create diffdats from inputs (all standard outputs)",
+ FeatureType.Flag,
+ longDescription: "By default, all DATs are processed individually with the user-specified flags. With this flag enabled, input DATs are diffed against each other to find duplicates, no duplicates, and only in individuals.");
+ }
+ }
+ private static Feature _diffCascadeFlag
+ {
+ get
+ {
+ return new Feature(
+ "diff-cascade",
+ new List() { "-dc", "--diff-cascade" },
+ "Enable cascaded diffing",
+ FeatureType.Flag,
+ longDescription: "This flag allows for a special type of diffing in which the first DAT is considered a base, and for each additional input DAT, it only leaves the files that are not in one of the previous DATs. This can allow for the creation of rollback sets or even just reduce the amount of duplicates across multiple sets.");
+ }
+ }
+ private static Feature _diffDuplicatesFlag
+ {
+ get
+ {
+ return new Feature(
+ "diff-duplicates",
+ new List() { "-did", "--diff-duplicates" },
+ "Create diffdat containing just duplicates",
+ FeatureType.Flag,
+ longDescription: "All files that have duplicates outside of the original DAT are included.");
+ }
+ }
+ private static Feature _diffIndividualsFlag
+ {
+ get
+ {
+ return new Feature(
+ "diff-individuals",
+ new List() { "-dii", "--diff-individuals" },
+ "Create diffdats for individual DATs",
+ FeatureType.Flag,
+ longDescription: "All files that have no duplicates outside of the original DATs are put into DATs that are named after the source DAT.");
+ }
+ }
+ private static Feature _diffNoDuplicatesFlag
+ {
+ get
+ {
+ return new Feature(
+ "diff-no-duplicates",
+ new List() { "-din", "--diff-no-duplicates" },
+ "Create diffdat containing no duplicates",
+ FeatureType.Flag,
+ longDescription: "All files that have no duplicates outside of the original DATs are included.");
+ }
+ }
+ private static Feature _diffReverseCascadeFlag
+ {
+ get
+ {
+ return new Feature(
+ "diff-reverse-cascade",
+ new List() { "-drc", "--diff-reverse-cascade" },
+ "Enable reverse cascaded diffing",
+ FeatureType.Flag,
+ longDescription: "This flag allows for a special type of diffing in which the last DAT is considered a base, and for each additional input DAT, it only leaves the files that are not in one of the previous DATs. This can allow for the creation of rollback sets or even just reduce the amount of duplicates across multiple sets.");
+ }
+ }
+ private static Feature _excludeOfFlag
+ {
+ get
+ {
+ return new Feature(
+ "exclude-of",
+ new List() { "-xof", "--exclude-of" },
+ "Exclude romof, cloneof, sampleof tags",
+ FeatureType.Flag,
+ longDescription: "If this flag is enabled, then the romof, cloneof, and sampleof tags will be omitted from the outputted DAT.");
+ }
+ } // TODO: Remove
+ private static Feature _extensionFlag
+ {
+ get
+ {
+ return new Feature(
+ "extension",
+ new List() { "-es", "--extension" },
+ "Split DAT(s) by two file extensions",
+ FeatureType.Flag,
+ longDescription: "For a DAT, or set of DATs, allow for splitting based on a list of input extensions. This can allow for combined DAT files, such as those combining two separate systems, to be split. Files with any extensions not listed in the input lists will be included in both outputted DAT files.");
+ }
+ }
+ private static Feature _gameDedupFlag
+ {
+ get
+ {
+ return new Feature(
+ "game-dedup",
+ new List() { "-gdd", "--game-dedup" },
+ "Enable deduping within games in the created DAT",
+ FeatureType.Flag,
+ longDescription: "For all outputted DATs, allow for hash deduping but only within the games, and not across the entire DAT. This makes sure that there are effectively no duplicates within each of the output sets. Cannot be used with standard dedup.");
+ }
+ }
+ private static Feature _gamePrefixFlag
+ {
+ get
+ {
+ return new Feature(
+ "game-prefix",
+ new List() { "-gp", "--game-prefix" },
+ "Add game name as a prefix",
+ FeatureType.Flag,
+ longDescription: "This flag allows for the name of the game to be used as a prefix to each file.");
+ }
+ }
+ private static Feature _hashFlag
+ {
+ get
+ {
+ return new Feature(
+ "hash",
+ new List() { "-hs", "--hash" },
+ "Split DAT(s) or folder by best-available hashes",
+ FeatureType.Flag,
+ longDescription: "For a DAT, or set of DATs, allow for splitting based on the best available hash for each file within. The order of preference for the outputted DATs is as follows: Nodump, SHA-512, SHA-384, SHA-256, SHA-1, MD5, CRC (or worse).");
+ }
+ }
+ private static Feature _hashOnlyFlag
+ {
+ get
+ {
+ return new Feature(
+ "hash-only",
+ new List() { "-ho", "--hash-only" },
+ "Check files by hash only",
+ FeatureType.Flag,
+ longDescription: "This sets a mode where files are not checked based on name but rather hash alone. This allows verification of (possibly) incorrectly named folders and sets to be verified without worrying about the proper set structure to be there.");
+ }
+ }
+ private static Feature _htmlFlag
+ {
+ get
+ {
+ return new Feature(
+ "html",
+ new List() { "-html", "--html" },
+ "Output in HTML format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output all statistical information in standardized HTML format. [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _individualFlag
+ {
+ get
+ {
+ return new Feature(
+ "individual",
+ new List() { "-ind", "--individual" },
+ "Process input DATs individually",
+ FeatureType.Flag,
+ longDescription: "In cases where DATs would be processed in bulk, this flag allows them to be processed on their own instead.");
+ }
+ }
+ private static Feature _inplaceFlag
+ {
+ get
+ {
+ return new Feature(
+ "inplace",
+ new List() { "-ip", "--inplace" },
+ "Write to the input directories, where possible",
+ FeatureType.Flag,
+ longDescription: "By default, files are written to the runtime directory (or the output directory, if set). This flag enables users to write out to the directory that the DATs originated from.");
+ }
+ }
+ private static Feature _inverseFlag
+ {
+ get
+ {
+ return new Feature(
+ "inverse",
+ new List() { "-in", "--inverse" },
+ "Rebuild only files not in DAT",
+ FeatureType.Flag,
+ longDescription: "Instead of the normal behavior of rebuilding using a DAT, this flag allows the user to use the DAT as a filter instead. All files that are found in the DAT will be skipped and everything else will be output in the selected format.");
+ }
+ }
+ private static Feature _keepEmptyGamesFlag
+ {
+ get
+ {
+ return new Feature(
+ "keep-empty-games",
+ new List() { "-keg", "--keep-empty-games" },
+ "Keep originally empty sets from the input(s)",
+ FeatureType.Flag,
+ longDescription: "Normally, any sets that are considered empty will not be included in the output, this flag allows these empty sets to be added to the output.");
+ }
+ }
+ private static Feature _levelFlag
+ {
+ get
+ {
+ return new Feature(
+ "level",
+ new List() { "-ls", "--level" },
+ "Split a SuperDAT or folder by lowest available level",
+ FeatureType.Flag,
+ longDescription: "For a DAT, or set of DATs, allow for splitting based on the lowest available level of game name. That is, if a game name is top/mid/last, then it will create an output DAT for the parent directory \"mid\" in a folder called \"top\" with a game called \"last\".");
+ }
+ }
+ private static Feature _mergeFlag
+ {
+ get
+ {
+ return new Feature(
+ "merge",
+ new List() { "-m", "--merge" },
+ "Merge the input DATs",
+ FeatureType.Flag,
+ longDescription: "By default, all DATs are processed individually with the user-specified flags. With this flag enabled, all of the input DATs are merged into a single output. This is best used with the dedup flag.");
+ }
+ }
+ private static Feature _noAutomaticDateFlag
+ {
+ get
+ {
+ return new Feature(
+ "no-automatic-date",
+ new List() { "-b", "--no-automatic-date" },
+ "Don't include date in file name",
+ FeatureType.Flag,
+ longDescription: "Normally, the DAT will be created with the date in the file name in brackets. This flag removes that instead of the default.");
+ }
+ }
+ private static Feature _nodumpColumnFlag
+ {
+ get
+ {
+ return new Feature(
+ "nodump-column",
+ new List() { "-nc", "--nodump-column" },
+ "Add statistics for nodumps to output",
+ FeatureType.Flag,
+ longDescription: "Add a new column or field for counting the number of nodumps in the DAT.");
+ }
+ }
+ private static Feature _noStoreHeaderFlag
+ {
+ get
+ {
+ return new Feature(
+ "no-store-header",
+ new List() { "-nsh", "--no-store-header" },
+ "Don't store the extracted header",
+ FeatureType.Flag,
+ longDescription: "By default, all headers that are removed from files are backed up in the database. This flag allows users to skip that step entirely, avoiding caching the headers at all.");
+ }
+ }
+ private static Feature _notRunnableFlag
+ {
+ get
+ {
+ return new Feature(
+ "not-runnable",
+ new List() { "-nrun", "--not-runnable" },
+ "Include only items that are not marked runnable",
+ FeatureType.Flag,
+ longDescription: "This allows users to include only unrunnable games.");
+ }
+ }
+ private static Feature _matchOfTagsFlag
+ {
+ get
+ {
+ return new Feature(
+ "match-of-tags",
+ new List() { "-ofg", "--match-of-tags" },
+ "Allow cloneof and romof tags to match game name filters",
+ FeatureType.Flag,
+ longDescription: "If filter or exclude by game name is used, this flag will allow those filters to be checked against the romof and cloneof tags as well. This can allow for more advanced set-building, especially in arcade-based sets.");
+ }
+ }
+ private static Feature _oneRomPerGameFlag
+ {
+ get
+ {
+ return new Feature(
+ "one-rom-per-game",
+ new List() { "-orpg", "--one-rom-per-game" },
+ "Try to ensure each rom has its own game",
+ FeatureType.Flag,
+ longDescription: "In some cases, it is beneficial to have every rom put into its own output set as a subfolder of the original parent. This flag enables outputting each rom to its own game for this purpose.");
+ }
+ }
+ private static Feature _onlySameFlag
+ {
+ get
+ {
+ return new Feature(
+ "only-same",
+ new List() { "-ons", "--only-same" },
+ "Only update description if machine name matches description",
+ FeatureType.Flag,
+ longDescription: "Normally, updating the description will always overwrite if the machine names are the same. With this flag, descriptions will only be overwritten if they are the same as the machine names.");
+ }
+ }
+ private static Feature _outputAllFlag
+ {
+ get
+ {
+ return new Feature(
+ "output-all",
+ new List() { "-oa", "--output-all" },
+ "Output in all formats [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in all formats [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputAttractmodeFlag
+ {
+ get
+ {
+ return new Feature(
+ "output-attractmode",
+ new List() { "-oam", "--output-attractmode" },
+ "Output in AttractMode format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in AttractMode format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputCmpFlag
+ {
+ get
+ {
+ return new Feature(
+ "output-cmp",
+ new List() { "-oc", "--output-cmp" },
+ "Output in CMP format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in ClrMamePro format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputCsvFlag
+ {
+ get
+ {
+ return new Feature(
+ "output-csv",
+ new List() { "-ocsv", "--output-csv" },
+ "Output in CSV format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in CSV format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputDoscenterFlag
+ {
+ get
+ {
+ return new Feature(
+ "output-doscenter",
+ new List() { "-od", "--output-doscenter" },
+ "Output in DOSCenter format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in DOSCenter format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputListromFlag
+ {
+ get
+ {
+ return new Feature(
+ "output-listrom",
+ new List() { "-olr", "--output-listrom" },
+ "Output in MAME Listrom format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in MAME Listrom format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputListxmlFlag
+ {
+ get
+ {
+ return new Feature(
+ "output-listxml",
+ new List() { "-olx", "--output-listxml" },
+ "Output in MAME Listxml format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in MAME Listxml format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputMd5Flag
+ {
+ get
+ {
+ return new Feature(
+ "output-md5",
+ new List() { "-omd5", "--output-md5" },
+ "Output in MD5 format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in MD5 format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputMissFlag
+ {
+ get
+ {
+ return new Feature(
+ "output-miss",
+ new List() { "-om", "--output-miss" },
+ "Output in Missfile format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in Missfile format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputOfflinelistFlag
+ {
+ get
+ {
+ return new Feature(
+ "output-offlinelist",
+ new List() { "-ool", "--output-offlinelist" },
+ "Output in OfflineList format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in OfflineList format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputRomcenterFlag
+ {
+ get
+ {
+ return new Feature(
+ "output-romcenter",
+ new List() { "-or", "--output-romcenter" },
+ "Output in RomCenter format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in RomCenter format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputSabredatFlag
+ {
+ get
+ {
+ return new Feature(
+ "output-sabredat",
+ new List() { "-os", "--output-sabredat" },
+ "Output in SabreDat format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in SabreDat format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputSfvFlag
+ {
+ get
+ {
+ return new Feature(
+ "output-sfv",
+ new List() { "-osfv", "--output-sfv" },
+ "Output in SFV format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in SFV format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputSha1Flag
+ {
+ get
+ {
+ return new Feature(
+ "output-sha1",
+ new List() { "-osha1", "--output-sha1" },
+ "Output in SHA-1 format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in SHA-1 format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputSha256Flag
+ {
+ get
+ {
+ return new Feature(
+ "output-sha256",
+ new List() { "-osha256", "--output-sha256" },
+ "Output in SHA-256 format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in SHA-256 format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputSha384Flag
+ {
+ get
+ {
+ return new Feature(
+ "output-sha384",
+ new List() { "-osha384", "--output-sha384" },
+ "Output in SHA-256 format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in SHA-256 format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputSha512Flag
+ {
+ get
+ {
+ return new Feature(
+ "output-sha512",
+ new List() { "-osha512", "--output-sha512" },
+ "Output in SHA-256 format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in SHA-256 format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputSoftwarelistFlag
+ {
+ get
+ {
+ return new Feature(
+ "output-softwarelist",
+ new List() { "-osl", "--output-softwarelist" },
+ "Output in Softwarelist format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in Softwarelist format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputSsvFlag
+ {
+ get
+ {
+ return new Feature(
+ "output-ssv",
+ new List() { "-ossv", "--output-ssv" },
+ "Output in SSV format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in SSV format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputTsvFlag
+ {
+ get
+ {
+ return new Feature(
+ "output-tsv",
+ new List() { "-otsv", "--output-tsv" },
+ "Output in TSV format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in TSV format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _outputXmlFlag
+ {
+ get
+ {
+ return new Feature(
+ "output-xml",
+ new List() { "-ox", "--output-xml" },
+ "Output in Logiqx XML format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output in Logiqx XML format [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _quickFlag
+ {
+ get
+ {
+ return new Feature(
+ "quick",
+ new List() { "-qs", "--quick" },
+ "Enable quick scanning of archives",
+ FeatureType.Flag,
+ longDescription: "For all archives, if this flag is enabled, it will only use the header information to get the archive entries' file information. The upside to this is that it is the fastest option. On the downside, it can only get the CRC and size from most archive formats, leading to possible issues.");
+ }
+ }
+ private static Feature _quotesFlag
+ {
+ get
+ {
+ return new Feature(
+ "quotes",
+ new List() { "-q", "--quotes" },
+ "Double-quote each item",
+ FeatureType.Flag,
+ longDescription: "This flag surrounds the item by double-quotes, not including the prefix or postfix.");
+ }
+ }
+ private static Feature _removeExtensionsFlag
+ {
+ get
+ {
+ return new Feature(
+ "remove-extensions",
+ new List() { "-rme", "--remove-extensions" },
+ "Remove all extensions from all items",
+ FeatureType.Flag,
+ longDescription: "For each item, remove the extension.");
+ }
+ }
+ private static Feature _removeMd5Flag
+ {
+ get
+ {
+ return new Feature(
+ "remove-md5",
+ new List() { "-rmd5", "--remove-md5" },
+ "Remove MD5 hashes from the output",
+ FeatureType.Flag,
+ longDescription: "By default, all available hashes will be written out to the DAT. This will remove all MD5 hashes from the output file(s).");
+ }
+ } // TODO: Remove
+ private static Feature _removeSha1Flag
+ {
+ get
+ {
+ return new Feature(
+ "remove-sha1",
+ new List() { "-rsha1", "--remove-sha1" },
+ "Remove SHA-1 hashes from the output",
+ FeatureType.Flag,
+ longDescription: "By default, all available hashes will be written out to the DAT. This will remove all SHA-1 hashes from the output file(s).");
+ }
+ } // TODO: Remove
+ private static Feature _removeSha256Flag
+ {
+ get
+ {
+ return new Feature(
+ "remove-sha256",
+ new List() { "-rsha256", "--remove-sha256" },
+ "Remove SHA-256 hashes from the output",
+ FeatureType.Flag,
+ longDescription: "By default, all available hashes will be written out to the DAT. This will remove all SHA-256 hashes from the output file(s).");
+ }
+ } // TODO: Remove
+ private static Feature _removeSha384Flag
+ {
+ get
+ {
+ return new Feature(
+ "remove-sha384",
+ new List() { "-rsha384", "--remove-sha384" },
+ "Remove SHA-384 hashes from the output",
+ FeatureType.Flag,
+ longDescription: "By default, all available hashes will be written out to the DAT. This will remove all SHA-384 hashes from the output file(s).");
+ }
+ } // TODO: Remove
+ private static Feature _removeSha512Flag
+ {
+ get
+ {
+ return new Feature(
+ "remove-sha512",
+ new List() { "-rsha512", "--remove-sha512" },
+ "Remove SHA-512 hashes from the output",
+ FeatureType.Flag,
+ longDescription: "By default, all available hashes will be written out to the DAT. This will remove all SHA-512 hashes from the output file(s).");
+ }
+ } // TODO: Remove
+ private static Feature _removeUnicodeFlag
+ {
+ get
+ {
+ return new Feature(
+ "remove-unicode",
+ new List() { "-ru", "--remove-unicode" },
+ "Remove unicode characters from names",
+ FeatureType.Flag,
+ longDescription: "By default, the character set from the original file(s) will be used for item naming. This flag removes all Unicode characters from the item names, machine names, and machine descriptions.");
+ }
+ }
+ private static Feature _reverseBaseReplaceFlag
+ {
+ get
+ {
+ return new Feature(
+ "reverse-base-replace",
+ new List() { "-rbr", "--reverse-base-replace" },
+ "Replace item names from base DATs in reverse",
+ FeatureType.Flag,
+ longDescription: "By default, no item names are changed except when there is a merge occurring. This flag enables users to define a DAT or set of base DATs to use as \"replacements\" for all input DATs. Note that the first found instance of an item in the last base DAT(s) will be used and all others will be discarded. If no additional flag is given, it will default to updating names.");
+ }
+ }
+ private static Feature _rombaFlag
+ {
+ get
+ {
+ return new Feature(
+ "romba",
+ new List() { "-ro", "--romba" },
+ "Treat like a Romba depot (requires SHA-1)",
+ FeatureType.Flag,
+ longDescription: "This flag allows reading and writing of DATs and output files to and from a Romba-style depot. This also implies TorrentGZ input and output for physical files. Where appropriate, Romba depot files will be created as well.");
+ }
+ }
+ private static Feature _romsFlag
+ {
+ get
+ {
+ return new Feature(
+ "roms",
+ new List() { "-r", "--roms" },
+ "Output roms to miss instead of sets",
+ FeatureType.Flag,
+ longDescription: "By default, the outputted file will include the name of the game so this flag allows for the name of the rom to be output instead. [Missfile only]");
+ }
+ }
+ private static Feature _runnableFlag
+ {
+ get
+ {
+ return new Feature(
+ "runnable",
+ new List() { "-run", "--runnable" },
+ "Include only items that are marked runnable",
+ FeatureType.Flag,
+ longDescription: "This allows users to include only verified runnable games.");
+ }
+ }
+ private static Feature _scanAllFlag
+ {
+ get
+ {
+ return new Feature(
+ "scan-all",
+ new List() { "-sa", "--scan-all" },
+ "Set scanning levels for all archives to 0",
+ FeatureType.Flag,
+ longDescription: "This flag is the short equivalent to -7z=0 -gz=0 -rar=0 -zip=0 wrapped up. Generally this will be helpful in all cases where the content of the rebuild folder is not entirely known or is known to be mixed.");
+ }
+ }
+ private static Feature _sceneDateStripFlag
+ {
+ get
+ {
+ return new Feature(
+ "scene-date-strip",
+ new List() { "-sds", "--scene-date-strip" },
+ "Remove date from scene-named sets",
+ FeatureType.Flag,
+ longDescription: "If this flag is enabled, sets with \"scene\" names will have the date removed from the beginning. For example \"01.01.01-Game_Name-GROUP\" would become \"Game_Name-Group\".");
+ }
+ }
+ private static Feature _shortFlag
+ {
+ get
+ {
+ return new Feature(
+ "short",
+ new List() { "-s", "--short" },
+ "Use short output names",
+ FeatureType.Flag,
+ longDescription: "Instead of using ClrMamePro-style long names for DATs, use just the name of the folder as the name of the DAT. This can be used in conjunction with --base to output in the format of \"Original Name (Name)\" instead.");
+ }
+ }
+ private static Feature _singleSetFlag
+ {
+ get
+ {
+ return new Feature(
+ "single-set",
+ new List() { "-si", "--single-set" },
+ "All game names replaced by '!'",
+ FeatureType.Flag,
+ longDescription: "This is useful for keeping all roms in a DAT in the same archive or folder.");
+ }
+ }
+ private static Feature _sizeFlag
+ {
+ get
+ {
+ return new Feature(
+ "size",
+ new List() { "-szs", "--size" },
+ "Split DAT(s) or folder by file sizes",
+ FeatureType.Flag,
+ longDescription: "For a DAT, or set of DATs, allow for splitting based on the sizes of the files, specifically if the type is a Rom (most item types don't have sizes).");
+ }
+ }
+ private static Feature _skipFirstOutputFlag
+ {
+ get
+ {
+ return new Feature(
+ "skip-first-output",
+ new List() { "-sf", "--skip-first-output" },
+ "Skip output of first DAT",
+ FeatureType.Flag,
+ longDescription: "In times where the first DAT does not need to be written out a second time, this will skip writing it. This can often speed up the output process.");
+ }
+ }
+ private static Feature _skipArchivesFlag
+ {
+ get
+ {
+ return new Feature(
+ "skip-archives",
+ new List() { "-ska", "--skip-archives" },
+ "Skip all archives",
+ FeatureType.Flag,
+ longDescription: "Skip any files that are treated like archives");
+ }
+ }
+ private static Feature _skipFilesFlag
+ {
+ get
+ {
+ return new Feature(
+ "skip-files",
+ new List() { "-skf", "--skip-files" },
+ "Skip all non-archives",
+ FeatureType.Flag,
+ longDescription: "Skip any files that are not treated like archives");
+ }
+ }
+ private static Feature _skipMd5Flag
+ {
+ get
+ {
+ return new Feature(
+ "skip-md5",
+ new List() { "-nm", "--skip-md5" },
+ "Don't include MD5 in output",
+ FeatureType.Flag,
+ longDescription: "This allows the user to skip calculating the MD5 for each of the files which will speed up the creation of the DAT.");
+ }
+ }
+ private static Feature _skipSha1Flag
+ {
+ get
+ {
+ return new Feature(
+ "skip-sha1",
+ new List() { "-ns", "--skip-sha1" },
+ "Don't include SHA-1 in output",
+ FeatureType.Flag,
+ longDescription: "This allows the user to skip calculating the SHA-1 for each of the files which will speed up the creation of the DAT.");
+ }
+ }
+ private static Feature _skipSha256Flag
+ {
+ get
+ {
+ return new Feature(
+ "skip-sha256",
+ new List() { "-ns256", "--skip-sha256" },
+ "Include SHA-256 in output", // TODO: Invert this later
+ FeatureType.Flag,
+ longDescription: "This allows the user to skip calculating the SHA-256 for each of the files which will speed up the creation of the DAT.");
+ }
+ }
+ private static Feature _skipSha384Flag
+ {
+ get
+ {
+ return new Feature(
+ "skip-sha384",
+ new List() { "-ns384", "--skip-sha384" },
+ "Include SHA-384 in output", // TODO: Invert this later
+ FeatureType.Flag,
+ longDescription: "This allows the user to skip calculating the SHA-384 for each of the files which will speed up the creation of the DAT.");
+ }
+ }
+ private static Feature _skipSha512Flag
+ {
+ get
+ {
+ return new Feature(
+ "skip-sha512",
+ new List() { "-ns512", "--skip-sha512" },
+ "Include SHA-512 in output", // TODO: Invert this later
+ FeatureType.Flag,
+ longDescription: "This allows the user to skip calculating the SHA-512 for each of the files which will speed up the creation of the DAT.");
+ }
+ }
+ private static Feature _superdatFlag
+ {
+ get
+ {
+ return new Feature(
+ "superdat",
+ new List() { "-sd", "--superdat" },
+ "Enable SuperDAT creation",
+ FeatureType.Flag,
+ longDescription: "Set the type flag to \"SuperDAT\" for the output DAT as well as preserving the directory structure of the inputted folder, if applicable.");
+ }
+ }
+ private static Feature _tarFlag
+ {
+ get
+ {
+ return new Feature(
+ "tar",
+ new List() { "-tar", "--tar" },
+ "Enable Tape ARchive output",
+ FeatureType.Flag,
+ longDescription: "Instead of outputting the files to folder, files will be rebuilt to Tape ARchive (TAR) files. This format is a standardized storage archive without any compression, usually used with other compression formats around it. It is widely used in backup applications and source code archives.");
+ }
+ }
+ private static Feature _textFlag
+ {
+ get
+ {
+ return new Feature(
+ "text",
+ new List() { "-txt", "--text" },
+ "Output in generic text format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output all statistical information in generic text format. If no other format flags are enabled, this is the default output. [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _torrent7zipFlag
+ {
+ get
+ {
+ return new Feature(
+ "torrent-7zip",
+ new List() { "-t7z", "--torrent-7zip" },
+ "Enable Torrent7Zip output",
+ FeatureType.Flag,
+ longDescription: "Instead of outputting the files to folder, files will be rebuilt to Torrent7Zip (T7Z) files. This format is based on the LZMA container format 7Zip, but with custom header information. This is currently unused by any major application. Currently does not produce proper Torrent-compatible outputs.");
+ }
+ }
+ private static Feature _torrentGzipFlag
+ {
+ get
+ {
+ return new Feature(
+ "torrent-gzip",
+ new List() { "-tgz", "--torrent-gzip" },
+ "Enable Torrent GZip output",
+ FeatureType.Flag,
+ longDescription: "Instead of outputting the files to folder, files will be rebuilt to TorrentGZ (TGZ) files. This format is based on the GZip archive format, but with custom header information and a file name replaced by the SHA-1 of the file inside. This is primarily used by external tool Romba (https://github.com/uwedeportivo/romba), but may be used more widely in the future.");
+ }
+ }
+ private static Feature _torrentLrzipFlag
+ {
+ get
+ {
+ return new Feature(
+ "torrent-lrzip",
+ new List() { "-tlrz", "--torrent-lrzip" },
+ "Enable Torrent Long-Range Zip output [UNIMPLEMENTED]",
+ FeatureType.Flag,
+ longDescription: "Instead of outputting the files to folder, files will be rebuilt to Torrent Long-Range Zip (TLRZ) files. This format is based on the LRZip file format as defined at https://github.com/ckolivas/lrzip but with custom header information. This is currently unused by any major application.");
+ }
+ }
+ private static Feature _torrentLz4Flag
+ {
+ get
+ {
+ return new Feature(
+ "torrent-lz4",
+ new List() { "-tlz4", "--torrent-lz4" },
+ "Enable Torrent LZ4 output [UNIMPLEMENTED]",
+ FeatureType.Flag,
+ longDescription: "Instead of outputting the files to folder, files will be rebuilt to Torrent LZ4 (TLZ4) files. This format is based on the LZ4 file format as defined at https://github.com/lz4/lz4 but with custom header information. This is currently unused by any major application.");
+ }
+ }
+ private static Feature _torrentRarFlag
+ {
+ get
+ {
+ return new Feature(
+ "torrent-rar",
+ new List() { "-trar", "--torrent-rar" },
+ "Enable Torrent RAR output [UNIMPLEMENTED]",
+ FeatureType.Flag,
+ longDescription: "Instead of outputting files to folder, files will be rebuilt to Torrent RAR (TRAR) files. This format is based on the RAR propietary format but with custom header information. This is currently unused by any major application.");
+ }
+ }
+ private static Feature _torrentXzFlag
+ {
+ get
+ {
+ return new Feature(
+ "torrent-xz",
+ new List() { "-txz", "--torrent-xz" },
+ "Enable Torrent XZ output [UNSUPPORTED]",
+ FeatureType.Flag,
+ longDescription: "Instead of outputting files to folder, files will be rebuilt to Torrent XZ (TXZ) files. This format is based on the LZMA container format XZ, but with custom header information. This is currently unused by any major application. Currently does not produce proper Torrent-compatible outputs.");
+ }
+ }
+ private static Feature _torrentZipFlag
+ {
+ get
+ {
+ return new Feature(
+ "torrent-zip",
+ new List() { "-tzip", "--torrent-zip" },
+ "Enable Torrent Zip output",
+ FeatureType.Flag,
+ longDescription: "Instead of outputting files to folder, files will be rebuilt to TorrentZip (TZip) files. This format is based on the ZIP archive format, but with custom header information. This is primarily used by external tool RomVault (http://www.romvault.com/) and is already widely used.");
+ }
+ }
+ private static Feature _torrentZpaqFlag
+ {
+ get
+ {
+ return new Feature(
+ "torrent-zpaq",
+ new List() { "-tzpaq", "--torrent-zpaq" },
+ "Enable Torrent ZPAQ output [UNIMPLEMENTED]",
+ FeatureType.Flag,
+ longDescription: "Instead of outputting the files to folder, files will be rebuilt to Torrent ZPAQ (TZPAQ) files. This format is based on the ZPAQ file format as defined at https://github.com/zpaq/zpaq but with custom header information. This is currently unused by any major application.");
+ }
+ }
+ private static Feature _torrentZstdFlag
+ {
+ get
+ {
+ return new Feature(
+ "torrent-zstd",
+ new List() { "-tzstd", "--torrent-zstd" },
+ "Enable Torrent Zstd output [UNIMPLEMENTED]",
+ FeatureType.Flag,
+ longDescription: "Instead of outputting the files to folder, files will be rebuilt to Torrent Zstd (TZstd) files. This format is based on the Zstd file format as defined at https://github.com/skbkontur/ZstdNet but with custom header information. This is currently unused by any major application.");
+ }
+ }
+ private static Feature _trimFlag
+ {
+ get
+ {
+ return new Feature(
+ "trim",
+ new List() { "-trim", "--trim" },
+ "Trim file names to fit NTFS length",
+ FeatureType.Flag,
+ longDescription: "In the cases where files will have too long a name, this allows for trimming the name of the files to the NTFS maximum length at most.");
+ }
+ }
+ private static Feature _tsvFlag
+ {
+ get
+ {
+ return new Feature(
+ "tsv",
+ new List() { "-tsv", "--tsv" },
+ "Output in Tab-Separated Value format [DEPRECIATED]",
+ FeatureType.Flag,
+ longDescription: "Output all statistical information in standardized TSV format. [DEPRECIATED]");
+ }
+ } // TODO: Remove
+ private static Feature _typeFlag
+ {
+ get
+ {
+ return new Feature(
+ "type",
+ new List() { "-ts", "--type" },
+ "Split DAT(s) or folder by file types (rom/disk)",
+ FeatureType.Flag,
+ longDescription: "For a DAT, or set of DATs, allow for splitting based on the types of the files, specifically if the type is a rom or a disk.");
+ }
+ }
+ private static Feature _updateDatFlag
+ {
+ get
+ {
+ return new Feature(
+ "update-dat",
+ new List() { "-ud", "--update-dat" },
+ "Output updated DAT to output directory",
+ FeatureType.Flag,
+ longDescription: "Once the files that were able to rebuilt are taken care of, a DAT of the files that could not be matched will be output to the output directory.");
+ }
+ }
+ private static Feature _updateDescriptionFlag
+ {
+ get
+ {
+ return new Feature(
+ "update-description",
+ new List() { "-udd", "--update-description" },
+ "Update machine descriptions from base DATs",
+ FeatureType.Flag,
+ longDescription: "This flag enables updating of machine descriptions from base DATs.");
+ }
+ }
+ private static Feature _updateGameTypeFlag
+ {
+ get
+ {
+ return new Feature(
+ "update-game-type",
+ new List() { "-ugt", "--update-game-type" },
+ "Update machine type from base DATs",
+ FeatureType.Flag,
+ longDescription: "This flag enables updating of machine type from base DATs.");
+ }
+ }
+ private static Feature _updateHashesFlag
+ {
+ get
+ {
+ return new Feature(
+ "update-hashes",
+ new List() { "-uh", "--update-hashes" },
+ "Update hashes from base DATs",
+ FeatureType.Flag,
+ longDescription: "This flag enables updating of hashes from base DATs.");
+ }
+ }
+ private static Feature _updateManufacturerFlag
+ {
+ get
+ {
+ return new Feature(
+ "update-manufacturer",
+ new List() { "-um", "--update-manufacturer" },
+ "Update machine manufacturers from base DATs",
+ FeatureType.Flag,
+ longDescription: "This flag enables updating of machine manufacturers from base DATs.");
+ }
+ }
+ private static Feature _updateNamesFlag
+ {
+ get
+ {
+ return new Feature(
+ "update-names",
+ new List() { "-un", "--update-names" },
+ "Update item names from base DATs",
+ FeatureType.Flag,
+ longDescription: "This flag enables updating of item names from base DATs.");
+ }
+ }
+ private static Feature _updateParentsFlag
+ {
+ get
+ {
+ return new Feature(
+ "update-parents",
+ new List() { "-up", "--update-parents" },
+ "Update machine parents from base DATs",
+ FeatureType.Flag,
+ longDescription: "This flag enables updating of machine parents (romof, cloneof, sampleof) from base DATs.");
+ }
+ }
+ private static Feature _updateYearFlag
+ {
+ get
+ {
+ return new Feature(
+ "update-year",
+ new List() { "-uy", "--update-year" },
+ "Update machine years from base DATs",
+ FeatureType.Flag,
+ longDescription: "This flag enables updating of machine years from base DATs.");
+ }
+ }
- #endregion
+ #endregion
- #region Private Int32 features
+ #region Private Int32 features
- private static Feature _gzInt32Input
- {
- get
- {
- return new Feature(
- "gz",
- new List() { "-gz", "--gz" },
- "Set scanning level for GZip archives (default 1)",
- FeatureType.Int32,
- longDescription: @"Scan GZip archives in one of the following ways:
+ private static Feature _gzInt32Input
+ {
+ get
+ {
+ return new Feature(
+ "gz",
+ new List() { "-gz", "--gz" },
+ "Set scanning level for GZip archives (default 1)",
+ FeatureType.Int32,
+ longDescription: @"Scan GZip archives in one of the following ways:
0 - Hash both archive and its contents
1 - Only hash contents of the archive
2 - Only hash archive itself (treat like a regular file)");
- }
- }
- private static Feature _rarInt32Input
- {
- get
- {
- return new Feature(
- "rar",
- new List() { "-rar", "--rar" },
- "Set scanning level for RAR archives (default 1)",
- FeatureType.Int32,
- longDescription: @"Scan RAR archives in one of the following ways:
+ }
+ }
+ private static Feature _rarInt32Input
+ {
+ get
+ {
+ return new Feature(
+ "rar",
+ new List() { "-rar", "--rar" },
+ "Set scanning level for RAR archives (default 1)",
+ FeatureType.Int32,
+ longDescription: @"Scan RAR archives in one of the following ways:
0 - Hash both archive and its contents
1 - Only hash contents of the archive
2 - Only hash archive itself (treat like a regular file)");
- }
- }
- private static Feature _sevenZipInt32Input
- {
- get
- {
- return new Feature(
- "7z",
- new List() { "-7z", "--7z" },
- "Set scanning level for 7zip archives (default 1)",
- FeatureType.Int32,
- longDescription: @"Scan 7Zip archives in one of the following ways:
+ }
+ }
+ private static Feature _sevenZipInt32Input
+ {
+ get
+ {
+ return new Feature(
+ "7z",
+ new List() { "-7z", "--7z" },
+ "Set scanning level for 7zip archives (default 1)",
+ FeatureType.Int32,
+ longDescription: @"Scan 7Zip archives in one of the following ways:
0 - Hash both archive and its contents
1 - Only hash contents of the archive
2 - Only hash archive itself (treat like a regular file)");
- }
- }
- private static Feature _threadsInt32Input
- {
- get
- {
- return new Feature(
- "threads",
- new List() { "-mt", "--threads" },
- "Amount of threads to use (default = # cores)",
- FeatureType.Int32,
- longDescription: "Optionally, set the number of threads to use for the multithreaded operations. The default is the number of available machine threads; -1 means unlimited threads created.");
- }
- }
- private static Feature _zipInt32Input
- {
- get
- {
- return new Feature(
- "zip",
- new List() { "-zip", "--zip" },
- "Set scanning level for Zip archives (default 1)",
- FeatureType.Int32,
- longDescription: @"Scan Zip archives in one of the following ways:
+ }
+ }
+ private static Feature _threadsInt32Input
+ {
+ get
+ {
+ return new Feature(
+ "threads",
+ new List() { "-mt", "--threads" },
+ "Amount of threads to use (default = # cores)",
+ FeatureType.Int32,
+ longDescription: "Optionally, set the number of threads to use for the multithreaded operations. The default is the number of available machine threads; -1 means unlimited threads created.");
+ }
+ }
+ private static Feature _zipInt32Input
+ {
+ get
+ {
+ return new Feature(
+ "zip",
+ new List() { "-zip", "--zip" },
+ "Set scanning level for Zip archives (default 1)",
+ FeatureType.Int32,
+ longDescription: @"Scan Zip archives in one of the following ways:
0 - Hash both archive and its contents
1 - Only hash contents of the archive
2 - Only hash archive itself (treat like a regular file)");
- }
- }
+ }
+ }
- #endregion
+ #endregion
- #region Private Int64 features
+ #region Private Int64 features
- private static Feature _radixInt64Input
- {
- get
- {
- return new Feature(
- "radix",
- new List() { "-rad", "--radix" },
- "Set the midpoint to split at",
- FeatureType.Int64,
- longDescription: "Set the size at which all roms less than the size are put in the first DAT, and everything greater than or equal goes in the second.");
- }
- }
+ private static Feature _radixInt64Input
+ {
+ get
+ {
+ return new Feature(
+ "radix",
+ new List() { "-rad", "--radix" },
+ "Set the midpoint to split at",
+ FeatureType.Int64,
+ longDescription: "Set the size at which all roms less than the size are put in the first DAT, and everything greater than or equal goes in the second.");
+ }
+ }
- #endregion
+ #endregion
- #region Private List features
+ #region Private List features
- private static Feature _baseDatListInput
- {
- get
- {
- return new Feature(
- "base-dat",
- new List() { "-bd", "--base-dat" },
- "Add a base DAT for processing",
- FeatureType.List,
- longDescription: "Add a DAT or folder of DATs to the base set to be used for all operations. Multiple instances of this flag are allowed.");
- }
- }
- private static Feature _crcListInput
- {
- get
- {
- return new Feature(
- "crc",
- new List() { "-crc", "--crc" },
- "Filter by CRC hash",
- FeatureType.List,
- longDescription: "Include only items with this CRC hash in the output. Additionally, the user can specify an exact match or full C#-style regex for pattern matching. Multiple instances of this flag are allowed.");
- }
- }
- private static Feature _datListInput
- {
- get
- {
- return new Feature(
- "dat",
- new List