Rewrite settings handling; enhance some user experiences (#3193)

- Settings now stored as json next to exe
- Settings now exposes all legality checking setttings that can be changed
- Slot hovering now can play cries in MGDB/PKMDB/etc, not just the main boxes.
- Enhanced hover text for mystery gifts and encounters that have movesets
- Show recently loaded save files in ctrl-f browser
- Toggle auto-load savefile setting to be none/detect-latest/last-loaded
- Custom extensions & extra backup paths can now be configured directly in the json settings
- Settings editor now uses propertygrid & tabs.
This commit is contained in:
Kurt 2021-04-11 18:09:54 -07:00 committed by GitHub
parent aaa69eac15
commit 0d45075d4b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
38 changed files with 811 additions and 1094 deletions

View File

@ -23,7 +23,7 @@ public SavePreview(SaveFile sav, List<INamedFolderPath> paths)
var meta = sav.Metadata;
var dir = meta.FileFolder;
const string notFound = "???";
var parent = dir == null ? notFound : paths.Find(z => dir.StartsWith(z.Path))?.DisplayText ?? notFound;
var parent = dir == null ? notFound : paths.Find(z => dir.StartsWith(z.Path))?.DisplayText ?? new DirectoryInfo(dir).Name;
Save = sav;
Folder = parent;

View File

@ -5,7 +5,7 @@ namespace PKHeX.Core
/// <summary>
/// Interface that exposes a Moveset for the object.
/// </summary>
internal interface IMoveset
public interface IMoveset
{
IReadOnlyList<int> Moves { get; }
}

View File

@ -15,6 +15,7 @@ public static class ParseSettings
/// <summary>
/// Setting to specify if an analysis should permit data sourced from the physical cartridge era of GameBoy games.
/// </summary>
/// <remarks>If false, indicates to use Virtual Console rules (which are transferable to Gen7+)</remarks>
public static bool AllowGBCartEra { get; set; }
/// <summary>
@ -22,13 +23,13 @@ public static class ParseSettings
/// </summary>
public static bool AllowGen1Tradeback { get; set; } = true;
public static Severity NicknamedTrade { get; set; } = Severity.Invalid;
public static Severity NicknamedMysteryGift { get; set; } = Severity.Fishy;
public static Severity RNGFrameNotFound { get; set; } = Severity.Fishy;
public static Severity Gen7TransferStarPID { get; set; } = Severity.Fishy;
public static Severity Gen8MemoryLocationTextVariable { get; set; } = Severity.Fishy;
public static Severity Gen8TransferTrackerNotPresent { get; set; } = Severity.Fishy;
public static Severity NicknamedAnotherSpecies { get; set; } = Severity.Fishy;
public static Severity NicknamedTrade { get; private set; } = Severity.Invalid;
public static Severity NicknamedMysteryGift { get; private set; } = Severity.Fishy;
public static Severity RNGFrameNotFound { get; private set; } = Severity.Fishy;
public static Severity Gen7TransferStarPID { get; private set; } = Severity.Fishy;
public static Severity Gen8MemoryLocationTextVariable { get; private set; } = Severity.Fishy;
public static Severity Gen8TransferTrackerNotPresent { get; private set; } = Severity.Fishy;
public static Severity NicknamedAnotherSpecies { get; private set; } = Severity.Fishy;
public static IReadOnlyList<string> MoveStrings = Util.GetMovesList(GameLanguage.DefaultLanguage);
public static IReadOnlyList<string> SpeciesStrings = Util.GetSpeciesList(GameLanguage.DefaultLanguage);
@ -79,5 +80,32 @@ public static bool InitFromSaveFileData(SaveFile sav)
bool vc = !sav.State.Exportable || (sav.Metadata.FileName?.EndsWith("dat") ?? false); // default to true for non-exportable
return AllowGBCartEra = !vc; // physical cart selected
}
public static void InitFromSettings(IParseSettings settings)
{
CheckWordFilter = settings.CheckWordFilter;
AllowGen1Tradeback = settings.AllowGen1Tradeback;
NicknamedTrade = settings.NicknamedTrade;
NicknamedMysteryGift = settings.NicknamedMysteryGift;
RNGFrameNotFound = settings.RNGFrameNotFound;
Gen7TransferStarPID = settings.Gen7TransferStarPID;
Gen8MemoryLocationTextVariable = settings.Gen8MemoryLocationTextVariable;
Gen8TransferTrackerNotPresent = settings.Gen8TransferTrackerNotPresent;
NicknamedAnotherSpecies = settings.NicknamedAnotherSpecies;
}
}
public interface IParseSettings
{
bool CheckWordFilter { get; }
bool AllowGen1Tradeback { get; }
Severity NicknamedTrade { get; }
Severity NicknamedMysteryGift { get; }
Severity RNGFrameNotFound { get; }
Severity Gen7TransferStarPID { get; }
Severity Gen8MemoryLocationTextVariable { get; }
Severity Gen8TransferTrackerNotPresent { get; }
Severity NicknamedAnotherSpecies { get; }
}
}

View File

@ -104,7 +104,7 @@ private static void AddLinesPKM(MysteryGift gift, IBasicStrings strings, ICollec
var id = gift.Generation < 7 ? $"{gift.TID:D5}/{gift.SID:D5}" : $"[{gift.TrainerSID7:D4}]{gift.TrainerID7:D6}";
var first =
$"{strings.Species[gift.Species]} @ {strings.Item[gift.HeldItem]} --- "
$"{strings.Species[gift.Species]} @ {strings.Item[gift.HeldItem >= 0 ? gift.HeldItem : 0]} --- "
+ (gift.IsEgg ? strings.EggName : $"{gift.OT_Name} - {id}");
result.Add(first);
result.Add(string.Join(" / ", gift.Moves.Select(z => strings.Move[z])));

View File

@ -13,12 +13,12 @@ public sealed class SCBlockCompare
private readonly Dictionary<uint, string> KeyNames;
private string GetKeyName(uint key) => KeyNames.TryGetValue(key, out var val) ? val : $"{key:X8}";
public SCBlockCompare(SCBlockAccessor s1, SCBlockAccessor s2)
public SCBlockCompare(SCBlockAccessor s1, SCBlockAccessor s2, IEnumerable<string> extraKeyNames)
{
var b1 = s1.BlockInfo;
var b2 = s2.BlockInfo;
KeyNames = GetKeyNames(s1, b1, b2);
SCBlockMetadata.AddExtraKeyNames(KeyNames);
SCBlockMetadata.AddExtraKeyNames(KeyNames, extraKeyNames);
var hs1 = new HashSet<uint>(b1.Select(z => z.Key));
var hs2 = new HashSet<uint>(b2.Select(z => z.Key));

View File

@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.IO;
using System.Linq;
namespace PKHeX.Core
@ -19,13 +18,13 @@ public sealed class SCBlockMetadata
/// <summary>
/// Creates a new instance of <see cref="SCBlockMetadata"/> by loading properties and constants declared via reflection.
/// </summary>
public SCBlockMetadata(SCBlockAccessor accessor)
public SCBlockMetadata(SCBlockAccessor accessor, IEnumerable<string> extraKeyNames)
{
var aType = accessor.GetType();
BlockList = aType.GetAllPropertiesOfType<SaveBlock>(accessor);
ValueList = aType.GetAllConstantsOfType<uint>();
AddExtraKeyNames(ValueList);
AddExtraKeyNames(ValueList, extraKeyNames);
Accessor = accessor;
}
@ -41,21 +40,6 @@ public IEnumerable<ComboItem> GetSortedBlockKeyList()
return list;
}
/// <summary>
/// Loads names from an external file to the requested <see cref="names"/> list.
/// </summary>
/// <remarks>Tab separated text file expected.</remarks>
/// <param name="names">Currently loaded list of block names</param>
/// <param name="extra">Side-loaded list of block names to add to the <see cref="names"/> list.</param>
public static void AddExtraKeyNames(IDictionary<uint, string> names, string extra = "SCBlocks.txt")
{
if (!File.Exists(extra))
return;
var lines = File.ReadLines(extra);
AddExtraKeyNames(names, lines);
}
/// <summary>
/// Loads names from an external file to the requested <see cref="names"/> list.
/// </summary>

View File

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace PKHeX.Core
{
[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Parameter | AttributeTargets.Delegate | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter)]
public sealed class LocalizedDescriptionAttribute : DescriptionAttribute
{
public static IReadOnlyDictionary<string, string> Localizer { private get; set; } = new Dictionary<string, string>();
public readonly string Fallback;
public readonly string Key;
public LocalizedDescriptionAttribute(string fallback, [CallerMemberName] string? key = null)
{
Key = $"LocalizedDescription.{key!}";
Fallback = fallback;
}
public override string Description => Localizer.TryGetValue(Key, out var result) ? result : Fallback;
}
}

View File

@ -1,16 +1,15 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using PKHeX.Core;
using Exception = System.Exception;
namespace PKHeX.WinForms
{
/// <summary>
/// Drawing Configuration for painting and updating controls
/// </summary>
[Serializable]
public sealed class DrawConfig : IDisposable
{
private const string PKM = "Pokémon Editor";
@ -92,6 +91,7 @@ public bool GetMarkingColor(int markval, out Color c)
public Color GetText(bool highlight) => highlight ? TextHighlighted : TextColor;
public Color GetBackground(bool legal, bool highlight) => highlight ? BackHighlighted : (legal ? BackLegal : BackColor);
[NonSerialized]
public readonly BrushSet Brushes = new();
public void LoadBrushes()
@ -120,50 +120,6 @@ public override string ToString()
}
return string.Join("\n", lines);
}
public static DrawConfig GetConfig(string data)
{
var config = new DrawConfig();
if (string.IsNullOrWhiteSpace(data))
return config;
var lines = data.Split('\n');
foreach (var l in lines)
config.ApplyLine(l);
return config;
}
private void ApplyLine(string l)
{
var t = typeof(DrawConfig);
var split = l.Split('\t');
var name = split[0];
var value = split[1];
try
{
var pi = t.GetProperty(name);
if (pi == null)
throw new ArgumentNullException(name);
if (pi.PropertyType == typeof(Color))
{
var color = Color.FromArgb(int.Parse(value));
pi.SetValue(this, color);
}
else
{
pi.SetValue(this, value);
}
}
#pragma warning disable CA1031 // Do not catch general exception types
catch (Exception e)
#pragma warning restore CA1031 // Do not catch general exception types
{
Debug.WriteLine($"Failed to write {name} to {value}!");
Debug.WriteLine(e.Message);
}
}
}
public sealed class BrushSet : IDisposable

View File

@ -10,12 +10,12 @@ public sealed class CryPlayer
{
private readonly SoundPlayer Sounds = new();
public void PlayCry(PKM pk)
public void PlayCry(ISpeciesForm pk, int format)
{
if (pk.Species == 0)
return;
string path = GetCryPath(pk, Main.CryPath);
string path = GetCryPath(pk, Main.CryPath, format);
if (!File.Exists(path))
return;
@ -28,22 +28,22 @@ public void PlayCry(PKM pk)
public void Stop() => Sounds.Stop();
private static string GetCryPath(PKM pk, string cryFolder)
private static string GetCryPath(ISpeciesForm pk, string cryFolder, int format)
{
var name = GetCryFileName(pk);
var name = GetCryFileName(pk, format);
var path = Path.Combine(cryFolder, $"{name}.wav");
if (!File.Exists(path))
path = Path.Combine(cryFolder, $"{pk.Species}.wav");
return path;
}
private static string GetCryFileName(PKM pk)
private static string GetCryFileName(ISpeciesForm pk, int format)
{
if (pk.Species == (int)Species.Urshifu && pk.Form == 1) // same sprite for both forms, but different cries
return "892-1";
// don't grab sprite of pkm, no gender specific cries
var res = SpriteName.GetResourceStringSprite(pk.Species, pk.Form, 0, 0, pk.Format);
var res = SpriteName.GetResourceStringSprite(pk.Species, pk.Form, 0, 0, format);
return res.Replace('_', '-') // people like - instead of _ file names ;)
.Substring(1); // skip leading underscore
}

View File

@ -3,7 +3,6 @@
using System.Windows.Forms;
using PKHeX.Core;
using PKHeX.Drawing;
using PKHeX.WinForms.Properties;
namespace PKHeX.WinForms.Controls
{
@ -56,10 +55,7 @@ public void Start(PictureBox pb, SlotTrackerImage lastSlot)
bg = ImageUtil.LayerImage(orig, bg, 0, 0);
pb.BackgroundImage = LastSlot.CurrentBackground = bg;
if (Settings.Default.HoverSlotShowText)
Preview.Show(pb, pk);
if (Settings.Default.HoverSlotPlayCry)
CryPlayer.PlayCry(pk);
Preview.Show(pb, pk);
}
public void Stop()
@ -74,7 +70,6 @@ public void Stop()
LastSlot = null;
}
Preview.Clear();
CryPlayer.Stop();
}
public void Dispose()

View File

@ -1,8 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using PKHeX.Core;
using PKHeX.WinForms.Properties;
using static PKHeX.Core.LegalityCheckStrings;
@ -11,6 +11,7 @@ namespace PKHeX.WinForms.Controls
public sealed class SummaryPreviewer
{
private readonly ToolTip ShowSet = new() { InitialDelay = 200, IsBalloon = false, AutoPopDelay = 32_767 };
private readonly CryPlayer Cry = new();
public void Show(Control pb, PKM pk)
{
@ -19,11 +20,18 @@ public void Show(Control pb, PKM pk)
Clear();
return;
}
var text = ShowdownParsing.GetLocalizedPreviewText(pk, Settings.Default.Language);
var la = new LegalityAnalysis(pk);
var result = new List<string>{ text, string.Empty };
LegalityFormatting.AddEncounterInfo(la, result);
ShowSet.SetToolTip(pb, string.Join(Environment.NewLine, result));
if (Main.Settings.Hover.HoverSlotShowText)
{
var text = ShowdownParsing.GetLocalizedPreviewText(pk, Main.Settings.Startup.Language);
var la = new LegalityAnalysis(pk);
var result = new List<string> { text, string.Empty };
LegalityFormatting.AddEncounterInfo(la, result);
ShowSet.SetToolTip(pb, string.Join(Environment.NewLine, result));
}
if (Main.Settings.Hover.HoverSlotPlayCry)
Cry.PlayCry(pk, pk.Format);
}
public void Show(Control pb, IEncounterInfo enc)
@ -34,16 +42,37 @@ public void Show(Control pb, IEncounterInfo enc)
return;
}
if (Main.Settings.Hover.HoverSlotShowText)
{
var lines = GetTextLines(enc);
var text = string.Join(Environment.NewLine, lines);
ShowSet.SetToolTip(pb, text);
}
if (Main.Settings.Hover.HoverSlotPlayCry)
Cry.PlayCry(enc, enc.Generation);
}
private static IEnumerable<string> GetTextLines(IEncounterInfo enc)
{
var lines = new List<string>();
var str = GameInfo.Strings.Species;
var name = (uint)enc.Species < str.Count ? str[enc.Species] : enc.Species.ToString();
var name = (uint) enc.Species < str.Count ? str[enc.Species] : enc.Species.ToString();
var EncounterName = $"{(enc is IEncounterable ie ? ie.LongName : "Special")} ({name})";
lines.Add(string.Format(L_FEncounterType_0, EncounterName));
if (enc is MysteryGift mg)
lines.Add(mg.CardHeader);
{
lines.AddRange(mg.GetDescription());
}
else if (enc is IMoveset m)
{
var nonzero = m.Moves.Where(z => z != 0).ToList();
if (nonzero.Count != 0)
lines.Add(string.Join(" / ", nonzero.Select(z => GameInfo.Strings.Move[z])));
}
var el = enc as ILocation;
var loc = el?.GetEncounterLocation(enc.Generation, (int)enc.Version);
var loc = el?.GetEncounterLocation(enc.Generation, (int) enc.Version);
if (!string.IsNullOrEmpty(loc))
lines.Add(string.Format(L_F0_1, "Location", loc));
lines.Add(string.Format(L_F0_1, nameof(GameVersion), enc.Version));
@ -61,11 +90,13 @@ public void Show(Control pb, IEncounterInfo enc)
lines.AddRange(raw.Split(',', '}', '{'));
}
#endif
var text = string.Join(Environment.NewLine, lines);
ShowSet.SetToolTip(pb, text);
return lines;
}
public void Clear() => ShowSet.RemoveAll();
public void Clear()
{
ShowSet.RemoveAll();
Cry.Stop();
}
}
}

