Files
SabreTools/SabreTools.DatItems/Formats/Chip.cs
Matt Nadareski b37aed389e Add nullable context to SabreTools.DatItems
This change also starts migrating the internals of the DatItem formats to the new internal models. Right now, it's basically just acting like a wrapper around those models.
2023-08-14 13:17:51 -04:00

131 lines
3.6 KiB
C#

using System.Xml.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using SabreTools.Core;
using SabreTools.Core.Tools;
namespace SabreTools.DatItems.Formats
{
/// <summary>
/// Represents which Chip(s) is associated with a set
/// </summary>
[JsonObject("chip"), XmlRoot("chip")]
public class Chip : DatItem
{
#region Fields
/// <summary>
/// Name of the item
/// </summary>
[JsonProperty("name"), XmlElement("name")]
public string? Name
{
get => _chip.ReadString(Models.Internal.Chip.NameKey);
set => _chip[Models.Internal.Chip.NameKey] = value;
}
/// <summary>
/// Internal tag
/// </summary>
[JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("tag")]
public string? Tag
{
get => _chip.ReadString(Models.Internal.Chip.TagKey);
set => _chip[Models.Internal.Chip.TagKey] = value;
}
/// <summary>
/// Type of the chip
/// </summary>
[JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("type")]
[JsonConverter(typeof(StringEnumConverter))]
public ChipType ChipType
{
get => _chip.ReadString(Models.Internal.Chip.ChipTypeKey).AsChipType();
set => _chip[Models.Internal.Chip.ChipTypeKey] = value.FromChipType();
}
[JsonIgnore]
public bool ChipTypeSpecified { get { return ChipType != ChipType.NULL; } }
/// <summary>
/// Clock speed
/// </summary>
[JsonProperty("clock", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("clock")]
public long? Clock
{
get => _chip.ReadLong(Models.Internal.Chip.ClockKey);
set => _chip[Models.Internal.Chip.ClockKey] = value;
}
[JsonIgnore]
public bool ClockSpecified { get { return Clock != null; } }
/// <summary>
/// Internal Chip model
/// </summary>
[JsonIgnore]
private Models.Internal.Chip _chip = new();
#endregion
#region Accessors
/// <inheritdoc/>
public override string? GetName() => Name;
/// <inheritdoc/>
public override void SetName(string? name) => Name = name;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty Chip object
/// </summary>
public Chip()
{
Name = string.Empty;
ItemType = ItemType.Chip;
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Chip()
{
ItemType = this.ItemType,
DupeType = this.DupeType,
Machine = this.Machine?.Clone() as Machine,
Source = this.Source?.Clone() as Source,
Remove = this.Remove,
_chip = this._chip?.Clone() as Models.Internal.Chip ?? new Models.Internal.Chip(),
};
}
#endregion
#region Comparision Methods
/// <inheritdoc/>
public override bool Equals(DatItem? other)
{
// If we don't have a Chip, return false
if (ItemType != other?.ItemType || other is not Chip otherInternal)
return false;
// Compare the internal models
return _chip.EqualTo(otherInternal._chip);
}
#endregion
}
}