Misc refactoring

expose some useful IEnumerable methods (sorting / bin->pkm / copy) to
simplify some common operations
change some explicit arrays to IList for flexibility
remove old memecrypto bool (no longer necessary as XP is not supported)
rename some methods for more clarity
This commit is contained in:
Kurt 2017-09-28 22:20:27 -07:00
parent 212a489335
commit ed1b934374
25 changed files with 159 additions and 138 deletions

View file

@ -40,7 +40,7 @@ namespace PKHeX.Core
public override int AltForm { get => Species == 201 ? PKX.GetUnownForm(PID) : 0; set { } }
public override bool IsNicknamed { get => PKX.IsNicknamedAnyLanguage(Species, Nickname, Format); set { } }
public override int Gender { get => PKX.GetGender(Species, PID); set { } }
public override int Gender { get => PKX.GetGenderFromPID(Species, PID); set { } }
public override int Characteristic => -1;
public override int CurrentFriendship { get => OT_Friendship; set => OT_Friendship = value; }
public override int Ability { get { int[] abils = PersonalTable.RS.GetAbilities(Species, 0); return abils[abils[1] == 0 ? 0 : AbilityNumber >> 1]; } set { } }

View file

@ -37,7 +37,7 @@ namespace PKHeX.Core
public override int AltForm { get => Species == 201 ? PKX.GetUnownForm(PID) : 0; set { } }
public override bool IsNicknamed { get => PKX.IsNicknamedAnyLanguage(Species, Nickname, Format); set { } }
public override int Gender { get => PKX.GetGender(Species, PID); set { } }
public override int Gender { get => PKX.GetGenderFromPID(Species, PID); set { } }
public override int Characteristic => -1;
public override int CurrentFriendship { get => OT_Friendship; set => OT_Friendship = value; }
public override int Ability { get { int[] abils = PersonalInfo.Abilities; return abils[AbilityBit && abils[1] != 0 ? 1 : 0]; } set { } }
@ -280,7 +280,7 @@ namespace PKHeX.Core
// Set Final Data
pk4.Met_Level = PKX.GetLevel(pk4.Species, pk4.EXP);
pk4.Gender = PKX.GetGender(pk4.Species, pk4.PID);
pk4.Gender = PKX.GetGenderFromPID(pk4.Species, pk4.PID);
pk4.IsNicknamed = IsNicknamed;
// Unown Form

View file

@ -621,7 +621,7 @@ namespace PKHeX.Core
if (GenNumber >= 6)
return true;
return gender == PKX.GetGender(PID, gv);
return gender == PKX.GetGenderFromPIDAndRatio(PID, gv);
}
/// <summary>

View file

@ -332,7 +332,7 @@ namespace PKHeX.Core
/// </summary>
/// <param name="s">Gender string</param>
/// <returns>Gender integer</returns>
public static int GetGender(string s)
public static int GetGenderFromPID(string s)
{
if (s == null)
return -1;
@ -528,7 +528,7 @@ namespace PKHeX.Core
return pid; // PID can be anything
// Gen 3/4/5: Gender derived from PID
if (cg == GetGender(pid, gt))
if (cg == GetGenderFromPIDAndRatio(pid, gt))
return pid;
}
}
@ -708,12 +708,12 @@ namespace PKHeX.Core
/// <param name="PID">Personality ID.</param>
/// <returns>Gender ID (0/1/2)</returns>
/// <remarks>This method should only be used for Generations 3-5 origin.</remarks>
public static int GetGender(int species, uint PID)
public static int GetGenderFromPID(int species, uint PID)
{
int genderratio = Personal[species].Gender;
return GetGender(PID, genderratio);
return GetGenderFromPIDAndRatio(PID, genderratio);
}
public static int GetGender(uint PID, int gr)
public static int GetGenderFromPIDAndRatio(uint PID, int gr)
{
switch (gr)
{
@ -875,5 +875,52 @@ namespace PKHeX.Core
IVs + " " + EVs,
};
}
/// <summary>
/// Copies an <see cref="Enumerable"/> list to the destination list, with an option to copy to a starting point.
/// </summary>
/// <param name="list">Source list to copy from</param>
/// <param name="dest">Destination list/array</param>
/// <param name="start">Starting point to copy to</param>
public static void CopyTo(this IEnumerable<PKM> list, IList<PKM> dest, int start = 0)
{
int ctr = 0;
foreach (var z in list)
dest[start + ctr++] = z;
}
/// <summary>
/// Gets an <see cref="Enumerable"/> list of PKM data from a concatenated byte array binary.
/// </summary>
/// <param name="data"></param>
/// <param name="len">Length of each PKM byte[]</param>
/// <returns>Enumerable list of PKM byte arrays</returns>
public static IEnumerable<byte[]> GetPKMDataFromConcatenatedBinary(byte[] data, int len)
{
// split up data to individual pkm
for (int i = 0; i < data.Length; ++i)
{
int offset = i * len;
var pk = new byte[len];
Buffer.BlockCopy(data, offset, pk, 0, len);
yield return pk;
}
}
/// <summary>
/// Sorts an <see cref="Enumerable"/> list of <see cref="PKM"/> objects according to common-usage.
/// </summary>
/// <param name="list">Source list to sort</param>
/// <returns>Enumerable list that is sorted</returns>
public static IEnumerable<PKM> SortPKMs(IEnumerable<PKM> list)
{
return list
.OrderBy(p => p.Species == 0) // empty slots at end
.ThenBy(p => p.IsEgg) // eggs to the end
.ThenBy(p => p.Species) // species sorted
.ThenBy(p => p.AltForm) // altforms sorted
.ThenBy(p => p.Gender) // gender sorted
.ThenBy(p => p.IsNicknamed);
}
}
}