View File

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
@ -15,7 +14,6 @@
using PKHeX.Core;
using PKHeX.Drawing;
using PKHeX.WinForms.Controls;
using PKHeX.WinForms.Properties;
using static PKHeX.Core.MessageStrings;
namespace PKHeX.WinForms
@ -94,13 +92,15 @@ private set
public static readonly string WorkingDirectory = Application.StartupPath;
public static readonly string DatabasePath = Path.Combine(WorkingDirectory, "pkmdb");
public static readonly string MGDatabasePath = Path.Combine(WorkingDirectory, "mgdb");
public static readonly string ConfigPath = Path.Combine(WorkingDirectory, "cfg.json");
public static readonly string BackupPath = Path.Combine(WorkingDirectory, "bak");
public static readonly string CryPath = Path.Combine(WorkingDirectory, "sounds");
public static readonly string SAVPaths = Path.Combine(WorkingDirectory, "savpaths.txt");
private static readonly string TemplatePath = Path.Combine(WorkingDirectory, "template");
private static readonly string PluginPath = Path.Combine(WorkingDirectory, "plugins");
private const string ThreadPath = "https://projectpokemon.org/pkhex/";
public static readonly PKHeXSettings Settings = PKHeXSettings.GetSettings(ConfigPath);
#endregion
#region //// MAIN MENU FUNCTIONS ////
@ -112,32 +112,16 @@ private static void FormLoadInitialSettings(string[] args, out bool showChangelo
HaX = args.Any(x => string.Equals(x.Trim('-'), nameof(HaX), StringComparison.CurrentCultureIgnoreCase))
|| Path.GetFileNameWithoutExtension(Process.GetCurrentProcess().MainModule!.FileName!).EndsWith(nameof(HaX));
try
{
ConfigUtil.CheckConfig();
FormLoadConfig(out BAKprompt, out showChangelog);
HaX |= Settings.Default.ForceHaXOnLaunch;
}
catch (ConfigurationErrorsException e)
{
// Delete the settings if they exist
var settingsFilename = (e.InnerException as ConfigurationErrorsException)?.Filename;
if (settingsFilename != null && !string.IsNullOrEmpty(settingsFilename) && File.Exists(settingsFilename))
DeleteConfig(settingsFilename);
else
WinFormsUtil.Error(MsgSettingsLoadFail, e);
}
FormLoadConfig(out BAKprompt, out showChangelog);
HaX |= Settings.Startup.ForceHaXOnLaunch;
var exts = Path.Combine(WorkingDirectory, "savexts.txt");
if (File.Exists(exts))
WinFormsUtil.AddSaveFileExtensions(File.ReadLines(exts));
WinFormsUtil.AddSaveFileExtensions(Settings.Backup.OtherSaveFileExtensions);
}
private static void FormLoadCustomBackupPaths()
{
SaveFinder.CustomBackupPaths.Clear();
if (File.Exists(SAVPaths)) // custom user paths
SaveFinder.CustomBackupPaths.AddRange(File.ReadAllLines(SAVPaths).Where(Directory.Exists));
SaveFinder.CustomBackupPaths.AddRange(Settings.Backup.OtherBackupPaths.Where(Directory.Exists));
}
private void FormLoadAddEvents()
@ -184,12 +168,25 @@ private void FormLoadInitialFiles(string[] args)
try
#endif
{
var startup = Settings.Startup;
string path = string.Empty;
SaveFile? sav = null;
if (Settings.Default.DetectSaveOnStartup && !SaveFinder.DetectSaveFile(out path, out sav))
if (startup.AutoLoadSaveOnStartup == AutoLoadSetting.RecentBackup)
{
if (!string.IsNullOrWhiteSpace(path))
WinFormsUtil.Error(path); // `path` contains the error message
if (!SaveFinder.DetectSaveFile(out path, out sav))
{
if (!string.IsNullOrWhiteSpace(path))
WinFormsUtil.Error(path); // `path` contains the error message
}
}
else if (startup.AutoLoadSaveOnStartup == AutoLoadSetting.LastLoaded)
{
if (startup.RecentlyLoaded.Count != 0)
{
path = startup.RecentlyLoaded[0];
if (File.Exists(path))
sav = SaveUtil.GetVariantSAV(path);
}
}
bool savLoaded = false;
@ -198,7 +195,7 @@ private void FormLoadInitialFiles(string[] args)
savLoaded = OpenSAV(sav, path);
}
if (!savLoaded)
LoadBlankSaveFile(Settings.Default.DefaultSaveVersion);
LoadBlankSaveFile(startup.DefaultSaveVersion);
}
#if !DEBUG
catch (Exception ex)
@ -261,43 +258,37 @@ private static void FormLoadConfig(out bool BAKprompt, out bool showChangelog)
BAKprompt = false;
showChangelog = false;
var Settings = Properties.Settings.Default;
// Version Check
if (Settings.Version.Length > 0) // already run on system
if (Settings.Startup.Version.Length > 0) // already run on system
{
bool parsed = Version.TryParse(Settings.Version, out var lastrev);
bool parsed = Version.TryParse(Settings.Startup.Version, out var lastrev);
showChangelog = parsed && lastrev < CurrentProgramVersion;
if (showChangelog) // user just updated from a prior version
{
Settings.Upgrade(); // copy previous version's settings, if available.
}
}
Settings.Version = CurrentProgramVersion.ToString(); // set current ver so this doesn't happen until the user updates next time
Settings.Startup.Version = CurrentProgramVersion.ToString(); // set current ver so this doesn't happen until the user updates next time
// BAK Prompt
if (!Settings.BAKPrompt)
BAKprompt = Settings.BAKPrompt = true;
if (!Settings.Backup.BAKPrompt)
BAKprompt = Settings.Backup.BAKPrompt = true;
}
public static DrawConfig Draw { get; private set; } = new();
private void FormInitializeSecond()
{
var settings = Settings.Default;
Draw = C_SAV.M.Hover.Draw = PKME_Tabs.Draw = DrawConfig.GetConfig(settings.Draw);
var settings = Settings;
Draw = C_SAV.M.Hover.Draw = PKME_Tabs.Draw = settings.Draw;
ReloadProgramSettings(settings);
CB_MainLanguage.Items.AddRange(main_langlist);
PB_Legal.Visible = !HaX;
PKMConverter.AllowIncompatibleConversion = C_SAV.HaX = PKME_Tabs.HaX = HaX;
WinFormsUtil.DetectSaveFileOnFileOpen = settings.DetectSaveOnStartup;
WinFormsUtil.DetectSaveFileOnFileOpen = settings.Startup.TryDetectRecentSave;
#if DEBUG
DevUtil.AddControl(Menu_Tools);
#endif
// Select Language
CB_MainLanguage.SelectedIndex = GameLanguage.GetLanguageIndex(settings.Language);
CB_MainLanguage.SelectedIndex = GameLanguage.GetLanguageIndex(settings.Startup.Language);
}
private void FormLoadPlugins()
@ -311,17 +302,6 @@ private void FormLoadPlugins()
p.Initialize(C_SAV, PKME_Tabs, menuStrip1, CurrentProgramVersion);
}
private static void DeleteConfig(string settingsFilename)
{
var dr = WinFormsUtil.Prompt(MessageBoxButtons.YesNo, MsgSettingsResetCorrupt, MsgSettingsResetPrompt);
if (dr == DialogResult.Yes)
{
File.Delete(settingsFilename);
WinFormsUtil.Alert(MsgSettingsResetSuccess, MsgProgramRestart);
}
Process.GetCurrentProcess().Kill();
}
// Main Menu Strip UI Functions
private void MainMenuOpen(object sender, EventArgs e)
{
@ -400,19 +380,19 @@ private void MainMenuMysteryDB(object sender, EventArgs e)
private void MainMenuSettings(object sender, EventArgs e)
{
var settings = Settings.Default;
var ver = settings.DefaultSaveVersion; // check if it changes
using var form = new SettingsEditor(settings, nameof(settings.BAKPrompt), nameof(settings.ForceHaXOnLaunch));
var settings = Settings;
var ver = Settings.Startup.DefaultSaveVersion; // check if it changes
using var form = new SettingsEditor(settings);
form.ShowDialog();
// Reload text (if OT details hidden)
Text = GetProgramTitle(C_SAV.SAV);
// Update final settings
ReloadProgramSettings(Settings.Default);
ReloadProgramSettings(Settings);
if (ver != settings.DefaultSaveVersion) // changed by user
if (ver != Settings.Startup.DefaultSaveVersion) // changed by user
{
LoadBlankSaveFile(settings.DefaultSaveVersion);
LoadBlankSaveFile(Settings.Startup.DefaultSaveVersion);
return;
}
@ -421,23 +401,22 @@ private void MainMenuSettings(object sender, EventArgs e)
C_SAV.ReloadSlots();
}
private void ReloadProgramSettings(Settings settings)
private void ReloadProgramSettings(PKHeXSettings settings)
{
Draw.LoadBrushes();
PKME_Tabs.Unicode = Unicode = settings.Unicode;
PKME_Tabs.Unicode = Unicode = settings.Display.Unicode;
PKME_Tabs.UpdateUnicode(GenderSymbols);
SpriteName.AllowShinySprite = settings.ShinySprites;
SaveFile.SetUpdateDex = settings.SetUpdateDex ? PKMImportSetting.Update : PKMImportSetting.Skip;
SaveFile.SetUpdatePKM = settings.SetUpdatePKM ? PKMImportSetting.Update : PKMImportSetting.Skip;
C_SAV.ModifyPKM = PKME_Tabs.ModifyPKM = settings.SetUpdatePKM;
CommonEdits.ShowdownSetIVMarkings = settings.ApplyMarkings;
CommonEdits.ShowdownSetBehaviorNature = settings.ApplyNature;
C_SAV.FlagIllegal = settings.FlagIllegal;
C_SAV.M.Hover.GlowHover = settings.HoverSlotGlowEdges;
SpriteBuilder.ShowEggSpriteAsItem = settings.ShowEggSpriteAsHeldItem;
ParseSettings.AllowGen1Tradeback = settings.AllowGen1Tradeback;
ParseSettings.Gen8TransferTrackerNotPresent = settings.FlagMissingTracker ? Severity.Invalid : Severity.Fishy;
PKME_Tabs.HideSecretValues = C_SAV.HideSecretDetails = settings.HideSecretDetails;
SpriteName.AllowShinySprite = settings.Display.ShinySprites;
SaveFile.SetUpdateDex = settings.SlotWrite.SetUpdateDex ? PKMImportSetting.Update : PKMImportSetting.Skip;
SaveFile.SetUpdatePKM = settings.SlotWrite.SetUpdatePKM ? PKMImportSetting.Update : PKMImportSetting.Skip;
C_SAV.ModifyPKM = PKME_Tabs.ModifyPKM = settings.SlotWrite.SetUpdatePKM;
CommonEdits.ShowdownSetIVMarkings = settings.Import.ApplyMarkings;
CommonEdits.ShowdownSetBehaviorNature = settings.Import.ApplyNature;
C_SAV.FlagIllegal = settings.Display.FlagIllegal;
C_SAV.M.Hover.GlowHover = settings.Hover.HoverSlotGlowEdges;
SpriteBuilder.ShowEggSpriteAsItem = settings.Display.ShowEggSpriteAsHeldItem;
ParseSettings.InitFromSettings(settings.Legality);
PKME_Tabs.HideSecretValues = C_SAV.HideSecretDetails = settings.Privacy.HideSecretDetails;
}
private void MainMenuBoxLoad(object sender, EventArgs e)
@ -741,7 +720,7 @@ private bool OpenSAV(SaveFile? sav, string path)
if (!SanityCheckSAV(ref sav))
return true;
if (C_SAV.SAV.State.Edited && Settings.Default.ModifyUnset)
if (C_SAV.SAV.State.Edited && Settings.SlotWrite.ModifyUnset)
{
var prompt = WinFormsUtil.Prompt(MessageBoxButtons.YesNo, MsgProgramCloseUnsaved, MsgProgramSaveFileConfirm);
if (prompt != DialogResult.Yes)
@ -771,7 +750,8 @@ private bool OpenSAV(SaveFile? sav, string path)
Menu_ShowdownExportParty.Visible = sav.HasParty;
Menu_ShowdownExportCurrentBox.Visible = sav.HasBox;
if (Settings.Default.PlaySoundSAVLoad)
Settings.Startup.LoadSaveFile(path);
if (Settings.Sounds.PlaySoundSAVLoad)
SystemSounds.Asterisk.Play();
return true;
}
@ -836,7 +816,7 @@ private static string GetProgramTitle(SaveFile sav)
if (sav is ISaveFileRevision rev)
title = title.Insert(title.Length - 2, rev.SaveRevisionString);
var ver = GameInfo.GetVersionName(sav.Version);
if (Settings.Default.HideSAVDetails)
if (Settings.Privacy.HideSAVDetails)
return title + $"[{ver}]";
if (!sav.State.Exportable) // Blank save file
return title + $"{sav.Metadata.FileName} [{sav.OT} ({ver})]";
@ -845,7 +825,7 @@ private static string GetProgramTitle(SaveFile sav)
private static bool TryBackupExportCheck(SaveFile sav, string path)
{
if (string.IsNullOrWhiteSpace(path) || !Settings.Default.BAKEnabled) // not actual save
if (string.IsNullOrWhiteSpace(path) || !Settings.Backup.BAKEnabled) // not actual save
return false;
// If backup folder exists, save a backup.
@ -925,7 +905,7 @@ private void ChangeMainLanguage(object sender, EventArgs e)
CurrentLanguage = GameLanguage.Language2Char(CB_MainLanguage.SelectedIndex);
// Set the culture (makes it easy to pass language to other forms)
Settings.Default.Language = CurrentLanguage;
Settings.Startup.Language = CurrentLanguage;
Thread.CurrentThread.CurrentCulture = new CultureInfo(CurrentLanguage.Substring(0, 2));
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
@ -933,6 +913,7 @@ private void ChangeMainLanguage(object sender, EventArgs e)
LocalizeUtil.InitializeStrings(CurrentLanguage, C_SAV.SAV, HaX);
WinFormsUtil.TranslateInterface(this, CurrentLanguage); // Translate the UI to language.
LocalizedDescriptionAttribute.Localizer = WinFormsTranslator.GetDictionary(CurrentLanguage);
if (C_SAV.SAV is not FakeSaveFile)
{
var pk = PKME_Tabs.CurrentPKM.Clone();
@ -1045,14 +1026,14 @@ private void ShowLegality(object sender, EventArgs e, PKM pk)
if (dr == DialogResult.Yes)
WinFormsUtil.SetClipboardText(report);
}
else if (Settings.Default.IgnoreLegalPopup && la.Valid)
else if (Settings.Display.IgnoreLegalPopup && la.Valid)
{
if (Settings.Default.PlaySoundLegalityCheck)
if (Settings.Sounds.PlaySoundLegalityCheck)
SystemSounds.Asterisk.Play();
}
else
{
WinFormsUtil.Alert(Settings.Default.PlaySoundLegalityCheck, report);
WinFormsUtil.Alert(Settings.Sounds.PlaySoundLegalityCheck, report);
}
}
@ -1186,24 +1167,7 @@ private void Main_FormClosing(object sender, FormClosingEventArgs e)
}
}
SaveSettings();
}
private static void SaveSettings()
{
try
{
var settings = Settings.Default;
settings.Draw = Draw.ToString();
settings.Save();
}
#pragma warning disable CA1031 // Do not catch general exception types
catch (Exception x)
// Config might be corrupted, or their dotnet runtime is insufficient (<4.6?)
#pragma warning restore CA1031 // Do not catch general exception types
{
File.WriteAllLines("config error.txt", new[] {x.ToString()});
}
PKHeXSettings.SaveSettings(ConfigPath, Settings);
}
#endregion

