diff --git a/PKHeX.Core/Editing/Pokerus.cs b/PKHeX.Core/Editing/Pokerus.cs index fea80b73a..7aff49a57 100644 --- a/PKHeX.Core/Editing/Pokerus.cs +++ b/PKHeX.Core/Editing/Pokerus.cs @@ -49,16 +49,23 @@ public static bool IsStrainValid(PKM pk, int strain, int days) { if (!IsObtainable(pk)) return IsSusceptible(strain, days); - return IsStrainValid(strain, days); + if (pk.Format <= 2) + return IsStrainValid2(strain); + return IsStrainValid(strain); } /// - public static bool IsStrainValid(int strain, int days) => strain switch - { - 0 when days is not 0 => false, - 8 => false, - _ => true, - }; + /// + /// Strains 9+ are not obtainable due to game programming error (jmp label too early). + /// + public static bool IsStrainValid2(int strain) => strain <= 8; + + /// + /// + /// Gen3 R/S have a 30/255 chance of giving strain 0, and a 1/255 chance of giving strain 8. + /// Transfers will retain strain 0/8 and they're still able to infect others. + /// + public static bool IsStrainValid(int strain) => strain <= 0xF; /// /// Checks if the Pokérus value for Duration is possible to have on the input entity. @@ -88,7 +95,7 @@ public static bool IsDurationValid(int strain, int days, out int max) /// Strain number /// Duration remaining /// True if currently infected, and infectious to others. - public static bool IsInfectuous(int strain, int days) => strain != 0 && days != 0; + public static bool IsInfectious(int strain, int days) => days != 0; /// /// Checks if the Pokémon can be infected with the Pokérus. diff --git a/PKHeX.Core/PKM/PKM.cs b/PKHeX.Core/PKM/PKM.cs index 376e8bf16..fed0967b5 100644 --- a/PKHeX.Core/PKM/PKM.cs +++ b/PKHeX.Core/PKM/PKM.cs @@ -318,7 +318,7 @@ public int Generation } } - public bool PKRS_Infected { get => PKRS_Strain != 0; set => PKRS_Strain = value ? Math.Max(PKRS_Strain, 1) : 0; } + public bool PKRS_Infected { get => PKRS_Days != 0; set => PKRS_Strain = value ? Math.Max(PKRS_Strain, 1) : 0; } public bool PKRS_Cured { diff --git a/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs b/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs index aed3e31cb..9948abf78 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs @@ -56,9 +56,10 @@ private void SaveOT(PKM pk) private void LoadPKRS(PKM pk) { - Label_PKRS.Visible = CB_PKRSStrain.Visible = CHK_Infected.Checked = Label_PKRSdays.Visible = CB_PKRSDays.Visible = pk.PKRS_Infected; - LoadClamp(CB_PKRSStrain, pk.PKRS_Strain); + CHK_Infected.Checked = Label_PKRS.Visible = Label_PKRSdays.Visible = CB_PKRSStrain.Visible = CB_PKRSDays.Visible = pk.PKRS_Infected; CHK_Cured.Checked = pk.PKRS_Cured; + ChangePKRSstrainDropDownLists(CB_PKRSStrain.SelectedIndex, pk.PKRS_Strain, 0); + LoadClamp(CB_PKRSStrain, pk.PKRS_Strain); LoadClamp(CB_PKRSDays, pk.PKRS_Days); // clamp to valid day values for the current strain } diff --git a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs index 49048c7d9..8beb62e66 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs @@ -1043,21 +1043,32 @@ private void RefreshFormArguments() private void UpdatePKRSstrain(object sender, EventArgs e) { - // Change the PKRS Days to the legal bounds. - int currentDuration = CB_PKRSDays.SelectedIndex; - CB_PKRSDays.Items.Clear(); + if (!FieldsLoaded) + return; - var strain = CB_PKRSStrain.SelectedIndex; - int max = Pokerus.GetMaxDuration(strain); + // Change the PKRS Days to the legal bounds. + ChangePKRSstrainDropDownLists(-1, CB_PKRSStrain.SelectedIndex, CB_PKRSDays.SelectedIndex); + } + + private void ChangePKRSstrainDropDownLists(int oldStrain, int newStrain, int currentDuration) + { + if (oldStrain == newStrain) + return; + + CB_PKRSDays.Items.Clear(); + int max = Pokerus.GetMaxDuration(newStrain); for (int day = 0; day <= max; day++) CB_PKRSDays.Items.Add(day.ToString()); // Set the days back if they're legal - CB_PKRSDays.SelectedIndex = strain == 0 ? 0 : Math.Min(max, currentDuration); + CB_PKRSDays.SelectedIndex = Math.Min(max, currentDuration); } private void UpdatePKRSdays(object sender, EventArgs e) { + if (!FieldsLoaded) + return; + var days = CB_PKRSDays.SelectedIndex; if (days != 0) return; @@ -1072,19 +1083,22 @@ private void UpdatePKRSdays(object sender, EventArgs e) private void UpdatePKRSCured(object sender, EventArgs e) { + if (!FieldsLoaded) + return; + // Cured PokeRus is toggled if (CHK_Cured.Checked) { + // If we're cured we have to have a strain infection. + if (CB_PKRSStrain.SelectedIndex == 0) + CB_PKRSStrain.SelectedIndex = 1; + // Has Had PokeRus Label_PKRSdays.Visible = CB_PKRSDays.Visible = false; CB_PKRSDays.SelectedIndex = 0; Label_PKRS.Visible = CB_PKRSStrain.Visible = true; CHK_Infected.Checked = true; - - // If we're cured we have to have a strain infection. - if (CB_PKRSStrain.SelectedIndex == 0) - CB_PKRSStrain.SelectedIndex = 1; } else if (!CHK_Infected.Checked) { @@ -1107,6 +1121,9 @@ private void UpdatePKRSCured(object sender, EventArgs e) private void UpdatePKRSInfected(object sender, EventArgs e) { + if (!FieldsLoaded) + return; + if (CHK_Cured.Checked) { if (!CHK_Infected.Checked)