View file

@ -38,7 +38,7 @@ namespace PKHeX.Core
public override int AltForm { get => Species == 201 ? PKX.GetUnownForm(PID) : 0; set { } }
public override bool IsNicknamed { get => PKX.IsNicknamedAnyLanguage(Species, Nickname, Format); set { } }
public override int Gender { get => PKX.GetGender(Species, PID); set { } }
public override int Gender { get => PKX.GetGenderFromPID(Species, PID); set { } }
public override int Characteristic => -1;
public override int CurrentFriendship { get => OT_Friendship; set => OT_Friendship = value; }
public override int Ability { get { int[] abils = PersonalTable.RS.GetAbilities(Species, 0); return abils[abils[1] == 0 ? 0 : AbilityNumber >> 1]; } set { } }

View file

@ -1302,8 +1302,6 @@ namespace PKHeX.Core
// Data[0x1F22] = (byte)((Data[0x1F22] & 0xFE) | (value ? 1 : 0)); // event
}
public override bool RequiresMemeCrypto => true;
public override string GetString(int Offset, int Count) => StringConverter.GetString7(Data, Offset, Count);
public override byte[] SetString(string value, int maxLength, int PadToSize = 0, ushort PadWith = 0)
{

View file

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
@ -57,8 +58,8 @@ namespace PKHeX.Core
return Header.Concat(Data).ToArray();
return Data;
}
public virtual string MiscSaveChecks() { return ""; }
public virtual string MiscSaveInfo() { return ""; }
public virtual string MiscSaveChecks() => string.Empty;
public virtual string MiscSaveInfo() => string.Empty;
public virtual GameVersion Version { get; protected set; }
public abstract bool ChecksumsValid { get; }
public abstract string ChecksumInfo { get; }
@ -149,7 +150,7 @@ namespace PKHeX.Core
public int HoF { get; protected set; } = int.MinValue;
// SAV Properties
public PKM[] BoxData
public IList<PKM> BoxData
{
get
{
@ -168,16 +169,16 @@ namespace PKHeX.Core
{
if (value == null)
throw new ArgumentNullException();
if (value.Length != BoxCount*BoxSlotCount)
throw new ArgumentException($"Expected {BoxCount*BoxSlotCount}, got {value.Length}");
if (value.Count != BoxCount*BoxSlotCount)
throw new ArgumentException($"Expected {BoxCount*BoxSlotCount}, got {value.Count}");
if (value.Any(pk => PKMType != pk.GetType()))
throw new ArgumentException($"Not {PKMType} array.");
for (int i = 0; i < value.Length; i++)
for (int i = 0; i < value.Count; i++)
SetStoredSlot(value[i], GetBoxOffset(i/BoxSlotCount) + SIZE_STORED*(i%BoxSlotCount));
}
}
public PKM[] PartyData
public IList<PKM> PartyData
{
get
{
@ -190,12 +191,12 @@ namespace PKHeX.Core
{
if (value == null)
throw new ArgumentNullException();
if (value.Length == 0 || value.Length > 6)
throw new ArgumentException("Expected 1-6, got " + value.Length);
if (value.Count == 0 || value.Count > 6)
throw new ArgumentException("Expected 1-6, got " + value.Count);
if (value.Any(pk => PKMType != pk.GetType()))
throw new ArgumentException($"Not {PKMType} array.");
if (value[0].Species == 0)
Debug.WriteLine($"Empty first slot, received {value.Length}.");
Debug.WriteLine($"Empty first slot, received {value.Count}.");
PKM[] newParty = value.Where(pk => pk.Species != 0).ToArray();
@ -207,7 +208,7 @@ namespace PKHeX.Core
SetPartySlot(newParty[i], GetPartyOffset(i));
}
}
public PKM[] BattleBoxData
public IList<PKM> BattleBoxData
{
get
{
@ -368,7 +369,7 @@ namespace PKHeX.Core
return false;
var party = PartyData;
return party.Length == party.Where((t, i) => t.IsEgg || except.Contains(i)).Count();
return party.Count == party.Where((t, i) => t.IsEgg || except.Contains(i)).Count();
}
// Varied Methods
@ -435,7 +436,7 @@ namespace PKHeX.Core
++ctr;
b = ctr++;
}
Array.Copy(boxdata, len*i, Data, GetBoxOffset(b), len);
Buffer.BlockCopy(boxdata, len*i, Data, GetBoxOffset(b), len);
SetBoxName(b, boxNames[i]);
SetBoxWallpaper(b, boxWallpapers[i]);
}
@ -467,9 +468,9 @@ namespace PKHeX.Core
int b2o = GetBoxOffset(box2);
int len = BoxSlotCount*SIZE_STORED;
byte[] b1 = new byte[len];
Array.Copy(Data, b1o, b1, 0, len);
Array.Copy(Data, b2o, Data, b1o, len);
Array.Copy(b1, 0, Data, b2o, len);
Buffer.BlockCopy(Data, b1o, b1, 0, len);
Buffer.BlockCopy(Data, b2o, Data, b1o, len);
Buffer.BlockCopy(b1, 0, Data, b2o, len);
// Name
string b1n = GetBoxName(box1);
@ -570,20 +571,15 @@ namespace PKHeX.Core
public void SortBoxes(int BoxStart = 0, int BoxEnd = -1)
{
PKM[] BD = BoxData;
var Section = BD.Skip(BoxStart*BoxSlotCount);
var BD = BoxData;
int start = BoxSlotCount * BoxStart;
var Section = BD.Skip(start);
if (BoxEnd > BoxStart)
Section = Section.Take(BoxSlotCount*(BoxEnd - BoxStart));
Section = Section.Take(BoxSlotCount * (BoxEnd - BoxStart));
var Sorted = Section
.OrderBy(p => p.Species == 0) // empty slots at end
.ThenBy(p => p.IsEgg) // eggs to the end
.ThenBy(p => p.Species) // species sorted
.ThenBy(p => p.AltForm) // altforms sorted
.ThenBy(p => p.Gender) // gender sorted
.ThenBy(p => p.IsNicknamed).ToArray();
var Sorted = PKX.SortPKMs(Section);
Array.Copy(Sorted, 0, BD, BoxStart*BoxSlotCount, Sorted.Length);
Sorted.CopyTo(BD, start);
BoxData = BD;
}
public void ClearBoxes(int BoxStart = 0, int BoxEnd = -1)
@ -612,43 +608,25 @@ namespace PKHeX.Core
if (data.Length != PCBinary.Length)
return false;
int len = BlankPKM.EncryptedBoxData.Length;
// split up data to individual pkm
byte[][] pkdata = new byte[data.Length/len][];
for (int i = 0; i < data.Length; i += len)
{
pkdata[i/len] = new byte[len];
Array.Copy(data, i, pkdata[i/len], 0, len);
}
PKM[] pkms = BoxData;
for (int i = 0; i < pkms.Length; i++)
pkms[i] = GetPKM(DecryptPKM(pkdata[i]));
BoxData = pkms;
var BD = BoxData;
var pkdata = PKX.GetPKMDataFromConcatenatedBinary(data, BlankPKM.EncryptedBoxData.Length);
pkdata.Select(z => GetPKM(DecryptPKM(z))).CopyTo(BD);
BoxData = BD;
return true;
}
public bool SetBoxBinary(byte[] data, int box)
{
if (LockedSlots.Any(slot => box * BoxSlotCount <= slot && slot < (box + 1) * BoxSlotCount))
int start = box * BoxSlotCount;
int end = start + BoxSlotCount;
if (LockedSlots.Any(slot => start <= slot && slot < end))
return false;
if (data.Length != GetBoxBinary(box).Length)
return false;
int len = BlankPKM.EncryptedBoxData.Length;
// split up data to individual pkm
byte[][] pkdata = new byte[data.Length/len][];
for (int i = 0; i < data.Length; i += len)
{
pkdata[i/len] = new byte[len];
Array.Copy(data, i, pkdata[i/len], 0, len);
}
PKM[] pkms = BoxData;
for (int i = 0; i < BoxSlotCount; i++)
pkms[box*BoxSlotCount + i] = GetPKM(DecryptPKM(pkdata[i]));
BoxData = pkms;
var BD = BoxData;
var pkdata = PKX.GetPKMDataFromConcatenatedBinary(data, BlankPKM.EncryptedBoxData.Length);
pkdata.Select(z => GetPKM(DecryptPKM(z))).CopyTo(BD, start);
BoxData = BD;
return true;
}
@ -668,7 +646,7 @@ namespace PKHeX.Core
return null;
byte[] data = new byte[Length];
Array.Copy(Data, Offset, data, 0, Length);
Buffer.BlockCopy(Data, Offset, data, 0, Length);
return data;
}
public void SetData(byte[] input, int Offset)
@ -680,8 +658,6 @@ namespace PKHeX.Core
public abstract string GetString(int Offset, int Length);
public abstract byte[] SetString(string value, int maxLength, int PadToSize = 0, ushort PadWith = 0);
public virtual bool RequiresMemeCrypto => false;
public virtual string EBerryName => string.Empty;
public virtual bool IsEBerryIsEnigma => true;
}