View File

@ -46,12 +46,12 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\PKHeX.Core\PKHeX.Core.csproj" />
<ProjectReference Include="..\PKHeX.Drawing\PKHeX.Drawing.csproj" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net46'">
<Reference Include="System.Configuration" />
<ItemGroup>
<ProjectReference Include="..\PKHeX.Core\PKHeX.Core.csproj" />
<ProjectReference Include="..\PKHeX.Drawing\PKHeX.Drawing.csproj" />
</ItemGroup>
<ItemGroup>
@ -60,11 +60,6 @@
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Update="Properties\Settings.Designer.cs">
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
@ -80,11 +75,10 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Update="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<ItemGroup Condition="'$(TargetFramework)' == 'net5.0-windows'">
<PackageReference Include="System.Text.Json">
<Version>5.0.2</Version>
</PackageReference>
</ItemGroup>
</Project>

View File

@ -0,0 +1,281 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using Newtonsoft.Json;
using PKHeX.Core;
namespace PKHeX.WinForms
{
[Serializable]
public sealed class PKHeXSettings
{
public StartupSettings Startup { get; set; } = new();
public BackupSettings Backup { get; set; } = new();
// General
public LegalitySettings Legality { get; set; } = new();
public SetImportSettings Import { get; set; } = new();
public SlotWriteSettings SlotWrite { get; set; } = new();
public PrivacySettings Privacy { get; set; } = new();
// UI Tweaks
public DisplaySettings Display { get; set; } = new();
public SoundSettings Sounds { get; set; } = new();
public HoverSettings Hover { get; set; } = new();
// GUI Specific
public DrawConfig Draw { get; set; } = new();
public AdvancedSettings Advanced { get; set; } = new();
public static PKHeXSettings GetSettings(string configPath)
{
if (!File.Exists(configPath))
return new PKHeXSettings();
try
{
var lines = File.ReadAllText(configPath);
return JsonConvert.DeserializeObject<PKHeXSettings>(lines) ?? new PKHeXSettings();
}
#pragma warning disable CA1031 // Do not catch general exception types
catch (Exception x)
#pragma warning restore CA1031 // Do not catch general exception types
{
DumpConfigError(x);
return new PKHeXSettings();
}
}
public static void SaveSettings(string configPath, PKHeXSettings cfg)
{
try
{
var settings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
DefaultValueHandling = DefaultValueHandling.Populate,
NullValueHandling = NullValueHandling.Ignore,
};
var text = JsonConvert.SerializeObject(cfg, settings);
File.WriteAllText(configPath, text);
}
#pragma warning disable CA1031 // Do not catch general exception types
catch (Exception x)
#pragma warning restore CA1031 // Do not catch general exception types
{
DumpConfigError(x);
}
}
private static void DumpConfigError(Exception x)
{
try
{
File.WriteAllLines("config error.txt", new[] { x.ToString() });
}
#pragma warning disable CA1031 // Do not catch general exception types
catch (Exception)
#pragma warning restore CA1031 // Do not catch general exception types
{
Debug.WriteLine(x); // ???
}
}
}
[Serializable]
public sealed class BackupSettings
{
[LocalizedDescription("Automatic Backups of Save Files are copied to the backup folder when true.")]
public bool BAKEnabled { get; set; } = true;
[LocalizedDescription("Tracks if the \"Create Backup\" prompt has been issued to the user.")]
public bool BAKPrompt { get; set; }
#pragma warning disable CA1819 // Properties should not return arrays
[LocalizedDescription("List of extra locations to look for Save Files.")]
public string[] OtherBackupPaths { get; set; } = Array.Empty<string>();
[LocalizedDescription("Save File file-extensions (no period) that the program should also recognize.")]
public string[] OtherSaveFileExtensions { get; set; } = Array.Empty<string>();
#pragma warning restore CA1819 // Properties should not return arrays
}
[Serializable]
public sealed class StartupSettings
{
[Browsable(false)]
[LocalizedDescription("Last version that the program was run with.")]
public string Version { get; set; } = string.Empty;
[LocalizedDescription("Force HaX mode on Program Launch")]
public bool ForceHaXOnLaunch { get; set; }
[LocalizedDescription("Automatically locates the most recently saved Save File when opening a new file.")]
public bool TryDetectRecentSave { get; set; } = true;
[LocalizedDescription("Automatically Detect Save File on Program Startup")]
public AutoLoadSetting AutoLoadSaveOnStartup { get; set; } = AutoLoadSetting.RecentBackup;
public List<string> RecentlyLoaded = new(MaxRecentCount);
// Don't let invalid values slip into the startup version.
private GameVersion _defaultSaveVersion = GameVersion.SW;
private string _language = GameLanguage.DefaultLanguage;
[Browsable(false)]
public string Language
{
get => _language;
set
{
if (GameLanguage.GetLanguageIndex(value) == -1)
return;
_language = value;
}
}
[Browsable(false)]
public GameVersion DefaultSaveVersion
{
get => _defaultSaveVersion;
set
{
if (!value.IsValidSavedVersion())
return;
_defaultSaveVersion = value;
}
}
private const int MaxRecentCount = 10;
public void LoadSaveFile(string path)
{
var recent = RecentlyLoaded;
if (!recent.Remove(path))
return;
if (recent.Count >= MaxRecentCount)
recent.RemoveAt(recent.Count - 1);
recent.Insert(0, path);
}
}
public enum AutoLoadSetting
{
Disabled,
RecentBackup,
LastLoaded,
}
[Serializable]
public sealed class LegalitySettings : IParseSettings
{
[LocalizedDescription("Checks player given Nicknames and Trainer Names for profanity. Bad words will be flagged using the 3DS console's regex lists.")]
public bool CheckWordFilter { get; set; } = true;
[LocalizedDescription("GB: Allow Generation 2 tradeback learnsets for PK1 formats. Disable when checking RBY Metagame rules.")]
public bool AllowGen1Tradeback { get; set; } = true;
[LocalizedDescription("Severity to flag a Legality Check if it is a nicknamed In-Game Trade the player cannot normally nickname.")]
public Severity NicknamedTrade { get; set; } = Severity.Invalid;
[LocalizedDescription("Severity to flag a Legality Check if it is a nicknamed Mystery Gift the player cannot normally nickname.")]
public Severity NicknamedMysteryGift { get; set; } = Severity.Fishy;
[LocalizedDescription("Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match.")]
public Severity RNGFrameNotFound { get; set; } = Severity.Fishy;
[LocalizedDescription("Severity to flag a Legality Check if Pokémon from Gen1/2 has a Star Shiny PID.")]
public Severity Gen7TransferStarPID { get; set; } = Severity.Fishy;
[LocalizedDescription("Severity to flag a Legality Check if a Gen8 Location Memory text variable is present.")]
public Severity Gen8MemoryLocationTextVariable { get; set; } = Severity.Fishy;
[LocalizedDescription("Severity to flag a Legality Check if the HOME Tracker is Missing")]
public Severity Gen8TransferTrackerNotPresent { get; set; } = Severity.Fishy;
[LocalizedDescription("Severity to flag a Legality Check if Pokémon has a Nickname matching another Species.")]
public Severity NicknamedAnotherSpecies { get; set; } = Severity.Fishy;
}
[Serializable]
public class AdvancedSettings
{
[LocalizedDescription("Path to a dump of block hash-names. If file does not exist, only names defined within the program's code will be loaded.")]
public string PathBlockKeyListSWSH { get; set; } = "SCBlocks.txt";
}
[Serializable]
public sealed class HoverSettings
{
[LocalizedDescription("Show PKM Slot ToolTip on Hover")]
public bool HoverSlotShowText { get; set; } = true;
[LocalizedDescription("Play PKM Slot Cry on Hover")]
public bool HoverSlotPlayCry { get; set; } = true;
[LocalizedDescription("Show a Glow effect around the PKM on Hover")]
public bool HoverSlotGlowEdges { get; set; } = true;
}
[Serializable]
public sealed class SoundSettings
{
[LocalizedDescription("Play Sound when loading a new Save File")]
public bool PlaySoundSAVLoad { get; set; } = true;
[LocalizedDescription("Play Sound when popping up Legality Report")]
public bool PlaySoundLegalityCheck { get; set; } = true;
}
[Serializable]
public sealed class SetImportSettings
{
[LocalizedDescription("Apply StatNature to Nature on Import")]
public bool ApplyNature { get; set; } = true;
[LocalizedDescription("Apply Markings on Import")]
public bool ApplyMarkings { get; set; } = true;
}
[Serializable]
public sealed class SlotWriteSettings
{
[LocalizedDescription("Automatically modify the Save File's Pokédex when injecting a PKM.")]
public bool SetUpdateDex { get; set; } = true;
[LocalizedDescription("Automatically adapt the PKM Info to the Save File (Handler, Format)")]
public bool SetUpdatePKM { get; set; } = true;
[LocalizedDescription("When enabled and closing/loading a save file, the program will alert if the current save file has been modified without saving.")]
public bool ModifyUnset { get; set; } = true;
}
[Serializable]
public sealed class DisplaySettings
{
[LocalizedDescription("Show Unicode gender symbol characters, or ASCII when disabled.")]
public bool Unicode { get; set; } = true;
[LocalizedDescription("Show fanmade shiny sprites when the PKM is shiny.")]
public bool ShinySprites { get; set; } = true;
[LocalizedDescription("Show an Egg Sprite As Held Item rather than hiding the PKM")]
public bool ShowEggSpriteAsHeldItem { get; set; } = true;
[LocalizedDescription("Don't show the Legality popup if Legal!")]
public bool IgnoreLegalPopup { get; set; } = true;
[LocalizedDescription("Flag Illegal Slots in Save File")]
public bool FlagIllegal { get; set; } = true;
}
[Serializable]
public sealed class PrivacySettings
{
[LocalizedDescription("Hide Save File Details in Program Title")]
public bool HideSAVDetails { get; set; }
[LocalizedDescription("Hide Secret Details in Editors")]
public bool HideSecretDetails { get; set; }
}
}

View File

