2018-03-31 04:37:01 +00:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
namespace PKHeX.Core
|
2018-03-30 23:31:40 +00:00
|
|
|
|
{
|
|
|
|
|
public interface IVersion
|
|
|
|
|
{
|
2020-05-20 04:46:05 +00:00
|
|
|
|
GameVersion Version { get; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal interface IVersionSet
|
|
|
|
|
{
|
|
|
|
|
GameVersion Version { set; }
|
2018-03-30 23:31:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static partial class Extensions
|
|
|
|
|
{
|
2020-05-20 04:07:30 +00:00
|
|
|
|
private static bool CanBeReceivedBy(this IVersion ver, GameVersion game) => ver.Version.Contains(game);
|
2018-08-03 03:11:42 +00:00
|
|
|
|
|
2018-03-30 23:31:40 +00:00
|
|
|
|
public static GameVersion GetCompatibleVersion(this IVersion ver, GameVersion prefer)
|
|
|
|
|
{
|
|
|
|
|
if (ver.CanBeReceivedBy(prefer) || ver.Version <= GameVersion.Unknown)
|
|
|
|
|
return prefer;
|
2018-03-31 04:37:01 +00:00
|
|
|
|
return ver.GetSingleVersion();
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-20 04:46:05 +00:00
|
|
|
|
internal static void SetVersion<T>(this IEnumerable<T> arr, GameVersion game) where T : IVersion, IVersionSet
|
2018-03-31 04:37:01 +00:00
|
|
|
|
{
|
|
|
|
|
foreach (var z in arr)
|
2018-08-03 03:11:42 +00:00
|
|
|
|
{
|
2020-05-20 04:46:05 +00:00
|
|
|
|
if (((IVersion)z).Version <= 0)
|
|
|
|
|
((IVersionSet)z).Version = game;
|
2018-08-03 03:11:42 +00:00
|
|
|
|
}
|
2018-03-31 04:37:01 +00:00
|
|
|
|
}
|
2018-08-03 03:11:42 +00:00
|
|
|
|
|
2018-03-31 04:37:01 +00:00
|
|
|
|
internal static void SetVersion(this IEnumerable<EncounterArea> arr, GameVersion game)
|
|
|
|
|
{
|
|
|
|
|
foreach (var area in arr)
|
|
|
|
|
area.Slots.SetVersion(game);
|
2018-03-30 23:31:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-03-31 04:37:01 +00:00
|
|
|
|
private static GameVersion GetSingleVersion(this IVersion ver)
|
2018-03-30 23:31:40 +00:00
|
|
|
|
{
|
|
|
|
|
const int max = (int) GameVersion.RB;
|
2018-03-31 04:37:01 +00:00
|
|
|
|
if ((int)ver.Version < max)
|
|
|
|
|
return ver.Version;
|
2020-01-26 05:49:52 +00:00
|
|
|
|
var rnd = Util.Rand;
|
2018-03-30 23:31:40 +00:00
|
|
|
|
while (true) // this isn't optimal, but is low maintenance
|
|
|
|
|
{
|
2020-01-26 05:49:52 +00:00
|
|
|
|
var game = (GameVersion)rnd.Next(1, max);
|
2018-03-30 23:31:40 +00:00
|
|
|
|
if (ver.CanBeReceivedBy(game))
|
|
|
|
|
return game;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|