namespace PKHeX.Core
{
///
/// Stores details about a (PID) and any associated details being traced to a known correlation.
///
public readonly struct PIDIV
{
internal static readonly PIDIV None = new();
internal static readonly PIDIV CuteCharm = new(PIDType.CuteCharm);
internal static readonly PIDIV Pokewalker = new(PIDType.Pokewalker);
internal static readonly PIDIV G5MGShiny = new(PIDType.G5MGShiny);
/// The RNG seed which immediately generates the PIDIV (starting with PID or IVs, whichever comes first).
public readonly uint OriginSeed;
/// Indicates that there is no to refer to.
/// Some PIDIVs may be generated without a single seed, but may follow a traceable pattern.
public bool NoSeed => Type is PIDType.None or PIDType.CuteCharm or PIDType.Pokewalker or PIDType.G5MGShiny;
/// Type of PIDIV correlation
public readonly PIDType Type;
private PIDIV(PIDType type)
{
OriginSeed = 0;
Type = type;
}
public PIDIV(PIDType type, uint seed)
{
OriginSeed = seed;
Type = type;
}
public bool Equals(PIDIV pid) => pid.Type == Type && pid.OriginSeed == OriginSeed;
public override bool Equals(object pid) => pid is PIDIV p && Equals(p);
public override int GetHashCode() => 0;
public static bool operator ==(PIDIV left, PIDIV right) => left.Equals(right);
public static bool operator !=(PIDIV left, PIDIV right) => !(left == right);
#if DEBUG
public override string ToString() => NoSeed ? Type.ToString() : $"{Type} - 0x{OriginSeed:X8}";
#endif
}
}