Correct Gen 5+ status conditions (#4558)

This commit is contained in:
abcboy101
2025-09-13 13:52:17 -04:00
committed by GitHub
parent efa1211c07
commit a75ff7b2b0
14 changed files with 114 additions and 21 deletions

View File

@@ -2,6 +2,12 @@
namespace PKHeX.Core;
/// <summary>
/// Status condition flags for Generation 1-4.
/// </summary>
/// <remarks>
/// Bad poison is only stored outside of battle in Generation 3 and 4.
/// </remarks>
[Flags]
public enum StatusCondition
{
@@ -23,6 +29,19 @@ public enum StatusCondition
PoisonBad = 1 << 7,
}
/// <summary>
/// Status condition enum for Generation 5+.
/// </summary>
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,
}

View File

@@ -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,
};
}
}

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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=全て消去

View File

@@ -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=모두 제거

View File

@@ -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=全部清除

View File

@@ -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=全部清除

View File

@@ -176,6 +176,7 @@ private static void UpdateTranslations()
private static readonly Type[] EnumTypesToTranslate =
[
typeof(StatusCondition),
typeof(StatusType),
typeof(PokeSize),
typeof(PokeSizeDetailed),