Convert Input mostly over to properties

This commit is contained in:
Matt Nadareski
2026-04-03 13:38:26 -04:00
parent b6ab8a19be
commit 716abed8b8
32 changed files with 154 additions and 136 deletions

View File

@@ -286,6 +286,9 @@ namespace SabreTools.Data.Extensions
}
else if (self is Input selfInput && clone is Input cloneInput)
{
cloneInput.Buttons = selfInput.Buttons;
cloneInput.Coins = selfInput.Coins;
cloneInput.Players = selfInput.Players;
cloneInput.Service = selfInput.Service;
cloneInput.Tilt = selfInput.Tilt;
}

View File

@@ -4,19 +4,19 @@ namespace SabreTools.Data.Models.ClrMamePro
/// <remarks>input</remarks>
public class Input
{
/// <remarks>"players", Numeric/remarks>
/// <remarks>"players"/remarks>
[Required]
public string? Players { get; set; }
public long? Players { get; set; }
/// <remarks>"control"</remarks>
public string? Control { get; set; }
/// <remarks>"buttons", Numeric</remarks>
/// <remarks>"buttons"</remarks>
[Required]
public string? Buttons { get; set; }
public long? Buttons { get; set; }
/// <remarks>"coins", Numeric</remarks>
public string? Coins { get; set; }
/// <remarks>"coins"</remarks>
public long? Coins { get; set; }
/// <remarks>"tilt", (yes|no) "no"</remarks>
public bool? Tilt { get; set; }

View File

@@ -14,22 +14,20 @@ namespace SabreTools.Data.Models.Listxml
[XmlAttribute("tilt")]
public bool? Tilt { get; set; }
/// <remarks>Numeric</remarks>
[Required]
[XmlAttribute("players")]
public string? Players { get; set; }
public long? Players { get; set; }
/// <remarks>Only present in older versions</remarks>
[XmlAttribute("control")]
public string? ControlAttr { get; set; }
/// <remarks>Only present in older versions, Numeric?</remarks>
/// <remarks>Only present in older versions</remarks>
[XmlAttribute("buttons")]
public string? Buttons { get; set; }
public long? Buttons { get; set; }
/// <remarks>Numeric?</remarks>
[XmlAttribute("coins")]
public string? Coins { get; set; }
public long? Coins { get; set; }
[XmlElement("control")]
public Control[]? Control { get; set; }

View File

@@ -8,6 +8,12 @@ namespace SabreTools.Data.Models.Metadata
{
#region Properties
public long? Buttons { get; set; }
public long? Coins { get; set; }
public long? Players { get; set; }
/// <remarks>(yes|no) "no"</remarks>
public bool? Service { get; set; }
@@ -18,18 +24,9 @@ namespace SabreTools.Data.Models.Metadata
#region Keys
/// <remarks>long</remarks>
public const string ButtonsKey = "buttons";
/// <remarks>long</remarks>
public const string CoinsKey = "coins";
/// <remarks>string / Control[]</remarks>
public const string ControlKey = "control";
/// <remarks>long</remarks>
public const string PlayersKey = "players";
#endregion
public Input() => ItemType = ItemType.Input;

View File

@@ -662,10 +662,10 @@ namespace SabreTools.Metadata.DatFiles.Test
{
return new Data.Models.Metadata.Input
{
[Data.Models.Metadata.Input.ButtonsKey] = 12345L,
[Data.Models.Metadata.Input.CoinsKey] = 12345L,
Buttons = 12345,
Coins = 12345,
[Data.Models.Metadata.Input.ControlKey] = new Data.Models.Metadata.Control[] { CreateMetadataControl() },
[Data.Models.Metadata.Input.PlayersKey] = 12345L,
Players = 12345,
Service = true,
Tilt = true,
};
@@ -1413,9 +1413,9 @@ namespace SabreTools.Metadata.DatFiles.Test
private static void ValidateInput(Input? input)
{
Assert.NotNull(input);
Assert.Equal(12345L, input.ReadLong(Data.Models.Metadata.Input.ButtonsKey));
Assert.Equal(12345L, input.ReadLong(Data.Models.Metadata.Input.CoinsKey));
Assert.Equal(12345L, input.ReadLong(Data.Models.Metadata.Input.PlayersKey));
Assert.Equal(12345, input.Buttons);
Assert.Equal(12345, input.Coins);
Assert.Equal(12345, input.Players);
Assert.True(input.Service);
Assert.True(input.Tilt);
@@ -1665,8 +1665,8 @@ namespace SabreTools.Metadata.DatFiles.Test
private static void ValidateVideo(Display? display)
{
Assert.NotNull(display);
Assert.Equal(12345L, display.AspectX);
Assert.Equal(12345L, display.AspectY);
Assert.Equal(12345, display.AspectX);
Assert.Equal(12345, display.AspectY);
Assert.Equal(Data.Models.Metadata.DisplayType.Vector, display.DisplayType);
Assert.Equal(12345, display.Height);
Assert.Equal(123.45, display.Refresh);

View File

@@ -894,7 +894,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.Equal(Data.Models.Metadata.SupportStatus.Good, driver.Emulation);
Assert.True(driver.Incomplete);
Assert.True(driver.NoSoundHardware);
Assert.Equal("pallettesize", driver.PaletteSize);
Assert.Equal("palettesize", driver.PaletteSize);
Assert.True(driver.RequiresArtwork);
Assert.Equal(Data.Models.Metadata.Supported.Yes, driver.SaveState);
Assert.Equal(Data.Models.Metadata.SupportStatus.Good, driver.Sound);
@@ -928,9 +928,9 @@ namespace SabreTools.Metadata.DatFiles.Test
private static void ValidateMetadataInput(Data.Models.Metadata.Input? input)
{
Assert.NotNull(input);
Assert.Equal(12345, input.ReadLong(Data.Models.Metadata.Input.ButtonsKey));
Assert.Equal(12345, input.ReadLong(Data.Models.Metadata.Input.CoinsKey));
Assert.Equal(12345, input.ReadLong(Data.Models.Metadata.Input.PlayersKey));
Assert.Equal(12345, input.Buttons);
Assert.Equal(12345, input.Coins);
Assert.Equal(12345, input.Players);
Assert.True(input.Service);
Assert.True(input.Tilt);

View File

@@ -229,7 +229,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.NotNull(actual);
Assert.True(actual.SequenceEqual([
Data.Models.Metadata.Input.PlayersKey,
nameof(Data.Models.Metadata.Input.Players),
Data.Models.Metadata.Input.ControlKey,
]));
}
@@ -908,7 +908,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.NotNull(actual);
Assert.True(actual.SequenceEqual([
Data.Models.Metadata.Input.PlayersKey,
nameof(Data.Models.Metadata.Input.Players),
]));
}

View File

@@ -152,8 +152,8 @@ namespace SabreTools.Metadata.DatFiles.Formats
break;
case Input input:
if (input.ReadLong(Data.Models.Metadata.Input.PlayersKey) is null)
missingFields.Add(Data.Models.Metadata.Input.PlayersKey);
if (input.Players is null)
missingFields.Add(nameof(Data.Models.Metadata.Input.Players));
if (!input.ControlsSpecified)
missingFields.Add(Data.Models.Metadata.Input.ControlKey);
break;

View File

@@ -320,8 +320,8 @@ namespace SabreTools.Metadata.DatFiles.Formats
break;
case Input input:
if (input.ReadLong(Data.Models.Metadata.Input.PlayersKey) is null)
missingFields.Add(Data.Models.Metadata.Input.PlayersKey);
if (input.Players is null)
missingFields.Add(nameof(Data.Models.Metadata.Input.Players));
break;
case DipSwitch dipswitch:

View File

@@ -13,6 +13,18 @@ namespace SabreTools.Metadata.DatItems.Formats
{
#region Fields
public long? Buttons
{
get => (_internal as Data.Models.Metadata.Input)?.Buttons;
set => (_internal as Data.Models.Metadata.Input)?.Buttons = value;
}
public long? Coins
{
get => (_internal as Data.Models.Metadata.Input)?.Coins;
set => (_internal as Data.Models.Metadata.Input)?.Coins = value;
}
[JsonIgnore]
public bool ControlsSpecified
{
@@ -27,6 +39,12 @@ namespace SabreTools.Metadata.DatItems.Formats
public override Data.Models.Metadata.ItemType ItemType
=> Data.Models.Metadata.ItemType.Input;
public long? Players
{
get => (_internal as Data.Models.Metadata.Input)?.Players;
set => (_internal as Data.Models.Metadata.Input)?.Players = value;
}
public bool? Service
{
get => (_internal as Data.Models.Metadata.Input)?.Service;
@@ -47,19 +65,6 @@ namespace SabreTools.Metadata.DatItems.Formats
public Input(Data.Models.Metadata.Input item) : base(item)
{
// Process flag values
long? buttons = ReadLong(Data.Models.Metadata.Input.ButtonsKey);
if (buttons is not null)
Write<string?>(Data.Models.Metadata.Input.ButtonsKey, buttons.ToString());
long? coins = ReadLong(Data.Models.Metadata.Input.CoinsKey);
if (coins is not null)
Write<string?>(Data.Models.Metadata.Input.CoinsKey, coins.ToString());
long? players = ReadLong(Data.Models.Metadata.Input.PlayersKey);
if (players is not null)
Write<string?>(Data.Models.Metadata.Input.PlayersKey, players.ToString());
// Handle subitems
var controls = item.ReadArray<Data.Models.Metadata.Control>(Data.Models.Metadata.Input.ControlKey);
if (controls is not null)

View File

@@ -714,6 +714,15 @@ namespace SabreTools.Metadata.Filter
checkValue = item.Value;
return true;
case Input item when fieldName == "buttons":
checkValue = item.Buttons?.ToString();
return true;
case Input item when fieldName == "coins":
checkValue = item.Coins?.ToString();
return true;
case Input item when fieldName == "players":
checkValue = item.Players?.ToString();
return true;
case Input item when fieldName == "service":
checkValue = item.Service.FromYesNo();
return true;

View File

@@ -254,6 +254,12 @@ namespace SabreTools.Metadata
}
else if (self is Input selfInput && other is Input otherInput)
{
if (selfInput.Buttons != otherInput.Buttons)
return false;
if (selfInput.Coins != otherInput.Coins)
return false;
if (selfInput.Players != otherInput.Players)
return false;
if (selfInput.Service != otherInput.Service)
return false;
if (selfInput.Tilt != otherInput.Tilt)

View File

@@ -180,10 +180,10 @@ namespace SabreTools.Serialization.CrossModel.Test
var input = new Data.Models.ClrMamePro.Input
{
Players = "XXXXXX",
Players = 12345,
Control = "XXXXXX",
Buttons = "XXXXXX",
Coins = "XXXXXX",
Buttons = 12345,
Coins = 12345,
Tilt = true,
Service = true,
};
@@ -475,10 +475,10 @@ namespace SabreTools.Serialization.CrossModel.Test
private static void Validate(Data.Models.ClrMamePro.Input? input)
{
Assert.NotNull(input);
Assert.Equal("XXXXXX", input.Players);
Assert.Equal(12345, input.Players);
Assert.Equal("XXXXXX", input.Control);
Assert.Equal("XXXXXX", input.Buttons);
Assert.Equal("XXXXXX", input.Coins);
Assert.Equal(12345, input.Buttons);
Assert.Equal(12345, input.Coins);
Assert.Equal(true, input.Tilt);
Assert.Equal(true, input.Service);
}

View File

@@ -172,10 +172,10 @@ namespace SabreTools.Serialization.CrossModel.Test
{
Service = true,
Tilt = true,
Players = "XXXXXX",
Players = 12345,
//ControlAttr = "XXXXXX", // Mututally exclusive with input.Control
Buttons = "XXXXXX",
Coins = "XXXXXX",
Buttons = 12345,
Coins = 12345,
Control = [control],
};
@@ -600,10 +600,10 @@ namespace SabreTools.Serialization.CrossModel.Test
Assert.NotNull(input);
Assert.Equal(true, input.Service);
Assert.Equal(true, input.Tilt);
Assert.Equal("XXXXXX", input.Players);
Assert.Equal(12345, input.Players);
//Assert.Equal("XXXXXX", input.ControlAttr); // Mututally exclusive with input.Control
Assert.Equal("XXXXXX", input.Buttons);
Assert.Equal("XXXXXX", input.Coins);
Assert.Equal(12345, input.Buttons);
Assert.Equal(12345, input.Coins);
Assert.NotNull(input.Control);
var control = Assert.Single(input.Control);

View File

@@ -168,10 +168,10 @@ namespace SabreTools.Serialization.CrossModel.Test
{
Service = true,
Tilt = true,
Players = "XXXXXX",
Players = 12345,
//ControlAttr = "XXXXXX", // Mututally exclusive with input.Control
Buttons = "XXXXXX",
Coins = "XXXXXX",
Buttons = 12345,
Coins = 12345,
Control = [control],
};
@@ -594,10 +594,10 @@ namespace SabreTools.Serialization.CrossModel.Test
Assert.NotNull(input);
Assert.Equal(true, input.Service);
Assert.Equal(true, input.Tilt);
Assert.Equal("XXXXXX", input.Players);
Assert.Equal(12345, input.Players);
//Assert.Equal("XXXXXX", input.ControlAttr); // Mututally exclusive with input.Control
Assert.Equal("XXXXXX", input.Buttons);
Assert.Equal("XXXXXX", input.Coins);
Assert.Equal(12345, input.Buttons);
Assert.Equal(12345, input.Coins);
Assert.NotNull(input.Control);
var control = Assert.Single(input.Control);

View File

@@ -168,10 +168,10 @@ namespace SabreTools.Serialization.CrossModel.Test
{
Service = true,
Tilt = true,
Players = "XXXXXX",
Players = 12345,
//ControlAttr = "XXXXXX", // Mututally exclusive with input.Control
Buttons = "XXXXXX",
Coins = "XXXXXX",
Buttons = 12345,
Coins = 12345,
Control = [control],
};
@@ -594,10 +594,10 @@ namespace SabreTools.Serialization.CrossModel.Test
Assert.NotNull(input);
Assert.Equal(true, input.Service);
Assert.Equal(true, input.Tilt);
Assert.Equal("XXXXXX", input.Players);
Assert.Equal(12345, input.Players);
//Assert.Equal("XXXXXX", input.ControlAttr); // Mututally exclusive with input.Control
Assert.Equal("XXXXXX", input.Buttons);
Assert.Equal("XXXXXX", input.Coins);
Assert.Equal(12345, input.Buttons);
Assert.Equal(12345, input.Coins);
Assert.NotNull(input.Control);
var control = Assert.Single(input.Control);

View File

@@ -229,10 +229,10 @@ namespace SabreTools.Serialization.CrossModel
{
var input = new Input
{
Players = item.ReadString(Data.Models.Metadata.Input.PlayersKey),
Players = item.Players,
Control = item.ReadString(Data.Models.Metadata.Input.ControlKey),
Buttons = item.ReadString(Data.Models.Metadata.Input.ButtonsKey),
Coins = item.ReadString(Data.Models.Metadata.Input.CoinsKey),
Buttons = item.Buttons,
Coins = item.Coins,
Tilt = item.Tilt,
Service = item.Service,
};

View File

@@ -242,10 +242,10 @@ namespace SabreTools.Serialization.CrossModel
{
var input = new Data.Models.Metadata.Input
{
[Data.Models.Metadata.Input.PlayersKey] = item.Players,
Players = item.Players,
[Data.Models.Metadata.Input.ControlKey] = item.Control,
[Data.Models.Metadata.Input.ButtonsKey] = item.Buttons,
[Data.Models.Metadata.Input.CoinsKey] = item.Coins,
Buttons = item.Buttons,
Coins = item.Coins,
Tilt = item.Tilt,
Service = item.Service,
};

View File

@@ -498,9 +498,9 @@ namespace SabreTools.Serialization.CrossModel
{
Service = item.Service,
Tilt = item.Tilt,
Players = item.ReadString(Data.Models.Metadata.Input.PlayersKey),
Buttons = item.ReadString(Data.Models.Metadata.Input.ButtonsKey),
Coins = item.ReadString(Data.Models.Metadata.Input.CoinsKey),
Players = item.Players,
Buttons = item.Buttons,
Coins = item.Coins,
};
var controlAttr = item.ReadString(Data.Models.Metadata.Input.ControlKey);

View File

@@ -536,10 +536,10 @@ namespace SabreTools.Serialization.CrossModel
{
Service = item.Service,
Tilt = item.Tilt,
[Data.Models.Metadata.Input.PlayersKey] = item.Players,
Players = item.Players,
[Data.Models.Metadata.Input.ControlKey] = item.ControlAttr,
[Data.Models.Metadata.Input.ButtonsKey] = item.Buttons,
[Data.Models.Metadata.Input.CoinsKey] = item.Coins,
Buttons = item.Buttons,
Coins = item.Coins,
};
if (item.Control is not null && item.Control.Length > 0)

View File

@@ -297,10 +297,10 @@ namespace SabreTools.Serialization.Readers.Test
var input = new Data.Models.ClrMamePro.Input
{
Players = "XXXXXX",
Players = 12345,
Control = "XXXXXX",
Buttons = "XXXXXX",
Coins = "XXXXXX",
Buttons = 12345,
Coins = 12345,
Tilt = true,
Service = true,
};
@@ -592,10 +592,10 @@ namespace SabreTools.Serialization.Readers.Test
private static void Validate(Data.Models.ClrMamePro.Input? input)
{
Assert.NotNull(input);
Assert.Equal("XXXXXX", input.Players);
Assert.Equal(12345, input.Players);
Assert.Equal("XXXXXX", input.Control);
Assert.Equal("XXXXXX", input.Buttons);
Assert.Equal("XXXXXX", input.Coins);
Assert.Equal(12345, input.Buttons);
Assert.Equal(12345, input.Coins);
Assert.Equal(true, input.Tilt);
Assert.Equal(true, input.Service);
}

View File

@@ -239,10 +239,10 @@ namespace SabreTools.Serialization.Readers.Test
{
Service = true,
Tilt = true,
Players = "XXXXXX",
Players = 12345,
ControlAttr = "XXXXXX",
Buttons = "XXXXXX",
Coins = "XXXXXX",
Buttons = 12345,
Coins = 12345,
Control = [control],
};
@@ -667,10 +667,10 @@ namespace SabreTools.Serialization.Readers.Test
Assert.NotNull(input);
Assert.Equal(true, input.Service);
Assert.Equal(true, input.Tilt);
Assert.Equal("XXXXXX", input.Players);
Assert.Equal(12345, input.Players);
Assert.Equal("XXXXXX", input.ControlAttr); // Mututally exclusive with input.Control
Assert.Equal("XXXXXX", input.Buttons);
Assert.Equal("XXXXXX", input.Coins);
Assert.Equal(12345, input.Buttons);
Assert.Equal(12345, input.Coins);
Assert.NotNull(input.Control);
var control = Assert.Single(input.Control);

View File

@@ -235,10 +235,10 @@ namespace SabreTools.Serialization.Readers.Test
{
Service = true,
Tilt = true,
Players = "XXXXXX",
Players = 12345,
//ControlAttr = "XXXXXX", // Mututally exclusive with input.Control
Buttons = "XXXXXX",
Coins = "XXXXXX",
Buttons = 12345,
Coins = 12345,
Control = [control],
};
@@ -661,10 +661,10 @@ namespace SabreTools.Serialization.Readers.Test
Assert.NotNull(input);
Assert.Equal(true, input.Service);
Assert.Equal(true, input.Tilt);
Assert.Equal("XXXXXX", input.Players);
Assert.Equal(12345, input.Players);
//Assert.Equal("XXXXXX", input.ControlAttr); // Mututally exclusive with input.Control
Assert.Equal("XXXXXX", input.Buttons);
Assert.Equal("XXXXXX", input.Coins);
Assert.Equal(12345, input.Buttons);
Assert.Equal(12345, input.Coins);
Assert.NotNull(input.Control);
var control = Assert.Single(input.Control);

View File

@@ -235,10 +235,10 @@ namespace SabreTools.Serialization.Readers.Test
{
Service = true,
Tilt = true,
Players = "XXXXXX",
Players = 12345,
//ControlAttr = "XXXXXX", // Mututally exclusive with input.Control
Buttons = "XXXXXX",
Coins = "XXXXXX",
Buttons = 12345,
Coins = 12345,
Control = [control],
};
@@ -661,10 +661,10 @@ namespace SabreTools.Serialization.Readers.Test
Assert.NotNull(input);
Assert.Equal(true, input.Service);
Assert.Equal(true, input.Tilt);
Assert.Equal("XXXXXX", input.Players);
Assert.Equal(12345, input.Players);
//Assert.Equal("XXXXXX", input.ControlAttr); // Mututally exclusive with input.Control
Assert.Equal("XXXXXX", input.Buttons);
Assert.Equal("XXXXXX", input.Coins);
Assert.Equal(12345, input.Buttons);
Assert.Equal(12345, input.Coins);
Assert.NotNull(input.Control);
var control = Assert.Single(input.Control);

View File

@@ -875,16 +875,16 @@ namespace SabreTools.Serialization.Readers
switch (kvp.Key?.ToLowerInvariant())
{
case "players":
input.Players = kvp.Value;
input.Players = NumberHelper.ConvertToInt64(kvp.Value);
break;
case "control":
input.Control = kvp.Value;
break;
case "buttons":
input.Buttons = kvp.Value;
input.Buttons = NumberHelper.ConvertToInt64(kvp.Value);
break;
case "coins":
input.Coins = kvp.Value;
input.Coins = NumberHelper.ConvertToInt64(kvp.Value);
break;
case "tilt":
input.Tilt = kvp.Value.AsYesNo();

View File

@@ -923,10 +923,10 @@ namespace SabreTools.Serialization.Readers
obj.Service = reader.GetAttribute("service").AsYesNo();
obj.Tilt = reader.GetAttribute("tilt").AsYesNo();
obj.Players = reader.GetAttribute("players");
obj.Players = NumberHelper.ConvertToInt64(reader.GetAttribute("players"));
obj.ControlAttr = reader.GetAttribute("control");
obj.Buttons = reader.GetAttribute("buttons");
obj.Coins = reader.GetAttribute("coins");
obj.Buttons = NumberHelper.ConvertToInt64(reader.GetAttribute("buttons"));
obj.Coins = NumberHelper.ConvertToInt64(reader.GetAttribute("coins"));
List<Control> controls = [];

View File

@@ -921,10 +921,10 @@ namespace SabreTools.Serialization.Readers
obj.Service = reader.GetAttribute("service").AsYesNo();
obj.Tilt = reader.GetAttribute("tilt").AsYesNo();
obj.Players = reader.GetAttribute("players");
obj.Players = NumberHelper.ConvertToInt64(reader.GetAttribute("players"));
obj.ControlAttr = reader.GetAttribute("control");
obj.Buttons = reader.GetAttribute("buttons");
obj.Coins = reader.GetAttribute("coins");
obj.Buttons = NumberHelper.ConvertToInt64(reader.GetAttribute("buttons"));
obj.Coins = NumberHelper.ConvertToInt64(reader.GetAttribute("coins"));
List<Control> controls = [];

View File

@@ -921,10 +921,10 @@ namespace SabreTools.Serialization.Readers
obj.Service = reader.GetAttribute("service").AsYesNo();
obj.Tilt = reader.GetAttribute("tilt").AsYesNo();
obj.Players = reader.GetAttribute("players");
obj.Players = NumberHelper.ConvertToInt64(reader.GetAttribute("players"));
obj.ControlAttr = reader.GetAttribute("control");
obj.Buttons = reader.GetAttribute("buttons");
obj.Coins = reader.GetAttribute("coins");
obj.Buttons = NumberHelper.ConvertToInt64(reader.GetAttribute("buttons"));
obj.Coins = NumberHelper.ConvertToInt64(reader.GetAttribute("coins"));
List<Control> controls = [];

View File

@@ -451,10 +451,10 @@ namespace SabreTools.Serialization.Writers
return;
writer.WriteStartElement("input");
writer.WriteRequiredAttributeString("players", input.Players, throwOnError: true);
writer.WriteRequiredAttributeString("players", input.Players?.ToString(), throwOnError: true);
writer.WriteOptionalAttributeString("control", input.Control);
writer.WriteRequiredAttributeString("buttons", input.Buttons, throwOnError: true);
writer.WriteOptionalAttributeString("coins", input.Coins);
writer.WriteRequiredAttributeString("buttons", input.Buttons?.ToString(), throwOnError: true);
writer.WriteOptionalAttributeString("coins", input.Coins?.ToString());
writer.WriteOptionalAttributeString("tilt", input.Tilt.FromYesNo());
writer.WriteOptionalAttributeString("service", input.Service.FromYesNo());
writer.WriteEndElement(); // input

View File

@@ -649,10 +649,10 @@ namespace SabreTools.Serialization.Writers
writer.WriteOptionalAttributeString("service", obj.Service.FromYesNo());
writer.WriteOptionalAttributeString("tilt", obj.Tilt.FromYesNo());
writer.WriteRequiredAttributeString("players", obj.Players);
writer.WriteRequiredAttributeString("players", obj.Players?.ToString());
writer.WriteOptionalAttributeString("control", obj.ControlAttr);
writer.WriteOptionalAttributeString("buttons", obj.Buttons);
writer.WriteOptionalAttributeString("coins", obj.Coins);
writer.WriteOptionalAttributeString("buttons", obj.Buttons?.ToString());
writer.WriteOptionalAttributeString("coins", obj.Coins?.ToString());
if (obj.Control is not null && obj.Control.Length > 0)
{

View File

@@ -647,10 +647,10 @@ namespace SabreTools.Serialization.Writers
writer.WriteOptionalAttributeString("service", obj.Service.FromYesNo());
writer.WriteOptionalAttributeString("tilt", obj.Tilt.FromYesNo());
writer.WriteRequiredAttributeString("players", obj.Players);
writer.WriteRequiredAttributeString("players", obj.Players?.ToString());
writer.WriteOptionalAttributeString("control", obj.ControlAttr);
writer.WriteOptionalAttributeString("buttons", obj.Buttons);
writer.WriteOptionalAttributeString("coins", obj.Coins);
writer.WriteOptionalAttributeString("buttons", obj.Buttons?.ToString());
writer.WriteOptionalAttributeString("coins", obj.Coins?.ToString());
if (obj.Control is not null && obj.Control.Length > 0)
{

View File

@@ -647,10 +647,10 @@ namespace SabreTools.Serialization.Writers
writer.WriteOptionalAttributeString("service", obj.Service.FromYesNo());
writer.WriteOptionalAttributeString("tilt", obj.Tilt.FromYesNo());
writer.WriteRequiredAttributeString("players", obj.Players);
writer.WriteRequiredAttributeString("players", obj.Players?.ToString());
writer.WriteOptionalAttributeString("control", obj.ControlAttr);
writer.WriteOptionalAttributeString("buttons", obj.Buttons);
writer.WriteOptionalAttributeString("coins", obj.Coins);
writer.WriteOptionalAttributeString("buttons", obj.Buttons?.ToString());
writer.WriteOptionalAttributeString("coins", obj.Coins?.ToString());
if (obj.Control is not null && obj.Control.Length > 0)
{