From d690f1c5d3831a554146bcc5525dbb9f40f405bb Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 22 Feb 2026 11:11:16 -0600 Subject: [PATCH] Check unsaved entity on sav export MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add setting to skip the unsaved entity check Add setting to skip the overwrite? prompt and always call Save As Change Overwrite prompt to have distinct buttons rather than rows that can be mis-clicked. fix some comments/strings from Pokemon=>Pokémon add some underline shortcut key for main menu for English translation --- PKHeX.Core/Editing/IPKMView.cs | 8 ++- .../Program/Settings/AdvancedSettings.cs | 6 ++ .../Editing/Saves/Editors/FakePKMEditor.cs | 1 + .../Encounters/Data/Gen5/Encounters5B2W2.cs | 2 +- .../Legality/Evolutions/EvolutionRuleTweak.cs | 2 +- .../Restrictions/Memories/MemoryContext8.cs | 2 +- .../Legality/Verifiers/Ribbons/RibbonRules.cs | 2 +- PKHeX.Core/MysteryGifts/PL6.cs | 4 +- PKHeX.Core/PKM/Util/EntityFileExtension.cs | 10 ++-- .../text/program/MessageStrings_de.txt | 1 + .../text/program/MessageStrings_en.txt | 5 +- .../text/program/MessageStrings_es-419.txt | 1 + .../text/program/MessageStrings_es.txt | 1 + .../text/program/MessageStrings_fr.txt | 1 + .../text/program/MessageStrings_it.txt | 1 + .../text/program/MessageStrings_ja.txt | 1 + .../text/program/MessageStrings_ko.txt | 1 + .../text/program/MessageStrings_zh-Hans.txt | 1 + .../text/program/MessageStrings_zh-Hant.txt | 1 + .../Resources/text/script/gen2/flags_c_en.txt | 2 +- .../Resources/text/script/gen3/const_e_en.txt | 4 +- .../text/script/gen3/const_frlg_en.txt | 4 +- .../text/script/gen3/const_rs_en.txt | 2 +- .../text/script/gen3/flags_frlg_en.txt | 2 +- .../text/script/gen3/flags_frlg_es-419.txt | 2 +- .../text/script/gen3/flags_frlg_es.txt | 2 +- .../text/script/gen3/flags_rs_en.txt | 2 +- .../text/script/gen5/flags_bw_en.txt | 2 +- PKHeX.Core/Saves/Storage/SAV4Ranch.cs | 2 +- PKHeX.Core/Saves/Substructures/Gen7/QR7.cs | 2 +- PKHeX.Core/Saves/Substructures/Records.cs | 8 +-- PKHeX.Core/Util/MessageStrings.cs | 5 +- .../Controls/PKM Editor/PKMEditor.cs | 6 +- .../Controls/SAV Editor/ContextMenuSAV.cs | 2 + .../Controls/SAV Editor/SAVEditor.cs | 3 +- PKHeX.WinForms/MainWindow/Main.cs | 9 +++ PKHeX.WinForms/Resources/text/lang_de.txt | 2 + PKHeX.WinForms/Resources/text/lang_en.txt | 58 ++++++++++--------- PKHeX.WinForms/Resources/text/lang_es-419.txt | 2 + PKHeX.WinForms/Resources/text/lang_es.txt | 2 + PKHeX.WinForms/Resources/text/lang_fr.txt | 2 + PKHeX.WinForms/Resources/text/lang_it.txt | 2 + PKHeX.WinForms/Resources/text/lang_ja.txt | 2 + PKHeX.WinForms/Resources/text/lang_ko.txt | 2 + .../Resources/text/lang_zh-Hans.txt | 2 + .../Resources/text/lang_zh-Hant.txt | 2 + .../Subforms/SAV_FolderList.Designer.cs | 16 +++-- PKHeX.WinForms/Subforms/SAV_FolderList.cs | 7 +++ PKHeX.WinForms/Util/DialogUtil.cs | 4 +- PKHeX.WinForms/Util/WinFormsUtil.cs | 5 +- 50 files changed, 145 insertions(+), 73 deletions(-) diff --git a/PKHeX.Core/Editing/IPKMView.cs b/PKHeX.Core/Editing/IPKMView.cs index 59e4feef8..b26082528 100644 --- a/PKHeX.Core/Editing/IPKMView.cs +++ b/PKHeX.Core/Editing/IPKMView.cs @@ -1,4 +1,4 @@ -namespace PKHeX.Core; +namespace PKHeX.Core; /// /// Simple interface representing a viewer. @@ -44,4 +44,10 @@ public interface IPKMView /// Cause the viewer to give focus to itself. /// Cause the viewer to skip converting the data. Faster if it is known that the format is the same as the previous format. void PopulateFields(PKM pk, bool focus = true, bool skipConversionCheck = false); + + /// + /// Messages back that the entity has been saved. + /// + /// Pokémon data that was saved. + void NotifyWasExported(PKM pk); } diff --git a/PKHeX.Core/Editing/Program/Settings/AdvancedSettings.cs b/PKHeX.Core/Editing/Program/Settings/AdvancedSettings.cs index e8906200a..70c8e5ba3 100644 --- a/PKHeX.Core/Editing/Program/Settings/AdvancedSettings.cs +++ b/PKHeX.Core/Editing/Program/Settings/AdvancedSettings.cs @@ -5,6 +5,12 @@ namespace PKHeX.Core; public sealed class AdvancedSettings { + [LocalizedDescription("Skip the Overwrite prompt when exporting a save file, to always Save As...")] + public bool SaveExportForceSaveAs { get; set; } + + [LocalizedDescription("Check if the Pokémon in the editor has unsaved changes before exporting the save file.")] + public bool SaveExportCheckUnsavedEntity { get; set; } = true; + [LocalizedDescription("Folder path that contains dump(s) of block hash-names. If a specific dump file does not exist, only names defined within the program's code will be loaded.")] public string PathBlockKeyList { get; set; } = string.Empty; diff --git a/PKHeX.Core/Editing/Saves/Editors/FakePKMEditor.cs b/PKHeX.Core/Editing/Saves/Editors/FakePKMEditor.cs index 30b990ccf..bde819626 100644 --- a/PKHeX.Core/Editing/Saves/Editors/FakePKMEditor.cs +++ b/PKHeX.Core/Editing/Saves/Editors/FakePKMEditor.cs @@ -13,4 +13,5 @@ public sealed class FakePKMEditor(PKM template) : IPKMView public PKM PreparePKM(bool click = true) => Data; public void PopulateFields(PKM pk, bool focus = true, bool skipConversionCheck = false) => Data = pk; + public void NotifyWasExported(PKM pk) { } } diff --git a/PKHeX.Core/Legality/Encounters/Data/Gen5/Encounters5B2W2.cs b/PKHeX.Core/Legality/Encounters/Data/Gen5/Encounters5B2W2.cs index 710d2bacc..eb09beeb7 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Gen5/Encounters5B2W2.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Gen5/Encounters5B2W2.cs @@ -155,7 +155,7 @@ public static class Encounters5B2W2 public static readonly EncounterStatic5N[] Encounter_B2W2_N = [ - // N's Pokemon + // N's Pokémon new(0xFF01007F) { Species = 509, Level = 07, Location = 015, Ability = OnlySecond, Nature = Nature.Timid }, // Purloin @ Route 2 new(0xFF01007F) { Species = 519, Level = 13, Location = 033, Ability = OnlySecond, Nature = Nature.Sassy }, // Pidove @ Pinwheel Forest new(0xFF00003F) { Species = 532, Level = 13, Location = 033, Ability = OnlyFirst, Nature = Nature.Rash }, // Timburr @ Pinwheel Forest diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionRuleTweak.cs b/PKHeX.Core/Legality/Evolutions/EvolutionRuleTweak.cs index 94e29f683..bca258428 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionRuleTweak.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionRuleTweak.cs @@ -11,7 +11,7 @@ public sealed class EvolutionRuleTweak public static readonly EvolutionRuleTweak Default = new(); /// - /// In Sword & Shield (Generation 8+), level 100 Pokemon can trigger evolution methods via Rare Candy level up. + /// In Sword & Shield (Generation 8+), level 100 Pokémon can trigger evolution methods via Rare Candy level up. /// public static readonly EvolutionRuleTweak Level100 = new() { AllowLevelUpEvolution100 = true }; diff --git a/PKHeX.Core/Legality/Restrictions/Memories/MemoryContext8.cs b/PKHeX.Core/Legality/Restrictions/Memories/MemoryContext8.cs index 618c440ba..6bf613b22 100644 --- a/PKHeX.Core/Legality/Restrictions/Memories/MemoryContext8.cs +++ b/PKHeX.Core/Legality/Restrictions/Memories/MemoryContext8.cs @@ -93,7 +93,7 @@ private static bool IsValidMemory29(Species encountered, Species species, GameVe return true; // OT Memory checks from here on. - // Zacian and Zamazenta being in an OT memory need to match the Pokemon's version. + // Zacian and Zamazenta being in an OT memory need to match the Pokémon's version. if (version == GameVersion.SW && encountered == Zamazenta) return false; if (version == GameVersion.SH && encountered == Zacian) diff --git a/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonRules.cs b/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonRules.cs index d6efefa1b..8b94b6ed7 100644 --- a/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonRules.cs +++ b/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonRules.cs @@ -89,7 +89,7 @@ public static bool IsRibbonValidFootprint(PKM pk, EvolutionHistory evos) public static bool IsRibbonValidMasterRank(PKM pk, IEncounterTemplate enc, EvolutionHistory evos) { // Legends can compete in Ranked starting from Series 10. - // Past gen Pokemon can get the ribbon only if they've been reset. + // Past gen Pokémon can get the ribbon only if they've been reset. if (evos.HasVisitedSWSH && IsRibbonValidMasterRankSWSH(pk, enc)) return true; diff --git a/PKHeX.Core/MysteryGifts/PL6.cs b/PKHeX.Core/MysteryGifts/PL6.cs index 58a280436..269c3c535 100644 --- a/PKHeX.Core/MysteryGifts/PL6.cs +++ b/PKHeX.Core/MysteryGifts/PL6.cs @@ -4,7 +4,7 @@ namespace PKHeX.Core; /// -/// Pokemon Link Data Storage +/// Pokémon Link Data Storage /// /// /// This Template object is very similar to the structure in that it stores more data than just the gift. @@ -37,7 +37,7 @@ public byte Flags /// public string Origin { get => StringConverter6.GetString(Source); set => StringConverter6.SetString(Source, value, 54, 0, StringConverterOption.ClearZero); } - // Pokemon transfer flags? + // transfer flags? public uint Flags1 { get => ReadUInt32LittleEndian(Data[0x099..]); set => WriteUInt32LittleEndian(Data[0x099..], value); } public uint Flags2 { get => ReadUInt32LittleEndian(Data[0x141..]); set => WriteUInt32LittleEndian(Data[0x141..], value); } public uint Flags3 { get => ReadUInt32LittleEndian(Data[0x1E9..]); set => WriteUInt32LittleEndian(Data[0x1E9..], value); } diff --git a/PKHeX.Core/PKM/Util/EntityFileExtension.cs b/PKHeX.Core/PKM/Util/EntityFileExtension.cs index 3c33e6b1c..8fc4e30e4 100644 --- a/PKHeX.Core/PKM/Util/EntityFileExtension.cs +++ b/PKHeX.Core/PKM/Util/EntityFileExtension.cs @@ -38,20 +38,20 @@ public static string[] GetExtensions(byte maxGeneration = Latest.Generation) for (int i = min; i <= maxGeneration; i++) result.Add($"pk{i}"); if (min < 3) - result.Add(ExtensionSK2); // stadium + result.Add(ExtensionSK2); // Stadium if (maxGeneration >= 3) { - result.Add(ExtensionCK3); // colosseum - result.Add(ExtensionXK3); // xd + result.Add(ExtensionCK3); // Colosseum + result.Add(ExtensionXK3); // XD } if (maxGeneration >= 4) { result.Add(ExtensionBK4); // battle revolution - result.Add(ExtensionRK4); // My Pokemon Ranch + result.Add(ExtensionRK4); // My Pokémon Ranch } if (maxGeneration >= 7) - result.Add(ExtensionPB7); // let's go + result.Add(ExtensionPB7); // Let's Go, Pikachu/Eevee if (maxGeneration >= 8) result.Add(ExtensionPB8); // Brilliant Diamond & Shining Pearl if (maxGeneration >= 8) diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_de.txt b/PKHeX.Core/Resources/text/program/MessageStrings_de.txt index cc62a741c..f55fd24a6 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_de.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_de.txt @@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = Illegaler Modus aktiviert. MsgProgramUpdateAvailable = Neues Update verfügbar! MsgProgramCloseUnsaved = Nicht gespeicherte Änderungen gehen verloren. MsgProgramCloseConfirm = Bist du sicher, dass du PKHeX schließen möchtest? +MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes. MsgProgramSaveFileConfirm = Bist du sicher, dass du einen Spielstand laden möchtest? MsgProgramError = FEHLER MsgProgramErrorExpectedHex = Die erwartete Eingabe darf nur die folgenden Zeichen enthalten (0-9, A-F). diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_en.txt b/PKHeX.Core/Resources/text/program/MessageStrings_en.txt index e8e302cab..1dc32f8ca 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_en.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_en.txt @@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = Illegal mode activated. MsgProgramUpdateAvailable = New Update Available! MsgProgramCloseUnsaved = Any unsaved changes will be lost. MsgProgramCloseConfirm = Are you sure you want to close PKHeX? +MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes. MsgProgramSaveFileConfirm = Are you sure you want to load a new save file? MsgProgramError = ERROR MsgProgramErrorExpectedHex = Expected Text containing only the following characters (0-9, A-F). @@ -56,7 +57,7 @@ MsgFileWriteProtected = File's location is write protected: MsgFileWriteProtectedAdvice = If the file is on a removable disk (SD card), please ensure the write protection switch is not set. MsgFileInUse = Unable to load file. It could be in use by another program. MsgFileUnsupported = Attempted to load an unsupported file type/size. This could mean PKHeX doesn't support your save file or your save file is corrupt. -MsgPKMUnsupported = Attempted to load an unsupported file type/size. This could be caused by loading a different generation Pokemon file on an unsupported generation or your file is corrupt. +MsgPKMUnsupported = Attempted to load an unsupported file type/size. This could be caused by loading a different generation Pokémon file on an unsupported generation or your file is corrupt. MsgPKMConvertSuccess = Converted from {0} to {1}. MsgPKMConvertFail = Conversion failed. MsgPKMMysteryGiftFail = Mystery Gift is not a Pokémon. @@ -109,7 +110,7 @@ MsgSaveSlotBadData = Unable to set to this slot. MsgSaveBackup = Saved Backup of current SAV to: MsgSaveBackupNotFound = Original file has been moved; unable to copy a backup. MsgSaveCurrentGeneration = Current SAV Generation: {0} -MsgSaveBoxCloneFromTabs = Clone Pokemon from Editing Tabs to all slots in {0}? +MsgSaveBoxCloneFromTabs = Clone Pokémon from Editing Tabs to all slots in {0}? MsgSaveBoxSortCurrent = Sort Current Box? MsgSaveBoxSortCurrentFailBattle = Battle Box slots prevent the sorting of box. MsgSaveBoxSortCurrentSuccess = Current Box sorted! diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_es-419.txt b/PKHeX.Core/Resources/text/program/MessageStrings_es-419.txt index 1317f986d..641a3921d 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_es-419.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_es-419.txt @@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = Modo Ilegal activado. MsgProgramUpdateAvailable = ¡Actualización disponible! MsgProgramCloseUnsaved = Cualquier cambio no guardado se perderá. MsgProgramCloseConfirm = ¿Estás seguro de que quieres cerrar PKHeX? +MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes. MsgProgramSaveFileConfirm = ¿Estás seguro de que quieres cargar un nuevo archivo de guardado? MsgProgramError = ERROR MsgProgramErrorExpectedHex = Se esperaba texto conteniendo solamente los siguiente caracteres (0-9, A-F). diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_es.txt b/PKHeX.Core/Resources/text/program/MessageStrings_es.txt index a105ed47c..96cf399d6 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_es.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_es.txt @@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = Modo Ilegal activado. MsgProgramUpdateAvailable = ¡Actualización disponible! MsgProgramCloseUnsaved = Cualquier cambio no guardado se perderá. MsgProgramCloseConfirm = ¿Estás seguro de que quieres cerrar PKHeX? +MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes. MsgProgramSaveFileConfirm = ¿Estás seguro de que quieres cargar un nuevo archivo de guardado? MsgProgramError = ERROR MsgProgramErrorExpectedHex = Se esperaba texto conteniendo solamente los siguiente caracteres (0-9, A-F). diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_fr.txt b/PKHeX.Core/Resources/text/program/MessageStrings_fr.txt index 8a10a7eed..93d941a34 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_fr.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_fr.txt @@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = Mode illégal activé. MsgProgramUpdateAvailable = Nouvelle mise à jour disponible ! MsgProgramCloseUnsaved = Tout changement non sauvegardé sera perdu. MsgProgramCloseConfirm = Êtes-vous sûr de vouloir fermer PKHeX ? +MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes. MsgProgramSaveFileConfirm = Voulez-vous vraiment charger un nouveau fichier de sauvegarde ? MsgProgramError = Erreur MsgProgramErrorExpectedHex = Le texte ne doit contenir que les caractères suivants (0-9, A-F). diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_it.txt b/PKHeX.Core/Resources/text/program/MessageStrings_it.txt index 49165cb55..9de8e8d9e 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_it.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_it.txt @@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = Modalità illegale attivata. MsgProgramUpdateAvailable = Nuovo aggiornamento disponibile! MsgProgramCloseUnsaved = Tutte le modifiche non salvate andranno perse. MsgProgramCloseConfirm = Sei scuro di voler chiudere PKHeX? +MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes. MsgProgramSaveFileConfirm = Sei sicuro di voler caricare un nuovo file di salvataggio? MsgProgramError = ERRORE MsgProgramErrorExpectedHex = Previsto testo contenente i caratteri seguenti (0-9, A-F). diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_ja.txt b/PKHeX.Core/Resources/text/program/MessageStrings_ja.txt index 8aacb0daf..5a66adcb2 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_ja.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_ja.txt @@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = チートモードがアクティブ化してい MsgProgramUpdateAvailable = 新しいバージョンがあります! MsgProgramCloseUnsaved = 保存されていない変更は失われます。 MsgProgramCloseConfirm = PKHeXを閉じてもよろしいですか? +MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes. MsgProgramSaveFileConfirm = 新しいセーブファイルをロードしてもよろしいですか? MsgProgramError = ERROR MsgProgramErrorExpectedHex = 次の文字(0-9,A-F)のみを含むテキストが必要です。 diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_ko.txt b/PKHeX.Core/Resources/text/program/MessageStrings_ko.txt index dab0c7bc1..1ff88b1c0 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_ko.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_ko.txt @@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = 불법 모드를 사용합니다. MsgProgramUpdateAvailable = 새 업데이트가 있습니다! MsgProgramCloseUnsaved = 저장하지 않은 변경 사항은 손실됩니다. MsgProgramCloseConfirm = 정말 PKHeX를 종료하시겠습니까? +MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes. MsgProgramSaveFileConfirm = 새로운 저장 파일을 불러오시겠다는 확신이 있습니까? MsgProgramError = 오류 MsgProgramErrorExpectedHex = 숫자(0-9)와 일부 알파벳(A-F)만 사용할 수 있습니다. diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_zh-Hans.txt b/PKHeX.Core/Resources/text/program/MessageStrings_zh-Hans.txt index 532a2a6ad..00afefc40 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_zh-Hans.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_zh-Hans.txt @@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = 非法模式启动。 MsgProgramUpdateAvailable = 有新版本! MsgProgramCloseUnsaved = 未保存的更改将会丢失。 MsgProgramCloseConfirm = 你确定要关闭 PKHeX 吗? +MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes. MsgProgramSaveFileConfirm = 确定要加载新的存档文件吗? MsgProgramError = 错误 MsgProgramErrorExpectedHex = 文本仅能包含以下字符(0-9, A-F)。 diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_zh-Hant.txt b/PKHeX.Core/Resources/text/program/MessageStrings_zh-Hant.txt index dda368716..7511ad3d1 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_zh-Hant.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_zh-Hant.txt @@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = 使用不合法模式啟動。 MsgProgramUpdateAvailable = 新版本經已發佈! MsgProgramCloseUnsaved = 未保存之更改將會丟失。 MsgProgramCloseConfirm = 你確定要關閉 PKHeX 嗎? +MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes. MsgProgramSaveFileConfirm = 確定要載入新的儲存資料檔案嗎? MsgProgramError = 錯誤 MsgProgramErrorExpectedHex = 文本僅能包含以下字元(0-9, A-F)。 diff --git a/PKHeX.Core/Resources/text/script/gen2/flags_c_en.txt b/PKHeX.Core/Resources/text/script/gen2/flags_c_en.txt index d0a1446c0..90583b580 100644 --- a/PKHeX.Core/Resources/text/script/gen2/flags_c_en.txt +++ b/PKHeX.Core/Resources/text/script/gen2/flags_c_en.txt @@ -14,7 +14,7 @@ 0190 * Kurt can check GS Ball 0191 * Kurt ready to return GS Ball (combine with above Flag) 0192 * GS Ball can be inserted into Ilex Forest Shrine -1809 * No Mystery Gift item is waiting in the Pokemon Center +1809 * No Mystery Gift item is waiting in the Pokémon Center 0672 * Ho-Oh puzzle solved in Ruins of Alph 0673 * Kabuto puzzle solved in Ruins of Alph 0674 * Omanyte puzzle solved in Ruins of Alph diff --git a/PKHeX.Core/Resources/text/script/gen3/const_e_en.txt b/PKHeX.Core/Resources/text/script/gen3/const_e_en.txt index 6543241cb..c0efc54bc 100644 --- a/PKHeX.Core/Resources/text/script/gen3/const_e_en.txt +++ b/PKHeX.Core/Resources/text/script/gen3/const_e_en.txt @@ -1,5 +1,5 @@ 0x4021 m Repel Step Counter -0x4023 * Starter Pokemon 00:Treecko,01:Torchic,02:Mudkip +0x4023 * Starter Pokémon 00:Treecko,01:Torchic,02:Mudkip 0x4024 r Mirage Island RND (High) 0x4025 r Mirage Island RND (Low) 0x4026 * Current Secret Base @@ -9,7 +9,7 @@ 0x402C * Reset RTC 00:Disabled,2336:Enabled 0x402D * Enigma Berry Available -0x403E r Wild Pokemon in Altering Cave 00:Zubat,01:Mareep (Illegal),02:Pineco (Illegal),03:Houndour (Illegal),04:Teddiursa (Illegal),05:Aipom (Illegal),06:Shuckle (Illegal),07:Stantler (Illegal),08:Smeargle (Illegal) +0x403E r Wild Pokémon in Altering Cave 00:Zubat,01:Mareep (Illegal),02:Pineco (Illegal),03:Houndour (Illegal),04:Teddiursa (Illegal),05:Aipom (Illegal),06:Shuckle (Illegal),07:Stantler (Illegal),08:Smeargle (Illegal) 0x4040 * Days Passed diff --git a/PKHeX.Core/Resources/text/script/gen3/const_frlg_en.txt b/PKHeX.Core/Resources/text/script/gen3/const_frlg_en.txt index 1c44a6653..a1aeb335a 100644 --- a/PKHeX.Core/Resources/text/script/gen3/const_frlg_en.txt +++ b/PKHeX.Core/Resources/text/script/gen3/const_frlg_en.txt @@ -7,9 +7,9 @@ 0x405B s Defeated Rival (S.S. Anne) 0:No,1:Yes 0x405C s Defeated Rival (Silph Co.) 0:No,1:Yes 0x405D s Defeated Rival (Pokemon Tower) 0:No,1:Yes -0x4089 s Rival Met (Six Island Pokemon Center) 0:No,1:Yes +0x4089 s Rival Met (Six Island Pokémon Center) 0:No,1:Yes -0x4024 r Wild Pokemon in Altering Cave 00:Zubat,01:Mareep (Illegal),02:Pineco (Illegal),03:Houndour (Illegal),04:Teddiursa (Illegal),05:Aipom (Illegal),06:Shuckle (Illegal),07:Stantler (Illegal),08:Smeargle (Illegal) +0x4024 r Wild Pokémon in Altering Cave 00:Zubat,01:Mareep (Illegal),02:Pineco (Illegal),03:Houndour (Illegal),04:Teddiursa (Illegal),05:Aipom (Illegal),06:Shuckle (Illegal),07:Stantler (Illegal),08:Smeargle (Illegal) 0x4049 a Hall of Fame Trainer Card Sticker 0:None,1:Level 1,2:Level 2,3:Level 3 0x404A a Hatched Eggs Trainer Card Sticker 0:None,1:Level 1,2:Level 2,3:Level 3 diff --git a/PKHeX.Core/Resources/text/script/gen3/const_rs_en.txt b/PKHeX.Core/Resources/text/script/gen3/const_rs_en.txt index 69f7d268c..6926f8782 100644 --- a/PKHeX.Core/Resources/text/script/gen3/const_rs_en.txt +++ b/PKHeX.Core/Resources/text/script/gen3/const_rs_en.txt @@ -1,5 +1,5 @@ 0x4021 m Repel Step Counter -0x4023 * Starter Pokemon 00:Treecko,01:Torchic,02:Mudkip +0x4023 * Starter Pokémon 00:Treecko,01:Torchic,02:Mudkip 0x4024 r Mirage Island RND (High) 0x4025 r Mirage Island RND (Low) 0x4026 * Current Secret Base diff --git a/PKHeX.Core/Resources/text/script/gen3/flags_frlg_en.txt b/PKHeX.Core/Resources/text/script/gen3/flags_frlg_en.txt index f2d57414d..bfa89a76f 100644 --- a/PKHeX.Core/Resources/text/script/gen3/flags_frlg_en.txt +++ b/PKHeX.Core/Resources/text/script/gen3/flags_frlg_en.txt @@ -469,7 +469,7 @@ 759 r Defeated Deoxys 760 m Change text of old woman in Celadon Mansion (after HoF) 761 s Spoke to Prof. Oak's Aide in Vermilion City -762 * Received Everstone (Oak's Aide, Rock Tunnel Pokemon Center) +762 * Received Everstone (Oak's Aide, Rock Tunnel Pokémon Center) 763 s Gave Meteorite and received Moon Stone from Lostelle's daddy 764 * Full Restore from man for driving off bikers on Three Island received 765 * Received Amulet Coin (Oak's Aide, Route 16) diff --git a/PKHeX.Core/Resources/text/script/gen3/flags_frlg_es-419.txt b/PKHeX.Core/Resources/text/script/gen3/flags_frlg_es-419.txt index a301cd059..38bf659b6 100644 --- a/PKHeX.Core/Resources/text/script/gen3/flags_frlg_es-419.txt +++ b/PKHeX.Core/Resources/text/script/gen3/flags_frlg_es-419.txt @@ -105,7 +105,7 @@ 0x2D8 s Zafiro Robado 0x2D6 s Puerta Abierta de la Guarida Rocket 0x2DC s Recibido Zafiro -0x2FA s Recibida Piedra Eterna (Ayudante de Oak, Centro Pokemon del Túnel Roca) +0x2FA s Recibida Piedra Eterna (Ayudante de Oak, Centro Pokémon del Túnel Roca) 0x252 s Recibido Buscaobjetos (Ayudante de Oak, Ruta 11) 0x256 s Recibido Rep. Exp. (Ayudante de Oak, Ruta 15) 0x2FD s Recibido Amuleto Suerte (Ayudante de Oak, Ruta 16) diff --git a/PKHeX.Core/Resources/text/script/gen3/flags_frlg_es.txt b/PKHeX.Core/Resources/text/script/gen3/flags_frlg_es.txt index a301cd059..38bf659b6 100644 --- a/PKHeX.Core/Resources/text/script/gen3/flags_frlg_es.txt +++ b/PKHeX.Core/Resources/text/script/gen3/flags_frlg_es.txt @@ -105,7 +105,7 @@ 0x2D8 s Zafiro Robado 0x2D6 s Puerta Abierta de la Guarida Rocket 0x2DC s Recibido Zafiro -0x2FA s Recibida Piedra Eterna (Ayudante de Oak, Centro Pokemon del Túnel Roca) +0x2FA s Recibida Piedra Eterna (Ayudante de Oak, Centro Pokémon del Túnel Roca) 0x252 s Recibido Buscaobjetos (Ayudante de Oak, Ruta 11) 0x256 s Recibido Rep. Exp. (Ayudante de Oak, Ruta 15) 0x2FD s Recibido Amuleto Suerte (Ayudante de Oak, Ruta 16) diff --git a/PKHeX.Core/Resources/text/script/gen3/flags_rs_en.txt b/PKHeX.Core/Resources/text/script/gen3/flags_rs_en.txt index 27eafefbe..1461da55d 100644 --- a/PKHeX.Core/Resources/text/script/gen3/flags_rs_en.txt +++ b/PKHeX.Core/Resources/text/script/gen3/flags_rs_en.txt @@ -59,7 +59,7 @@ 0x3D1 r Overworld Hidden (Electrode 1 in Hideout) 0x3D2 r Overworld Hidden (Electrode 2 in Hideout) -0x800 s Received Starter Pokemon +0x800 s Received Starter Pokémon 0x801 s Received Pokedex 0x802 s Received PokeNav 0x804 s Entered Hall of Fame diff --git a/PKHeX.Core/Resources/text/script/gen5/flags_bw_en.txt b/PKHeX.Core/Resources/text/script/gen5/flags_bw_en.txt index 910c4364c..014973524 100644 --- a/PKHeX.Core/Resources/text/script/gen5/flags_bw_en.txt +++ b/PKHeX.Core/Resources/text/script/gen5/flags_bw_en.txt @@ -1,4 +1,4 @@ -0669 r Team Plasma Guide (Pokemon League Pokemon Center) Disappeared +0669 r Team Plasma Guide (Pokémon League Pokémon Center) Disappeared 0661 r Reshiram/Zekrom (N's Castle) Disappeared 0307 r Reshiram/Zekrom Captured 0766 r Reshiram/Zekrom (Dragonspiral Tower) Disappeared diff --git a/PKHeX.Core/Saves/Storage/SAV4Ranch.cs b/PKHeX.Core/Saves/Storage/SAV4Ranch.cs index ca28b2264..aa0fbf46a 100644 --- a/PKHeX.Core/Saves/Storage/SAV4Ranch.cs +++ b/PKHeX.Core/Saves/Storage/SAV4Ranch.cs @@ -63,7 +63,7 @@ public SAV4Ranch(Memory data) : base(data, typeof(RK4), 0) // 00: size, ??? // 01: size, count, Mii data[count] // 02: size, count, Mii Link data[count] - // 03: size, count, Pokemon (PK4 + metadata)[count] + // 03: size, count, Pokémon (PK4 + metadata)[count] // 04: size, count, ??? MiiCountOffset = ReadInt32BigEndian(Data[0x24..]) + 4; diff --git a/PKHeX.Core/Saves/Substructures/Gen7/QR7.cs b/PKHeX.Core/Saves/Substructures/Gen7/QR7.cs index 2538ee915..372309b44 100644 --- a/PKHeX.Core/Saves/Substructures/Gen7/QR7.cs +++ b/PKHeX.Core/Saves/Substructures/Gen7/QR7.cs @@ -86,7 +86,7 @@ public static void SetQRData(PK7 pk7, Span span, int box = 0, int slot = 0 WriteInt32LittleEndian(span[0x0C..], slot); WriteInt32LittleEndian(span[0x10..], num_copies); // No need to check max num_copies, payload parser handles it on-console. - pk7.EncryptedPartyData.CopyTo(span[0x30..]); // Copy in pokemon data + pk7.EncryptedPartyData.CopyTo(span[0x30..]); // Copy in Pokémon data SetDexData(span[0x140..], pk7.Species, pk7.Form, pk7.IsShiny, pk7.Gender); var chk = Checksums.CRC16Invert(span[..0x1A0]); diff --git a/PKHeX.Core/Saves/Substructures/Records.cs b/PKHeX.Core/Saves/Substructures/Records.cs index a706e0d16..86877a279 100644 --- a/PKHeX.Core/Saves/Substructures/Records.cs +++ b/PKHeX.Core/Saves/Substructures/Records.cs @@ -137,8 +137,8 @@ public static class RecordLists {073, "Used Splash"}, {074, "Used Struggle"}, {075, "Noneffective move used on you"}, - {076, "Own Pokemon Attacked"}, - {077, "Own Pokemon Fainted"}, + {076, "Own Pokémon Attacked"}, + {077, "Own Pokémon Fainted"}, {078, "Failed to Run"}, {079, "Pokemon Fled"}, {080, "Failed Fishing"}, @@ -375,7 +375,7 @@ public static class RecordLists {177, "Trainer's Eye Rematches"}, {178, "FUREAI Interest ???"}, // similar to US/UM idb - {179, "Shiny Pokemon Encountered"}, + {179, "Shiny Pokémon Encountered"}, {180, "Trick House Clears"}, {181, "Eon Ticket 1 (SpotPass)"}, {182, "Eon Ticket 2 (Mystery Gift)"}, @@ -487,7 +487,7 @@ public static class RecordLists {124, "PP Raised"}, {125, "Amie Used"}, {126, "Fishing Chains"}, - {127, "Shiny Pokemon Encountered"}, + {127, "Shiny Pokémon Encountered"}, {128, "Missions Participated In"}, {129, "Facilities Hosted"}, {130, "QR Code Scans"}, diff --git a/PKHeX.Core/Util/MessageStrings.cs b/PKHeX.Core/Util/MessageStrings.cs index 783a04c84..d412a11e3 100644 --- a/PKHeX.Core/Util/MessageStrings.cs +++ b/PKHeX.Core/Util/MessageStrings.cs @@ -18,6 +18,7 @@ public static class MessageStrings public static string MsgProgramUpdateAvailable { get; set; } = "New Update Available!"; public static string MsgProgramCloseUnsaved { get; set; } = "Any unsaved changes will be lost."; public static string MsgProgramCloseConfirm { get; set; } = "Are you sure you want to close PKHeX?"; + public static string MsgProgramSaveUnsaved { get; set; } = "The Pokémon in the editor has unsaved changes."; public static string MsgProgramSaveFileConfirm { get; set; } = "Are you sure you want to load a new save file?"; public static string MsgProgramError { get; set; } = "ERROR"; public static string MsgProgramErrorExpectedHex { get; set; } = "Expected Text containing only the following characters (0-9, A-F)."; @@ -85,7 +86,7 @@ public static class MessageStrings public static string MsgFileWriteProtectedAdvice { get; set; } = "If the file is on a removable disk (SD card), please ensure the write protection switch is not set."; public static string MsgFileInUse { get; set; } = "Unable to load file. It could be in use by another program."; public static string MsgFileUnsupported { get; set; } = "Attempted to load an unsupported file type/size. This could mean PKHeX doesn't support your save file or your save file is corrupt."; - public static string MsgPKMUnsupported { get; set; } = "Attempted to load an unsupported file type/size. This could be caused by loading a different generation Pokemon file on an unsupported generation or your file is corrupt."; + public static string MsgPKMUnsupported { get; set; } = "Attempted to load an unsupported file type/size. This could be caused by loading a different generation Pokémon file on an unsupported generation or your file is corrupt."; public static string MsgPKMConvertSuccess { get; set; } = "Converted from {0} to {1}."; public static string MsgPKMConvertFail { get; set; } = "Conversion failed."; @@ -157,7 +158,7 @@ public static class MessageStrings public static string MsgSaveBackupNotFound { get; set; } = "Original file has been moved; unable to copy a backup."; public static string MsgSaveCurrentGeneration { get; set; } = "Current SAV Generation: {0}"; - public static string MsgSaveBoxCloneFromTabs { get; set; } = "Clone Pokemon from Editing Tabs to all slots in {0}?"; + public static string MsgSaveBoxCloneFromTabs { get; set; } = "Clone Pokémon from Editing Tabs to all slots in {0}?"; public static string MsgSaveBoxSortCurrent { get; set; } = "Sort Current Box?"; public static string MsgSaveBoxSortCurrentFailBattle { get; set; } = "Battle Box slots prevent the sorting of box."; public static string MsgSaveBoxSortCurrentSuccess { get; set; } = "Current Box sorted!"; diff --git a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs index 28bec31ab..6bffa1d37 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs @@ -166,7 +166,8 @@ public bool HaX set => field = Stats.HaX = value; } - private byte[] LastData = []; + private byte[] LastData { get; set; } = []; + public void NotifyWasExported(PKM pk) => LastData = pk.Data.ToArray(); public PKM Data => Entity; public PKM Entity { get; private set; } = null!; @@ -233,7 +234,6 @@ public PKM PreparePKM(bool click = true) } var pk = GetPKMfromFields(); - LastData = pk.Data.ToArray(); return pk.Clone(); } @@ -355,7 +355,7 @@ private void LoadFieldsFromPKM(PKM pk, bool focus = true, bool skipConversionChe SetMarkings(); UpdateLegality(); UpdateSprite(); - LastData = PreparePKM().Data.ToArray(); + NotifyWasExported(PreparePKM()); RefreshFontWarningButton(); } diff --git a/PKHeX.WinForms/Controls/SAV Editor/ContextMenuSAV.cs b/PKHeX.WinForms/Controls/SAV Editor/ContextMenuSAV.cs index 03fb7e810..23dd58189 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/ContextMenuSAV.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/ContextMenuSAV.cs @@ -53,6 +53,7 @@ private void ClickSet(object sender, EventArgs e) if (!editor.EditsComplete) return; PKM pk = editor.PreparePKM(); + var preModify = pk.Clone(); var info = GetSenderInfo(sender); var sav = info.View.SAV; @@ -69,6 +70,7 @@ private void ClickSet(object sender, EventArgs e) return; } + editor.NotifyWasExported(preModify); Manager.Hover.Stop(); Editor.Slots.Set(info.Slot, pk); Manager.SE.UpdateUndoRedo(); diff --git a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs index 72464aaf9..8beaa70ed 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs @@ -1029,7 +1029,8 @@ public bool ExportSaveFile() bool reload = SAV is IStorageCleanup b && b.FixStoragePreWrite(); if (reload) ReloadSlots(); - return WinFormsUtil.ExportSAVDialog(this, SAV, SAV.CurrentBox); + bool forceSaveAs = Main.Settings.Advanced.SaveExportForceSaveAs; + return WinFormsUtil.ExportSAVDialog(this, SAV, SAV.CurrentBox, forceSaveAs); } public bool ExportBackup() diff --git a/PKHeX.WinForms/MainWindow/Main.cs b/PKHeX.WinForms/MainWindow/Main.cs index b4e77ae71..285af8d00 100644 --- a/PKHeX.WinForms/MainWindow/Main.cs +++ b/PKHeX.WinForms/MainWindow/Main.cs @@ -1226,6 +1226,7 @@ private async void Dragout_MouseDown(object sender, MouseEventArgs e) // Gather data var pk = PreparePKM(); + var preModify = pk.Clone(); var encrypt = ModifierKeys == Keys.Control; var data = encrypt ? pk.EncryptedPartyData : pk.DecryptedPartyData; @@ -1249,6 +1250,7 @@ private async void Dragout_MouseDown(object sender, MouseEventArgs e) C_SAV.M.Drag.ResetCursor(this); await DeleteAsync(newfile, 20_000).ConfigureAwait(false); } + PKME_Tabs.NotifyWasExported(preModify); // restore pre-modify state, in case the user drags into the same program window } catch { @@ -1322,6 +1324,13 @@ private void ClickExportSAV(object sender, EventArgs e) if (!Menu_ExportSAV.Enabled) return; // hot-keys can't cheat the system! + if (Settings.Advanced.SaveExportCheckUnsavedEntity && PKME_Tabs.PKMIsUnsaved) + { + var prompt = WinFormsUtil.Prompt(MessageBoxButtons.YesNo, MsgProgramSaveUnsaved, MsgContinue); + if (prompt != DialogResult.Yes) + return; + } + C_SAV.ExportSaveFile(); Text = GetProgramTitle(C_SAV.SAV); } diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index c62dddf25..ce78a663d 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=Retain the Met Date when transferri LocalizedDescription.ReturnNoneIfEmptySearch=Überspringt die Suche, wenn vergessen wurde ein Pokémon / Attacken in die Suchkriterien einzugeben. LocalizedDescription.RNGFrameNotFound3=Zeigt in der Legalitäts Analyse an, wenn der RNG Frame Check keine Übereinstimmung findet. LocalizedDescription.RNGFrameNotFound4=Zeigt in der Legalitäts Analyse an, wenn der RNG Frame Check keine Übereinstimmung findet. +LocalizedDescription.SaveExportCheckUnsavedEntity=Prüft, ob das Pokémon im Editor ungespeicherte Änderungen hat, bevor die Speicherdatei exportiert wird. +LocalizedDescription.SaveExportForceSaveAs=Überspringt die Überschreiben-Abfrage beim Exportieren einer Speicherdatei, um immer Speichern unter... zu verwenden. LocalizedDescription.SearchBackups=Suche beim Laden der PKM Datenbank auch in den Backup Spielständen. LocalizedDescription.SearchExtraSaves=Durchsuche beim Laden der PKM Datenbank auch Backup Verzeichnisse. LocalizedDescription.SearchExtraSavesDeep=Durchsuche beim Laden der PKM Datenbank auch Unterverzeichmisse der Backup Verzeichnisse. diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index 152811a00..79cb59f5e 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=Retain the Met Date when transferri LocalizedDescription.ReturnNoneIfEmptySearch=Skips searching if the user forgot to enter Species / Move(s) into the search criteria. LocalizedDescription.RNGFrameNotFound3=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match for Generation 3 encounters. LocalizedDescription.RNGFrameNotFound4=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match for Generation 4 encounters. +LocalizedDescription.SaveExportCheckUnsavedEntity=Check if the Pokémon in the editor has unsaved changes before exporting the save file. +LocalizedDescription.SaveExportForceSaveAs=Skip the Overwrite prompt when exporting a save file, to always Save As... LocalizedDescription.SearchBackups=When loading content for the PKM Database, search within backup save files. LocalizedDescription.SearchExtraSaves=When loading content for the PKM Database, search within OtherBackupPaths. LocalizedDescription.SearchExtraSavesDeep=When loading content for the PKM Database, search subfolders within OtherBackupPaths. @@ -529,36 +531,36 @@ Main.Label_SubRegion=Sub Region: Main.Label_TID=TID: Main.Label_Total=Total: Main.Label_Tough=Tough -Main.Menu_About=About PKHeX -Main.Menu_BatchEditor=Batch Editor -Main.Menu_Data=Data -Main.Menu_Database=PKM Database -Main.Menu_DumpBox=Dump Box -Main.Menu_DumpBoxes=Dump Boxes +Main.Menu_About=&About PKHeX +Main.Menu_BatchEditor=&Batch Editor +Main.Menu_Data=&Data +Main.Menu_Database=PKM &Database +Main.Menu_DumpBox=Dump Bo&x +Main.Menu_DumpBoxes=Dump Bo&xes Main.Menu_EncDatabase=E&ncounter Database -Main.Menu_Exit=Quit +Main.Menu_Exit=&Quit Main.Menu_ExportBAK=Export Backup -Main.Menu_ExportSAV=Export SAV... -Main.Menu_File=File -Main.Menu_Folder=Open Folder -Main.Menu_Language=Language -Main.Menu_LoadBoxes=Load Boxes -Main.Menu_MGDatabase=Mystery Gift Database -Main.Menu_Open=Open... -Main.Menu_Options=Options -Main.Menu_PopoutBoxAll=All Boxes -Main.Menu_PopoutBoxSingle=Single Box -Main.Menu_Redo=Redo Last Change -Main.Menu_Report=Box Data Report -Main.Menu_Save=Save PKM... -Main.Menu_Settings=Settings -Main.Menu_Showdown=Showdown -Main.Menu_ShowdownExportCurrentBox=Export Current Box to Clipboard -Main.Menu_ShowdownExportParty=Export Party to Clipboard -Main.Menu_ShowdownExportPKM=Export Set to Clipboard -Main.Menu_ShowdownImportPKM=Import Set from Clipboard -Main.Menu_Tools=Tools -Main.Menu_Undo=Undo Last Change +Main.Menu_ExportSAV=&Export SAV... +Main.Menu_File=&File +Main.Menu_Folder=Open &Folder +Main.Menu_Language=&Language +Main.Menu_LoadBoxes=&Load Boxes +Main.Menu_MGDatabase=Mystery &Gift Database +Main.Menu_Open=&Open... +Main.Menu_Options=&Options +Main.Menu_PopoutBoxAll=&All Boxes +Main.Menu_PopoutBoxSingle=&Single Box +Main.Menu_Redo=&Redo Last Change +Main.Menu_Report=Box Data &Report +Main.Menu_Save=&Save PKM... +Main.Menu_Settings=&Settings +Main.Menu_Showdown=&Showdown +Main.Menu_ShowdownExportCurrentBox=Export Current &Box to Clipboard +Main.Menu_ShowdownExportParty=Export &Party to Clipboard +Main.Menu_ShowdownExportPKM=&Export Set to Clipboard +Main.Menu_ShowdownImportPKM=&Import Set from Clipboard +Main.Menu_Tools=&Tools +Main.Menu_Undo=&Undo Last Change Main.mnu_Delete=Delete Main.mnu_DeleteAll=Clear Main.mnu_DeleteClones=Clones diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index eba9256a2..00920567a 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=Mantener la Fecha (de encuentro) al LocalizedDescription.ReturnNoneIfEmptySearch=Salta la búsqueda si el usuario olvidó ingresar la especie/movimiento(s) en el criterio de búsqueda. LocalizedDescription.RNGFrameNotFound3=En la validación de legalidad, marcar Severidad si se detecta que la lógica de verificación de tramas RNG no encuentra una coincidencia. LocalizedDescription.RNGFrameNotFound4=En la validación de legalidad, marcar Severidad si se detecta que la lógica de verificación de tramas RNG no encuentra una coincidencia. +LocalizedDescription.SaveExportCheckUnsavedEntity=Comprueba si el Pokémon en el editor tiene cambios sin guardar antes de exportar el archivo de guardado. +LocalizedDescription.SaveExportForceSaveAs=Omite el aviso de sobrescritura al exportar un archivo de guardado, para usar siempre Guardar como... LocalizedDescription.SearchBackups=Cuando se carga contenido para la base de datos PKM, buscar entre los archivos de guardado de respaldo. LocalizedDescription.SearchExtraSaves=Cuando se carga contenido para la base de datos PKM, buscar entre OtherBackupPaths. LocalizedDescription.SearchExtraSavesDeep=Cuando se carga contenido para la base de datos PKM, buscar subcarpetas entre OtherBackupPaths. diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index b0f079d51..ea69f6a7a 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=Mantener la Fecha (de encuentro) al LocalizedDescription.ReturnNoneIfEmptySearch=Salta la búsqueda si el usuario olvidó ingresar la especie/movimiento(s) en el criterio de búsqueda. LocalizedDescription.RNGFrameNotFound3=En la validación de legalidad, marcar Severidad si se detecta que la lógica de verificación de tramas RNG no encuentra una coincidencia. LocalizedDescription.RNGFrameNotFound4=En la validación de legalidad, marcar Severidad si se detecta que la lógica de verificación de tramas RNG no encuentra una coincidencia. +LocalizedDescription.SaveExportCheckUnsavedEntity=Comprueba si el Pokémon en el editor tiene cambios sin guardar antes de exportar el archivo de guardado. +LocalizedDescription.SaveExportForceSaveAs=Omite el aviso de sobrescritura al exportar un archivo de guardado, para usar siempre Guardar como... LocalizedDescription.SearchBackups=Cuando se carga contenido para la base de datos PKM, buscar entre los archivos de guardado de respaldo. LocalizedDescription.SearchExtraSaves=Cuando se carga contenido para la base de datos PKM, buscar entre OtherBackupPaths. LocalizedDescription.SearchExtraSavesDeep=Cuando se carga contenido para la base de datos PKM, buscar subcarpetas entre OtherBackupPaths. diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index 17b30a868..7a49dd6c8 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=Retain the Met Date when transferri LocalizedDescription.ReturnNoneIfEmptySearch=Saute la recherche si l'utilisateur a oublié de saisir Espèce / Capacité(s) dans les critères de recherche. LocalizedDescription.RNGFrameNotFound3=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match for Generation 3 encounters. LocalizedDescription.RNGFrameNotFound4=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match for Generation 4 encounters. +LocalizedDescription.SaveExportCheckUnsavedEntity=Vérifie si le Pokémon dans l'éditeur a des modifications non enregistrées avant d'exporter le fichier de sauvegarde. +LocalizedDescription.SaveExportForceSaveAs=Ignore l'invite d'écrasement lors de l'exportation d'un fichier de sauvegarde, pour toujours utiliser Enregistrer sous... LocalizedDescription.SearchBackups=When loading content for the PKM Database, search within backup save files. LocalizedDescription.SearchExtraSaves=When loading content for the PKM Database, search within OtherBackupPaths. LocalizedDescription.SearchExtraSavesDeep=When loading content for the PKM Database, search subfolders within OtherBackupPaths. diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index 96a92c0a8..d3aca801f 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=Retain the Met Date when transferri LocalizedDescription.ReturnNoneIfEmptySearch=Salta il processo di ricerca se l'utente non ha inserito la Specie o le Mosse nei filtri di ricerca. LocalizedDescription.RNGFrameNotFound3=Forza una segnalazione di Legalità se la logica di controllo RNG non trova una corrispondenza. LocalizedDescription.RNGFrameNotFound4=Forza una segnalazione di Legalità se la logica di controllo RNG non trova una corrispondenza. +LocalizedDescription.SaveExportCheckUnsavedEntity=Controlla se il Pokémon nell'editor ha modifiche non salvate prima di esportare il file di salvataggio. +LocalizedDescription.SaveExportForceSaveAs=Salta la richiesta di sovrascrittura quando si esporta un file di salvataggio, per usare sempre Salva con nome... LocalizedDescription.SearchBackups=Cerca nei backup dei salvataggi quando carica il contenuto per il Database Pokémon. LocalizedDescription.SearchExtraSaves=Cerca in OtherBackupPaths quando carica il contenuto per il Database Pokémon. LocalizedDescription.SearchExtraSavesDeep=Cerca nelle sottocartelle di OtherBackupPaths quando carica il contenuto per il Database Pokémon. diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index f3f2ddc8a..a9c7b169f 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=4世代から5世代に送っ LocalizedDescription.ReturnNoneIfEmptySearch=ユーザーがポケモンや技の入力をしなかった場合、検索をスキップする。 LocalizedDescription.RNGFrameNotFound3=第3世代の乱数生成にはない個体が見つかった場合、正規チェックにフラグを立てる。 LocalizedDescription.RNGFrameNotFound4=第4世代の乱数生成にはない個体が見つかった場合、正規チェックにフラグを立てる。 +LocalizedDescription.SaveExportCheckUnsavedEntity=保存データをエクスポートする前に、エディター内のポケモンに未保存の変更があるか確認します。 +LocalizedDescription.SaveExportForceSaveAs=保存データのエクスポート時に上書き確認を表示せず、常に「名前を付けて保存...」を使用します。 LocalizedDescription.SearchBackups=When loading content for the PKM Database, search within backup save files. LocalizedDescription.SearchExtraSaves=When loading content for the PKM Database, search within OtherBackupPaths. LocalizedDescription.SearchExtraSavesDeep=When loading content for the PKM Database, search subfolders within OtherBackupPaths. diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index ce421eedf..2e639f400 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=Retain the Met Date when transferri LocalizedDescription.ReturnNoneIfEmptySearch=Skips searching if the user forgot to enter Species / Move(s) into the search criteria. LocalizedDescription.RNGFrameNotFound3=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match for Generation 3 encounters. LocalizedDescription.RNGFrameNotFound4=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match for Generation 4 encounters. +LocalizedDescription.SaveExportCheckUnsavedEntity=세이브 파일을 내보내기 전에 편집기에서 포켓몬에 저장되지 않은 변경 사항이 있는지 확인합니다. +LocalizedDescription.SaveExportForceSaveAs=세이브 파일을 내보낼 때 덮어쓰기 확인을 건너뛰어 항상 다른 이름으로 저장...을 사용합니다. LocalizedDescription.SearchBackups=When loading content for the PKM Database, search within backup save files. LocalizedDescription.SearchExtraSaves=When loading content for the PKM Database, search within OtherBackupPaths. LocalizedDescription.SearchExtraSavesDeep=When loading content for the PKM Database, search subfolders within OtherBackupPaths. diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index 99c0a1fe0..32a564756 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=在从第4代转移到第5代时保 LocalizedDescription.ReturnNoneIfEmptySearch=如果用户忘记在搜索条件中输入种类/招式,则跳过搜索。 LocalizedDescription.RNGFrameNotFound3=如果 RNG 帧检查逻辑未找到第3代遭遇的匹配项,则标记合法性检查的严重性。 LocalizedDescription.RNGFrameNotFound4=如果 RNG 帧检查逻辑未找到第4代遭遇的匹配项,则标记合法性检查的严重性。 +LocalizedDescription.SaveExportCheckUnsavedEntity=在导出存档文件之前,检查编辑器中的宝可梦是否有未保存的更改。 +LocalizedDescription.SaveExportForceSaveAs=导出存档文件时跳过覆盖提示,始终使用“另存为...”。 LocalizedDescription.SearchBackups=当加载 PKM 数据库内容时,包含其他备份储存资料档案。 LocalizedDescription.SearchExtraSaves=当加载 PKM数据库属性时,包含其他备份路径内档案。 LocalizedDescription.SearchExtraSavesDeep=当加载 PKM 数据库内容时,包含其他备份路径内子资料夹。 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index 73c226709..e7f14a023 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=Retain the Met Date when transferri LocalizedDescription.ReturnNoneIfEmptySearch=Skips searching if the user forgot to enter Species / Move(s) into the search criteria. LocalizedDescription.RNGFrameNotFound3=RNG幀匹配度合法性檢查等級。 LocalizedDescription.RNGFrameNotFound4=RNG幀匹配度合法性檢查等級。 +LocalizedDescription.SaveExportCheckUnsavedEntity=在匯出儲存資料檔之前,檢查編輯器中的寶可夢是否有未儲存的變更。 +LocalizedDescription.SaveExportForceSaveAs=匯出儲存資料檔時跳過覆寫提示,始終使用「另存為...」。 LocalizedDescription.SearchBackups=當加載 PKM 數據庫内容時,包含其他備份儲存資料檔案 LocalizedDescription.SearchExtraSaves=當加載 PKM 數據庫内容時,包含其他備份路徑内檔案 LocalizedDescription.SearchExtraSavesDeep=當加載 PKM 數據庫内容時,包含其他備份路徑内子資料夾 diff --git a/PKHeX.WinForms/Subforms/SAV_FolderList.Designer.cs b/PKHeX.WinForms/Subforms/SAV_FolderList.Designer.cs index f13d3a708..e64aba014 100644 --- a/PKHeX.WinForms/Subforms/SAV_FolderList.Designer.cs +++ b/PKHeX.WinForms/Subforms/SAV_FolderList.Designer.cs @@ -30,6 +30,8 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); FLP_Buttons = new System.Windows.Forms.FlowLayoutPanel(); TC_Tabs = new System.Windows.Forms.TabControl(); Tab_Recent = new System.Windows.Forms.TabPage(); @@ -54,7 +56,7 @@ private void InitializeComponent() FLP_Buttons.Location = new Point(0, 0); FLP_Buttons.Name = "FLP_Buttons"; FLP_Buttons.Padding = new System.Windows.Forms.Padding(3); - FLP_Buttons.Size = new Size(601, 331); + FLP_Buttons.Size = new Size(616, 331); FLP_Buttons.TabIndex = 0; // // TC_Tabs @@ -86,6 +88,8 @@ private void InitializeComponent() dgDataRecent.AllowUserToOrderColumns = true; dgDataRecent.AllowUserToResizeColumns = false; dgDataRecent.AllowUserToResizeRows = false; + dataGridViewCellStyle1.BackColor = SystemColors.ControlLight; + dgDataRecent.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1; dgDataRecent.ClipboardCopyMode = System.Windows.Forms.DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText; dgDataRecent.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; dgDataRecent.Dock = System.Windows.Forms.DockStyle.Fill; @@ -102,7 +106,7 @@ private void InitializeComponent() Tab_Backup.Controls.Add(dgDataBackup); Tab_Backup.Location = new Point(4, 26); Tab_Backup.Name = "Tab_Backup"; - Tab_Backup.Size = new Size(601, 331); + Tab_Backup.Size = new Size(616, 331); Tab_Backup.TabIndex = 2; Tab_Backup.Text = "Backups"; Tab_Backup.UseVisualStyleBackColor = true; @@ -114,13 +118,15 @@ private void InitializeComponent() dgDataBackup.AllowUserToOrderColumns = true; dgDataBackup.AllowUserToResizeColumns = false; dgDataBackup.AllowUserToResizeRows = false; + dataGridViewCellStyle2.BackColor = SystemColors.ControlLight; + dgDataBackup.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle2; dgDataBackup.ClipboardCopyMode = System.Windows.Forms.DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText; dgDataBackup.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; dgDataBackup.Dock = System.Windows.Forms.DockStyle.Fill; dgDataBackup.Location = new Point(0, 0); dgDataBackup.Name = "dgDataBackup"; dgDataBackup.RowHeadersVisible = false; - dgDataBackup.Size = new Size(601, 331); + dgDataBackup.Size = new Size(616, 331); dgDataBackup.TabIndex = 1; dgDataBackup.CellMouseDown += DataGridCellMouseDown; // @@ -129,7 +135,7 @@ private void InitializeComponent() Tab_Folders.Controls.Add(FLP_Buttons); Tab_Folders.Location = new Point(4, 26); Tab_Folders.Name = "Tab_Folders"; - Tab_Folders.Size = new Size(601, 331); + Tab_Folders.Size = new Size(616, 331); Tab_Folders.TabIndex = 0; Tab_Folders.Text = "Folders"; Tab_Folders.UseVisualStyleBackColor = true; @@ -160,12 +166,14 @@ private void InitializeComponent() Controls.Add(CB_FilterColumn); Controls.Add(TC_Tabs); Icon = Properties.Resources.Icon; + KeyPreview = true; MaximizeBox = false; MinimizeBox = false; MinimumSize = new Size(640, 400); Name = "SAV_FolderList"; StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; Text = "Folder List"; + KeyDown += OnKeyDown; TC_Tabs.ResumeLayout(false); Tab_Recent.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)dgDataRecent).EndInit(); diff --git a/PKHeX.WinForms/Subforms/SAV_FolderList.cs b/PKHeX.WinForms/Subforms/SAV_FolderList.cs index 874c9fa39..da1a16751 100644 --- a/PKHeX.WinForms/Subforms/SAV_FolderList.cs +++ b/PKHeX.WinForms/Subforms/SAV_FolderList.cs @@ -72,6 +72,13 @@ public SAV_FolderList(Action openSaveFile) } } + private void OnKeyDown(object sender, KeyEventArgs e) + { + // Quick close with Ctrl+W + if (e.KeyCode == Keys.W && ModifierKeys == Keys.Control) + Close(); + } + private static List GetPathList(IReadOnlyList drives, string backupPath) { List locs = diff --git a/PKHeX.WinForms/Util/DialogUtil.cs b/PKHeX.WinForms/Util/DialogUtil.cs index f3de700fa..9a815fd7d 100644 --- a/PKHeX.WinForms/Util/DialogUtil.cs +++ b/PKHeX.WinForms/Util/DialogUtil.cs @@ -65,8 +65,8 @@ public DualDiffSelection SelectNewOld(string file, string asNew, string asOld) public DialogResult RequestOverwrite(string exist) { - var taskButtonOverwrite = new TaskDialogCommandLinkButton(MessageStrings.MsgDialogFileOverwrite) { AllowCloseDialog = true }; - var taskButtonSelect = new TaskDialogCommandLinkButton(MessageStrings.MsgDialogFileSaveAs) { AllowCloseDialog = true }; + var taskButtonOverwrite = new TaskDialogButton(MessageStrings.MsgDialogFileOverwrite) { AllowCloseDialog = true }; + var taskButtonSelect = new TaskDialogButton(MessageStrings.MsgDialogFileSaveAs) { AllowCloseDialog = true }; var page = new TaskDialogPage { Caption = MessageStrings.MsgDialogFileSaveReplace, diff --git a/PKHeX.WinForms/Util/WinFormsUtil.cs b/PKHeX.WinForms/Util/WinFormsUtil.cs index f7ddbe5d9..912ae843b 100644 --- a/PKHeX.WinForms/Util/WinFormsUtil.cs +++ b/PKHeX.WinForms/Util/WinFormsUtil.cs @@ -387,11 +387,12 @@ private static void SaveBackup(string path) /// Control to anchor dialog to. /// to be saved. /// Box the player will be greeted with when accessing the PC in-game. + /// Whether to force the Save As dialog even if the file exists. /// True if the file was saved. - public static bool ExportSAVDialog(Control c, SaveFile sav, int currentBox = 0) + public static bool ExportSAVDialog(Control c, SaveFile sav, int currentBox = 0, bool forceSaveAs = false) { // Try to request an overwrite first; if they defer, do the save file dialog. - if (!sav.Metadata.IsBackup && File.Exists(sav.Metadata.FilePath)) + if (!forceSaveAs && !sav.Metadata.IsBackup && File.Exists(sav.Metadata.FilePath)) { var exist = sav.Metadata.FilePath; var task = c.FindForm()!.RequestOverwrite(exist);