View file

@ -137,7 +137,7 @@ namespace PKHeX.WinForms.Controls
ck3.AbilityNumber = 1 << CB_Ability.SelectedIndex; // to match gen6+
ck3.FatefulEncounter = CHK_Fateful.Checked;
ck3.Gender = PKX.GetGender(Label_Gender.Text);
ck3.Gender = PKX.GetGenderFromPID(Label_Gender.Text);
ck3.EV_HP = Util.ToInt32(TB_HPEV.Text);
ck3.EV_ATK = Util.ToInt32(TB_ATKEV.Text);
ck3.EV_DEF = Util.ToInt32(TB_DEFEV.Text);
@ -182,7 +182,7 @@ namespace PKHeX.WinForms.Controls
ck3.Ball = WinFormsUtil.GetIndex(CB_Ball);
ck3.Met_Level = Util.ToInt32(TB_MetLevel.Text);
ck3.OT_Gender = PKX.GetGender(Label_OTGender.Text);
ck3.OT_Gender = PKX.GetGenderFromPID(Label_OTGender.Text);
ck3.Version = WinFormsUtil.GetIndex(CB_GameOrigin);
ck3.Language = WinFormsUtil.GetIndex(CB_Language);

View file

@ -91,7 +91,7 @@ namespace PKHeX.WinForms.Controls
pk2.HeldItem = WinFormsUtil.GetIndex(CB_HeldItem);
pk2.IsEgg = CHK_IsEgg.Checked;
pk2.CurrentFriendship = Util.ToInt32(TB_Friendship.Text);
pk2.OT_Gender = PKX.GetGender(Label_OTGender.Text);
pk2.OT_Gender = PKX.GetGenderFromPID(Label_OTGender.Text);
pk2.Met_Level = Util.ToInt32(TB_MetLevel.Text);
pk2.Met_Location = WinFormsUtil.GetIndex(CB_MetLocation);
pk2.Met_TimeOfDay = CB_MetTimeOfDay.SelectedIndex;

