diff --git a/SabreTools.Data.Models/Logiqx/GameBase.cs b/SabreTools.Data.Models/Logiqx/GameBase.cs
index 2e97a215..89f27584 100644
--- a/SabreTools.Data.Models/Logiqx/GameBase.cs
+++ b/SabreTools.Data.Models/Logiqx/GameBase.cs
@@ -55,6 +55,11 @@ namespace SabreTools.Data.Models.Logiqx
[XmlAttribute("runnable")]
public Runnable? Runnable { get; set; }
+ /// (dir|zip|7z), RomVault extension
+ /// TODO: Turn this into an enum like the other flags
+ [XmlAttribute("type")]
+ public string? SetType { get; set; }
+
[XmlElement("comment")]
public string[]? Comment { get; set; }
diff --git a/SabreTools.Data.Models/Metadata/Machine.cs b/SabreTools.Data.Models/Metadata/Machine.cs
index 046242c0..d2422b0a 100644
--- a/SabreTools.Data.Models/Metadata/Machine.cs
+++ b/SabreTools.Data.Models/Metadata/Machine.cs
@@ -159,6 +159,9 @@ namespace SabreTools.Data.Models.Metadata
public string? Serial { get; set; }
+ /// (dir|zip|7z), RomVault extension
+ public string? SetType { get; set; }
+
public SharedFeat[]? SharedFeat { get; set; }
public Slot[]? Slot { get; set; }
@@ -298,6 +301,7 @@ namespace SabreTools.Data.Models.Metadata
obj.SaveType = SaveType;
obj.Score = Score;
obj.Serial = Serial;
+ obj.SetType = SetType;
if (SharedFeat is not null)
obj.SharedFeat = Array.ConvertAll(SharedFeat, i => (SharedFeat)i.Clone());
if (Slot is not null)
@@ -569,6 +573,11 @@ namespace SabreTools.Data.Models.Metadata
else if (Serial is not null && !Serial.Equals(other.Serial, StringComparison.OrdinalIgnoreCase))
return false;
+ if ((SetType is null) ^ (other.SetType is null))
+ return false;
+ else if (SetType is not null && !SetType.Equals(other.SetType, StringComparison.OrdinalIgnoreCase))
+ return false;
+
if ((Source is null) ^ (other.Source is null))
return false;
else if (Source is not null && !Source.Equals(other.Source, StringComparison.OrdinalIgnoreCase))
diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs
index 7e804bec..f31ab053 100644
--- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs
+++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs
@@ -329,6 +329,7 @@ namespace SabreTools.Metadata.DatFiles.Test
SaveType = "savetype",
Score = "score",
Serial = "serial",
+ SetType = "dir",
SharedFeat = [CreateMetadataSharedFeat()],
Slot = [CreateMetadataSlot()],
SoftwareList = [CreateMetadataSoftwareList()],
@@ -1095,6 +1096,8 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.Equal("sampleof", machine.SampleOf);
Assert.Equal("savetype", machine.SaveType);
Assert.Equal("score", machine.Score);
+ Assert.Equal("serial", machine.Serial);
+ Assert.Equal("dir", machine.SetType);
Assert.Equal("source", machine.Source);
Assert.Equal("sourcefile", machine.SourceFile);
Assert.Equal("sourcerom", machine.SourceRom);
diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs
index 3a06bfa0..8a99997e 100644
--- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs
+++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs
@@ -438,6 +438,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.Equal("savetype", machine.SaveType);
Assert.Equal("score", machine.Score);
Assert.Equal("serial", machine.Serial);
+ Assert.Equal("dir", machine.SetType);
Assert.Equal("source", machine.Source);
Assert.Equal("sourcefile", machine.SourceFile);
Assert.Equal("sourcerom", machine.SourceRom);
diff --git a/SabreTools.Metadata.DatItems/Machine.cs b/SabreTools.Metadata.DatItems/Machine.cs
index 194eb993..921fad18 100644
--- a/SabreTools.Metadata.DatItems/Machine.cs
+++ b/SabreTools.Metadata.DatItems/Machine.cs
@@ -320,6 +320,12 @@ namespace SabreTools.Metadata.DatItems
set => _internal.Serial = value;
}
+ public string? SetType
+ {
+ get => _internal.SetType;
+ set => _internal.SetType = value;
+ }
+
public string? Source
{
get => _internal.Source;
diff --git a/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs b/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs
index 77232eed..f98b108d 100644
--- a/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs
+++ b/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs
@@ -1294,6 +1294,8 @@ namespace SabreTools.Metadata.Filter.Test
[InlineData("machine.sampleof", "sampleof")]
[InlineData("machine.savetype", "savetype")]
[InlineData("machine.score", "score")]
+ [InlineData("machine.serial", "serial")]
+ [InlineData("machine.settype", "dir")]
[InlineData("machine.source", "source")]
[InlineData("machine.sourcefile", "sourcefile")]
[InlineData("machine.sourcerom", "sourcerom")]
@@ -1364,6 +1366,7 @@ namespace SabreTools.Metadata.Filter.Test
SaveType = "savetype",
Score = "score",
Serial = "serial",
+ SetType = "dir",
Source = "source",
SourceFile = "sourcefile",
SourceRom = "sourcerom",
diff --git a/SabreTools.Metadata.Filter/Constants.cs b/SabreTools.Metadata.Filter/Constants.cs
index 2fa86141..7a864d15 100644
--- a/SabreTools.Metadata.Filter/Constants.cs
+++ b/SabreTools.Metadata.Filter/Constants.cs
@@ -424,6 +424,8 @@ namespace SabreTools.Metadata.Filter
"sampleof",
"savetype",
"score",
+ "serial",
+ "settype",
"source",
"sourcefile",
"sourcerom",
diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs
index 9af59792..5571030f 100644
--- a/SabreTools.Metadata.Filter/FilterObject.cs
+++ b/SabreTools.Metadata.Filter/FilterObject.cs
@@ -1610,6 +1610,9 @@ namespace SabreTools.Metadata.Filter
case "serial":
checkValue = obj.Serial;
return true;
+ case "settype":
+ checkValue = obj.SetType;
+ return true;
case "source":
checkValue = obj.Source;
return true;
diff --git a/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs b/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs
index b1cfa22b..059b7113 100644
--- a/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs
+++ b/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs
@@ -255,6 +255,7 @@ namespace SabreTools.Serialization.CrossModel.Test
gameBase.Id = "id";
gameBase.CloneOfId = "cloneofid";
gameBase.Runnable = Data.Models.Metadata.Runnable.Yes;
+ gameBase.SetType = "dir";
gameBase.Comment = ["comment"];
gameBase.Description = "description";
gameBase.Year = "year";
@@ -385,6 +386,7 @@ namespace SabreTools.Serialization.CrossModel.Test
Assert.Equal("id", gb.Id);
Assert.Equal("cloneofid", gb.CloneOfId);
Assert.Equal(Data.Models.Metadata.Runnable.Yes, gb.Runnable);
+ Assert.Equal("dir", gb.SetType);
Assert.NotNull(gb.Comment);
string comment = Assert.Single(gb.Comment);
diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs
index abb2f448..4fbe43c6 100644
--- a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs
+++ b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs
@@ -133,6 +133,7 @@ namespace SabreTools.Serialization.CrossModel
gameBase.Id = item.Id;
gameBase.CloneOfId = item.CloneOfId;
gameBase.Runnable = item.Runnable;
+ gameBase.SetType = item.SetType;
gameBase.Comment = item.Comment;
gameBase.Description = item.Description;
gameBase.Year = item.Year;
diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs
index 637e9170..1dfe7cf9 100644
--- a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs
+++ b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs
@@ -163,6 +163,7 @@ namespace SabreTools.Serialization.CrossModel
Runnable = item.Runnable,
SampleOf = item.SampleOf,
Score = item.Trurip?.Score,
+ SetType = item.SetType,
Source = item.Trurip?.Source,
SourceFile = item.SourceFile,
Subgenre = item.Trurip?.Subgenre,
diff --git a/SabreTools.Serialization.Readers.Test/LogiqxTests.cs b/SabreTools.Serialization.Readers.Test/LogiqxTests.cs
index b2796051..d023fdb9 100644
--- a/SabreTools.Serialization.Readers.Test/LogiqxTests.cs
+++ b/SabreTools.Serialization.Readers.Test/LogiqxTests.cs
@@ -320,6 +320,7 @@ namespace SabreTools.Serialization.Readers.Test
gameBase.Id = "id";
gameBase.CloneOfId = "cloneofid";
gameBase.Runnable = Data.Models.Metadata.Runnable.Yes;
+ gameBase.SetType = "dir";
gameBase.Comment = ["comment"];
gameBase.Description = "description";
gameBase.Year = "year";
@@ -435,6 +436,7 @@ namespace SabreTools.Serialization.Readers.Test
Assert.Equal("id", gb.Id);
Assert.Equal("cloneofid", gb.CloneOfId);
Assert.Equal(Data.Models.Metadata.Runnable.Yes, gb.Runnable);
+ Assert.Equal("dir", gb.SetType);
Assert.NotNull(gb.Comment);
string comment = Assert.Single(gb.Comment);
diff --git a/SabreTools.Serialization.Readers/Logiqx.cs b/SabreTools.Serialization.Readers/Logiqx.cs
index c8ae19ed..3aee7b82 100644
--- a/SabreTools.Serialization.Readers/Logiqx.cs
+++ b/SabreTools.Serialization.Readers/Logiqx.cs
@@ -524,6 +524,7 @@ namespace SabreTools.Serialization.Readers
obj.Id = reader.GetAttribute("id");
obj.CloneOfId = reader.GetAttribute("cloneofid");
obj.Runnable = reader.GetAttribute("runnable").AsRunnable();
+ obj.SetType = reader.GetAttribute("type");
// Handle empty elements
if (reader.IsEmptyElement)
diff --git a/SabreTools.Serialization.Writers/Logiqx.cs b/SabreTools.Serialization.Writers/Logiqx.cs
index f1f4ebe7..2cdca17d 100644
--- a/SabreTools.Serialization.Writers/Logiqx.cs
+++ b/SabreTools.Serialization.Writers/Logiqx.cs
@@ -362,6 +362,7 @@ namespace SabreTools.Serialization.Writers
writer.WriteOptionalAttributeString("id", obj.Id);
writer.WriteOptionalAttributeString("cloneofid", obj.CloneOfId);
writer.WriteOptionalAttributeString("runnable", obj.Runnable?.AsStringValue());
+ writer.WriteOptionalAttributeString("type", obj.SetType);
if (obj.Comment is not null && obj.Comment.Length > 0)
{