Refactoring

reduce cross-class chatter, simplifly large methods to smaller pieces
some speed improvements
This commit is contained in:
Kurt 2017-06-18 22:27:40 -07:00
parent 82c8bc01bd
commit b4222c756a
10 changed files with 309 additions and 258 deletions

View file

@ -273,7 +273,7 @@ namespace PKHeX.Core
}
}
}
public static GameStrings Strings;
public static GameStrings Strings { get; set; }
// DataSource providing
public static List<ComboItem> ItemDataSource { get; private set; }

View file

@ -8,27 +8,43 @@ namespace PKHeX.Core
{
public static partial class Legal
{
/// <summary>Event Database for a given Generation</summary>
public static MysteryGift[] MGDB_G3, MGDB_G4, MGDB_G5, MGDB_G6, MGDB_G7 = new MysteryGift[0];
/// <summary>Event Database for Generation 3</summary>
public static MysteryGift[] MGDB_G3 { get; private set; } = new MysteryGift[0];
/// <summary>Event Database for Generation 4</summary>
public static MysteryGift[] MGDB_G4 { get; private set; } = new MysteryGift[0];
/// <summary>Event Database for Generation 5</summary>
public static MysteryGift[] MGDB_G5 { get; private set; } = new MysteryGift[0];
/// <summary>Event Database for Generation 6</summary>
public static MysteryGift[] MGDB_G6 { get; private set; } = new MysteryGift[0];
/// <summary>Event Database for Generation 7</summary>
public static MysteryGift[] MGDB_G7 { get; private set; } = new MysteryGift[0];
/// <summary>Setting to specify if an analysis should permit data sourced from the physical cartridge era of GameBoy games.</summary>
public static bool AllowGBCartEra = false;
public static bool AllowGen1Tradeback = false;
public static bool AllowGBCartEra { get; set; }
public static bool AllowGen1Tradeback { get; set; }
public static bool AllowGen2VCTransfer => AllowGen1Tradeback;
public static bool AllowGen2VCCrystal = false;
public static bool AllowGen2VCCrystal => false;
public static bool AllowGen2Crystal => AllowGBCartEra || AllowGen2VCCrystal;
public static bool AllowGen2MoveReminder => AllowGBCartEra;
/// <summary>Setting to specify if the e-berry index item is an eningma berry or a e-reader berry and the name of the e-reader berry</summary>
public static bool EReaderBerryIsEnigma = true;
public static string EReaderBerryName = string.Empty;
/// <summary> e-Reader Berry originates from a Japanese SaveFile </summary>
public static bool SavegameJapanese { get; set; }
/// <summary> e-Reader Berry is Enigma or special berry </summary>
public static bool EReaderBerryIsEnigma { get; set; } = true;
/// <summary> e-Reader Berry Name </summary>
public static string EReaderBerryName { get; set; } = string.Empty;
/// <summary> e-Reader Berry Name formatted in Title Case </summary>
public static string EReaderBerryDisplayName => string.Format(V372, Util.ToTitleCase(EReaderBerryName.ToLower()));
public static bool SavegameJapanese = false;
public static string Savegame_OT = string.Empty;
public static int Savegame_TID = 0;
public static int Savegame_SID = 0;
public static int Savegame_Gender = 0;
public static GameVersion Savegame_Version = GameVersion.Any;
public static string Savegame_OT { private get; set; } = string.Empty;
public static int Savegame_TID { private get; set; }
public static int Savegame_SID { private get; set; }
public static int Savegame_Gender { private get; set; }
public static GameVersion Savegame_Version { private get; set; } = GameVersion.Any;
// Gen 1
private static readonly Learnset[] LevelUpRB = Learnset1.GetArray(Util.GetBinaryResource("lvlmove_rb.pkl"), MaxSpeciesID_1);

View file

@ -6,12 +6,12 @@ namespace PKHeX.Core
{
public static class PKMConverter
{
public static int Country = 49;
public static int Region = 7;
public static int ConsoleRegion = 1;
public static string OT_Name = "PKHeX";
public static int OT_Gender; // Male
public static int Language = 1; // en
public static int Country { get; private set; } = 49;
public static int Region { get; private set; } = 7;
public static int ConsoleRegion { get; private set; } = 1;
public static string OT_Name { get; private set; } = "PKHeX";
public static int OT_Gender { get; private set; } // Male
public static int Language { get; private set; } = 1; // en
public static void UpdateConfig(int SUBREGION, int COUNTRY, int _3DSREGION, string TRAINERNAME, int TRAINERGENDER, int LANGUAGE)
{

View file

@ -296,7 +296,7 @@ namespace PKHeX.Core
else if (Set.Species == 676) Set.Form = ""; // Furfrou
else if (Set.Species == 666 && Set.Form == "Poké Ball") Set.Form = "Pokeball"; // Vivillon
return Set.GetText();
return Set.Text;
}
private void ParseFirstLine(string line)
{

View file

@ -6,8 +6,8 @@ namespace PKHeX.Core
// Base Class for Save Files
public abstract class SaveFile
{
public static bool SetUpdateDex = true;
public static bool SetUpdatePKM = true;
public static bool SetUpdateDex { protected get; set; } = true;
public static bool SetUpdatePKM { protected get; set; } = true;
// General Object Properties
public byte[] Data;

View file

@ -32,22 +32,22 @@ namespace PKHeX.WinForms.Controls
c.KeyDown += WinFormsUtil.RemoveDropCB;
}
public PKM pkm;
public bool HaX;
public bool fieldsInitialized;
public bool fieldsLoaded;
public bool Unicode;
public bool? IsLegal;
public byte[] lastData;
public bool ModifyPKM = true;
public GameVersion origintrack;
public PKM CurrentPKM { get => fieldsInitialized ? PreparePKM() : pkm; set => pkm = value; }
public bool ModifyPKM { private get; set; } = true;
public bool Unicode { private get; set; } = true;
public bool HaX { private get; set; }
public byte[] LastData { private get; set; }
private PKM pkm;
private bool fieldsInitialized;
private bool fieldsLoaded;
private bool changingFields;
private GameVersion origintrack;
private Action GetFieldsfromPKM;
private Func<PKM> GetPKMfromFields;
private LegalityAnalysis Legality;
private string[] gendersymbols = { "♂", "♀", "-" };
private static readonly Image mixedHighlight = ImageUtil.ChangeOpacity(Resources.slotSet, 0.5);
private readonly Image mixedHighlight = ImageUtil.ChangeOpacity(Resources.slotSet, 0.5);
public event EventHandler LegalityChanged;
public event EventHandler UpdatePreviewSprite;
@ -59,7 +59,7 @@ namespace PKHeX.WinForms.Controls
private readonly PictureBox[] movePB, relearnPB;
private readonly ToolTip Tip1 = new ToolTip(), Tip2 = new ToolTip(), Tip3 = new ToolTip(), NatureTip = new ToolTip(), EVTip = new ToolTip();
private SaveFile RequestSaveFile => SaveFileRequested?.Invoke(this, EventArgs.Empty);
public bool PKMIsUnsaved => fieldsInitialized && fieldsLoaded && lastData != null && lastData.Any(b => b != 0) && !lastData.SequenceEqual(PreparePKM().Data);
public bool PKMIsUnsaved => fieldsInitialized && fieldsLoaded && LastData != null && LastData.Any(b => b != 0) && !LastData.SequenceEqual(PreparePKM().Data);
public bool IsEmptyOrEgg => CHK_IsEgg.Checked || CB_Species.SelectedIndex == 0;
public PKM PreparePKM(bool click = true)
@ -98,10 +98,6 @@ namespace PKHeX.WinForms.Controls
return false;
}
public void UpdateStringDisplay()
{
UpdateIVs(null, null); // Prompt an update for the characteristics
}
public void InitializeFields()
{
// Now that the ComboBoxes are ready, load the data.
@ -231,9 +227,8 @@ namespace PKHeX.WinForms.Controls
SetMarkings();
UpdateLegality();
lastData = PreparePKM()?.Data;
// Refresh the Preview Box
UpdatePreviewSprite?.Invoke(this, null);
UpdateSprite();
LastData = PreparePKM()?.Data;
}
public void UpdateLegality(LegalityAnalysis la = null, bool skipMoveRepop = false)
{
@ -245,12 +240,9 @@ namespace PKHeX.WinForms.Controls
{
PB_WarnMove1.Visible = PB_WarnMove2.Visible = PB_WarnMove3.Visible = PB_WarnMove4.Visible =
PB_WarnRelearn1.Visible = PB_WarnRelearn2.Visible = PB_WarnRelearn3.Visible = PB_WarnRelearn4.Visible = false;
IsLegal = null;
return;
}
IsLegal = Legality.Valid;
// Refresh Move Legality
for (int i = 0; i < 4; i++)
movePB[i].Visible = !Legality.info?.Moves[i].Valid ?? false;
@ -276,7 +268,7 @@ namespace PKHeX.WinForms.Controls
c.SelectionLength = 0; // flicker hack
}
fieldsLoaded |= tmp;
LegalityChanged?.Invoke(this, null);
LegalityChanged?.Invoke(Legality.Valid, null);
}
public void UpdateUnicode(string[] symbols)
{
@ -299,6 +291,11 @@ namespace PKHeX.WinForms.Controls
if (PKX.GetGender(Label_CTGender.Text) < 2)
Label_CTGender.Text = gendersymbols[PKX.GetGender(Label_CTGender.Text)];
}
private void UpdateSprite()
{
if (fieldsLoaded && fieldsInitialized)
UpdatePreviewSprite?.Invoke(this, null);
}
// General Use Functions //
private Color GetGenderColor(int gender)
@ -827,8 +824,7 @@ namespace PKHeX.WinForms.Controls
CB_Form.SelectedIndex = pkm.AltForm;
}
SetIsShiny(null);
if (fieldsLoaded)
UpdatePreviewSprite?.Invoke(this, null);
UpdateSprite();
}
CB_HPType.SelectedValue = pkm.HPType;
@ -1001,7 +997,7 @@ namespace PKHeX.WinForms.Controls
TB_PID.Text = pkm.PID.ToString("X8");
SetIsShiny(null);
UpdatePreviewSprite?.Invoke(this, null);
UpdateSprite();
if (pkm.GenNumber < 6 && pkm.Format >= 6)
TB_EC.Text = TB_PID.Text;
}
@ -1094,8 +1090,7 @@ namespace PKHeX.WinForms.Controls
MT_Form.Text = CB_Form.SelectedIndex.ToString();
changingFields = false;
if (fieldsLoaded)
UpdatePreviewSprite?.Invoke(this, null);
UpdateSprite();
}
private void UpdateHaXForm(object sender, EventArgs e)
{
@ -1106,8 +1101,7 @@ namespace PKHeX.WinForms.Controls
CB_Form.SelectedIndex = CB_Form.Items.Count > form ? form : -1;
changingFields = false;
if (fieldsLoaded)
UpdatePreviewSprite?.Invoke(this, null);
UpdateSprite();
}
private void UpdatePP(object sender, EventArgs e)
{
@ -1481,7 +1475,7 @@ namespace PKHeX.WinForms.Controls
}
UpdateNickname(null, null);
UpdatePreviewSprite?.Invoke(this, null);
UpdateSprite();
}
private void UpdateMetAsEgg(object sender, EventArgs e)
{
@ -1584,7 +1578,7 @@ namespace PKHeX.WinForms.Controls
if (Util.ToUInt32(TB_SID.Text) > ushort.MaxValue) TB_SID.Text = "65535";
SetIsShiny(sender);
UpdatePreviewSprite?.Invoke(this, null);
UpdateSprite();
UpdateIVs(null, null); // If the EC is changed, EC%6 (Characteristic) might be changed.
TB_PID.Select(60, 0); // position cursor at end of field
if (pkm.Format <= 4 && fieldsLoaded)
@ -1640,9 +1634,7 @@ namespace PKHeX.WinForms.Controls
return;
ValidateComboBox(sender);
if (fieldsLoaded)
UpdatePreviewSprite?.Invoke(this, null);
UpdateSprite();
}
private void ValidateComboBox2(object sender, EventArgs e)
{
@ -1735,59 +1727,66 @@ namespace PKHeX.WinForms.Controls
/// <summary>
/// Refreshes the interface for the current PKM format.
/// </summary>
public void ToggleInterface()
public bool ToggleInterface(SaveFile sav, PKM pk)
{
Tip1.RemoveAll(); Tip2.RemoveAll(); Tip3.RemoveAll(); // TSV/PSV
FLP_Country.Visible = FLP_SubRegion.Visible = FLP_3DSRegion.Visible = pkm.Format >= 6;
Label_EncryptionConstant.Visible = BTN_RerollEC.Visible = TB_EC.Visible = pkm.Format >= 6;
GB_nOT.Visible = GB_RelearnMoves.Visible = BTN_Medals.Visible = BTN_History.Visible = pkm.Format >= 6;
FLP_Country.Visible = FLP_SubRegion.Visible = FLP_3DSRegion.Visible = pk.Format >= 6;
Label_EncryptionConstant.Visible = BTN_RerollEC.Visible = TB_EC.Visible = pk.Format >= 6;
GB_nOT.Visible = GB_RelearnMoves.Visible = BTN_Medals.Visible = BTN_History.Visible = pk.Format >= 6;
PB_MarkPentagon.Visible = pkm.Format >= 6;
PB_MarkAlola.Visible = PB_MarkVC.Visible = PB_MarkHorohoro.Visible = pkm.Format >= 7;
PB_MarkPentagon.Visible = pk.Format >= 6;
PB_MarkAlola.Visible = PB_MarkVC.Visible = PB_MarkHorohoro.Visible = pk.Format >= 7;
FLP_NSparkle.Visible = L_NSparkle.Visible = CHK_NSparkle.Visible = pkm.Format == 5;
FLP_NSparkle.Visible = L_NSparkle.Visible = CHK_NSparkle.Visible = pk.Format == 5;
CB_Form.Visible = Label_Form.Visible = CHK_AsEgg.Visible = GB_EggConditions.Visible = PB_Mark5.Visible = PB_Mark6.Visible = pkm.Format >= 4;
FLP_ShinyLeaf.Visible = L_ShinyLeaf.Visible = ShinyLeaf.Visible = pkm.Format == 4;
CB_Form.Visible = Label_Form.Visible = CHK_AsEgg.Visible = GB_EggConditions.Visible = PB_Mark5.Visible = PB_Mark6.Visible = pk.Format >= 4;
FLP_ShinyLeaf.Visible = L_ShinyLeaf.Visible = ShinyLeaf.Visible = pk.Format == 4;
DEV_Ability.Enabled = DEV_Ability.Visible = pkm.Format > 3 && HaX;
CB_Ability.Visible = !DEV_Ability.Enabled && pkm.Format >= 3;
FLP_Nature.Visible = pkm.Format >= 3;
FLP_Ability.Visible = pkm.Format >= 3;
FLP_Language.Visible = pkm.Format >= 3;
GB_ExtraBytes.Visible = GB_ExtraBytes.Enabled = pkm.Format >= 3;
GB_Markings.Visible = pkm.Format >= 3;
BTN_Ribbons.Visible = pkm.Format >= 3;
CB_HPType.Enabled = CB_Form.Enabled = pkm.Format >= 3;
BTN_RerollPID.Visible = Label_PID.Visible = TB_PID.Visible = Label_SID.Visible = TB_SID.Visible = pkm.Format >= 3;
DEV_Ability.Enabled = DEV_Ability.Visible = pk.Format > 3 && HaX;
CB_Ability.Visible = !DEV_Ability.Enabled && pk.Format >= 3;
FLP_Nature.Visible = pk.Format >= 3;
FLP_Ability.Visible = pk.Format >= 3;
FLP_Language.Visible = pk.Format >= 3;
GB_ExtraBytes.Visible = GB_ExtraBytes.Enabled = pk.Format >= 3;
GB_Markings.Visible = pk.Format >= 3;
BTN_Ribbons.Visible = pk.Format >= 3;
CB_HPType.Enabled = CB_Form.Enabled = pk.Format >= 3;
BTN_RerollPID.Visible = Label_PID.Visible = TB_PID.Visible = Label_SID.Visible = TB_SID.Visible = pk.Format >= 3;
FLP_FriendshipForm.Visible = pkm.Format >= 2;
FLP_HeldItem.Visible = pkm.Format >= 2;
CHK_IsEgg.Visible = Label_Gender.Visible = pkm.Format >= 2;
FLP_PKRS.Visible = FLP_EggPKRSRight.Visible = pkm.Format >= 2;
Label_OTGender.Visible = pkm.Format >= 2;
FLP_FriendshipForm.Visible = pk.Format >= 2;
FLP_HeldItem.Visible = pk.Format >= 2;
CHK_IsEgg.Visible = Label_Gender.Visible = pk.Format >= 2;
FLP_PKRS.Visible = FLP_EggPKRSRight.Visible = pk.Format >= 2;
Label_OTGender.Visible = pk.Format >= 2;
FLP_Purification.Visible = FLP_ShadowID.Visible = pkm is XK3 || pkm is CK3;
FLP_Purification.Visible = FLP_ShadowID.Visible = pk is XK3 || pk is CK3;
NUD_ShadowID.Maximum = 127;
// HaX override, needs to be after DEV_Ability enabled assignment.
TB_AbilityNumber.Visible = pkm.Format >= 6 && DEV_Ability.Enabled;
TB_AbilityNumber.Visible = pk.Format >= 6 && DEV_Ability.Enabled;
// Met Tab
FLP_MetDate.Visible = pkm.Format >= 4;
FLP_Fateful.Visible = FLP_Ball.Visible = FLP_OriginGame.Visible = pkm.Format >= 3;
FLP_MetLocation.Visible = FLP_MetLevel.Visible = pkm.Format >= 2;
FLP_TimeOfDay.Visible = pkm.Format == 2;
FLP_MetDate.Visible = pk.Format >= 4;
FLP_Fateful.Visible = FLP_Ball.Visible = FLP_OriginGame.Visible = pk.Format >= 3;
FLP_MetLocation.Visible = FLP_MetLevel.Visible = pk.Format >= 2;
FLP_TimeOfDay.Visible = pk.Format == 2;
// Stats
FLP_StatsTotal.Visible = pkm.Format >= 3;
FLP_Characteristic.Visible = pkm.Format >= 3;
FLP_HPType.Visible = pkm.Format >= 2;
FLP_StatsTotal.Visible = pk.Format >= 3;
FLP_Characteristic.Visible = pk.Format >= 3;
FLP_HPType.Visible = pk.Format >= 2;
PAN_Contest.Visible = pkm.Format >= 3;
PAN_Contest.Visible = pk.Format >= 3;
if (pkm.Format == 1)
ToggleStats(pk);
CenterSubEditors();
return FinalizeInterface(sav, pk);
}
private void ToggleStats(PKM pk)
{
if (pk.Format == 1)
{
FLP_SpD.Visible = false;
Label_SPA.Visible = false;
@ -1800,7 +1799,7 @@ namespace PKHeX.WinForms.Controls
ctrl.Size = Stat_HP.Size;
}
}
else if (pkm.Format == 2)
else if (pk.Format == 2)
{
FLP_SpD.Visible = true;
Label_SPA.Visible = true;
@ -1828,17 +1827,12 @@ namespace PKHeX.WinForms.Controls
ctrl.Size = TB_ExtraByte.Size;
}
}
}
private bool FinalizeInterface(SaveFile SAV, PKM pk)
{
bool init = fieldsInitialized;
fieldsInitialized = fieldsLoaded = false;
// Recenter PKM SubEditors
FLP_PKMEditors.Location = new Point((Tab_OTMisc.Width - FLP_PKMEditors.Width) / 2, FLP_PKMEditors.Location.Y);
}
public void FlickerInterface()
{
tabMain.SelectedTab = Tab_Met; // parent tab of CB_GameOrigin
tabMain.SelectedTab = Tab_Main; // first tab
}
public bool FinalizeInterface(bool init, SaveFile SAV, PKM pk)
{
pkm = pk.GetType() != SAV.PKMType ? SAV.BlankPKM : pk;
if (pkm.Format < 3)
pkm = SAV.BlankPKM;
@ -1874,7 +1868,7 @@ namespace PKHeX.WinForms.Controls
UpdateOriginGame(null, null);
return TranslationRequired;
}
public void CenterSubEditors()
private void CenterSubEditors()
{
// Recenter PKM SubEditors
FLP_PKMEditors.Location = new Point((Tab_OTMisc.Width - FLP_PKMEditors.Width) / 2, FLP_PKMEditors.Location.Y);
@ -1886,7 +1880,7 @@ namespace PKHeX.WinForms.Controls
if (template != null)
{
PopulateFields(template);
lastData = null;
LastData = null;
return;
}
if (CB_GameOrigin.Items.Count > 0)
@ -1902,7 +1896,7 @@ namespace PKHeX.WinForms.Controls
CAL_MetDate.Value = CAL_EggDate.Value = DateTime.Today;
CB_Species.SelectedValue = pkm.MaxSpeciesID;
CHK_Nicknamed.Checked = false;
lastData = null;
LastData = null;
}
public void EnableDragDrop(DragEventHandler enter, DragEventHandler drop)
{
@ -1915,7 +1909,7 @@ namespace PKHeX.WinForms.Controls
tab.DragDrop += drop;
}
}
public void LoadShowdownSet(ShowdownSet Set, SaveFile SAV)
public void LoadShowdownSet(ShowdownSet Set)
{
CB_Species.SelectedValue = Set.Species;
CHK_Nicknamed.Checked = Set.Nickname != null;
@ -1938,11 +1932,8 @@ namespace PKHeX.WinForms.Controls
{ form = i; break; }
CB_Form.SelectedIndex = Math.Min(CB_Form.Items.Count - 1, form);
// Set Ability
int[] abilities = SAV.Personal.GetAbilities(Set.Species, form);
int ability = Array.IndexOf(abilities, Set.Ability);
if (ability < 0) ability = 0;
CB_Ability.SelectedIndex = ability;
// Set Ability and Moves
CB_Ability.SelectedIndex = Math.Max(0, Array.IndexOf(pkm.PersonalInfo.Abilities, Set.Ability));
ComboBox[] m = { CB_Move1, CB_Move2, CB_Move3, CB_Move4 };
for (int i = 0; i < 4; i++) m[i].SelectedValue = Set.Moves[i];
@ -1984,7 +1975,25 @@ namespace PKHeX.WinForms.Controls
if (Legality.info.Relearn.Any(z => !z.Valid))
SetSuggestedRelearnMoves(silent: true);
}
public void InitializeLanguage(SaveFile SAV)
public void ChangeLanguage(SaveFile sav, PKM pk)
{
// Force an update to the met locations
origintrack = GameVersion.Unknown;
bool alreadyInit = fieldsInitialized;
fieldsInitialized = false;
InitializeLanguage(sav);
CenterSubEditors();
PopulateFields(pk); // put data back in form
fieldsInitialized |= alreadyInit;
}
public void FlickerInterface()
{
tabMain.SelectedTab = Tab_Met; // parent tab of CB_GameOrigin
tabMain.SelectedTab = Tab_Main; // first tab
}
private void InitializeLanguage(SaveFile SAV)
{
ComboBox[] cbs =
{
@ -2005,7 +2014,6 @@ namespace PKHeX.WinForms.Controls
PopulateFilteredDataSources(SAV);
}
private void PopulateFilteredDataSources(SaveFile SAV)
{
GameInfo.SetItemDataSource(HaX, pkm.MaxItemID, SAV.HeldItems, pkm.Format, SAV.Version, GameInfo.Strings);

View file

@ -11,11 +11,11 @@ namespace PKHeX.WinForms.Controls
{
public partial class BoxEditor : UserControl
{
public readonly List<PictureBox> SlotPictureBoxes;
public readonly int BoxSlotCount;
public SlotChangeManager M;
private SaveFile SAV => M?.SE.SAV;
public bool FlagIllegal;
public List<PictureBox> SlotPictureBoxes { get; }
public int BoxSlotCount { get; }
public SlotChangeManager M { get; set; }
public bool FlagIllegal { get; set; }
public BoxEditor()
{

View file

@ -84,7 +84,7 @@ namespace PKHeX.WinForms.Controls
m.SetPKM(pk, info, true, Resources.slotSet);
}
editor.lastData = pk.Data;
editor.LastData = pk.Data;
m.SE.RedoStack.Clear(); m.SE.Menu_Redo.Enabled = false;
}
private static void ClickDelete(object sender, EventArgs e)

View file

@ -863,9 +863,26 @@ namespace PKHeX.WinForms.Controls
public bool ToggleInterface()
{
bool WindowTranslationRequired = false;
FieldsLoaded = false;
ToggleViewReset();
ToggleViewSubEditors(SAV);
int BoxTab = tabBoxMulti.TabPages.IndexOf(Tab_Box);
int PartyTab = tabBoxMulti.TabPages.IndexOf(Tab_PartyBattle);
bool WindowTranslationRequired = false;
WindowTranslationRequired |= ToggleViewBox(SAV);
WindowTranslationRequired |= ToggleViewParty(SAV, BoxTab);
WindowTranslationRequired |= ToggleViewDaycare(SAV, BoxTab, PartyTab);
ToggleViewMisc(SAV);
FieldsLoaded = true;
return WindowTranslationRequired;
}
private void ToggleViewReset()
{
// Close subforms that are save dependent
foreach (var z in M.Boxes.Skip(1).ToArray())
z.FindForm()?.Close();
@ -875,133 +892,145 @@ namespace PKHeX.WinForms.Controls
Box.M = M;
Box.ResetBoxNames(); // Display the Box Names
M.SetColor(-1, -1, null);
if (SAV.HasBox)
{
int startBox = !SAV.Exportable ? 0 : SAV.CurrentBox; // FF if BattleBox
if (startBox > SAV.BoxCount - 1) { tabBoxMulti.SelectedIndex = 1; Box.CurrentBox = 0; }
else { tabBoxMulti.SelectedIndex = 0; Box.CurrentBox = startBox; }
}
private bool ToggleViewBox(SaveFile sav)
{
if (!sav.HasBox)
{
if (tabBoxMulti.TabPages.Contains(Tab_Box))
tabBoxMulti.TabPages.Remove(Tab_Box);
B_SaveBoxBin.Enabled = false;
return false;
}
B_SaveBoxBin.Enabled = true;
int startBox = !sav.Exportable ? 0 : sav.CurrentBox; // FF if BattleBox
if (startBox > sav.BoxCount - 1) { tabBoxMulti.SelectedIndex = 1; Box.CurrentBox = 0; }
else { tabBoxMulti.SelectedIndex = 0; Box.CurrentBox = startBox; }
SetPKMBoxes(); // Reload all of the PKX Windows
// Hide content if not present in game.
GB_SUBE.Visible = SAV.HasSUBE;
PB_Locked.Visible = SAV.HasBattleBox && SAV.BattleBoxLocked;
if (!SAV.HasBox && tabBoxMulti.TabPages.Contains(Tab_Box))
tabBoxMulti.TabPages.Remove(Tab_Box);
else if (SAV.HasBox && !tabBoxMulti.TabPages.Contains(Tab_Box))
{
if (tabBoxMulti.TabPages.Contains(Tab_Box))
return false;
tabBoxMulti.TabPages.Insert(0, Tab_Box);
WindowTranslationRequired = true;
return true;
}
B_SaveBoxBin.Enabled = SAV.HasBox;
int BoxTab = tabBoxMulti.TabPages.IndexOf(Tab_Box);
int PartyTab = tabBoxMulti.TabPages.IndexOf(Tab_PartyBattle);
if (!SAV.HasParty && tabBoxMulti.TabPages.Contains(Tab_PartyBattle))
tabBoxMulti.TabPages.Remove(Tab_PartyBattle);
else if (SAV.HasParty && !tabBoxMulti.TabPages.Contains(Tab_PartyBattle))
private bool ToggleViewParty(SaveFile sav, int BoxTab)
{
if (!sav.HasParty)
{
if (tabBoxMulti.TabPages.Contains(Tab_PartyBattle))
tabBoxMulti.TabPages.Remove(Tab_PartyBattle);
return false;
}
PB_Locked.Visible = sav.HasBattleBox && sav.BattleBoxLocked;
if (tabBoxMulti.TabPages.Contains(Tab_PartyBattle))
return false;
int index = BoxTab;
if (index < 0)
index = -1;
tabBoxMulti.TabPages.Insert(index + 1, Tab_PartyBattle);
WindowTranslationRequired = true;
return true;
}
private bool ToggleViewDaycare(SaveFile sav, int BoxTab, int PartyTab)
{
if (!sav.HasDaycare)
{
if (tabBoxMulti.TabPages.Contains(Tab_Other))
tabBoxMulti.TabPages.Remove(Tab_Other);
return false;
}
if (!SAV.HasDaycare && tabBoxMulti.TabPages.Contains(Tab_Other))
tabBoxMulti.TabPages.Remove(Tab_Other);
else if (SAV.HasDaycare && !tabBoxMulti.TabPages.Contains(Tab_Other))
{
SlotPictureBoxes[43].Visible = sav.Generation >= 2; // Second daycare slot
if (tabBoxMulti.TabPages.Contains(Tab_Other))
return false;
int index = PartyTab;
if (index < 0)
index = BoxTab;
if (index < 0)
index = -1;
tabBoxMulti.TabPages.Insert(index + 1, Tab_Other);
WindowTranslationRequired = true;
return true;
}
if (SAV.Exportable) // Actual save file
private void ToggleViewSubEditors(SaveFile sav)
{
PAN_BattleBox.Visible = L_BattleBox.Visible = L_ReadOnlyPBB.Visible = SAV.HasBattleBox;
GB_Daycare.Visible = SAV.HasDaycare;
GB_Fused.Visible = SAV.HasFused;
GB_GTS.Visible = SAV.HasGTS;
B_OpenSecretBase.Enabled = SAV.HasSecretBase;
B_OpenPokepuffs.Enabled = SAV.HasPuff;
B_OpenPokeBeans.Enabled = SAV.Generation == 7;
B_OpenZygardeCells.Enabled = SAV.Generation == 7;
B_OUTPasserby.Enabled = SAV.HasPSS;
B_OpenBoxLayout.Enabled = SAV.HasBoxWallpapers;
B_OpenWondercards.Enabled = SAV.HasWondercards;
B_OpenSuperTraining.Enabled = SAV.HasSuperTrain;
B_OpenHallofFame.Enabled = SAV.HasHoF;
B_OpenOPowers.Enabled = SAV.HasOPower;
B_OpenPokedex.Enabled = SAV.HasPokeDex;
B_OpenBerryField.Enabled = SAV.HasBerryField && SAV.XY;
B_OpenFriendSafari.Enabled = SAV.XY;
B_OpenPokeblocks.Enabled = SAV.HasPokeBlock;
B_JPEG.Visible = SAV.HasJPEG;
B_OpenEventFlags.Enabled = SAV.HasEvents;
B_OpenLinkInfo.Enabled = SAV.HasLink;
B_CGearSkin.Enabled = SAV.Generation == 5;
if (sav.Exportable) // Actual save file
{
PAN_BattleBox.Visible = L_BattleBox.Visible = L_ReadOnlyPBB.Visible = sav.HasBattleBox;
GB_Daycare.Visible = sav.HasDaycare;
GB_Fused.Visible = sav.HasFused;
GB_GTS.Visible = sav.HasGTS;
B_OpenSecretBase.Enabled = sav.HasSecretBase;
B_OpenPokepuffs.Enabled = sav.HasPuff;
B_OpenPokeBeans.Enabled = sav.Generation == 7;
B_OpenZygardeCells.Enabled = sav.Generation == 7;
B_OUTPasserby.Enabled = sav.HasPSS;
B_OpenBoxLayout.Enabled = sav.HasBoxWallpapers;
B_OpenWondercards.Enabled = sav.HasWondercards;
B_OpenSuperTraining.Enabled = sav.HasSuperTrain;
B_OpenHallofFame.Enabled = sav.HasHoF;
B_OpenOPowers.Enabled = sav.HasOPower;
B_OpenPokedex.Enabled = sav.HasPokeDex;
B_OpenBerryField.Enabled = sav.HasBerryField && sav.XY;
B_OpenFriendSafari.Enabled = sav.XY;
B_OpenPokeblocks.Enabled = sav.HasPokeBlock;
B_JPEG.Visible = sav.HasJPEG;
B_OpenEventFlags.Enabled = sav.HasEvents;
B_OpenLinkInfo.Enabled = sav.HasLink;
B_CGearSkin.Enabled = sav.Generation == 5;
B_OpenTrainerInfo.Enabled = B_OpenItemPouch.Enabled = SAV.HasParty; // Box RS
B_OpenMiscEditor.Enabled = SAV is SAV3 || SAV is SAV4 || SAV is SAV5;
B_OpenTrainerInfo.Enabled = B_OpenItemPouch.Enabled = sav.HasParty; // Box RS
B_OpenMiscEditor.Enabled = sav is SAV3 || sav is SAV4 || sav is SAV5;
B_OpenHoneyTreeEditor.Enabled = SAV.DP || SAV.Pt;
B_OpenRTCEditor.Enabled = SAV.RS || SAV.E;
B_OpenHoneyTreeEditor.Enabled = sav.DP || sav.Pt;
B_OpenRTCEditor.Enabled = sav.RS || sav.E;
}
GB_SAVtools.Visible = SAV.Exportable && FLP_SAVtools.Controls.Cast<Control>().Any(c => c.Enabled);
GB_SAVtools.Visible = sav.Exportable && FLP_SAVtools.Controls.Cast<Control>().Any(c => c.Enabled);
foreach (Control c in FLP_SAVtools.Controls.Cast<Control>())
c.Visible = c.Enabled;
B_VerifyCHK.Enabled = SAV.Exportable;
// Second daycare slot
SlotPictureBoxes[43].Visible = SAV.Generation >= 2;
return WindowTranslationRequired;
}
public void FinalizeInterface()
private void ToggleViewMisc(SaveFile sav)
{
// Generational Interface
TB_Secure1.Visible = TB_Secure2.Visible = L_Secure1.Visible = L_Secure2.Visible = SAV.Exportable && SAV.Generation >= 6;
TB_GameSync.Visible = L_GameSync.Visible = SAV.Exportable && SAV.Generation >= 6;
TB_Secure1.Visible = TB_Secure2.Visible = L_Secure1.Visible = L_Secure2.Visible = sav.Exportable && sav.Generation >= 6;
TB_GameSync.Visible = L_GameSync.Visible = sav.Exportable && sav.Generation >= 6;
GB_SUBE.Visible = SAV.HasSUBE;
B_VerifyCHK.Enabled = SAV.Exportable;
if (SAV.Version == GameVersion.BATREV)
if (sav.Version == GameVersion.BATREV)
{
L_SaveSlot.Visible = CB_SaveSlot.Visible = true;
CB_SaveSlot.DisplayMember = "Text"; CB_SaveSlot.ValueMember = "Value";
CB_SaveSlot.DataSource = new BindingSource(((SAV4BR)SAV).SaveSlots.Select(i => new ComboItem
CB_SaveSlot.DataSource = new BindingSource(((SAV4BR)sav).SaveSlots.Select(i => new ComboItem
{
Text = ((SAV4BR)SAV).SaveNames[i],
Text = ((SAV4BR)sav).SaveNames[i],
Value = i
}).ToList(), null);
CB_SaveSlot.SelectedValue = ((SAV4BR)SAV).CurrentSlot;
CB_SaveSlot.SelectedValue = ((SAV4BR)sav).CurrentSlot;
}
else
L_SaveSlot.Visible = CB_SaveSlot.Visible = false;
switch (SAV.Generation)
switch (sav.Generation)
{
case 6:
TB_GameSync.Enabled = SAV.GameSyncID != null;
TB_GameSync.MaxLength = SAV.GameSyncIDSize;
TB_GameSync.Text = (SAV.GameSyncID ?? 0.ToString()).PadLeft(SAV.GameSyncIDSize, '0');
TB_Secure1.Text = SAV.Secure1?.ToString("X16");
TB_Secure2.Text = SAV.Secure2?.ToString("X16");
TB_GameSync.Enabled = sav.GameSyncID != null;
TB_GameSync.MaxLength = sav.GameSyncIDSize;
TB_GameSync.Text = (sav.GameSyncID ?? 0.ToString()).PadLeft(sav.GameSyncIDSize, '0');
TB_Secure1.Text = sav.Secure1?.ToString("X16");
TB_Secure2.Text = sav.Secure2?.ToString("X16");
break;
case 7:
TB_GameSync.Enabled = SAV.GameSyncID != null;
TB_GameSync.MaxLength = SAV.GameSyncIDSize;
TB_GameSync.Text = (SAV.GameSyncID ?? 0.ToString()).PadLeft(SAV.GameSyncIDSize, '0');
TB_Secure1.Text = SAV.Secure1?.ToString("X16");
TB_Secure2.Text = SAV.Secure2?.ToString("X16");
TB_GameSync.Enabled = sav.GameSyncID != null;
TB_GameSync.MaxLength = sav.GameSyncIDSize;
TB_GameSync.Text = (sav.GameSyncID ?? 0.ToString()).PadLeft(sav.GameSyncIDSize, '0');
TB_Secure1.Text = sav.Secure1?.ToString("X16");
TB_Secure2.Text = sav.Secure2?.ToString("X16");
break;
}
FieldsLoaded = true;
}
// DragDrop

View file

@ -33,6 +33,7 @@ namespace PKHeX.WinForms
FormLoadInitialFiles(args);
IsInitialized = true; // Splash Screen closes on its own.
PKME_Tabs_UpdatePreviewSprite(null, null);
BringToFront();
WindowState = FormWindowState.Minimized;
Show();
@ -52,8 +53,7 @@ namespace PKHeX.WinForms
get => GameInfo.CurrentLanguage;
private set => GameInfo.CurrentLanguage = value;
}
public static string[] GenderSymbols { get; private set; } = {"♂", "♀", "-"};
private static bool _unicode;
private static bool _unicode { get; set; }
public static bool Unicode
{
get => _unicode;
@ -64,9 +64,10 @@ namespace PKHeX.WinForms
}
}
public static bool HaX;
public static bool IsInitialized;
private static readonly string[] main_langlist =
public static string[] GenderSymbols { get; private set; } = { "♂", "♀", "-" };
public static bool HaX { get; private set; }
public static bool IsInitialized { get; private set; }
private readonly string[] main_langlist =
{
"日本語", // JPN
"English", // ENG
@ -101,7 +102,7 @@ namespace PKHeX.WinForms
// Set up Language Selection
foreach (var cbItem in main_langlist)
CB_MainLanguage.Items.Add(cbItem);
C_SAV.HaX = PKME_Tabs.HaX = HaX = args.Any(x => x.Trim('-').ToLower() == "hax");
C_SAV.HaX = PKME_Tabs.HaX = HaX = args.Any(x => string.Equals(x.Trim('-'), nameof(HaX), StringComparison.CurrentCultureIgnoreCase));
PB_Legal.Visible = !HaX;
int languageID = 1; // English
@ -404,25 +405,33 @@ namespace PKHeX.WinForms
if (Set.Species < 0)
{ WinFormsUtil.Alert("Set data not found in clipboard."); return; }
if (Set.Nickname != null && Set.Nickname.Length > C_SAV.SAV.NickLength)
if (Set.Nickname?.Length > C_SAV.SAV.NickLength)
Set.Nickname = Set.Nickname.Substring(0, C_SAV.SAV.NickLength);
if (DialogResult.Yes != WinFormsUtil.Prompt(MessageBoxButtons.YesNo, "Import this set?", Set.Text))
{ return; }
return;
if (Set.InvalidLines.Any())
WinFormsUtil.Alert("Invalid lines detected:", string.Join(Environment.NewLine, Set.InvalidLines));
// Set Species & Nickname
PKME_Tabs.LoadShowdownSet(Set, C_SAV.SAV);
PKME_Tabs.LoadShowdownSet(Set);
}
private void ClickShowdownExportPKM(object sender, EventArgs e)
{
if (!PKME_Tabs.VerifiedPKM())
{ WinFormsUtil.Alert("Fix data before exporting."); return; }
{
WinFormsUtil.Alert("Fix data before exporting.");
return;
}
Clipboard.SetText(PreparePKM().ShowdownText);
WinFormsUtil.Alert("Exported Showdown Set to Clipboard:", Clipboard.GetText());
var text = PreparePKM().ShowdownText;
Clipboard.SetText(text);
var clip = Clipboard.GetText();
if (clip != text)
WinFormsUtil.Alert("Unable to set to Clipboard.", "Try exporting again.");
else
WinFormsUtil.Alert("Exported Showdown Set to Clipboard:", text);
}
private void ClickShowdownExportParty(object sender, EventArgs e)
{
@ -570,7 +579,7 @@ namespace PKHeX.WinForms
if (temp == null)
return false;
var type = PKME_Tabs.pkm.GetType();
var type = PKME_Tabs.CurrentPKM.GetType();
PKM pk = PKMConverter.ConvertToType(temp, type, out string c);
if (pk == null)
{
@ -757,25 +766,23 @@ namespace PKHeX.WinForms
private void ResetSAVPKMEditors(SaveFile sav)
{
bool WindowToggleRequired = C_SAV.SAV.Generation < 3 && sav.Generation >= 3; // version combobox refresh hack
bool WindowTranslationRequired = false;
PKM pk = PreparePKM();
PKME_Tabs.pkm = sav.BlankPKM;
var blank = sav.BlankPKM;
PKME_Tabs.CurrentPKM = blank;
PKME_Tabs.SetPKMFormatMode(sav.Generation);
PKME_Tabs.PopulateFields(PKME_Tabs.pkm);
PKME_Tabs.PopulateFields(blank);
C_SAV.SAV = sav;
// Initialize Subviews
PKME_Tabs.ToggleInterface();
bool init = PKME_Tabs.fieldsInitialized;
PKME_Tabs.fieldsInitialized = PKME_Tabs.fieldsLoaded = false;
WindowTranslationRequired |= PKME_Tabs.FinalizeInterface(init, sav, pk);
WindowTranslationRequired |= C_SAV.ToggleInterface();
C_SAV.FinalizeInterface();
// Finalize Overall Info
// Initialize Overall Info
Menu_LoadBoxes.Enabled = Menu_DumpBoxes.Enabled = Menu_Report.Enabled = Menu_Modify.Enabled = C_SAV.SAV.HasBox;
// Initialize Subviews
bool WindowTranslationRequired = false;
WindowTranslationRequired |= PKME_Tabs.ToggleInterface(sav, pk);
WindowTranslationRequired |= C_SAV.ToggleInterface();
if (WindowTranslationRequired) // force update -- re-added controls may be untranslated
WinFormsUtil.TranslateInterface(this, CurrentLanguage);
if (WindowToggleRequired) // Version combobox selectedvalue needs a little help, only updates once it is visible
PKME_Tabs.FlickerInterface();
@ -923,20 +930,16 @@ namespace PKHeX.WinForms
Thread.CurrentThread.CurrentCulture = new CultureInfo(CurrentLanguage.Substring(0, 2));
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
PKM pk = C_SAV.SAV.GetPKM((PKME_Tabs.fieldsInitialized ? PreparePKM() : PKME_Tabs.pkm).Data);
bool alreadyInit = PKME_Tabs.fieldsInitialized;
PKME_Tabs.fieldsInitialized = false;
Menu_Options.DropDown.Close();
PKM pk = C_SAV.SAV.GetPKM(PKME_Tabs.CurrentPKM.Data);
InitializeStrings();
PKME_Tabs.InitializeLanguage(C_SAV.SAV);
PKME_Tabs.ChangeLanguage(C_SAV.SAV, pk);
string ProgramTitle = Text;
WinFormsUtil.TranslateInterface(this, CurrentLanguage); // Translate the UI to language.
Text = ProgramTitle;
PKME_Tabs.CenterSubEditors();
PKME_Tabs.PopulateFields(pk); // put data back in form
PKME_Tabs.fieldsInitialized |= alreadyInit;
}
private void InitializeStrings()
private static void InitializeStrings()
{
string l = CurrentLanguage;
GameInfo.Strings = GameInfo.GetStrings(l);
@ -945,15 +948,9 @@ namespace PKHeX.WinForms
// Clipboard.SetText(string.Join(Environment.NewLine, Util.GetLocalization(typeof(LegalityCheckStrings))));
Task.Run(() => Util.SetLocalization(typeof(LegalityCheckStrings), Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName.Substring(0, 2)));
// Force an update to the met locations
PKME_Tabs.origintrack = GameVersion.Unknown;
// Update Legality Analysis strings
LegalityAnalysis.MoveStrings = GameInfo.Strings.movelist;
LegalityAnalysis.SpeciesStrings = GameInfo.Strings.specieslist;
if (PKME_Tabs.fieldsInitialized)
PKME_Tabs.UpdateStringDisplay();
}
#endregion
@ -1068,7 +1065,8 @@ namespace PKHeX.WinForms
}
private void GetPreview(PictureBox pb, PKM pk = null)
{
if (!PKME_Tabs.fieldsInitialized) return;
if (!IsInitialized)
return;
pk = pk ?? PreparePKM(false); // don't perform control loss click
if (pb == dragout) dragout.ContextMenuStrip.Enabled = pk.Species != 0 || HaX; // Species
@ -1080,14 +1078,14 @@ namespace PKHeX.WinForms
private void PKME_Tabs_UpdatePreviewSprite(object sender, EventArgs e) => GetPreview(dragout);
private void PKME_Tabs_LegalityChanged(object sender, EventArgs e)
{
if (PKME_Tabs.IsLegal == null || HaX)
if (sender == null || HaX)
{
PB_Legal.Visible = false;
return;
}
PB_Legal.Visible = true;
PB_Legal.Image = PKME_Tabs.IsLegal == false ? Resources.warn : Resources.valid;
PB_Legal.Image = sender as bool? == false ? Resources.warn : Resources.valid;
}
private void PKME_Tabs_RequestShowdownExport(object sender, EventArgs e) => ClickShowdownExportPKM(sender, e);
private void PKME_Tabs_RequestShowdownImport(object sender, EventArgs e) => ClickShowdownImportPKM(sender, e);