View file

@ -116,7 +116,7 @@ namespace PKHeX.WinForms.Controls
pk3.AbilityNumber = 1 << CB_Ability.SelectedIndex; // to match gen6+
pk3.FatefulEncounter = CHK_Fateful.Checked;
pk3.Gender = PKX.GetGender(Label_Gender.Text);
pk3.Gender = PKX.GetGenderFromPID(Label_Gender.Text);
pk3.EV_HP = Util.ToInt32(TB_HPEV.Text);
pk3.EV_ATK = Util.ToInt32(TB_ATKEV.Text);
pk3.EV_DEF = Util.ToInt32(TB_DEFEV.Text);
@ -161,7 +161,7 @@ namespace PKHeX.WinForms.Controls
pk3.Ball = WinFormsUtil.GetIndex(CB_Ball);
pk3.Met_Level = Util.ToInt32(TB_MetLevel.Text);
pk3.OT_Gender = PKX.GetGender(Label_OTGender.Text);
pk3.OT_Gender = PKX.GetGenderFromPID(Label_OTGender.Text);
pk3.Version = WinFormsUtil.GetIndex(CB_GameOrigin);
pk3.Language = WinFormsUtil.GetIndex(CB_Language);

View file

@ -158,7 +158,7 @@ namespace PKHeX.WinForms.Controls
}
pk4.FatefulEncounter = CHK_Fateful.Checked;
pk4.Gender = PKX.GetGender(Label_Gender.Text);
pk4.Gender = PKX.GetGenderFromPID(Label_Gender.Text);
pk4.AltForm = (MT_Form.Enabled ? Convert.ToInt32(MT_Form.Text) : CB_Form.Enabled ? CB_Form.SelectedIndex : 0) & 0x1F;
pk4.EV_HP = Util.ToInt32(TB_HPEV.Text);
pk4.EV_ATK = Util.ToInt32(TB_ATKEV.Text);
@ -204,7 +204,7 @@ namespace PKHeX.WinForms.Controls
pk4.Ball = WinFormsUtil.GetIndex(CB_Ball);
pk4.Met_Level = Util.ToInt32(TB_MetLevel.Text);
pk4.OT_Gender = PKX.GetGender(Label_OTGender.Text);
pk4.OT_Gender = PKX.GetGenderFromPID(Label_OTGender.Text);
pk4.EncounterType = WinFormsUtil.GetIndex(CB_EncounterType);
pk4.Version = WinFormsUtil.GetIndex(CB_GameOrigin);
pk4.Language = WinFormsUtil.GetIndex(CB_Language);

View file

@ -157,7 +157,7 @@ namespace PKHeX.WinForms.Controls
pk5.Nature = (byte)WinFormsUtil.GetIndex(CB_Nature);
pk5.FatefulEncounter = CHK_Fateful.Checked;
pk5.Gender = PKX.GetGender(Label_Gender.Text);
pk5.Gender = PKX.GetGenderFromPID(Label_Gender.Text);
pk5.AltForm = (MT_Form.Enabled ? Convert.ToInt32(MT_Form.Text) : CB_Form.Enabled ? CB_Form.SelectedIndex : 0) & 0x1F;
pk5.EV_HP = Util.ToInt32(TB_HPEV.Text);
pk5.EV_ATK = Util.ToInt32(TB_ATKEV.Text);
@ -221,7 +221,7 @@ namespace PKHeX.WinForms.Controls
pk5.Ball = WinFormsUtil.GetIndex(CB_Ball);
pk5.Met_Level = Util.ToInt32(TB_MetLevel.Text);
pk5.OT_Gender = PKX.GetGender(Label_OTGender.Text);
pk5.OT_Gender = PKX.GetGenderFromPID(Label_OTGender.Text);
pk5.EncounterType = WinFormsUtil.GetIndex(CB_EncounterType);
pk5.Version = WinFormsUtil.GetIndex(CB_GameOrigin);
pk5.Language = WinFormsUtil.GetIndex(CB_Language);

View file

