Per-Version sorting for met lists

Closes #197

Populates raw location lists on language init, when changing selected
version it obtains a new list and sorts.
This commit is contained in:
Kaphotics
2016-08-27 13:05:01 -07:00
parent 1484c15ff3
commit a2f0099822
2 changed files with 212 additions and 100 deletions

View File

@@ -151,6 +151,7 @@ public Main()
public static string[] wallpapernames, puffs = { };
public static bool unicode;
public static List<ComboItem> MoveDataSource, ItemDataSource, SpeciesDataSource, BallDataSource, NatureDataSource, AbilityDataSource, VersionDataSource;
private static List<ComboItem> metGen1, metGen2, metGen3, metGen4, metGen5, metGen6;
public static volatile bool formInitialized, fieldsInitialized, fieldsLoaded;
private static int colorizedbox = -1;
@@ -172,7 +173,7 @@ public Main()
"中文", // CHN
"Português", // Portuguese
};
private static string origintrack;
private static GameVersion origintrack;
private readonly PictureBox[] SlotPictureBoxes, movePB, relearnPB;
private readonly ToolTip Tip1 = new ToolTip(), Tip2 = new ToolTip(), Tip3 = new ToolTip(), NatureTip = new ToolTip();
#endregion
@@ -1051,7 +1052,7 @@ private void InitializeStrings()
abilitylist[0] = itemlist[0] = movelist[0] = metXY_00000[0] = metBW2_00000[0] = metHGSS_00000[0] = "(" + itemlist[0] + ")";
// Force an update to the met locations
origintrack = "";
origintrack = GameVersion.Unknown;
// Update Legality Analysis strings
LegalityAnalysis.movelist = movelist;
@@ -1108,6 +1109,48 @@ private void InitializeLanguage()
MoveDataSource = Util.getCBList(movelist, null);
#region Met Locations
// Gen 3
{
var met_list = Util.getCBList(metRSEFRLG_00000, Enumerable.Range(0, 213).ToArray());
met_list = Util.getOffsetCBList(met_list, metRSEFRLG_00000, 00000, new[] { 253, 254, 255 });
metGen3 = met_list;
}
// Gen 4
{
var met_list = Util.getCBList(metHGSS_00000, new[] { 0 });
met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, new[] { 2000 });
met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, new[] { 2002 });
met_list = Util.getOffsetCBList(met_list, metHGSS_03000, 3000, new[] { 3001 });
met_list = Util.getOffsetCBList(met_list, metHGSS_00000, 0000, Legal.Met_HGSS_0);
met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, Legal.Met_HGSS_2);
met_list = Util.getOffsetCBList(met_list, metHGSS_03000, 3000, Legal.Met_HGSS_3);
metGen4 = met_list;
}
// Gen 5
{
var met_list = Util.getCBList(metBW2_00000, new[] { 0 });
met_list = Util.getOffsetCBList(met_list, metBW2_60000, 60001, new[] { 60002 });
met_list = Util.getOffsetCBList(met_list, metBW2_30000, 30001, new[] { 30003 });
met_list = Util.getOffsetCBList(met_list, metBW2_00000, 00000, Legal.Met_BW2_0);
met_list = Util.getOffsetCBList(met_list, metBW2_30000, 30001, Legal.Met_BW2_3);
met_list = Util.getOffsetCBList(met_list, metBW2_40000, 40001, Legal.Met_BW2_4);
met_list = Util.getOffsetCBList(met_list, metBW2_60000, 60001, Legal.Met_BW2_6);
metGen5 = met_list;
}
// Gen 6
{
var met_list = Util.getCBList(metXY_00000, new[] { 0 });
met_list = Util.getOffsetCBList(met_list, metXY_60000, 60001, new[] { 60002 });
met_list = Util.getOffsetCBList(met_list, metXY_30000, 30001, new[] { 30002 });
met_list = Util.getOffsetCBList(met_list, metXY_00000, 00000, Legal.Met_XY_0);
met_list = Util.getOffsetCBList(met_list, metXY_30000, 30001, Legal.Met_XY_3);
met_list = Util.getOffsetCBList(met_list, metXY_40000, 40001, Legal.Met_XY_4);
met_list = Util.getOffsetCBList(met_list, metXY_60000, 60001, Legal.Met_XY_6);
metGen6 = met_list;
}
#endregion
CB_EncounterType.DataSource = Util.getCBList(encountertypelist, new[] { 0 }, Legal.Gen4EncounterTypes);
CB_HPType.DataSource = Util.getCBList(types.Skip(1).Take(16).ToArray(), null);
CB_Nature.DataSource = new BindingSource(NatureDataSource, null);
@@ -1877,114 +1920,112 @@ private void updateSpecies(object sender, EventArgs e)
updateLegality();
}
private IEnumerable<ComboItem> getLocationList(GameVersion Version, int SaveFormat, bool egg)
{
if (egg)
{
if (Version < GameVersion.W && SaveFormat >= 5)
return metGen4;
}
switch (Version)
{
case GameVersion.CXD:
if (SaveFormat == 3)
return metGen3;
break;
case GameVersion.R:
case GameVersion.S:
if (SaveFormat == 3)
return metGen3.OrderByDescending(loc => loc.Value <= 87); // Ferry
break;
case GameVersion.E:
if (SaveFormat == 3)
return metGen3.OrderByDescending(loc => loc.Value <= 87 || (loc.Value >= 196 && loc.Value <= 212)); // Trainer Hill
break;
case GameVersion.FR:
case GameVersion.LG:
if (SaveFormat == 3)
return metGen3.OrderByDescending(loc => loc.Value > 87 && loc.Value < 197); // Celadon Dept.
break;
case GameVersion.D:
case GameVersion.P:
if (SaveFormat == 4 || (SaveFormat >= 5 && egg))
return metGen4.Take(4).Concat(metGen6.Skip(4).OrderByDescending(loc => loc.Value <= 111)); // Battle Park
break;
case GameVersion.Pt:
if (SaveFormat == 4 || (SaveFormat >= 5 && egg))
return metGen4.Take(4).Concat(metGen6.Skip(4).OrderByDescending(loc => loc.Value <= 125)); // Rock Peak Ruins
break;
case GameVersion.HG:
case GameVersion.SS:
if (SaveFormat == 4 || (SaveFormat >= 5 && egg))
return metGen4.Take(4).Concat(metGen6.Skip(4).OrderByDescending(loc => loc.Value > 125 && loc.Value < 234)); // Celadon Dept.
break;
case GameVersion.B:
case GameVersion.W:
return metGen5;
case GameVersion.B2:
case GameVersion.W2:
return metGen5.Take(3).Concat(metGen5.Skip(3).OrderByDescending(loc => loc.Value <= 116)); // Abyssal Ruins
case GameVersion.X:
case GameVersion.Y:
return metGen6.Take(3).Concat(metGen6.Skip(3).OrderByDescending(loc => loc.Value <= 168)); // Unknown Dungeon
case GameVersion.OR:
case GameVersion.AS:
return metGen6.Take(3).Concat(metGen6.Skip(3).OrderByDescending(loc => loc.Value > 168 && loc.Value <= 354)); // Secret Base
}
// Currently on a future game, return corresponding list for generation
if (Version <= GameVersion.CXD && SaveFormat == 4)
return metGen4.Where(loc => loc.Value == 0x37) // Pal Park to front
.Concat(metGen4.Take(4))
.Concat(metGen4.Skip(4).Where(loc => loc.Value != 0x37));
if (Version < GameVersion.X && SaveFormat >= 5) // PokéTransfer to front
return metGen5.Where(loc => loc.Value == 30001)
.Concat(metGen5.Take(3))
.Concat(metGen5.Skip(3).Where(loc => loc.Value != 30001));
return metGen6;
}
private void updateOriginGame(object sender, EventArgs e)
{
int Version = Util.getIndex(CB_GameOrigin);
if (SAV.Generation == 3 && origintrack != "Gen3")
GameVersion Version = (GameVersion)Util.getIndex(CB_GameOrigin);
// check if differs
GameVersion newTrack = SaveUtil.getVersionGroup(Version);
if (newTrack != origintrack)
{
var met_list = Util.getCBList(metRSEFRLG_00000, Enumerable.Range(0, 213).ToArray());
met_list = Util.getOffsetCBList(met_list, metRSEFRLG_00000, 00000, new[] {253, 254, 255});
origintrack = "Gen3";
var met_list = getLocationList(Version, SAV.Generation, egg:false);
CB_MetLocation.DisplayMember = "Text";
CB_MetLocation.ValueMember = "Value";
CB_MetLocation.DataSource = met_list;
CB_MetLocation.SelectedValue = 0;
}
else if (SAV.Generation == 4 && origintrack != "Gen4")
{
var met_list = Util.getCBList(metHGSS_00000, new[] { 0 });
met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, new[] { 2000 });
met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, new[] { 2002 });
met_list = Util.getOffsetCBList(met_list, metHGSS_03000, 3000, new[] { 3001 });
met_list = Util.getOffsetCBList(met_list, metHGSS_00000, 0000, Legal.Met_HGSS_0);
met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, Legal.Met_HGSS_2);
met_list = Util.getOffsetCBList(met_list, metHGSS_03000, 3000, Legal.Met_HGSS_3);
CB_MetLocation.DisplayMember = "Text";
CB_MetLocation.ValueMember = "Value";
CB_MetLocation.DataSource = met_list;
CB_MetLocation.DataSource = new BindingSource(met_list, null);
CB_MetLocation.SelectedIndex = 0; // transporter or pal park for past gen pkm
var egg_list = getLocationList(Version, SAV.Generation, egg:true);
CB_EggLocation.DisplayMember = "Text";
CB_EggLocation.ValueMember = "Value";
CB_EggLocation.DataSource = new BindingSource(met_list, null);
CB_EggLocation.SelectedValue = 0;
CB_MetLocation.SelectedValue = 0;
origintrack = "Gen4";
}
else if (Version < 24 && origintrack != "Past" && SAV.Generation >= 5)
{
// Load Past Gen Locations
#region B2W2 Met Locations
{
// Build up our met list
var met_list = Util.getCBList(metBW2_00000, new[] { 0 });
met_list = Util.getOffsetCBList(met_list, metBW2_60000, 60001, new[] { 60002 });
met_list = Util.getOffsetCBList(met_list, metBW2_30000, 30001, new[] { 30003 });
met_list = Util.getOffsetCBList(met_list, metBW2_00000, 00000, Legal.Met_BW2_0);
met_list = Util.getOffsetCBList(met_list, metBW2_30000, 30001, Legal.Met_BW2_3);
met_list = Util.getOffsetCBList(met_list, metBW2_40000, 40001, Legal.Met_BW2_4);
met_list = Util.getOffsetCBList(met_list, metBW2_60000, 60001, Legal.Met_BW2_6);
CB_MetLocation.DisplayMember = "Text";
CB_MetLocation.ValueMember = "Value";
CB_MetLocation.DataSource = met_list;
CB_EggLocation.DisplayMember = "Text";
CB_EggLocation.ValueMember = "Value";
CB_EggLocation.DataSource = new BindingSource(met_list, null);
CB_EggLocation.SelectedValue = 0;
CB_MetLocation.SelectedValue = Version < 20 ? 30001 : 60001;
origintrack = "Past";
}
#endregion
}
else if (Version > 23 && origintrack != "XY")
{
// Load X/Y/OR/AS locations
#region ORAS Met Locations
{
// Build up our met list
var met_list = Util.getCBList(metXY_00000, new[] { 0 });
met_list = Util.getOffsetCBList(met_list, metXY_60000, 60001, new[] { 60002 });
met_list = Util.getOffsetCBList(met_list, metXY_30000, 30001, new[] { 30002 });
met_list = Util.getOffsetCBList(met_list, metXY_00000, 00000, Legal.Met_XY_0);
met_list = Util.getOffsetCBList(met_list, metXY_30000, 30001, Legal.Met_XY_3);
met_list = Util.getOffsetCBList(met_list, metXY_40000, 40001, Legal.Met_XY_4);
met_list = Util.getOffsetCBList(met_list, metXY_60000, 60001, Legal.Met_XY_6);
CB_MetLocation.DisplayMember = "Text";
CB_MetLocation.ValueMember = "Value";
CB_MetLocation.DataSource = met_list;
CB_EggLocation.DisplayMember = "Text";
CB_EggLocation.ValueMember = "Value";
CB_EggLocation.DataSource = new BindingSource(met_list, null);
CB_EggLocation.SelectedValue = 0;
CB_MetLocation.SelectedValue = 0;
origintrack = "XY";
}
#endregion
}
CB_EggLocation.DataSource = new BindingSource(egg_list, null);
CB_EggLocation.SelectedIndex = CHK_AsEgg.Checked ? 1 : 0; // daycare : none
if (SAV.Generation >= 4 && Version < 0x10 && origintrack != "Gen4")
{
// Load Gen 4 egg locations if Gen 4 Origin.
#region HGSS Met Locations
var met_list = Util.getCBList(metHGSS_00000, new[] { 0 });
met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, new[] { 2000 });
met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, new[] { 2002 });
met_list = Util.getOffsetCBList(met_list, metHGSS_03000, 3000, new[] { 3001 });
met_list = Util.getOffsetCBList(met_list, metHGSS_00000, 0000, Legal.Met_HGSS_0);
met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, Legal.Met_HGSS_2);
met_list = Util.getOffsetCBList(met_list, metHGSS_03000, 3000, Legal.Met_HGSS_3);
CB_EggLocation.DisplayMember = "Text";
CB_EggLocation.ValueMember = "Value";
CB_EggLocation.DataSource = met_list;
CB_EggLocation.SelectedValue = 0;
origintrack = "Gen4";
#endregion
origintrack = newTrack;
}
// Visibility logic for Gen 4 encounter type; only show for Gen 4 Pokemon.
if (SAV.Generation >= 4)
{
bool g4 = Version >= 7 && Version <= 12 && Version != 9;
bool g4 = Version >= GameVersion.D && Version <= GameVersion.SS;
if ((int) Version == 9) // invalid
g4 = false;
CB_EncounterType.Visible = Label_EncounterType.Visible = g4;
if (!g4)
CB_EncounterType.SelectedValue = 0;
@@ -1993,7 +2034,7 @@ private void updateOriginGame(object sender, EventArgs e)
setMarkings(); // Set/Remove KB marking
if (!fieldsLoaded)
return;
pkm.Version = Version;
pkm.Version = (int)Version;
updateLegality();
}
private void updateExtraByteValue(object sender, EventArgs e)

