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);