diff --git a/PKHeX.Core/Editing/CommonEdits.cs b/PKHeX.Core/Editing/CommonEdits.cs
index 07752e351..1693e2741 100644
--- a/PKHeX.Core/Editing/CommonEdits.cs
+++ b/PKHeX.Core/Editing/CommonEdits.cs
@@ -309,11 +309,11 @@ public static void ApplyHeldItem(this PKM pk, int item, EntityContext context)
public static int GetMaximumEV(this PKM pk, int index)
{
if (pk.Format < 3)
- return ushort.MaxValue;
+ return EffortValues.Max12;
var sum = pk.EVTotal - pk.GetEV(index);
- int remaining = 510 - sum;
- return Math.Clamp(remaining, 0, 252);
+ int remaining = EffortValues.Max510 - sum;
+ return Math.Clamp(remaining, 0, EffortValues.Max252);
}
///
diff --git a/PKHeX.Core/Legality/Verifiers/EffortValueVerifier.cs b/PKHeX.Core/Legality/Verifiers/EffortValueVerifier.cs
index 48e5bd876..d4c4c2c19 100644
--- a/PKHeX.Core/Legality/Verifiers/EffortValueVerifier.cs
+++ b/PKHeX.Core/Legality/Verifiers/EffortValueVerifier.cs
@@ -16,7 +16,6 @@ public sealed class EffortValueVerifier : Verifier
public override void Verify(LegalityAnalysis data)
{
var pk = data.Entity;
- var enc = data.EncounterMatch;
if (pk.IsEgg)
{
if (pk.EVTotal is not 0)
@@ -33,6 +32,7 @@ public override void Verify(LegalityAnalysis data)
if (sum > totalMax) // format >= 3
data.AddLine(GetInvalid(LEffortAbove510));
+ var enc = data.EncounterMatch;
Span evs = stackalloc int[6];
pk.GetEVs(evs);
if (format >= 6 && evs.IndexOfAny(253, 254, 255) != -1)
@@ -43,7 +43,7 @@ public override void Verify(LegalityAnalysis data)
// Only one of the following can be true: 0, 508, and x%6!=0
if (sum == 0 && !enc.IsWithinEncounterRange(pk))
data.AddLine(Get(LEffortEXPIncreased, Severity.Fishy));
- else if (sum == 508)
+ else if (sum == EffortValues.MaxEffective)
data.AddLine(Get(LEffort2Remaining, Severity.Fishy));
else if (evs[0] != 0 && evs.IndexOfAnyExcept(evs[0]) == -1)
data.AddLine(Get(LEffortAllEqual, Severity.Fishy));
diff --git a/PKHeX.Core/PKM/PA8.cs b/PKHeX.Core/PKM/PA8.cs
index 29d6eadba..ec539ed43 100644
--- a/PKHeX.Core/PKM/PA8.cs
+++ b/PKHeX.Core/PKM/PA8.cs
@@ -68,7 +68,7 @@ public override int CurrentFriendship
// Maximums
public override int MaxIV => 31;
- public override int MaxEV => 252;
+ public override int MaxEV => EffortValues.Max252;
public override int MaxStringLengthOT => 12;
public override int MaxStringLengthNickname => 12;
diff --git a/PKHeX.Core/PKM/PK5.cs b/PKHeX.Core/PKM/PK5.cs
index 9878fb237..283d2ad85 100644
--- a/PKHeX.Core/PKM/PK5.cs
+++ b/PKHeX.Core/PKM/PK5.cs
@@ -285,7 +285,7 @@ private static byte[] DecryptParty(byte[] data)
public override int MaxBallID => Legal.MaxBallID_5;
public override int MaxGameID => Legal.MaxGameID_5; // B2
public override int MaxIV => 31;
- public override int MaxEV => 255;
+ public override int MaxEV => EffortValues.Max255;
public override int MaxStringLengthOT => 7;
public override int MaxStringLengthNickname => 10;
@@ -351,13 +351,13 @@ public PK6 ConvertToPK6()
CNT_Tough = CNT_Tough,
CNT_Sheen = CNT_Sheen,
- // Cap EVs
- EV_HP = Math.Min(EV_HP, 252),
- EV_ATK = Math.Min(EV_ATK, 252),
- EV_DEF = Math.Min(EV_DEF, 252),
- EV_SPA = Math.Min(EV_SPA, 252),
- EV_SPD = Math.Min(EV_SPD, 252),
- EV_SPE = Math.Min(EV_SPE, 252),
+ // Cap EVs -- anything above 252 is dropped down to 252.
+ EV_HP = Math.Min(EV_HP , EffortValues.Max252),
+ EV_ATK = Math.Min(EV_ATK, EffortValues.Max252),
+ EV_DEF = Math.Min(EV_DEF, EffortValues.Max252),
+ EV_SPA = Math.Min(EV_SPA, EffortValues.Max252),
+ EV_SPD = Math.Min(EV_SPD, EffortValues.Max252),
+ EV_SPE = Math.Min(EV_SPE, EffortValues.Max252),
Move1 = Move1,
Move2 = Move2,
diff --git a/PKHeX.Core/PKM/PK9.cs b/PKHeX.Core/PKM/PK9.cs
index 74f2b1e82..ff02e2e12 100644
--- a/PKHeX.Core/PKM/PK9.cs
+++ b/PKHeX.Core/PKM/PK9.cs
@@ -69,7 +69,7 @@ public override int CurrentFriendship
// Maximums
public override int MaxIV => 31;
- public override int MaxEV => 252;
+ public override int MaxEV => EffortValues.Max252;
public override int MaxStringLengthOT => 12;
public override int MaxStringLengthNickname => 12;
diff --git a/PKHeX.Core/PKM/Searching/SearchUtil.cs b/PKHeX.Core/PKM/Searching/SearchUtil.cs
index 973abb570..f5aca6132 100644
--- a/PKHeX.Core/PKM/Searching/SearchUtil.cs
+++ b/PKHeX.Core/PKM/Searching/SearchUtil.cs
@@ -45,8 +45,8 @@ public static bool SatisfiesFilterLevel(PKM pk, SearchComparison option, int lev
{
1 => pk.EVTotal == 0, // None (0)
2 => pk.EVTotal is (not 0) and < 128, // Some (127-1)
- 3 => pk.EVTotal is >= 128 and < 508, // Half (128-507)
- 4 => pk.EVTotal >= 508, // Full (508+)
+ 3 => pk.EVTotal is >= 128 and < EffortValues.MaxEffective, // Half (128-507)
+ 4 => pk.EVTotal >= EffortValues.MaxEffective, // Full (508+)
_ => true,
};
diff --git a/PKHeX.Core/PKM/Shared/G4PKM.cs b/PKHeX.Core/PKM/Shared/G4PKM.cs
index bed461234..e3e94c811 100644
--- a/PKHeX.Core/PKM/Shared/G4PKM.cs
+++ b/PKHeX.Core/PKM/Shared/G4PKM.cs
@@ -18,7 +18,7 @@ public abstract class G4PKM : PKM,
public sealed override int MaxBallID => Legal.MaxBallID_4;
public sealed override int MaxGameID => Legal.MaxGameID_4;
public sealed override int MaxIV => 31;
- public sealed override int MaxEV => 255;
+ public sealed override int MaxEV => EffortValues.Max255;
public sealed override int MaxStringLengthOT => 7;
public sealed override int MaxStringLengthNickname => 10;
diff --git a/PKHeX.Core/PKM/Shared/G8PKM.cs b/PKHeX.Core/PKM/Shared/G8PKM.cs
index ca029f2f7..ba98fcef3 100644
--- a/PKHeX.Core/PKM/Shared/G8PKM.cs
+++ b/PKHeX.Core/PKM/Shared/G8PKM.cs
@@ -44,7 +44,7 @@ public override int CurrentFriendship
// Maximums
public override int MaxIV => 31;
- public override int MaxEV => 252;
+ public override int MaxEV => EffortValues.Max252;
public override int MaxStringLengthOT => 12;
public override int MaxStringLengthNickname => 12;
diff --git a/PKHeX.Core/PKM/Shared/GBPKM.cs b/PKHeX.Core/PKM/Shared/GBPKM.cs
index d861892e7..3821ec4e0 100644
--- a/PKHeX.Core/PKM/Shared/GBPKM.cs
+++ b/PKHeX.Core/PKM/Shared/GBPKM.cs
@@ -16,7 +16,7 @@ public abstract class GBPKM : PKM
public sealed override int MinGameID => (int)GameVersion.RD;
public sealed override int MaxGameID => (int)GameVersion.C;
public sealed override int MaxIV => 15;
- public sealed override int MaxEV => ushort.MaxValue;
+ public sealed override int MaxEV => EffortValues.Max12;
public sealed override ReadOnlySpan ExtraBytes => ReadOnlySpan.Empty;
diff --git a/PKHeX.Core/PKM/Util/EffortValues.cs b/PKHeX.Core/PKM/Util/EffortValues.cs
index 3ead48799..022986299 100644
--- a/PKHeX.Core/PKM/Util/EffortValues.cs
+++ b/PKHeX.Core/PKM/Util/EffortValues.cs
@@ -7,6 +7,19 @@ namespace PKHeX.Core;
///
public static class EffortValues
{
+ /// Maximum value for a single stat in Generation 1/2 formats.
+ public const ushort Max12 = ushort.MaxValue;
+ /// Maximum value for a single stat in Generation 6+ formats.
+ public const byte Max252 = 252;
+ /// Maximum value for a single stat in Generation 3-5 formats.
+ public const byte Max255 = 255;
+ /// Maximum value for the sum of all stats in Generation 3+ formats.
+ public const ushort Max510 = 510;
+ /// Since EVs are effective in multiples of 4, the leftover EVs (2) have no impact regardless of stat gained.
+ public const ushort MaxEffective = 508;
+ /// The leftover EVs if two stats are .
+ public const byte LeftoverDual252 = 6;
+
///
/// Gets randomized EVs for a given generation format
///
@@ -25,8 +38,8 @@ private static void SetRandom252(Span evs, Random rnd)
{
// Set random EVs (max 252 per stat) until we run out of EVs.
// The last stat index receives the remaining EVs
- const int maxTotal = 510;
- const int maxStat = 252;
+ const int maxTotal = Max510;
+ const int maxStat = Max252;
const int maxStatPlusBias = 300; // weight more towards the high end of received EVs
while (true) // loop until we get a valid set of 6 stats
{
@@ -34,7 +47,7 @@ private static void SetRandom252(Span evs, Random rnd)
for (int i = 0; i < evs.Length - 1; i++)
{
var max = Math.Min(maxStatPlusBias, remain);
- var amount = rnd.Next(0, max);
+ var amount = rnd.Next(0, max + 1);
if (amount > maxStat)
amount = maxStat;
remain -= (evs[i] = (byte)amount);
@@ -53,7 +66,7 @@ private static void SetRandom12(Span evs, Random rnd)
{
// In generation 1/2, EVs can be 0-65535.
for (int i = 0; i < evs.Length; i++)
- evs[i] = rnd.Next(ushort.MaxValue + 1);
+ evs[i] = rnd.Next(Max12 + 1);
}
///
@@ -76,15 +89,15 @@ private static void SetMax252(Span evs, PKM entity)
Span<(int Index, int Stat)> tuples = stackalloc (int, int)[6];
pi.GetSortedStatIndexes(tuples);
- evs[tuples[0].Index] = 252;
- evs[tuples[1].Index] = 252;
- evs[tuples[2].Index] = 6;
+ evs[tuples[0].Index] = Max252;
+ evs[tuples[1].Index] = Max252;
+ evs[tuples[2].Index] = LeftoverDual252;
}
private static void SetMax12(Span evs)
{
for (int i = 0; i < evs.Length; i++)
- evs[i] = ushort.MaxValue;
+ evs[i] = Max12;
}
///
@@ -92,4 +105,40 @@ private static void SetMax12(Span evs)
///
/// Array to store the resulting EVs
public static void Clear(Span evs) => evs.Clear();
+
+ public static EffortValueGrade GetGrade(int sum) => sum switch
+ {
+ 0 => EffortValueGrade.None,
+ <= 128 => EffortValueGrade.Quarter,
+ <= 256 => EffortValueGrade.Half,
+
+ < MaxEffective => EffortValueGrade.NearFull,
+ MaxEffective => EffortValueGrade.MaxEffective,
+ Max510 - 1 => EffortValueGrade.MaxNearCap,
+ Max510 => EffortValueGrade.MaxLegal,
+ _ => EffortValueGrade.Illegal,
+ };
+}
+
+///
+/// Assessment of the total EVs, compared to the maximum allowed.
+///
+public enum EffortValueGrade
+{
+ /// No EVs
+ None,
+ /// 1-128 EVs
+ Quarter,
+ /// 129-256 EVs
+ Half,
+ /// 257-508 EVs
+ NearFull,
+ /// 508 EVs
+ MaxEffective,
+ /// 509 EVs
+ MaxNearCap,
+ /// 510 EVs
+ MaxLegal,
+ /// 511+ EVs
+ Illegal,
}
diff --git a/PKHeX.Core/Saves/SAV1.cs b/PKHeX.Core/Saves/SAV1.cs
index 653ff0e32..f247fde47 100644
--- a/PKHeX.Core/Saves/SAV1.cs
+++ b/PKHeX.Core/Saves/SAV1.cs
@@ -227,7 +227,7 @@ private int GetBoxRawDataOffset(int box)
public override int MaxCoins => 9999;
public override int BoxCount => Japanese ? 8 : 12;
- public override int MaxEV => 65535;
+ public override int MaxEV => EffortValues.Max12;
public override int MaxIV => 15;
public override int Generation => 1;
public override EntityContext Context => EntityContext.Gen1;
diff --git a/PKHeX.Core/Saves/SAV1Stadium.cs b/PKHeX.Core/Saves/SAV1Stadium.cs
index 9e7b85d19..b855180dd 100644
--- a/PKHeX.Core/Saves/SAV1Stadium.cs
+++ b/PKHeX.Core/Saves/SAV1Stadium.cs
@@ -12,7 +12,7 @@ public sealed class SAV1Stadium : SAV_STADIUM
public override string SaveRevisionString => Japanese ? "J" : "U";
public override PersonalTable1 Personal => PersonalTable.Y;
- public override int MaxEV => ushort.MaxValue;
+ public override int MaxEV => EffortValues.Max12;
public override ReadOnlySpan HeldItems => Array.Empty();
public override GameVersion Version { get; protected set; } = GameVersion.Stadium;
diff --git a/PKHeX.Core/Saves/SAV1StadiumJ.cs b/PKHeX.Core/Saves/SAV1StadiumJ.cs
index f67faabb4..2a8de2297 100644
--- a/PKHeX.Core/Saves/SAV1StadiumJ.cs
+++ b/PKHeX.Core/Saves/SAV1StadiumJ.cs
@@ -13,7 +13,7 @@ public sealed class SAV1StadiumJ : SAV_STADIUM
public override string SaveRevisionString => "0"; // so we're different from Japanese SAV1Stadium naming...
public override PersonalTable1 Personal => PersonalTable.Y;
- public override int MaxEV => ushort.MaxValue;
+ public override int MaxEV => EffortValues.Max12;
public override ReadOnlySpan HeldItems => Array.Empty();
public override GameVersion Version { get; protected set; } = GameVersion.StadiumJ;
diff --git a/PKHeX.Core/Saves/SAV2.cs b/PKHeX.Core/Saves/SAV2.cs
index fb8a03b09..7d9f6462e 100644
--- a/PKHeX.Core/Saves/SAV2.cs
+++ b/PKHeX.Core/Saves/SAV2.cs
@@ -280,7 +280,7 @@ protected override byte[] GetFinalData()
public int EventFlagCount => 2000;
public override int BoxCount => Japanese ? 9 : 14;
- public override int MaxEV => 65535;
+ public override int MaxEV => EffortValues.Max12;
public override int MaxIV => 15;
public override int Generation => 2;
public override EntityContext Context => EntityContext.Gen2;
diff --git a/PKHeX.Core/Saves/SAV3.cs b/PKHeX.Core/Saves/SAV3.cs
index 31dbedddf..100d5d6f9 100644
--- a/PKHeX.Core/Saves/SAV3.cs
+++ b/PKHeX.Core/Saves/SAV3.cs
@@ -185,7 +185,7 @@ public void WriteBothSaveSlots(Span data)
public sealed override ReadOnlySpan HeldItems => Legal.HeldItems_RS;
public sealed override int BoxCount => 14;
- public sealed override int MaxEV => 255;
+ public sealed override int MaxEV => EffortValues.Max255;
public sealed override int Generation => 3;
public sealed override EntityContext Context => EntityContext.Gen3;
protected sealed override int GiftCountMax => 1;
diff --git a/PKHeX.Core/Saves/SAV3Colosseum.cs b/PKHeX.Core/Saves/SAV3Colosseum.cs
index 63ac2b16b..000ccb26e 100644
--- a/PKHeX.Core/Saves/SAV3Colosseum.cs
+++ b/PKHeX.Core/Saves/SAV3Colosseum.cs
@@ -145,7 +145,7 @@ private byte[] GetInnerData()
public override int MaxItemID => Legal.MaxItemID_3_COLO;
public override int MaxGameID => Legal.MaxGameID_3;
- public override int MaxEV => 255;
+ public override int MaxEV => EffortValues.Max255;
public override int Generation => 3;
public override EntityContext Context => EntityContext.Gen3;
protected override int GiftCountMax => 1;
diff --git a/PKHeX.Core/Saves/SAV3RSBox.cs b/PKHeX.Core/Saves/SAV3RSBox.cs
index f93fa5017..a9698858e 100644
--- a/PKHeX.Core/Saves/SAV3RSBox.cs
+++ b/PKHeX.Core/Saves/SAV3RSBox.cs
@@ -108,7 +108,7 @@ private byte[] GetInnerData()
public override int MaxBallID => Legal.MaxBallID_3;
public override int MaxGameID => Legal.MaxGameID_3;
- public override int MaxEV => 255;
+ public override int MaxEV => EffortValues.Max255;
public override int Generation => 3;
public override EntityContext Context => EntityContext.Gen3;
protected override int GiftCountMax => 1;
diff --git a/PKHeX.Core/Saves/SAV3XD.cs b/PKHeX.Core/Saves/SAV3XD.cs
index a168cc809..bbd67d003 100644
--- a/PKHeX.Core/Saves/SAV3XD.cs
+++ b/PKHeX.Core/Saves/SAV3XD.cs
@@ -188,7 +188,7 @@ private byte[] GetInnerData()
public override int MaxItemID => Legal.MaxItemID_3_XD;
public override int MaxGameID => Legal.MaxGameID_3;
- public override int MaxEV => 255;
+ public override int MaxEV => EffortValues.Max255;
public override int Generation => 3;
public override EntityContext Context => EntityContext.Gen3;
protected override int GiftCountMax => 1;
diff --git a/PKHeX.Core/Saves/SAV4BR.cs b/PKHeX.Core/Saves/SAV4BR.cs
index 614ac420f..d045d48fe 100644
--- a/PKHeX.Core/Saves/SAV4BR.cs
+++ b/PKHeX.Core/Saves/SAV4BR.cs
@@ -104,7 +104,7 @@ public int CurrentSlot
public override int MaxBallID => Legal.MaxBallID_4;
public override int MaxGameID => Legal.MaxGameID_4;
- public override int MaxEV => 255;
+ public override int MaxEV => EffortValues.Max255;
public override int Generation => 4;
public override EntityContext Context => EntityContext.Gen4;
protected override int GiftCountMax => 1;
diff --git a/PKHeX.Core/Saves/SAV5.cs b/PKHeX.Core/Saves/SAV5.cs
index d84138ad2..d732e5bcc 100644
--- a/PKHeX.Core/Saves/SAV5.cs
+++ b/PKHeX.Core/Saves/SAV5.cs
@@ -23,7 +23,7 @@ public abstract class SAV5 : SaveFile, ISaveBlock5BW, IEventFlag37
public override Type PKMType => typeof(PK5);
public override int BoxCount => 24;
- public override int MaxEV => 255;
+ public override int MaxEV => EffortValues.Max255;
public override int Generation => 5;
public override EntityContext Context => EntityContext.Gen5;
public override int MaxStringLengthOT => 7;
diff --git a/PKHeX.Core/Saves/SAV6.cs b/PKHeX.Core/Saves/SAV6.cs
index 2486db131..8227b0393 100644
--- a/PKHeX.Core/Saves/SAV6.cs
+++ b/PKHeX.Core/Saves/SAV6.cs
@@ -23,7 +23,7 @@ public abstract class SAV6 : SAV_BEEF, ITrainerStatRecord, ISaveBlock6Core, IReg
public override Type PKMType => typeof(PK6);
public override int BoxCount => 31;
- public override int MaxEV => 252;
+ public override int MaxEV => EffortValues.Max252;
public override int Generation => 6;
public override EntityContext Context => EntityContext.Gen6;
protected override int GiftCountMax => 24;
diff --git a/PKHeX.Core/Saves/SAV7.cs b/PKHeX.Core/Saves/SAV7.cs
index bdf72372f..f15f3c72f 100644
--- a/PKHeX.Core/Saves/SAV7.cs
+++ b/PKHeX.Core/Saves/SAV7.cs
@@ -70,7 +70,7 @@ protected void ReloadBattleTeams()
public override Type PKMType => typeof(PK7);
public override int BoxCount => 32;
- public override int MaxEV => 252;
+ public override int MaxEV => EffortValues.Max252;
public override int Generation => 7;
public override EntityContext Context => EntityContext.Gen7;
protected override int GiftCountMax => 48;
diff --git a/PKHeX.Core/Saves/SAV7b.cs b/PKHeX.Core/Saves/SAV7b.cs
index d1dc3a73a..a601895fc 100644
--- a/PKHeX.Core/Saves/SAV7b.cs
+++ b/PKHeX.Core/Saves/SAV7b.cs
@@ -74,7 +74,7 @@ private void Initialize()
public override int MaxAbilityID => Legal.MaxAbilityID_7b;
public override int MaxIV => 31;
- public override int MaxEV => 252;
+ public override int MaxEV => EffortValues.Max252;
public override int MaxStringLengthOT => 12;
public override int MaxStringLengthNickname => 12;
protected override int GiftCountMax => 48;
diff --git a/PKHeX.Core/Saves/SAV8BS.cs b/PKHeX.Core/Saves/SAV8BS.cs
index 25dd5528d..7dd9622d4 100644
--- a/PKHeX.Core/Saves/SAV8BS.cs
+++ b/PKHeX.Core/Saves/SAV8BS.cs
@@ -106,7 +106,7 @@ private void Initialize()
public override Type PKMType => typeof(PB8);
public override int BoxCount => BoxLayout8b.BoxCount;
- public override int MaxEV => 252;
+ public override int MaxEV => EffortValues.Max252;
public override int Generation => 8;
public override EntityContext Context => EntityContext.Gen8b;
diff --git a/PKHeX.Core/Saves/SAV8LA.cs b/PKHeX.Core/Saves/SAV8LA.cs
index 18d6b02b1..79f1f964a 100644
--- a/PKHeX.Core/Saves/SAV8LA.cs
+++ b/PKHeX.Core/Saves/SAV8LA.cs
@@ -60,7 +60,7 @@ public override void CopyChangesFrom(SaveFile sav)
public override PA8 BlankPKM => new();
public override Type PKMType => typeof(PA8);
- public override int MaxEV => 252;
+ public override int MaxEV => EffortValues.Max252;
public override int Generation => 8;
public override EntityContext Context => EntityContext.Gen8a;
public override int MaxStringLengthOT => 12;
diff --git a/PKHeX.Core/Saves/SAV8SWSH.cs b/PKHeX.Core/Saves/SAV8SWSH.cs
index 8126a782d..cc9c97255 100644
--- a/PKHeX.Core/Saves/SAV8SWSH.cs
+++ b/PKHeX.Core/Saves/SAV8SWSH.cs
@@ -147,7 +147,7 @@ private void Initialize()
public override Type PKMType => typeof(PK8);
public override int BoxCount => BoxLayout8.BoxCount;
- public override int MaxEV => 252;
+ public override int MaxEV => EffortValues.Max252;
public override int Generation => 8;
public override EntityContext Context => EntityContext.Gen8;
public override int MaxStringLengthOT => 12;
diff --git a/PKHeX.Core/Saves/SAV9SV.cs b/PKHeX.Core/Saves/SAV9SV.cs
index f269b4827..27924877e 100644
--- a/PKHeX.Core/Saves/SAV9SV.cs
+++ b/PKHeX.Core/Saves/SAV9SV.cs
@@ -142,7 +142,7 @@ private void Initialize()
public override Type PKMType => typeof(PK9);
public override int BoxCount => BoxLayout9.BoxCount;
- public override int MaxEV => 252;
+ public override int MaxEV => EffortValues.Max252;
public override int Generation => 9;
public override EntityContext Context => EntityContext.Gen9;
public override int MaxStringLengthOT => 12;
diff --git a/PKHeX.WinForms/Controls/PKM Editor/StatEditor.cs b/PKHeX.WinForms/Controls/PKM Editor/StatEditor.cs
index 60f82f425..5ba9645ac 100644
--- a/PKHeX.WinForms/Controls/PKM Editor/StatEditor.cs
+++ b/PKHeX.WinForms/Controls/PKM Editor/StatEditor.cs
@@ -371,11 +371,11 @@ private void UpdateEVTotals()
EVTip.SetToolTip(TB_EVTotal, $"Remaining: {510 - evtotal}");
}
- private Color GetEVTotalColor(int evtotal, Color defaultColor) => evtotal switch
+ private Color GetEVTotalColor(int evtotal, Color defaultColor) => EffortValues.GetGrade(evtotal) switch
{
- > 510 => EVsInvalid, // Background turns Red
- 510 => EVsMaxed, // Maximum EVs
- 508 => EVsFishy, // Fishy EVs
+ EffortValueGrade.Illegal => EVsInvalid, // Background turns Red
+ EffortValueGrade.MaxLegal => EVsMaxed, // Maximum EVs
+ EffortValueGrade.MaxEffective => EVsFishy, // Fishy EVs
_ => defaultColor,
};
diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_SecretBase.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_SecretBase.cs
index 599437dad..bbab2b618 100644
--- a/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_SecretBase.cs
+++ b/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_SecretBase.cs
@@ -192,12 +192,12 @@ private void SavePKM(SecretBase6PKM pk)
pk.Nature = WinFormsUtil.GetIndex(CB_Nature);
pk.Gender = EntityGender.GetFromString(Label_Gender.Text);
pk.Form = (byte)CB_Form.SelectedIndex;
- pk.EV_HP = Math.Min(Convert.ToInt32(TB_HPEV.Text), 252);
- pk.EV_ATK = Math.Min(Convert.ToInt32(TB_ATKEV.Text), 252);
- pk.EV_DEF = Math.Min(Convert.ToInt32(TB_DEFEV.Text), 252);
- pk.EV_SPA = Math.Min(Convert.ToInt32(TB_SPAEV.Text), 252);
- pk.EV_SPD = Math.Min(Convert.ToInt32(TB_SPDEV.Text), 252);
- pk.EV_SPE = Math.Min(Convert.ToInt32(TB_SPEEV.Text), 252);
+ pk.EV_HP = Math.Clamp(Convert.ToInt32(TB_HPEV.Text) , 0, EffortValues.Max252);
+ pk.EV_ATK = Math.Clamp(Convert.ToInt32(TB_ATKEV.Text), 0, EffortValues.Max252);
+ pk.EV_DEF = Math.Clamp(Convert.ToInt32(TB_DEFEV.Text), 0, EffortValues.Max252);
+ pk.EV_SPA = Math.Clamp(Convert.ToInt32(TB_SPAEV.Text), 0, EffortValues.Max252);
+ pk.EV_SPD = Math.Clamp(Convert.ToInt32(TB_SPDEV.Text), 0, EffortValues.Max252);
+ pk.EV_SPE = Math.Clamp(Convert.ToInt32(TB_SPEEV.Text), 0, EffortValues.Max252);
pk.Move1 = (ushort)WinFormsUtil.GetIndex(CB_Move1);
pk.Move2 = (ushort)WinFormsUtil.GetIndex(CB_Move2);
pk.Move3 = (ushort)WinFormsUtil.GetIndex(CB_Move3);
@@ -206,7 +206,7 @@ private void SavePKM(SecretBase6PKM pk)
pk.Move2_PPUps = CB_PPu2.SelectedIndex;
pk.Move3_PPUps = CB_PPu3.SelectedIndex;
pk.Move4_PPUps = CB_PPu4.SelectedIndex;
- pk.IV_HP = Convert.ToByte(TB_HPIV.Text) & 0x1F;
+ pk.IV_HP = Convert.ToByte(TB_HPIV.Text) & 0x1F;
pk.IV_ATK = Convert.ToByte(TB_ATKIV.Text) & 0x1F;
pk.IV_DEF = Convert.ToByte(TB_DEFIV.Text) & 0x1F;
pk.IV_SPA = Convert.ToByte(TB_SPAIV.Text) & 0x1F;