From a75ff7b2b0e3ae9a592d62b602938d959b1ab5fd Mon Sep 17 00:00:00 2001 From: abcboy101 <16735361+abcboy101@users.noreply.github.com> Date: Sat, 13 Sep 2025 13:52:17 -0400 Subject: [PATCH] Correct Gen 5+ status conditions (#4558) --- PKHeX.Core/PKM/Enums/StatusCondition.cs | 29 ++++++++++++------- PKHeX.Drawing.PokeSprite/Util/SpriteUtil.cs | 14 +++++++++ .../Controls/PKM Editor/StatusBrowser.cs | 10 ++++--- .../PKM Editor/StatusConditionView.cs | 27 ++++++++++++----- PKHeX.WinForms/Resources/text/lang_de.txt | 6 ++++ PKHeX.WinForms/Resources/text/lang_en.txt | 6 ++++ PKHeX.WinForms/Resources/text/lang_es.txt | 6 ++++ PKHeX.WinForms/Resources/text/lang_fr.txt | 6 ++++ PKHeX.WinForms/Resources/text/lang_it.txt | 6 ++++ PKHeX.WinForms/Resources/text/lang_ja.txt | 6 ++++ PKHeX.WinForms/Resources/text/lang_ko.txt | 6 ++++ .../Resources/text/lang_zh-Hans.txt | 6 ++++ .../Resources/text/lang_zh-Hant.txt | 6 ++++ PKHeX.WinForms/Util/DevUtil.cs | 1 + 14 files changed, 114 insertions(+), 21 deletions(-) diff --git a/PKHeX.Core/PKM/Enums/StatusCondition.cs b/PKHeX.Core/PKM/Enums/StatusCondition.cs index 1f6c7a5d2..8caf91081 100644 --- a/PKHeX.Core/PKM/Enums/StatusCondition.cs +++ b/PKHeX.Core/PKM/Enums/StatusCondition.cs @@ -2,6 +2,12 @@ namespace PKHeX.Core; +/// +/// Status condition flags for Generation 1-4. +/// +/// +/// Bad poison is only stored outside of battle in Generation 3 and 4. +/// [Flags] public enum StatusCondition { @@ -23,6 +29,19 @@ public enum StatusCondition PoisonBad = 1 << 7, } +/// +/// Status condition enum for Generation 5+. +/// +public enum StatusType +{ + None = 0, + Paralysis = 1, + Sleep = 2, + Freeze = 3, + Burn = 4, + Poison = 5, +} + public static class StatusConditionUtil { public static StatusType GetStatusType(this PKM pk) @@ -50,13 +69,3 @@ public static StatusType GetStatusType(this StatusCondition value) return StatusType.None; } } - -public enum StatusType -{ - None = 0, - Sleep = 1, - Poison = 2, - Burn = 3, - Freeze = 4, - Paralysis = 5, -} diff --git a/PKHeX.Drawing.PokeSprite/Util/SpriteUtil.cs b/PKHeX.Drawing.PokeSprite/Util/SpriteUtil.cs index 1d8d75568..480426087 100644 --- a/PKHeX.Drawing.PokeSprite/Util/SpriteUtil.cs +++ b/PKHeX.Drawing.PokeSprite/Util/SpriteUtil.cs @@ -333,4 +333,18 @@ public static Bitmap GetMysteryGiftPreviewPoke(MysteryGift gift) return Resources.sickfrostbite; return null; } + + public static Image? GetStatusSprite(this StatusType value) + { + return value switch + { + StatusType.None => null, + StatusType.Paralysis => Resources.sickparalyze, + StatusType.Sleep => Resources.sicksleep, + StatusType.Freeze => Resources.sickfrostbite, + StatusType.Burn => Resources.sickburn, + StatusType.Poison => Resources.sickpoison, + _ => null, + }; + } } diff --git a/PKHeX.WinForms/Controls/PKM Editor/StatusBrowser.cs b/PKHeX.WinForms/Controls/PKM Editor/StatusBrowser.cs index f68e04258..212f2f2da 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/StatusBrowser.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/StatusBrowser.cs @@ -17,7 +17,7 @@ public partial class StatusBrowser : Form private int StatusWidth => StatusHeight; private int StatusBrowserWidth => StatusWidth * 2; - public StatusBrowser() + public StatusBrowser(int generation) { InitializeComponent(); StatusHeight = Drawing.PokeSprite.Properties.Resources.sicksleep.Height; @@ -33,13 +33,15 @@ public StatusBrowser() }; Add(GetImage(StatusCondition.None, "None")); - Add(GetImage(StatusCondition.Sleep1, "Sleep"), false); - Add(NUD_Sleep); + Add(GetImage(StatusCondition.Sleep1, "Sleep"), generation >= 5); + if (generation <= 4) + Add(NUD_Sleep); Add(GetImage(StatusCondition.Poison, "Poison")); Add(GetImage(StatusCondition.Burn, "Burn")); Add(GetImage(StatusCondition.Paralysis, "Paralysis")); Add(GetImage(StatusCondition.Freeze, "Freeze")); - Add(GetImage(StatusCondition.PoisonBad, "Toxic")); + if (generation is 3 or 4) + Add(GetImage(StatusCondition.PoisonBad, "Toxic")); Height = StatusCount * StatusHeight; Width = StatusBrowserWidth; diff --git a/PKHeX.WinForms/Controls/PKM Editor/StatusConditionView.cs b/PKHeX.WinForms/Controls/PKM Editor/StatusConditionView.cs index 186bc5d47..f5cf3383f 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/StatusConditionView.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/StatusConditionView.cs @@ -39,7 +39,7 @@ public void LoadStoredValues() else if (pk.Stat_HPCurrent == 0) SetFaint(); else - SetStatus((StatusCondition)(pk.Status_Condition & 0xFF)); + SetStatus(pk.Status_Condition, pk.Format); Loading = false; } @@ -55,25 +55,38 @@ private void ClearStatus() Hover.RemoveAll(); } - private void SetStatus(StatusCondition status) + private void SetStatus(int value, int generation) { - PB_Status.Image = status.GetStatusSprite(); + if (generation <= 4) + { + StatusCondition status = (StatusCondition)(value & 0xFF); + PB_Status.Image = status.GetStatusSprite(); - var text = WinFormsTranslator.TranslateEnum(status, Main.CurrentLanguage); - Hover.SetToolTip(PB_Status, $"Status Condition: {text}"); + var text = WinFormsTranslator.TranslateEnum(status, Main.CurrentLanguage); + Hover.SetToolTip(PB_Status, $"Status Condition: {text}"); + } + else + { + StatusType status = (StatusType)(value & 0xFF); + PB_Status.Image = status.GetStatusSprite(); + + var text = WinFormsTranslator.TranslateEnum(status, Main.CurrentLanguage); + Hover.SetToolTip(PB_Status, $"Status Condition: {text}"); + } } private void PB_Status_Click(object sender, EventArgs e) { ArgumentNullException.ThrowIfNull(pk); - using var form = new StatusBrowser(); + int generation = pk.Format; + using var form = new StatusBrowser(generation); form.LoadList(pk); form.ShowDialog(); if (!form.WasChosen) return; var current = pk.Status_Condition; current &= ~0xFF; - current |= (int)form.Choice; + current |= generation <= 4 ? (int)form.Choice : (int)form.Choice.GetStatusType(); pk.Status_Condition = current; LoadStoredValues(); } diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index 0f37da30f..3ce647ee4 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -2553,6 +2553,12 @@ StatusCondition.Sleep4=Sleep (4 Turn) StatusCondition.Sleep5=Sleep (5 Turn) StatusCondition.Sleep6=Sleep (6 Turn) StatusCondition.Sleep7=Sleep (7 Turn) +StatusType.Burn=Burn +StatusType.Freeze=Freeze +StatusType.None=None +StatusType.Paralysis=Paralysis +StatusType.Poison=Poison +StatusType.Sleep=Sleep SuperTrainingEditor.B_All=Alle SuperTrainingEditor.B_Cancel=Abbrechen SuperTrainingEditor.B_None=Keine diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index 19f15938b..b0d0a1988 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -2553,6 +2553,12 @@ StatusCondition.Sleep4=Sleep (4 Turn) StatusCondition.Sleep5=Sleep (5 Turn) StatusCondition.Sleep6=Sleep (6 Turn) StatusCondition.Sleep7=Sleep (7 Turn) +StatusType.Burn=Burn +StatusType.Freeze=Freeze +StatusType.None=None +StatusType.Paralysis=Paralysis +StatusType.Poison=Poison +StatusType.Sleep=Sleep SuperTrainingEditor.B_All=Give All SuperTrainingEditor.B_Cancel=Cancel SuperTrainingEditor.B_None=Remove All diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index c028c2275..40f1b8013 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -2553,6 +2553,12 @@ StatusCondition.Sleep4=Sleep (4 Turn) StatusCondition.Sleep5=Sleep (5 Turn) StatusCondition.Sleep6=Sleep (6 Turn) StatusCondition.Sleep7=Sleep (7 Turn) +StatusType.Burn=Burn +StatusType.Freeze=Freeze +StatusType.None=None +StatusType.Paralysis=Paralysis +StatusType.Poison=Poison +StatusType.Sleep=Sleep SuperTrainingEditor.B_All=Dar todos SuperTrainingEditor.B_Cancel=Cancelar SuperTrainingEditor.B_None=Quitar todos diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index d6bbf597f..7a4dfc193 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -2553,6 +2553,12 @@ StatusCondition.Sleep4=Sleep (4 Turn) StatusCondition.Sleep5=Sleep (5 Turn) StatusCondition.Sleep6=Sleep (6 Turn) StatusCondition.Sleep7=Sleep (7 Turn) +StatusType.Burn=Burn +StatusType.Freeze=Freeze +StatusType.None=None +StatusType.Paralysis=Paralysis +StatusType.Poison=Poison +StatusType.Sleep=Sleep SuperTrainingEditor.B_All=Tout donner SuperTrainingEditor.B_Cancel=Annuler SuperTrainingEditor.B_None=Tout retirer diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index 63f3cdf65..954dab640 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -2553,6 +2553,12 @@ StatusCondition.Sleep4=Sleep (4 Turn) StatusCondition.Sleep5=Sleep (5 Turn) StatusCondition.Sleep6=Sleep (6 Turn) StatusCondition.Sleep7=Sleep (7 Turn) +StatusType.Burn=Burn +StatusType.Freeze=Freeze +StatusType.None=None +StatusType.Paralysis=Paralysis +StatusType.Poison=Poison +StatusType.Sleep=Sleep SuperTrainingEditor.B_All=Dai Tutto SuperTrainingEditor.B_Cancel=Annulla SuperTrainingEditor.B_None=Rimuovi Tutto diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index c7d29b413..c45481c9c 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -2553,6 +2553,12 @@ StatusCondition.Sleep4=Sleep (4 Turn) StatusCondition.Sleep5=Sleep (5 Turn) StatusCondition.Sleep6=Sleep (6 Turn) StatusCondition.Sleep7=Sleep (7 Turn) +StatusType.Burn=Burn +StatusType.Freeze=Freeze +StatusType.None=None +StatusType.Paralysis=Paralysis +StatusType.Poison=Poison +StatusType.Sleep=Sleep SuperTrainingEditor.B_All=全て取得 SuperTrainingEditor.B_Cancel=キャンセル SuperTrainingEditor.B_None=全て消去 diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index b68a3d59a..401566320 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -2553,6 +2553,12 @@ StatusCondition.Sleep4=Sleep (4 Turn) StatusCondition.Sleep5=Sleep (5 Turn) StatusCondition.Sleep6=Sleep (6 Turn) StatusCondition.Sleep7=Sleep (7 Turn) +StatusType.Burn=Burn +StatusType.Freeze=Freeze +StatusType.None=None +StatusType.Paralysis=Paralysis +StatusType.Poison=Poison +StatusType.Sleep=Sleep SuperTrainingEditor.B_All=모두 주기 SuperTrainingEditor.B_Cancel=취소 SuperTrainingEditor.B_None=모두 제거 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index 399b0e5eb..a2a858d7a 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -2553,6 +2553,12 @@ StatusCondition.Sleep4=睡眠(4回合) StatusCondition.Sleep5=睡眠(5回合) StatusCondition.Sleep6=睡眠(6回合) StatusCondition.Sleep7=睡眠(7回合) +StatusType.Burn=灼伤 +StatusType.Freeze=冰冻 +StatusType.None=无 +StatusType.Paralysis=麻痹 +StatusType.Poison=中毒 +StatusType.Sleep=睡眠 SuperTrainingEditor.B_All=获得全部 SuperTrainingEditor.B_Cancel=取消 SuperTrainingEditor.B_None=全部清除 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index e295df01f..bb79f9977 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -2553,6 +2553,12 @@ StatusCondition.Sleep4=Sleep (4 Turn) StatusCondition.Sleep5=Sleep (5 Turn) StatusCondition.Sleep6=Sleep (6 Turn) StatusCondition.Sleep7=Sleep (7 Turn) +StatusType.Burn=Burn +StatusType.Freeze=Freeze +StatusType.None=None +StatusType.Paralysis=Paralysis +StatusType.Poison=Poison +StatusType.Sleep=Sleep SuperTrainingEditor.B_All=獲得全部 SuperTrainingEditor.B_Cancel=取消 SuperTrainingEditor.B_None=全部清除 diff --git a/PKHeX.WinForms/Util/DevUtil.cs b/PKHeX.WinForms/Util/DevUtil.cs index 51f03bc6a..ae0e05aff 100644 --- a/PKHeX.WinForms/Util/DevUtil.cs +++ b/PKHeX.WinForms/Util/DevUtil.cs @@ -176,6 +176,7 @@ private static void UpdateTranslations() private static readonly Type[] EnumTypesToTranslate = [ typeof(StatusCondition), + typeof(StatusType), typeof(PokeSize), typeof(PokeSizeDetailed),