diff --git a/PKHeX.WinForms/Controls/PKM Editor/EditPK6.cs b/PKHeX.WinForms/Controls/PKM Editor/EditPK6.cs index a484c0c28..00686ffee 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/EditPK6.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/EditPK6.cs @@ -33,7 +33,6 @@ namespace PKHeX.WinForms.Controls SaveMisc3(pk6); SaveMisc4(pk6); SaveMisc6(pk6); - CheckTransferPIDValid(pk6); pk6.GroundTile = (GroundTileType)WinFormsUtil.GetIndex(CB_GroundTile); diff --git a/PKHeX.WinForms/Controls/PKM Editor/EditPK7.cs b/PKHeX.WinForms/Controls/PKM Editor/EditPK7.cs index 209c60f40..259f65ead 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/EditPK7.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/EditPK7.cs @@ -30,14 +30,13 @@ namespace PKHeX.WinForms.Controls SaveMisc3(pk7); SaveMisc4(pk7); SaveMisc6(pk7); - CheckTransferPIDValid(pk7); // Toss in Party Stats SavePartyStats(pk7); // Unneeded Party Stats (Status, Flags, Unused) - pk7.Data[0xE8] = pk7.Data[0xE9] = pk7.Data[0xEA] = pk7.Data[0xEB] = - pk7.Data[0xED] = pk7.Data[0xEE] = pk7.Data[0xEF] = + pk7.Status_Condition = pk7.DirtType = pk7.DirtLocation = + pk7.Data[0xEF] = pk7.Data[0xFE] = pk7.Data[0xFF] = pk7.Data[0x100] = pk7.Data[0x101] = pk7.Data[0x102] = pk7.Data[0x103] = 0; diff --git a/PKHeX.WinForms/Controls/PKM Editor/EditPK8.cs b/PKHeX.WinForms/Controls/PKM Editor/EditPK8.cs index fa7174578..ce04ffef1 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/EditPK8.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/EditPK8.cs @@ -33,7 +33,6 @@ namespace PKHeX.WinForms.Controls SaveMisc4(pk8); SaveMisc6(pk8); SaveMisc8(pk8); - CheckTransferPIDValid(pk8); // Toss in Party Stats SavePartyStats(pk8); diff --git a/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs b/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs index fdeb27e29..bf272e3ef 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs @@ -20,10 +20,13 @@ namespace PKHeX.WinForms.Controls private void LoadSpeciesLevelEXP(PKM pk) { - // Do first - pk.Stat_Level = Experience.GetLevel(pk.EXP, pk.PersonalInfo.EXPGrowth); - if (pk.Stat_Level == 100 && !HaX) - pk.EXP = Experience.GetEXP(pk.Stat_Level, pk.PersonalInfo.EXPGrowth); + if (!HaX) + { + // Sanity check level and EXP + var current = pk.CurrentLevel; + if (current == 100) // clamp back to max EXP + pk.CurrentLevel = 100; + } CB_Species.SelectedValue = pk.Species; TB_Level.Text = pk.Stat_Level.ToString(); @@ -34,11 +37,12 @@ namespace PKHeX.WinForms.Controls { pk.Species = WinFormsUtil.GetIndex(CB_Species); pk.EXP = Util.ToUInt32(TB_EXP.Text); + pk.Stat_Level = Util.ToInt32(TB_Level.Text); } private void LoadOT(PKM pk) { - GB_OT.BackgroundImage = null; + GB_OT.BackgroundImage = null; // clear the Current Handler indicator just in case we switched formats. TB_OT.Text = pk.OT_Name; Label_OTGender.Text = gendersymbols[pk.OT_Gender]; Label_OTGender.ForeColor = Draw.GetGenderColor(pk.OT_Gender); @@ -52,11 +56,10 @@ namespace PKHeX.WinForms.Controls private void LoadPKRS(PKM pk) { - Label_PKRS.Visible = CB_PKRSStrain.Visible = CHK_Infected.Checked = pk.PKRS_Strain != 0; - Label_PKRSdays.Visible = CB_PKRSDays.Visible = pk.PKRS_Days != 0; + Label_PKRS.Visible = CB_PKRSStrain.Visible = CHK_Infected.Checked = Label_PKRSdays.Visible = CB_PKRSDays.Visible = pk.PKRS_Infected; CB_PKRSStrain.SelectedIndex = pk.PKRS_Strain; - CHK_Cured.Checked = pk.PKRS_Strain > 0 && pk.PKRS_Days == 0; - CB_PKRSDays.SelectedIndex = Math.Min(CB_PKRSDays.Items.Count - 1, pk.PKRS_Days); // to strip out bad hacked 'rus + CHK_Cured.Checked = pk.PKRS_Cured; + CB_PKRSDays.SelectedIndex = Math.Min(CB_PKRSDays.Items.Count - 1, pk.PKRS_Days); // clamp to valid day values for the current strain } private void SavePKRS(PKM pk) @@ -67,7 +70,7 @@ namespace PKHeX.WinForms.Controls private void LoadIVs(PKM pk) => Stats.LoadIVs(pk.IVs); private void LoadEVs(PKM pk) => Stats.LoadEVs(pk.EVs); - private void LoadAVs(IAwakened a) => Stats.LoadAVs(a); + private void LoadAVs(IAwakened pk) => Stats.LoadAVs(pk); private void LoadMoves(PKM pk) { @@ -101,20 +104,20 @@ namespace PKHeX.WinForms.Controls pk.Move4_PPUps = WinFormsUtil.GetIndex(CB_Move4) > 0 ? CB_PPu4.SelectedIndex : 0; } - private void LoadShadow3(IShadowPKM ck3) + private void LoadShadow3(IShadowPKM pk) { - NUD_ShadowID.Value = ck3.ShadowID; - FLP_Purification.Visible = ck3.ShadowID > 0; - if (ck3.ShadowID > 0) + NUD_ShadowID.Value = pk.ShadowID; + FLP_Purification.Visible = pk.ShadowID > 0; + if (pk.ShadowID > 0) { - int value = ck3.Purification; + int value = pk.Purification; if (value < NUD_Purification.Minimum) value = (int)NUD_Purification.Minimum; NUD_Purification.Value = value; - CHK_Shadow.Checked = ck3.IsShadow; + CHK_Shadow.Checked = pk.IsShadow; - NUD_ShadowID.Value = Math.Max(ck3.ShadowID, 0); + NUD_ShadowID.Value = Math.Max(pk.ShadowID, 0); } else { @@ -124,11 +127,11 @@ namespace PKHeX.WinForms.Controls } } - private void SaveShadow3(IShadowPKM ck3) + private void SaveShadow3(IShadowPKM pk) { - ck3.ShadowID = (int)NUD_ShadowID.Value; - if (ck3.ShadowID > 0) - ck3.Purification = (int)NUD_Purification.Value; + pk.ShadowID = (int)NUD_ShadowID.Value; + if (pk.ShadowID > 0) + pk.Purification = (int)NUD_Purification.Value; } private void LoadRelearnMoves(PKM pk) @@ -139,12 +142,12 @@ namespace PKHeX.WinForms.Controls CB_RelearnMove4.SelectedValue = pk.RelearnMove4; } - private void SaveRelearnMoves(PKM pk7) + private void SaveRelearnMoves(PKM pk) { - pk7.RelearnMove1 = WinFormsUtil.GetIndex(CB_RelearnMove1); - pk7.RelearnMove2 = WinFormsUtil.GetIndex(CB_RelearnMove2); - pk7.RelearnMove3 = WinFormsUtil.GetIndex(CB_RelearnMove3); - pk7.RelearnMove4 = WinFormsUtil.GetIndex(CB_RelearnMove4); + pk.RelearnMove1 = WinFormsUtil.GetIndex(CB_RelearnMove1); + pk.RelearnMove2 = WinFormsUtil.GetIndex(CB_RelearnMove2); + pk.RelearnMove3 = WinFormsUtil.GetIndex(CB_RelearnMove3); + pk.RelearnMove4 = WinFormsUtil.GetIndex(CB_RelearnMove4); } private void LoadMisc1(PKM pk) @@ -176,8 +179,8 @@ namespace PKHeX.WinForms.Controls TB_Friendship.Text = pk.CurrentFriendship.ToString(); - Label_HatchCounter.Visible = CHK_IsEgg.Checked && Entity.Format > 1; - Label_Friendship.Visible = !CHK_IsEgg.Checked && Entity.Format > 1; + Label_HatchCounter.Visible = CHK_IsEgg.Checked; + Label_Friendship.Visible = !CHK_IsEgg.Checked; } private void SaveMisc2(PKM pk) @@ -210,7 +213,9 @@ namespace PKHeX.WinForms.Controls TID_Trainer.LoadIDValues(pk); // Load Extrabyte Value - TB_ExtraByte.Text = pk.Data[Convert.ToInt32(CB_ExtraBytes.Text, 16)].ToString(); + var offset = Convert.ToInt32(CB_ExtraBytes.Text, 16); + var value = pk.Data[offset]; + TB_ExtraByte.Text = value.ToString(); } private void SaveMisc3(PKM pk) @@ -274,12 +279,16 @@ namespace PKHeX.WinForms.Controls private void LoadMisc6(PKM pk) { TB_EC.Text = $"{pk.EncryptionConstant:X8}"; - int abil = pk.AbilityNumber < 6 ? pk.AbilityNumber >> 1 : 0; - if (CB_Ability.Items.Count <= abil) - abil = CB_Ability.Items.Count - 1; - CB_Ability.SelectedIndex = abil; // with some simple error handling DEV_Ability.SelectedValue = pk.Ability; - TB_AbilityNumber.Text = pk.AbilityNumber.ToString(); + + // with some simple error handling + var bitNumber = pk.AbilityNumber; + int abilityIndex = AbilityVerifier.IsValidAbilityBits(bitNumber) ? bitNumber >> 1 : 0; + if (abilityIndex >= CB_Ability.Items.Count) // sanity check ability count being possible + abilityIndex = CB_Ability.Items.Count - 1; // last possible index, if out of range + + CB_Ability.SelectedIndex = abilityIndex; + TB_AbilityNumber.Text = bitNumber.ToString(); LoadRelearnMoves(pk); LoadHandlingTrainer(pk); @@ -291,6 +300,9 @@ namespace PKHeX.WinForms.Controls private void SaveMisc6(PKM pk) { pk.EncryptionConstant = Util.GetHexValue(TB_EC.Text); + if (PIDVerifier.GetTransferEC(pk, out var ec)) + pk.EncryptionConstant = ec; + pk.AbilityNumber = Util.ToInt32(TB_AbilityNumber.Text); SaveRelearnMoves(pk); @@ -316,26 +328,29 @@ namespace PKHeX.WinForms.Controls private void LoadHandlingTrainer(PKM pk) { - TB_OTt2.Text = pk.HT_Name; + var handler = pk.HT_Name; int gender = pk.HT_Gender & 1; + + TB_OTt2.Text = handler; // Set CT Gender to None if no CT, else set to gender symbol. - Label_CTGender.Text = string.IsNullOrEmpty(pk.HT_Name) ? string.Empty : gendersymbols[gender]; + Label_CTGender.Text = string.IsNullOrEmpty(handler) ? string.Empty : gendersymbols[gender]; Label_CTGender.ForeColor = Draw.GetGenderColor(gender); // Indicate who is currently in possession of the PKM - UpadteHandlingTrainerBackground(pk); + UpadteHandlingTrainerBackground(pk.CurrentHandler); } - private void UpadteHandlingTrainerBackground(PKM pk) + private void UpadteHandlingTrainerBackground(int handler) { - if (pk.CurrentHandler == 0) // OT + var activeColor = ImageUtil.ChangeOpacity(SpriteUtil.Spriter.Set, 0.5); + if (handler == 0) // OT { - GB_OT.BackgroundImage = ImageUtil.ChangeOpacity(SpriteUtil.Spriter.Set, 0.5); + GB_OT.BackgroundImage = activeColor; GB_nOT.BackgroundImage = null; } else // Handling Trainer { - GB_nOT.BackgroundImage = ImageUtil.ChangeOpacity(SpriteUtil.Spriter.Set, 0.5); + GB_nOT.BackgroundImage = activeColor; GB_OT.BackgroundImage = null; } } @@ -346,37 +361,6 @@ namespace PKHeX.WinForms.Controls pk.HT_Gender = PKX.GetGenderFromString(Label_CTGender.Text) & 1; } - // Misc - private static void CheckTransferPIDValid(PKM pk) - { - var ver = pk.Version; - if (ver is 0 or >= (int)GameVersion.X) // Gen6+ ignored - return; - - uint EC = pk.EncryptionConstant; - uint PID = pk.PID; - uint LID = PID & 0xFFFF; - uint HID = PID >> 16; - uint XOR = (uint)(pk.TID ^ LID ^ pk.SID ^ HID); - - // Ensure we don't have a shiny. - if (XOR >> 3 == 1) // Illegal, fix. (not 16=8) - { - // Keep as shiny, so we have to mod the EC - pk.EncryptionConstant = PID ^ 0x80000000; - } - else if ((XOR ^ 0x8000) >> 3 == 1 && PID != EC) - { - // Already anti-shiny, ensure the anti-shiny relationship is present. - pk.EncryptionConstant = PID ^ 0x80000000; - } - else - { - // Ensure the copy correlation is present. - pk.EncryptionConstant = PID; - } - } - private void LoadAbility4(PKM pk) { var index = GetAbilityIndex4(pk); diff --git a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs index 7d7f228b3..7ecac78f1 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs @@ -21,14 +21,13 @@ namespace PKHeX.WinForms.Controls InitializeComponent(); // Groupbox doesn't show Click event in Designer... - GB_OT.Click += (_, args) => ClickGT(GB_OT, args); - GB_nOT.Click += (_, args) => ClickGT(GB_nOT, args); - GB_CurrentMoves.Click += (_, args) => ClickMoves(GB_CurrentMoves, args); - GB_RelearnMoves.Click += (_, args) => ClickMoves(GB_RelearnMoves, args); + GB_OT.Click += ClickGT; + GB_nOT.Click += ClickGT; + GB_CurrentMoves.Click += ClickMoves; + GB_RelearnMoves.Click += ClickMoves; - TB_Nickname.Font = FontUtil.GetPKXFont(); - TB_OT.Font = (Font)TB_Nickname.Font.Clone(); - TB_OTt2.Font = (Font)TB_Nickname.Font.Clone(); + var font = FontUtil.GetPKXFont(); + TB_Nickname.Font = TB_OT.Font = TB_OTt2.Font = font; // Commonly reused Control arrays Moves = new[] { CB_Move1, CB_Move2, CB_Move3, CB_Move4 }; @@ -36,21 +35,56 @@ namespace PKHeX.WinForms.Controls PPUps = new[] { CB_PPu1, CB_PPu2, CB_PPu3, CB_PPu4 }; MovePP = new[] { TB_PP1, TB_PP2, TB_PP3, TB_PP4 }; Markings = new[] { PB_Mark1, PB_Mark2, PB_Mark3, PB_Mark4, PB_Mark5, PB_Mark6 }; - ValidationRequired = Moves.Concat(Relearn).Concat(new[] - { - CB_Species, CB_Nature, CB_HeldItem, CB_Ability, // Main Tab - CB_MetLocation, CB_EggLocation, CB_Ball, // Met Tab - CB_StatNature, - }).ToArray(); + + // Legality Indicators relearnPB = new[] { PB_WarnRelearn1, PB_WarnRelearn2, PB_WarnRelearn3, PB_WarnRelearn4 }; movePB = new[] { PB_WarnMove1, PB_WarnMove2, PB_WarnMove3, PB_WarnMove4 }; + // Validation of incompletely entered data fields + bool Criteria(Control c) => c.BackColor == Draw.InvalidSelection && c is ComboBox x && x.Items.Count is not 0; + ValidatedControls = new ValidationRequiredSet[] + { + new(Moves, _ => true, Criteria), + new(new[] {CB_Species}, _ => true, Criteria), + new(new[] {CB_HeldItem}, pk => pk.Format >= 2, Criteria), + new(new[] {CB_Ability, CB_Nature, CB_MetLocation, CB_Ball}, pk => pk.Format >= 3, Criteria), + new(new[] {CB_EggLocation}, pk => pk.Format >= 4, Criteria), + new(new [] {CB_Country, CB_SubRegion}, pk => pk is PK6 or PK7, Criteria), + new(Relearn, pk => pk.Format >= 6, Criteria), + new(new[] {CB_StatNature}, pk => pk.Format >= 8, Criteria), + }; + foreach (var c in WinFormsUtil.GetAllControlsOfType(this)) c.KeyDown += WinFormsUtil.RemoveDropCB; Stats.MainEditor = this; LoadShowdownSet = LoadShowdownSetDefault; - TID_Trainer.UpdatedID += (_, args) => Update_ID(TID_Trainer, args); + TID_Trainer.UpdatedID += Update_ID; + + // Controls contained in a TabPage are not created until the tab page is shown + // Any data bindings in these controls are not activated until the tab page is shown. + FlickerInterface(); + } + + private class ValidationRequiredSet + { + private readonly Control[] Controls; + private readonly Func ShouldCheck; + private readonly Func IsInvalidState; + + public Control? IsNotValid(PKM pk) + { + if (!ShouldCheck(pk)) + return null; + return Array.Find(Controls, z => IsInvalidState(z)); + } + + public ValidationRequiredSet(Control[] controls, Func shouldCheck, Func state) + { + Controls = controls; + ShouldCheck = shouldCheck; + IsInvalidState = state; + } } public void InitializeBinding() @@ -149,7 +183,8 @@ namespace PKHeX.WinForms.Controls public SaveFile RequestSaveFile => SaveFileRequested.Invoke(this, EventArgs.Empty); public bool PKMIsUnsaved => FieldsLoaded && LastData.Any(b => b != 0) && !LastData.SequenceEqual(CurrentPKM.Data); - private readonly ComboBox[] Moves, Relearn, ValidationRequired, PPUps; + private readonly ComboBox[] Moves, Relearn, PPUps; + private readonly ValidationRequiredSet[] ValidatedControls; private readonly MaskedTextBox[] MovePP; private readonly PictureBox[] Markings; @@ -176,12 +211,20 @@ namespace PKHeX.WinForms.Controls if (ModifierKeys == (Keys.Control | Keys.Shift | Keys.Alt)) return true; // Override - var cb = Array.Find(ValidationRequired, c => c.BackColor == Draw.InvalidSelection && c.Items.Count != 0); + // If any controls are partially filled out, find the first one so we can indicate as such. + Control? cb = null; + foreach (var type in ValidatedControls) + { + cb = type.IsNotValid(Entity); + if (cb is not null) + break; + } + if (cb != null) tabMain.SelectedTab = WinFormsUtil.FindFirstControlOfType(cb); else if (!Stats.Valid) tabMain.SelectedTab = Tab_Stats; - else if (WinFormsUtil.GetIndex(CB_Species) == 0) + else if (WinFormsUtil.GetIndex(CB_Species) == 0 && !HaX) // can't set an empty slot... tabMain.SelectedTab = Tab_Main; else return true; @@ -278,7 +321,7 @@ namespace PKHeX.WinForms.Controls Stats.UpdateIVs(this, EventArgs.Empty); UpdatePKRSInfected(this, EventArgs.Empty); UpdatePKRSCured(this, EventArgs.Empty); - UpdateNatureModification(CB_StatNature, 1); + UpdateNatureModification(CB_StatNature, Entity.StatNature); if (HaX) // Load original values from pk not pkm { @@ -323,8 +366,10 @@ namespace PKHeX.WinForms.Controls img = Resources.hint; else img = null; - movePB[i].Visible = true; - movePB[i].Image = img; + + var pb = movePB[i]; + pb.Visible = true; + pb.Image = img; } if (Entity.Format >= 6) @@ -677,7 +722,7 @@ namespace PKHeX.WinForms.Controls UpdateLegality(); } - private void ClickGT(object sender, EventArgs e) + private void ClickGT(object? sender, EventArgs e) { if (!GB_nOT.Visible) return; @@ -686,7 +731,7 @@ namespace PKHeX.WinForms.Controls Entity.CurrentHandler = 0; else if (TB_OTt2.Text.Length > 0) Entity.CurrentHandler = 1; - UpadteHandlingTrainerBackground(Entity); + UpadteHandlingTrainerBackground(Entity.CurrentHandler); TB_Friendship.Text = Entity.CurrentFriendship.ToString(); } @@ -701,7 +746,7 @@ namespace PKHeX.WinForms.Controls CB_StatNature.SelectedIndex = CB_Nature.SelectedIndex; } - private void ClickMoves(object sender, EventArgs e) + private void ClickMoves(object? sender, EventArgs e) { UpdateLegality(skipMoveRepop: true); if (sender == GB_CurrentMoves) @@ -1259,10 +1304,13 @@ namespace PKHeX.WinForms.Controls if (CB_ExtraBytes.Items.Count == 0 || sender is not MaskedTextBox mtb) return; // Changed Extra Byte's Value - if (Util.ToInt32(mtb.Text) > byte.MaxValue) + var value = Util.ToInt32(mtb.Text); + if (value > byte.MaxValue) + { mtb.Text = "255"; + return; // above statement triggers the event again. + } - int value = Util.ToInt32(mtb.Text); int offset = Convert.ToInt32(CB_ExtraBytes.Text, 16); Entity.Data[offset] = (byte)value; } @@ -1272,13 +1320,13 @@ namespace PKHeX.WinForms.Controls if (CB_ExtraBytes.Items.Count == 0) return; // Byte changed, need to refresh the Text box for the byte's value. - TB_ExtraByte.Text = Entity.Data[Convert.ToInt32(CB_ExtraBytes.Text, 16)].ToString(); + var offset = Convert.ToInt32(CB_ExtraBytes.Text, 16); + TB_ExtraByte.Text = Entity.Data[offset].ToString(); } - private void UpdateNatureModification(ComboBox cb, int type) + private void UpdateNatureModification(ComboBox cb, int nature) { - // 0 = Nature, 1 = Stat Nature - string text = Stats.UpdateNatureModification((type == 0) ? Entity.Nature : Entity.StatNature); + string text = Stats.UpdateNatureModification(nature); NatureTip.SetToolTip(cb, text); } @@ -1532,7 +1580,7 @@ namespace PKHeX.WinForms.Controls Tip3.SetToolTip(TB_PID, tip); } - private void Update_ID(object sender, EventArgs e) + private void Update_ID(object? sender, EventArgs e) { if (!FieldsLoaded) return; @@ -1632,14 +1680,14 @@ namespace PKHeX.WinForms.Controls if (Entity.Format <= 4) UpdateRandomPID(sender, e); Entity.Nature = WinFormsUtil.GetIndex(CB_Nature); - UpdateNatureModification(CB_Nature, 0); + UpdateNatureModification(CB_Nature, Entity.Nature); Stats.UpdateIVs(sender, EventArgs.Empty); // updating Nature will trigger stats to update as well UpdateLegality(); } else if (sender == CB_StatNature) { Entity.StatNature = WinFormsUtil.GetIndex(CB_StatNature); - UpdateNatureModification(CB_StatNature, 1); + UpdateNatureModification(CB_StatNature, Entity.StatNature); Stats.UpdateIVs(sender, EventArgs.Empty); // updating Nature will trigger stats to update as well UpdateLegality(); } @@ -1654,13 +1702,23 @@ namespace PKHeX.WinForms.Controls if (!FieldsLoaded) return; - ValidateComboBox((ComboBox)sender); - if (Moves.Contains(sender)) // Move + var cb = (ComboBox) sender; + ValidateComboBox(cb); + if (Moves.Contains(cb)) // Move UpdatePP(sender, e); - // Legality - Entity.Moves = Moves.Select(WinFormsUtil.GetIndex).ToArray(); - Entity.RelearnMoves = Relearn.Select(WinFormsUtil.GetIndex).ToArray(); + // Legality -- set all moves back (why all?) + Entity.Move1 = WinFormsUtil.GetIndex(CB_Move1); + Entity.Move2 = WinFormsUtil.GetIndex(CB_Move2); + Entity.Move3 = WinFormsUtil.GetIndex(CB_Move3); + Entity.Move4 = WinFormsUtil.GetIndex(CB_Move4); + if (Entity.Format >= 6) + { + Entity.RelearnMove1 = WinFormsUtil.GetIndex(CB_RelearnMove1); + Entity.RelearnMove2 = WinFormsUtil.GetIndex(CB_RelearnMove2); + Entity.RelearnMove3 = WinFormsUtil.GetIndex(CB_RelearnMove3); + Entity.RelearnMove4 = WinFormsUtil.GetIndex(CB_RelearnMove4); + } UpdateLegality(skipMoveRepop: true); } @@ -1672,7 +1730,7 @@ namespace PKHeX.WinForms.Controls var (text, value) = (ComboItem)((ComboBox)sender).Items[e.Index]; var valid = LegalMoveSource.CanLearn(value) && !HaX; - var current = (e.State & DrawItemState.Selected) == DrawItemState.Selected; + var current = (e.State & DrawItemState.Selected) != 0; var brush = Draw.Brushes.GetBackground(valid, current); var textColor = Draw.GetText(current); diff --git a/PKHeX.WinForms/MainWindow/Main.cs b/PKHeX.WinForms/MainWindow/Main.cs index 48f7e0919..4bc4df8d9 100644 --- a/PKHeX.WinForms/MainWindow/Main.cs +++ b/PKHeX.WinForms/MainWindow/Main.cs @@ -50,7 +50,7 @@ namespace PKHeX.WinForms } else if (showChangelog) { - ShowAboutDialog(1); + ShowAboutDialog(AboutPage.Changelog); } if (BAKprompt && !Directory.Exists(BackupPath)) @@ -355,9 +355,9 @@ namespace PKHeX.WinForms Close(); } - private void MainMenuAbout(object sender, EventArgs e) => ShowAboutDialog(0); + private void MainMenuAbout(object sender, EventArgs e) => ShowAboutDialog(AboutPage.Shortcuts); - private static void ShowAboutDialog(int index = 0) + private static void ShowAboutDialog(AboutPage index) { using var form = new About(index); form.ShowDialog(); @@ -409,14 +409,13 @@ namespace PKHeX.WinForms private static void ClosePopups() { - var forms = Application.OpenForms.OfType
() - .Where(z => z is not (Main or SplashScreen or SAV_FolderList)) - .ToArray(); - + var forms = Application.OpenForms.OfType().Where(IsPopupFormType).ToArray(); foreach (var f in forms) f.Close(); } + private static bool IsPopupFormType(Form z) => z is not (Main or SplashScreen or SAV_FolderList); + private void MainMenuSettings(object sender, EventArgs e) { var settings = Settings; @@ -687,7 +686,8 @@ namespace PKHeX.WinForms private bool OpenPCBoxBin(IEnumerable pkms) { - if (!C_SAV.OpenPCBoxBin(pkms.SelectMany(z => z).ToArray(), out string c)) + var data = pkms.SelectMany(z => z).ToArray(); + if (!C_SAV.OpenPCBoxBin(data, out string c)) { WinFormsUtil.Alert(MsgFileLoadIncompatible, c); return true; @@ -702,16 +702,21 @@ namespace PKHeX.WinForms if (memCard.SaveGameCount == 1) return memCard.SelectedGameVersion; - var games = new List(); - if (memCard.HasCOLO) games.Add(new ComboItem(MsgGameColosseum, (int)GameVersion.COLO)); - if (memCard.HasXD) games.Add(new ComboItem(MsgGameXD, (int)GameVersion.XD)); - if (memCard.HasRSBOX) games.Add(new ComboItem(MsgGameRSBOX, (int)GameVersion.RSBOX)); - + var games = GetMemoryCardGameSelectionList(memCard); var dialog = new SAV_GameSelect(games, MsgFileLoadSaveMultiple, MsgFileLoadSaveSelectGame); dialog.ShowDialog(); return dialog.Result; } + private static List GetMemoryCardGameSelectionList(SAV3GCMemoryCard memCard) + { + var games = new List(); + if (memCard.HasCOLO) games.Add(new ComboItem(MsgGameColosseum, (int) GameVersion.COLO)); + if (memCard.HasXD) games.Add(new ComboItem(MsgGameXD, (int) GameVersion.XD)); + if (memCard.HasRSBOX) games.Add(new ComboItem(MsgGameRSBOX, (int) GameVersion.RSBOX)); + return games; + } + private static bool CheckGCMemoryCard(SAV3GCMemoryCard memCard, string path) { var state = memCard.GetMemoryCardState(); @@ -728,14 +733,14 @@ namespace PKHeX.WinForms return false; case GCMemoryCardState.MultipleSaveGame: - GameVersion game = SelectMemoryCardSaveGame(memCard); + var game = SelectMemoryCardSaveGame(memCard); if (game == GameVersion.Invalid) //Cancel return false; memCard.SelectSaveGame(game); break; - case GCMemoryCardState.SaveGameCOLO: memCard.SelectSaveGame(GameVersion.COLO); break; - case GCMemoryCardState.SaveGameXD: memCard.SelectSaveGame(GameVersion.XD); break; + case GCMemoryCardState.SaveGameCOLO: memCard.SelectSaveGame(GameVersion.COLO); break; + case GCMemoryCardState.SaveGameXD: memCard.SelectSaveGame(GameVersion.XD); break; case GCMemoryCardState.SaveGameRSBOX: memCard.SelectSaveGame(GameVersion.RSBOX); break; default: @@ -803,7 +808,6 @@ namespace PKHeX.WinForms private void ResetSAVPKMEditors(SaveFile sav) { - bool WindowToggleRequired = C_SAV.SAV.Generation < 3 && sav.Generation >= 3; // version combobox refresh hack C_SAV.SetEditEnvironment(new SaveDataEditor(sav, PKME_Tabs)); var pk = sav.LoadTemplate(TemplatePath); @@ -826,7 +830,7 @@ namespace PKHeX.WinForms } // Initialize Overall Info - Menu_LoadBoxes.Enabled = Menu_DumpBoxes.Enabled = Menu_DumpBox.Enabled = Menu_Report.Enabled = C_SAV.SAV!.HasBox; + Menu_LoadBoxes.Enabled = Menu_DumpBoxes.Enabled = Menu_DumpBox.Enabled = Menu_Report.Enabled = C_SAV.SAV.HasBox; // Initialize Subviews bool WindowTranslationRequired = false; @@ -836,11 +840,10 @@ namespace PKHeX.WinForms WinFormsUtil.TranslateInterface(this, CurrentLanguage); PKME_Tabs.PopulateFields(pk); - if (WindowToggleRequired) // Version combobox selectedvalue needs a little help, only updates once it is visible - PKME_Tabs.FlickerInterface(); + + sav.State.Edited = false; foreach (var p in Plugins) p.NotifySaveLoaded(); - sav.State.Edited = false; } private static string GetProgramTitle() diff --git a/PKHeX.WinForms/Misc/About.Designer.cs b/PKHeX.WinForms/Misc/About.Designer.cs index 30cb895e6..6671093a7 100644 --- a/PKHeX.WinForms/Misc/About.Designer.cs +++ b/PKHeX.WinForms/Misc/About.Designer.cs @@ -42,12 +42,12 @@ // L_Thanks // this.L_Thanks.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.L_Thanks.AutoSize = true; this.L_Thanks.Location = new System.Drawing.Point(265, 4); this.L_Thanks.Name = "L_Thanks"; - this.L_Thanks.Size = new System.Drawing.Size(147, 13); + this.L_Thanks.Size = new System.Drawing.Size(225, 13); this.L_Thanks.TabIndex = 2; this.L_Thanks.Text = "Thanks to all the researchers!"; + this.L_Thanks.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // TC_About // @@ -122,7 +122,6 @@ this.Tab_Shortcuts.ResumeLayout(false); this.Tab_Changelog.ResumeLayout(false); this.ResumeLayout(false); - this.PerformLayout(); } diff --git a/PKHeX.WinForms/Misc/About.cs b/PKHeX.WinForms/Misc/About.cs index d73bb13c1..468449818 100644 --- a/PKHeX.WinForms/Misc/About.cs +++ b/PKHeX.WinForms/Misc/About.cs @@ -4,13 +4,19 @@ namespace PKHeX.WinForms { public partial class About : Form { - public About(int index = 0) + public About(AboutPage index = AboutPage.Changelog) { InitializeComponent(); WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); RTB_Changelog.Text = Properties.Resources.changelog; RTB_Shortcuts.Text = Properties.Resources.shortcuts; - TC_About.SelectedIndex = index; + TC_About.SelectedIndex = (int)index; } } + + public enum AboutPage + { + Shortcuts, + Changelog, + } }