@ -172,7 +172,7 @@ namespace PKHeX.WinForms.Controls
pk6.PID = Util.GetHexValue(TB_PID.Text);
pk6.Nature = (byte)WinFormsUtil.GetIndex(CB_Nature);
pk6.FatefulEncounter = CHK_Fateful.Checked;
pk6.Gender = PKX.GetGender(Label_Gender.Text);
pk6.Gender = PKX.GetGenderFromPID(Label_Gender.Text);
pk6.AltForm = (MT_Form.Enabled ? Convert.ToInt32(MT_Form.Text) : CB_Form.Enabled ? CB_Form.SelectedIndex : 0) & 0x1F;
pk6.EV_HP = Util.ToInt32(TB_HPEV.Text); // EVs
pk6.EV_ATK = Util.ToInt32(TB_ATKEV.Text);
@ -234,7 +234,7 @@ namespace PKHeX.WinForms.Controls
pk6.HT_Name = TB_OTt2.Text;
// 0x90-0xAF
pk6.HT_Gender = PKX.GetGender(Label_CTGender.Text) & 1;
pk6.HT_Gender = PKX.GetGenderFromPID(Label_CTGender.Text) & 1;
// Plus more, set by MemoryAmie (already in buff)
// Block D
@ -262,7 +262,7 @@ namespace PKHeX.WinForms.Controls
pk6.Ball = WinFormsUtil.GetIndex(CB_Ball);
pk6.Met_Level = Util.ToInt32(TB_MetLevel.Text);
pk6.OT_Gender = PKX.GetGender(Label_OTGender.Text);
pk6.OT_Gender = PKX.GetGenderFromPID(Label_OTGender.Text);
pk6.EncounterType = WinFormsUtil.GetIndex(CB_EncounterType);
pk6.Version = WinFormsUtil.GetIndex(CB_GameOrigin);
pk6.Country = WinFormsUtil.GetIndex(CB_Country);

View file

@ -171,7 +171,7 @@ namespace PKHeX.WinForms.Controls
pk7.PID = Util.GetHexValue(TB_PID.Text);
pk7.Nature = (byte)WinFormsUtil.GetIndex(CB_Nature);
pk7.FatefulEncounter = CHK_Fateful.Checked;
pk7.Gender = PKX.GetGender(Label_Gender.Text);
pk7.Gender = PKX.GetGenderFromPID(Label_Gender.Text);
pk7.AltForm = (MT_Form.Enabled ? Convert.ToInt32(MT_Form.Text) : CB_Form.Enabled ? CB_Form.SelectedIndex : 0) & 0x1F;
pk7.EV_HP = Util.ToInt32(TB_HPEV.Text); // EVs
pk7.EV_ATK = Util.ToInt32(TB_ATKEV.Text);
@ -233,7 +233,7 @@ namespace PKHeX.WinForms.Controls
pk7.HT_Name = TB_OTt2.Text;
// 0x90-0xAF
pk7.HT_Gender = PKX.GetGender(Label_CTGender.Text) & 1;
pk7.HT_Gender = PKX.GetGenderFromPID(Label_CTGender.Text) & 1;
// Plus more, set by MemoryAmie (already in buff)
// Block D
@ -261,7 +261,7 @@ namespace PKHeX.WinForms.Controls
pk7.Ball = WinFormsUtil.GetIndex(CB_Ball);
pk7.Met_Level = Util.ToInt32(TB_MetLevel.Text);
pk7.OT_Gender = PKX.GetGender(Label_OTGender.Text);
pk7.OT_Gender = PKX.GetGenderFromPID(Label_OTGender.Text);
pk7.EncounterType = WinFormsUtil.GetIndex(CB_EncounterType);
pk7.Version = WinFormsUtil.GetIndex(CB_GameOrigin);
pk7.Country = WinFormsUtil.GetIndex(CB_Country);

View file

@ -137,7 +137,7 @@ namespace PKHeX.WinForms.Controls
xk3.AbilityNumber = 1 << CB_Ability.SelectedIndex; // to match gen6+
xk3.FatefulEncounter = CHK_Fateful.Checked;
xk3.Gender = PKX.GetGender(Label_Gender.Text);
xk3.Gender = PKX.GetGenderFromPID(Label_Gender.Text);
xk3.EV_HP = Util.ToInt32(TB_HPEV.Text);
xk3.EV_ATK = Util.ToInt32(TB_ATKEV.Text);
xk3.EV_DEF = Util.ToInt32(TB_DEFEV.Text);
@ -182,7 +182,7 @@ namespace PKHeX.WinForms.Controls
xk3.Ball = WinFormsUtil.GetIndex(CB_Ball);
xk3.Met_Level = Util.ToInt32(TB_MetLevel.Text);
xk3.OT_Gender = PKX.GetGender(Label_OTGender.Text);
xk3.OT_Gender = PKX.GetGenderFromPID(Label_OTGender.Text);
xk3.Version = WinFormsUtil.GetIndex(CB_GameOrigin);
xk3.Language = WinFormsUtil.GetIndex(CB_Language);

View file