View File

@@ -158,6 +158,59 @@ public static GameVersion getIsG6SAV(byte[] data)
return GameVersion.Invalid;
}
/// <summary>Determines the Version Grouping of an input Version ID</summary>
/// <param name="Version">Version of which to determine the group</param>
/// <returns>Version Group Identifier or Invalid if type cannot be determined.</returns>
public static GameVersion getVersionGroup(GameVersion Version)
{
switch (Version)
{
case GameVersion.CXD:
return GameVersion.CXD;
case GameVersion.R:
case GameVersion.S:
return GameVersion.RS;
case GameVersion.E:
return GameVersion.E;
case GameVersion.FR:
case GameVersion.LG:
return GameVersion.FR;
case GameVersion.D:
case GameVersion.P:
return GameVersion.DP;
case GameVersion.Pt:
return GameVersion.Pt;
case GameVersion.HG:
case GameVersion.SS:
return GameVersion.HGSS;
case GameVersion.B:
case GameVersion.W:
return GameVersion.BW;
case GameVersion.B2:
case GameVersion.W2:
return GameVersion.B2W2;
case GameVersion.X:
case GameVersion.Y:
return GameVersion.XY;
case GameVersion.OR:
case GameVersion.AS:
return GameVersion.ORAS;
default:
return GameVersion.Invalid;
}
}
/// <summary>Creates an instance of a SaveFile using the given save data.</summary>
/// <param name="data">Save data from which to create a SaveFile.</param>
/// <returns>An appropriate type of save file for the given data, or null if the save data is invalid.</returns>
@@ -286,7 +339,7 @@ internal static ushort check32(byte[] data)
return (ushort)((val & 0xFFFF) + (val >> 16));
}
public static int getDexFormIndexXY(int species, int formct)
public static int getDexFormIndexBW(int species, int formct)
{
if (formct < 1 || species < 0)
return -1; // invalid
@@ -308,11 +361,29 @@ public static int getDexFormIndexXY(int species, int formct)
case 648: return 066; // 2 Meloetta
case 555: return 068; // 2 Darmanitan
case 550: return 070; // 2 Basculin
default: return -1;
}
}
public static int getDexFormIndexB2W2(int species, int formct)
{
if (formct < 1 || species < 0)
return -1; // invalid
switch (species)
{
case 646: return 072; // 3 Kyurem
case 647: return 075; // 2 Keldeo
case 642: return 077; // 2 Thundurus
case 641: return 079; // 2 Tornadus
case 645: return 081; // 2 Landorus
default: return getDexFormIndexBW(species, formct);
}
}
public static int getDexFormIndexXY(int species, int formct)
{
if (formct < 1 || species < 0)
return -1; // invalid
switch (species)
{
case 666: return 083; // 20 Vivillion
case 669: return 103; // 5 Flabébé
case 670: return 108; // 6 Floette
@@ -349,7 +420,7 @@ public static int getDexFormIndexXY(int species, int formct)
case 445: return 183; // 2 Garchomp
case 448: return 185; // 2 Lucario
case 460: return 187; // 2 Abomasnow
default: return -1;
default: return getDexFormIndexB2W2(species, formct);
}
}
public static int getDexFormIndexORAS(int species, int formct)