@ -1,350 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace PKHeX.WinForms.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.8.1.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string Language {
get {
return ((string)(this["Language"]));
}
set {
this["Language"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string Version {
get {
return ((string)(this["Version"]));
}
set {
this["Version"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool Unicode {
get {
return ((bool)(this["Unicode"]));
}
set {
this["Unicode"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool SetUpdateDex {
get {
return ((bool)(this["SetUpdateDex"]));
}
set {
this["SetUpdateDex"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool SetUpdatePKM {
get {
return ((bool)(this["SetUpdatePKM"]));
}
set {
this["SetUpdatePKM"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool BAKPrompt {
get {
return ((bool)(this["BAKPrompt"]));
}
set {
this["BAKPrompt"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool FlagIllegal {
get {
return ((bool)(this["FlagIllegal"]));
}
set {
this["FlagIllegal"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool ModifyUnset {
get {
return ((bool)(this["ModifyUnset"]));
}
set {
this["ModifyUnset"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool ShinySprites {
get {
return ((bool)(this["ShinySprites"]));
}
set {
this["ShinySprites"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool ApplyMarkings {
get {
return ((bool)(this["ApplyMarkings"]));
}
set {
this["ApplyMarkings"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool HoverSlotShowText {
get {
return ((bool)(this["HoverSlotShowText"]));
}
set {
this["HoverSlotShowText"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool HoverSlotPlayCry {
get {
return ((bool)(this["HoverSlotPlayCry"]));
}
set {
this["HoverSlotPlayCry"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool HoverSlotGlowEdges {
get {
return ((bool)(this["HoverSlotGlowEdges"]));
}
set {
this["HoverSlotGlowEdges"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool HideSAVDetails {
get {
return ((bool)(this["HideSAVDetails"]));
}
set {
this["HideSAVDetails"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool ShowEggSpriteAsHeldItem {
get {
return ((bool)(this["ShowEggSpriteAsHeldItem"]));
}
set {
this["ShowEggSpriteAsHeldItem"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool HideSecretDetails {
get {
return ((bool)(this["HideSecretDetails"]));
}
set {
this["HideSecretDetails"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("SW")]
public global::PKHeX.Core.GameVersion DefaultSaveVersion {
get {
return ((global::PKHeX.Core.GameVersion)(this["DefaultSaveVersion"]));
}
set {
this["DefaultSaveVersion"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool DetectSaveOnStartup {
get {
return ((bool)(this["DetectSaveOnStartup"]));
}
set {
this["DetectSaveOnStartup"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool BAKEnabled {
get {
return ((bool)(this["BAKEnabled"]));
}
set {
this["BAKEnabled"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool AllowGen1Tradeback {
get {
return ((bool)(this["AllowGen1Tradeback"]));
}
set {
this["AllowGen1Tradeback"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool ForceHaXOnLaunch {
get {
return ((bool)(this["ForceHaXOnLaunch"]));
}
set {
this["ForceHaXOnLaunch"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool IgnoreLegalPopup {
get {
return ((bool)(this["IgnoreLegalPopup"]));
}
set {
this["IgnoreLegalPopup"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string Draw {
get {
return ((string)(this["Draw"]));
}
set {
this["Draw"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool PlaySoundSAVLoad {
get {
return ((bool)(this["PlaySoundSAVLoad"]));
}
set {
this["PlaySoundSAVLoad"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool PlaySoundLegalityCheck {
get {
return ((bool)(this["PlaySoundLegalityCheck"]));
}
set {
this["PlaySoundLegalityCheck"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool FlagMissingTracker {
get {
return ((bool)(this["FlagMissingTracker"]));
}
set {
this["FlagMissingTracker"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool ApplyNature {
get {
return ((bool)(this["ApplyNature"]));
}
set {
this["ApplyNature"] = value;
}
}
}
}

View File

@ -1,87 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="PKHeX.WinForms.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="Language" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="Version" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="Unicode" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="SetUpdateDex" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="SetUpdatePKM" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="BAKPrompt" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="FlagIllegal" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="ModifyUnset" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="ShinySprites" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="ApplyMarkings" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="HoverSlotShowText" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="HoverSlotPlayCry" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="HoverSlotGlowEdges" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="HideSAVDetails" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="ShowEggSpriteAsHeldItem" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="HideSecretDetails" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="DefaultSaveVersion" Type="PKHeX.Core.GameVersion" Scope="User">
<Value Profile="(Default)">SW</Value>
</Setting>
<Setting Name="DetectSaveOnStartup" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="BAKEnabled" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="AllowGen1Tradeback" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="ForceHaXOnLaunch" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="IgnoreLegalPopup" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="Draw" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="PlaySoundSAVLoad" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="PlaySoundLegalityCheck" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="FlagMissingTracker" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="ApplyNature" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
</Settings>
</SettingsFile>

View File

@ -1,7 +0,0 @@
{
"profiles": {
"PKHeX.WinForms": {
"commandName": "Project"
}
}
}

View File

@ -72,6 +72,38 @@ ErrorWindow.B_Abort=Abbrechen
ErrorWindow.B_Continue=Fortfahren
ErrorWindow.B_CopyToClipboard=In Zwischenablage kopieren
ErrorWindow.L_ProvideInfo=Bitte sende diese Information, wenn du den Fehler meldest:
LocalizedDescription.AllowGen1Tradeback=AllowGen1Tradeback
LocalizedDescription.ApplyMarkings=Apply Markings on Import
LocalizedDescription.ApplyNature=Apply StatNature to Nature on Import
LocalizedDescription.AutoLoadSaveOnStartup=Automatically Detect Save File on Program Startup
LocalizedDescription.BAKEnabled=Automatic Save File Backups Enabled
LocalizedDescription.BAKPrompt=Tracks if the "Create Backup" prompt has been issued to the user.
LocalizedDescription.FlagIllegal=Flag Illegal Slots in Save File
LocalizedDescription.ForceHaXOnLaunch=Force HaX mode on Program Launch
LocalizedDescription.Gen7TransferStarPID=Severity to flag a Legality Check if Pokémon from Gen1/2 has a Star Shiny PID.
LocalizedDescription.Gen8MemoryLocationTextVariable=Severity to flag a Legality Check if a Gen8 Location Memory text variable is present.
LocalizedDescription.Gen8TransferTrackerNotPresent=Severity to flag a Legality Check if the HOME Tracker is Missing
LocalizedDescription.HideSAVDetails=Hide Save File Details in Program Title
LocalizedDescription.HideSecretDetails=Hide Secret Details in Editors
LocalizedDescription.HoverSlotGlowEdges=Show PKM Glow on Hover
LocalizedDescription.HoverSlotPlayCry=Play PKM Slot Cry on Hover
LocalizedDescription.HoverSlotShowText=Show PKM Slot ToolTip on Hover
LocalizedDescription.IgnoreLegalPopup=Don't show popup if Legal!
LocalizedDescription.ModifyUnset=Notify Unset Changes
LocalizedDescription.NicknamedAnotherSpecies=Severity to flag a Legality Check if Pokémon has a Nickname matching another Species.
LocalizedDescription.NicknamedMysteryGift=Severity to flag a Legality Check if it is a nicknamed Mystery Gift the player cannot normally nickname.
LocalizedDescription.NicknamedTrade=Severity to flag a Legality Check if it is a nicknamed In-Game Trade the player cannot normally nickname.
LocalizedDescription.OtherBackupPaths=List of extra locations to look for Save Files.
LocalizedDescription.PlaySoundLegalityCheck=Play Sound when popping up Legality Report
LocalizedDescription.PlaySoundSAVLoad=Play Sound when loading a new Save File
LocalizedDescription.RNGFrameNotFound=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match.
LocalizedDescription.SetUpdateDex=Ändern Pokédex
LocalizedDescription.SetUpdatePKM=Ändern PKM Info
LocalizedDescription.ShinySprites=Shiny Sprites
LocalizedDescription.ShowEggSpriteAsHeldItem=Show Egg Sprite As Held Item
LocalizedDescription.TryDetectRecentSave=Automatically locates the most recently saved Save File when opening a new file.
LocalizedDescription.Unicode=Unicode
LocalizedDescription.Version=Last version that the program was run with.
Main.B_Blocks=Block Data
Main.B_CellsStickers=Cells/Stickers
Main.B_CGearSkin=C-Gear Skin
@ -527,14 +559,12 @@ SAV_HallOfFame.Label_Species=Spezies:
SAV_HallOfFame.Label_TID=TID:
SAV_HallOfFame7.B_Cancel=Cancel
SAV_HallOfFame7.B_Close=Save
SAV_HallOfFame7.CHK_Flag=Flag
SAV_HallOfFame7.L_C1=PKM 1:
SAV_HallOfFame7.L_C2=PKM 2:
SAV_HallOfFame7.L_C3=PKM 3:
SAV_HallOfFame7.L_C4=PKM 4:
SAV_HallOfFame7.L_C5=PKM 5:
SAV_HallOfFame7.L_C6=PKM 6:
SAV_HallOfFame7.L_Count=Count:
SAV_HallOfFame7.L_EC=Starter EC:
SAV_HallOfFame7.L_F1=PKM 1:
SAV_HallOfFame7.L_F2=PKM 2:
@ -1391,33 +1421,6 @@ SAV_ZygardeCell.B_GiveAll=Collect All
SAV_ZygardeCell.B_Save=Save
SAV_ZygardeCell.L_Cells=Stored:
SAV_ZygardeCell.L_Collected=Collected:
SettingsEditor.AllowGen1Tradeback=AllowGen1Tradeback
SettingsEditor.ApplyMarkings=Apply Markings on Import
SettingsEditor.ApplyNature=Apply StatNature to Nature on Import
SettingsEditor.B_Reset=Reset All
SettingsEditor.BAKEnabled=Automatic Save File Backups Enabled
SettingsEditor.DetectSaveOnStartup=Automatically Detect Save File on Program Startup
SettingsEditor.FlagIllegal=Flag Illegal Slots in Save File
SettingsEditor.FlagMissingTracker=Flag as Illegal if HOME Tracker is Missing
SettingsEditor.ForceHaXOnLaunch=Force HaX mode on Program Launch
SettingsEditor.HideSAVDetails=Hide Save File Details in Program Title
SettingsEditor.HideSecretDetails=Hide Secret Details in Editors
SettingsEditor.HoverSlotGlowEdges=Show PKM Glow on Hover
SettingsEditor.HoverSlotPlayCry=Play PKM Slot Cry on Hover
SettingsEditor.HoverSlotShowText=Show PKM Slot ToolTip on Hover
SettingsEditor.IgnoreLegalPopup=Don't show popup if Legal!
SettingsEditor.L_Blank=Blank Save Version:
SettingsEditor.ModifyUnset=Notify Unset Changes
SettingsEditor.PlaySoundLegalityCheck=PlaySoundLegalityCheck
SettingsEditor.PlaySoundSAVLoad=PlaySoundSAVLoad
SettingsEditor.SetUpdateDex=Ändern Pokédex
SettingsEditor.SetUpdatePKM=Ändern PKM Info
SettingsEditor.ShinySprites=Shiny Sprites
SettingsEditor.ShowEggSpriteAsHeldItem=Show Egg Sprite As Held Item
SettingsEditor.Tab_Bool=Toggles
SettingsEditor.Tab_Color=Colors
SettingsEditor.Unicode=Unicode
SettingsEditor.UseLargeSprites=Always Use Large Sprites (Past Games)
SuperTrainingEditor.B_All=Alle
SuperTrainingEditor.B_Cancel=Abbrechen
SuperTrainingEditor.B_None=Nichts

View File

@ -72,6 +72,38 @@ ErrorWindow.B_Abort=Abort
ErrorWindow.B_Continue=Continue
ErrorWindow.B_CopyToClipboard=Copy to Clipboard
ErrorWindow.L_ProvideInfo=Please provide this information when reporting this error:
LocalizedDescription.AllowGen1Tradeback=GB: Allow Generation 2 tradeback learnsets
LocalizedDescription.ApplyMarkings=Apply Markings on Import
LocalizedDescription.ApplyNature=Apply StatNature to Nature on Import
LocalizedDescription.AutoLoadSaveOnStartup=Automatically Detect Save File on Program Startup
LocalizedDescription.BAKEnabled=Automatic Save File Backups Enabled
LocalizedDescription.BAKPrompt=Tracks if the "Create Backup" prompt has been issued to the user.
LocalizedDescription.FlagIllegal=Flag Illegal Slots in Save File
LocalizedDescription.ForceHaXOnLaunch=Force HaX mode on Program Launch
LocalizedDescription.Gen7TransferStarPID=Severity to flag a Legality Check if Pokémon from Gen1/2 has a Star Shiny PID.
LocalizedDescription.Gen8MemoryLocationTextVariable=Severity to flag a Legality Check if a Gen8 Location Memory text variable is present.
LocalizedDescription.Gen8TransferTrackerNotPresent=Severity to flag a Legality Check if the HOME Tracker is Missing
LocalizedDescription.HideSAVDetails=Hide Save File Details in Program Title
LocalizedDescription.HideSecretDetails=Hide Secret Details in Editors
LocalizedDescription.HoverSlotGlowEdges=Show PKM Glow on Hover
LocalizedDescription.HoverSlotPlayCry=Play PKM Slot Cry on Hover
LocalizedDescription.HoverSlotShowText=Show PKM Slot ToolTip on Hover
LocalizedDescription.IgnoreLegalPopup=Don't show popup if Legal!
LocalizedDescription.ModifyUnset=Notify Unset Changes
LocalizedDescription.NicknamedAnotherSpecies=Severity to flag a Legality Check if Pokémon has a Nickname matching another Species.
LocalizedDescription.NicknamedMysteryGift=Severity to flag a Legality Check if it is a nicknamed Mystery Gift the player cannot normally nickname.
LocalizedDescription.NicknamedTrade=Severity to flag a Legality Check if it is a nicknamed In-Game Trade the player cannot normally nickname.
LocalizedDescription.OtherBackupPaths=List of extra locations to look for Save Files.
LocalizedDescription.PlaySoundLegalityCheck=Play Sound when popping up Legality Report
LocalizedDescription.PlaySoundSAVLoad=Play Sound when loading a new Save File
LocalizedDescription.RNGFrameNotFound=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match.
LocalizedDescription.SetUpdateDex=Modify Pokédex
LocalizedDescription.SetUpdatePKM=Modify PKM Info
LocalizedDescription.ShinySprites=Shiny Sprites
LocalizedDescription.ShowEggSpriteAsHeldItem=Show Egg Sprite As Held Item
LocalizedDescription.TryDetectRecentSave=Automatically locates the most recently saved Save File when opening a new file.
LocalizedDescription.Unicode=Unicode
LocalizedDescription.Version=Last version that the program was run with.
Main.B_Blocks=Block Data
Main.B_CellsStickers=Cells/Stickers
Main.B_CGearSkin=C-Gear Skin
@ -523,14 +555,12 @@ SAV_HallOfFame.Label_Species=Species:
SAV_HallOfFame.Label_TID=TID:
SAV_HallOfFame7.B_Cancel=Cancel
SAV_HallOfFame7.B_Close=Save
SAV_HallOfFame7.CHK_Flag=Flag
SAV_HallOfFame7.L_C1=PKM 1:
SAV_HallOfFame7.L_C2=PKM 2:
SAV_HallOfFame7.L_C3=PKM 3:
SAV_HallOfFame7.L_C4=PKM 4:
SAV_HallOfFame7.L_C5=PKM 5:
SAV_HallOfFame7.L_C6=PKM 6:
SAV_HallOfFame7.L_Count=Count:
SAV_HallOfFame7.L_EC=Starter EC:
SAV_HallOfFame7.L_F1=PKM 1:
SAV_HallOfFame7.L_F2=PKM 2:
@ -1387,33 +1417,6 @@ SAV_ZygardeCell.B_GiveAll=Collect All
SAV_ZygardeCell.B_Save=Save
SAV_ZygardeCell.L_Cells=Stored:
SAV_ZygardeCell.L_Collected=Collected:
SettingsEditor.AllowGen1Tradeback=GB: Allow Generation 2 tradeback learnsets
SettingsEditor.ApplyMarkings=Apply Markings on Import
SettingsEditor.ApplyNature=Apply StatNature to Nature on Import
SettingsEditor.B_Reset=Reset All
SettingsEditor.BAKEnabled=Automatic Save File Backups Enabled
SettingsEditor.DetectSaveOnStartup=Automatically Detect Save File on Program Startup
SettingsEditor.FlagIllegal=Flag Illegal Slots in Save File
SettingsEditor.FlagMissingTracker=Flag as Illegal if HOME Tracker is Missing
SettingsEditor.ForceHaXOnLaunch=Force HaX mode on Program Launch
SettingsEditor.HideSAVDetails=Hide Save File Details in Program Title
SettingsEditor.HideSecretDetails=Hide Secret Details in Editors
SettingsEditor.HoverSlotGlowEdges=Show PKM Glow on Hover
SettingsEditor.HoverSlotPlayCry=Play PKM Slot Cry on Hover
SettingsEditor.HoverSlotShowText=Show PKM Slot ToolTip on Hover
SettingsEditor.IgnoreLegalPopup=Don't show popup if Legal!
SettingsEditor.L_Blank=Blank Save Version:
SettingsEditor.ModifyUnset=Notify Unset Changes
SettingsEditor.PlaySoundLegalityCheck=Play Sound when popping up Legality Report
SettingsEditor.PlaySoundSAVLoad=Play Sound when loading a new Save File
SettingsEditor.SetUpdateDex=Modify Pokédex
SettingsEditor.SetUpdatePKM=Modify PKM Info
SettingsEditor.ShinySprites=Shiny Sprites
SettingsEditor.ShowEggSpriteAsHeldItem=Show Egg Sprite As Held Item
SettingsEditor.Tab_Bool=Toggles
SettingsEditor.Tab_Color=Colors
SettingsEditor.Unicode=Unicode
SettingsEditor.UseLargeSprites=Always Use Large Sprites (Past Games)
SuperTrainingEditor.B_All=Give All
SuperTrainingEditor.B_Cancel=Cancel
SuperTrainingEditor.B_None=Remove All

View File

@ -72,6 +72,38 @@ ErrorWindow.B_Abort=Abortar
ErrorWindow.B_Continue=Continuar
ErrorWindow.B_CopyToClipboard=Copiar al portapapeles
ErrorWindow.L_ProvideInfo=Por favor, proporcione esta información cuando reporte el fallo:
LocalizedDescription.AllowGen1Tradeback=GB: Permitir intercambio de movimientos desde la Generación 2.
LocalizedDescription.ApplyMarkings=Aplicar marcadores al importar
LocalizedDescription.ApplyNature=Aplicar StatNature a la naturaleza al importar
LocalizedDescription.AutoLoadSaveOnStartup=Automatically Detect Save File on Program Startup
LocalizedDescription.BAKEnabled=Respaldo Automático de archivos de guardado habilitado
LocalizedDescription.BAKPrompt=Tracks if the "Create Backup" prompt has been issued to the user.
LocalizedDescription.FlagIllegal=Marca ilegal
LocalizedDescription.ForceHaXOnLaunch=Forzar el modo HaX al Inicio de Programa
LocalizedDescription.Gen7TransferStarPID=Severity to flag a Legality Check if Pokémon from Gen1/2 has a Star Shiny PID.
LocalizedDescription.Gen8MemoryLocationTextVariable=Severity to flag a Legality Check if a Gen8 Location Memory text variable is present.
LocalizedDescription.Gen8TransferTrackerNotPresent=Severity to flag a Legality Check if the HOME Tracker is Missing
LocalizedDescription.HideSAVDetails=Ocultar detalles de partidas guardadas en el título del programa
LocalizedDescription.HideSecretDetails=Ocultar detalles secretos en los editores
LocalizedDescription.HoverSlotGlowEdges=Mostrar brillo PKM al pasar el ratón
LocalizedDescription.HoverSlotPlayCry=Reproducir grito PKM al pasar el ratón
LocalizedDescription.HoverSlotShowText=Mostrar info. PKM al pasar el ratón
LocalizedDescription.IgnoreLegalPopup=¡No mostrar ventana si es Legal!
LocalizedDescription.ModifyUnset=Notificar cambios no hechos
LocalizedDescription.NicknamedAnotherSpecies=Severity to flag a Legality Check if Pokémon has a Nickname matching another Species.
LocalizedDescription.NicknamedMysteryGift=Severity to flag a Legality Check if it is a nicknamed Mystery Gift the player cannot normally nickname.
LocalizedDescription.NicknamedTrade=Severity to flag a Legality Check if it is a nicknamed In-Game Trade the player cannot normally nickname.
LocalizedDescription.OtherBackupPaths=List of extra locations to look for Save Files.
LocalizedDescription.PlaySoundLegalityCheck=Reproducir sonido en la validación de Legalidad
LocalizedDescription.PlaySoundSAVLoad=Reproducir sonido al cargar archivo de guardado
LocalizedDescription.RNGFrameNotFound=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match.
LocalizedDescription.SetUpdateDex=Modificar Pokédex
LocalizedDescription.SetUpdatePKM=Modificar info PKM
LocalizedDescription.ShinySprites=Sprites variocolor
LocalizedDescription.ShowEggSpriteAsHeldItem=Mostrar sprite de huevo como objeto equipado
LocalizedDescription.TryDetectRecentSave=Automatically locates the most recently saved Save File when opening a new file.
LocalizedDescription.Unicode=Unicode
LocalizedDescription.Version=Last version that the program was run with.
Main.B_Blocks=Datos Bloque
Main.B_CellsStickers=Células/Stickers
Main.B_CGearSkin=C-Gear
@ -523,14 +555,12 @@ SAV_HallOfFame.Label_Species=Especie:
SAV_HallOfFame.Label_TID=ID:
SAV_HallOfFame7.B_Cancel=Cancelar
SAV_HallOfFame7.B_Close=Guardar
SAV_HallOfFame7.CHK_Flag=Marca
SAV_HallOfFame7.L_C1=PKM 1:
SAV_HallOfFame7.L_C2=PKM 2:
SAV_HallOfFame7.L_C3=PKM 3:
SAV_HallOfFame7.L_C4=PKM 4:
SAV_HallOfFame7.L_C5=PKM 5:
SAV_HallOfFame7.L_C6=PKM 6:
SAV_HallOfFame7.L_Count=Cuenta:
SAV_HallOfFame7.L_EC=CE Inicial:
SAV_HallOfFame7.L_F1=PKM 1:
SAV_HallOfFame7.L_F2=PKM 2:
@ -1387,33 +1417,6 @@ SAV_ZygardeCell.B_GiveAll=Dar Todo
SAV_ZygardeCell.B_Save=Guardar
SAV_ZygardeCell.L_Cells=Almacenado:
SAV_ZygardeCell.L_Collected=Coleccionado:
SettingsEditor.AllowGen1Tradeback=GB: Permitir intercambio de movimientos desde la Generación 2.
SettingsEditor.ApplyMarkings=Aplicar marcadores al importar
SettingsEditor.ApplyNature=Aplicar StatNature a la naturaleza al importar
SettingsEditor.B_Reset=Reiniciar Todo
SettingsEditor.BAKEnabled=Respaldo Automático de archivos de guardado habilitado
SettingsEditor.DetectSaveOnStartup=Detectar automáticamente el archivo de guardado al inicio del programa
SettingsEditor.FlagIllegal=Marca ilegal
SettingsEditor.FlagMissingTracker=Marcar ilegal si el rastreador HOME falta
SettingsEditor.ForceHaXOnLaunch=Forzar el modo HaX al Inicio de Programa
SettingsEditor.HideSAVDetails=Ocultar detalles de partidas guardadas en el título del programa
SettingsEditor.HideSecretDetails=Ocultar detalles secretos en los editores
SettingsEditor.HoverSlotGlowEdges=Mostrar brillo PKM al pasar el ratón
SettingsEditor.HoverSlotPlayCry=Reproducir grito PKM al pasar el ratón
SettingsEditor.HoverSlotShowText=Mostrar info. PKM al pasar el ratón
SettingsEditor.IgnoreLegalPopup=¡No mostrar ventana si es Legal!
SettingsEditor.L_Blank=Versión por defecto:
SettingsEditor.ModifyUnset=Notificar cambios no hechos
SettingsEditor.PlaySoundLegalityCheck=Reproducir sonido en la validación de Legalidad
SettingsEditor.PlaySoundSAVLoad=Reproducir sonido al cargar archivo de guardado
SettingsEditor.SetUpdateDex=Modificar Pokédex
SettingsEditor.SetUpdatePKM=Modificar info PKM
SettingsEditor.ShinySprites=Sprites variocolor
SettingsEditor.ShowEggSpriteAsHeldItem=Mostrar sprite de huevo como objeto equipado
SettingsEditor.Tab_Bool=Opciones
SettingsEditor.Tab_Color=Colores
SettingsEditor.Unicode=Unicode
SettingsEditor.UseLargeSprites=Usar siempre Sprites Grandes (Juegos Pasados)
SuperTrainingEditor.B_All=Dar todos
SuperTrainingEditor.B_Cancel=Cancelar
SuperTrainingEditor.B_None=Quitar todos

View File

@ -72,6 +72,38 @@ ErrorWindow.B_Abort=Abandonner
ErrorWindow.B_Continue=Continuer
ErrorWindow.B_CopyToClipboard=Copier dans le presse-papier
ErrorWindow.L_ProvideInfo=Veuillez fournir les informations suivantes dans votre rapport d'erreur :
LocalizedDescription.AllowGen1Tradeback=GB: Permettre les movepools de revenants de la Gén. 2
LocalizedDescription.ApplyMarkings=Appliquer des marques de l'import
LocalizedDescription.ApplyNature=Appliquer StatNature à la nature lors de l'import
LocalizedDescription.AutoLoadSaveOnStartup=Automatically Detect Save File on Program Startup
LocalizedDescription.BAKEnabled=Automatic Save File Backups Enabled
LocalizedDescription.BAKPrompt=Tracks if the "Create Backup" prompt has been issued to the user.
LocalizedDescription.FlagIllegal=Marquer les Pokémon illégaux dans la sauvegarde
LocalizedDescription.ForceHaXOnLaunch=Force HaX mode on Program Launch
LocalizedDescription.Gen7TransferStarPID=Severity to flag a Legality Check if Pokémon from Gen1/2 has a Star Shiny PID.
LocalizedDescription.Gen8MemoryLocationTextVariable=Severity to flag a Legality Check if a Gen8 Location Memory text variable is present.
LocalizedDescription.Gen8TransferTrackerNotPresent=Severity to flag a Legality Check if the HOME Tracker is Missing
LocalizedDescription.HideSAVDetails=Cacher les détails de la sauvegarde
LocalizedDescription.HideSecretDetails=Hide Secret Details in Editors
LocalizedDescription.HoverSlotGlowEdges=Faire briller le Pokémon au survol
LocalizedDescription.HoverSlotPlayCry=Jouer le cri du Pokémon au survol
LocalizedDescription.HoverSlotShowText=Montrer le résumé du Pokémon au survol
LocalizedDescription.IgnoreLegalPopup=Don't show popup if Legal!
LocalizedDescription.ModifyUnset=Notifier en cas de changements non sauvegardés
LocalizedDescription.NicknamedAnotherSpecies=Severity to flag a Legality Check if Pokémon has a Nickname matching another Species.
LocalizedDescription.NicknamedMysteryGift=Severity to flag a Legality Check if it is a nicknamed Mystery Gift the player cannot normally nickname.
LocalizedDescription.NicknamedTrade=Severity to flag a Legality Check if it is a nicknamed In-Game Trade the player cannot normally nickname.
LocalizedDescription.OtherBackupPaths=List of extra locations to look for Save Files.
LocalizedDescription.PlaySoundLegalityCheck=PlaySoundLegalityCheck
LocalizedDescription.PlaySoundSAVLoad=PlaySoundSAVLoad
LocalizedDescription.RNGFrameNotFound=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match.
LocalizedDescription.SetUpdateDex=Modifier Infos Pokédex
LocalizedDescription.SetUpdatePKM=Modifier Infos Pokémon
LocalizedDescription.ShinySprites=Sprites Chromatiques
LocalizedDescription.ShowEggSpriteAsHeldItem=Montrer le sprite de l'Œuf en tant qu'objet tenu
LocalizedDescription.TryDetectRecentSave=Automatically locates the most recently saved Save File when opening a new file.
LocalizedDescription.Unicode=Unicode
LocalizedDescription.Version=Last version that the program was run with.
Main.B_Blocks=Block Data
Main.B_CellsStickers=Cells/Stickers
Main.B_CGearSkin=Fonds C-Gear
@ -527,14 +559,12 @@ SAV_HallOfFame.Label_Species=Species:
SAV_HallOfFame.Label_TID=TID:
SAV_HallOfFame7.B_Cancel=Cancel
SAV_HallOfFame7.B_Close=Save
SAV_HallOfFame7.CHK_Flag=Flag
SAV_HallOfFame7.L_C1=PKM 1:
SAV_HallOfFame7.L_C2=PKM 2:
SAV_HallOfFame7.L_C3=PKM 3:
SAV_HallOfFame7.L_C4=PKM 4:
SAV_HallOfFame7.L_C5=PKM 5:
SAV_HallOfFame7.L_C6=PKM 6:
SAV_HallOfFame7.L_Count=Count:
SAV_HallOfFame7.L_EC=Starter EC:
SAV_HallOfFame7.L_F1=PKM 1:
SAV_HallOfFame7.L_F2=PKM 2:
@ -1391,33 +1421,6 @@ SAV_ZygardeCell.B_GiveAll=Tout obtenir
SAV_ZygardeCell.B_Save=Sauvegarder
SAV_ZygardeCell.L_Cells=Conservé :
SAV_ZygardeCell.L_Collected=Obtenu :
SettingsEditor.AllowGen1Tradeback=GB: Permettre les movepools de revenants de la Gén. 2
SettingsEditor.ApplyMarkings=Appliquer des marques de l'import
SettingsEditor.ApplyNature=Appliquer StatNature à la nature lors de l'import
SettingsEditor.B_Reset=Reset All
SettingsEditor.BAKEnabled=Automatic Save File Backups Enabled
SettingsEditor.DetectSaveOnStartup=Automatically Detect Save File on Program Startup
SettingsEditor.FlagIllegal=Marquer les Pokémon illégaux dans la sauvegarde
SettingsEditor.FlagMissingTracker=Flag as Illegal if HOME Tracker is Missing
SettingsEditor.ForceHaXOnLaunch=Force HaX mode on Program Launch
SettingsEditor.HideSAVDetails=Cacher les détails de la sauvegarde
SettingsEditor.HideSecretDetails=Hide Secret Details in Editors
SettingsEditor.HoverSlotGlowEdges=Faire briller le Pokémon au survol
SettingsEditor.HoverSlotPlayCry=Jouer le cri du Pokémon au survol
SettingsEditor.HoverSlotShowText=Montrer le résumé du Pokémon au survol
SettingsEditor.IgnoreLegalPopup=Don't show popup if Legal!
SettingsEditor.L_Blank=Blank Save Version:
SettingsEditor.ModifyUnset=Notifier en cas de changements non sauvegardés
SettingsEditor.PlaySoundLegalityCheck=PlaySoundLegalityCheck
SettingsEditor.PlaySoundSAVLoad=PlaySoundSAVLoad
SettingsEditor.SetUpdateDex=Modifier Infos Pokédex
SettingsEditor.SetUpdatePKM=Modifier Infos Pokémon
SettingsEditor.ShinySprites=Sprites Chromatiques
SettingsEditor.ShowEggSpriteAsHeldItem=Montrer le sprite de l'Œuf en tant qu'objet tenu
SettingsEditor.Tab_Bool=Toggles
SettingsEditor.Tab_Color=Colors
SettingsEditor.Unicode=Unicode
SettingsEditor.UseLargeSprites=Always Use Large Sprites (Past Games)
SuperTrainingEditor.B_All=Tout donner
SuperTrainingEditor.B_Cancel=Annuler
SuperTrainingEditor.B_None=Tout retirer

View File

@ -72,6 +72,38 @@ ErrorWindow.B_Abort=Abort
ErrorWindow.B_Continue=Continue
ErrorWindow.B_CopyToClipboard=Copy to Clipboard
ErrorWindow.L_ProvideInfo=Please provide this information when reporting this error:
LocalizedDescription.AllowGen1Tradeback=GB: Allow Generation 2 tradeback learnsets
LocalizedDescription.ApplyMarkings=Apply Markings on Import
LocalizedDescription.ApplyNature=Apply StatNature to Nature on Import
LocalizedDescription.AutoLoadSaveOnStartup=Automatically Detect Save File on Program Startup
LocalizedDescription.BAKEnabled=Automatic Save File Backups Enabled
LocalizedDescription.BAKPrompt=Tracks if the "Create Backup" prompt has been issued to the user.
LocalizedDescription.FlagIllegal=Flag Illegal Slots in Save File
LocalizedDescription.ForceHaXOnLaunch=Force HaX mode on Program Launch
LocalizedDescription.Gen7TransferStarPID=Severity to flag a Legality Check if Pokémon from Gen1/2 has a Star Shiny PID.
LocalizedDescription.Gen8MemoryLocationTextVariable=Severity to flag a Legality Check if a Gen8 Location Memory text variable is present.
LocalizedDescription.Gen8TransferTrackerNotPresent=Severity to flag a Legality Check if the HOME Tracker is Missing
LocalizedDescription.HideSAVDetails=Hide Save File Details in Program Title
LocalizedDescription.HideSecretDetails=Hide Secret Details in Editors
LocalizedDescription.HoverSlotGlowEdges=Show PKM Glow on Hover
LocalizedDescription.HoverSlotPlayCry=Play PKM Slot Cry on Hover
LocalizedDescription.HoverSlotShowText=Show PKM Slot ToolTip on Hover
LocalizedDescription.IgnoreLegalPopup=Don't show popup if Legal!
LocalizedDescription.ModifyUnset=Notify Unset Changes
LocalizedDescription.NicknamedAnotherSpecies=Severity to flag a Legality Check if Pokémon has a Nickname matching another Species.
LocalizedDescription.NicknamedMysteryGift=Severity to flag a Legality Check if it is a nicknamed Mystery Gift the player cannot normally nickname.
LocalizedDescription.NicknamedTrade=Severity to flag a Legality Check if it is a nicknamed In-Game Trade the player cannot normally nickname.
LocalizedDescription.OtherBackupPaths=List of extra locations to look for Save Files.
LocalizedDescription.PlaySoundLegalityCheck=PlaySoundLegalityCheck
LocalizedDescription.PlaySoundSAVLoad=PlaySoundSAVLoad
LocalizedDescription.RNGFrameNotFound=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match.
LocalizedDescription.SetUpdateDex=Modify Pokédex
LocalizedDescription.SetUpdatePKM=Modify PKM Info
LocalizedDescription.ShinySprites=Shiny Sprites
LocalizedDescription.ShowEggSpriteAsHeldItem=Show Egg Sprite As Held Item
LocalizedDescription.TryDetectRecentSave=Automatically locates the most recently saved Save File when opening a new file.
LocalizedDescription.Unicode=Unicode
LocalizedDescription.Version=Last version that the program was run with.
Main.B_Blocks=Block Data
Main.B_CellsStickers=Cells/Stickers
Main.B_CGearSkin=C-Gear Skin
@ -527,14 +559,12 @@ SAV_HallOfFame.Label_Species=Species:
SAV_HallOfFame.Label_TID=TID:
SAV_HallOfFame7.B_Cancel=Cancel
SAV_HallOfFame7.B_Close=Save
SAV_HallOfFame7.CHK_Flag=Flag
SAV_HallOfFame7.L_C1=PKM 1:
SAV_HallOfFame7.L_C2=PKM 2:
SAV_HallOfFame7.L_C3=PKM 3:
SAV_HallOfFame7.L_C4=PKM 4:
SAV_HallOfFame7.L_C5=PKM 5:
SAV_HallOfFame7.L_C6=PKM 6:
SAV_HallOfFame7.L_Count=Count:
SAV_HallOfFame7.L_EC=Starter EC:
SAV_HallOfFame7.L_F1=PKM 1:
SAV_HallOfFame7.L_F2=PKM 2:
@ -1397,33 +1427,6 @@ SAV_ZygardeCell.B_GiveAll=Collect All
SAV_ZygardeCell.B_Save=Save
SAV_ZygardeCell.L_Cells=Stored:
SAV_ZygardeCell.L_Collected=Collected:
SettingsEditor.AllowGen1Tradeback=GB: Allow Generation 2 tradeback learnsets
SettingsEditor.ApplyMarkings=Apply Markings on Import
SettingsEditor.ApplyNature=Apply StatNature to Nature on Import
SettingsEditor.B_Reset=Reset All
SettingsEditor.BAKEnabled=Automatic Save File Backups Enabled
SettingsEditor.DetectSaveOnStartup=Automatically Detect Save File on Program Startup
SettingsEditor.FlagIllegal=Flag Illegal Slots in Save File
SettingsEditor.FlagMissingTracker=Flag as Illegal if HOME Tracker is Missing
SettingsEditor.ForceHaXOnLaunch=Force HaX mode on Program Launch
SettingsEditor.HideSAVDetails=Hide Save File Details in Program Title
SettingsEditor.HideSecretDetails=Hide Secret Details in Editors
SettingsEditor.HoverSlotGlowEdges=Show PKM Glow on Hover
SettingsEditor.HoverSlotPlayCry=Play PKM Slot Cry on Hover
SettingsEditor.HoverSlotShowText=Show PKM Slot ToolTip on Hover
SettingsEditor.IgnoreLegalPopup=Don't show popup if Legal!
SettingsEditor.L_Blank=Blank Save Version:
SettingsEditor.ModifyUnset=Notify Unset Changes
SettingsEditor.PlaySoundLegalityCheck=PlaySoundLegalityCheck
SettingsEditor.PlaySoundSAVLoad=PlaySoundSAVLoad
SettingsEditor.SetUpdateDex=Modify Pokédex
SettingsEditor.SetUpdatePKM=Modify PKM Info
SettingsEditor.ShinySprites=Shiny Sprites
SettingsEditor.ShowEggSpriteAsHeldItem=Show Egg Sprite As Held Item
SettingsEditor.Tab_Bool=Toggles
SettingsEditor.Tab_Color=Colors
SettingsEditor.Unicode=Unicode
SettingsEditor.UseLargeSprites=Always Use Large Sprites (Past Games)
SuperTrainingEditor.B_All=Give All
SuperTrainingEditor.B_Cancel=Cancel
SuperTrainingEditor.B_None=Remove All

View File

@ -72,6 +72,38 @@ ErrorWindow.B_Abort=キャンセル
ErrorWindow.B_Continue=続ける
ErrorWindow.B_CopyToClipboard=クリップボードにコピー
ErrorWindow.L_ProvideInfo=Please provide this information when reporting this error:
LocalizedDescription.AllowGen1Tradeback=GB: Allow Generation 2 tradeback learnsets
LocalizedDescription.ApplyMarkings=Apply Markings on Import
LocalizedDescription.ApplyNature=Apply StatNature to Nature on Import
LocalizedDescription.AutoLoadSaveOnStartup=Automatically Detect Save File on Program Startup
LocalizedDescription.BAKEnabled=Automatic Save File Backups Enabled
LocalizedDescription.BAKPrompt=Tracks if the "Create Backup" prompt has been issued to the user.
LocalizedDescription.FlagIllegal=不整合を表示
LocalizedDescription.ForceHaXOnLaunch=Force HaX mode on Program Launch
LocalizedDescription.Gen7TransferStarPID=Severity to flag a Legality Check if Pokémon from Gen1/2 has a Star Shiny PID.
LocalizedDescription.Gen8MemoryLocationTextVariable=Severity to flag a Legality Check if a Gen8 Location Memory text variable is present.
LocalizedDescription.Gen8TransferTrackerNotPresent=Severity to flag a Legality Check if the HOME Tracker is Missing
LocalizedDescription.HideSAVDetails=Hide Save File Details in Program Title
LocalizedDescription.HideSecretDetails=Hide Secret Details in Editors
LocalizedDescription.HoverSlotGlowEdges=Show PKM Glow on Hover
LocalizedDescription.HoverSlotPlayCry=Play PKM Slot Cry on Hover
LocalizedDescription.HoverSlotShowText=Show PKM Slot ToolTip on Hover
LocalizedDescription.IgnoreLegalPopup=Don't show popup if Legal!
LocalizedDescription.ModifyUnset=Notify Unset Changes
LocalizedDescription.NicknamedAnotherSpecies=Severity to flag a Legality Check if Pokémon has a Nickname matching another Species.
LocalizedDescription.NicknamedMysteryGift=Severity to flag a Legality Check if it is a nicknamed Mystery Gift the player cannot normally nickname.
LocalizedDescription.NicknamedTrade=Severity to flag a Legality Check if it is a nicknamed In-Game Trade the player cannot normally nickname.
LocalizedDescription.OtherBackupPaths=List of extra locations to look for Save Files.
LocalizedDescription.PlaySoundLegalityCheck=PlaySoundLegalityCheck
LocalizedDescription.PlaySoundSAVLoad=PlaySoundSAVLoad
LocalizedDescription.RNGFrameNotFound=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match.
LocalizedDescription.SetUpdateDex=ポケモン図鑑に反映
LocalizedDescription.SetUpdatePKM=PKM情報の変更
LocalizedDescription.ShinySprites=色違いアイコン
LocalizedDescription.ShowEggSpriteAsHeldItem=Show Egg Sprite As Held Item
LocalizedDescription.TryDetectRecentSave=Automatically locates the most recently saved Save File when opening a new file.
LocalizedDescription.Unicode=Unicode
LocalizedDescription.Version=Last version that the program was run with.
Main.B_Blocks=Block Data
Main.B_CellsStickers=ヌシール/セル
Main.B_CGearSkin=Cギア スキン
@ -527,14 +559,12 @@ SAV_HallOfFame.Label_Species=ポケモン
SAV_HallOfFame.Label_TID=ID:
SAV_HallOfFame7.B_Cancel=キャンセルl
SAV_HallOfFame7.B_Close=保存
SAV_HallOfFame7.CHK_Flag=フラグ
SAV_HallOfFame7.L_C1=1:
SAV_HallOfFame7.L_C2=2:
SAV_HallOfFame7.L_C3=3:
SAV_HallOfFame7.L_C4=4:
SAV_HallOfFame7.L_C5=5:
SAV_HallOfFame7.L_C6=6:
SAV_HallOfFame7.L_Count=回数:
SAV_HallOfFame7.L_EC=暗号化定数:
SAV_HallOfFame7.L_F1=1:
SAV_HallOfFame7.L_F2=2:
@ -1391,33 +1421,6 @@ SAV_ZygardeCell.B_GiveAll=全て取得
SAV_ZygardeCell.B_Save=保存
SAV_ZygardeCell.L_Cells=キューブ内
SAV_ZygardeCell.L_Collected=回収
SettingsEditor.AllowGen1Tradeback=GB: Allow Generation 2 tradeback learnsets
SettingsEditor.ApplyMarkings=Apply Markings on Import
SettingsEditor.ApplyNature=Apply StatNature to Nature on Import
SettingsEditor.B_Reset=Reset All
SettingsEditor.BAKEnabled=Automatic Save File Backups Enabled
SettingsEditor.DetectSaveOnStartup=Automatically Detect Save File on Program Startup
SettingsEditor.FlagIllegal=不整合を表示
SettingsEditor.FlagMissingTracker=Flag as Illegal if HOME Tracker is Missing
SettingsEditor.ForceHaXOnLaunch=Force HaX mode on Program Launch
SettingsEditor.HideSAVDetails=Hide Save File Details in Program Title
SettingsEditor.HideSecretDetails=Hide Secret Details in Editors
SettingsEditor.HoverSlotGlowEdges=Show PKM Glow on Hover
SettingsEditor.HoverSlotPlayCry=Play PKM Slot Cry on Hover
SettingsEditor.HoverSlotShowText=Show PKM Slot ToolTip on Hover
SettingsEditor.IgnoreLegalPopup=Don't show popup if Legal!
SettingsEditor.L_Blank=Blank Save Version:
SettingsEditor.ModifyUnset=Notify Unset Changes
SettingsEditor.PlaySoundLegalityCheck=PlaySoundLegalityCheck
SettingsEditor.PlaySoundSAVLoad=PlaySoundSAVLoad
SettingsEditor.SetUpdateDex=ポケモン図鑑に反映
SettingsEditor.SetUpdatePKM=PKM情報の変更
SettingsEditor.ShinySprites=色違いアイコン
SettingsEditor.ShowEggSpriteAsHeldItem=Show Egg Sprite As Held Item
SettingsEditor.Tab_Bool=Toggles
SettingsEditor.Tab_Color=Colors
SettingsEditor.Unicode=Unicode
SettingsEditor.UseLargeSprites=Always Use Large Sprites (Past Games)
SuperTrainingEditor.B_All=全て取得
SuperTrainingEditor.B_Cancel=キャンセル
SuperTrainingEditor.B_None=全て消去

View File

@ -72,6 +72,38 @@ ErrorWindow.B_Abort=중단
ErrorWindow.B_Continue=계속
ErrorWindow.B_CopyToClipboard=클립보드에 복사
ErrorWindow.L_ProvideInfo=오류를 보고할 때 이 정보를 제공해 주세요:
LocalizedDescription.AllowGen1Tradeback=GB: 2세대에서 옮겨온 1세대 기술 허용
LocalizedDescription.ApplyMarkings=가져오기 시 마킹하기
LocalizedDescription.ApplyNature=임포트시 자연에 StatNature 적용
LocalizedDescription.AutoLoadSaveOnStartup=Automatically Detect Save File on Program Startup
LocalizedDescription.BAKEnabled=세이브 파일 자동 백업 사용
LocalizedDescription.BAKPrompt=Tracks if the "Create Backup" prompt has been issued to the user.
LocalizedDescription.FlagIllegal=세이브 파일에서 적법하지 않은 포켓몬 표시
LocalizedDescription.ForceHaXOnLaunch=프로그램 시작 시 HaX 모드 강제 사용
LocalizedDescription.Gen7TransferStarPID=Severity to flag a Legality Check if Pokémon from Gen1/2 has a Star Shiny PID.
LocalizedDescription.Gen8MemoryLocationTextVariable=Severity to flag a Legality Check if a Gen8 Location Memory text variable is present.
LocalizedDescription.Gen8TransferTrackerNotPresent=Severity to flag a Legality Check if the HOME Tracker is Missing
LocalizedDescription.HideSAVDetails=프로그램 제목에서 세이브 파일 상세 정보 숨기기
LocalizedDescription.HideSecretDetails=편집 시 비밀 정보 숨기기
LocalizedDescription.HoverSlotGlowEdges=마우스 오버 시 포켓몬 빛내기
LocalizedDescription.HoverSlotPlayCry=마우스 오버 시 포켓몬 울음소리 재생
LocalizedDescription.HoverSlotShowText=마우스 오버 시 포켓몬 툴팁 표시
LocalizedDescription.IgnoreLegalPopup=적법한 포켓몬일 경우 팝업 표시 안 함
LocalizedDescription.ModifyUnset=적용하지 않은 변경 사항 알림
LocalizedDescription.NicknamedAnotherSpecies=Severity to flag a Legality Check if Pokémon has a Nickname matching another Species.
LocalizedDescription.NicknamedMysteryGift=Severity to flag a Legality Check if it is a nicknamed Mystery Gift the player cannot normally nickname.
LocalizedDescription.NicknamedTrade=Severity to flag a Legality Check if it is a nicknamed In-Game Trade the player cannot normally nickname.
LocalizedDescription.OtherBackupPaths=List of extra locations to look for Save Files.
LocalizedDescription.PlaySoundLegalityCheck=적법성 검사 창을 띄울 때 소리로 알림
LocalizedDescription.PlaySoundSAVLoad=새 세이브 파일을 불러올 때 소리로 알림
LocalizedDescription.RNGFrameNotFound=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match.
LocalizedDescription.SetUpdateDex=포켓몬 도감 자동 수정
LocalizedDescription.SetUpdatePKM=포켓몬 정보 자동 수정
LocalizedDescription.ShinySprites=이로치 스프라이트 사용
LocalizedDescription.ShowEggSpriteAsHeldItem=알 스프라이트를 지닌 물건에 표시
LocalizedDescription.TryDetectRecentSave=Automatically locates the most recently saved Save File when opening a new file.
LocalizedDescription.Unicode=유니코드 사용
LocalizedDescription.Version=Last version that the program was run with.
Main.B_Blocks=블록 데이터
Main.B_CellsStickers=셀/스티커
Main.B_CGearSkin=C기어 스킨
@ -523,14 +555,12 @@ SAV_HallOfFame.Label_Species=종류:
SAV_HallOfFame.Label_TID=TID:
SAV_HallOfFame7.B_Cancel=취소
SAV_HallOfFame7.B_Close=저장
SAV_HallOfFame7.CHK_Flag=플래그
SAV_HallOfFame7.L_C1=포켓몬 1:
SAV_HallOfFame7.L_C2=포켓몬 2:
SAV_HallOfFame7.L_C3=포켓몬 3:
SAV_HallOfFame7.L_C4=포켓몬 4:
SAV_HallOfFame7.L_C5=포켓몬 5:
SAV_HallOfFame7.L_C6=포켓몬 6:
SAV_HallOfFame7.L_Count=Count:
SAV_HallOfFame7.L_EC=스타팅 EC:
SAV_HallOfFame7.L_F1=포켓몬 1:
SAV_HallOfFame7.L_F2=포켓몬 2:
@ -1387,33 +1417,6 @@ SAV_ZygardeCell.B_GiveAll=모두 모으기
SAV_ZygardeCell.B_Save=저장
SAV_ZygardeCell.L_Cells=보관됨:
SAV_ZygardeCell.L_Collected=회수함:
SettingsEditor.AllowGen1Tradeback=GB: 2세대에서 옮겨온 1세대 기술 허용
SettingsEditor.ApplyMarkings=가져오기 시 마킹하기
SettingsEditor.ApplyNature=임포트시 자연에 StatNature 적용
SettingsEditor.B_Reset=초기화
SettingsEditor.BAKEnabled=세이브 파일 자동 백업 사용
SettingsEditor.DetectSaveOnStartup=프로그램 시작 시 세이브 파일 자동 감지
SettingsEditor.FlagIllegal=세이브 파일에서 적법하지 않은 포켓몬 표시
SettingsEditor.FlagMissingTracker=Flag as Illegal if HOME Tracker is Missing
SettingsEditor.ForceHaXOnLaunch=프로그램 시작 시 HaX 모드 강제 사용
SettingsEditor.HideSAVDetails=프로그램 제목에서 세이브 파일 상세 정보 숨기기
SettingsEditor.HideSecretDetails=편집 시 비밀 정보 숨기기
SettingsEditor.HoverSlotGlowEdges=마우스 오버 시 포켓몬 빛내기
SettingsEditor.HoverSlotPlayCry=마우스 오버 시 포켓몬 울음소리 재생
SettingsEditor.HoverSlotShowText=마우스 오버 시 포켓몬 툴팁 표시
SettingsEditor.IgnoreLegalPopup=적법한 포켓몬일 경우 팝업 표시 안 함
SettingsEditor.L_Blank=빈 세이브 버전:
SettingsEditor.ModifyUnset=적용하지 않은 변경 사항 알림
SettingsEditor.PlaySoundLegalityCheck=적법성 검사 창을 띄울 때 소리로 알림
SettingsEditor.PlaySoundSAVLoad=새 세이브 파일을 불러올 때 소리로 알림
SettingsEditor.SetUpdateDex=포켓몬 도감 자동 수정
SettingsEditor.SetUpdatePKM=포켓몬 정보 자동 수정
SettingsEditor.ShinySprites=이로치 스프라이트 사용
SettingsEditor.ShowEggSpriteAsHeldItem=알 스프라이트를 지닌 물건에 표시
SettingsEditor.Tab_Bool=토글
SettingsEditor.Tab_Color=색상
SettingsEditor.Unicode=유니코드 사용
SettingsEditor.UseLargeSprites=Always Use Large Sprites (Past Games)
SuperTrainingEditor.B_All=모두 주기
SuperTrainingEditor.B_Cancel=취소
SuperTrainingEditor.B_None=모두 제거

View File

@ -72,6 +72,38 @@ ErrorWindow.B_Abort=终止
ErrorWindow.B_Continue=继续
ErrorWindow.B_CopyToClipboard=复制到剪切板
ErrorWindow.L_ProvideInfo=提交错误报告时请提供以下信息:
LocalizedDescription.AllowGen1Tradeback=GB 允许二代传回的招式组合
LocalizedDescription.ApplyMarkings=导入时标记
LocalizedDescription.ApplyNature=在导入时将StatNature应用于自然
LocalizedDescription.AutoLoadSaveOnStartup=Automatically Detect Save File on Program Startup
LocalizedDescription.BAKEnabled=自动保存文件备份已启用
LocalizedDescription.BAKPrompt=Tracks if the "Create Backup" prompt has been issued to the user.
LocalizedDescription.FlagIllegal=标记不合法
LocalizedDescription.ForceHaXOnLaunch=程序启动时强制HaX模式
LocalizedDescription.Gen7TransferStarPID=Severity to flag a Legality Check if Pokémon from Gen1/2 has a Star Shiny PID.
LocalizedDescription.Gen8MemoryLocationTextVariable=Severity to flag a Legality Check if a Gen8 Location Memory text variable is present.
LocalizedDescription.Gen8TransferTrackerNotPresent=Severity to flag a Legality Check if the HOME Tracker is Missing
LocalizedDescription.HideSAVDetails=隐藏程序标题中的保存文件详细信息
LocalizedDescription.HideSecretDetails=在编辑器中隐藏秘密细节
LocalizedDescription.HoverSlotGlowEdges=在悬停时显示PKM Glow
LocalizedDescription.HoverSlotPlayCry=在悬停时播放PKM Slot Cry
LocalizedDescription.HoverSlotShowText=在悬停上显示PKM Slot ToolTip
LocalizedDescription.IgnoreLegalPopup=如果合法不显示弹窗!
LocalizedDescription.ModifyUnset=未保存修改提醒
LocalizedDescription.NicknamedAnotherSpecies=Severity to flag a Legality Check if Pokémon has a Nickname matching another Species.
LocalizedDescription.NicknamedMysteryGift=Severity to flag a Legality Check if it is a nicknamed Mystery Gift the player cannot normally nickname.
LocalizedDescription.NicknamedTrade=Severity to flag a Legality Check if it is a nicknamed In-Game Trade the player cannot normally nickname.
LocalizedDescription.OtherBackupPaths=List of extra locations to look for Save Files.
LocalizedDescription.PlaySoundLegalityCheck=弹窗合法性报告时播放声音
LocalizedDescription.PlaySoundSAVLoad=读取新档时播放声音
LocalizedDescription.RNGFrameNotFound=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match.
LocalizedDescription.SetUpdateDex=修改图鉴
LocalizedDescription.SetUpdatePKM=修改宝可梦
LocalizedDescription.ShinySprites=异色图标
LocalizedDescription.ShowEggSpriteAsHeldItem=将蛋作为持有物品展示
LocalizedDescription.TryDetectRecentSave=Automatically locates the most recently saved Save File when opening a new file.
LocalizedDescription.Unicode=统一
LocalizedDescription.Version=Last version that the program was run with.
Main.B_Blocks=数据块
Main.B_CellsStickers=细胞/贴纸
Main.B_CGearSkin=C装置皮肤
@ -523,14 +555,12 @@ SAV_HallOfFame.Label_Species=种类:
SAV_HallOfFame.Label_TID=表ID:
SAV_HallOfFame7.B_Cancel=取消
SAV_HallOfFame7.B_Close=保存
SAV_HallOfFame7.CHK_Flag=旗标
SAV_HallOfFame7.L_C1=精灵1:
SAV_HallOfFame7.L_C2=精灵2:
SAV_HallOfFame7.L_C3=精灵3:
SAV_HallOfFame7.L_C4=精灵4:
SAV_HallOfFame7.L_C5=精灵5:
SAV_HallOfFame7.L_C6=精灵6:
SAV_HallOfFame7.L_Count=数量:
SAV_HallOfFame7.L_EC=御三家加密常数:
SAV_HallOfFame7.L_F1=精灵1:
SAV_HallOfFame7.L_F2=精灵2:
@ -1387,33 +1417,6 @@ SAV_ZygardeCell.B_GiveAll=全部收集
SAV_ZygardeCell.B_Save=保存
SAV_ZygardeCell.L_Cells=储存了:
SAV_ZygardeCell.L_Collected=收集了:
SettingsEditor.AllowGen1Tradeback=GB 允许二代传回的招式组合
SettingsEditor.ApplyMarkings=导入时标记
SettingsEditor.ApplyNature=在导入时将StatNature应用于自然
SettingsEditor.B_Reset=重置
SettingsEditor.BAKEnabled=自动保存文件备份已启用
SettingsEditor.DetectSaveOnStartup=在程序启动时自动检测保存文件
SettingsEditor.FlagIllegal=标记不合法
SettingsEditor.FlagMissingTracker=HOME追踪丢失标记为非法
SettingsEditor.ForceHaXOnLaunch=程序启动时强制HaX模式
SettingsEditor.HideSAVDetails=隐藏程序标题中的保存文件详细信息
SettingsEditor.HideSecretDetails=在编辑器中隐藏秘密细节
SettingsEditor.HoverSlotGlowEdges=在悬停时显示PKM Glow
SettingsEditor.HoverSlotPlayCry=在悬停时播放PKM Slot Cry
SettingsEditor.HoverSlotShowText=在悬停上显示PKM Slot ToolTip
SettingsEditor.IgnoreLegalPopup=如果合法不显示弹窗!
SettingsEditor.L_Blank=空白保存版本:
SettingsEditor.ModifyUnset=未保存修改提醒
SettingsEditor.PlaySoundLegalityCheck=弹窗合法性报告时播放声音
SettingsEditor.PlaySoundSAVLoad=读取新档时播放声音
SettingsEditor.SetUpdateDex=修改图鉴
SettingsEditor.SetUpdatePKM=修改宝可梦
SettingsEditor.ShinySprites=异色图标
SettingsEditor.ShowEggSpriteAsHeldItem=将蛋作为持有物品展示
SettingsEditor.Tab_Bool=切换
SettingsEditor.Tab_Color=颜色
SettingsEditor.Unicode=统一
SettingsEditor.UseLargeSprites=Always Use Large Sprites (Past Games)
SuperTrainingEditor.B_All=获得全部
SuperTrainingEditor.B_Cancel=取消
SuperTrainingEditor.B_None=全部清除

View File

@ -1,27 +0,0 @@
using System.Diagnostics;
namespace PKHeX.WinForms.Properties
{
// This class allows you to handle specific events on the settings class:
// The SettingChanging event is raised before a setting's value is changed.
// The PropertyChanged event is raised after a setting's value is changed.
// The SettingsLoaded event is raised after the setting values are loaded.
// The SettingsSaving event is raised before the setting values are saved.
internal sealed partial class Settings
{
private Settings()
{
SettingChanging += SettingChangingEventHandler;
SettingsSaving += SettingsSavingEventHandler;
}
private static void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) {
Debug.WriteLine($"Changed setting: {e.SettingName}");
// Add code to handle the SettingChangingEvent event here.
}
private static void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) {
Debug.WriteLine("Saving settings...");
}
}
}

View File

@ -67,7 +67,7 @@ public SAV_Database(PKMEditor f1, SAVEditor saveditor)
};
slot.ContextMenuStrip = mnu;
if (Settings.Default.HoverSlotShowText)
if (Main.Settings.Hover.HoverSlotShowText)
slot.MouseEnter += (o, args) => ShowHoverTextForSlot(slot, args);
}
@ -319,8 +319,7 @@ private void GenerateDBReport(object sender, EventArgs e)
private void LoadDatabase()
{
var otherPaths = new List<string>{Main.BackupPath};
if (File.Exists(Main.SAVPaths))
otherPaths.AddRange(File.ReadLines(Main.SAVPaths).Where(Directory.Exists));
otherPaths.AddRange(Main.Settings.Backup.OtherBackupPaths.Where(Directory.Exists));
RawDB = LoadPKMSaves(DatabasePath, SAV, otherPaths);
@ -555,10 +554,11 @@ private async void B_Search_Click(object sender, EventArgs e)
var search = SearchDatabase();
bool legalSearch = Menu_SearchLegal.Checked ^ Menu_SearchIllegal.Checked;
if (legalSearch && WinFormsUtil.Prompt(MessageBoxButtons.YesNo, MsgDBSearchLegalityWordfilter) == DialogResult.No)
bool wordFilter = ParseSettings.CheckWordFilter;
if (wordFilter && legalSearch && WinFormsUtil.Prompt(MessageBoxButtons.YesNo, MsgDBSearchLegalityWordfilter) == DialogResult.No)
ParseSettings.CheckWordFilter = false;
var results = await Task.Run(() => search.ToList()).ConfigureAwait(true);
ParseSettings.CheckWordFilter = true;
ParseSettings.CheckWordFilter = wordFilter;
if (results.Count == 0)
{

View File

@ -54,7 +54,7 @@ public SAV_Encounters(PKMEditor f1)
ClickView(sender, e);
};
slot.ContextMenuStrip = mnu;
if (Settings.Default.HoverSlotShowText)
if (Main.Settings.Hover.HoverSlotShowText)
slot.MouseEnter += (o, args) => ShowHoverTextForSlot(slot, args);
}

View File

@ -31,7 +31,12 @@ public SAV_FolderList(Action<SaveFile> openSaveFile)
dgDataRecent.ContextMenuStrip = GetContextMenu(dgDataRecent);
dgDataBackup.ContextMenuStrip = GetContextMenu(dgDataBackup);
var recent = SaveFinder.GetSaveFiles(drives, false, Paths.Select(z => z.Path).Where(z => z != Main.BackupPath));
var extra = Paths.Select(z => z.Path).Where(z => z != Main.BackupPath).Distinct();
var recent = SaveFinder.GetSaveFiles(drives, false, extra).ToList();
var loaded = Main.Settings.Startup.RecentlyLoaded
.Where(z => recent.All(x => x.Metadata.FilePath != z))
.Where(File.Exists).Select(SaveUtil.GetVariantSAV).Where(z => z is not null);
recent.AddRange(loaded!);
Recent = PopulateData(dgDataRecent, recent);
var backup = SaveFinder.GetSaveFiles(drives, false, Main.BackupPath);
Backup = PopulateData(dgDataBackup, backup);
@ -65,7 +70,6 @@ public SAV_FolderList(Action<SaveFile> openSaveFile)
// Preprogrammed folders
foreach (var loc in Paths)
AddButton(loc.DisplayText, loc.Path);
AddCustomizeButton();
dgDataRecent.DoubleBuffered(true);
dgDataBackup.DoubleBuffered(true);
@ -104,27 +108,9 @@ private void AddButton(string name, string path)
Close();
};
FLP_Buttons.Controls.Add(button);
}
private void AddCustomizeButton()
{
const string name = "Customize";
Button button = GetCustomButton(name);
button.Click += (s, e) =>
{
var loc = Main.SAVPaths;
if (!File.Exists(loc))
{
var custom = Paths.Where(z => z.Custom).ToList();
if (custom.Count == 0)
Paths.Add(new CustomFolderPath("DISPLAY_TEXT", "FOLDER_PATH", true));
var lines = custom.Select(z => ((CustomFolderPath)z).ToString());
File.WriteAllLines(loc, lines);
}
Process.Start(loc);
Close();
};
FLP_Buttons.Controls.Add(button);
var hover = new ToolTip {AutoPopDelay = 30_000};
button.MouseHover += (s, e) => hover.Show(path, button);
}
private static Button GetCustomButton(string name)
@ -139,11 +125,7 @@ private static Button GetCustomButton(string name)
private static IEnumerable<CustomFolderPath> GetUserPaths()
{
string loc = Main.SAVPaths;
if (!File.Exists(loc))
return Enumerable.Empty<CustomFolderPath>();
var lines = File.ReadLines(loc);
var lines = Main.Settings.Backup.OtherBackupPaths;
return lines.Select(z => z.Split('\t'))
.Where(a => a.Length == 2)
.Select(x => new CustomFolderPath(x, true));

View File

@ -61,8 +61,7 @@ public SAV_MysteryGiftDB(PKMEditor tabs, SAVEditor sav)
};
slot.ContextMenuStrip = mnu;
if (Settings.Default.HoverSlotShowText)
slot.MouseEnter += (o, args) => ShowHoverTextForSlot(slot, args);
slot.MouseEnter += (o, args) => ShowHoverTextForSlot(slot, args);
}
Counter = L_Count.Text;

View File

@ -24,7 +24,9 @@ public SAV_BlockDump8(SaveFile sav)
PG_BlockView.Size = RTB_Hex.Size;
Metadata = new SCBlockMetadata(SAV.Blocks);
// Get an external source of names if available.
var extra = GetExtraKeyNames();
Metadata = new SCBlockMetadata(SAV.Blocks, extra);
CB_Key.InitializeBinding();
CB_Key.DataSource = Metadata.GetSortedBlockKeyList().ToArray();
@ -43,6 +45,12 @@ public SAV_BlockDump8(SaveFile sav)
CB_Key.SelectedIndex = 0;
}
private static IEnumerable<string> GetExtraKeyNames()
{
var extra = Main.Settings.Advanced.PathBlockKeyListSWSH;
return File.Exists(extra) ? File.ReadLines(extra) : Array.Empty<string>();
}
private void CB_Key_SelectedIndexChanged(object sender, EventArgs e)
{
var key = (uint)WinFormsUtil.GetIndex(CB_Key);
@ -206,7 +214,9 @@ private void CompareSaves()
if (s2 is not SAV8SWSH w2)
return;
var compare = new SCBlockCompare(w1.Blocks, w2.Blocks);
// Get an external source of names if available.
var extra = GetExtraKeyNames();
var compare = new SCBlockCompare(w1.Blocks, w2.Blocks, extra);
richTextBox1.Lines = compare.Summary().ToArray();
}

View File

@ -32,15 +32,8 @@ private void InitializeComponent()
this.L_Blank = new System.Windows.Forms.Label();
this.CB_Blank = new System.Windows.Forms.ComboBox();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.Tab_Bool = new System.Windows.Forms.TabPage();
this.FLP_Settings = new System.Windows.Forms.FlowLayoutPanel();
this.Tab_Color = new System.Windows.Forms.TabPage();
this.PG_Color = new System.Windows.Forms.PropertyGrid();
this.B_Reset = new System.Windows.Forms.Button();
this.FLP_Blank.SuspendLayout();
this.tabControl1.SuspendLayout();
this.Tab_Bool.SuspendLayout();
this.Tab_Color.SuspendLayout();
this.SuspendLayout();
//
// FLP_Blank
@ -74,54 +67,14 @@ private void InitializeComponent()
//
// tabControl1
//
this.tabControl1.Controls.Add(this.Tab_Bool);
this.tabControl1.Controls.Add(this.Tab_Color);
this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabControl1.Location = new System.Drawing.Point(0, 27);
this.tabControl1.Multiline = true;
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(334, 284);
this.tabControl1.TabIndex = 3;
//
// Tab_Bool
//
this.Tab_Bool.Controls.Add(this.FLP_Settings);
this.Tab_Bool.Location = new System.Drawing.Point(4, 22);
this.Tab_Bool.Name = "Tab_Bool";
this.Tab_Bool.Padding = new System.Windows.Forms.Padding(3);
this.Tab_Bool.Size = new System.Drawing.Size(326, 258);
this.Tab_Bool.TabIndex = 0;
this.Tab_Bool.Text = "Toggles";
this.Tab_Bool.UseVisualStyleBackColor = true;
//
// FLP_Settings
//
this.FLP_Settings.AutoScroll = true;
this.FLP_Settings.Dock = System.Windows.Forms.DockStyle.Fill;
this.FLP_Settings.Location = new System.Drawing.Point(3, 3);
this.FLP_Settings.Name = "FLP_Settings";
this.FLP_Settings.Size = new System.Drawing.Size(320, 252);
this.FLP_Settings.TabIndex = 3;
//
// Tab_Color
//
this.Tab_Color.Controls.Add(this.PG_Color);
this.Tab_Color.Location = new System.Drawing.Point(4, 22);
this.Tab_Color.Name = "Tab_Color";
this.Tab_Color.Padding = new System.Windows.Forms.Padding(3);
this.Tab_Color.Size = new System.Drawing.Size(326, 258);
this.Tab_Color.TabIndex = 1;
this.Tab_Color.Text = "Colors";
this.Tab_Color.UseVisualStyleBackColor = true;
//
// PG_Color
//
this.PG_Color.Dock = System.Windows.Forms.DockStyle.Fill;
this.PG_Color.Location = new System.Drawing.Point(3, 3);
this.PG_Color.Name = "PG_Color";
this.PG_Color.Size = new System.Drawing.Size(320, 252);
this.PG_Color.TabIndex = 0;
//
// B_Reset
//
this.B_Reset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
@ -148,13 +101,9 @@ private void InitializeComponent()
this.Name = "SettingsEditor";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Settings";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SettingsEditor_FormClosing);
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SettingsEditor_KeyDown);
this.FLP_Blank.ResumeLayout(false);
this.FLP_Blank.PerformLayout();
this.tabControl1.ResumeLayout(false);
this.Tab_Bool.ResumeLayout(false);
this.Tab_Color.ResumeLayout(false);
this.ResumeLayout(false);
}
@ -165,10 +114,6 @@ private void InitializeComponent()
private System.Windows.Forms.Label L_Blank;
private System.Windows.Forms.ComboBox CB_Blank;
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage Tab_Bool;
private System.Windows.Forms.FlowLayoutPanel FLP_Settings;
private System.Windows.Forms.TabPage Tab_Color;
private System.Windows.Forms.PropertyGrid PG_Color;
private System.Windows.Forms.Button B_Reset;
}
}

View File

@ -1,38 +1,26 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using PKHeX.Core;
using PKHeX.WinForms.Properties;
namespace PKHeX.WinForms
{
public partial class SettingsEditor : Form
{
public SettingsEditor(object? obj, params string[] blacklist)
public SettingsEditor(object obj)
{
InitializeComponent();
SettingsObject = obj ?? Settings.Default;
LoadSettings(blacklist);
LoadSettings(obj);
WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage);
// reorder checkboxes
var checkboxes = FLP_Settings.Controls.OfType<CheckBox>().OrderBy(z => z.Text).ToList();
var ctr = 0;
foreach (var c in checkboxes)
FLP_Settings.Controls.SetChildIndex(c, ctr++);
if (obj is Settings s)
if (obj is PKHeXSettings s)
{
var noSelectVersions = new[] {GameVersion.GO};
CB_Blank.InitializeBinding();
CB_Blank.DataSource = GameInfo.VersionDataSource.Where(z => !noSelectVersions.Contains((GameVersion)z.Value)).ToList();
CB_Blank.SelectedValue = (int) s.DefaultSaveVersion;
CB_Blank.SelectedValueChanged += (_, __) => s.DefaultSaveVersion = (GameVersion)WinFormsUtil.GetIndex(CB_Blank);
CB_Blank.SelectedValue = (int) s.Startup.DefaultSaveVersion;
CB_Blank.SelectedValueChanged += (_, __) => s.Startup.DefaultSaveVersion = (GameVersion)WinFormsUtil.GetIndex(CB_Blank);
B_Reset.Click += (x, e) => DeleteSettings();
}
else
@ -41,54 +29,26 @@ public SettingsEditor(object? obj, params string[] blacklist)
B_Reset.Visible = false;
}
PG_Color.SelectedObject = Main.Draw;
this.CenterToForm(FindForm());
}
private void SettingsEditor_FormClosing(object sender, FormClosingEventArgs e) => SaveSettings();
private readonly object SettingsObject;
private void LoadSettings(IReadOnlyList<string> blacklist)
private void LoadSettings(object obj)
{
var type = SettingsObject.GetType();
var type = obj.GetType();
var props = ReflectUtil.GetPropertiesCanWritePublicDeclared(type);
if (ModifierKeys != Keys.Control)
props = props.Except(blacklist);
foreach (var p in props)
{
var state = ReflectUtil.GetValue(Settings.Default, p);
switch (state)
{
case bool b:
var chk = GetCheckBox(p, b);
FLP_Settings.Controls.Add(chk);
FLP_Settings.SetFlowBreak(chk, true);
if (blacklist.Contains(p))
chk.ForeColor = Color.Red;
continue;
}
var state = ReflectUtil.GetValue(obj, p);
if (state is null)
continue;
var tab = new TabPage(p);
var pg = new PropertyGrid { SelectedObject = state, Dock = DockStyle.Fill };
tab.Controls.Add(pg);
tabControl1.TabPages.Add(tab);
}
}
private void SaveSettings()
{
foreach (var s in FLP_Settings.Controls.OfType<Control>())
ReflectUtil.SetValue(SettingsObject, s.Name, GetValue(s));
}
private static CheckBox GetCheckBox(string name, bool state) => new()
{
Name = name, Checked = state, Text = name,
AutoSize = true,
};
private static object GetValue(IDisposable control) => control switch
{
CheckBox cb => cb.Checked,
_ => throw new Exception(nameof(control)),
};
private void SettingsEditor_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.W && ModifierKeys == Keys.Control)
@ -102,7 +62,7 @@ private static void DeleteSettings()
var dr = WinFormsUtil.Prompt(MessageBoxButtons.YesNo, "Resetting settings requires the program to exit.", MessageStrings.MsgContinue);
if (dr != DialogResult.Yes)
return;
var path = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath;
var path = Main.ConfigPath;
if (File.Exists(path))
File.Delete(path);
System.Diagnostics.Process.Start(Application.ExecutablePath);

View File

@ -1,24 +0,0 @@
using System.Configuration;
using System.IO;
namespace PKHeX.WinForms
{
public static class ConfigUtil
{
public static bool CheckConfig()
{
try
{
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
return true;
}
catch (ConfigurationErrorsException e)
{
var path = (e.InnerException as ConfigurationErrorsException)?.Filename;
if (path != null && File.Exists(path))
File.Delete(path);
return false;
}
}
}
}

View File

@ -46,12 +46,17 @@ private static ToolStripMenuItem GetTranslationUpdater()
private static void UpdateTranslations()
{
WinFormsTranslator.SetRemovalMode(false); // add mode
// add mode
WinFormsTranslator.SetRemovalMode(false);
WinFormsTranslator.LoadSettings<PKHeXSettings>(DefaultLanguage);
WinFormsTranslator.LoadAllForms(LoadBanlist); // populate with every possible control
WinFormsTranslator.UpdateAll(DefaultLanguage, Languages); // propagate to others
WinFormsTranslator.DumpAll(Banlist); // dump current to file
// de-populate
WinFormsTranslator.SetRemovalMode(); // remove used keys, don't add any
WinFormsTranslator.LoadAllForms(LoadBanlist); // de-populate
WinFormsTranslator.LoadSettings<PKHeXSettings>(DefaultLanguage, false);
WinFormsTranslator.LoadAllForms(LoadBanlist);
WinFormsTranslator.RemoveAll(DefaultLanguage, PurgeBanlist); // remove all lines from above generated files that still remain
// Move translated files from the debug exe loc to their project location
@ -93,7 +98,6 @@ private static void UpdateTranslations()
"Main.L_Potential", // ★☆☆☆ IV judge evaluation
"SAV_HoneyTree.L_Tree0", // dynamic, don't bother
"SAV_Misc3.BTN_Symbol", // symbols should stay as their current character
"SettingsEditor.BAKPrompt", // internal setting
"SAV_GameSelect.L_Prompt", // prompt text (dynamic)
"SAV_BlockDump8.L_BlockName", // Block name (dynamic)
};

View File

@ -16,6 +16,8 @@ public static class WinFormsTranslator
private static string GetTranslationFileNameInternal(string lang) => $"lang_{lang}";
private static string GetTranslationFileNameExternal(string lang) => $"lang_{lang}.txt";
public static IReadOnlyDictionary<string, string> GetDictionary(string lang) => GetContext(lang).Lookup;
private static TranslationContext GetContext(string lang)
{
if (Context.TryGetValue(lang, out var context))
@ -93,7 +95,7 @@ private static IEnumerable<object> GetTranslatableControls(Control f)
yield return obj;
}
if (z is ListControl || z is TextBoxBase || z is LinkLabel || z is NumericUpDown || z is ContainerControl)
if (z is ListControl or TextBoxBase or LinkLabel or NumericUpDown or ContainerControl)
break; // undesirable to modify, ignore
if (!string.IsNullOrWhiteSpace(z.Text))
@ -209,6 +211,34 @@ public static void RemoveAll(string defaultLanguage, params string[] banlist)
File.WriteAllLines(fn, result);
}
}
public static void LoadSettings<T>(string defaultLanguage, bool add = true)
{
var context = (Dictionary<string, string>)Context[defaultLanguage].Lookup;
var props = typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
foreach (var prop in props)
{
var p = prop.PropertyType.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
foreach (var x in p)
{
var individual = (LocalizedDescriptionAttribute[])x.GetCustomAttributes(typeof(LocalizedDescriptionAttribute), false);
foreach (var v in individual)
{
var hasKey = context.ContainsKey(v.Key);
if (add)
{
if (!hasKey)
context.Add(v.Key, v.Fallback);
}
else
{
if (hasKey)
context.Remove(v.Key);
}
}
}
}
}
}
public sealed class TranslationContext
@ -217,6 +247,7 @@ public sealed class TranslationContext
public bool RemoveUsedKeys { private get; set; }
public const char Separator = '=';
private readonly Dictionary<string, string> Translation = new();
public IReadOnlyDictionary<string, string> Lookup => Translation;
public TranslationContext(IEnumerable<string> content, char separator = Separator)
{