@ -284,12 +284,12 @@ namespace PKHeX.WinForms.Controls
TB_Nickname.Font = TB_OT.Font = TB_OTt2.Font = FontUtil.GetPKXFont(11);
}
// Switch active gender labels to new if they are active.
if (PKX.GetGender(Label_Gender.Text) < 2)
Label_Gender.Text = gendersymbols[PKX.GetGender(Label_Gender.Text)];
if (PKX.GetGender(Label_OTGender.Text) < 2)
Label_OTGender.Text = gendersymbols[PKX.GetGender(Label_OTGender.Text)];
if (PKX.GetGender(Label_CTGender.Text) < 2)
Label_CTGender.Text = gendersymbols[PKX.GetGender(Label_CTGender.Text)];
if (PKX.GetGenderFromPID(Label_Gender.Text) < 2)
Label_Gender.Text = gendersymbols[PKX.GetGenderFromPID(Label_Gender.Text)];
if (PKX.GetGenderFromPID(Label_OTGender.Text) < 2)
Label_OTGender.Text = gendersymbols[PKX.GetGenderFromPID(Label_OTGender.Text)];
if (PKX.GetGenderFromPID(Label_CTGender.Text) < 2)
Label_CTGender.Text = gendersymbols[PKX.GetGenderFromPID(Label_CTGender.Text)];
}
private void UpdateSprite()
{
@ -446,7 +446,7 @@ namespace PKHeX.WinForms.Controls
private void UpdateGender()
{
int cg = PKX.GetGender(Label_Gender.Text);
int cg = PKX.GetGenderFromPID(Label_Gender.Text);
int gt = pkm.PersonalInfo.Gender;
int Gender;
@ -531,11 +531,11 @@ namespace PKHeX.WinForms.Controls
if (gt >= 255) return;
// If not a single gender(less) species: (should be <254 but whatever, 255 never happens)
int newGender = PKX.GetGender(Label_Gender.Text) ^ 1;
int newGender = PKX.GetGenderFromPID(Label_Gender.Text) ^ 1;
if (pkm.Format <= 2)
{
do { TB_ATKIV.Text = (pkm.IV_ATK = (int)(Util.Rand32() & pkm.MaxIV)).ToString(); }
while (PKX.GetGender(Label_Gender.Text = gendersymbols[pkm.Gender]) != newGender);
while (PKX.GetGenderFromPID(Label_Gender.Text = gendersymbols[pkm.Gender]) != newGender);
SetIsShiny(null);
}
else if (pkm.Format <= 4)
@ -553,8 +553,8 @@ namespace PKHeX.WinForms.Controls
Label_Gender.Text = gendersymbols[pkm.Gender];
Label_Gender.ForeColor = GetGenderColor(pkm.Gender);
if (PKX.GetGender(CB_Form.Text) < 2) // Gendered Forms
CB_Form.SelectedIndex = PKX.GetGender(Label_Gender.Text);
if (PKX.GetGenderFromPID(CB_Form.Text) < 2) // Gendered Forms
CB_Form.SelectedIndex = PKX.GetGenderFromPID(Label_Gender.Text);
UpdatePreviewSprite(Label_Gender, null);
}
@ -644,7 +644,7 @@ namespace PKHeX.WinForms.Controls
Label lbl = sender as Label;
if (!string.IsNullOrWhiteSpace(lbl?.Text)) // set gender label (toggle M/F)
{
int gender = PKX.GetGender(lbl.Text) ^ 1;
int gender = PKX.GetGenderFromPID(lbl.Text) ^ 1;
lbl.Text = gendersymbols[gender];
lbl.ForeColor = GetGenderColor(gender);
}
@ -1133,10 +1133,10 @@ namespace PKHeX.WinForms.Controls
UpdateRandomIVs(null, null);
}
}
else if (PKX.GetGender(CB_Form.Text) < 2)
else if (PKX.GetGenderFromPID(CB_Form.Text) < 2)
{
if (CB_Form.Items.Count == 2) // actually M/F; Pumpkaboo formes in German are S,M,L,XL
Label_Gender.Text = gendersymbols[PKX.GetGender(CB_Form.Text)];
Label_Gender.Text = gendersymbols[PKX.GetGenderFromPID(CB_Form.Text)];
}
if (changingFields)
@ -1576,7 +1576,7 @@ namespace PKHeX.WinForms.Controls
pkm.SID = Util.ToInt32(TB_SID.Text);
pkm.PID = Util.GetHexValue(TB_PID.Text);
pkm.Nature = WinFormsUtil.GetIndex(CB_Nature);
pkm.Gender = PKX.GetGender(Label_Gender.Text);
pkm.Gender = PKX.GetGenderFromPID(Label_Gender.Text);
pkm.AltForm = CB_Form.SelectedIndex;
pkm.Version = WinFormsUtil.GetIndex(CB_GameOrigin);
@ -1984,7 +1984,7 @@ namespace PKHeX.WinForms.Controls
TB_Nickname.Text = Set.Nickname;
if (Set.Gender != null)
{
int Gender = PKX.GetGender(Set.Gender);
int Gender = PKX.GetGenderFromPID(Set.Gender);
Label_Gender.Text = gendersymbols[Gender];
Label_Gender.ForeColor = GetGenderColor(Gender);
}

View file

@ -236,18 +236,18 @@ namespace PKHeX.WinForms.Controls
// Refresh slots
if (SAV.HasParty)
{
PKM[] party = SAV.PartyData;
for (int i = 0; i < party.Length; i++)
var party = SAV.PartyData;
for (int i = 0; i < party.Count; i++)
SlotPictureBoxes[i + 30].Image = GetSprite(party[i], i + 30);
for (int i = party.Length; i < 6; i++)
for (int i = party.Count; i < 6; i++)
SlotPictureBoxes[i + 30].Image = null;
}
if (SAV.HasBattleBox)
{
PKM[] battle = SAV.BattleBoxData;
for (int i = 0; i < battle.Length; i++)
var battle = SAV.BattleBoxData;
for (int i = 0; i < battle.Count; i++)
SlotPictureBoxes[i + 36].Image = GetSprite(battle[i], i + 36);
for (int i = battle.Length; i < 6; i++)
for (int i = battle.Count; i < 6; i++)
SlotPictureBoxes[i + 36].Image = null;
}
}

View file

