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