diff --git a/SabreTools.Data.Models/Logiqx/Header.cs b/SabreTools.Data.Models/Logiqx/Header.cs
index 86619e68..504615e9 100644
--- a/SabreTools.Data.Models/Logiqx/Header.cs
+++ b/SabreTools.Data.Models/Logiqx/Header.cs
@@ -52,6 +52,9 @@ namespace SabreTools.Data.Models.Logiqx
[XmlElement("type")]
public string? Type { get; set; }
+ [XmlElement("romvault")]
+ public RomVault? RomVault { get; set; }
+
[XmlElement("clrmamepro")]
public ClrMamePro? ClrMamePro { get; set; }
diff --git a/SabreTools.Data.Models/Logiqx/RomVault.cs b/SabreTools.Data.Models/Logiqx/RomVault.cs
new file mode 100644
index 00000000..3bccee00
--- /dev/null
+++ b/SabreTools.Data.Models/Logiqx/RomVault.cs
@@ -0,0 +1,25 @@
+using System.Xml;
+using System.Xml.Serialization;
+using SabreTools.Data.Models.Metadata;
+
+namespace SabreTools.Data.Models.Logiqx
+{
+ [XmlRoot("romvault")]
+ public class RomVault
+ {
+ [XmlAttribute("header")]
+ public string? Header { get; set; }
+
+ /// (none|split|merged|nonmerged|fullmerged|device|full) "split"
+ [XmlAttribute("forcemerging")]
+ public MergingFlag ForceMerging { get; set; }
+
+ /// (obsolete|required|ignore) "obsolete"
+ [XmlAttribute("forcenodump")]
+ public NodumpFlag ForceNodump { get; set; }
+
+ /// (zip|unzip) "zip"
+ [XmlAttribute("forcepacking")]
+ public PackingFlag ForcePacking { get; set; }
+ }
+}
diff --git a/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs b/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs
index 9f86e1cc..5f31d4da 100644
--- a/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs
+++ b/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs
@@ -73,6 +73,14 @@ namespace SabreTools.Serialization.CrossModel.Test
///
private static Data.Models.Logiqx.Datafile Build(bool game)
{
+ var romvault = new Data.Models.Logiqx.RomVault
+ {
+ Header = "XXXXXX",
+ ForceMerging = Data.Models.Metadata.MergingFlag.Merged,
+ ForceNodump = Data.Models.Metadata.NodumpFlag.Required,
+ ForcePacking = Data.Models.Metadata.PackingFlag.Zip,
+ };
+
var clrmamepro = new Data.Models.Logiqx.ClrMamePro
{
Header = "XXXXXX",
@@ -107,6 +115,7 @@ namespace SabreTools.Serialization.CrossModel.Test
Url = "XXXXXX",
Comment = "XXXXXX",
Type = "XXXXXX",
+ RomVault = romvault,
ClrMamePro = clrmamepro,
RomCenter = romcenter,
};
@@ -303,10 +312,23 @@ namespace SabreTools.Serialization.CrossModel.Test
Assert.Equal("XXXXXX", header.Url);
Assert.Equal("XXXXXX", header.Comment);
Assert.Equal("XXXXXX", header.Type);
+ Validate(header.RomVault);
Validate(header.ClrMamePro);
Validate(header.RomCenter);
}
+ ///
+ /// Validate a RomVault
+ ///
+ private static void Validate(Data.Models.Logiqx.RomVault? rv)
+ {
+ Assert.NotNull(rv);
+ Assert.Equal("XXXXXX", rv.Header);
+ Assert.Equal(Data.Models.Metadata.MergingFlag.Merged, rv.ForceMerging);
+ Assert.Equal(Data.Models.Metadata.NodumpFlag.Required, rv.ForceNodump);
+ Assert.Equal(Data.Models.Metadata.PackingFlag.Zip, rv.ForcePacking);
+ }
+
///
/// Validate a ClrMamePro
///
diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs
index 2465875e..823efbb8 100644
--- a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs
+++ b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs
@@ -61,6 +61,16 @@ namespace SabreTools.Serialization.CrossModel
|| item.ForceNodump is not Data.Models.Metadata.NodumpFlag.None
|| item.ForcePacking is not Data.Models.Metadata.PackingFlag.None)
{
+ header.RomVault = new RomVault();
+ if (item.HeaderSkipper is not null)
+ header.RomVault.Header = item.HeaderSkipper;
+ if (item.ForceMerging is not Data.Models.Metadata.MergingFlag.None)
+ header.RomVault.ForceMerging = item.ForceMerging;
+ if (item.ForceNodump is not Data.Models.Metadata.NodumpFlag.None)
+ header.RomVault.ForceNodump = item.ForceNodump;
+ if (item.ForcePacking is not Data.Models.Metadata.PackingFlag.None)
+ header.RomVault.ForcePacking = item.ForcePacking;
+
header.ClrMamePro = new Data.Models.Logiqx.ClrMamePro();
if (item.HeaderSkipper is not null)
header.ClrMamePro.Header = item.HeaderSkipper;
diff --git a/SabreTools.Serialization.Readers.Test/LogiqxTests.cs b/SabreTools.Serialization.Readers.Test/LogiqxTests.cs
index 90eb74a1..1d073ccd 100644
--- a/SabreTools.Serialization.Readers.Test/LogiqxTests.cs
+++ b/SabreTools.Serialization.Readers.Test/LogiqxTests.cs
@@ -138,6 +138,14 @@ namespace SabreTools.Serialization.Readers.Test
///
private static Data.Models.Logiqx.Datafile Build(bool game)
{
+ var romvault = new Data.Models.Logiqx.RomVault
+ {
+ Header = "XXXXXX",
+ ForceMerging = Data.Models.Metadata.MergingFlag.Merged,
+ ForceNodump = Data.Models.Metadata.NodumpFlag.Required,
+ ForcePacking = Data.Models.Metadata.PackingFlag.Zip,
+ };
+
var clrmamepro = new Data.Models.Logiqx.ClrMamePro
{
Header = "XXXXXX",
@@ -172,6 +180,7 @@ namespace SabreTools.Serialization.Readers.Test
Url = "XXXXXX",
Comment = "XXXXXX",
Type = "XXXXXX",
+ RomVault = romvault,
ClrMamePro = clrmamepro,
RomCenter = romcenter,
};
@@ -356,10 +365,23 @@ namespace SabreTools.Serialization.Readers.Test
Assert.Equal("XXXXXX", header.Url);
Assert.Equal("XXXXXX", header.Comment);
Assert.Equal("XXXXXX", header.Type);
+ Validate(header.RomVault);
Validate(header.ClrMamePro);
Validate(header.RomCenter);
}
+ ///
+ /// Validate a RomVault
+ ///
+ private static void Validate(Data.Models.Logiqx.RomVault? rv)
+ {
+ Assert.NotNull(rv);
+ Assert.Equal("XXXXXX", rv.Header);
+ Assert.Equal(Data.Models.Metadata.MergingFlag.Merged, rv.ForceMerging);
+ Assert.Equal(Data.Models.Metadata.NodumpFlag.Required, rv.ForceNodump);
+ Assert.Equal(Data.Models.Metadata.PackingFlag.Zip, rv.ForcePacking);
+ }
+
///
/// Validate a ClrMamePro
///
diff --git a/SabreTools.Serialization.Readers/Logiqx.cs b/SabreTools.Serialization.Readers/Logiqx.cs
index 25c6e534..df1d2f3f 100644
--- a/SabreTools.Serialization.Readers/Logiqx.cs
+++ b/SabreTools.Serialization.Readers/Logiqx.cs
@@ -244,6 +244,13 @@ namespace SabreTools.Serialization.Readers
obj.Type = reader.ReadElementContentAsString();
break;
+ case "romvault":
+ if (obj.RomVault is not null && Debug)
+ Console.WriteLine($"'{reader.Name}' element already found, overwriting");
+
+ obj.RomVault = ParseRomVault(reader);
+ reader.Skip();
+ break;
case "clrmamepro":
if (obj.ClrMamePro is not null && Debug)
Console.WriteLine($"'{reader.Name}' element already found, overwriting");
@@ -289,6 +296,23 @@ namespace SabreTools.Serialization.Readers
return obj;
}
+ ///
+ /// Parse from an XmlTextReader into a RomVault
+ ///
+ /// XmlTextReader to read from
+ /// Filled RomVault on success, null on error
+ public RomVault ParseRomVault(XmlTextReader reader)
+ {
+ var obj = new RomVault();
+
+ obj.Header = reader.GetAttribute("header");
+ obj.ForceMerging = reader.GetAttribute("forcemerging").AsMergingFlag();
+ obj.ForceNodump = reader.GetAttribute("forcenodump").AsNodumpFlag();
+ obj.ForcePacking = reader.GetAttribute("forcepacking").AsPackingFlag();
+
+ return obj;
+ }
+
#endregion
#region Items
diff --git a/SabreTools.Serialization.Writers/Logiqx.cs b/SabreTools.Serialization.Writers/Logiqx.cs
index 7ecfd167..9ce88276 100644
--- a/SabreTools.Serialization.Writers/Logiqx.cs
+++ b/SabreTools.Serialization.Writers/Logiqx.cs
@@ -159,6 +159,9 @@ namespace SabreTools.Serialization.Writers
writer.WriteOptionalElementString("comment", obj.Comment);
writer.WriteOptionalElementString("type", obj.Type);
+ if (obj.RomVault is not null)
+ WriteRomVault(obj.RomVault, writer);
+
if (obj.ClrMamePro is not null)
WriteClrMamePro(obj.ClrMamePro, writer);
@@ -192,6 +195,26 @@ namespace SabreTools.Serialization.Writers
writer.WriteEndElement();
}
+ ///
+ /// Write a RomVault to an XmlTextWriter
+ ///
+ /// RomVault to write
+ /// XmlTextReader to write to
+ private static void WriteRomVault(RomVault obj, XmlTextWriter writer)
+ {
+ writer.WriteStartElement("romvault");
+
+ writer.WriteOptionalAttributeString("header", obj.Header);
+ if (obj.ForceMerging != Data.Models.Metadata.MergingFlag.None)
+ writer.WriteOptionalAttributeString("forcemerging", obj.ForceMerging.AsStringValue());
+ if (obj.ForceNodump != Data.Models.Metadata.NodumpFlag.None)
+ writer.WriteOptionalAttributeString("forcenodump", obj.ForceNodump.AsStringValue());
+ if (obj.ForcePacking != Data.Models.Metadata.PackingFlag.None)
+ writer.WriteOptionalAttributeString("forcepacking", obj.ForcePacking.AsStringValue());
+
+ writer.WriteEndElement();
+ }
+
#endregion
#region Items