@ -236,7 +236,7 @@ namespace PKHeX.WinForms.Controls
byte[] data = File.ReadAllBytes(file);
MysteryGift mg = MysteryGift.GetMysteryGift(data, fi.Extension);
PKM temp = mg?.ConvertToPKM(SAV) ?? PKMConverter.GetPKMfromBytes(data,
prefer: fi.Extension.Length > 0 ? (fi.Extension.Last() - 0x30) & 7 : SAV.Generation);
prefer: fi.Extension.Length > 0 ? (fi.Extension.Last() - '0') & 0xF : SAV.Generation);
PKM pk = PKMConverter.ConvertToType(temp, SAV.PKMType, out string c);
if (pk == null)

View file

@ -435,7 +435,7 @@ namespace PKHeX.WinForms
}
private void ClickShowdownExportParty(object sender, EventArgs e)
{
if (C_SAV.SAV.PartyData.Length <= 0) return;
if (C_SAV.SAV.PartyData.Count <= 0) return;
try
{
Clipboard.SetText(
@ -447,7 +447,7 @@ namespace PKHeX.WinForms
}
private void ClickShowdownExportBattleBox(object sender, EventArgs e)
{
if (C_SAV.SAV.BattleBoxData.Length <= 0) return;
if (C_SAV.SAV.BattleBoxData.Count <= 0) return;
try
{
Clipboard.SetText(
@ -575,7 +575,7 @@ namespace PKHeX.WinForms
}
private bool TryLoadPKM(byte[] input, string path, string ext, SaveFile SAV)
{
var temp = PKMConverter.GetPKMfromBytes(input, prefer: ext.Length > 0 ? (ext.Last() - 0x30) & 7 : C_SAV.SAV.Generation);
var temp = PKMConverter.GetPKMfromBytes(input, prefer: ext.Length > 0 ? (ext.Last() - '0') & 0xF : C_SAV.SAV.Generation);
if (temp == null)
return false;

View file

@ -216,16 +216,16 @@ namespace PKHeX.WinForms
}
private void RunBatchEditSaveFile(StringInstruction[] Filters, StringInstruction[] Instructions)
{
PKM[] data;
IList<PKM> data;
if (SAV.HasParty && process(data = SAV.PartyData))
SAV.PartyData = data;
if (SAV.HasBox && process(data = SAV.BoxData))
SAV.BoxData = data;
bool process(PKM[] d)
bool process(IList<PKM> d)
{
SetupProgressBar(d.Length);
SetupProgressBar(d.Count);
ProcessSAV(d, Filters, Instructions);
return d.Length != 0;
return d.Count != 0;
}
}
@ -247,17 +247,17 @@ namespace PKHeX.WinForms
// Mass Editing
private int ctr, len, err;
private void ProcessSAV(PKM[] data, StringInstruction[] Filters, StringInstruction[] Instructions)
private void ProcessSAV(IList<PKM> data, StringInstruction[] Filters, StringInstruction[] Instructions)
{
for (int i = 0; i < data.Length; i++)
for (int i = 0; i < data.Count; i++)
{
ProcessPKM(data[i], Filters, Instructions);
b.ReportProgress(i);
}
}
private void ProcessFolder(string[] files, StringInstruction[] Filters, StringInstruction[] Instructions, string destPath)
private void ProcessFolder(IReadOnlyList<string> files, StringInstruction[] Filters, StringInstruction[] Instructions, string destPath)
{
for (int i = 0; i < files.Length; i++)
for (int i = 0; i < files.Count; i++)
{
string file = files[i];
var fi = new FileInfo(file);
@ -267,7 +267,7 @@ namespace PKHeX.WinForms
continue;
}
int format = fi.Extension.Length > 0 ? (fi.Extension.Last() - 0x30) & 7 : SAV.Generation;
int format = fi.Extension.Length > 0 ? (fi.Extension.Last() - '0') & 0xF : SAV.Generation;
byte[] data = File.ReadAllBytes(file);
var pkm = PKMConverter.GetPKMfromBytes(data, prefer: format);
if (ProcessPKM(pkm, Filters, Instructions))

View file

@ -160,7 +160,7 @@ namespace PKHeX.WinForms
dgData.ContextMenuStrip = mnu;
}
public void PopulateData(PKM[] Data)
public void PopulateData(IList<PKM> Data)
{
SuspendLayout();
BoxBar.Step = 1;
@ -174,7 +174,7 @@ namespace PKHeX.WinForms
dgData.DataSource = PL;
dgData.AutoGenerateColumns = true;
BoxBar.Maximum = Data.Length + dgData.Columns.Count;
BoxBar.Maximum = Data.Count + dgData.Columns.Count;
for (int i = 0; i < dgData.Columns.Count; i++)
{
BoxBar.PerformStep();

View file

@ -334,7 +334,7 @@ namespace PKHeX.WinForms
{
FileInfo fi = new FileInfo(file);
if (!fi.Extension.Contains(".pk") || !PKX.IsPKM(fi.Length)) return;
var pk = PKMConverter.GetPKMfromBytes(File.ReadAllBytes(file), file, prefer: (fi.Extension.Last() - 0x30) & 7);
var pk = PKMConverter.GetPKMfromBytes(File.ReadAllBytes(file), file, prefer: (fi.Extension.Last() - '0') & 0xF);
if (pk != null)
dbTemp.Add(pk);
});

View file

@ -258,7 +258,7 @@ namespace PKHeX.WinForms
uint rawslgf = BitConverter.ToUInt32(data, offset + 0x14);
uint slgf = 0;
slgf |= (uint)(CB_Form.SelectedIndex & 0x1F);
slgf |= (uint)((PKX.GetGender(Label_Gender.Text) & 0x3) << 5);
slgf |= (uint)((PKX.GetGenderFromPID(Label_Gender.Text) & 0x3) << 5);
slgf |= (uint)((Convert.ToUInt16(TB_Level.Text) & 0x7F) << 7);
if (CHK_Shiny.Checked)
slgf |= 1 << 14;
@ -291,7 +291,7 @@ namespace PKHeX.WinForms
vnd |= rawvnd & 0x80000000;
Array.Copy(BitConverter.GetBytes(vnd), 0, data, offset + 0x1B0, 4);
bpkx.Image = PKMUtil.GetSprite(WinFormsUtil.GetIndex(CB_Species), CB_Form.SelectedIndex & 0x1F, PKX.GetGender(Label_Gender.Text), WinFormsUtil.GetIndex(CB_HeldItem), false, CHK_Shiny.Checked);
bpkx.Image = PKMUtil.GetSprite(WinFormsUtil.GetIndex(CB_Species), CB_Form.SelectedIndex & 0x1F, PKX.GetGenderFromPID(Label_Gender.Text), WinFormsUtil.GetIndex(CB_HeldItem), false, CHK_Shiny.Checked);
DisplayEntry(null, null); // refresh text view
}
private void Validate_TextBoxes()
@ -340,7 +340,7 @@ namespace PKHeX.WinForms
{
if (!editing)
return; //Don't do writing until loaded
bpkx.Image = PKMUtil.GetSprite(WinFormsUtil.GetIndex(CB_Species), CB_Form.SelectedIndex & 0x1F, PKX.GetGender(Label_Gender.Text), WinFormsUtil.GetIndex(CB_HeldItem), false, CHK_Shiny.Checked);
bpkx.Image = PKMUtil.GetSprite(WinFormsUtil.GetIndex(CB_Species), CB_Form.SelectedIndex & 0x1F, PKX.GetGenderFromPID(Label_Gender.Text), WinFormsUtil.GetIndex(CB_HeldItem), false, CHK_Shiny.Checked);
Write_Entry(null, null);
}
@ -362,16 +362,16 @@ namespace PKHeX.WinForms
if (gt < 256) // If not a single gender(less) species:
{
Label_Gender.Text = PKX.GetGender(Label_Gender.Text) == 0 ? gendersymbols[1] : gendersymbols[0];
Label_Gender.Text = PKX.GetGenderFromPID(Label_Gender.Text) == 0 ? gendersymbols[1] : gendersymbols[0];
if (PKX.GetGender(CB_Form.Text) == 0 && Label_Gender.Text != gendersymbols[0])
if (PKX.GetGenderFromPID(CB_Form.Text) == 0 && Label_Gender.Text != gendersymbols[0])
CB_Form.SelectedIndex = 1;
else if (PKX.GetGender(CB_Form.Text) == 1 && Label_Gender.Text != gendersymbols[1])
else if (PKX.GetGenderFromPID(CB_Form.Text) == 1 && Label_Gender.Text != gendersymbols[1])
CB_Form.SelectedIndex = 0;
}
if (species == 668)
CB_Form.SelectedIndex = PKX.GetGender(Label_Gender.Text);
CB_Form.SelectedIndex = PKX.GetGenderFromPID(Label_Gender.Text);
Write_Entry(null, null);
}

View file

@ -275,7 +275,7 @@ namespace PKHeX.WinForms
pkm[0x14] = (byte)WinFormsUtil.GetIndex(CB_Nature);
int fegform = 0;
fegform += PKX.GetGender(Label_Gender.Text) << 1;
fegform += PKX.GetGenderFromPID(Label_Gender.Text) << 1;
fegform += CB_Form.SelectedIndex << 3;
pkm[0x15] = (byte)fegform;
@ -463,7 +463,7 @@ namespace PKHeX.WinForms
SetAbilityList();
// If form has a single gender, account for it.
if (PKX.GetGender(CB_Form.Text) < 2)
if (PKX.GetGenderFromPID(CB_Form.Text) < 2)
Label_Gender.Text = Main.GenderSymbols[CB_Form.SelectedIndex];
}
@ -477,7 +477,7 @@ namespace PKHeX.WinForms
return;
if (gt < 256) // If not a single gender(less) species:
Label_Gender.Text = Main.GenderSymbols[PKX.GetGender(Label_Gender.Text) ^ 1];
Label_Gender.Text = Main.GenderSymbols[PKX.GetGenderFromPID(Label_Gender.Text) ^ 1];
}
private void SetGenderLabel()
{

View file

@ -22,7 +22,7 @@ namespace PKHeX.WinForms
/// <returns></returns>
public static bool DumpBoxes(this SaveFile SAV, string path, out string result, bool boxFolders = false)
{
PKM[] boxdata = SAV.BoxData;
var boxdata = SAV.BoxData;
if (boxdata == null)
{ result = "Invalid Box Data, unable to dump."; return false; }
@ -58,7 +58,7 @@ namespace PKHeX.WinForms
/// <returns></returns>
public static bool DumpBox(this SaveFile SAV, string path, out string result, int currentBox)
{
PKM[] boxdata = SAV.BoxData;
var boxdata = SAV.BoxData;
if (boxdata == null)
{ result = "Invalid Box Data, unable to dump."; return false; }