PKHeX/PKHeX.Core/Game/GameVersion.cs
Kurt 120f5380c9 Rework some more pkm generating logic
can get all the way to caterpie
- gen3/4 needs an antishiny,
- gen5 needs shiny&antishiny mech
- else case needs both as well.
2018-04-28 22:56:10 -07:00

127 lines
5.8 KiB
C#

namespace PKHeX.Core
{
/// <summary>
/// Game Version ID enum shared between actual Version IDs and lumped version groupings.
/// </summary>
public enum GameVersion
{
// Indicators
Invalid = -2,
Any = -1,
Unknown = 0,
// Version IDs, also stored in PKM structure
/*Gen3*/ S = 1, R = 2, E = 3, FR = 4, LG = 5, CXD = 15,
/*Gen4*/ D = 10, P = 11, Pt = 12, HG = 7, SS = 8,
/*Gen5*/ W = 20, B = 21, W2 = 22, B2 = 23,
/*Gen6*/ X = 24, Y = 25, AS = 26, OR = 27,
/*Gen7*/ SN = 30, MN = 31, US = 32, UM = 33,
/* GO */ GO = 34,
/* VC1*/ RD = 35, GN = 36, BU = 37, YW = 38, // GN = Blue for international release
/* VC2*/ GD = 39, SV = 40, C = 41, // Crystal is unused
// Not actually stored values, but assigned as properties.
// Game Groupings (SaveFile type)
/*SAV1*/ RB, RBY,
/*SAV2*/ GS, GSC,
/*SAV3*/ RS, RSE, FRLG, RSBOX, COLO, XD,
/*SAV4*/ DP, DPPt, HGSS, BATREV,
/*SAV5*/ BW, B2W2,
/*SAV6*/ XY, ORASDEMO, ORAS,
/*SAV7*/ SM, USUM,
// Extra Game Groupings (Generation)
Gen1, Gen2, Gen3, Gen4, Gen5, Gen6, Gen7,
GBCartEraOnly,
Stadium,
Stadium2,
EventsGBGen1,
EventsGBGen2,
VCEvents
}
public static partial class Extensions
{
public static int GetGeneration(this GameVersion g)
{
if (GameVersion.Gen1.Contains(g)) return 1;
if (GameVersion.Gen2.Contains(g)) return 2;
if (GameVersion.Gen3.Contains(g)) return 3;
if (GameVersion.Gen4.Contains(g)) return 4;
if (GameVersion.Gen5.Contains(g)) return 5;
if (GameVersion.Gen6.Contains(g)) return 6;
if (GameVersion.Gen7.Contains(g)) return 7;
return -1;
}
public static bool Contains(this GameVersion g1, GameVersion g2)
{
if (g1 == g2 || g1 == GameVersion.Any)
return true;
switch (g1)
{
case GameVersion.RB:
return g2 == GameVersion.RD || g2 == GameVersion.BU || g2 == GameVersion.GN;
case GameVersion.RBY:
return GameVersion.RB.Contains(g2) || g2 == GameVersion.YW;
case GameVersion.Gen1:
return GameVersion.RBY.Contains(g2) || g2 == GameVersion.Stadium || g2 == GameVersion.EventsGBGen1 || g2 == GameVersion.VCEvents;
case GameVersion.Stadium:
case GameVersion.EventsGBGen1:
case GameVersion.VCEvents:
goto case GameVersion.RBY;
case GameVersion.GS: return g2 == GameVersion.GD || g2 == GameVersion.SV;
case GameVersion.GSC:
return GameVersion.GS.Contains(g2) || g2 == GameVersion.C;
case GameVersion.Gen2:
return GameVersion.GSC.Contains(g2) || g2 == GameVersion.Stadium2 || g2 == GameVersion.EventsGBGen2;
case GameVersion.Stadium2:
case GameVersion.EventsGBGen2:
goto case GameVersion.GSC;
case GameVersion.GBCartEraOnly:
return g2 == GameVersion.Stadium || g2 == GameVersion.Stadium2 || g2 == GameVersion.EventsGBGen1 || g2 == GameVersion.EventsGBGen2;
case GameVersion.RS: return g2 == GameVersion.R || g2 == GameVersion.S;
case GameVersion.RSE:
return GameVersion.RS.Contains(g2) || g2 == GameVersion.E;
case GameVersion.FRLG: return g2 == GameVersion.FR || g2 == GameVersion.LG;
case GameVersion.COLO:
case GameVersion.XD: return g2 == GameVersion.CXD;
case GameVersion.CXD: return g2 == GameVersion.COLO || g2 == GameVersion.XD;
case GameVersion.RSBOX: return GameVersion.RS.Contains(g2) || g2 == GameVersion.E || GameVersion.FRLG.Contains(g2);
case GameVersion.Gen3:
return GameVersion.RSE.Contains(g2) || GameVersion.FRLG.Contains(g2) || GameVersion.CXD.Contains(g2) || g2 == GameVersion.RSBOX;
case GameVersion.DP: return g2 == GameVersion.D || g2 == GameVersion.P;
case GameVersion.HGSS: return g2 == GameVersion.HG || g2 == GameVersion.SS;
case GameVersion.DPPt:
return GameVersion.DP.Contains(g2) || g2 == GameVersion.Pt;
case GameVersion.BATREV: return GameVersion.DP.Contains(g2) || g2 == GameVersion.Pt || GameVersion.HGSS.Contains(g2);
case GameVersion.Gen4:
return GameVersion.DPPt.Contains(g2) || GameVersion.HGSS.Contains(g2) || g2 == GameVersion.BATREV;
case GameVersion.BW: return g2 == GameVersion.B || g2 == GameVersion.W;
case GameVersion.B2W2: return g2 == GameVersion.B2 || g2 == GameVersion.W2;
case GameVersion.Gen5:
return GameVersion.BW.Contains(g2) || GameVersion.B2W2.Contains(g2);
case GameVersion.XY: return g2 == GameVersion.X || g2 == GameVersion.Y;
case GameVersion.ORAS: return g2 == GameVersion.OR || g2 == GameVersion.AS;
case GameVersion.Gen6:
return GameVersion.XY.Contains(g2) || GameVersion.ORAS.Contains(g2);
case GameVersion.SM:
return g2 == GameVersion.SN || g2 == GameVersion.MN;
case GameVersion.USUM:
return g2 == GameVersion.US || g2 == GameVersion.UM;
case GameVersion.Gen7:
return GameVersion.SM.Contains(g2) || GameVersion.USUM.Contains(g2);
default: return false;
}
}
public static bool IsValid(this GameVersion g) => 0 < g && g <= GameVersion.RB;
}
}