Unify concepts with different names

AltForm & Form & Forme => Form
GenNumber & Generation => Generation

Extract out SpeciesForm interface, and re-add IGeneration

For those using PKHeX as a dependency, this should be a pretty straightforward manual replacement... GenNumber and AltForm should be quick find-replace`s.
This commit is contained in:
Kurt 2020-12-10 20:42:30 -08:00
parent 7c4c1e0913
commit 62018cce1a
152 changed files with 575 additions and 578 deletions

View file

@ -88,7 +88,7 @@ namespace PKHeX.Core
private static IEnumerable<Ball> GetBallListFromColor(PKM pkm) private static IEnumerable<Ball> GetBallListFromColor(PKM pkm)
{ {
// Gen1/2 don't store color in personal info // Gen1/2 don't store color in personal info
var pi = pkm.Format >= 3 ? pkm.PersonalInfo : PersonalTable.USUM.GetFormeEntry(pkm.Species, 0); var pi = pkm.Format >= 3 ? pkm.PersonalInfo : PersonalTable.USUM.GetFormEntry(pkm.Species, 0);
var color = (PersonalColor)pi.Color; var color = (PersonalColor)pi.Color;
var balls = BallColors[color]; var balls = BallColors[color];
var currentBall = (Ball)pkm.Ball; var currentBall = (Ball)pkm.Ball;

View file

@ -49,23 +49,23 @@ namespace PKHeX.Core
} }
/// <summary> /// <summary>
/// Sets the <see cref="PKM.AltForm"/> value, with special consideration for <see cref="PKM.Format"/> values which derive the <see cref="PKM.AltForm"/> value. /// Sets the <see cref="PKM.Form"/> value, with special consideration for <see cref="PKM.Format"/> values which derive the <see cref="PKM.Form"/> value.
/// </summary> /// </summary>
/// <param name="pk">Pokémon to modify.</param> /// <param name="pk">Pokémon to modify.</param>
/// <param name="form">Desired <see cref="PKM.AltForm"/> value to set.</param> /// <param name="form">Desired <see cref="PKM.Form"/> value to set.</param>
public static void SetAltForm(this PKM pk, int form) public static void SetForm(this PKM pk, int form)
{ {
switch (pk.Format) switch (pk.Format)
{ {
case 2: case 2:
while (pk.AltForm != form) while (pk.Form != form)
pk.SetRandomIVs(); pk.SetRandomIVs();
break; break;
case 3: case 3:
pk.SetPIDUnown3(form); pk.SetPIDUnown3(form);
break; break;
default: default:
pk.AltForm = form; pk.Form = form;
break; break;
} }
} }
@ -94,7 +94,7 @@ namespace PKHeX.Core
if (pk is PK5 pk5 && index == 2) if (pk is PK5 pk5 && index == 2)
pk5.HiddenAbility = true; pk5.HiddenAbility = true;
else if (pk.Format <= 5) else if (pk.Format <= 5)
pk.PID = PKX.GetRandomPID(Util.Rand, pk.Species, pk.Gender, pk.Version, pk.Nature, pk.AltForm, (uint)(index * 0x10001)); pk.PID = PKX.GetRandomPID(Util.Rand, pk.Species, pk.Gender, pk.Version, pk.Nature, pk.Form, (uint)(index * 0x10001));
pk.RefreshAbility(index); pk.RefreshAbility(index);
} }
@ -105,7 +105,7 @@ namespace PKHeX.Core
/// <param name="pk">Pokémon to modify.</param> /// <param name="pk">Pokémon to modify.</param>
public static void SetRandomEC(this PKM pk) public static void SetRandomEC(this PKM pk)
{ {
int gen = pk.GenNumber; int gen = pk.Generation;
if (2 < gen && gen < 6) if (2 < gen && gen < 6)
{ {
pk.EncryptionConstant = pk.PID; pk.EncryptionConstant = pk.PID;
@ -224,7 +224,7 @@ namespace PKHeX.Core
pk.SetMarkings(); pk.SetMarkings();
pk.SetNickname(Set.Nickname); pk.SetNickname(Set.Nickname);
pk.SetAltForm(Set.FormIndex); pk.SetForm(Set.Form);
pk.SetGender(Set.Gender); pk.SetGender(Set.Gender);
pk.SetMaximumPPUps(Set.Moves); pk.SetMaximumPPUps(Set.Moves);
pk.SetAbility(Set.Ability); pk.SetAbility(Set.Ability);
@ -377,7 +377,7 @@ namespace PKHeX.Core
{ {
bool traded = origin == dest; bool traded = origin == dest;
var today = pk.MetDate = DateTime.Today; var today = pk.MetDate = DateTime.Today;
pk.Egg_Location = EncounterSuggestion.GetSuggestedEncounterEggLocationEgg(pk.GenNumber, traded); pk.Egg_Location = EncounterSuggestion.GetSuggestedEncounterEggLocationEgg(pk.Generation, traded);
pk.EggMetDate = today; pk.EggMetDate = today;
} }
@ -455,7 +455,7 @@ namespace PKHeX.Core
return string.Empty; return string.Empty;
int location = eggmet ? pk.Egg_Location : pk.Met_Location; int location = eggmet ? pk.Egg_Location : pk.Met_Location;
return GameInfo.GetLocationName(eggmet, location, pk.Format, pk.GenNumber, (GameVersion)pk.Version); return GameInfo.GetLocationName(eggmet, location, pk.Format, pk.Generation, (GameVersion)pk.Version);
} }
} }
} }

View file

@ -1,12 +1,7 @@
namespace PKHeX.Core namespace PKHeX.Core
{ {
public interface IBattleTemplate : IGigantamax public interface IBattleTemplate : ISpeciesForm, IGigantamax, INature
{ {
/// <summary>
/// <see cref="PKM.Species"/> of the Set entity.
/// </summary>
int Species { get; }
/// <summary> /// <summary>
/// <see cref="PKM.Format"/> of the Set entity it is specific to. /// <see cref="PKM.Format"/> of the Set entity it is specific to.
/// </summary> /// </summary>
@ -48,19 +43,9 @@
int Friendship { get; } int Friendship { get; }
/// <summary> /// <summary>
/// <see cref="PKM.StatNature"/> of the Set entity. /// <see cref="PKM.Form"/> name of the Set entity, stored in PKHeX style (instead of Showdown's)
/// </summary> /// </summary>
int Nature { get; } string FormName { get; }
/// <summary>
/// <see cref="PKM.AltForm"/> name of the Set entity, stored in PKHeX style (instead of Showdown's)
/// </summary>
string Form { get; }
/// <summary>
/// <see cref="PKM.AltForm"/> of the Set entity.
/// </summary>
int FormIndex { get; }
/// <summary> /// <summary>
/// <see cref="PKM.HPType"/> of the Set entity. /// <see cref="PKM.HPType"/> of the Set entity.

View file

@ -69,7 +69,7 @@ namespace PKHeX.Core
public int AbilityNum => pkm.Format > 5 ? pkm.AbilityNumber : -1; public int AbilityNum => pkm.Format > 5 ? pkm.AbilityNumber : -1;
public int GenderFlag => pkm.Gender; public int GenderFlag => pkm.Gender;
public int AltForms => pkm.AltForm; public int Form => pkm.Form;
public int PKRS_Strain => pkm.PKRS_Strain; public int PKRS_Strain => pkm.PKRS_Strain;
public int PKRS_Days => pkm.PKRS_Days; public int PKRS_Days => pkm.PKRS_Days;
public int MetLevel => pkm.Met_Level; public int MetLevel => pkm.Met_Level;

View file

@ -41,7 +41,7 @@ namespace PKHeX.Core
new BoxManipSort(BoxManipType.SortTraining, list => list.OrderByCustom(pk => (pk.MaxEV * 6) - pk.EVTotal)), new BoxManipSort(BoxManipType.SortTraining, list => list.OrderByCustom(pk => (pk.MaxEV * 6) - pk.EVTotal)),
new BoxManipSortComplex(BoxManipType.SortOwner, (list, sav) => list.OrderByOwnership(sav)), new BoxManipSortComplex(BoxManipType.SortOwner, (list, sav) => list.OrderByOwnership(sav)),
new BoxManipSort(BoxManipType.SortType, list => list.OrderByCustom(pk => pk.PersonalInfo.Type1, pk => pk.PersonalInfo.Type2)), new BoxManipSort(BoxManipType.SortType, list => list.OrderByCustom(pk => pk.PersonalInfo.Type1, pk => pk.PersonalInfo.Type2)),
new BoxManipSort(BoxManipType.SortVersion, list => list.OrderByCustom(pk => pk.GenNumber, pk => pk.Version, pk => pk.Met_Location), s => s.Generation >= 3), new BoxManipSort(BoxManipType.SortVersion, list => list.OrderByCustom(pk => pk.Generation, pk => pk.Version, pk => pk.Met_Location), s => s.Generation >= 3),
new BoxManipSort(BoxManipType.SortBST, list => list.OrderByCustom(pk => pk.PersonalInfo.BST)), new BoxManipSort(BoxManipType.SortBST, list => list.OrderByCustom(pk => pk.PersonalInfo.BST)),
new BoxManipSort(BoxManipType.SortCP, list => list.OrderByCustom(pk => pk is PB7 pb7 ? pb7.Stat_CP : 0), s => s is SAV7b), new BoxManipSort(BoxManipType.SortCP, list => list.OrderByCustom(pk => pk is PB7 pb7 ? pb7.Stat_CP : 0), s => s is SAV7b),
new BoxManipSort(BoxManipType.SortLegal, list => list.OrderByCustom(pk => !new LegalityAnalysis(pk).Valid)), new BoxManipSort(BoxManipType.SortLegal, list => list.OrderByCustom(pk => !new LegalityAnalysis(pk).Valid)),
@ -52,7 +52,7 @@ namespace PKHeX.Core
{ {
new BoxManipClear(BoxManipType.DeleteAll, _ => true), new BoxManipClear(BoxManipType.DeleteAll, _ => true),
new BoxManipClear(BoxManipType.DeleteEggs, pk => pk.IsEgg, s => s.Generation >= 2), new BoxManipClear(BoxManipType.DeleteEggs, pk => pk.IsEgg, s => s.Generation >= 2),
new BoxManipClearComplex(BoxManipType.DeletePastGen, (pk, sav) => pk.GenNumber != sav.Generation, s => s.Generation >= 4), new BoxManipClearComplex(BoxManipType.DeletePastGen, (pk, sav) => pk.Generation != sav.Generation, s => s.Generation >= 4),
new BoxManipClearComplex(BoxManipType.DeleteForeign, (pk, sav) => !sav.IsOriginalHandler(pk, pk.Format > 2)), new BoxManipClearComplex(BoxManipType.DeleteForeign, (pk, sav) => !sav.IsOriginalHandler(pk, pk.Format > 2)),
new BoxManipClear(BoxManipType.DeleteUntrained, pk => pk.EVTotal == 0), new BoxManipClear(BoxManipType.DeleteUntrained, pk => pk.EVTotal == 0),
new BoxManipClear(BoxManipType.DeleteItemless, pk => pk.HeldItem == 0), new BoxManipClear(BoxManipType.DeleteItemless, pk => pk.HeldItem == 0),

View file

@ -52,10 +52,10 @@ namespace PKHeX.Core
public int Nature { get; set; } = -1; public int Nature { get; set; } = -1;
/// <inheritdoc/> /// <inheritdoc/>
public string Form { get; private set; } = string.Empty; public string FormName { get; private set; } = string.Empty;
/// <inheritdoc/> /// <inheritdoc/>
public int FormIndex { get; private set; } public int Form { get; private set; }
/// <inheritdoc/> /// <inheritdoc/>
public int[] EVs { get; private set; } = {00, 00, 00, 00, 00, 00}; public int[] EVs { get; private set; } = {00, 00, 00, 00, 00, 00};
@ -103,15 +103,15 @@ namespace PKHeX.Core
ParseLines(lines); ParseLines(lines);
Form = ConvertFormFromShowdown(Form, Species, Ability); FormName = ConvertFormFromShowdown(FormName, Species, Ability);
// Set Form // Set Form
if (Form.Length == 0) if (FormName.Length == 0)
{ {
FormIndex = 0; Form = 0;
return; return;
} }
string[] formStrings = FormConverter.GetFormList(Species, Strings.Types, Strings.forms, genderForms, Format); string[] formStrings = FormConverter.GetFormList(Species, Strings.Types, Strings.forms, genderForms, Format);
FormIndex = Math.Max(0, Array.FindIndex(formStrings, z => z.Contains(Form))); Form = Math.Max(0, Array.FindIndex(formStrings, z => z.Contains(FormName)));
} }
private const int MaxMoveCount = 4; private const int MaxMoveCount = 4;
@ -233,7 +233,7 @@ namespace PKHeX.Core
var result = new List<string>(); var result = new List<string>();
// First Line: Name, Nickname, Gender, Item // First Line: Name, Nickname, Gender, Item
var form = ConvertFormToShowdown(Form, Species); var form = ConvertFormToShowdown(FormName, Species);
result.Add(GetStringFirstLine(form)); result.Add(GetStringFirstLine(form));
// IVs // IVs
@ -372,19 +372,19 @@ namespace PKHeX.Core
} }
} }
SetFormString(pkm.AltForm); SetFormString(pkm.Form);
} }
private void SetFormString(int index) private void SetFormString(int index)
{ {
FormIndex = index; Form = index;
if (index <= 0) if (index <= 0)
{ {
Form = string.Empty; FormName = string.Empty;
return; return;
} }
var forms = FormConverter.GetFormList(Species, Strings.Types, Strings.forms, genderForms, Format); var forms = FormConverter.GetFormList(Species, Strings.Types, Strings.forms, genderForms, Format);
Form = FormIndex >= forms.Length ? string.Empty : forms[index]; FormName = Form >= forms.Length ? string.Empty : forms[index];
} }
private void ParseFirstLine(string first) private void ParseFirstLine(string first)
@ -464,7 +464,7 @@ namespace PKHeX.Core
return false; return false;
Species = StringUtil.FindIndexIgnoreCase(Strings.specieslist, spec.Substring(0, end)); Species = StringUtil.FindIndexIgnoreCase(Strings.specieslist, spec.Substring(0, end));
Form = spec.Substring(end + 1); FormName = spec.Substring(end + 1);
if (Species >= 0) if (Species >= 0)
return true; return true;
@ -476,7 +476,7 @@ namespace PKHeX.Core
if (!spec.StartsWith(sn.Replace("♂", "-M").Replace("♀", "-F"))) if (!spec.StartsWith(sn.Replace("♂", "-M").Replace("♀", "-F")))
continue; continue;
Species = e; Species = e;
Form = spec.Substring(sn.Length); FormName = spec.Substring(sn.Length);
return true; return true;
} }
@ -485,7 +485,7 @@ namespace PKHeX.Core
if (end < 0) if (end < 0)
return false; return false;
Species = StringUtil.FindIndexIgnoreCase(Strings.specieslist, spec.Substring(0, end)); Species = StringUtil.FindIndexIgnoreCase(Strings.specieslist, spec.Substring(0, end));
Form = spec.Substring(end + 1); FormName = spec.Substring(end + 1);
return Species >= 0; return Species >= 0;
} }

View file

@ -60,7 +60,7 @@ namespace PKHeX.Core
/// <param name="isEggLocation">Location is from the <see cref="PKM.Egg_Location"/></param> /// <param name="isEggLocation">Location is from the <see cref="PKM.Egg_Location"/></param>
/// <param name="location">Location value</param> /// <param name="location">Location value</param>
/// <param name="format">Current <see cref="PKM.Format"/></param> /// <param name="format">Current <see cref="PKM.Format"/></param>
/// <param name="generation"><see cref="PKM.GenNumber"/> of origin</param> /// <param name="generation"><see cref="PKM.Generation"/> of origin</param>
/// <param name="version">Current GameVersion (only applicable for <see cref="GameVersion.Gen7b"/> differentiation)</param> /// <param name="version">Current GameVersion (only applicable for <see cref="GameVersion.Gen7b"/> differentiation)</param>
/// <returns>Location name</returns> /// <returns>Location name</returns>
public static string GetLocationName(bool isEggLocation, int location, int format, int generation, GameVersion version) public static string GetLocationName(bool isEggLocation, int location, int format, int generation, GameVersion version)

View file

@ -437,7 +437,7 @@ namespace PKHeX.Core
/// <param name="isEggLocation">Location is from the <see cref="PKM.Egg_Location"/></param> /// <param name="isEggLocation">Location is from the <see cref="PKM.Egg_Location"/></param>
/// <param name="location">Location value</param> /// <param name="location">Location value</param>
/// <param name="format">Current <see cref="PKM.Format"/></param> /// <param name="format">Current <see cref="PKM.Format"/></param>
/// <param name="generation"><see cref="PKM.GenNumber"/> of origin</param> /// <param name="generation"><see cref="PKM.Generation"/> of origin</param>
/// <param name="version">Current GameVersion (only applicable for <see cref="GameVersion.Gen7b"/> differentiation)</param> /// <param name="version">Current GameVersion (only applicable for <see cref="GameVersion.Gen7b"/> differentiation)</param>
/// <returns>Location name</returns> /// <returns>Location name</returns>
public string GetLocationName(bool isEggLocation, int location, int format, int generation, GameVersion version) public string GetLocationName(bool isEggLocation, int location, int format, int generation, GameVersion version)

View file

@ -73,7 +73,7 @@ namespace PKHeX.Core
if (slot.Species != evo.Species) if (slot.Species != evo.Species)
continue; continue;
if (slot.Form != evo.Form && !AltFormInfo.WildChangeFormAfter.Contains(slot.Species) && slot.Species != (int)Species.Unown) if (slot.Form != evo.Form && !FormInfo.WildChangeFormAfter.Contains(slot.Species) && slot.Species != (int)Species.Unown)
break; break;
if (!slot.IsLevelWithinRange(lvl)) if (!slot.IsLevelWithinRange(lvl))
break; break;
@ -93,7 +93,7 @@ namespace PKHeX.Core
if (slot.Species != evo.Species) if (slot.Species != evo.Species)
continue; continue;
if (slot.Form != evo.Form && !AltFormInfo.WildChangeFormAfter.Contains(slot.Species) && slot.Species != (int)Species.Unown) if (slot.Form != evo.Form && !FormInfo.WildChangeFormAfter.Contains(slot.Species) && slot.Species != (int)Species.Unown)
break; break;
if (slot.LevelMin > evo.Level) if (slot.LevelMin > evo.Level)
break; break;

View file

@ -56,7 +56,7 @@ namespace PKHeX.Core
if (!slot.IsLevelWithinRange(pkm.Met_Level)) if (!slot.IsLevelWithinRange(pkm.Met_Level))
break; break;
if (slot.Form != evo.Form && !AltFormInfo.WildChangeFormAfter.Contains(slot.Species)) if (slot.Form != evo.Form && !FormInfo.WildChangeFormAfter.Contains(slot.Species))
break; break;
yield return slot; yield return slot;

View file

@ -76,7 +76,7 @@ namespace PKHeX.Core
if (!slot.IsLevelWithinRange(pkm.Met_Level)) if (!slot.IsLevelWithinRange(pkm.Met_Level))
break; break;
if (slot.Form != evo.Form && slot.Form < RandomFormVivillon && !AltFormInfo.WildChangeFormAfter.Contains(slot.Species)) if (slot.Form != evo.Form && slot.Form < RandomFormVivillon && !FormInfo.WildChangeFormAfter.Contains(slot.Species))
{ {
if (slot.Species != (int)Species.Flabébé) if (slot.Species != (int)Species.Flabébé)
break; break;

View file

@ -56,7 +56,7 @@ namespace PKHeX.Core
if (!slot.IsLevelWithinRange(pkm.Met_Level)) if (!slot.IsLevelWithinRange(pkm.Met_Level))
break; break;
if (slot.Form != evo.Form && !AltFormInfo.WildChangeFormAfter.Contains(slot.Species)) if (slot.Form != evo.Form && !FormInfo.WildChangeFormAfter.Contains(slot.Species))
{ {
if (slot.Species != (int)Species.Minior) // Random Color, edge case if (slot.Species != (int)Species.Minior) // Random Color, edge case
break; break;

View file

@ -4,11 +4,11 @@ using System.Linq;
namespace PKHeX.Core namespace PKHeX.Core
{ {
/// <inheritdoc /> /// <inheritdoc cref="EncounterArea" />
/// <summary> /// <summary>
/// <see cref="GameVersion.GO"/> encounter area for <see cref="GameVersion.GG"/> /// <see cref="GameVersion.GO"/> encounter area for <see cref="GameVersion.GG"/>
/// </summary> /// </summary>
public sealed class EncounterArea7g : EncounterArea public sealed class EncounterArea7g : EncounterArea, ISpeciesForm
{ {
/// <summary> Species for the area </summary> /// <summary> Species for the area </summary>
/// <remarks> Due to how the encounter data is packaged by PKHeX, each species-form is grouped together. </remarks> /// <remarks> Due to how the encounter data is packaged by PKHeX, each species-form is grouped together. </remarks>

View file

@ -49,7 +49,7 @@ namespace PKHeX.Core
if (!slot.IsLevelWithinRange(met)) if (!slot.IsLevelWithinRange(met))
break; break;
if (slot.Form != evo.Form && !AltFormInfo.WildChangeFormAfter.Contains(evo.Species)) if (slot.Form != evo.Form && !FormInfo.WildChangeFormAfter.Contains(evo.Species))
break; break;
yield return slot; yield return slot;
@ -71,7 +71,7 @@ namespace PKHeX.Core
if (slot.LevelMin > 60) if (slot.LevelMin > 60)
break; // Can't downlevel, only boost to 60. break; // Can't downlevel, only boost to 60.
if (slot.Form != evo.Form && !AltFormInfo.WildChangeFormAfter.Contains(evo.Species)) if (slot.Form != evo.Form && !FormInfo.WildChangeFormAfter.Contains(evo.Species))
break; break;
yield return slot; yield return slot;

View file

@ -4,11 +4,11 @@ using System.Linq;
namespace PKHeX.Core namespace PKHeX.Core
{ {
/// <inheritdoc /> /// <inheritdoc cref="EncounterArea" />
/// <summary> /// <summary>
/// <see cref="GameVersion.GO"/> encounter area for direct-to-HOME transfers. /// <see cref="GameVersion.GO"/> encounter area for direct-to-HOME transfers.
/// </summary> /// </summary>
public sealed class EncounterArea8g : EncounterArea public sealed class EncounterArea8g : EncounterArea, ISpeciesForm
{ {
/// <summary> Species for the area </summary> /// <summary> Species for the area </summary>
/// <remarks> Due to how the encounter data is packaged by PKHeX, each species-form is grouped together. </remarks> /// <remarks> Due to how the encounter data is packaged by PKHeX, each species-form is grouped together. </remarks>
@ -74,12 +74,12 @@ namespace PKHeX.Core
var pi8 = (PersonalInfoSWSH)pt8[species]; var pi8 = (PersonalInfoSWSH)pt8[species];
if (pi8.IsPresentInGame) if (pi8.IsPresentInGame)
{ {
bool lgpe = (species <= 151 || species == 808 || species == 809) && (form == 0 || ptGG[species].HasForme(form)); bool lgpe = (species <= 151 || species == 808 || species == 809) && (form == 0 || ptGG[species].HasForm(form));
return lgpe ? GameVersion.GG : GameVersion.SWSH; return lgpe ? GameVersion.GG : GameVersion.SWSH;
} }
if (species <= Legal.MaxSpeciesID_7_USUM) if (species <= Legal.MaxSpeciesID_7_USUM)
{ {
bool lgpe = species <= 151 && (form == 0 || ptGG[species].HasForme(form)); bool lgpe = species <= 151 && (form == 0 || ptGG[species].HasForm(form));
return lgpe ? GameVersion.GG : GameVersion.USUM; return lgpe ? GameVersion.GG : GameVersion.USUM;
} }
@ -91,7 +91,7 @@ namespace PKHeX.Core
if (pkm.TSV == 0) // HOME doesn't assign TSV=0 to accounts. if (pkm.TSV == 0) // HOME doesn't assign TSV=0 to accounts.
yield break; yield break;
var sf = chain.FirstOrDefault(z => z.Species == Species && (z.Form == Form || AltFormInfo.IsFormChangeable(Species, Form, z.Form, pkm.Format))); var sf = chain.FirstOrDefault(z => z.Species == Species && (z.Form == Form || FormInfo.IsFormChangeable(Species, Form, z.Form, pkm.Format)));
if (sf == null) if (sf == null)
yield break; yield break;

View file

@ -31,7 +31,7 @@ namespace PKHeX.Core
pk.Gender = pk.GetSaneGender(); pk.Gender = pk.GetSaneGender();
var pi = pk.PersonalInfo; var pi = pk.PersonalInfo;
for (int f = 0; f < pi.FormeCount; f++) for (int f = 0; f < pi.FormCount; f++)
{ {
var entry = tr.GetLivingEntry(pk, s, f, destType); var entry = tr.GetLivingEntry(pk, s, f, destType);
if (entry == null) if (entry == null)
@ -46,7 +46,7 @@ namespace PKHeX.Core
public static PKM? GetLivingEntry(this ITrainerInfo tr, PKM template, int species, int form, Type destType) public static PKM? GetLivingEntry(this ITrainerInfo tr, PKM template, int species, int form, Type destType)
{ {
template.Species = species; template.Species = species;
template.AltForm = form; template.Form = form;
template.Gender = template.GetSaneGender(); template.Gender = template.GetSaneGender();
var f = EncounterMovesetGenerator.GeneratePKMs(template, tr).FirstOrDefault(); var f = EncounterMovesetGenerator.GeneratePKMs(template, tr).FirstOrDefault();
@ -59,7 +59,7 @@ namespace PKHeX.Core
result.CurrentLevel = 100; result.CurrentLevel = 100;
result.Species = species; result.Species = species;
result.AltForm = form; result.Form = form;
result.Heal(); result.Heal();
return result; return result;

View file

@ -97,7 +97,7 @@ namespace PKHeX.Core
return GetMaxSpeciesOrigin(1); return GetMaxSpeciesOrigin(1);
if (pkm.Format == 2 || pkm.VC) if (pkm.Format == 2 || pkm.VC)
return GetMaxSpeciesOrigin(2); return GetMaxSpeciesOrigin(2);
return GetMaxSpeciesOrigin(pkm.GenNumber); return GetMaxSpeciesOrigin(pkm.Generation);
} }
internal static int GetMaxSpeciesOrigin(int generation) internal static int GetMaxSpeciesOrigin(int generation)

View file

@ -64,7 +64,7 @@ namespace PKHeX.Core
if (pk is PK6 pk6) if (pk is PK6 pk6)
pk6.SetHatchMemory6(); pk6.SetHatchMemory6();
SetAltForm(pk, sav); SetForm(pk, sav);
pk.SetRandomEC(); pk.SetRandomEC();
pk.RelearnMoves = moves; pk.RelearnMoves = moves;
@ -72,18 +72,18 @@ namespace PKHeX.Core
return pk; return pk;
} }
private void SetAltForm(PKM pk, ITrainerInfo sav) private void SetForm(PKM pk, ITrainerInfo sav)
{ {
switch (Species) switch (Species)
{ {
case (int)Core.Species.Minior: case (int)Core.Species.Minior:
pk.AltForm = Util.Rand.Next(7, 14); pk.Form = Util.Rand.Next(7, 14);
break; break;
case (int)Core.Species.Scatterbug: case (int)Core.Species.Scatterbug:
case (int)Core.Species.Spewpa: case (int)Core.Species.Spewpa:
case (int)Core.Species.Vivillon: case (int)Core.Species.Vivillon:
if (sav is IRegionOrigin o) if (sav is IRegionOrigin o)
pk.AltForm = Vivillon3DS.GetPattern((byte)o.Country, (byte)o.Region); pk.Form = Vivillon3DS.GetPattern((byte)o.Country, (byte)o.Region);
// else 0 // else 0
break; break;
} }

View file

@ -25,11 +25,11 @@ namespace PKHeX.Core
public EncounterInvalid(PKM pkm) public EncounterInvalid(PKM pkm)
{ {
Species = pkm.Species; Species = pkm.Species;
Form = pkm.AltForm; Form = pkm.Form;
LevelMin = pkm.Met_Level; LevelMin = pkm.Met_Level;
LevelMax = pkm.CurrentLevel; LevelMax = pkm.CurrentLevel;
EggEncounter = pkm.WasEgg; EggEncounter = pkm.WasEgg;
Generation = pkm.GenNumber; Generation = pkm.Generation;
Version = (GameVersion)pkm.Version; Version = (GameVersion)pkm.Version;
} }

View file

@ -99,7 +99,7 @@ namespace PKHeX.Core
pk.Ball = (int)(ball == Ball.None ? Ball.Poke : ball); pk.Ball = (int)(ball == Ball.None ? Ball.Poke : ball);
pk.Language = lang; pk.Language = lang;
pk.OT_Friendship = pk.PersonalInfo.BaseFriendship; pk.OT_Friendship = pk.PersonalInfo.BaseFriendship;
pk.AltForm = GetWildAltForm(pk, Form, sav); pk.Form = GetWildForm(pk, Form, sav);
SetMetData(pk, level, Location); SetMetData(pk, level, Location);
SetPINGA(pk, criteria); SetPINGA(pk, criteria);
@ -138,7 +138,7 @@ namespace PKHeX.Core
{ {
PIDGenerator.SetRandomWildPID(pk, pk.Format, nature, ability, gender); PIDGenerator.SetRandomWildPID(pk, pk.Format, nature, ability, gender);
ability ^= 1; // some nature-forms cannot have a certain PID-ability set, so just flip it as Unown doesn't have dual abilities. ability ^= 1; // some nature-forms cannot have a certain PID-ability set, so just flip it as Unown doesn't have dual abilities.
} while (pk.AltForm != Form); } while (pk.Form != Form);
} }
else else
{ {
@ -165,7 +165,7 @@ namespace PKHeX.Core
private const int FormVivillon = 30; private const int FormVivillon = 30;
private const int FormRandom = 31; private const int FormRandom = 31;
private static int GetWildAltForm(PKM pk, int form, ITrainerInfo sav) private static int GetWildForm(PKM pk, int form, ITrainerInfo sav)
{ {
if (form < FormDynamic) // specified form if (form < FormDynamic) // specified form
{ {
@ -174,7 +174,7 @@ namespace PKHeX.Core
return form; return form;
} }
if (form == FormRandom) // flagged as totally random if (form == FormRandom) // flagged as totally random
return Util.Rand.Next(pk.PersonalInfo.FormeCount); return Util.Rand.Next(pk.PersonalInfo.FormCount);
int spec = pk.Species; int spec = pk.Species;
if ((int) Core.Species.Scatterbug <= spec && spec <= (int) Core.Species.Vivillon) if ((int) Core.Species.Scatterbug <= spec && spec <= (int) Core.Species.Vivillon)

View file

@ -60,7 +60,7 @@ namespace PKHeX.Core
{ {
pk.EncryptionConstant = Util.Rand32(); pk.EncryptionConstant = Util.Rand32();
pk.Species = Species; pk.Species = Species;
pk.AltForm = Form; pk.Form = Form;
int lang = (int)Language.GetSafeLanguage(Generation, (LanguageID)sav.Language); int lang = (int)Language.GetSafeLanguage(Generation, (LanguageID)sav.Language);
int level = GetMinimalLevel(); int level = GetMinimalLevel();
@ -260,7 +260,7 @@ namespace PKHeX.Core
{ {
if (SkipFormCheck) if (SkipFormCheck)
return true; return true;
return Form == evo.Form || AltFormInfo.IsFormChangeable(Species, Form, pkm.AltForm, pkm.Format); return Form == evo.Form || FormInfo.IsFormChangeable(Species, Form, pkm.Form, pkm.Format);
} }
protected virtual bool IsMatchEggLocation(PKM pkm) protected virtual bool IsMatchEggLocation(PKM pkm)

View file

@ -24,13 +24,13 @@ namespace PKHeX.Core
if (SkipFormCheck) if (SkipFormCheck)
return true; return true;
if (AltFormInfo.IsTotemForm(Species, Form, Generation)) if (FormInfo.IsTotemForm(Species, Form, Generation))
{ {
var expectForm = pkm.Format == 7 ? Form : AltFormInfo.GetTotemBaseForm(Species, Form); var expectForm = pkm.Format == 7 ? Form : FormInfo.GetTotemBaseForm(Species, Form);
return expectForm == evo.Form; return expectForm == evo.Form;
} }
return Form == evo.Form || AltFormInfo.IsFormChangeable(Species, Form, pkm.AltForm, pkm.Format); return Form == evo.Form || FormInfo.IsFormChangeable(Species, Form, pkm.Form, pkm.Format);
} }
protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk) protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)

View file

@ -53,7 +53,7 @@ namespace PKHeX.Core
{ {
if (base.IsMatchDeferred(pkm)) if (base.IsMatchDeferred(pkm))
return true; return true;
if (pkm is IGigantamax g && g.CanGigantamax != CanGigantamax && !g.CanToggleGigantamax(pkm.Species, pkm.AltForm, Species, Form)) if (pkm is IGigantamax g && g.CanGigantamax != CanGigantamax && !g.CanToggleGigantamax(pkm.Species, pkm.Form, Species, Form))
return true; return true;
if (Species == (int)Core.Species.Alcremie && pkm is IFormArgument a && a.FormArgument != 0) if (Species == (int)Core.Species.Alcremie && pkm is IFormArgument a && a.FormArgument != 0)
return true; return true;

View file

@ -102,7 +102,7 @@ namespace PKHeX.Core
pk.EncryptionConstant = Util.Rand32(); pk.EncryptionConstant = Util.Rand32();
pk.Species = species; pk.Species = species;
pk.AltForm = Form; pk.Form = Form;
pk.Language = lang; pk.Language = lang;
pk.OT_Name = pk.Format == 1 ? StringConverter12.G1TradeOTStr : HasTrainerName ? GetOT(lang) : sav.OT; pk.OT_Name = pk.Format == 1 ? StringConverter12.G1TradeOTStr : HasTrainerName ? GetOT(lang) : sav.OT;
pk.OT_Gender = HasTrainerName ? Math.Max(0, OTGender) : sav.Gender; pk.OT_Gender = HasTrainerName ? Math.Max(0, OTGender) : sav.Gender;
@ -242,7 +242,7 @@ namespace PKHeX.Core
if (CurrentLevel != -1 && CurrentLevel > pkm.CurrentLevel) if (CurrentLevel != -1 && CurrentLevel > pkm.CurrentLevel)
return false; return false;
if (Form != evo.Form && !AltFormInfo.IsFormChangeable(Species, Form, pkm.AltForm, pkm.Format)) if (Form != evo.Form && !FormInfo.IsFormChangeable(Species, Form, pkm.Form, pkm.Format))
return false; return false;
if (OTGender != -1 && OTGender != pkm.OT_Gender) if (OTGender != -1 && OTGender != pkm.OT_Gender)
return false; return false;

View file

@ -11,7 +11,7 @@ namespace PKHeX.Core
public static IEnumerable<EncounterEgg> GenerateEggs(PKM pkm, bool all = false) public static IEnumerable<EncounterEgg> GenerateEggs(PKM pkm, bool all = false)
{ {
var table = EvolutionTree.GetEvolutionTree(pkm, Math.Max(2, pkm.Format)); var table = EvolutionTree.GetEvolutionTree(pkm, Math.Max(2, pkm.Format));
int maxSpeciesOrigin = GetMaxSpeciesOrigin(pkm.GenNumber); int maxSpeciesOrigin = GetMaxSpeciesOrigin(pkm.Generation);
var evos = table.GetValidPreEvolutions(pkm, maxLevel: 100, maxSpeciesOrigin: maxSpeciesOrigin, skipChecks: true); var evos = table.GetValidPreEvolutions(pkm, maxLevel: 100, maxSpeciesOrigin: maxSpeciesOrigin, skipChecks: true);
return GenerateEggs(pkm, evos, all); return GenerateEggs(pkm, evos, all);
} }
@ -22,10 +22,10 @@ namespace PKHeX.Core
if (NoHatchFromEgg.Contains(species)) if (NoHatchFromEgg.Contains(species))
yield break; yield break;
int gen = pkm.GenNumber; int gen = pkm.Generation;
if (gen <= 1) if (gen <= 1)
yield break; // can't get eggs yield break; // can't get eggs
if (NoHatchFromEggForm(species, pkm.AltForm, gen)) if (NoHatchFromEggForm(species, pkm.Form, gen))
yield break; // can't originate from eggs yield break; // can't originate from eggs
// version is a true indicator for all generation 3-5 origins // version is a true indicator for all generation 3-5 origins
@ -60,7 +60,7 @@ namespace PKHeX.Core
{ {
if (form == 0) if (form == 0)
return false; return false;
if (AltFormInfo.IsTotemForm(species, form, gen)) if (FormInfo.IsTotemForm(species, form, gen))
return true; return true;
if (species == (int) Species.Pichu) if (species == (int) Species.Pichu)
return true; // can't get Spiky Ear Pichu eggs return true; // can't get Spiky Ear Pichu eggs
@ -73,8 +73,8 @@ namespace PKHeX.Core
{ {
// Sanity check form for origin // Sanity check form for origin
var gameInfo = GameData.GetPersonal(game); var gameInfo = GameData.GetPersonal(game);
var entry = gameInfo.GetFormeEntry(species, form); var entry = gameInfo.GetFormEntry(species, form);
return form >= entry.FormeCount && !(species == (int)Species.Rotom && form <= 5); return form >= entry.FormCount && !(species == (int)Species.Rotom && form <= 5);
} }
// Gen6+ update the origin game when hatched. Quick manip for X.Y<->A.O | S.M<->US.UM, ie X->A // Gen6+ update the origin game when hatched. Quick manip for X.Y<->A.O | S.M<->US.UM, ie X->A

View file

@ -153,7 +153,7 @@ namespace PKHeX.Core
return moves.Intersect(Legal.InvalidSketch).ToArray(); // Can learn anything return moves.Intersect(Legal.InvalidSketch).ToArray(); // Can learn anything
// Roughly determine the generation the PKM is originating from // Roughly determine the generation the PKM is originating from
int origin = pk.GenNumber; int origin = pk.Generation;
if (origin < 0) if (origin < 0)
origin = ((GameVersion)pk.Version).GetGeneration(); origin = ((GameVersion)pk.Version).GetGeneration();
@ -282,7 +282,7 @@ namespace PKHeX.Core
yield return enc; yield return enc;
} }
int gen = pk.GenNumber; int gen = pk.Generation;
if ((uint)gen >= 3) if ((uint)gen >= 3)
yield break; yield break;

View file

@ -111,7 +111,7 @@ namespace PKHeX.Core
internal static EncounterStatic? GetStaticLocation(PKM pkm, int species = -1) internal static EncounterStatic? GetStaticLocation(PKM pkm, int species = -1)
{ {
switch (pkm.GenNumber) switch (pkm.Generation)
{ {
case 1: case 1:
return EncounterStatic7.GetVC1(species, pkm.Met_Level); return EncounterStatic7.GetVC1(species, pkm.Met_Level);

View file

@ -76,7 +76,7 @@ namespace PKHeX.Core
private static IEnumerable<EncounterTrade> GetEncounterTradeTable(PKM pkm) private static IEnumerable<EncounterTrade> GetEncounterTradeTable(PKM pkm)
{ {
return pkm.GenNumber switch return pkm.Generation switch
{ {
3 => (pkm.FRLG ? Encounters3.TradeGift_FRLG : Encounters3.TradeGift_RSE), 3 => (pkm.FRLG ? Encounters3.TradeGift_FRLG : Encounters3.TradeGift_RSE),
4 => (pkm.HGSS ? Encounters4.TradeGift_HGSS : Encounters4.TradeGift_DPPt), 4 => (pkm.HGSS ? Encounters4.TradeGift_HGSS : Encounters4.TradeGift_DPPt),

View file

@ -10,7 +10,7 @@ namespace PKHeX.Core
public static IEnumerable<MysteryGift> GetPossible(PKM pkm, IReadOnlyList<DexLevel> chain) public static IEnumerable<MysteryGift> GetPossible(PKM pkm, IReadOnlyList<DexLevel> chain)
{ {
// Ranger Manaphy is a PGT and is not in the PCD[] for gen4. Check manually. // Ranger Manaphy is a PGT and is not in the PCD[] for gen4. Check manually.
int gen = pkm.GenNumber; int gen = pkm.Generation;
if (gen == 4 && pkm.Species == (int) Species.Manaphy) if (gen == 4 && pkm.Species == (int) Species.Manaphy)
yield return RangerManaphy; yield return RangerManaphy;
@ -22,7 +22,7 @@ namespace PKHeX.Core
public static IEnumerable<MysteryGift> GetValidGifts(PKM pkm, IReadOnlyList<DexLevel> chain) public static IEnumerable<MysteryGift> GetValidGifts(PKM pkm, IReadOnlyList<DexLevel> chain)
{ {
int gen = pkm.GenNumber; int gen = pkm.Generation;
if (pkm.IsEgg && pkm.Format != gen) // transferred if (pkm.IsEgg && pkm.Format != gen) // transferred
return Array.Empty<MysteryGift>(); return Array.Empty<MysteryGift>();

View file

@ -3,16 +3,13 @@
/// <summary> /// <summary>
/// Common Encounter Properties base interface. /// Common Encounter Properties base interface.
/// </summary> /// </summary>
public interface IEncounterable : IVersion public interface IEncounterable : ISpeciesForm, IVersion, IGeneration
{ {
int Species { get; }
int Form { get; }
string Name { get; } string Name { get; }
string LongName { get; } string LongName { get; }
bool EggEncounter { get; } bool EggEncounter { get; }
int LevelMin { get; } int LevelMin { get; }
int LevelMax { get; } int LevelMax { get; }
int Generation { get; }
PKM ConvertToPKM(ITrainerInfo sav); PKM ConvertToPKM(ITrainerInfo sav);
PKM ConvertToPKM(ITrainerInfo sav, EncounterCriteria criteria); PKM ConvertToPKM(ITrainerInfo sav, EncounterCriteria criteria);

View file

@ -39,7 +39,7 @@ namespace PKHeX.Core
public static int GetSuggestedEncounterEggMetLevel(PKM pkm) public static int GetSuggestedEncounterEggMetLevel(PKM pkm)
{ {
if (!pkm.IsNative && pkm.GenNumber < 5) if (!pkm.IsNative && pkm.Generation < 5)
return pkm.CurrentLevel; // be generous with transfer conditions return pkm.CurrentLevel; // be generous with transfer conditions
if (pkm.Format < 5) // and native if (pkm.Format < 5) // and native
return pkm.Format == 2 && pkm.Met_Location != 0 ? 1 : 0; return pkm.Format == 2 && pkm.Met_Location != 0 ? 1 : 0;
@ -48,7 +48,7 @@ namespace PKHeX.Core
public static int GetSuggestedEncounterEggLocationEgg(PKM pkm, bool traded = false) public static int GetSuggestedEncounterEggLocationEgg(PKM pkm, bool traded = false)
{ {
return GetSuggestedEncounterEggLocationEgg(pkm.GenNumber, traded); return GetSuggestedEncounterEggLocationEgg(pkm.Generation, traded);
} }
public static int GetSuggestedEncounterEggLocationEgg(int generation, bool traded = false) public static int GetSuggestedEncounterEggLocationEgg(int generation, bool traded = false)
@ -207,7 +207,7 @@ namespace PKHeX.Core
} }
} }
public sealed class EncounterSuggestionData : IRelearn public sealed class EncounterSuggestionData : ISpeciesForm, IRelearn
{ {
private readonly IEncounterable? Encounter; private readonly IEncounterable? Encounter;
@ -217,7 +217,7 @@ namespace PKHeX.Core
{ {
Encounter = enc; Encounter = enc;
Species = pkm.Species; Species = pkm.Species;
Form = pkm.AltForm; Form = pkm.Form;
Location = met; Location = met;
LevelMin = enc.LevelMin; LevelMin = enc.LevelMin;
@ -227,7 +227,7 @@ namespace PKHeX.Core
public EncounterSuggestionData(PKM pkm, int met, int lvl) public EncounterSuggestionData(PKM pkm, int met, int lvl)
{ {
Species = pkm.Species; Species = pkm.Species;
Form = pkm.AltForm; Form = pkm.Form;
Location = met; Location = met;
LevelMin = lvl; LevelMin = lvl;

View file

@ -14,7 +14,7 @@ namespace PKHeX.Core
/// <returns>Returns the verification method appropriate for the input PKM</returns> /// <returns>Returns the verification method appropriate for the input PKM</returns>
public static Func<PKM, LegalInfo, CheckResult> GetEncounterVerifierMethod(PKM pkm) public static Func<PKM, LegalInfo, CheckResult> GetEncounterVerifierMethod(PKM pkm)
{ {
switch (pkm.GenNumber) switch (pkm.Generation)
{ {
case 1: case 1:
case 2: case 2:

View file

@ -39,7 +39,7 @@ namespace PKHeX.Core
return new CheckResult(CheckIdentifier.GameOrigin); return new CheckResult(CheckIdentifier.GameOrigin);
var ver = (int)val >> 16; var ver = (int)val >> 16;
if (ver != 0 && !CanVersionReceiveGift(g.Format, ver, pk.Version)) if (ver != 0 && !CanVersionReceiveGift(g.Generation, ver, pk.Version))
return new CheckResult(Severity.Invalid, LEncGiftVersionNotDistributed, CheckIdentifier.GameOrigin); return new CheckResult(Severity.Invalid, LEncGiftVersionNotDistributed, CheckIdentifier.GameOrigin);
var lang = val & MysteryGiftRestriction.LangRestrict; var lang = val & MysteryGiftRestriction.LangRestrict;
@ -72,12 +72,12 @@ namespace PKHeX.Core
return false; // no data return false; // no data
if (!val.HasFlagFast(MysteryGiftRestriction.OTReplacedOnTrade)) if (!val.HasFlagFast(MysteryGiftRestriction.OTReplacedOnTrade))
return false; return false;
return CurrentOTMatchesReplaced(g.Format, pk.OT_Name); return CurrentOTMatchesReplaced(g.Generation, pk.OT_Name);
} }
private static bool CanVersionReceiveGift(int format, int version4bit, int version) private static bool CanVersionReceiveGift(int generation, int version4bit, int version)
{ {
return format switch return generation switch
{ {
_ => false _ => false
}; };

View file

@ -472,7 +472,7 @@ namespace PKHeX.Core
} }
learnInfo.EggMovesLearned.Add(m); learnInfo.EggMovesLearned.Add(m);
if (pkm.TradebackStatus == TradebackType.Any && pkm.GenNumber == 1) if (pkm.TradebackStatus == TradebackType.Any && pkm.Generation == 1)
pkm.TradebackStatus = TradebackType.WasTradeback; pkm.TradebackStatus = TradebackType.WasTradeback;
} }
if (!learnInfo.Source.EggEventSource.Contains(move)) if (!learnInfo.Source.EggEventSource.Contains(move))
@ -490,7 +490,7 @@ namespace PKHeX.Core
res[m] = new CheckMoveResult(SpecialEgg, gen, Valid, LMoveSourceEggEvent, Move); res[m] = new CheckMoveResult(SpecialEgg, gen, Valid, LMoveSourceEggEvent, Move);
} }
} }
if (pkm.TradebackStatus == TradebackType.Any && pkm.GenNumber == 1) if (pkm.TradebackStatus == TradebackType.Any && pkm.Generation == 1)
pkm.TradebackStatus = TradebackType.WasTradeback; pkm.TradebackStatus = TradebackType.WasTradeback;
learnInfo.EventEggMoves.Add(m); learnInfo.EventEggMoves.Add(m);
} }
@ -754,7 +754,7 @@ namespace PKHeX.Core
private static CheckMoveResult[] VerifyPreRelearnEggBase(PKM pkm, IReadOnlyList<int> currentMoves, EggInfoSource infoset) private static CheckMoveResult[] VerifyPreRelearnEggBase(PKM pkm, IReadOnlyList<int> currentMoves, EggInfoSource infoset)
{ {
CheckMoveResult[] res = new CheckMoveResult[4]; CheckMoveResult[] res = new CheckMoveResult[4];
var gen = pkm.GenNumber; var gen = pkm.Generation;
// Obtain level1 moves // Obtain level1 moves
var reqBase = GetRequiredBaseMoveCount(currentMoves, infoset); var reqBase = GetRequiredBaseMoveCount(currentMoves, infoset);
@ -900,7 +900,7 @@ namespace PKHeX.Core
{ {
// VC case: check transfer games in reverse order (8, 7..) then past games. // VC case: check transfer games in reverse order (8, 7..) then past games.
int[] xfer = GetGenMovesOrder(pkm.Format, 7); int[] xfer = GetGenMovesOrder(pkm.Format, 7);
int[] past = GetGenMovesCheckOrderGB(pkm, pkm.GenNumber); int[] past = GetGenMovesCheckOrderGB(pkm, pkm.Generation);
int end = xfer.Length; int end = xfer.Length;
Array.Resize(ref xfer, xfer.Length + past.Length); Array.Resize(ref xfer, xfer.Length + past.Length);
past.CopyTo(xfer, end); past.CopyTo(xfer, end);

View file

@ -84,7 +84,7 @@
Geography, Geography,
/// <summary> /// <summary>
/// The <see cref="CheckResult"/> pertains to the <see cref="PKM.AltForm"/>. /// The <see cref="CheckResult"/> pertains to the <see cref="PKM.Form"/>.
/// </summary> /// </summary>
Form, Form,
@ -130,7 +130,7 @@
/// <summary> /// <summary>
/// The <see cref="CheckResult"/> pertains to the <see cref="PKM"/>'s <see cref="PKM.Version"/> compatibility. /// The <see cref="CheckResult"/> pertains to the <see cref="PKM"/>'s <see cref="PKM.Version"/> compatibility.
/// <remarks>This is used for parsing checks to ensure the <see cref="PKM"/> didn't debut on a future <see cref="PKM.GenNumber"/></remarks> /// <remarks>This is used for parsing checks to ensure the <see cref="PKM"/> didn't debut on a future <see cref="PKM.Generation"/></remarks>
/// </summary> /// </summary>
GameOrigin, GameOrigin,

View file

@ -114,7 +114,7 @@ namespace PKHeX.Core
if (hasMet) if (hasMet)
return pkm.CurrentLevel; return pkm.CurrentLevel;
int generation = pkm.GenNumber; int generation = pkm.Generation;
if (generation >= 4) if (generation >= 4)
return met; return met;
@ -126,7 +126,7 @@ namespace PKHeX.Core
{ {
var species = pkm.Species; var species = pkm.Species;
if (Future_LevelUp.TryGetValue(species | (pkm.AltForm << 11), out var delta)) if (Future_LevelUp.TryGetValue(species | (pkm.Form << 11), out var delta))
return met - delta; return met - delta;
if (generation < 4 && Future_LevelUp4.Contains(species) && (pkm.Format <= 7 || !Future_LevelUp4_Not8.Contains(species))) if (generation < 4 && Future_LevelUp4.Contains(species) && (pkm.Format <= 7 || !Future_LevelUp4_Not8.Contains(species)))

View file

@ -239,7 +239,7 @@ namespace PKHeX.Core
if (maxLevel < 0) if (maxLevel < 0)
maxLevel = pkm.CurrentLevel; maxLevel = pkm.CurrentLevel;
if (maxspeciesorigin == -1 && pkm.InhabitedGeneration(2) && pkm.Format <= 2 && pkm.GenNumber == 1) if (maxspeciesorigin == -1 && pkm.InhabitedGeneration(2) && pkm.Format <= 2 && pkm.Generation == 1)
maxspeciesorigin = MaxSpeciesID_2; maxspeciesorigin = MaxSpeciesID_2;
int tree = Math.Max(2, pkm.Format); int tree = Math.Max(2, pkm.Format);
@ -255,7 +255,7 @@ namespace PKHeX.Core
if (pkm.Format <= 2) if (pkm.Format <= 2)
return 2; return 2;
var origin = pkm.GenNumber; var origin = pkm.Generation;
if (!pkm.HasOriginalMetLocation && generation != origin) if (!pkm.HasOriginalMetLocation && generation != origin)
return pkm.Met_Level; return pkm.Met_Level;

View file

@ -91,8 +91,8 @@ namespace PKHeX.Core
return !pkm.IsUntraded || skipChecks; return !pkm.IsUntraded || skipChecks;
// Special Level Up Cases -- return false if invalid // Special Level Up Cases -- return false if invalid
case LevelUpNatureAmped when GetAmpLowKeyResult(pkm.Nature) != pkm.AltForm && !skipChecks: case LevelUpNatureAmped when GetAmpLowKeyResult(pkm.Nature) != pkm.Form && !skipChecks:
case LevelUpNatureLowKey when GetAmpLowKeyResult(pkm.Nature) != pkm.AltForm && !skipChecks: case LevelUpNatureLowKey when GetAmpLowKeyResult(pkm.Nature) != pkm.Form && !skipChecks:
return false; return false;
case LevelUpBeauty when !(pkm is IContestStats s) || s.CNT_Beauty < Argument: case LevelUpBeauty when !(pkm is IContestStats s) || s.CNT_Beauty < Argument:
@ -101,7 +101,7 @@ namespace PKHeX.Core
return false; return false;
case LevelUpFemale when pkm.Gender != 1: case LevelUpFemale when pkm.Gender != 1:
return false; return false;
case LevelUpFormFemale1 when pkm.Gender != 1 || pkm.AltForm != 1: case LevelUpFormFemale1 when pkm.Gender != 1 || pkm.Form != 1:
return false; return false;
case LevelUpVersion when ((pkm.Version & 1) != (Argument & 1) && pkm.IsUntraded) || skipChecks: case LevelUpVersion when ((pkm.Version & 1) != (Argument & 1) && pkm.IsUntraded) || skipChecks:
@ -127,7 +127,7 @@ namespace PKHeX.Core
private bool HasMetLevelIncreased(PKM pkm, int lvl) private bool HasMetLevelIncreased(PKM pkm, int lvl)
{ {
int origin = pkm.GenNumber; int origin = pkm.Generation;
switch (origin) switch (origin)
{ {
case 1: // No met data in RBY case 1: // No met data in RBY

View file

@ -92,7 +92,7 @@ namespace PKHeX.Core
{ {
for (int sSpecies = 1; sSpecies <= MaxSpeciesTree; sSpecies++) for (int sSpecies = 1; sSpecies <= MaxSpeciesTree; sSpecies++)
{ {
var fc = Personal[sSpecies].FormeCount; var fc = Personal[sSpecies].FormCount;
for (int sForm = 0; sForm < fc; sForm++) for (int sForm = 0; sForm < fc; sForm++)
{ {
var index = sSpecies; var index = sSpecies;
@ -117,10 +117,10 @@ namespace PKHeX.Core
{ {
for (int sSpecies = 1; sSpecies <= MaxSpeciesTree; sSpecies++) for (int sSpecies = 1; sSpecies <= MaxSpeciesTree; sSpecies++)
{ {
var fc = Personal[sSpecies].FormeCount; var fc = Personal[sSpecies].FormCount;
for (int sForm = 0; sForm < fc; sForm++) for (int sForm = 0; sForm < fc; sForm++)
{ {
var index = Personal.GetFormeIndex(sSpecies, sForm); var index = Personal.GetFormIndex(sSpecies, sForm);
var evos = Entries[index]; var evos = Entries[index];
foreach (var evo in evos) foreach (var evo in evos)
{ {
@ -208,7 +208,7 @@ namespace PKHeX.Core
{ {
return new List<EvoCriteria>(1) return new List<EvoCriteria>(1)
{ {
new EvoCriteria(pkm.Species, pkm.AltForm) { Level = maxLevel, MinLevel = maxLevel }, new EvoCriteria(pkm.Species, pkm.Form) { Level = maxLevel, MinLevel = maxLevel },
}; };
} }
@ -272,7 +272,7 @@ namespace PKHeX.Core
public IEnumerable<int> GetEvolutions(int species, int form) public IEnumerable<int> GetEvolutions(int species, int form)
{ {
int format = Game - Gen1 + 1; int format = Game - Gen1 + 1;
int index = format < 7 ? species : Personal.GetFormeIndex(species, form); int index = format < 7 ? species : Personal.GetFormIndex(species, form);
var evos = Entries[index]; var evos = Entries[index];
foreach (var method in evos) foreach (var method in evos)
{ {
@ -299,7 +299,7 @@ namespace PKHeX.Core
private List<EvoCriteria> GetExplicitLineage(PKM pkm, int maxLevel, bool skipChecks, int maxSpeciesOrigin, int minLevel) private List<EvoCriteria> GetExplicitLineage(PKM pkm, int maxLevel, bool skipChecks, int maxSpeciesOrigin, int minLevel)
{ {
int species = pkm.Species; int species = pkm.Species;
int form = pkm.AltForm; int form = pkm.Form;
int lvl = maxLevel; int lvl = maxLevel;
var first = new EvoCriteria(species, form) { Level = lvl }; var first = new EvoCriteria(species, form) { Level = lvl };

View file

@ -113,7 +113,7 @@ namespace PKHeX.Core
/// </summary> /// </summary>
/// <param name="pk">Input data to check</param> /// <param name="pk">Input data to check</param>
/// <param name="table"><see cref="SaveFile"/> specific personal data</param> /// <param name="table"><see cref="SaveFile"/> specific personal data</param>
public LegalityAnalysis(PKM pk, PersonalTable table) : this(pk, table.GetFormeEntry(pk.Species, pk.AltForm)) { } public LegalityAnalysis(PKM pk, PersonalTable table) : this(pk, table.GetFormEntry(pk.Species, pk.Form)) { }
/// <summary> /// <summary>
/// Checks the input <see cref="PKM"/> data for legality. /// Checks the input <see cref="PKM"/> data for legality.
@ -176,7 +176,7 @@ namespace PKHeX.Core
if (pkm.Format <= 2) // prior to storing GameVersion if (pkm.Format <= 2) // prior to storing GameVersion
return ParsePK1; return ParsePK1;
int gen = pkm.GenNumber; int gen = pkm.Generation;
if (gen <= 0) if (gen <= 0)
gen = pkm.Format; gen = pkm.Format;
return gen switch return gen switch

View file

@ -12,7 +12,7 @@ namespace PKHeX.Core
{ {
internal static IEnumerable<int> GetValidRelearn(PKM pkm, int species, int form, bool inheritlvlmoves, GameVersion version = GameVersion.Any) internal static IEnumerable<int> GetValidRelearn(PKM pkm, int species, int form, bool inheritlvlmoves, GameVersion version = GameVersion.Any)
{ {
if (pkm.GenNumber < 6) if (pkm.Generation < 6)
return Array.Empty<int>(); return Array.Empty<int>();
var r = new List<int>(); var r = new List<int>();
@ -138,7 +138,7 @@ namespace PKHeX.Core
break; break;
if (pkm.InhabitedGeneration(7)) if (pkm.InhabitedGeneration(7))
{ {
int index = PersonalTable.SM.GetFormeIndex(species, form); int index = PersonalTable.SM.GetFormIndex(species, form);
return LevelUpSM[index].GetMoves(lvl); return LevelUpSM[index].GetMoves(lvl);
} }
break; break;
@ -148,7 +148,7 @@ namespace PKHeX.Core
case GameVersion.USUM: case GameVersion.USUM:
if (pkm.InhabitedGeneration(7)) if (pkm.InhabitedGeneration(7))
{ {
int index = PersonalTable.USUM.GetFormeIndex(species, form); int index = PersonalTable.USUM.GetFormIndex(species, form);
return LevelUpUSUM[index].GetMoves(lvl); return LevelUpUSUM[index].GetMoves(lvl);
} }
break; break;
@ -158,7 +158,7 @@ namespace PKHeX.Core
case GameVersion.SWSH: case GameVersion.SWSH:
if (pkm.InhabitedGeneration(8)) if (pkm.InhabitedGeneration(8))
{ {
int index = PersonalTable.SWSH.GetFormeIndex(species, form); int index = PersonalTable.SWSH.GetFormIndex(species, form);
return LevelUpSWSH[index].GetMoves(lvl); return LevelUpSWSH[index].GetMoves(lvl);
} }
break; break;
@ -206,7 +206,7 @@ namespace PKHeX.Core
moves.AddRange(GetValidPostEvolutionMoves(pkm, species, evoChains[i], i, Version)); moves.AddRange(GetValidPostEvolutionMoves(pkm, species, evoChains[i], i, Version));
} }
if (pkm.GenNumber >= 6) if (pkm.Generation >= 6)
moves.AddRange(pkm.RelearnMoves.Where(m => m != 0)); moves.AddRange(pkm.RelearnMoves.Where(m => m != 0));
return moves.Distinct().ToList(); return moves.Distinct().ToList();
} }
@ -254,7 +254,7 @@ namespace PKHeX.Core
if (pkm.Format == 3 && species == (int)Species.Deoxys) if (pkm.Format == 3 && species == (int)Species.Deoxys)
formCount = 4; formCount = 4;
else else
formCount = pkm.PersonalInfo.FormeCount; formCount = pkm.PersonalInfo.FormCount;
for (int form = 0; form < formCount; form++) for (int form = 0; form < formCount; form++)
r.AddRange(GetMoves(pkm, species, minLvLG1, minLvLG2, chain[0].Level, form, Tutor, version, LVL, Tutor, Machine, MoveReminder, RemoveTransferHM, generation)); r.AddRange(GetMoves(pkm, species, minLvLG1, minLvLG2, chain[0].Level, form, Tutor, version, LVL, Tutor, Machine, MoveReminder, RemoveTransferHM, generation));

View file

@ -22,7 +22,7 @@ namespace PKHeX.Core
if (pkm.Species == enc.Species) if (pkm.Species == enc.Species)
{ {
return MoveLevelUp.GetEncounterMoves(pkm.Species, pkm.AltForm, pkm.CurrentLevel, (GameVersion)pkm.Version); return MoveLevelUp.GetEncounterMoves(pkm.Species, pkm.Form, pkm.CurrentLevel, (GameVersion)pkm.Version);
} }
} }
@ -43,7 +43,7 @@ namespace PKHeX.Core
if (Relearn && pkm.Format >= 6) if (Relearn && pkm.Format >= 6)
r.AddRange(pkm.RelearnMoves); r.AddRange(pkm.RelearnMoves);
int start = pkm.GenNumber; int start = pkm.Generation;
if (start < 0) if (start < 0)
start = pkm.Format; // be generous instead of returning nothing start = pkm.Format; // be generous instead of returning nothing
if (pkm is IBattleVersion b) if (pkm is IBattleVersion b)

View file

@ -24,7 +24,7 @@ namespace PKHeX.Core
: (IReadOnlyList<int>)Array.Empty<int>(); : (IReadOnlyList<int>)Array.Empty<int>();
// Only TM/HM moves from the source game of the egg, not any other games from the same generation // Only TM/HM moves from the source game of the egg, not any other games from the same generation
TMHM = MoveTechnicalMachine.GetTMHM(pkm, pkm.Species, pkm.AltForm, e.Generation, e.Version).ToList(); TMHM = MoveTechnicalMachine.GetTMHM(pkm, pkm.Species, pkm.Form, e.Generation, e.Version).ToList();
// Non-Base moves that can magically appear in the regular movepool // Non-Base moves that can magically appear in the regular movepool
bool volt = (e.Generation > 3 || e.Version == GameVersion.E) && Legal.LightBall.Contains(pkm.Species); bool volt = (e.Generation > 3 || e.Version == GameVersion.E) && Legal.LightBall.Contains(pkm.Species);

View file

@ -30,13 +30,13 @@ namespace PKHeX.Core
public List<int> AddMoves(List<int> moves, int species, int form, int max, int min = 0) public List<int> AddMoves(List<int> moves, int species, int form, int max, int min = 0)
{ {
int index = Table.GetFormeIndex(species, form); int index = Table.GetFormIndex(species, form);
return AddMovesIndex(moves, index, max, min); return AddMovesIndex(moves, index, max, min);
} }
public List<int> AddMoves1(List<int> moves, int species, int form, int max, int min) public List<int> AddMoves1(List<int> moves, int species, int form, int max, int min)
{ {
int index = Table.GetFormeIndex(species, form); int index = Table.GetFormIndex(species, form);
return AddMovesIndex1(moves, index, max, min); return AddMovesIndex1(moves, index, max, min);
} }
@ -49,13 +49,13 @@ namespace PKHeX.Core
public List<int> GetMoves(int species, int form, int min, int max) public List<int> GetMoves(int species, int form, int min, int max)
{ {
int index = Table.GetFormeIndex(species, form); int index = Table.GetFormIndex(species, form);
return Learn[index].GetMoveList(max, min); return Learn[index].GetMoveList(max, min);
} }
public LearnVersion GetIsLevelUp(int species, int form, int move) public LearnVersion GetIsLevelUp(int species, int form, int move)
{ {
int index = Table.GetFormeIndex(species, form); int index = Table.GetFormIndex(species, form);
if (index <= 0) if (index <= 0)
return LearnNONE; return LearnNONE;
var lv = Learn[index].GetLevelLearnMove(move); var lv = Learn[index].GetLevelLearnMove(move);
@ -66,7 +66,7 @@ namespace PKHeX.Core
public LearnVersion GetIsLevelUp(int species, int form, int move, int max) public LearnVersion GetIsLevelUp(int species, int form, int move, int max)
{ {
int index = Table.GetFormeIndex(species, form); int index = Table.GetFormIndex(species, form);
if (index <= 0) if (index <= 0)
return LearnNONE; return LearnNONE;
var lv = Learn[index].GetLevelLearnMove(move); var lv = Learn[index].GetLevelLearnMove(move);
@ -77,7 +77,7 @@ namespace PKHeX.Core
public LearnVersion GetIsLevelUpMin(int species, int move, int max, int min, int form) public LearnVersion GetIsLevelUpMin(int species, int move, int max, int min, int form)
{ {
int index = Table.GetFormeIndex(species, form); int index = Table.GetFormIndex(species, form);
if (index <= 0) if (index <= 0)
return LearnNONE; return LearnNONE;
var lv = Learn[index].GetLevelLearnMove(move, min); var lv = Learn[index].GetLevelLearnMove(move, min);
@ -88,7 +88,7 @@ namespace PKHeX.Core
public LearnVersion GetIsLevelUpG1(int species, int form, int move, int max, int min = 0) public LearnVersion GetIsLevelUpG1(int species, int form, int move, int max, int min = 0)
{ {
int index = PersonalTable.RB.GetFormeIndex(species, form); int index = PersonalTable.RB.GetFormIndex(species, form);
if (index == 0) if (index == 0)
return LearnNONE; return LearnNONE;

View file

@ -8,7 +8,7 @@ namespace PKHeX.Core
{ {
public static int[] GetEggMoves(PKM pkm, int species, int formnum, GameVersion version) public static int[] GetEggMoves(PKM pkm, int species, int formnum, GameVersion version)
{ {
int gen = pkm.Format <= 2 || pkm.VC ? 2 : pkm.GenNumber; int gen = pkm.Format <= 2 || pkm.VC ? 2 : pkm.Generation;
if (!pkm.InhabitedGeneration(gen, species) || (pkm.PersonalInfo.Genderless && !FixedGenderFromBiGender.Contains(species))) if (!pkm.InhabitedGeneration(gen, species) || (pkm.PersonalInfo.Genderless && !FixedGenderFromBiGender.Contains(species)))
return Array.Empty<int>(); return Array.Empty<int>();
@ -103,7 +103,7 @@ namespace PKHeX.Core
} }
return Array.Empty<int>(); return Array.Empty<int>();
int[] getMoves(IReadOnlyList<Learnset> moves, PersonalTable table) => moves[table.GetFormeIndex(species, formnum)].GetMoves(lvl); int[] getMoves(IReadOnlyList<Learnset> moves, PersonalTable table) => moves[table.GetFormIndex(species, formnum)].GetMoves(lvl);
} }
public static bool GetIsSharedEggMove(PKM pkm, int gen, int move) public static bool GetIsSharedEggMove(PKM pkm, int gen, int move)
@ -111,7 +111,7 @@ namespace PKHeX.Core
if (gen < 8 || pkm.IsEgg) if (gen < 8 || pkm.IsEgg)
return false; return false;
var table = PersonalTable.SWSH; var table = PersonalTable.SWSH;
var entry = (PersonalInfoSWSH)table.GetFormeEntry(pkm.Species, pkm.AltForm); var entry = (PersonalInfoSWSH)table.GetFormEntry(pkm.Species, pkm.Form);
var baseSpecies = entry.HatchSpecies; var baseSpecies = entry.HatchSpecies;
var baseForm = entry.HatchFormIndexEverstone; var baseForm = entry.HatchFormIndexEverstone;
var egg = GetEggMoves(8, baseSpecies, baseForm, GameVersion.SW); var egg = GetEggMoves(8, baseSpecies, baseForm, GameVersion.SW);

View file

@ -488,14 +488,14 @@ namespace PKHeX.Core
{ {
if (version <= 0) if (version <= 0)
version = (GameVersion)pk.Version; version = (GameVersion)pk.Version;
return GetEncounterMoves(pk.Species, pk.AltForm, level, version); return GetEncounterMoves(pk.Species, pk.Form, level, version);
} }
private static int[] GetEncounterMoves1(int species, int level, GameVersion version) private static int[] GetEncounterMoves1(int species, int level, GameVersion version)
{ {
var learn = GameData.GetLearnsets(version); var learn = GameData.GetLearnsets(version);
var table = GameData.GetPersonal(version); var table = GameData.GetPersonal(version);
var index = table.GetFormeIndex(species, 0); var index = table.GetFormIndex(species, 0);
var lvl0 = (int[])((PersonalInfoG1) table[index]).Moves.Clone(); var lvl0 = (int[])((PersonalInfoG1) table[index]).Moves.Clone();
int start = Math.Max(0, Array.FindIndex(lvl0, z => z == 0)); int start = Math.Max(0, Array.FindIndex(lvl0, z => z == 0));
@ -506,7 +506,7 @@ namespace PKHeX.Core
{ {
var learn = GameData.GetLearnsets(version); var learn = GameData.GetLearnsets(version);
var table = GameData.GetPersonal(version); var table = GameData.GetPersonal(version);
var index = table.GetFormeIndex(species, 0); var index = table.GetFormIndex(species, 0);
var lvl0 = learn[species].GetEncounterMoves(1); var lvl0 = learn[species].GetEncounterMoves(1);
int start = Math.Max(0, Array.FindIndex(lvl0, z => z == 0)); int start = Math.Max(0, Array.FindIndex(lvl0, z => z == 0));
@ -521,7 +521,7 @@ namespace PKHeX.Core
return GetEncounterMoves2(species, level, version); return GetEncounterMoves2(species, level, version);
var learn = GameData.GetLearnsets(version); var learn = GameData.GetLearnsets(version);
var table = GameData.GetPersonal(version); var table = GameData.GetPersonal(version);
var index = table.GetFormeIndex(species, form); var index = table.GetFormIndex(species, form);
return learn[index].GetEncounterMoves(level); return learn[index].GetEncounterMoves(level);
} }
} }

View file

@ -83,7 +83,7 @@ namespace PKHeX.Core
{ {
for (int i = 0; i < Legal.TM_3.Length; i++) for (int i = 0; i < Legal.TM_3.Length; i++)
{ {
if (Legal.TM_4[i] == move && PersonalTable.HGSS.GetFormeEntry(species, form).TMHM[i]) if (Legal.TM_4[i] == move && PersonalTable.HGSS.GetFormEntry(species, form).TMHM[i])
return GameVersion.Gen4; return GameVersion.Gen4;
} }
@ -100,11 +100,11 @@ namespace PKHeX.Core
switch (move) switch (move)
{ {
case 250: // Whirlpool case 250: // Whirlpool
if (PersonalTable.HGSS.GetFormeEntry(species, form).TMHM[96]) if (PersonalTable.HGSS.GetFormEntry(species, form).TMHM[96])
return GameVersion.HGSS; return GameVersion.HGSS;
break; break;
case 432: // Defog case 432: // Defog
if (PersonalTable.Pt.GetFormeEntry(species, form).TMHM[96]) if (PersonalTable.Pt.GetFormEntry(species, form).TMHM[96])
return GameVersion.DPPt; return GameVersion.DPPt;
break; break;
} }
@ -119,7 +119,7 @@ namespace PKHeX.Core
{ {
if (m == move) if (m == move)
{ {
if (PersonalTable.Pt.GetFormeEntry(species, form).TMHM[i + 92]) if (PersonalTable.Pt.GetFormEntry(species, form).TMHM[i + 92])
return GameVersion.DPPt; return GameVersion.DPPt;
break; break;
} }
@ -129,7 +129,7 @@ namespace PKHeX.Core
{ {
if (m == move) if (m == move)
{ {
if (PersonalTable.HGSS.GetFormeEntry(species, form).TMHM[i + 92]) if (PersonalTable.HGSS.GetFormEntry(species, form).TMHM[i + 92])
return GameVersion.HGSS; return GameVersion.HGSS;
break; break;
} }
@ -144,7 +144,7 @@ namespace PKHeX.Core
for (int i = 0; i < Legal.TMHM_BW.Length; i++) for (int i = 0; i < Legal.TMHM_BW.Length; i++)
{ {
if (Legal.TMHM_BW[i] == move) if (Legal.TMHM_BW[i] == move)
return PersonalTable.B2W2.GetFormeEntry(species, form).TMHM[i] ? GameVersion.Gen5 : Legal.NONE; return PersonalTable.B2W2.GetFormEntry(species, form).TMHM[i] ? GameVersion.Gen5 : Legal.NONE;
} }
return Legal.NONE; return Legal.NONE;
} }
@ -157,7 +157,7 @@ namespace PKHeX.Core
{ {
if (Legal.TMHM_XY[i] != move) if (Legal.TMHM_XY[i] != move)
continue; continue;
if (PersonalTable.XY.GetFormeEntry(species, form).TMHM[i]) if (PersonalTable.XY.GetFormEntry(species, form).TMHM[i])
return GameVersion.XY; return GameVersion.XY;
break; break;
} }
@ -169,7 +169,7 @@ namespace PKHeX.Core
{ {
if (Legal.TMHM_AO[i] != move) if (Legal.TMHM_AO[i] != move)
continue; continue;
if (PersonalTable.AO.GetFormeEntry(species, form).TMHM[i]) if (PersonalTable.AO.GetFormEntry(species, form).TMHM[i])
return GameVersion.ORAS; return GameVersion.ORAS;
break; break;
} }
@ -186,7 +186,7 @@ namespace PKHeX.Core
{ {
if (Legal.TMHM_GG[i] != move) if (Legal.TMHM_GG[i] != move)
continue; continue;
if (PersonalTable.GG.GetFormeEntry(species, form).TMHM[i]) if (PersonalTable.GG.GetFormEntry(species, form).TMHM[i])
return GameVersion.GG; return GameVersion.GG;
break; break;
} }
@ -198,7 +198,7 @@ namespace PKHeX.Core
{ {
if (Legal.TMHM_SM[i] != move) if (Legal.TMHM_SM[i] != move)
continue; continue;
if (PersonalTable.SM.GetFormeEntry(species, form).TMHM[i]) if (PersonalTable.SM.GetFormEntry(species, form).TMHM[i])
return GameVersion.SM; return GameVersion.SM;
break; break;
} }
@ -210,7 +210,7 @@ namespace PKHeX.Core
{ {
if (Legal.TMHM_SM[i] != move) if (Legal.TMHM_SM[i] != move)
continue; continue;
if (PersonalTable.USUM.GetFormeEntry(species, form).TMHM[i]) if (PersonalTable.USUM.GetFormEntry(species, form).TMHM[i])
return GameVersion.USUM; return GameVersion.USUM;
break; break;
} }
@ -227,7 +227,7 @@ namespace PKHeX.Core
{ {
if (Legal.TMHM_SWSH[i] != move) if (Legal.TMHM_SWSH[i] != move)
continue; continue;
if (PersonalTable.SWSH.GetFormeEntry(species, form).TMHM[i]) if (PersonalTable.SWSH.GetFormEntry(species, form).TMHM[i])
return GameVersion.SWSH; return GameVersion.SWSH;
break; break;
} }
@ -235,7 +235,7 @@ namespace PKHeX.Core
{ {
if (Legal.TMHM_SWSH[i + 100] != move) if (Legal.TMHM_SWSH[i + 100] != move)
continue; continue;
if (!PersonalTable.SWSH.GetFormeEntry(species, form).TMHM[i + 100]) if (!PersonalTable.SWSH.GetFormEntry(species, form).TMHM[i + 100])
break; break;
if (allowBit) if (allowBit)
return GameVersion.SWSH; return GameVersion.SWSH;
@ -275,7 +275,7 @@ namespace PKHeX.Core
private static void AddMachine1(List<int> r, int species) private static void AddMachine1(List<int> r, int species)
{ {
int index = PersonalTable.RB.GetFormeIndex(species, 0); int index = PersonalTable.RB.GetFormIndex(species, 0);
if (index == 0) if (index == 0)
return; return;
var pi_rb = (PersonalInfoG1)PersonalTable.RB[index]; var pi_rb = (PersonalInfoG1)PersonalTable.RB[index];
@ -286,7 +286,7 @@ namespace PKHeX.Core
private static void AddMachine2(List<int> r, int species) private static void AddMachine2(List<int> r, int species)
{ {
int index = PersonalTable.C.GetFormeIndex(species, 0); int index = PersonalTable.C.GetFormIndex(species, 0);
if (index == 0) if (index == 0)
return; return;
var pi_c = PersonalTable.C[index]; var pi_c = PersonalTable.C[index];
@ -295,7 +295,7 @@ namespace PKHeX.Core
private static void AddMachine3(List<int> r, int species, int format, bool RemoveTransfer) private static void AddMachine3(List<int> r, int species, int format, bool RemoveTransfer)
{ {
int index = PersonalTable.E.GetFormeIndex(species, 0); int index = PersonalTable.E.GetFormIndex(species, 0);
if (index == 0) if (index == 0)
return; return;
var pi_c = PersonalTable.E[index]; var pi_c = PersonalTable.E[index];
@ -309,8 +309,8 @@ namespace PKHeX.Core
private static void AddMachine4(List<int> r, int species, int format, bool RemoveTransfer, int form) private static void AddMachine4(List<int> r, int species, int format, bool RemoveTransfer, int form)
{ {
var pi_hgss = PersonalTable.HGSS.GetFormeEntry(species, form); var pi_hgss = PersonalTable.HGSS.GetFormEntry(species, form);
var pi_dppt = PersonalTable.Pt.GetFormeEntry(species, form); var pi_dppt = PersonalTable.Pt.GetFormEntry(species, form);
r.AddRange(Legal.TM_4.Where((_, m) => pi_hgss.TMHM[m])); r.AddRange(Legal.TM_4.Where((_, m) => pi_hgss.TMHM[m]));
if (RemoveTransfer && format > 4) if (RemoveTransfer && format > 4)
@ -331,7 +331,7 @@ namespace PKHeX.Core
private static void AddMachine5(List<int> r, int species, int form) private static void AddMachine5(List<int> r, int species, int form)
{ {
var pi = PersonalTable.B2W2.GetFormeEntry(species, form); var pi = PersonalTable.B2W2.GetFormEntry(species, form);
r.AddRange(Legal.TMHM_BW.Where((_, m) => pi.TMHM[m])); r.AddRange(Legal.TMHM_BW.Where((_, m) => pi.TMHM[m]));
} }
@ -397,13 +397,13 @@ namespace PKHeX.Core
private static void AddMachine6XY(List<int> r, int species, int form) private static void AddMachine6XY(List<int> r, int species, int form)
{ {
var pi = PersonalTable.XY.GetFormeEntry(species, form); var pi = PersonalTable.XY.GetFormEntry(species, form);
r.AddRange(Legal.TMHM_XY.Where((_, m) => pi.TMHM[m])); r.AddRange(Legal.TMHM_XY.Where((_, m) => pi.TMHM[m]));
} }
private static void AddMachine6AO(List<int> r, int species, int form) private static void AddMachine6AO(List<int> r, int species, int form)
{ {
var pi = PersonalTable.AO.GetFormeEntry(species, form); var pi = PersonalTable.AO.GetFormEntry(species, form);
r.AddRange(Legal.TMHM_AO.Where((_, m) => pi.TMHM[m])); r.AddRange(Legal.TMHM_AO.Where((_, m) => pi.TMHM[m]));
} }
@ -411,13 +411,13 @@ namespace PKHeX.Core
{ {
if (species > Legal.MaxSpeciesID_7) if (species > Legal.MaxSpeciesID_7)
return; return;
var pi = PersonalTable.SM.GetFormeEntry(species, form); var pi = PersonalTable.SM.GetFormEntry(species, form);
r.AddRange(Legal.TMHM_SM.Where((_, m) => pi.TMHM[m])); r.AddRange(Legal.TMHM_SM.Where((_, m) => pi.TMHM[m]));
} }
private static void AddMachineUSUM(List<int> r, int species, int form) private static void AddMachineUSUM(List<int> r, int species, int form)
{ {
var pi = PersonalTable.USUM.GetFormeEntry(species, form); var pi = PersonalTable.USUM.GetFormEntry(species, form);
r.AddRange(Legal.TMHM_SM.Where((_, m) => pi.TMHM[m])); r.AddRange(Legal.TMHM_SM.Where((_, m) => pi.TMHM[m]));
} }
@ -425,7 +425,7 @@ namespace PKHeX.Core
{ {
if (species > Legal.MaxSpeciesID_7b) if (species > Legal.MaxSpeciesID_7b)
return; return;
var pi = PersonalTable.GG.GetFormeEntry(species, form); var pi = PersonalTable.GG.GetFormEntry(species, form);
r.AddRange(Legal.TMHM_GG.Where((_, m) => pi.TMHM[m])); r.AddRange(Legal.TMHM_GG.Where((_, m) => pi.TMHM[m]));
} }
@ -433,7 +433,7 @@ namespace PKHeX.Core
{ {
if (species > Legal.MaxSpeciesID_8) if (species > Legal.MaxSpeciesID_8)
return; return;
var pi = PersonalTable.SWSH.GetFormeEntry(species, form); var pi = PersonalTable.SWSH.GetFormEntry(species, form);
var tmhm = pi.TMHM; var tmhm = pi.TMHM;
for (int i = 0; i < 100; i++) for (int i = 0; i < 100; i++)
{ {

View file

@ -81,7 +81,7 @@ namespace PKHeX.Core
private static GameVersion GetIsTutor4(int species, int form, int move) private static GameVersion GetIsTutor4(int species, int form, int move)
{ {
var pi = PersonalTable.HGSS.GetFormeEntry(species, form); var pi = PersonalTable.HGSS.GetFormEntry(species, form);
for (int i = 0; i < Tutors_4.Length; i++) for (int i = 0; i < Tutors_4.Length; i++)
{ {
if (Tutors_4[i] == move && pi.TypeTutors[i]) if (Tutors_4[i] == move && pi.TypeTutors[i])
@ -99,7 +99,7 @@ namespace PKHeX.Core
private static GameVersion GetIsTutor5(PKM pkm, int species, int form, bool specialTutors, int move) private static GameVersion GetIsTutor5(PKM pkm, int species, int form, bool specialTutors, int move)
{ {
var pi = PersonalTable.B2W2.GetFormeEntry(species, form); var pi = PersonalTable.B2W2.GetFormEntry(species, form);
var arr = TypeTutor6; var arr = TypeTutor6;
for (int i = 0; i < arr.Length; i++) for (int i = 0; i < arr.Length; i++)
{ {
@ -125,7 +125,7 @@ namespace PKHeX.Core
private static GameVersion GetIsTutor6(PKM pkm, int species, int form, bool specialTutors, int move) private static GameVersion GetIsTutor6(PKM pkm, int species, int form, bool specialTutors, int move)
{ {
var pi = PersonalTable.AO.GetFormeEntry(species, form); var pi = PersonalTable.AO.GetFormEntry(species, form);
var arr = TypeTutor6; var arr = TypeTutor6;
for (int i = 0; i < arr.Length; i++) for (int i = 0; i < arr.Length; i++)
{ {
@ -151,7 +151,7 @@ namespace PKHeX.Core
private static GameVersion GetIsTutor7(PKM pkm, int species, int form, bool specialTutors, int move) private static GameVersion GetIsTutor7(PKM pkm, int species, int form, bool specialTutors, int move)
{ {
var pi = PersonalTable.USUM.GetFormeEntry(species, form); var pi = PersonalTable.USUM.GetFormEntry(species, form);
var arr = TypeTutor6; var arr = TypeTutor6;
for (int i = 0; i < arr.Length; i++) for (int i = 0; i < arr.Length; i++)
{ {
@ -174,7 +174,7 @@ namespace PKHeX.Core
private static GameVersion GetIsTutor8(PKM pkm, int species, int form, bool specialTutors, int move) private static GameVersion GetIsTutor8(PKM pkm, int species, int form, bool specialTutors, int move)
{ {
var pi = (PersonalInfoSWSH)PersonalTable.SWSH.GetFormeEntry(species, form); var pi = (PersonalInfoSWSH)PersonalTable.SWSH.GetFormEntry(species, form);
var arr = TypeTutor8; var arr = TypeTutor8;
for (int i = 0; i < arr.Length; i++) for (int i = 0; i < arr.Length; i++)
{ {
@ -241,7 +241,7 @@ namespace PKHeX.Core
private static void AddMovesTutor4(List<int> moves, int species, int form) private static void AddMovesTutor4(List<int> moves, int species, int form)
{ {
var pi = PersonalTable.HGSS.GetFormeEntry(species, form); var pi = PersonalTable.HGSS.GetFormEntry(species, form);
moves.AddRange(Tutors_4.Where((_, i) => pi.TypeTutors[i])); moves.AddRange(Tutors_4.Where((_, i) => pi.TypeTutors[i]));
moves.AddRange(SpecialTutors_4.Where((_, i) => SpecialTutors_Compatibility_4[i].Any(e => e == species))); moves.AddRange(SpecialTutors_4.Where((_, i) => SpecialTutors_Compatibility_4[i].Any(e => e == species)));
} }
@ -251,7 +251,7 @@ namespace PKHeX.Core
var pi = PersonalTable.B2W2[species]; var pi = PersonalTable.B2W2[species];
moves.AddRange(TypeTutor6.Where((_, i) => pi.TypeTutors[i])); moves.AddRange(TypeTutor6.Where((_, i) => pi.TypeTutors[i]));
if (pkm.InhabitedGeneration(5) && specialTutors) if (pkm.InhabitedGeneration(5) && specialTutors)
moves.AddRange(GetTutors(PersonalTable.B2W2.GetFormeEntry(species, form), Tutors_B2W2)); moves.AddRange(GetTutors(PersonalTable.B2W2.GetFormEntry(species, form), Tutors_B2W2));
} }
private static void AddMovesTutor6(List<int> moves, int species, int form, PKM pkm, bool specialTutors) private static void AddMovesTutor6(List<int> moves, int species, int form, PKM pkm, bool specialTutors)
@ -259,14 +259,14 @@ namespace PKHeX.Core
var pi = PersonalTable.AO[species]; var pi = PersonalTable.AO[species];
moves.AddRange(TypeTutor6.Where((_, i) => pi.TypeTutors[i])); moves.AddRange(TypeTutor6.Where((_, i) => pi.TypeTutors[i]));
if (specialTutors && pkm.HasVisitedORAS(species)) if (specialTutors && pkm.HasVisitedORAS(species))
moves.AddRange(GetTutors(PersonalTable.AO.GetFormeEntry(species, form), Tutors_AO)); moves.AddRange(GetTutors(PersonalTable.AO.GetFormEntry(species, form), Tutors_AO));
} }
private static void AddMovesTutor7(List<int> moves, int species, int form, PKM pkm, bool specialTutors) private static void AddMovesTutor7(List<int> moves, int species, int form, PKM pkm, bool specialTutors)
{ {
if (pkm.GG) if (pkm.GG)
return; return;
var pi = PersonalTable.USUM.GetFormeEntry(species, form); var pi = PersonalTable.USUM.GetFormEntry(species, form);
moves.AddRange(TypeTutor6.Where((_, i) => pi.TypeTutors[i])); moves.AddRange(TypeTutor6.Where((_, i) => pi.TypeTutors[i]));
if (specialTutors && pkm.HasVisitedUSUM(species)) if (specialTutors && pkm.HasVisitedUSUM(species))
moves.AddRange(GetTutors(pi, Tutors_USUM)); moves.AddRange(GetTutors(pi, Tutors_USUM));
@ -274,7 +274,7 @@ namespace PKHeX.Core
private static void AddMovesTutor8(List<int> moves, int species, int form, PKM pkm, bool specialTutors) private static void AddMovesTutor8(List<int> moves, int species, int form, PKM pkm, bool specialTutors)
{ {
var pi = (PersonalInfoSWSH)PersonalTable.SWSH.GetFormeEntry(species, form); var pi = (PersonalInfoSWSH)PersonalTable.SWSH.GetFormEntry(species, form);
if (!pi.IsPresentInGame) if (!pi.IsPresentInGame)
return; return;
moves.AddRange(TypeTutor8.Where((_, i) => pi.TypeTutors[i])); moves.AddRange(TypeTutor8.Where((_, i) => pi.TypeTutors[i]));
@ -305,15 +305,15 @@ namespace PKHeX.Core
r.Add(547); // Relic Song r.Add(547); // Relic Song
break; break;
case (int)Species.Pikachu when Generation == 6 && pkm.Format == 6: case (int)Species.Pikachu when Generation == 6 && pkm.Format == 6:
int index = pkm.AltForm - 1; int index = pkm.Form - 1;
if ((uint)index < CosplayPikachuMoves.Length) if ((uint)index < CosplayPikachuMoves.Length)
r.Add(CosplayPikachuMoves[index]); r.Add(CosplayPikachuMoves[index]);
break; break;
case (int)Species.Pikachu when Generation == 7 && pkm.AltForm == 8: case (int)Species.Pikachu when Generation == 7 && pkm.Form == 8:
r.AddRange(Tutor_StarterPikachu); r.AddRange(Tutor_StarterPikachu);
break; break;
case (int)Species.Eevee when Generation == 7 && pkm.AltForm == 1: case (int)Species.Eevee when Generation == 7 && pkm.Form == 1:
r.AddRange(Tutor_StarterEevee); r.AddRange(Tutor_StarterEevee);
break; break;
@ -333,17 +333,17 @@ namespace PKHeX.Core
{ {
case (int)Species.Rotom when Generation >= 4: case (int)Species.Rotom when Generation >= 4:
var formMoves = RotomMoves; var formMoves = RotomMoves;
var form = pkm.AltForm - 1; var form = pkm.Form - 1;
if ((uint)form < formMoves.Length) if ((uint)form < formMoves.Length)
r.Add(RotomMoves[form]); r.Add(RotomMoves[form]);
break; break;
case (int)Species.Zygarde when Generation == 7: case (int)Species.Zygarde when Generation == 7:
r.AddRange(ZygardeMoves); r.AddRange(ZygardeMoves);
break; break;
case (int)Species.Necrozma when pkm.AltForm == 1: // Sun case (int)Species.Necrozma when pkm.Form == 1: // Sun
r.Add(713); r.Add(713);
break; break;
case (int)Species.Necrozma when pkm.AltForm == 2: // Moon case (int)Species.Necrozma when pkm.Form == 2: // Moon
r.Add(714); r.Add(714);
break; break;
} }

View file

@ -20,7 +20,7 @@ namespace PKHeX.Core
// gather possible nature determination seeds until a same-nature PID breaks the unrolling // gather possible nature determination seeds until a same-nature PID breaks the unrolling
var seeds = pk.Species == (int)Species.Unown && pk.FRLG // reversed await case var seeds = pk.Species == (int)Species.Unown && pk.FRLG // reversed await case
? SeedInfo.GetSeedsUntilUnownForm(pidiv, info, pk.AltForm) ? SeedInfo.GetSeedsUntilUnownForm(pidiv, info, pk.Form)
: SeedInfo.GetSeedsUntilNature(pidiv, info); : SeedInfo.GetSeedsUntilNature(pidiv, info);
var frames = pidiv.Type == PIDType.CuteCharm var frames = pidiv.Type == PIDType.CuteCharm

View file

@ -6,7 +6,7 @@ namespace PKHeX.Core
{ {
public static bool Verify<T>(this T raid, PK8 pk8, ulong seed) where T: EncounterStatic8Nest<T> public static bool Verify<T>(this T raid, PK8 pk8, ulong seed) where T: EncounterStatic8Nest<T>
{ {
var pi = PersonalTable.SWSH.GetFormeEntry(raid.Species, raid.Form); var pi = PersonalTable.SWSH.GetFormEntry(raid.Species, raid.Form);
var ratio = pi.Gender; var ratio = pi.Gender;
var abil = RemapAbilityToParam(raid.Ability); var abil = RemapAbilityToParam(raid.Ability);
var IVs = raid.IVs.Count == 0 ? GetBlankIVTemplate() : PKX.ReorderSpeedLast((int[])((int[])raid.IVs).Clone()); var IVs = raid.IVs.Count == 0 ? GetBlankIVTemplate() : PKX.ReorderSpeedLast((int[])((int[])raid.IVs).Clone());
@ -17,8 +17,8 @@ namespace PKHeX.Core
{ {
// Ensure the species-form is set correctly (nature) // Ensure the species-form is set correctly (nature)
pk8.Species = raid.Species; pk8.Species = raid.Species;
pk8.AltForm = raid.Form; pk8.Form = raid.Form;
var pi = PersonalTable.SWSH.GetFormeEntry(raid.Species, raid.Form); var pi = PersonalTable.SWSH.GetFormEntry(raid.Species, raid.Form);
var ratio = pi.Gender; var ratio = pi.Gender;
var abil = RemapAbilityToParam(raid.Ability); var abil = RemapAbilityToParam(raid.Ability);
var IVs = raid.IVs.Count == 0 ? GetBlankIVTemplate() : PKX.ReorderSpeedLast((int[])((int[])raid.IVs).Clone()); var IVs = raid.IVs.Count == 0 ? GetBlankIVTemplate() : PKX.ReorderSpeedLast((int[])((int[])raid.IVs).Clone());
@ -142,14 +142,14 @@ namespace PKHeX.Core
if (nature_param == -1) if (nature_param == -1)
{ {
if (pk.Species == (int) Species.Toxtricity && pk.AltForm == 0) if (pk.Species == (int) Species.Toxtricity && pk.Form == 0)
{ {
var table = Nature0; var table = Nature0;
var choice = table[rng.NextInt((uint)table.Length)]; var choice = table[rng.NextInt((uint)table.Length)];
if (pk.Nature != choice) if (pk.Nature != choice)
return false; return false;
} }
else if (pk.Species == (int) Species.Toxtricity && pk.AltForm == 1) else if (pk.Species == (int) Species.Toxtricity && pk.Form == 1)
{ {
var table = Nature1; var table = Nature1;
var choice = table[rng.NextInt((uint)table.Length)]; var choice = table[rng.NextInt((uint)table.Length)];
@ -267,12 +267,12 @@ namespace PKHeX.Core
int nature; int nature;
if (nature_param == -1) if (nature_param == -1)
{ {
if (pk.Species == (int)Species.Toxtricity && pk.AltForm == 0) if (pk.Species == (int)Species.Toxtricity && pk.Form == 0)
{ {
var table = Nature0; var table = Nature0;
nature = table[rng.NextInt((uint)table.Length)]; nature = table[rng.NextInt((uint)table.Length)];
} }
else if (pk.Species == (int)Species.Toxtricity && pk.AltForm == 1) else if (pk.Species == (int)Species.Toxtricity && pk.Form == 1)
{ {
var table = Nature1; var table = Nature1;
nature = table[rng.NextInt((uint)table.Length)]; nature = table[rng.NextInt((uint)table.Length)];

View file

@ -74,7 +74,7 @@ namespace PKHeX
{ {
var result = new int[moves.Count]; var result = new int[moves.Count];
int index = PersonalTable.RB.GetFormeIndex(species, 0); int index = PersonalTable.RB.GetFormIndex(species, 0);
if (index == 0) if (index == 0)
return result; return result;

View file

@ -80,7 +80,7 @@ namespace PKHeX.Core
// Store repeatedly accessed values // Store repeatedly accessed values
Game = (GameVersion)pkm.Version; Game = (GameVersion)pkm.Version;
Generation = pkm.GenNumber; Generation = pkm.Generation;
} }
/// <summary>List of all near-matches that were rejected for a given reason.</summary> /// <summary>List of all near-matches that were rejected for a given reason.</summary>

View file

@ -6,7 +6,7 @@ namespace PKHeX.Core
/// <summary> /// <summary>
/// Contains logic for Alternate Form information. /// Contains logic for Alternate Form information.
/// </summary> /// </summary>
public static class AltFormInfo public static class FormInfo
{ {
/// <summary> /// <summary>
/// Checks if the form cannot exist outside of a Battle. /// Checks if the form cannot exist outside of a Battle.
@ -244,8 +244,8 @@ namespace PKHeX.Core
/// <param name="species">Entity species</param> /// <param name="species">Entity species</param>
/// <param name="form">Entity form</param> /// <param name="form">Entity form</param>
/// <param name="format">Current generation format</param> /// <param name="format">Current generation format</param>
/// <seealso cref="HasFormeValuesNotIndicatedByPersonal"/> /// <seealso cref="HasFormValuesNotIndicatedByPersonal"/>
public static bool IsValidOutOfBoundsForme(int species, int form, int format) public static bool IsValidOutOfBoundsForm(int species, int form, int format)
{ {
return (Species) species switch return (Species) species switch
{ {
@ -260,28 +260,28 @@ namespace PKHeX.Core
} }
/// <summary> /// <summary>
/// Checks if the <see cref="PKM"/> data should have a drop-down selection visible for the <see cref="PKM.AltForm"/> value. /// Checks if the <see cref="PKM"/> data should have a drop-down selection visible for the <see cref="PKM.Form"/> value.
/// </summary> /// </summary>
/// <param name="pi">Game specific personal info</param> /// <param name="pi">Game specific personal info</param>
/// <param name="species"><see cref="Species"/> ID</param> /// <param name="species"><see cref="Species"/> ID</param>
/// <param name="format"><see cref="PKM.AltForm"/> ID</param> /// <param name="format"><see cref="PKM.Form"/> ID</param>
/// <returns>True if has formes that can be provided by <see cref="FormConverter.GetFormList"/>, otherwise false for none.</returns> /// <returns>True if has formes that can be provided by <see cref="FormConverter.GetFormList"/>, otherwise false for none.</returns>
public static bool HasFormSelection(PersonalInfo pi, int species, int format) public static bool HasFormSelection(PersonalInfo pi, int species, int format)
{ {
if (format <= 3 && species != (int)Unown) if (format <= 3 && species != (int)Unown)
return false; return false;
if (HasFormeValuesNotIndicatedByPersonal.Contains(species)) if (HasFormValuesNotIndicatedByPersonal.Contains(species))
return true; return true;
int count = pi.FormeCount; int count = pi.FormCount;
return count > 1; return count > 1;
} }
/// <summary> /// <summary>
/// <seealso cref="IsValidOutOfBoundsForme"/> /// <seealso cref="IsValidOutOfBoundsForm"/>
/// </summary> /// </summary>
private static readonly HashSet<int> HasFormeValuesNotIndicatedByPersonal = new HashSet<int> private static readonly HashSet<int> HasFormValuesNotIndicatedByPersonal = new HashSet<int>
{ {
(int)Unown, (int)Unown,
(int)Mothim, // (Burmy forme carried over, not cleared) (int)Mothim, // (Burmy forme carried over, not cleared)

View file

@ -68,7 +68,7 @@ namespace PKHeX.Core
} }
var enc = data.EncounterMatch; var enc = data.EncounterMatch;
if (enc is MysteryGift g && g.Format >= 4) if (enc is MysteryGift g && g.Generation >= 4)
return VerifyAbilityMG(data, g, abilities); return VerifyAbilityMG(data, g, abilities);
if (format < 6) if (format < 6)

View file

@ -201,7 +201,7 @@ namespace PKHeX.Core
{ {
if (!Legal.Inherit_Apricorn7.Contains(species)) if (!Legal.Inherit_Apricorn7.Contains(species))
return GetInvalid(LBallSpecies); return GetInvalid(LBallSpecies);
if (Legal.Ban_NoHidden7Apricorn.Contains(species | pkm.AltForm << 11) && IsHiddenAndNotPossible(pkm)) if (Legal.Ban_NoHidden7Apricorn.Contains(species | pkm.Form << 11) && IsHiddenAndNotPossible(pkm))
return GetInvalid(LBallAbility); return GetInvalid(LBallAbility);
return GetValid(LBallSpeciesPass); return GetValid(LBallSpeciesPass);
} }
@ -234,7 +234,7 @@ namespace PKHeX.Core
if (ball == Beast) if (ball == Beast)
{ {
if (species == (int)Species.Flabébé && pkm.AltForm == 3 && IsHiddenAndNotPossible(pkm)) if (species == (int)Species.Flabébé && pkm.Form == 3 && IsHiddenAndNotPossible(pkm))
return GetInvalid(LBallAbility); // Can't obtain Flabébé-Blue with Hidden Ability in wild return GetInvalid(LBallAbility); // Can't obtain Flabébé-Blue with Hidden Ability in wild
if (species == (int)Species.Voltorb && IsHiddenAndNotPossible(pkm)) if (species == (int)Species.Voltorb && IsHiddenAndNotPossible(pkm))
return GetInvalid(LBallAbility); // Can't obtain with Hidden Ability in wild (can only breed with Ditto) return GetInvalid(LBallAbility); // Can't obtain with Hidden Ability in wild (can only breed with Ditto)
@ -285,7 +285,7 @@ namespace PKHeX.Core
{ {
if (!Legal.Inherit_Apricorn7.Contains(species)) if (!Legal.Inherit_Apricorn7.Contains(species))
return GetInvalid(LBallSpecies); return GetInvalid(LBallSpecies);
if (Legal.Ban_NoHidden8Apricorn.Contains(species | pkm.AltForm << 11) && IsHiddenAndNotPossible(pkm)) // lineage is 3->2->origin if (Legal.Ban_NoHidden8Apricorn.Contains(species | pkm.Form << 11) && IsHiddenAndNotPossible(pkm)) // lineage is 3->2->origin
return GetInvalid(LBallAbility); return GetInvalid(LBallAbility);
return GetValid(LBallSpeciesPass); return GetValid(LBallSpeciesPass);
} }
@ -318,7 +318,7 @@ namespace PKHeX.Core
if (ball == Beast) if (ball == Beast)
{ {
if (species == (int)Species.Flabébé && pkm.AltForm == 3 && IsHiddenAndNotPossible(pkm)) if (species == (int)Species.Flabébé && pkm.Form == 3 && IsHiddenAndNotPossible(pkm))
return GetInvalid(LBallAbility); // Can't obtain Flabébé-Blue with Hidden Ability in wild return GetInvalid(LBallAbility); // Can't obtain Flabébé-Blue with Hidden Ability in wild
if (((int)Species.Pikipek <= species && species <= (int)Species.Kommoo) || (Legal.AlolanCaptureOffspring.Contains(species) && !Legal.PastGenAlolanNativesUncapturable.Contains(species))) if (((int)Species.Pikipek <= species && species <= (int)Species.Kommoo) || (Legal.AlolanCaptureOffspring.Contains(species) && !Legal.PastGenAlolanNativesUncapturable.Contains(species)))
return GetValid(LBallSpeciesPass); return GetValid(LBallSpeciesPass);
@ -353,7 +353,7 @@ namespace PKHeX.Core
// Everything breed-able that is in the Galar Dex can be captured in-game. // Everything breed-able that is in the Galar Dex can be captured in-game.
var pt = PersonalTable.SWSH; var pt = PersonalTable.SWSH;
var pi = (PersonalInfoSWSH) pt.GetFormeEntry(species, 0); var pi = (PersonalInfoSWSH) pt.GetFormEntry(species, 0);
if (pi.IsInDex) if (pi.IsInDex)
return true; return true;

View file

@ -5,7 +5,7 @@ using static PKHeX.Core.LegalityCheckStrings;
namespace PKHeX.Core namespace PKHeX.Core
{ {
/// <summary> /// <summary>
/// Verifies the <see cref="PKM.AltForm"/> value. /// Verifies the <see cref="PKM.Form"/> value.
/// </summary> /// </summary>
public sealed class FormVerifier : Verifier public sealed class FormVerifier : Verifier
{ {
@ -30,8 +30,8 @@ namespace PKHeX.Core
var pkm = data.pkm; var pkm = data.pkm;
var PersonalInfo = data.PersonalInfo; var PersonalInfo = data.PersonalInfo;
int count = PersonalInfo.FormeCount; int count = PersonalInfo.FormCount;
var form = pkm.AltForm; var form = pkm.Form;
if (count <= 1 && form == 0) if (count <= 1 && form == 0)
return VALID; // no forms to check return VALID; // no forms to check
@ -39,7 +39,7 @@ namespace PKHeX.Core
var EncounterMatch = data.EncounterMatch; var EncounterMatch = data.EncounterMatch;
var Info = data.Info; var Info = data.Info;
if (!PersonalInfo.IsFormeWithinRange(form) && !AltFormInfo.IsValidOutOfBoundsForme(species, form, Info.Generation)) if (!PersonalInfo.IsFormWithinRange(form) && !FormInfo.IsValidOutOfBoundsForm(species, form, Info.Generation))
return GetInvalid(string.Format(LFormInvalidRange, count - 1, form)); return GetInvalid(string.Format(LFormInvalidRange, count - 1, form));
if (EncounterMatch is EncounterSlot w && w.Area.Type == SlotType.FriendSafari) if (EncounterMatch is EncounterSlot w && w.Area.Type == SlotType.FriendSafari)
@ -48,7 +48,7 @@ namespace PKHeX.Core
} }
else if (EncounterMatch is EncounterEgg) else if (EncounterMatch is EncounterEgg)
{ {
if (AltFormInfo.IsTotemForm(species, form, data.Info.Generation)) if (FormInfo.IsTotemForm(species, form, data.Info.Generation))
return GetInvalid(LFormInvalidGame); return GetInvalid(LFormInvalidGame);
} }
@ -156,7 +156,7 @@ namespace PKHeX.Core
case (int)Species.Toxtricity when Info.EncounterMatch.Species == (int)Species.Toxtricity: case (int)Species.Toxtricity when Info.EncounterMatch.Species == (int)Species.Toxtricity:
{ {
// The game enforces the Nature for Toxtricity encounters too! // The game enforces the Nature for Toxtricity encounters too!
if (pkm.AltForm != EvolutionMethod.GetAmpLowKeyResult(pkm.Nature)) if (pkm.Form != EvolutionMethod.GetAmpLowKeyResult(pkm.Nature))
return GetInvalid(LFormInvalidNature); return GetInvalid(LFormInvalidNature);
break; break;
} }
@ -176,13 +176,13 @@ namespace PKHeX.Core
} }
var format = pkm.Format; var format = pkm.Format;
if (AltFormInfo.IsBattleOnlyForm(species, form, format)) if (FormInfo.IsBattleOnlyForm(species, form, format))
return GetInvalid(LFormBattle); return GetInvalid(LFormBattle);
if (form == 0) if (form == 0)
return VALID; return VALID;
// everything below here is currently an altform // everything below here is not Form 0, so it has a form.
if (format >= 7 && Info.Generation < 7) if (format >= 7 && Info.Generation < 7)
{ {
if (species == 25 || Legal.AlolanOriginForms.Contains(species) || Legal.AlolanVariantEvolutions12.Contains(data.EncounterOriginal.Species)) if (species == 25 || Legal.AlolanOriginForms.Contains(species) || Legal.AlolanVariantEvolutions12.Contains(data.EncounterOriginal.Species))
@ -248,18 +248,18 @@ namespace PKHeX.Core
var pkm = data.pkm; var pkm = data.pkm;
switch (pkm.Species) switch (pkm.Species)
{ {
case (int)Species.Floette when !SafariFloette.Contains(pkm.AltForm): // Floette case (int)Species.Floette when !SafariFloette.Contains(pkm.Form): // Floette
case (int)Species.Florges when !SafariFloette.Contains(pkm.AltForm): // Florges case (int)Species.Florges when !SafariFloette.Contains(pkm.Form): // Florges
data.AddLine(GetInvalid(LFormSafariFlorgesColor)); data.AddLine(GetInvalid(LFormSafariFlorgesColor));
break; break;
case 710 when pkm.AltForm != 0: // Pumpkaboo case 710 when pkm.Form != 0: // Pumpkaboo
case (int)Species.Gourgeist when pkm.AltForm != 0: // Average case (int)Species.Gourgeist when pkm.Form != 0: // Average
data.AddLine(GetInvalid(LFormSafariPumpkabooAverage)); data.AddLine(GetInvalid(LFormSafariPumpkabooAverage));
break; break;
case (int)Species.Gastrodon when pkm.AltForm != 0: // West case (int)Species.Gastrodon when pkm.Form != 0: // West
data.AddLine(GetInvalid(LFormSafariFlorgesColor)); data.AddLine(GetInvalid(LFormSafariFlorgesColor));
break; break;
case (int)Species.Sawsbuck when pkm.AltForm != 0: // Sawsbuck case (int)Species.Sawsbuck when pkm.Form != 0: // Sawsbuck
data.AddLine(GetInvalid(LFormSafariSawsbuckSpring)); data.AddLine(GetInvalid(LFormSafariSawsbuckSpring));
break; break;
} }
@ -280,9 +280,9 @@ namespace PKHeX.Core
{ {
if (arg > 5) if (arg > 5)
return GetInvalid(LFormArgumentHigh); return GetInvalid(LFormArgumentHigh);
if (arg == 0 && pkm.AltForm != 0) if (arg == 0 && pkm.Form != 0)
return GetInvalid(LFormArgumentNotAllowed); return GetInvalid(LFormArgumentNotAllowed);
if (arg != 0 && pkm.AltForm == 0) if (arg != 0 && pkm.Form == 0)
return GetInvalid(LFormArgumentNotAllowed); return GetInvalid(LFormArgumentNotAllowed);
break; break;
} }
@ -290,13 +290,13 @@ namespace PKHeX.Core
{ {
if (arg > 3) if (arg > 3)
return GetInvalid(LFormArgumentHigh); return GetInvalid(LFormArgumentHigh);
if (arg == 0 && pkm.AltForm != 0) if (arg == 0 && pkm.Form != 0)
return GetInvalid(LFormArgumentNotAllowed); return GetInvalid(LFormArgumentNotAllowed);
if (arg != 0 && pkm.AltForm == 0) if (arg != 0 && pkm.Form == 0)
return GetInvalid(LFormArgumentNotAllowed); return GetInvalid(LFormArgumentNotAllowed);
break; break;
} }
case (int)Species.Yamask when pkm.AltForm == 1: case (int)Species.Yamask when pkm.Form == 1:
{ {
if (pkm.IsEgg) if (pkm.IsEgg)
{ {

View file

@ -36,7 +36,7 @@ namespace PKHeX.Core
switch (memory.MemoryID) switch (memory.MemoryID)
{ {
// {0} saw {2} carrying {1} on its back. {4} that {3}. // {0} saw {2} carrying {1} on its back. {4} that {3}.
case 21 when gen != 6 || !Legal.GetCanLearnMachineMove(new PK6 {Species = memory.Variable, EXP = Experience.GetEXP(100, PersonalTable.XY.GetFormeIndex(memory.Variable, 0))}, 19, 6): case 21 when gen != 6 || !Legal.GetCanLearnMachineMove(new PK6 {Species = memory.Variable, EXP = Experience.GetEXP(100, PersonalTable.XY.GetFormIndex(memory.Variable, 0))}, 19, 6):
return GetInvalid(string.Format(LMemoryArgBadMove, memory.Handler)); return GetInvalid(string.Format(LMemoryArgBadMove, memory.Handler));
case 16 when memory.Variable == 0 && !Legal.GetCanKnowMove(pkm, gen, memory.Variable, info.EvoChainsAllGens[gen]): case 16 when memory.Variable == 0 && !Legal.GetCanKnowMove(pkm, gen, memory.Variable, info.EvoChainsAllGens[gen]):

View file

@ -183,7 +183,7 @@ namespace PKHeX.Core
return; // Can have either state return; // Can have either state
VerifyWC3Shiny(data, w); VerifyWC3Shiny(data, w);
break; break;
case MysteryGift g when g.Format != 3: // WC3 case MysteryGift g when g.Generation != 3: // WC3
VerifyReceivability(data, g); VerifyReceivability(data, g);
VerifyFatefulMysteryGift(data, g); VerifyFatefulMysteryGift(data, g);
return; return;
@ -302,7 +302,7 @@ namespace PKHeX.Core
// No point using the evolution tree. Just handle certain species. // No point using the evolution tree. Just handle certain species.
switch (pkm.Species) switch (pkm.Species)
{ {
case (int)Species.Lycanroc when pkm.Format == 7 && ((pkm.AltForm == 0 && Moon()) || (pkm.AltForm == 1 && Sun())): case (int)Species.Lycanroc when pkm.Format == 7 && ((pkm.Form == 0 && Moon()) || (pkm.Form == 1 && Sun())):
case (int)Species.Solgaleo when Moon(): case (int)Species.Solgaleo when Moon():
case (int)Species.Lunala when Sun(): case (int)Species.Lunala when Sun():
bool Sun() => (pkm.Version & 1) == 0; bool Sun() => (pkm.Version & 1) == 0;
@ -374,7 +374,7 @@ namespace PKHeX.Core
return Math.Abs(ia - ib) <= 7; return Math.Abs(ia - ib) <= 7;
} }
private static bool IsStarter(PKM pb7) => (pb7.Species == (int)Species.Pikachu && pb7.AltForm == 8) || (pb7.Species == (int)Species.Eevee && pb7.AltForm == 1); private static bool IsStarter(PKM pb7) => (pb7.Species == (int)Species.Pikachu && pb7.Form == 8) || (pb7.Species == (int)Species.Eevee && pb7.Form == 1);
private void VerifySWSHStats(LegalityAnalysis data, PK8 pk8) private void VerifySWSHStats(LegalityAnalysis data, PK8 pk8)
{ {
@ -400,7 +400,7 @@ namespace PKHeX.Core
bool originGMax = enc is IGigantamax g && g.CanGigantamax; bool originGMax = enc is IGigantamax g && g.CanGigantamax;
if (originGMax != pk8.CanGigantamax) if (originGMax != pk8.CanGigantamax)
{ {
bool ok = !pk8.IsEgg && pk8.CanToggleGigantamax(pk8.Species, pk8.AltForm, enc.Species, enc.Form); bool ok = !pk8.IsEgg && pk8.CanToggleGigantamax(pk8.Species, pk8.Form, enc.Species, enc.Form);
var chk = ok ? GetValid(LStatGigantamaxValid) : GetInvalid(LStatGigantamaxInvalid); var chk = ok ? GetValid(LStatGigantamaxValid) : GetInvalid(LStatGigantamaxInvalid);
data.AddLine(chk); data.AddLine(chk);
} }
@ -424,7 +424,7 @@ namespace PKHeX.Core
// Calyrex-0 cannot reacquire the move via relearner, even though the TR is checked off in the TR list. // Calyrex-0 cannot reacquire the move via relearner, even though the TR is checked off in the TR list.
if (pk8.Species == (int) Species.Calyrex) if (pk8.Species == (int) Species.Calyrex)
{ {
var form = pk8.AltForm; var form = pk8.Form;
// Check if another alt form can learn the TR // Check if another alt form can learn the TR
if ((form != 1 && CanLearnTR((int) Species.Calyrex, 1, i)) || (form != 2 && CanLearnTR((int) Species.Calyrex, 2, i))) if ((form != 1 && CanLearnTR((int) Species.Calyrex, 1, i)) || (form != 2 && CanLearnTR((int) Species.Calyrex, 2, i)))
continue; continue;
@ -438,7 +438,7 @@ namespace PKHeX.Core
private static bool CanLearnTR(int species, int form, int tr) private static bool CanLearnTR(int species, int form, int tr)
{ {
var pi = PersonalTable.SWSH.GetFormeEntry(species, form); var pi = PersonalTable.SWSH.GetFormEntry(species, form);
return pi.TMHM[tr + 100]; return pi.TMHM[tr + 100];
} }
} }

View file

@ -109,7 +109,7 @@ namespace PKHeX.Core
if (pkm is IRibbonSetUnique4 u4) if (pkm is IRibbonSetUnique4 u4)
{ {
if (!IsAllowedBattleFrontier(pkm.Species, pkm.AltForm, 4) || gen > 4) if (!IsAllowedBattleFrontier(pkm.Species, pkm.Form, 4) || gen > 4)
{ {
foreach (var z in GetInvalidRibbonsNone(u4.RibbonBitsAbility(), u4.RibbonNamesAbility())) foreach (var z in GetInvalidRibbonsNone(u4.RibbonBitsAbility(), u4.RibbonNamesAbility()))
yield return z; yield return z;

View file

@ -122,7 +122,7 @@ namespace PKHeX.Core
{ {
var pkm = data.pkm; var pkm = data.pkm;
int species = pkm.Species; int species = pkm.Species;
var pi = (PersonalInfoSWSH)PersonalTable.SWSH.GetFormeEntry(species, pkm.AltForm); var pi = (PersonalInfoSWSH)PersonalTable.SWSH.GetFormEntry(species, pkm.Form);
if (!pi.IsPresentInGame) // Can't transfer if (!pi.IsPresentInGame) // Can't transfer
{ {
data.AddLine(GetInvalid(LTransferBad)); data.AddLine(GetInvalid(LTransferBad));
@ -136,11 +136,11 @@ namespace PKHeX.Core
} }
else if (enc.Generation < 8 && pkm.Format >= 8) else if (enc.Generation < 8 && pkm.Format >= 8)
{ {
if (enc is EncounterStatic7 s && AltFormInfo.IsTotemForm(s.Species, s.Form, 7)) if (enc is EncounterStatic7 s && FormInfo.IsTotemForm(s.Species, s.Form, 7))
{ {
if (Legal.Totem_NoTransfer.Contains(s.Species)) if (Legal.Totem_NoTransfer.Contains(s.Species))
data.AddLine(GetInvalid(LTransferBad)); data.AddLine(GetInvalid(LTransferBad));
if (pkm.AltForm != AltFormInfo.GetTotemBaseForm(s.Species, s.Form)) if (pkm.Form != FormInfo.GetTotemBaseForm(s.Species, s.Form))
data.AddLine(GetInvalid(LTransferBad)); data.AddLine(GetInvalid(LTransferBad));
} }
@ -197,7 +197,7 @@ namespace PKHeX.Core
} }
else if (pkm.Species == (int)Species.Unown) else if (pkm.Species == (int)Species.Unown)
{ {
if (pkm.AltForm != 8 && pkm.AltForm != 21 && pkm.IsShiny) // impossibly form-shiny (not I or V) if (pkm.Form != 8 && pkm.Form != 21 && pkm.IsShiny) // impossibly form-shiny (not I or V)
yield return GetInvalid(LEncStaticPIDShiny, CheckIdentifier.PID); yield return GetInvalid(LEncStaticPIDShiny, CheckIdentifier.PID);
} }
} }

View file

@ -125,7 +125,7 @@ namespace PKHeX.Core
public string Extension => GetType().Name.ToLower(); public string Extension => GetType().Name.ToLower();
public string FileName => $"{CardHeader}.{Extension}"; public string FileName => $"{CardHeader}.{Extension}";
public abstract int Format { get; } public abstract int Generation { get; }
public PKM ConvertToPKM(ITrainerInfo sav) => ConvertToPKM(sav, EncounterCriteria.Unrestricted); public PKM ConvertToPKM(ITrainerInfo sav) => ConvertToPKM(sav, EncounterCriteria.Unrestricted);
public abstract PKM ConvertToPKM(ITrainerInfo sav, EncounterCriteria criteria); public abstract PKM ConvertToPKM(ITrainerInfo sav, EncounterCriteria criteria);
@ -165,7 +165,7 @@ namespace PKHeX.Core
public virtual GameVersion Version public virtual GameVersion Version
{ {
get => GameUtil.GetVersion(Format); get => GameUtil.GetVersion(Generation);
set { } set { }
} }
@ -210,7 +210,6 @@ namespace PKHeX.Core
public int LevelMax => Level; public int LevelMax => Level;
public abstract int Ball { get; set; } public abstract int Ball { get; set; }
public virtual bool EggEncounter => IsEgg; public virtual bool EggEncounter => IsEgg;
public int Generation => Format;
public abstract int EggLocation { get; set; } public abstract int EggLocation { get; set; }
public int TrainerID7 => (int)((uint)(TID | (SID << 16)) % 1000000); public int TrainerID7 => (int)((uint)(TID | (SID << 16)) % 1000000);

View file

@ -96,7 +96,7 @@ namespace PKHeX.Core
private static void AddLinesPKM(MysteryGift gift, IBasicStrings strings, ICollection<string> result) private static void AddLinesPKM(MysteryGift gift, IBasicStrings strings, ICollection<string> result)
{ {
var id = gift.Format < 7 ? $"{gift.TID:D5}/{gift.SID:D5}" : $"[{gift.TrainerSID7:D4}]{gift.TrainerID7:D6}"; var id = gift.Generation < 7 ? $"{gift.TID:D5}/{gift.SID:D5}" : $"[{gift.TrainerSID7:D4}]{gift.TrainerID7:D6}";
var first = var first =
$"{strings.Species[gift.Species]} @ {strings.Item[gift.HeldItem]} --- " $"{strings.Species[gift.Species]} @ {strings.Item[gift.HeldItem]} --- "
@ -121,7 +121,7 @@ namespace PKHeX.Core
/// <returns>True if compatible, false if incompatible.</returns> /// <returns>True if compatible, false if incompatible.</returns>
public static bool IsCardCompatible(this MysteryGift g, SaveFile sav, out string message) public static bool IsCardCompatible(this MysteryGift g, SaveFile sav, out string message)
{ {
if (g.Format != sav.Generation) if (g.Generation != sav.Generation)
{ {
message = MsgMysteryGiftSlotSpecialReject; message = MsgMysteryGiftSlotSpecialReject;
return false; return false;

View file

@ -15,7 +15,7 @@ namespace PKHeX.Core
public sealed class PCD : DataMysteryGift, IRibbonSetEvent3, IRibbonSetEvent4 public sealed class PCD : DataMysteryGift, IRibbonSetEvent3, IRibbonSetEvent4
{ {
public const int Size = 0x358; // 856 public const int Size = 0x358; // 856
public override int Format => 4; public override int Generation => 4;
public override int Level public override int Level
{ {
@ -157,7 +157,7 @@ namespace PKHeX.Core
return false; return false;
} }
if (wc.AltForm != evo.Form && !AltFormInfo.IsFormChangeable(wc.Species, wc.AltForm, pkm.AltForm, pkm.Format)) if (wc.Form != evo.Form && !FormInfo.IsFormChangeable(wc.Species, wc.Form, pkm.Form, pkm.Format))
return false; return false;
if (wc.Ball != pkm.Ball) return false; if (wc.Ball != pkm.Ball) return false;

View file

@ -10,7 +10,7 @@ namespace PKHeX.Core
public sealed class PGF : DataMysteryGift, IRibbonSetEvent3, IRibbonSetEvent4, ILangNick, IContestStats, INature public sealed class PGF : DataMysteryGift, IRibbonSetEvent3, IRibbonSetEvent4, ILangNick, IContestStats, INature
{ {
public const int Size = 0xCC; public const int Size = 0xCC;
public override int Format => 5; public override int Generation => 5;
public PGF() : this(new byte[Size]) { } public PGF() : this(new byte[Size]) { }
public PGF(byte[] data) : base(data) { } public PGF(byte[] data) : base(data) { }
@ -177,14 +177,14 @@ namespace PKHeX.Core
} }
int currentLevel = Level > 0 ? Level : rnd.Next(1, 101); int currentLevel = Level > 0 ? Level : rnd.Next(1, 101);
var pi = PersonalTable.B2W2.GetFormeEntry(Species, Form); var pi = PersonalTable.B2W2.GetFormEntry(Species, Form);
PK5 pk = new PK5 PK5 pk = new PK5
{ {
Species = Species, Species = Species,
HeldItem = HeldItem, HeldItem = HeldItem,
Met_Level = currentLevel, Met_Level = currentLevel,
Nature = Nature != -1 ? Nature : rnd.Next(25), Nature = Nature != -1 ? Nature : rnd.Next(25),
AltForm = Form, Form = Form,
Version = OriginGame == 0 ? sav.Game : OriginGame, Version = OriginGame == 0 ? sav.Game : OriginGame,
Language = Language == 0 ? sav.Language : Language, Language = Language == 0 ? sav.Language : Language,
Ball = Ball, Ball = Ball,
@ -248,7 +248,7 @@ namespace PKHeX.Core
} }
pk.IsNicknamed = IsNicknamed; pk.IsNicknamed = IsNicknamed;
pk.Nickname = IsNicknamed ? Nickname : SpeciesName.GetSpeciesNameGeneration(Species, pk.Language, Format); pk.Nickname = IsNicknamed ? Nickname : SpeciesName.GetSpeciesNameGeneration(Species, pk.Language, Generation);
SetPINGA(pk, criteria); SetPINGA(pk, criteria);
@ -265,13 +265,13 @@ namespace PKHeX.Core
{ {
pk.IsEgg = true; pk.IsEgg = true;
pk.EggMetDate = Date; pk.EggMetDate = Date;
pk.Nickname = SpeciesName.GetSpeciesNameGeneration(0, pk.Language, Format); pk.Nickname = SpeciesName.GetSpeciesNameGeneration(0, pk.Language, Generation);
pk.IsNicknamed = true; pk.IsNicknamed = true;
} }
private void SetPINGA(PKM pk, EncounterCriteria criteria) private void SetPINGA(PKM pk, EncounterCriteria criteria)
{ {
var pi = PersonalTable.B2W2.GetFormeEntry(Species, Form); var pi = PersonalTable.B2W2.GetFormEntry(Species, Form);
pk.Nature = (int)criteria.GetNature((Nature)Nature); pk.Nature = (int)criteria.GetNature((Nature)Nature);
pk.Gender = pi.Genderless ? 2 : Gender != 2 ? Gender : criteria.GetGender(-1, pi); pk.Gender = pi.Genderless ? 2 : Gender != 2 ? Gender : criteria.GetGender(-1, pi);
var av = GetAbilityIndex(criteria, pi); var av = GetAbilityIndex(criteria, pi);
@ -369,7 +369,7 @@ namespace PKHeX.Core
return false; return false;
} }
if (Form != evo.Form && !AltFormInfo.IsFormChangeable(Species, Form, pkm.AltForm, pkm.Format)) if (Form != evo.Form && !FormInfo.IsFormChangeable(Species, Form, pkm.Form, pkm.Format))
return false; return false;
if (Level != pkm.Met_Level) return false; if (Level != pkm.Met_Level) return false;

View file

@ -10,7 +10,7 @@ namespace PKHeX.Core
public sealed class PGT : DataMysteryGift, IRibbonSetEvent3, IRibbonSetEvent4 public sealed class PGT : DataMysteryGift, IRibbonSetEvent3, IRibbonSetEvent4
{ {
public const int Size = 0x104; // 260 public const int Size = 0x104; // 260
public override int Format => 4; public override int Generation => 4;
public override int Level public override int Level
{ {
@ -110,7 +110,7 @@ namespace PKHeX.Core
public override int HeldItem { get => PK.HeldItem; set => PK.HeldItem = value; } public override int HeldItem { get => PK.HeldItem; set => PK.HeldItem = value; }
public override bool IsShiny => PK.IsShiny; public override bool IsShiny => PK.IsShiny;
public override int Gender { get => PK.Gender; set => PK.Gender = value; } public override int Gender { get => PK.Gender; set => PK.Gender = value; }
public override int Form { get => PK.AltForm; set => PK.AltForm = value; } public override int Form { get => PK.Form; set => PK.Form = value; }
public override int TID { get => (ushort)PK.TID; set => PK.TID = value; } public override int TID { get => (ushort)PK.TID; set => PK.TID = value; }
public override int SID { get => (ushort)PK.SID; set => PK.SID = value; } public override int SID { get => (ushort)PK.SID; set => PK.SID = value; }
public override string OT_Name { get => PK.OT_Name; set => PK.OT_Name = value; } public override string OT_Name { get => PK.OT_Name; set => PK.OT_Name = value; }
@ -231,7 +231,7 @@ namespace PKHeX.Core
{ {
pk4.IsEgg = true; pk4.IsEgg = true;
pk4.IsNicknamed = false; pk4.IsNicknamed = false;
pk4.Nickname = SpeciesName.GetSpeciesNameGeneration(0, pk4.Language, Format); pk4.Nickname = SpeciesName.GetSpeciesNameGeneration(0, pk4.Language, Generation);
pk4.EggMetDate = DateTime.Now; pk4.EggMetDate = DateTime.Now;
} }

View file

@ -14,7 +14,7 @@ namespace PKHeX.Core
public const int SizeFull = 0x310; public const int SizeFull = 0x310;
private const int CardStart = SizeFull - Size; private const int CardStart = SizeFull - Size;
public override int Format => 7; public override int Generation => 7;
public WB7() : this(new byte[SizeFull]) { } public WB7() : this(new byte[SizeFull]) { }
public WB7(byte[] data) : base(data) { } public WB7(byte[] data) : base(data) { }
@ -302,7 +302,7 @@ namespace PKHeX.Core
int currentLevel = Level > 0 ? Level : rnd.Next(1, 101); int currentLevel = Level > 0 ? Level : rnd.Next(1, 101);
int metLevel = MetLevel > 0 ? MetLevel : currentLevel; int metLevel = MetLevel > 0 ? MetLevel : currentLevel;
var pi = PersonalTable.GG.GetFormeEntry(Species, Form); var pi = PersonalTable.GG.GetFormEntry(Species, Form);
var OT = GetOT(sav.Language); var OT = GetOT(sav.Language);
var pk = new PB7 var pk = new PB7
@ -312,7 +312,7 @@ namespace PKHeX.Core
TID = TID, TID = TID,
SID = SID, SID = SID,
Met_Level = metLevel, Met_Level = metLevel,
AltForm = Form, Form = Form,
EncryptionConstant = EncryptionConstant != 0 ? EncryptionConstant : Util.Rand32(), EncryptionConstant = EncryptionConstant != 0 ? EncryptionConstant : Util.Rand32(),
Version = OriginGame != 0 ? OriginGame : sav.Game, Version = OriginGame != 0 ? OriginGame : sav.Game,
Language = sav.Language, Language = sav.Language,
@ -347,7 +347,7 @@ namespace PKHeX.Core
}; };
pk.SetMaximumPPCurrent(); pk.SetMaximumPPCurrent();
if ((sav.Generation > Format && OriginGame == 0) || !CanBeReceivedByVersion(pk.Version)) if ((sav.Generation > Generation && OriginGame == 0) || !CanBeReceivedByVersion(pk.Version))
{ {
// give random valid game // give random valid game
do { pk.Version = (int)GameVersion.GP + rnd.Next(2); } do { pk.Version = (int)GameVersion.GP + rnd.Next(2); }
@ -362,7 +362,7 @@ namespace PKHeX.Core
pk.MetDate = Date ?? DateTime.Now; pk.MetDate = Date ?? DateTime.Now;
pk.IsNicknamed = GetIsNicknamed(pk.Language); pk.IsNicknamed = GetIsNicknamed(pk.Language);
pk.Nickname = pk.IsNicknamed ? GetNickname(pk.Language) : SpeciesName.GetSpeciesNameGeneration(Species, pk.Language, Format); pk.Nickname = pk.IsNicknamed ? GetNickname(pk.Language) : SpeciesName.GetSpeciesNameGeneration(Species, pk.Language, Generation);
SetPINGA(pk, criteria); SetPINGA(pk, criteria);
@ -382,13 +382,13 @@ namespace PKHeX.Core
{ {
pk.IsEgg = true; pk.IsEgg = true;
pk.EggMetDate = Date; pk.EggMetDate = Date;
pk.Nickname = SpeciesName.GetSpeciesNameGeneration(0, pk.Language, Format); pk.Nickname = SpeciesName.GetSpeciesNameGeneration(0, pk.Language, Generation);
pk.IsNicknamed = true; pk.IsNicknamed = true;
} }
private void SetPINGA(PKM pk, EncounterCriteria criteria) private void SetPINGA(PKM pk, EncounterCriteria criteria)
{ {
var pi = PersonalTable.GG.GetFormeEntry(Species, Form); var pi = PersonalTable.GG.GetFormEntry(Species, Form);
pk.Nature = (int)criteria.GetNature((Nature)Nature); pk.Nature = (int)criteria.GetNature((Nature)Nature);
pk.Gender = criteria.GetGender(Gender, pi); pk.Gender = criteria.GetGender(Gender, pi);
var av = GetAbilityIndex(criteria, pi); var av = GetAbilityIndex(criteria, pi);
@ -471,7 +471,7 @@ namespace PKHeX.Core
if (EncryptionConstant != 0 && EncryptionConstant != pkm.EncryptionConstant) return false; if (EncryptionConstant != 0 && EncryptionConstant != pkm.EncryptionConstant) return false;
} }
if (Form != evo.Form && !AltFormInfo.IsFormChangeable(Species, Form, pkm.AltForm, pkm.Format)) if (Form != evo.Form && !FormInfo.IsFormChangeable(Species, Form, pkm.Form, pkm.Format))
return false; return false;
if (IsEgg) if (IsEgg)

View file

@ -36,7 +36,7 @@ namespace PKHeX.Core
public bool Fateful { get; set; } // Obedience Flag public bool Fateful { get; set; } // Obedience Flag
// Mystery Gift Properties // Mystery Gift Properties
public override int Format => 3; public override int Generation => 3;
public override int Level { get; set; } public override int Level { get; set; }
public override int Ball { get; set; } = 4; public override int Ball { get; set; } = 4;
public override bool IsShiny => Shiny == Shiny.Always; public override bool IsShiny => Shiny == Shiny.Always;
@ -249,7 +249,7 @@ namespace PKHeX.Core
} }
} }
if (Form != evo.Form && !AltFormInfo.IsFormChangeable(Species, Form, pkm.AltForm, pkm.Format)) if (Form != evo.Form && !FormInfo.IsFormChangeable(Species, Form, pkm.Form, pkm.Format))
return false; return false;
if (Language != -1 && Language != pkm.Language) return false; if (Language != -1 && Language != pkm.Language) return false;

View file

@ -12,7 +12,7 @@ namespace PKHeX.Core
{ {
public const int Size = 0x108; public const int Size = 0x108;
public const uint EonTicketConst = 0x225D73C2; public const uint EonTicketConst = 0x225D73C2;
public override int Format => 6; public override int Generation => 6;
public WC6() : this(new byte[Size]) { } public WC6() : this(new byte[Size]) { }
public WC6(byte[] data) : base(data) { } public WC6(byte[] data) : base(data) { }
@ -273,7 +273,7 @@ namespace PKHeX.Core
var rnd = Util.Rand; var rnd = Util.Rand;
int currentLevel = Level > 0 ? Level : rnd.Next(1, 101); int currentLevel = Level > 0 ? Level : rnd.Next(1, 101);
var pi = PersonalTable.AO.GetFormeEntry(Species, Form); var pi = PersonalTable.AO.GetFormEntry(Species, Form);
PK6 pk = new PK6 PK6 pk = new PK6
{ {
Species = Species, Species = Species,
@ -281,7 +281,7 @@ namespace PKHeX.Core
TID = TID, TID = TID,
SID = SID, SID = SID,
Met_Level = currentLevel, Met_Level = currentLevel,
AltForm = Form, Form = Form,
EncryptionConstant = EncryptionConstant != 0 ? EncryptionConstant : Util.Rand32(), EncryptionConstant = EncryptionConstant != 0 ? EncryptionConstant : Util.Rand32(),
Version = OriginGame != 0 ? OriginGame : sav.Game, Version = OriginGame != 0 ? OriginGame : sav.Game,
Language = Language != 0 ? Language : sav.Language, Language = Language != 0 ? Language : sav.Language,
@ -350,7 +350,7 @@ namespace PKHeX.Core
pk.MetDate = Date ?? DateTime.Now; pk.MetDate = Date ?? DateTime.Now;
if ((sav.Generation > Format && OriginGame == 0) || !CanBeReceivedByVersion(pk.Version)) if ((sav.Generation > Generation && OriginGame == 0) || !CanBeReceivedByVersion(pk.Version))
{ {
// give random valid game // give random valid game
do { pk.Version = (int)GameVersion.X + rnd.Next(4); } do { pk.Version = (int)GameVersion.X + rnd.Next(4); }
@ -377,7 +377,7 @@ namespace PKHeX.Core
} }
pk.IsNicknamed = IsNicknamed; pk.IsNicknamed = IsNicknamed;
pk.Nickname = IsNicknamed ? Nickname : SpeciesName.GetSpeciesNameGeneration(Species, pk.Language, Format); pk.Nickname = IsNicknamed ? Nickname : SpeciesName.GetSpeciesNameGeneration(Species, pk.Language, Generation);
SetPINGA(pk, criteria); SetPINGA(pk, criteria);
@ -393,13 +393,13 @@ namespace PKHeX.Core
{ {
pk.IsEgg = true; pk.IsEgg = true;
pk.EggMetDate = Date; pk.EggMetDate = Date;
pk.Nickname = SpeciesName.GetSpeciesNameGeneration(0, pk.Language, Format); pk.Nickname = SpeciesName.GetSpeciesNameGeneration(0, pk.Language, Generation);
pk.IsNicknamed = true; pk.IsNicknamed = true;
} }
private void SetPINGA(PKM pk, EncounterCriteria criteria) private void SetPINGA(PKM pk, EncounterCriteria criteria)
{ {
var pi = PersonalTable.AO.GetFormeEntry(Species, Form); var pi = PersonalTable.AO.GetFormEntry(Species, Form);
pk.Nature = (int)criteria.GetNature((Nature)Nature); pk.Nature = (int)criteria.GetNature((Nature)Nature);
pk.Gender = criteria.GetGender(Gender, pi); pk.Gender = criteria.GetGender(Gender, pi);
var av = GetAbilityIndex(criteria, pi); var av = GetAbilityIndex(criteria, pi);
@ -487,7 +487,7 @@ namespace PKHeX.Core
if (EncryptionConstant != 0 && EncryptionConstant != pkm.EncryptionConstant) return false; if (EncryptionConstant != 0 && EncryptionConstant != pkm.EncryptionConstant) return false;
if (Language != 0 && Language != pkm.Language) return false; if (Language != 0 && Language != pkm.Language) return false;
} }
if (Form != evo.Form && !AltFormInfo.IsFormChangeable(Species, Form, pkm.AltForm, pkm.Format)) if (Form != evo.Form && !FormInfo.IsFormChangeable(Species, Form, pkm.Form, pkm.Format))
return false; return false;
if (IsEgg) if (IsEgg)

View file

@ -11,7 +11,7 @@ namespace PKHeX.Core
public sealed class WC7 : DataMysteryGift, IRibbonSetEvent3, IRibbonSetEvent4, ILangNick, IContestStats, INature, IMemoryOT public sealed class WC7 : DataMysteryGift, IRibbonSetEvent3, IRibbonSetEvent4, ILangNick, IContestStats, INature, IMemoryOT
{ {
public const int Size = 0x108; public const int Size = 0x108;
public override int Format => 7; public override int Generation => 7;
public WC7() : this(new byte[Size]) { } public WC7() : this(new byte[Size]) { }
public WC7(byte[] data) : base(data) { } public WC7(byte[] data) : base(data) { }
@ -317,7 +317,7 @@ namespace PKHeX.Core
int currentLevel = Level > 0 ? Level : rnd.Next(1, 101); int currentLevel = Level > 0 ? Level : rnd.Next(1, 101);
int metLevel = MetLevel > 0 ? MetLevel : currentLevel; int metLevel = MetLevel > 0 ? MetLevel : currentLevel;
var pi = PersonalTable.USUM.GetFormeEntry(Species, Form); var pi = PersonalTable.USUM.GetFormEntry(Species, Form);
PK7 pk = new PK7 PK7 pk = new PK7
{ {
Species = Species, Species = Species,
@ -325,7 +325,7 @@ namespace PKHeX.Core
TID = TID, TID = TID,
SID = SID, SID = SID,
Met_Level = metLevel, Met_Level = metLevel,
AltForm = Form, Form = Form,
EncryptionConstant = EncryptionConstant != 0 ? EncryptionConstant : Util.Rand32(), EncryptionConstant = EncryptionConstant != 0 ? EncryptionConstant : Util.Rand32(),
Version = OriginGame != 0 ? OriginGame : sav.Game, Version = OriginGame != 0 ? OriginGame : sav.Game,
Language = Language != 0 ? Language : sav.Language, Language = Language != 0 ? Language : sav.Language,
@ -392,7 +392,7 @@ namespace PKHeX.Core
pk.SetMaximumPPCurrent(); pk.SetMaximumPPCurrent();
if ((sav.Generation > Format && OriginGame == 0) || !CanBeReceivedByVersion(pk.Version)) if ((sav.Generation > Generation && OriginGame == 0) || !CanBeReceivedByVersion(pk.Version))
{ {
// give random valid game // give random valid game
do { pk.Version = (int)GameVersion.SN + rnd.Next(4); } do { pk.Version = (int)GameVersion.SN + rnd.Next(4); }
@ -408,7 +408,7 @@ namespace PKHeX.Core
pk.MetDate = Date ?? DateTime.Now; pk.MetDate = Date ?? DateTime.Now;
pk.IsNicknamed = IsNicknamed; pk.IsNicknamed = IsNicknamed;
pk.Nickname = IsNicknamed ? Nickname : SpeciesName.GetSpeciesNameGeneration(Species, pk.Language, Format); pk.Nickname = IsNicknamed ? Nickname : SpeciesName.GetSpeciesNameGeneration(Species, pk.Language, Generation);
SetPINGA(pk, criteria); SetPINGA(pk, criteria);
@ -424,13 +424,13 @@ namespace PKHeX.Core
{ {
pk.IsEgg = true; pk.IsEgg = true;
pk.EggMetDate = Date; pk.EggMetDate = Date;
pk.Nickname = SpeciesName.GetSpeciesNameGeneration(0, pk.Language, Format); pk.Nickname = SpeciesName.GetSpeciesNameGeneration(0, pk.Language, Generation);
pk.IsNicknamed = true; pk.IsNicknamed = true;
} }
private void SetPINGA(PKM pk, EncounterCriteria criteria) private void SetPINGA(PKM pk, EncounterCriteria criteria)
{ {
var pi = PersonalTable.USUM.GetFormeEntry(Species, Form); var pi = PersonalTable.USUM.GetFormEntry(Species, Form);
pk.Nature = (int)criteria.GetNature((Nature)Nature); pk.Nature = (int)criteria.GetNature((Nature)Nature);
pk.Gender = criteria.GetGender(Gender, pi); pk.Gender = criteria.GetGender(Gender, pi);
var av = GetAbilityIndex(criteria, pi); var av = GetAbilityIndex(criteria, pi);
@ -518,7 +518,7 @@ namespace PKHeX.Core
if (Language != 0 && Language != pkm.Language) return false; if (Language != 0 && Language != pkm.Language) return false;
} }
if (Form != evo.Form && !AltFormInfo.IsFormChangeable(Species, Form, pkm.AltForm, pkm.Format)) if (Form != evo.Form && !FormInfo.IsFormChangeable(Species, Form, pkm.Form, pkm.Format))
return false; return false;
if (IsEgg) if (IsEgg)

View file

@ -15,7 +15,7 @@ namespace PKHeX.Core
public const int Size = 0x2D0; public const int Size = 0x2D0;
public const int CardStart = 0x0; public const int CardStart = 0x0;
public override int Format => 8; public override int Generation => 8;
public enum GiftType : byte public enum GiftType : byte
{ {
@ -323,7 +323,7 @@ namespace PKHeX.Core
int currentLevel = Level > 0 ? Level : Util.Rand.Next(1, 101); int currentLevel = Level > 0 ? Level : Util.Rand.Next(1, 101);
int metLevel = MetLevel > 0 ? MetLevel : currentLevel; int metLevel = MetLevel > 0 ? MetLevel : currentLevel;
var pi = PersonalTable.SWSH.GetFormeEntry(Species, Form); var pi = PersonalTable.SWSH.GetFormEntry(Species, Form);
var OT = GetOT(sav.Language); var OT = GetOT(sav.Language);
var pk = new PK8 var pk = new PK8
@ -332,7 +332,7 @@ namespace PKHeX.Core
TID = TID, TID = TID,
SID = SID, SID = SID,
Species = Species, Species = Species,
AltForm = Form, Form = Form,
CurrentLevel = currentLevel, CurrentLevel = currentLevel,
Ball = Ball != 0 ? Ball : 4, // Default is Pokeball Ball = Ball != 0 ? Ball : 4, // Default is Pokeball
Met_Level = metLevel, Met_Level = metLevel,
@ -375,7 +375,7 @@ namespace PKHeX.Core
}; };
pk.SetMaximumPPCurrent(); pk.SetMaximumPPCurrent();
if ((sav.Generation > Format && OriginGame == 0) || !CanBeReceivedByVersion(pk.Version)) if ((sav.Generation > Generation && OriginGame == 0) || !CanBeReceivedByVersion(pk.Version))
{ {
// give random valid game // give random valid game
var rnd = Util.Rand; var rnd = Util.Rand;
@ -400,14 +400,14 @@ namespace PKHeX.Core
// Official code explicitly corrects for Meowstic // Official code explicitly corrects for Meowstic
if (pk.Species == (int)Core.Species.Meowstic) if (pk.Species == (int)Core.Species.Meowstic)
pk.AltForm = pk.Gender; pk.Form = pk.Gender;
pk.MetDate = DateTime.Now; pk.MetDate = DateTime.Now;
var nickname_language = GetNicknameLanguage(sav.Language); var nickname_language = GetNicknameLanguage(sav.Language);
pk.Language = nickname_language != 0 ? nickname_language : sav.Language; pk.Language = nickname_language != 0 ? nickname_language : sav.Language;
pk.IsNicknamed = GetIsNicknamed(pk.Language); pk.IsNicknamed = GetIsNicknamed(pk.Language);
pk.Nickname = pk.IsNicknamed ? Nickname : SpeciesName.GetSpeciesNameGeneration(Species, pk.Language, Format); pk.Nickname = pk.IsNicknamed ? Nickname : SpeciesName.GetSpeciesNameGeneration(Species, pk.Language, Generation);
for (var i = 0; i < RibbonBytesCount; i++) for (var i = 0; i < RibbonBytesCount; i++)
{ {
@ -437,13 +437,13 @@ namespace PKHeX.Core
{ {
pk.IsEgg = true; pk.IsEgg = true;
pk.EggMetDate = DateTime.Now; pk.EggMetDate = DateTime.Now;
pk.Nickname = SpeciesName.GetSpeciesNameGeneration(0, pk.Language, Format); pk.Nickname = SpeciesName.GetSpeciesNameGeneration(0, pk.Language, Generation);
pk.IsNicknamed = true; pk.IsNicknamed = true;
} }
private void SetPINGA(PKM pk, EncounterCriteria criteria) private void SetPINGA(PKM pk, EncounterCriteria criteria)
{ {
var pi = PersonalTable.SWSH.GetFormeEntry(Species, Form); var pi = PersonalTable.SWSH.GetFormEntry(Species, Form);
pk.Nature = (int)criteria.GetNature(Nature == -1 ? Core.Nature.Random : (Nature)Nature); pk.Nature = (int)criteria.GetNature(Nature == -1 ? Core.Nature.Random : (Nature)Nature);
pk.StatNature = pk.Nature; pk.StatNature = pk.Nature;
pk.Gender = criteria.GetGender(Gender, pi); pk.Gender = criteria.GetGender(Gender, pi);
@ -561,7 +561,7 @@ namespace PKHeX.Core
} }
} }
if (Form != evo.Form && !AltFormInfo.IsFormChangeable(Species, Form, pkm.AltForm, pkm.Format)) if (Form != evo.Form && !FormInfo.IsFormChangeable(Species, Form, pkm.Form, pkm.Format))
return false; return false;
if (IsEgg) if (IsEgg)
@ -595,7 +595,7 @@ namespace PKHeX.Core
if (Nature != -1 && pkm.Nature != Nature) return false; if (Nature != -1 && pkm.Nature != Nature) return false;
if (Gender != 3 && Gender != pkm.Gender) return false; if (Gender != 3 && Gender != pkm.Gender) return false;
if (pkm is IGigantamax g && g.CanGigantamax != CanGigantamax && !g.CanToggleGigantamax(pkm.Species, pkm.AltForm, Species, Form)) if (pkm is IGigantamax g && g.CanGigantamax != CanGigantamax && !g.CanToggleGigantamax(pkm.Species, pkm.Form, Species, Form))
return false; return false;
if (!(pkm is IDynamaxLevel dl && dl.DynamaxLevel >= DynamaxLevel)) if (!(pkm is IDynamaxLevel dl && dl.DynamaxLevel >= DynamaxLevel))

View file

@ -96,7 +96,7 @@ namespace PKHeX.Core
} }
// Mystery Gift implementation // Mystery Gift implementation
public override int Format => 7; public override int Generation => 7;
protected override bool IsMatchExact(PKM pkm, DexLevel evo) => false; protected override bool IsMatchExact(PKM pkm, DexLevel evo) => false;
protected override bool IsMatchDeferred(PKM pkm) => false; protected override bool IsMatchDeferred(PKM pkm) => false;
public override int Location { get; set; } public override int Location { get; set; }

View file

@ -183,7 +183,7 @@ namespace PKHeX.Core
public override bool FatefulEncounter { get => (Data[0x40] & 0x80) == 0x80; set => Data[0x40] = (byte)((Data[0x40] & ~0x80) | (value ? 0x80 : 0)); } public override bool FatefulEncounter { get => (Data[0x40] & 0x80) == 0x80; set => Data[0x40] = (byte)((Data[0x40] & ~0x80) | (value ? 0x80 : 0)); }
public override int Gender { get => (Data[0x40] >> 5) & 0x3; set => Data[0x40] = (byte)((Data[0x40] & ~0x60) | ((value & 3) << 5)); } public override int Gender { get => (Data[0x40] >> 5) & 0x3; set => Data[0x40] = (byte)((Data[0x40] & ~0x60) | ((value & 3) << 5)); }
public override int AltForm { get => Data[0x40] & 0x1F; set => Data[0x40] = (byte)((Data[0x40] & ~0x1F) | (value & 0x1F)); } public override int Form { get => Data[0x40] & 0x1F; set => Data[0x40] = (byte)((Data[0x40] & ~0x1F) | (value & 0x1F)); }
public override int ShinyLeaf { get => Data[0x41]; set => Data[0x41] = (byte)value; } public override int ShinyLeaf { get => Data[0x41]; set => Data[0x41] = (byte)value; }
// 0x43-0x47 Unused // 0x43-0x47 Unused
#endregion #endregion

View file

@ -26,7 +26,7 @@ namespace PKHeX.Core
public override int SIZE_STORED => SIZE; public override int SIZE_STORED => SIZE;
private const int SIZE = 260; private const int SIZE = 260;
public override int Format => 7; public override int Format => 7;
public override PersonalInfo PersonalInfo => PersonalTable.GG.GetFormeEntry(Species, AltForm); public override PersonalInfo PersonalInfo => PersonalTable.GG.GetFormEntry(Species, Form);
public PB7() : base(SIZE) { } public PB7() : base(SIZE) { }
public PB7(byte[] data) : base(DecryptParty(data)) { } public PB7(byte[] data) : base(DecryptParty(data)) { }
@ -108,7 +108,7 @@ namespace PKHeX.Core
public override int Nature { get => Data[0x1C]; set => Data[0x1C] = (byte)value; } public override int Nature { get => Data[0x1C]; set => Data[0x1C] = (byte)value; }
public override bool FatefulEncounter { get => (Data[0x1D] & 1) == 1; set => Data[0x1D] = (byte)((Data[0x1D] & ~0x01) | (value ? 1 : 0)); } public override bool FatefulEncounter { get => (Data[0x1D] & 1) == 1; set => Data[0x1D] = (byte)((Data[0x1D] & ~0x01) | (value ? 1 : 0)); }
public override int Gender { get => (Data[0x1D] >> 1) & 0x3; set => Data[0x1D] = (byte)((Data[0x1D] & ~0x06) | (value << 1)); } public override int Gender { get => (Data[0x1D] >> 1) & 0x3; set => Data[0x1D] = (byte)((Data[0x1D] & ~0x06) | (value << 1)); }
public override int AltForm { get => Data[0x1D] >> 3; set => Data[0x1D] = (byte)((Data[0x1D] & 0x07) | (value << 3)); } public override int Form { get => Data[0x1D] >> 3; set => Data[0x1D] = (byte)((Data[0x1D] & 0x07) | (value << 3)); }
public override int EV_HP { get => Data[0x1E]; set => Data[0x1E] = (byte)value; } public override int EV_HP { get => Data[0x1E]; set => Data[0x1E] = (byte)value; }
public override int EV_ATK { get => Data[0x1F]; set => Data[0x1F] = (byte)value; } public override int EV_ATK { get => Data[0x1F]; set => Data[0x1F] = (byte)value; }
public override int EV_DEF { get => Data[0x20]; set => Data[0x20] = (byte)value; } public override int EV_DEF { get => Data[0x20]; set => Data[0x20] = (byte)value; }
@ -639,7 +639,7 @@ namespace PKHeX.Core
IsNicknamed = IsNicknamed, IsNicknamed = IsNicknamed,
FatefulEncounter = FatefulEncounter, FatefulEncounter = FatefulEncounter,
Gender = Gender, Gender = Gender,
AltForm = AltForm, Form = Form,
Nature = Nature, Nature = Nature,
Nickname = Nickname, Nickname = Nickname,
Version = Version, Version = Version,

View file

@ -153,7 +153,7 @@ namespace PKHeX.Core
Met_Location = Locations.Transfer2, // "Johto region", hardcoded. Met_Location = Locations.Transfer2, // "Johto region", hardcoded.
Gender = Gender, Gender = Gender,
IsNicknamed = false, IsNicknamed = false,
AltForm = AltForm, Form = Form,
CurrentHandler = 1, CurrentHandler = 1,
HT_Name = PKMConverter.OT_Name, HT_Name = PKMConverter.OT_Name,

View file

@ -213,7 +213,7 @@ namespace PKHeX.Core
SID = SID, SID = SID,
EXP = IsEgg ? Experience.GetEXP(5, PersonalInfo.EXPGrowth) : EXP, EXP = IsEgg ? Experience.GetEXP(5, PersonalInfo.EXPGrowth) : EXP,
Gender = PKX.GetGenderFromPID(Species, PID), Gender = PKX.GetGenderFromPID(Species, PID),
AltForm = AltForm, Form = Form,
// IsEgg = false, -- already false // IsEgg = false, -- already false
OT_Friendship = 70, OT_Friendship = 70,
Markings = Markings, Markings = Markings,

View file

@ -17,7 +17,7 @@ namespace PKHeX.Core
public override int SIZE_PARTY => PokeCrypto.SIZE_4PARTY; public override int SIZE_PARTY => PokeCrypto.SIZE_4PARTY;
public override int SIZE_STORED => PokeCrypto.SIZE_4STORED; public override int SIZE_STORED => PokeCrypto.SIZE_4STORED;
public override int Format => 4; public override int Format => 4;
public override PersonalInfo PersonalInfo => PersonalTable.HGSS.GetFormeEntry(Species, AltForm); public override PersonalInfo PersonalInfo => PersonalTable.HGSS.GetFormEntry(Species, Form);
public PK4() : base(PokeCrypto.SIZE_4PARTY) { } public PK4() : base(PokeCrypto.SIZE_4PARTY) { }
public PK4(byte[] data) : base(DecryptParty(data)) { } public PK4(byte[] data) : base(DecryptParty(data)) { }
@ -162,7 +162,7 @@ namespace PKHeX.Core
public override bool FatefulEncounter { get => (Data[0x40] & 1) == 1; set => Data[0x40] = (byte)((Data[0x40] & ~0x01) | (value ? 1 : 0)); } public override bool FatefulEncounter { get => (Data[0x40] & 1) == 1; set => Data[0x40] = (byte)((Data[0x40] & ~0x01) | (value ? 1 : 0)); }
public override int Gender { get => (Data[0x40] >> 1) & 0x3; set => Data[0x40] = (byte)((Data[0x40] & ~0x06) | (value << 1)); } public override int Gender { get => (Data[0x40] >> 1) & 0x3; set => Data[0x40] = (byte)((Data[0x40] & ~0x06) | (value << 1)); }
public override int AltForm { get => Data[0x40] >> 3; set => Data[0x40] = (byte)((Data[0x40] & 0x07) | (value << 3)); } public override int Form { get => Data[0x40] >> 3; set => Data[0x40] = (byte)((Data[0x40] & 0x07) | (value << 3)); }
public override int ShinyLeaf { get => Data[0x41]; set => Data[0x41] = (byte) value; } public override int ShinyLeaf { get => Data[0x41]; set => Data[0x41] = (byte) value; }
// 0x43-0x47 Unused // 0x43-0x47 Unused
#endregion #endregion
@ -355,8 +355,8 @@ namespace PKHeX.Core
BK4 bk4 = ConvertTo<BK4>(); BK4 bk4 = ConvertTo<BK4>();
// Enforce DP content only (no PtHGSS) // Enforce DP content only (no PtHGSS)
if (AltForm != 0 && !PersonalTable.DP[Species].HasFormes && Species != 201) if (Form != 0 && !PersonalTable.DP[Species].HasForms && Species != 201)
bk4.AltForm = 0; bk4.Form = 0;
if (HeldItem > Legal.MaxItemID_4_DP) if (HeldItem > Legal.MaxItemID_4_DP)
bk4.HeldItem = 0; bk4.HeldItem = 0;
bk4.RefreshChecksum(); bk4.RefreshChecksum();
@ -381,7 +381,7 @@ namespace PKHeX.Core
// Arceus Type Changing -- Plate forcibly removed. // Arceus Type Changing -- Plate forcibly removed.
if (pk5.Species == (int)Core.Species.Arceus) if (pk5.Species == (int)Core.Species.Arceus)
{ {
pk5.AltForm = 0; pk5.Form = 0;
pk5.HeldItem = 0; pk5.HeldItem = 0;
} }
else if(!Legal.HeldItems_BW.Contains((ushort)HeldItem)) else if(!Legal.HeldItems_BW.Contains((ushort)HeldItem))

View file

@ -21,7 +21,7 @@ namespace PKHeX.Core
public override int SIZE_PARTY => PokeCrypto.SIZE_5PARTY; public override int SIZE_PARTY => PokeCrypto.SIZE_5PARTY;
public override int SIZE_STORED => PokeCrypto.SIZE_5STORED; public override int SIZE_STORED => PokeCrypto.SIZE_5STORED;
public override int Format => 5; public override int Format => 5;
public override PersonalInfo PersonalInfo => PersonalTable.B2W2.GetFormeEntry(Species, AltForm); public override PersonalInfo PersonalInfo => PersonalTable.B2W2.GetFormEntry(Species, Form);
public PK5() : base(PokeCrypto.SIZE_5PARTY) { } public PK5() : base(PokeCrypto.SIZE_5PARTY) { }
public PK5(byte[] data) : base(DecryptParty(data)) { } public PK5(byte[] data) : base(DecryptParty(data)) { }
@ -176,7 +176,7 @@ namespace PKHeX.Core
public override bool FatefulEncounter { get => (Data[0x40] & 1) == 1; set => Data[0x40] = (byte)((Data[0x40] & ~0x01) | (value ? 1 : 0)); } public override bool FatefulEncounter { get => (Data[0x40] & 1) == 1; set => Data[0x40] = (byte)((Data[0x40] & ~0x01) | (value ? 1 : 0)); }
public override int Gender { get => (Data[0x40] >> 1) & 0x3; set => Data[0x40] = (byte)((Data[0x40] & ~0x06) | (value << 1)); } public override int Gender { get => (Data[0x40] >> 1) & 0x3; set => Data[0x40] = (byte)((Data[0x40] & ~0x06) | (value << 1)); }
public override int AltForm { get => Data[0x40] >> 3; set => Data[0x40] = (byte)((Data[0x40] & 0x07) | (value << 3)); } public override int Form { get => Data[0x40] >> 3; set => Data[0x40] = (byte)((Data[0x40] & 0x07) | (value << 3)); }
public override int Nature { get => Data[0x41]; set => Data[0x41] = (byte)value; } public override int Nature { get => Data[0x41]; set => Data[0x41] = (byte)value; }
public bool HiddenAbility { get => (Data[0x42] & 1) == 1; set => Data[0x42] = (byte)((Data[0x42] & ~0x01) | (value ? 1 : 0)); } public bool HiddenAbility { get => (Data[0x42] & 1) == 1; set => Data[0x42] = (byte)((Data[0x42] & ~0x01) | (value ? 1 : 0)); }
public bool NPokémon { get => (Data[0x42] & 2) == 2; set => Data[0x42] = (byte)((Data[0x42] & ~0x02) | (value ? 2 : 0)); } public bool NPokémon { get => (Data[0x42] & 2) == 2; set => Data[0x42] = (byte)((Data[0x42] & ~0x02) | (value ? 2 : 0)); }
@ -373,7 +373,7 @@ namespace PKHeX.Core
FatefulEncounter = FatefulEncounter, FatefulEncounter = FatefulEncounter,
Gender = Gender, Gender = Gender,
AltForm = AltForm, Form = Form,
Nature = Nature, Nature = Nature,
Version = Version, Version = Version,

View file

@ -15,7 +15,7 @@ namespace PKHeX.Core
public override IReadOnlyList<ushort> ExtraBytes => Unused; public override IReadOnlyList<ushort> ExtraBytes => Unused;
public override int Format => 6; public override int Format => 6;
public override PersonalInfo PersonalInfo => PersonalTable.AO.GetFormeEntry(Species, AltForm); public override PersonalInfo PersonalInfo => PersonalTable.AO.GetFormEntry(Species, Form);
public PK6() : base(PokeCrypto.SIZE_6PARTY) { } public PK6() : base(PokeCrypto.SIZE_6PARTY) { }
public PK6(byte[] data) : base(DecryptParty(data)) { } public PK6(byte[] data) : base(DecryptParty(data)) { }
@ -96,7 +96,7 @@ namespace PKHeX.Core
public override int Nature { get => Data[0x1C]; set => Data[0x1C] = (byte)value; } public override int Nature { get => Data[0x1C]; set => Data[0x1C] = (byte)value; }
public override bool FatefulEncounter { get => (Data[0x1D] & 1) == 1; set => Data[0x1D] = (byte)((Data[0x1D] & ~0x01) | (value ? 1 : 0)); } public override bool FatefulEncounter { get => (Data[0x1D] & 1) == 1; set => Data[0x1D] = (byte)((Data[0x1D] & ~0x01) | (value ? 1 : 0)); }
public override int Gender { get => (Data[0x1D] >> 1) & 0x3; set => Data[0x1D] = (byte)((Data[0x1D] & ~0x06) | (value << 1)); } public override int Gender { get => (Data[0x1D] >> 1) & 0x3; set => Data[0x1D] = (byte)((Data[0x1D] & ~0x06) | (value << 1)); }
public override int AltForm { get => Data[0x1D] >> 3; set => Data[0x1D] = (byte)((Data[0x1D] & 0x07) | (value << 3)); } public override int Form { get => Data[0x1D] >> 3; set => Data[0x1D] = (byte)((Data[0x1D] & 0x07) | (value << 3)); }
public override int EV_HP { get => Data[0x1E]; set => Data[0x1E] = (byte)value; } public override int EV_HP { get => Data[0x1E]; set => Data[0x1E] = (byte)value; }
public override int EV_ATK { get => Data[0x1F]; set => Data[0x1F] = (byte)value; } public override int EV_ATK { get => Data[0x1F]; set => Data[0x1F] = (byte)value; }
public override int EV_DEF { get => Data[0x20]; set => Data[0x20] = (byte)value; } public override int EV_DEF { get => Data[0x20]; set => Data[0x20] = (byte)value; }

View file

@ -16,7 +16,7 @@ namespace PKHeX.Core
public override IReadOnlyList<ushort> ExtraBytes => Unused; public override IReadOnlyList<ushort> ExtraBytes => Unused;
public override int Format => 7; public override int Format => 7;
public override PersonalInfo PersonalInfo => PersonalTable.USUM.GetFormeEntry(Species, AltForm); public override PersonalInfo PersonalInfo => PersonalTable.USUM.GetFormEntry(Species, Form);
public PK7() : base(PokeCrypto.SIZE_6PARTY) { } public PK7() : base(PokeCrypto.SIZE_6PARTY) { }
public PK7(byte[] data) : base(DecryptParty(data)) { } public PK7(byte[] data) : base(DecryptParty(data)) { }
@ -96,7 +96,7 @@ namespace PKHeX.Core
public override int Nature { get => Data[0x1C]; set => Data[0x1C] = (byte)value; } public override int Nature { get => Data[0x1C]; set => Data[0x1C] = (byte)value; }
public override bool FatefulEncounter { get => (Data[0x1D] & 1) == 1; set => Data[0x1D] = (byte)((Data[0x1D] & ~0x01) | (value ? 1 : 0)); } public override bool FatefulEncounter { get => (Data[0x1D] & 1) == 1; set => Data[0x1D] = (byte)((Data[0x1D] & ~0x01) | (value ? 1 : 0)); }
public override int Gender { get => (Data[0x1D] >> 1) & 0x3; set => Data[0x1D] = (byte)((Data[0x1D] & ~0x06) | (value << 1)); } public override int Gender { get => (Data[0x1D] >> 1) & 0x3; set => Data[0x1D] = (byte)((Data[0x1D] & ~0x06) | (value << 1)); }
public override int AltForm { get => Data[0x1D] >> 3; set => Data[0x1D] = (byte)((Data[0x1D] & 0x07) | (value << 3)); } public override int Form { get => Data[0x1D] >> 3; set => Data[0x1D] = (byte)((Data[0x1D] & 0x07) | (value << 3)); }
public override int EV_HP { get => Data[0x1E]; set => Data[0x1E] = (byte)value; } public override int EV_HP { get => Data[0x1E]; set => Data[0x1E] = (byte)value; }
public override int EV_ATK { get => Data[0x1F]; set => Data[0x1F] = (byte)value; } public override int EV_ATK { get => Data[0x1F]; set => Data[0x1F] = (byte)value; }
public override int EV_DEF { get => Data[0x20]; set => Data[0x20] = (byte)value; } public override int EV_DEF { get => Data[0x20]; set => Data[0x20] = (byte)value; }
@ -449,12 +449,12 @@ namespace PKHeX.Core
if (IsUntraded) if (IsUntraded)
HT_Friendship = HT_Affection = HT_TextVar = HT_Memory = HT_Intensity = HT_Feeling = 0; HT_Friendship = HT_Affection = HT_TextVar = HT_Memory = HT_Intensity = HT_Feeling = 0;
if (GenNumber < 6) if (Generation < 6)
/* OT_Affection = */ OT_TextVar = OT_Memory = OT_Intensity = OT_Feeling = 0; /* OT_Affection = */ OT_TextVar = OT_Memory = OT_Intensity = OT_Feeling = 0;
this.SanitizeGeoLocationData(); this.SanitizeGeoLocationData();
if (GenNumber < 7) // must be transferred via bank, and must have memories if (Generation < 7) // must be transferred via bank, and must have memories
{ {
this.SetTradeMemory(true); this.SetTradeMemory(true);
// georegions cleared on 6->7, no need to set // georegions cleared on 6->7, no need to set
@ -539,7 +539,7 @@ namespace PKHeX.Core
IsNicknamed = IsNicknamed, IsNicknamed = IsNicknamed,
FatefulEncounter = FatefulEncounter, FatefulEncounter = FatefulEncounter,
Gender = Gender, Gender = Gender,
AltForm = AltForm, Form = Form,
Nature = Nature, Nature = Nature,
Nickname = IsNicknamed ? Nickname : SpeciesName.GetSpeciesNameGeneration(Species, Language, 8), Nickname = IsNicknamed ? Nickname : SpeciesName.GetSpeciesNameGeneration(Species, Language, 8),
Version = Version, Version = Version,
@ -633,8 +633,8 @@ namespace PKHeX.Core
}; };
// Wipe Totem Forms // Wipe Totem Forms
if (AltFormInfo.IsTotemForm(Species, AltForm, 7)) if (FormInfo.IsTotemForm(Species, Form, 7))
pk8.AltForm = AltFormInfo.GetTotemBaseForm(Species, AltForm); pk8.Form = FormInfo.GetTotemBaseForm(Species, Form);
// Fix PP and Stats // Fix PP and Stats
pk8.Heal(); pk8.Heal();

View file

@ -31,7 +31,7 @@ namespace PKHeX.Core
public override IReadOnlyList<ushort> ExtraBytes => Unused; public override IReadOnlyList<ushort> ExtraBytes => Unused;
public override int Format => 8; public override int Format => 8;
public override PersonalInfo PersonalInfo => PersonalTable.SWSH.GetFormeEntry(Species, AltForm); public override PersonalInfo PersonalInfo => PersonalTable.SWSH.GetFormEntry(Species, Form);
public PK8() : base(PokeCrypto.SIZE_8PARTY) => AffixedRibbon = -1; // 00 would make it show Kalos Champion :) public PK8() : base(PokeCrypto.SIZE_8PARTY) => AffixedRibbon = -1; // 00 would make it show Kalos Champion :)
public PK8(byte[] data) : base(DecryptParty(data)) { } public PK8(byte[] data) : base(DecryptParty(data)) { }
@ -72,7 +72,7 @@ namespace PKHeX.Core
public override byte[] OT_Trash { get => GetData(0xF8, 24); set { if (value.Length == 24) value.CopyTo(Data, 0xF8); } } public override byte[] OT_Trash { get => GetData(0xF8, 24); set { if (value.Length == 24) value.CopyTo(Data, 0xF8); } }
public override bool WasLink => Met_Location == Locations.LinkGift6 && Gen6; public override bool WasLink => Met_Location == Locations.LinkGift6 && Gen6;
public override bool WasEvent => Locations.IsEventLocation5(Met_Location) || FatefulEncounter; public override bool WasEvent => Locations.IsEventLocation5(Met_Location) || FatefulEncounter;
public override bool WasEventEgg => GenNumber < 5 ? base.WasEventEgg : (Locations.IsEventLocation5(Egg_Location) || (FatefulEncounter && Egg_Location == Locations.LinkTrade6)) && Met_Level == 1; public override bool WasEventEgg => Generation < 5 ? base.WasEventEgg : (Locations.IsEventLocation5(Egg_Location) || (FatefulEncounter && Egg_Location == Locations.LinkTrade6)) && Met_Level == 1;
// Maximums // Maximums
public override int MaxIV => 31; public override int MaxIV => 31;
@ -82,7 +82,7 @@ namespace PKHeX.Core
public override int PSV => (int)((PID >> 16 ^ (PID & 0xFFFF)) >> 4); public override int PSV => (int)((PID >> 16 ^ (PID & 0xFFFF)) >> 4);
public override int TSV => (TID ^ SID) >> 4; public override int TSV => (TID ^ SID) >> 4;
public override bool IsUntraded => Data[0xA8] == 0 && Data[0xA8 + 1] == 0 && Format == GenNumber; // immediately terminated HT_Name data (\0) public override bool IsUntraded => Data[0xA8] == 0 && Data[0xA8 + 1] == 0 && Format == Generation; // immediately terminated HT_Name data (\0)
// Complex Generated Attributes // Complex Generated Attributes
public override int Characteristic public override int Characteristic
@ -177,7 +177,7 @@ namespace PKHeX.Core
public override int Gender { get => (Data[0x22] >> 2) & 0x3; set => Data[0x22] = (byte)((Data[0x22] & 0xF3) | (value << 2)); } public override int Gender { get => (Data[0x22] >> 2) & 0x3; set => Data[0x22] = (byte)((Data[0x22] & 0xF3) | (value << 2)); }
// 0x23 alignment unused // 0x23 alignment unused
public override int AltForm { get => BitConverter.ToUInt16(Data, 0x24); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x24); } public override int Form { get => BitConverter.ToUInt16(Data, 0x24); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x24); }
public override int EV_HP { get => Data[0x26]; set => Data[0x26] = (byte)value; } public override int EV_HP { get => Data[0x26]; set => Data[0x26] = (byte)value; }
public override int EV_ATK { get => Data[0x27]; set => Data[0x27] = (byte)value; } public override int EV_ATK { get => Data[0x27]; set => Data[0x27] = (byte)value; }
public override int EV_DEF { get => Data[0x28]; set => Data[0x28] = (byte)value; } public override int EV_DEF { get => Data[0x28]; set => Data[0x28] = (byte)value; }
@ -537,7 +537,7 @@ namespace PKHeX.Core
if (IsUntraded) if (IsUntraded)
HT_Language = HT_Friendship = HT_TextVar = HT_Memory = HT_Intensity = HT_Feeling = 0; HT_Language = HT_Friendship = HT_TextVar = HT_Memory = HT_Intensity = HT_Feeling = 0;
int gen = GenNumber; int gen = Generation;
if (gen < 6) if (gen < 6)
OT_TextVar = OT_Memory = OT_Intensity = OT_Feeling = 0; OT_TextVar = OT_Memory = OT_Intensity = OT_Feeling = 0;
if (gen != 8) // must be transferred via HOME, and must have memories if (gen != 8) // must be transferred via HOME, and must have memories

View file

@ -7,7 +7,7 @@ namespace PKHeX.Core
/// <summary> /// <summary>
/// Object representing a <see cref="PKM"/>'s data and derived properties. /// Object representing a <see cref="PKM"/>'s data and derived properties.
/// </summary> /// </summary>
public abstract class PKM : ITrainerID, ILangNick, IGameValueLimit, INature public abstract class PKM : ISpeciesForm, ITrainerID, IGeneration, ILangNick, IGameValueLimit, INature
{ {
public static readonly string[] Extensions = PKX.GetPKMExtensions(); public static readonly string[] Extensions = PKX.GetPKMExtensions();
public abstract int SIZE_PARTY { get; } public abstract int SIZE_PARTY { get; }
@ -59,7 +59,7 @@ namespace PKHeX.Core
public virtual int StatNature { get => Nature; set => Nature = value; } public virtual int StatNature { get => Nature; set => Nature = value; }
public abstract int Ability { get; set; } public abstract int Ability { get; set; }
public abstract int CurrentFriendship { get; set; } public abstract int CurrentFriendship { get; set; }
public abstract int AltForm { get; set; } public abstract int Form { get; set; }
public abstract bool IsEgg { get; set; } public abstract bool IsEgg { get; set; }
public abstract bool IsNicknamed { get; set; } public abstract bool IsNicknamed { get; set; }
public abstract uint EXP { get; set; } public abstract uint EXP { get; set; }
@ -244,7 +244,7 @@ namespace PKHeX.Core
public abstract int NickLength { get; } public abstract int NickLength { get; }
// Derived // Derived
public int SpecForm { get => Species + (AltForm << 11); set { Species = value & 0x7FF; AltForm = value >> 11; } } public int SpecForm { get => Species + (Form << 11); set { Species = value & 0x7FF; Form = value >> 11; } }
public virtual int SpriteItem => HeldItem; public virtual int SpriteItem => HeldItem;
public virtual bool IsShiny => TSV == PSV; public virtual bool IsShiny => TSV == PSV;
public StorageSlotFlag StorageFlags { get; internal set; } public StorageSlotFlag StorageFlags { get; internal set; }
@ -264,14 +264,14 @@ namespace PKHeX.Core
public int DisplayTID public int DisplayTID
{ {
get => GenNumber >= 7 ? TrainerID7 : TID; get => Generation >= 7 ? TrainerID7 : TID;
set { if (GenNumber >= 7) TrainerID7 = value; else TID = value; } set { if (Generation >= 7) TrainerID7 = value; else TID = value; }
} }
public int DisplaySID public int DisplaySID
{ {
get => GenNumber >= 7 ? TrainerSID7 : SID; get => Generation >= 7 ? TrainerSID7 : SID;
set { if (GenNumber >= 7) TrainerSID7 = value; else SID = value; } set { if (Generation >= 7) TrainerSID7 = value; else SID = value; }
} }
private void SetID7(int sid7, int tid7) private void SetID7(int sid7, int tid7)
@ -310,9 +310,9 @@ namespace PKHeX.Core
public bool Gen3 => (Version >= 1 && Version <= 5) || Version == 15; public bool Gen3 => (Version >= 1 && Version <= 5) || Version == 15;
public bool Gen2 => Version == (int)GameVersion.GSC; public bool Gen2 => Version == (int)GameVersion.GSC;
public bool Gen1 => Version == (int)GameVersion.RBY; public bool Gen1 => Version == (int)GameVersion.RBY;
public bool GenU => GenNumber <= 0; public bool GenU => Generation <= 0;
public int GenNumber public int Generation
{ {
get get
{ {
@ -377,7 +377,7 @@ namespace PKHeX.Core
{ {
get get
{ {
string form = AltForm > 0 ? $"-{AltForm:00}" : string.Empty; string form = Form > 0 ? $"-{Form:00}" : string.Empty;
string star = IsShiny ? " ★" : string.Empty; string star = IsShiny ? " ★" : string.Empty;
return $"{Species:000}{form}{star} - {Nickname} - {Checksum:X4}{EncryptionConstant:X8}"; return $"{Species:000}{form}{star} - {Nickname} - {Checksum:X4}{EncryptionConstant:X8}";
} }
@ -451,7 +451,7 @@ namespace PKHeX.Core
{ {
get get
{ {
if (GenNumber > 5 || Format > 5) if (Generation > 5 || Format > 5)
return -1; return -1;
if (Version == (int) GameVersion.CXD) if (Version == (int) GameVersion.CXD)
@ -510,7 +510,7 @@ namespace PKHeX.Core
get get
{ {
int loc = Egg_Location; int loc = Egg_Location;
return GenNumber switch return Generation switch
{ {
4 => (Legal.EggLocations4.Contains(loc) || (Species == (int) Core.Species.Manaphy && loc == Locations.Ranger4) || (loc == Locations.Faraway4 && PtHGSS)), // faraway 4 => (Legal.EggLocations4.Contains(loc) || (Species == (int) Core.Species.Manaphy && loc == Locations.Ranger4) || (loc == Locations.Faraway4 && PtHGSS)), // faraway
5 => Legal.EggLocations5.Contains(loc), 5 => Legal.EggLocations5.Contains(loc),
@ -528,7 +528,7 @@ namespace PKHeX.Core
get get
{ {
int loc = Egg_Location; int loc = Egg_Location;
switch (GenNumber) switch (Generation)
{ {
case 4: return loc == Locations.Daycare4 || loc == Locations.LinkTrade4 || (loc == Locations.Faraway4 && PtHGSS); // faraway case 4: return loc == Locations.Daycare4 || loc == Locations.LinkTrade4 || (loc == Locations.Faraway4 && PtHGSS); // faraway
case 5: return loc == Locations.Daycare5 || loc == Locations.LinkTrade5; case 5: return loc == Locations.Daycare5 || loc == Locations.LinkTrade5;
@ -548,7 +548,7 @@ namespace PKHeX.Core
if (!WasEgg) if (!WasEgg)
return false; return false;
int loc = Egg_Location; int loc = Egg_Location;
switch (GenNumber) switch (Generation)
{ {
case 4: return Legal.GiftEggLocation4.Contains(loc) || (loc == Locations.Faraway4 && HGSS); // faraway case 4: return Legal.GiftEggLocation4.Contains(loc) || (loc == Locations.Faraway4 && HGSS); // faraway
case 5: return loc == 60003; case 5: return loc == 60003;
@ -579,10 +579,10 @@ namespace PKHeX.Core
public bool WasTradedEgg => Egg_Location == GetTradedEggLocation(); public bool WasTradedEgg => Egg_Location == GetTradedEggLocation();
public bool IsTradedEgg => Met_Location == GetTradedEggLocation(); public bool IsTradedEgg => Met_Location == GetTradedEggLocation();
private int GetTradedEggLocation() => Locations.TradedEggLocation(GenNumber); private int GetTradedEggLocation() => Locations.TradedEggLocation(Generation);
public virtual bool IsUntraded => false; public virtual bool IsUntraded => false;
public virtual bool IsNative => GenNumber == Format; public virtual bool IsNative => Generation == Format;
public virtual bool IsOriginValid => Species <= Legal.GetMaxSpeciesOrigin(Format); public virtual bool IsOriginValid => Species <= Legal.GetMaxSpeciesOrigin(Format);
/// <summary> /// <summary>
@ -617,7 +617,7 @@ namespace PKHeX.Core
if (Format < generation) if (Format < generation)
return false; // Future return false; // Future
int gen = GenNumber; int gen = Generation;
return generation switch return generation switch
{ {
1 => (Format == 1 || VC), // species compat checked via sanity above 1 => (Format == 1 || VC), // species compat checked via sanity above
@ -636,7 +636,7 @@ namespace PKHeX.Core
/// Checks if the PKM has its original met location. /// Checks if the PKM has its original met location.
/// </summary> /// </summary>
/// <returns>Returns false if the Met Location has been overwritten via generational transfer.</returns> /// <returns>Returns false if the Met Location has been overwritten via generational transfer.</returns>
public virtual bool HasOriginalMetLocation => !(Format < 3 || VC || (GenNumber <= 4 && Format != GenNumber)); public virtual bool HasOriginalMetLocation => !(Format < 3 || VC || (Generation <= 4 && Format != Generation));
/// <summary> /// <summary>
/// Checks if the current <see cref="Gender"/> is valid. /// Checks if the current <see cref="Gender"/> is valid.
@ -653,7 +653,7 @@ namespace PKHeX.Core
if (gv == 0) if (gv == 0)
return gender == 0; return gender == 0;
int gen = GenNumber; int gen = Generation;
if (gen <= 2 || gen >= 6) if (gen <= 2 || gen >= 6)
return gender == (gender & 1); return gender == (gender & 1);
@ -891,7 +891,7 @@ namespace PKHeX.Core
public virtual void SetShiny() public virtual void SetShiny()
{ {
var rnd = Util.Rand; var rnd = Util.Rand;
do { PID = PKX.GetRandomPID(rnd, Species, Gender, Version, Nature, AltForm, PID); } do { PID = PKX.GetRandomPID(rnd, Species, Gender, Version, Nature, Form, PID); }
while (!IsShiny); while (!IsShiny);
if (Format >= 6 && (Gen3 || Gen4 || Gen5)) if (Format >= 6 && (Gen3 || Gen4 || Gen5))
EncryptionConstant = PID; EncryptionConstant = PID;
@ -926,7 +926,7 @@ namespace PKHeX.Core
public void SetPIDGender(int gender) public void SetPIDGender(int gender)
{ {
var rnd = Util.Rand; var rnd = Util.Rand;
do PID = PKX.GetRandomPID(rnd, Species, gender, Version, Nature, AltForm, PID); do PID = PKX.GetRandomPID(rnd, Species, gender, Version, Nature, Form, PID);
while (IsShiny); while (IsShiny);
if (Format >= 6 && (Gen3 || Gen4 || Gen5)) if (Format >= 6 && (Gen3 || Gen4 || Gen5))
EncryptionConstant = PID; EncryptionConstant = PID;
@ -942,16 +942,16 @@ namespace PKHeX.Core
public void SetPIDNature(int nature) public void SetPIDNature(int nature)
{ {
var rnd = Util.Rand; var rnd = Util.Rand;
do PID = PKX.GetRandomPID(rnd, Species, Gender, Version, nature, AltForm, PID); do PID = PKX.GetRandomPID(rnd, Species, Gender, Version, nature, Form, PID);
while (IsShiny); while (IsShiny);
if (Format >= 6 && (Gen3 || Gen4 || Gen5)) if (Format >= 6 && (Gen3 || Gen4 || Gen5))
EncryptionConstant = PID; EncryptionConstant = PID;
} }
/// <summary> /// <summary>
/// Applies a <see cref="PID"/> to the <see cref="PKM"/> according to the specified <see cref="AltForm"/>. /// Applies a <see cref="PID"/> to the <see cref="PKM"/> according to the specified <see cref="Form"/>.
/// </summary> /// </summary>
/// <param name="form"><see cref="AltForm"/> to apply</param> /// <param name="form"><see cref="Form"/> to apply</param>
/// <remarks> /// <remarks>
/// This method should only be used for Unown originating in Generation 3 games. /// This method should only be used for Unown originating in Generation 3 games.
/// If a <see cref="PKM"/> originated in a generation prior to Generation 6, the <see cref="EncryptionConstant"/> is updated. /// If a <see cref="PKM"/> originated in a generation prior to Generation 6, the <see cref="EncryptionConstant"/> is updated.
@ -1026,7 +1026,7 @@ namespace PKHeX.Core
/// <returns>Count of IVs that should be max.</returns> /// <returns>Count of IVs that should be max.</returns>
public int GetFlawlessIVCount() public int GetFlawlessIVCount()
{ {
if (GenNumber >= 6 && (Legal.Legends.Contains(Species) || Legal.SubLegends.Contains(Species))) if (Generation >= 6 && (Legal.Legends.Contains(Species) || Legal.SubLegends.Contains(Species)))
return 3; return 3;
if (XY) if (XY)
{ {

View file

@ -38,7 +38,7 @@ namespace PKHeX.Core.Searching
{ {
1 => res.Where(pk => pk.VC || pk.Format < 3), 1 => res.Where(pk => pk.VC || pk.Format < 3),
2 => res.Where(pk => pk.VC || pk.Format < 3), 2 => res.Where(pk => pk.VC || pk.Format < 3),
_ => res.Where(pk => pk.GenNumber == generation) _ => res.Where(pk => pk.Generation == generation)
}; };
} }
@ -118,7 +118,7 @@ namespace PKHeX.Core.Searching
{ {
1 => $"{pk.Species:000}{((PK1) pk).DV16:X4}", 1 => $"{pk.Species:000}{((PK1) pk).DV16:X4}",
2 => $"{pk.Species:000}{((PK2) pk).DV16:X4}", 2 => $"{pk.Species:000}{((PK2) pk).DV16:X4}",
_ => $"{pk.Species:000}{pk.PID:X8}{string.Join(" ", pk.IVs)}{pk.AltForm:00}" _ => $"{pk.Species:000}{pk.PID:X8}{string.Join(" ", pk.IVs)}{pk.Form:00}"
}; };
} }

View file

@ -31,7 +31,7 @@
public sealed override int Ability { get { var pi = (PersonalInfoG3)PersonalInfo; return AbilityBit && pi.Ability2 != 0 ? pi.Ability2 : pi.Ability1; } set { } } public sealed override int Ability { get { var pi = (PersonalInfoG3)PersonalInfo; return AbilityBit && pi.Ability2 != 0 ? pi.Ability2 : pi.Ability1; } set { } }
public sealed override uint EncryptionConstant { get => PID; set { } } public sealed override uint EncryptionConstant { get => PID; set { } }
public sealed override int Nature { get => (int)(PID % 25); set { } } public sealed override int Nature { get => (int)(PID % 25); set { } }
public sealed override int AltForm { get => Species == (int)Core.Species.Unown ? PKX.GetUnownForm(PID) : 0; set { } } public sealed override int Form { get => Species == (int)Core.Species.Unown ? PKX.GetUnownForm(PID) : 0; set { } }
public sealed override bool IsNicknamed { get => SpeciesName.IsNicknamed(Species, Nickname, Language, 3); set { } } public sealed override bool IsNicknamed { get => SpeciesName.IsNicknamed(Species, Nickname, Language, 3); set { } }
public sealed override int Gender { get => PKX.GetGenderFromPID(Species, PID); set { } } public sealed override int Gender { get => PKX.GetGenderFromPID(Species, PID); set { } }
public sealed override int Characteristic => -1; public sealed override int Characteristic => -1;

View file

@ -213,7 +213,7 @@
Move4_PPUps = Move4_PPUps, Move4_PPUps = Move4_PPUps,
Gender = Gender, Gender = Gender,
AltForm = AltForm, Form = Form,
ShinyLeaf = ShinyLeaf, ShinyLeaf = ShinyLeaf,
Version = Version, Version = Version,
PKRS_Days = PKRS_Days, PKRS_Days = PKRS_Days,

View file

@ -38,7 +38,7 @@ namespace PKHeX.Core
public sealed override int PSV => (int)((PID >> 16 ^ (PID & 0xFFFF)) >> 4); public sealed override int PSV => (int)((PID >> 16 ^ (PID & 0xFFFF)) >> 4);
public sealed override int TSV => (TID ^ SID) >> 4; public sealed override int TSV => (TID ^ SID) >> 4;
public sealed override bool IsUntraded => Data[0x78] == 0 && Data[0x78 + 1] == 0 && Format == GenNumber; // immediately terminated HT_Name data (\0) public sealed override bool IsUntraded => Data[0x78] == 0 && Data[0x78 + 1] == 0 && Format == Generation; // immediately terminated HT_Name data (\0)
// Complex Generated Attributes // Complex Generated Attributes
public sealed override int Characteristic public sealed override int Characteristic
@ -114,7 +114,7 @@ namespace PKHeX.Core
// Legality Properties // Legality Properties
public sealed override bool WasLink => Met_Location == Locations.LinkGift6 && Gen6; public sealed override bool WasLink => Met_Location == Locations.LinkGift6 && Gen6;
public sealed override bool WasEvent => Locations.IsEventLocation5(Met_Location) || FatefulEncounter; public sealed override bool WasEvent => Locations.IsEventLocation5(Met_Location) || FatefulEncounter;
public sealed override bool WasEventEgg => GenNumber < 5 ? base.WasEventEgg : (Locations.IsEventLocation5(Egg_Location) || (FatefulEncounter && Egg_Location == Locations.LinkTrade6)) && Met_Level == 1; public sealed override bool WasEventEgg => Generation < 5 ? base.WasEventEgg : (Locations.IsEventLocation5(Egg_Location) || (FatefulEncounter && Egg_Location == Locations.LinkTrade6)) && Met_Level == 1;
// Maximums // Maximums
public sealed override int MaxIV => 31; public sealed override int MaxIV => 31;

View file

@ -25,7 +25,7 @@ namespace PKHeX.Core
{ {
get get
{ {
string form = AltForm > 0 ? $"-{AltForm:00}" : string.Empty; string form = Form > 0 ? $"-{Form:00}" : string.Empty;
string star = IsShiny ? " ★" : string.Empty; string star = IsShiny ? " ★" : string.Empty;
return $"{Species:000}{form}{star} - {Nickname} - {Checksums.CRC16_CCITT(Encrypt()):X4}"; return $"{Species:000}{form}{star} - {Nickname} - {Checksums.CRC16_CCITT(Encrypt()):X4}";
} }
@ -141,7 +141,7 @@ namespace PKHeX.Core
} }
} }
public sealed override int AltForm public sealed override int Form
{ {
get get
{ {

View file

@ -4,14 +4,16 @@
/// Alternate form data has an associated value. /// Alternate form data has an associated value.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// <see cref="Species.Furfrou"/> How long (days) the form can last before reverting to AltForm-0 (5 days max) /// <see cref="Species.Furfrou"/> How long (days) the form can last before reverting to Form-0 (5 days max)
/// <see cref="Species.Hoopa"/>: How long (days) the form can last before reverting to AltForm-0 (3 days max) /// <see cref="Species.Hoopa"/>: How long (days) the form can last before reverting to Form-0 (3 days max)
/// <see cref="Species.Alcremie"/>: Topping (Strawberry, Star, etc); [0,7] /// <see cref="Species.Alcremie"/>: Topping (Strawberry, Star, etc); [0,7]
/// <see cref="Species.Yamask"/> How much damage the Pokémon has taken as Yamask-1 [0,9999].
/// <see cref="Species.Runerigus"/> How much damage the Pokémon has taken as Yamask-1 [0,9999].
/// </remarks> /// </remarks>
public interface IFormArgument public interface IFormArgument
{ {
/// <summary> /// <summary>
/// Argument for the associated <see cref="PKM.AltForm"/> /// Argument for the associated <see cref="PKM.Form"/>
/// </summary> /// </summary>
uint FormArgument { get; set; } uint FormArgument { get; set; }
} }

View file

@ -0,0 +1,7 @@
namespace PKHeX.Core
{
public interface IGeneration
{
int Generation { get; }
}
}

View file

@ -0,0 +1,8 @@
namespace PKHeX.Core
{
public interface ISpeciesForm
{
int Species { get; }
int Form { get; }
}
}

View file

@ -15,7 +15,7 @@
{ {
if (tr is PKM p) if (tr is PKM p)
{ {
var format = p.GenNumber; var format = p.Generation;
if ((format < 3 && p.Format >= 7) || format <= 0) // VC or bad gen if ((format < 3 && p.Format >= 7) || format <= 0) // VC or bad gen
return 4; // use TID/SID 16bit style return 4; // use TID/SID 16bit style
return format; return format;

View file

@ -5,7 +5,6 @@ namespace PKHeX.Core
public sealed class QRPK7 : IEncounterable public sealed class QRPK7 : IEncounterable
{ {
public GameVersion Version => (GameVersion)CassetteVersion; public GameVersion Version => (GameVersion)CassetteVersion;
public int Form => AltForm;
public string Name => nameof(QRPK7); public string Name => nameof(QRPK7);
public string LongName => Name; public string LongName => Name;
public bool EggEncounter => false; public bool EggEncounter => false;
@ -45,7 +44,7 @@ namespace PKHeX.Core
public int Nature => Data[0x22]; public int Nature => Data[0x22];
public bool FatefulEncounter => (Data[0x23] & 1) == 1; public bool FatefulEncounter => (Data[0x23] & 1) == 1;
public int Gender => (Data[0x23] >> 1) & 3; public int Gender => (Data[0x23] >> 1) & 3;
public int AltForm => Data[0x23] >> 3; public int Form => Data[0x23] >> 3;
public int EV_HP => Data[0x24]; public int EV_HP => Data[0x24];
public int EV_ATK => Data[0x25]; public int EV_ATK => Data[0x25];
public int EV_DEF => Data[0x26]; public int EV_DEF => Data[0x26];
@ -78,7 +77,7 @@ namespace PKHeX.Core
Gender = Gender, Gender = Gender,
Nature = Nature, Nature = Nature,
FatefulEncounter = FatefulEncounter, FatefulEncounter = FatefulEncounter,
AltForm = AltForm, Form = Form,
HyperTrainFlags = HT_Flags, HyperTrainFlags = HT_Flags,
IV_HP = IV_HP, IV_HP = IV_HP,
IV_ATK = IV_ATK, IV_ATK = IV_ATK,

View file

@ -5,7 +5,7 @@ using static PKHeX.Core.Species;
namespace PKHeX.Core namespace PKHeX.Core
{ {
/// <summary> /// <summary>
/// Retrieves localized form names for indicating <see cref="PKM.AltForm"/> values. /// Retrieves localized form names for indicating <see cref="PKM.Form"/> values.
/// </summary> /// </summary>
public static class FormConverter public static class FormConverter
{ {

View file

@ -326,7 +326,7 @@ namespace PKHeX.Core
} }
/// <summary> /// <summary>
/// Checks to see if a PKM is transferable relative to in-game restrictions and <see cref="PKM.AltForm"/>. /// Checks to see if a PKM is transferable relative to in-game restrictions and <see cref="PKM.Form"/>.
/// </summary> /// </summary>
/// <param name="pk">PKM to convert</param> /// <param name="pk">PKM to convert</param>
/// <param name="comment">Comment indicating why the <see cref="PKM"/> is not transferable.</param> /// <param name="comment">Comment indicating why the <see cref="PKM"/> is not transferable.</param>
@ -339,11 +339,11 @@ namespace PKHeX.Core
comment = string.Empty; comment = string.Empty;
return false; return false;
case 025 when pk.AltForm != 0 && pk.Gen6: // Cosplay Pikachu case 025 when pk.Form != 0 && pk.Gen6: // Cosplay Pikachu
case 172 when pk.AltForm != 0 && pk.Gen4: // Spiky Eared Pichu case 172 when pk.Form != 0 && pk.Gen4: // Spiky Eared Pichu
case 025 when pk.AltForm == 8 && pk.LGPE: // Buddy Pikachu case 025 when pk.Form == 8 && pk.LGPE: // Buddy Pikachu
case 133 when pk.AltForm == 1 && pk.LGPE: // Buddy Eevee case 133 when pk.Form == 1 && pk.LGPE: // Buddy Eevee
comment = MsgPKMConvertFailForme; comment = MsgPKMConvertFailForm;
return true; return true;
} }
} }

View file

@ -173,7 +173,7 @@ namespace PKHeX.Core
private static IOrderedEnumerable<PKM> FinalSortBy(this IOrderedEnumerable<PKM> result) private static IOrderedEnumerable<PKM> FinalSortBy(this IOrderedEnumerable<PKM> result)
{ {
var postSorted = result var postSorted = result
.ThenBy(p => p.AltForm) // altforms sorted .ThenBy(p => p.Form) // forms sorted
.ThenBy(p => p.Gender) // gender sorted .ThenBy(p => p.Gender) // gender sorted
.ThenBy(p => p.IsNicknamed); .ThenBy(p => p.IsNicknamed);
return postSorted; return postSorted;

View file

@ -112,7 +112,7 @@ namespace PKHeX.Core
/// <param name="gender">Current Gender</param> /// <param name="gender">Current Gender</param>
/// <param name="origin">Origin Generation</param> /// <param name="origin">Origin Generation</param>
/// <param name="nature">Nature</param> /// <param name="nature">Nature</param>
/// <param name="form">AltForm</param> /// <param name="form">Form</param>
/// <param name="oldPID">Current PID</param> /// <param name="oldPID">Current PID</param>
/// <remarks>Used to retain ability bits.</remarks> /// <remarks>Used to retain ability bits.</remarks>
/// <returns>Rerolled PID.</returns> /// <returns>Rerolled PID.</returns>

View file

@ -60,7 +60,7 @@ namespace PKHeX.Core
/// <returns>QR Message</returns> /// <returns>QR Message</returns>
public static string GetMessage(DataMysteryGift mg) public static string GetMessage(DataMysteryGift mg)
{ {
var server = GetExploitURLPrefixWC(mg.Format); var server = GetExploitURLPrefixWC(mg.Generation);
var data = mg.Write(); var data = mg.Write();
return GetMessageBase64(data, server); return GetMessageBase64(data, server);
} }

View file

@ -4,7 +4,7 @@ using System.Collections.Generic;
namespace PKHeX.Core namespace PKHeX.Core
{ {
/// <summary> /// <summary>
/// Stat/misc data for individual species or their associated alternate forme data. /// Stat/misc data for individual species or their associated alternate form data.
/// </summary> /// </summary>
public abstract class PersonalInfo public abstract class PersonalInfo
{ {
@ -159,19 +159,19 @@ namespace PKHeX.Core
public abstract int EscapeRate { get; set; } public abstract int EscapeRate { get; set; }
/// <summary> /// <summary>
/// Count of <see cref="PKM.AltForm"/> values the entry can have. /// Count of <see cref="PKM.Form"/> values the entry can have.
/// </summary> /// </summary>
public virtual int FormeCount { get; set; } = 1; public virtual int FormCount { get; set; } = 1;
/// <summary> /// <summary>
/// Pointer to the first <see cref="PKM.AltForm"/> <see cref="PersonalInfo"/> index /// Pointer to the first <see cref="PKM.Form"/> <see cref="PersonalInfo"/> index
/// </summary> /// </summary>
protected internal virtual int FormStatsIndex { get; set; } protected internal virtual int FormStatsIndex { get; set; }
/// <summary> /// <summary>
/// Pointer to the <see cref="PKM.AltForm"/> sprite index. /// Pointer to the <see cref="PKM.Form"/> sprite index.
/// </summary> /// </summary>
public virtual int FormeSprite { get; set; } public virtual int FormSprite { get; set; }
/// <summary> /// <summary>
/// Base Experience Yield factor /// Base Experience Yield factor
@ -243,29 +243,29 @@ namespace PKHeX.Core
internal void AddTypeTutors(byte[] data, int start = 0, int length = -1) => TypeTutors = GetBits(data, start, length); internal void AddTypeTutors(byte[] data, int start = 0, int length = -1) => TypeTutors = GetBits(data, start, length);
/// <summary> /// <summary>
/// Gets the <see cref="PersonalTable"/> <see cref="PKM.AltForm"/> entry index for the input criteria, with fallback for the original species entry. /// Gets the <see cref="PersonalTable"/> <see cref="PKM.Form"/> entry index for the input criteria, with fallback for the original species entry.
/// </summary> /// </summary>
/// <param name="species"><see cref="PKM.Species"/> to retrieve for</param> /// <param name="species"><see cref="PKM.Species"/> to retrieve for</param>
/// <param name="forme"><see cref="PKM.AltForm"/> to retrieve for</param> /// <param name="form"><see cref="PKM.Form"/> to retrieve for</param>
/// <returns>Index the <see cref="PKM.AltForm"/> exists as in the <see cref="PersonalTable"/>.</returns> /// <returns>Index the <see cref="PKM.Form"/> exists as in the <see cref="PersonalTable"/>.</returns>
public int FormeIndex(int species, int forme) public int FormIndex(int species, int form)
{ {
if (!HasForme(forme)) if (!HasForm(form))
return species; return species;
return FormStatsIndex + forme - 1; return FormStatsIndex + form - 1;
} }
/// <summary> /// <summary>
/// Checks if the <see cref="PersonalInfo"/> has the requested <see cref="PKM.AltForm"/> entry index available. /// Checks if the <see cref="PersonalInfo"/> has the requested <see cref="PKM.Form"/> entry index available.
/// </summary> /// </summary>
/// <param name="forme"><see cref="PKM.AltForm"/> to retrieve for</param> /// <param name="form"><see cref="PKM.Form"/> to retrieve for</param>
public bool HasForme(int forme) public bool HasForm(int form)
{ {
if (forme <= 0) // no forme requested if (form <= 0) // no forme requested
return false; return false;
if (FormStatsIndex <= 0) // no formes present if (FormStatsIndex <= 0) // no formes present
return false; return false;
if (forme >= FormeCount) // beyond range of species' formes if (form >= FormCount) // beyond range of species' formes
return false; return false;
return true; return true;
} }
@ -313,7 +313,7 @@ namespace PKHeX.Core
/// <summary> /// <summary>
/// Indicates if the entry has Formes or not. /// Indicates if the entry has Formes or not.
/// </summary> /// </summary>
public bool HasFormes => FormeCount > 1; public bool HasForms => FormCount > 1;
/// <summary> /// <summary>
/// Base Stat Total sum of all stats. /// Base Stat Total sum of all stats.
@ -321,15 +321,15 @@ namespace PKHeX.Core
public int BST => HP + ATK + DEF + SPE + SPA + SPD; public int BST => HP + ATK + DEF + SPE + SPA + SPD;
/// <summary> /// <summary>
/// Checks to see if the <see cref="PKM.AltForm"/> is valid within the <see cref="FormeCount"/> /// Checks to see if the <see cref="PKM.Form"/> is valid within the <see cref="FormCount"/>
/// </summary> /// </summary>
/// <param name="forme"></param> /// <param name="form"></param>
/// <returns></returns> /// <returns></returns>
public bool IsFormeWithinRange(int forme) public bool IsFormWithinRange(int form)
{ {
if (forme == 0) if (form == 0)
return true; return true;
return forme < FormeCount; return form < FormCount;
} }
/// <summary> /// <summary>

View file

@ -57,11 +57,11 @@ namespace PKHeX.Core
public sealed override int EscapeRate { get => Data[0x1B]; set => Data[0x1B] = (byte)value; } public sealed override int EscapeRate { get => Data[0x1B]; set => Data[0x1B] = (byte)value; }
protected internal override int FormStatsIndex { get => BitConverter.ToUInt16(Data, 0x1C); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x1C); } protected internal override int FormStatsIndex { get => BitConverter.ToUInt16(Data, 0x1C); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x1C); }
public sealed override int FormeSprite { get => BitConverter.ToUInt16(Data, 0x1E); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x1E); } public sealed override int FormSprite { get => BitConverter.ToUInt16(Data, 0x1E); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x1E); }
public sealed override int FormeCount { get => Data[0x20]; set => Data[0x20] = (byte)value; } public sealed override int FormCount { get => Data[0x20]; set => Data[0x20] = (byte)value; }
public sealed override int Color { get => Data[0x21] & 0x3F; set => Data[0x21] = (byte)((Data[0x21] & 0xC0) | (value & 0x3F)); } public sealed override int Color { get => Data[0x21] & 0x3F; set => Data[0x21] = (byte)((Data[0x21] & 0xC0) | (value & 0x3F)); }
public bool SpriteFlip { get => ((Data[0x21] >> 6) & 1) == 1; set => Data[0x21] = (byte)((Data[0x21] & ~0x40) | (value ? 0x40 : 0)); } public bool SpriteFlip { get => ((Data[0x21] >> 6) & 1) == 1; set => Data[0x21] = (byte)((Data[0x21] & ~0x40) | (value ? 0x40 : 0)); }
public bool SpriteForme { get => ((Data[0x21] >> 7) & 1) == 1; set => Data[0x21] = (byte)((Data[0x21] & ~0x80) | (value ? 0x80 : 0)); } public bool SpriteForm { get => ((Data[0x21] >> 7) & 1) == 1; set => Data[0x21] = (byte)((Data[0x21] & ~0x80) | (value ? 0x80 : 0)); }
public sealed override int BaseEXP { get => BitConverter.ToUInt16(Data, 0x22); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x22); } public sealed override int BaseEXP { get => BitConverter.ToUInt16(Data, 0x22); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x22); }
public sealed override int Height { get => BitConverter.ToUInt16(Data, 0x24); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x24); } public sealed override int Height { get => BitConverter.ToUInt16(Data, 0x24); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x24); }

View file

@ -23,7 +23,7 @@ namespace PKHeX.Core
} }
// Manually added attributes // Manually added attributes
public override int FormeCount { get => Data[0x29]; set {} } public override int FormCount { get => Data[0x29]; set {} }
protected internal override int FormStatsIndex { get => BitConverter.ToUInt16(Data, 0x2A); set {} } protected internal override int FormStatsIndex { get => BitConverter.ToUInt16(Data, 0x2A); set {} }
} }
} }

View file

@ -80,11 +80,11 @@ namespace PKHeX.Core
public int AbilityH { get => BitConverter.ToUInt16(Data, 0x1C); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x1C); } public int AbilityH { get => BitConverter.ToUInt16(Data, 0x1C); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x1C); }
public override int EscapeRate { get => 0; set { } } // moved? public override int EscapeRate { get => 0; set { } } // moved?
protected internal override int FormStatsIndex { get => BitConverter.ToUInt16(Data, 0x1E); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x1E); } protected internal override int FormStatsIndex { get => BitConverter.ToUInt16(Data, 0x1E); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x1E); }
public override int FormeSprite { get => BitConverter.ToUInt16(Data, 0x1E); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x1E); } // ??? public override int FormSprite { get => BitConverter.ToUInt16(Data, 0x1E); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x1E); } // ???
public override int FormeCount { get => Data[0x20]; set => Data[0x20] = (byte)value; } public override int FormCount { get => Data[0x20]; set => Data[0x20] = (byte)value; }
public override int Color { get => Data[0x21] & 0x3F; set => Data[0x21] = (byte)((Data[0x21] & 0xC0) | (value & 0x3F)); } public override int Color { get => Data[0x21] & 0x3F; set => Data[0x21] = (byte)((Data[0x21] & 0xC0) | (value & 0x3F)); }
public bool IsPresentInGame { get => ((Data[0x21] >> 6) & 1) == 1; set => Data[0x21] = (byte)((Data[0x21] & ~0x40) | (value ? 0x40 : 0)); } public bool IsPresentInGame { get => ((Data[0x21] >> 6) & 1) == 1; set => Data[0x21] = (byte)((Data[0x21] & ~0x40) | (value ? 0x40 : 0)); }
public bool SpriteForme { get => ((Data[0x21] >> 7) & 1) == 1; set => Data[0x21] = (byte)((Data[0x21] & ~0x80) | (value ? 0x80 : 0)); } public bool SpriteForm { get => ((Data[0x21] >> 7) & 1) == 1; set => Data[0x21] = (byte)((Data[0x21] & ~0x80) | (value ? 0x80 : 0)); }
public override int BaseEXP { get => BitConverter.ToUInt16(Data, 0x22); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x22); } public override int BaseEXP { get => BitConverter.ToUInt16(Data, 0x22); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x22); }
public override int Height { get => BitConverter.ToUInt16(Data, 0x24); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x24); } public override int Height { get => BitConverter.ToUInt16(Data, 0x24); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x24); }
public override int Weight { get => BitConverter.ToUInt16(Data, 0x26); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x26); } public override int Weight { get => BitConverter.ToUInt16(Data, 0x26); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x26); }

Some files were not shown because too many files have changed in this diff Show more