From 52ed9177e36c0f13089d20f070f8c2bd86255169 Mon Sep 17 00:00:00 2001 From: Coki628 Date: Tue, 28 Apr 2026 21:09:52 +0800 Subject: [PATCH 01/81] Translation Improvement (#4797) * Swap Lapras and Snorlax in flags_gs_ja.txt * Swap Lapras and Snorlax in flags_c_ja.txt --- PKHeX.Core/Resources/text/script/gen2/flags_c_ja.txt | 4 ++-- PKHeX.Core/Resources/text/script/gen2/flags_gs_ja.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/PKHeX.Core/Resources/text/script/gen2/flags_c_ja.txt b/PKHeX.Core/Resources/text/script/gen2/flags_c_ja.txt index b4d2b2bbc..d236ccc6d 100644 --- a/PKHeX.Core/Resources/text/script/gen2/flags_c_ja.txt +++ b/PKHeX.Core/Resources/text/script/gen2/flags_c_ja.txt @@ -61,9 +61,9 @@ 0715 b メノクラゲのぬいぐるみ入手済(非正規) 0717 b きんのトロフィー入手済 0718 b ぎんのトロフィー入手済 -0719 b おっきなラプラス入手済 +0719 b おっきなカビゴン入手済 0720 b おっきなイワーク入手済 -0721 b おっきなカビゴン入手済 +0721 b おっきなラプラス入手済 0791 r ホウオウ戦闘済み 0792 r ルギア戦闘済み 0830 g なぞのタマゴ 受け取り済み diff --git a/PKHeX.Core/Resources/text/script/gen2/flags_gs_ja.txt b/PKHeX.Core/Resources/text/script/gen2/flags_gs_ja.txt index d558a6c0a..10cc0005c 100644 --- a/PKHeX.Core/Resources/text/script/gen2/flags_gs_ja.txt +++ b/PKHeX.Core/Resources/text/script/gen2/flags_gs_ja.txt @@ -57,9 +57,9 @@ 0715 b メノクラゲのぬいぐるみ入手済(非正規) 0717 b きんのトロフィー入手済 0718 b ぎんのトロフィー入手済 -0719 b おっきなラプラス入手済 +0719 b おっきなカビゴン入手済 0720 b おっきなイワーク入手済 -0721 b おっきなカビゴン入手済 +0721 b おっきなラプラス入手済 0791 r ホウオウ戦闘済み 0792 r ルギア戦闘済み 1904 r カビゴン戦闘済み From 67e5927bb3061413e787072bdf65f153e244ec46 Mon Sep 17 00:00:00 2001 From: Manu <52102823+Manu098vm@users.noreply.github.com> Date: Wed, 29 Apr 2026 05:10:15 +0200 Subject: [PATCH 02/81] Handle HOME Shiny Volcanion (#4798) * Server date * Only check for IV count if there's a specified Flawless value * Calculate Shiny XOR from the correct ID32 value * Do not require the legality checker to check for forced XOR 1 --- .../Legality/Encounters/Data/Live/EncounterServerDate.cs | 1 + PKHeX.Core/MysteryGifts/WA9.cs | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/PKHeX.Core/Legality/Encounters/Data/Live/EncounterServerDate.cs b/PKHeX.Core/Legality/Encounters/Data/Live/EncounterServerDate.cs index 3d47f25e4..12976089c 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Live/EncounterServerDate.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Live/EncounterServerDate.cs @@ -259,5 +259,6 @@ public static class EncounterServerDate {9031, new(2026, 04, 02)}, // Alpha Chikorita {9032, new(2026, 04, 02)}, // Alpha Tepig {9033, new(2026, 04, 02)}, // Alpha Totodile + {9034, new(2026, 04, 26)}, // Shiny Volcanion }; } diff --git a/PKHeX.Core/MysteryGifts/WA9.cs b/PKHeX.Core/MysteryGifts/WA9.cs index 33b1de1eb..3cc7aa77a 100644 --- a/PKHeX.Core/MysteryGifts/WA9.cs +++ b/PKHeX.Core/MysteryGifts/WA9.cs @@ -102,16 +102,17 @@ public override int Quantity private Shiny FixedShinyType() => GetShinyXor() switch { 0 => Shiny.AlwaysSquare, - <= 15 => Shiny.AlwaysStar, + <= 15 => Shiny.Always, _ => Shiny.Never, }; private uint GetShinyXor() { + var id32 = IsOldIDFormat ? ID32Old : ID32; // Player owned anti-shiny fixed PID - if (ID32 == 0) + if (id32 == 0) return uint.MaxValue; - return ShinyUtil.GetShinyXor(PID, ID32); + return ShinyUtil.GetShinyXor(PID, id32); } // When applying the ID32, the game sets the DisplayTID7 directly, then sets PA9.DisplaySID7 as (wa9.DisplaySID7 - wa9.CardID) @@ -702,7 +703,7 @@ public override bool IsMatchExact(PKM pk, EvoCriteria evo) if (pk is IAlphaReadOnly a && a.IsAlpha != IsAlpha) return true; - if (IsHOMEGift) + if (IsHOMEGift && FlawlessIVCount > 0) { if (pk.FlawlessIVCount != FlawlessIVCount) return false; // HOME ZA-starters have non-perfect IVs to 20, so IVs at 31 can't exceed the flawless count. From 6c409da5b15ba9a43db54069460b7cfd664e2f9c Mon Sep 17 00:00:00 2001 From: Kurt Date: Thu, 30 Apr 2026 22:58:02 -0500 Subject: [PATCH 03/81] Misc tweaks Extract gen3 default trash to trash class & folder remove erroneous mismatch parse add (should be a pure method) Set all purchased flags when shift is held Gen3 LeafGreen french name detection tweaks (both fr & lg contain `feu`) Gen4: Disable White Flute from boosting BugContest encounters --- .../Legality/RNG/ClassicEra/Gen4/MethodK.cs | 6 +- .../Legality/Verifiers/Misc/MiscVerifierG3.cs | 401 +---------------- PKHeX.Core/PKM/Strings/Trash/TrashTrainer3.cs | 410 ++++++++++++++++++ PKHeX.Core/Saves/Util/SaveLanguage.cs | 2 +- .../Subforms/PKM Editors/MoveShopEditor.cs | 1 + 5 files changed, 419 insertions(+), 401 deletions(-) create mode 100644 PKHeX.Core/PKM/Strings/Trash/TrashTrainer3.cs diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs index e562add07..fdb0467b9 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs @@ -525,16 +525,18 @@ private static bool IsBugContestPossibleDeadlock(uint areaRate, ref uint result) // The only entry into this method requires an ability that has no species available with Sweet Scent. // Therefore, without Sweet Scent, we need to trigger via turning/walking. // With an area rate of 25, this arrangement will succeed 37% of the time. + // However, White Flute cannot stay active as you cannot use it during a BCC, and entering the BCC has a screen transition (disabling it). // The game checks 2 random calls to trigger the encounter: movement -> rate -> generate. // HG/SS has an underflow error (via radio) which can pass the first rand call for movement. // Only need to check the second call for rate. // Rate can be improved by 50% if the White Flute is used. // Other abilities can also affect the rate, but we can't use them with our current lead. - var rate = areaRate + (areaRate >> 1); // +50% White Flute + + // areaRate += (areaRate >> 1); // +50% White Flute var rand = (result >> 16); var roll = rand % 100; - if (roll >= rate) + if (roll >= areaRate) return false; // Skip backwards before the two calls. Valid encounter seed found. diff --git a/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierG3.cs b/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierG3.cs index d27dd845a..5d260c319 100644 --- a/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierG3.cs +++ b/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierG3.cs @@ -152,7 +152,7 @@ private static GameVersion IsDefaultTrainer(LegalityAnalysis data, PK3 pk, Span< var location = pk.MetLocation; var eggEncounter = data.EncounterOriginal.IsEgg; var isEgg = pk.IsEgg; - if (TrashByteRules3.IsTrashPatternDefaultTrainer(trash, version, language, gender)) + if (TrashTrainer3.IsPatternDefault(trash, version, language, gender)) { if (!eggEncounter || isEgg || EggHatchLocation3.IsValidMet3(location, version)) return version; @@ -169,7 +169,7 @@ private static GameVersion IsDefaultTrainer(LegalityAnalysis data, PK3 pk, Span< { if (hatchVersion == version) continue; // already checked. - if (!TrashByteRules3.IsTrashPatternDefaultTrainer(trash, hatchVersion, language, gender)) + if (!TrashTrainer3.IsPatternDefault(trash, hatchVersion, language, gender)) continue; // doesn't match this version's pattern, skip. // Ensure it can be hatched at a valid location for this version. Probably don't need to do this... @@ -226,11 +226,7 @@ private static bool IsNicknameLanguageEvolution(LegalityAnalysis data, ReadOnlyS { var chain = data.Info.EvoChainsAllGens.Gen3; if (chain.Length == 1) - { - // Hasn't evolved. - data.AddLine(GetInvalid(Trainer, TrashBytesMismatchInitial)); - return false; - } + return false; // Hasn't evolved. // Check if the nickname matches any pre-evolution on any language. // Skip head (current species), check pre-evolutions. @@ -323,395 +319,4 @@ public static bool IsTerminatedFFZero(ReadOnlySpan data, int preFill = 0) } return !data[first..].ContainsAnyExcept(0); } - - // TRASH BYTES: New Game Default OTs - // Default OT names in International (not JPN) Gen3 mainline R/S/E games memcpy exactly 7 chars then FF from the "default OT name" table, regardless of the entry's strlen. - // - Japanese has every default OT name padded with FF's (to strlen=6), and is thus not affected. - // - FireRed/LeafGreen uses different logic (Oak Speech) which writes until EOS (0xFF) then filling the rest with 0xFF (thus is entirely clean). - // Copied strings therefore contain "trash" from the next string entry encoded into the ROM's string table. - // Below is a list of possible (version, language, trash) default OTs, as initialized by the game. An `*` is used to denote the terminator, with the following chars from next entry. - - // Sequential entries are provided for documentation purposes; entries that result in no difference from a manually entered name are commented out. - // If it is a default name, it must match the associated gender; otherwise, it must have been manually entered for the other gender. - - // Potential optimization: Entries could be encoded into a single ulong via: - // 7 bytes trash, - // 1 byte: version (2bit) - gender (1bit), language (3bit). - // Then, a simple sorted-array lookup could quickly check presence via binary search (147 entries, 5 pivot checks). - // However, this is such a low-traffic method that such an optimization (sacrificing code documentation) isn't worth it. - - /// - /// Checks if the specified trash byte pattern matches a default trainer name pattern for the given game and . - /// - /// Default trainer names in certain Generation 3 Pokémon games may include trailing bytes ("trash") due to how names are stored in the game's ROM. - /// This method checks if the provided pattern matches any of these known default patterns for the specified version and language. - /// - public static bool IsTrashPatternDefaultTrainer(ReadOnlySpan trash, GameVersion version, LanguageID language, byte gender) => version switch - { - GameVersion.R => IsTrashPatternDefaultTrainerR(trash, language, gender), - GameVersion.S => IsTrashPatternDefaultTrainerS(trash, language, gender), - GameVersion.E => IsTrashPatternDefaultTrainerE(trash, language, gender), - _ => false, - }; - - /// - /// Default OT names present in based on the language of the game. - public static bool IsTrashPatternDefaultTrainerR(ReadOnlySpan trash, LanguageID language, byte gender) => language switch - { - LanguageID.English => trash switch - { - // [0xC6, 0xBB, 0xC8, 0xBE, 0xC9, 0xC8, 0xFF] => gender == 0, // LANDON* - [0xCE, 0xBF, 0xCC, 0xCC, 0xD3, 0xFF, 0xCD] => gender == 0, // TERRY*S - [0xCD, 0xBF, 0xCE, 0xC2, 0xFF, 0xCE, 0xC9] => gender == 0, // SETH*TO - [0xCE, 0xC9, 0xC7, 0xFF, 0xCE, 0xBF, 0xCC] => gender == 0, // TOM*TER - [0xCE, 0xBF, 0xCC, 0xCC, 0xBB, 0xFF, 0xC5] => gender == 1, // TERRA*K - [0xC5, 0xC3, 0xC7, 0xC7, 0xD3, 0xFF, 0xC8] => gender == 1, // KIMMY*N - // [0xC8, 0xC3, 0xBD, 0xC9, 0xC6, 0xBB, 0xFF] => gender == 1, // NICOLA* - [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xCE, 0xDC] => gender == 1, // SARA*Th - _ => false, - }, - LanguageID.French => trash switch - { - // [0xCE, 0xC2, 0xC3, 0xBF, 0xCC, 0xCC, 0xD3] => gender == 0, // THIERRY - // [0xCE, 0xC2, 0xC9, 0xC7, 0xBB, 0xCD, 0xFF] => gender == 0, // THOMAS* - // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xFF] => gender == 0, // DANIEL* - [0xCD, 0xBF, 0xBC, 0xFF, 0xCD, 0xC9, 0xC6] => gender == 0, // SEB*SOL - // [0xCD, 0xC9, 0xC6, 0xBF, 0xC8, 0xBF, 0xFF] => gender == 1, // SOLENE* - [0xBB, 0xC1, 0xC8, 0xBF, 0xCD, 0xFF, 0xBD] => gender == 1, // AGNES*C - // [0xBD, 0xC6, 0xBB, 0xC3, 0xCC, 0xBF, 0xFF] => gender == 1, // CLAIRE* - // [0xCD, 0xC9, 0xCA, 0xC2, 0xC3, 0xBF, 0xFF] => gender == 1, // SOPHIE* - _ => false, - }, - LanguageID.Italian => trash switch - { - // [0xC6, 0xBB, 0xC8, 0xBE, 0xC9, 0xC8, 0xFF] => gender == 0, // LANDON* - [0xC7, 0xBB, 0xCC, 0xBD, 0xC9, 0xFF, 0xCA] => gender == 0, // MARCO*P - [0xCA, 0xBB, 0xC9, 0xC6, 0xC9, 0xFF, 0xC6] => gender == 0, // PAOLO*L - [0xC6, 0xCF, 0xBD, 0xC3, 0xC9, 0xFF, 0xCE] => gender == 0, // LUCIO*T - // [0xCE, 0xBF, 0xCC, 0xBF, 0xCD, 0xBB, 0xFF] => gender == 1, // TERESA* - [0xBB, 0xC8, 0xC8, 0xC3, 0xBF, 0xFF, 0xBF] => gender == 1, // ANNIE*E - [0xBF, 0xC6, 0xC3, 0xCD, 0xBB, 0xFF, 0xCD] => gender == 1, // ELISA*S - [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xCB, 0xE9] => gender == 1, // SARA*Qu - _ => false, - }, - LanguageID.German => trash switch - { - // [0xCC, 0xC9, 0xC6, 0xBB, 0xC8, 0xBE, 0xFF] => gender == 0, // ROLAND* - // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xFF] => gender == 0, // DANIEL* - [0xC2, 0xBF, 0xC6, 0xC1, 0xBF, 0xFF, 0xC4] => gender == 0, // HELGE*J - [0xC4, 0xBB, 0xC8, 0xFF, 0xCA, 0xBF, 0xCE] => gender == 0, // JAN*PET - [0xCA, 0xBF, 0xCE, 0xCC, 0xBB, 0xFF, 0xCE] => gender == 1, // PETRA*T - [0xCE, 0xBB, 0xC8, 0xC4, 0xBB, 0xFF, 0xBB] => gender == 1, // TANJA*A - // [0xBB, 0xC8, 0xBE, 0xCC, 0xBF, 0xBB, 0xFF] => gender == 1, // ANDREA* - [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xBE, 0xDD] => gender == 1, // SARA*Di - _ => false, - }, - LanguageID.Spanish => trash switch - { - [0xCE, 0xBF, 0xCC, 0xBF, 0xC8, 0xFF, 0xCB] => gender == 0, // TEREN*Q - [0xCB, 0xCF, 0xC3, 0xC7, 0xC3, 0xFF, 0xCC] => gender == 0, // QUIMI*R - [0xCC, 0xCF, 0xC0, 0xC9, 0xFF, 0xBB, 0xCC] => gender == 0, // RUFO*AR - // [0xBB, 0xCC, 0xCE, 0xCF, 0xCC, 0xC9, 0xFF] => gender == 0, // ARTURO* - // [0xCE, 0xBF, 0xCC, 0xBF, 0xCD, 0xBB, 0xFF] => gender == 1, // TERESA* - // [0xCC, 0xBB, 0xCB, 0xCF, 0xBF, 0xC6, 0xFF] => gender == 1, // RAQUEL* - // [0xC7, 0xBB, 0xCC, 0xC3, 0xBB, 0xCF, 0xFF] => gender == 1, // MARIAU* - [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xBB, 0xE5] => gender == 1, // SARA*Aq - _ => false, - }, - _ => false, - }; - - /// - /// Default OT names present in based on the language of the game. - public static bool IsTrashPatternDefaultTrainerS(ReadOnlySpan trash, LanguageID language, byte gender) => language switch - { - LanguageID.English => trash switch - { - [0xCD, 0xBF, 0xBB, 0xC8, 0xFF, 0xCE, 0xBF] => gender == 0, // SEAN*TE - [0xCE, 0xBF, 0xCC, 0xCC, 0xD3, 0xFF, 0xCD] => gender == 0, // TERRY*S - [0xCD, 0xBF, 0xCE, 0xC2, 0xFF, 0xCE, 0xC9] => gender == 0, // SETH*TO - [0xCE, 0xC9, 0xC7, 0xFF, 0xC7, 0xBB, 0xCC] => gender == 0, // TOM*MAR - // [0xC7, 0xBB, 0xCC, 0xC3, 0xC8, 0xBB, 0xFF] => gender == 1, // MARINA* - [0xC5, 0xC3, 0xC7, 0xC7, 0xD3, 0xFF, 0xC8] => gender == 1, // KIMMY*N - // [0xC8, 0xC3, 0xBD, 0xC9, 0xC6, 0xBB, 0xFF] => gender == 1, // NICOLA* - [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xCE, 0xDC] => gender == 1, // SARA*Th - _ => false, - }, - LanguageID.French => trash switch - { - // [0xC7, 0xBB, 0xCC, 0xCE, 0xC3, 0xBB, 0xC6] => gender == 0, // MARTIAL - // [0xCE, 0xC2, 0xC9, 0xC7, 0xBB, 0xCD, 0xFF] => gender == 0, // THOMAS* - // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xFF] => gender == 0, // DANIEL* - [0xCD, 0xBF, 0xBC, 0xFF, 0xC7, 0xBB, 0xCC] => gender == 0, // SEB*MAR - // [0xC7, 0xBB, 0xCC, 0xC3, 0xC8, 0xBF, 0xFF] => gender == 1, // MARINE* - [0xBB, 0xC1, 0xC8, 0xBF, 0xCD, 0xFF, 0xBD] => gender == 1, // AGNES*C - // [0xBD, 0xC6, 0xBB, 0xC3, 0xCC, 0xBF, 0xFF] => gender == 1, // CLAIRE* - // [0xCD, 0xC9, 0xCA, 0xC2, 0xC3, 0xBF, 0xFF] => gender == 1, // SOPHIE* - _ => false, - }, - LanguageID.Italian => trash switch - { - // [0xC7, 0xBB, 0xCC, 0xCE, 0xC3, 0xC8, 0xFF] => gender == 0, // MARTIN* - [0xC7, 0xBB, 0xCC, 0xBD, 0xC9, 0xFF, 0xCA] => gender == 0, // MARCO*P - [0xCA, 0xBB, 0xC9, 0xC6, 0xC9, 0xFF, 0xC6] => gender == 0, // PAOLO*L - [0xC6, 0xCF, 0xBD, 0xC3, 0xC9, 0xFF, 0xC7] => gender == 0, // LUCIO*M - // [0xC7, 0xBB, 0xCC, 0xC3, 0xC8, 0xBB, 0xFF] => gender == 1, // MARINA* - [0xBB, 0xC8, 0xC8, 0xC3, 0xBF, 0xFF, 0xBF] => gender == 1, // ANNIE*E - [0xBF, 0xC6, 0xC3, 0xCD, 0xBB, 0xFF, 0xCD] => gender == 1, // ELISA*S - [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xCB, 0xE9] => gender == 1, // SARA*Qu - _ => false, - }, - LanguageID.German => trash switch - { - // [0xCD, 0xBF, 0xBC, 0xC9, 0xC6, 0xBE, 0xFF] => gender == 0, // SEBOLD* - // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xFF] => gender == 0, // DANIEL* - [0xC2, 0xBF, 0xC6, 0xC1, 0xBF, 0xFF, 0xC4] => gender == 0, // HELGE*J - [0xC4, 0xBB, 0xC8, 0xFF, 0xC7, 0xBB, 0xCC] => gender == 0, // JAN*MAR - // [0xC7, 0xBB, 0xCC, 0xCE, 0xC3, 0xC8, 0xBB] => gender == 1, // MARTINA - [0xCE, 0xBB, 0xC8, 0xC4, 0xBB, 0xFF, 0xBB] => gender == 1, // TANJA*A - // [0xBB, 0xC8, 0xBE, 0xCC, 0xBF, 0xBB, 0xFF] => gender == 1, // ANDREA* - [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xBE, 0xDD] => gender == 1, // SARA*Di - _ => false, - }, - LanguageID.Spanish => trash switch - { - // [0xC7, 0xBB, 0xCC, 0xC3, 0xC8, 0xC9, 0xFF] => gender == 0, // MARINO* - [0xCB, 0xCF, 0xC3, 0xC7, 0xC3, 0xFF, 0xCC] => gender == 0, // QUIMI*R - [0xCC, 0xCF, 0xC0, 0xC9, 0xFF, 0xBB, 0xCC] => gender == 0, // RUFO*AR - // [0xBB, 0xCC, 0xCE, 0xCF, 0xCC, 0xC9, 0xFF] => gender == 0, // ARTURO* - // [0xC7, 0xBB, 0xCC, 0xC3, 0xC8, 0xBB, 0xFF] => gender == 1, // MARINA* - // [0xCC, 0xBB, 0xCB, 0xCF, 0xBF, 0xC6, 0xFF] => gender == 1, // RAQUEL* - // [0xC7, 0xBB, 0xCC, 0xC3, 0xBB, 0xCF, 0xFF] => gender == 1, // MARIAU* - [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xBB, 0xE5] => gender == 1, // SARA*Aq - _ => false, - }, - _ => false, - }; - - /// - /// Default OT names present in based on the language of the game. - public static bool IsTrashPatternDefaultTrainerE(ReadOnlySpan trash, LanguageID language, byte gender) => language switch - { - LanguageID.English => trash switch - { - [0xCD, 0xCE, 0xCF, 0xFF, 0xC7, 0xC3, 0xC6] => gender == 0, // STU*MIL - // [0xC7, 0xC3, 0xC6, 0xCE, 0xC9, 0xC8, 0xFF] => gender == 0, // MILTON* - [0xCE, 0xC9, 0xC7, 0xFF, 0xC5, 0xBF, 0xC8] => gender == 0, // TOM*KEN - [0xC5, 0xBF, 0xC8, 0xC8, 0xD3, 0xFF, 0xCC] => gender == 0, // KENNY*R - [0xCC, 0xBF, 0xC3, 0xBE, 0xFF, 0xC4, 0xCF] => gender == 0, // REID*JU - [0xC4, 0xCF, 0xBE, 0xBF, 0xFF, 0xC4, 0xBB] => gender == 0, // JUDE*JA - // [0xC4, 0xBB, 0xD2, 0xCD, 0xC9, 0xC8, 0xFF] => gender == 0, // JAXSON* - // [0xBF, 0xBB, 0xCD, 0xCE, 0xC9, 0xC8, 0xFF] => gender == 0, // EASTON* - // [0xD1, 0xBB, 0xC6, 0xC5, 0xBF, 0xCC, 0xFF] => gender == 0, // WALKER* - [0xCE, 0xBF, 0xCC, 0xCF, 0xFF, 0xC4, 0xC9] => gender == 0, // TERU*JO - // [0xC4, 0xC9, 0xC2, 0xC8, 0xC8, 0xD3, 0xFF] => gender == 0, // JOHNNY* - [0xBC, 0xCC, 0xBF, 0xCE, 0xCE, 0xFF, 0xCD] => gender == 0, // BRETT*S - [0xCD, 0xBF, 0xCE, 0xC2, 0xFF, 0xCE, 0xBF] => gender == 0, // SETH*TE - [0xCE, 0xBF, 0xCC, 0xCC, 0xD3, 0xFF, 0xBD] => gender == 0, // TERRY*C - [0xBD, 0xBB, 0xCD, 0xBF, 0xD3, 0xFF, 0xBE] => gender == 0, // CASEY*D - // [0xBE, 0xBB, 0xCC, 0xCC, 0xBF, 0xC8, 0xFF] => gender == 0, // DARREN* - // [0xC6, 0xBB, 0xC8, 0xBE, 0xC9, 0xC8, 0xFF] => gender == 0, // LANDON* - // [0xBD, 0xC9, 0xC6, 0xC6, 0xC3, 0xC8, 0xFF] => gender == 0, // COLLIN* - // [0xCD, 0xCE, 0xBB, 0xC8, 0xC6, 0xBF, 0xD3] => gender == 0, // STANLEY - // [0xCB, 0xCF, 0xC3, 0xC8, 0xBD, 0xD3, 0xFF] => gender == 0, // QUINCY* - [0xC5, 0xC3, 0xC7, 0xC7, 0xD3, 0xFF, 0xCE] => gender == 1, // KIMMY*T - [0xCE, 0xC3, 0xBB, 0xCC, 0xBB, 0xFF, 0xBC] => gender == 1, // TIARA*B - [0xBC, 0xBF, 0xC6, 0xC6, 0xBB, 0xFF, 0xC4] => gender == 1, // BELLA*J - [0xC4, 0xBB, 0xD3, 0xC6, 0xBB, 0xFF, 0xBB] => gender == 1, // JAYLA*A - [0xBB, 0xC6, 0xC6, 0xC3, 0xBF, 0xFF, 0xC6] => gender == 1, // ALLIE*L - // [0xC6, 0xC3, 0xBB, 0xC8, 0xC8, 0xBB, 0xFF] => gender == 1, // LIANNA* - [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xC7, 0xC9] => gender == 1, // SARA*MO - // [0xC7, 0xC9, 0xC8, 0xC3, 0xBD, 0xBB, 0xFF] => gender == 1, // MONICA* - // [0xBD, 0xBB, 0xC7, 0xC3, 0xC6, 0xBB, 0xFF] => gender == 1, // CAMILA* - // [0xBB, 0xCF, 0xBC, 0xCC, 0xBF, 0xBF, 0xFF] => gender == 1, // AUBREE* - // [0xCC, 0xCF, 0xCE, 0xC2, 0xC3, 0xBF, 0xFF] => gender == 1, // RUTHIE* - [0xC2, 0xBB, 0xD4, 0xBF, 0xC6, 0xFF, 0xC8] => gender == 1, // HAZEL*N - // [0xC8, 0xBB, 0xBE, 0xC3, 0xC8, 0xBF, 0xFF] => gender == 1, // NADINE* - [0xCE, 0xBB, 0xC8, 0xC4, 0xBB, 0xFF, 0xD3] => gender == 1, // TANJA*Y - // [0xD3, 0xBB, 0xCD, 0xC7, 0xC3, 0xC8, 0xFF] => gender == 1, // YASMIN* - // [0xC8, 0xC3, 0xBD, 0xC9, 0xC6, 0xBB, 0xFF] => gender == 1, // NICOLA* - // [0xC6, 0xC3, 0xC6, 0xC6, 0xC3, 0xBF, 0xFF] => gender == 1, // LILLIE* - [0xCE, 0xBF, 0xCC, 0xCC, 0xBB, 0xFF, 0xC6] => gender == 1, // TERRA*L - [0xC6, 0xCF, 0xBD, 0xD3, 0xFF, 0xC2, 0xBB] => gender == 1, // LUCY*HA - [0xC2, 0xBB, 0xC6, 0xC3, 0xBF, 0xFF, 0xCE] => gender == 1, // HALIE*T - _ => false, - }, - LanguageID.French => trash switch - { - [0xCD, 0xCE, 0xBF, 0xC0, 0xFF, 0xC7, 0xBB] => gender == 0, // STEF*MA - // [0xC7, 0xBB, 0xC8, 0xCF, 0xBF, 0xC6, 0xFF] => gender == 0, // MANUEL* - [0xCD, 0xBF, 0xBC, 0xFF, 0xC1, 0xD1, 0xBF] => gender == 0, // SEB*GWE - [0xC1, 0xD1, 0xBF, 0xC8, 0xC8, 0xFF, 0xBB] => gender == 0, // GWENN*A - [0xBB, 0xCC, 0xC8, 0xC9, 0xFF, 0xC4, 0xCF] => gender == 0, // ARNO*JU - [0xC4, 0xCF, 0xC6, 0xBF, 0xCD, 0xFF, 0xC4] => gender == 0, // JULES*J - // [0xC4, 0xC9, 0xC2, 0xBB, 0xC8, 0xC8, 0xFF] => gender == 0, // JOHANN* - // [0xCE, 0xC2, 0xC3, 0xBC, 0xBB, 0xCF, 0xBE] => gender == 0, // THIBAUD - [0xBB, 0xC6, 0xBF, 0xBD, 0xFF, 0xC1, 0xC3] => gender == 0, // ALEC*GI - [0xC1, 0xC3, 0xBC, 0xCF, 0xCD, 0xFF, 0xC4] => gender == 0, // GIBUS*J - // [0xC4, 0xC9, 0xC2, 0xC8, 0xC8, 0xD3, 0xFF] => gender == 0, // JOHNNY* - // [0xC0, 0xBB, 0xBC, 0xCC, 0xC3, 0xBD, 0xBF] => gender == 0, // FABRICE - // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xFF] => gender == 0, // DANIEL* - // [0xCE, 0xC2, 0xC9, 0xC7, 0xBB, 0xCD, 0xFF] => gender == 0, // THOMAS* - [0xC1, 0xBB, 0xCC, 0xD3, 0xFF, 0xCC, 0xCF] => gender == 0, // GARY*RU - [0xCC, 0xCF, 0xBE, 0xBE, 0xD3, 0xFF, 0xCE] => gender == 0, // RUDDY*T - // [0xCE, 0xC2, 0xC3, 0xBF, 0xCC, 0xCC, 0xD3] => gender == 0, // THIERRY - [0xBD, 0xC9, 0xC6, 0xC3, 0xC8, 0xFF, 0xCD] => gender == 0, // COLIN*S - [0xCD, 0xCE, 0xBB, 0xC8, 0xFF, 0xCD, 0xBF] => gender == 0, // STAN*SE - // [0xCD, 0xBF, 0xD0, 0xBF, 0xCC, 0xC3, 0xC8] => gender == 0, // SEVERIN - [0xBB, 0xC1, 0xC8, 0xBF, 0xCD, 0xFF, 0xBB] => gender == 1, // AGNES*A - // [0xBB, 0xCC, 0xC3, 0xBB, 0xC8, 0xBF, 0xFF] => gender == 1, // ARIANE* - [0xBC, 0xBF, 0xC6, 0xC6, 0xBB, 0xFF, 0xC7] => gender == 1, // BELLA*M - [0xC7, 0xBB, 0xBF, 0xD0, 0xBB, 0xFF, 0xCA] => gender == 1, // MAEVA*P - // [0xCA, 0xBB, 0xCF, 0xC6, 0xC3, 0xC8, 0xBF] => gender == 1, // PAULINE - [0xBD, 0xC3, 0xC8, 0xBE, 0xD3, 0xFF, 0xCD] => gender == 1, // CINDY*S - // [0xCD, 0xC9, 0xCA, 0xC2, 0xC3, 0xBF, 0xFF] => gender == 1, // SOPHIE* - // [0xC7, 0xC9, 0xC8, 0xC3, 0xBD, 0xBB, 0xFF] => gender == 1, // MONICA* - [0xBD, 0xBB, 0xCE, 0xC2, 0xD3, 0xFF, 0xC0] => gender == 1, // CATHY*F - [0xC0, 0xBB, 0xC8, 0xC8, 0xD3, 0xFF, 0xCC] => gender == 1, // FANNY*R - // [0xCC, 0xC9, 0xD2, 0xBB, 0xC8, 0xBF, 0xFF] => gender == 1, // ROXANE* - [0xBF, 0xBE, 0xC3, 0xCE, 0xC2, 0xFF, 0xC8] => gender == 1, // EDITH*N - // [0xC8, 0xBB, 0xBE, 0xC3, 0xC8, 0xBF, 0xFF] => gender == 1, // NADINE* - [0xCE, 0xBB, 0xC8, 0xC3, 0xBB, 0xFF, 0xC4] => gender == 1, // TANIA*J - // [0xC4, 0xBB, 0xC8, 0xD3, 0xBD, 0xBF, 0xFF] => gender == 1, // JANYCE* - // [0xBD, 0xC6, 0xBB, 0xC3, 0xCC, 0xBF, 0xFF] => gender == 1, // CLAIRE* - [0xC6, 0xC3, 0xC6, 0xC6, 0xD3, 0xFF, 0xCD] => gender == 1, // LILLY*S - // [0xCD, 0xC9, 0xC6, 0xBF, 0xC8, 0xBF, 0xFF] => gender == 1, // SOLENE* - // [0xBD, 0xD3, 0xC8, 0xCE, 0xC2, 0xC3, 0xBB] => gender == 1, // CYNTHIA - [0xC7, 0xBB, 0xCF, 0xBE, 0xFF, 0xD0, 0xE3] => gender == 1, // MAUD*Vo - _ => false, - }, - LanguageID.Italian => trash switch - { - // [0xC0, 0xCC, 0xBB, 0xC8, 0xBD, 0xD3, 0xFF] => gender == 0, // FRANCY* - // [0xC1, 0xC3, 0xC9, 0xCC, 0xC1, 0xC3, 0xC9] => gender == 0, // GIORGIO - [0xC6, 0xCF, 0xBD, 0xC3, 0xC9, 0xFF, 0xC0] => gender == 0, // LUCIO*F - [0xC0, 0xBB, 0xBC, 0xD3, 0xFF, 0xBB, 0xC8] => gender == 0, // FABY*AN - // [0xBB, 0xC8, 0xBE, 0xCC, 0xBF, 0xBB, 0xFF] => gender == 0, // ANDREA* - // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xBF] => gender == 0, // DANIELE - // [0xC7, 0xC3, 0xBD, 0xC2, 0xBF, 0xC6, 0xBF] => gender == 0, // MICHELE - [0xCC, 0xBF, 0xC8, 0xD4, 0xC9, 0xFF, 0xBF] => gender == 0, // RENZO*E - // [0xBF, 0xCF, 0xC1, 0xBF, 0xC8, 0xC3, 0xC9] => gender == 0, // EUGENIO - [0xBF, 0xC6, 0xC3, 0xBB, 0xFF, 0xCD, 0xBB] => gender == 0, // ELIA*SA - // [0xCD, 0xBB, 0xC8, 0xBE, 0xCC, 0xC9, 0xFF] => gender == 0, // SANDRO* - // [0xCA, 0xC3, 0xBF, 0xCE, 0xCC, 0xC9, 0xFF] => gender == 0, // PIETRO* - [0xCA, 0xBB, 0xC9, 0xC6, 0xC9, 0xFF, 0xC7] => gender == 0, // PAOLO*M - [0xC7, 0xBB, 0xCC, 0xBD, 0xC9, 0xFF, 0xBB] => gender == 0, // MARCO*A - // [0xBB, 0xC6, 0xBC, 0xBF, 0xCC, 0xCE, 0xC9] => gender == 0, // ALBERTO - // [0xC0, 0xC3, 0xC6, 0xC3, 0xCA, 0xCA, 0xC9] => gender == 0, // FILIPPO - // [0xC6, 0xBB, 0xC8, 0xBE, 0xC9, 0xC8, 0xFF] => gender == 0, // LANDON* - [0xC1, 0xC3, 0xC8, 0xC9, 0xFF, 0xBD, 0xBF] => gender == 0, // GINO*CE - [0xBD, 0xBF, 0xBD, 0xBD, 0xC9, 0xFF, 0xC7] => gender == 0, // CECCO*M - [0xC7, 0xBB, 0xCC, 0xC3, 0xC9, 0xFF, 0xBB] => gender == 0, // MARIO*A - [0xBB, 0xC8, 0xC8, 0xC3, 0xBF, 0xFF, 0xBD] => gender == 1, // ANNIE*C - [0xBD, 0xBB, 0xCE, 0xC3, 0xBB, 0xFF, 0xBC] => gender == 1, // CATIA*B - [0xBC, 0xBF, 0xC6, 0xC6, 0xBB, 0xFF, 0xCA] => gender == 1, // BELLA*P - [0xCA, 0xBB, 0xC9, 0xC6, 0xBB, 0xFF, 0xC6] => gender == 1, // PAOLA*L - [0xC6, 0xCF, 0xC3, 0xCD, 0xBB, 0xFF, 0xC1] => gender == 1, // LUISA*G - // [0xC1, 0xCC, 0xBB, 0xD4, 0xC3, 0xBB, 0xFF] => gender == 1, // GRAZIA* - [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xC7, 0xC9] => gender == 1, // SARA*MO - // [0xC7, 0xC9, 0xC8, 0xC3, 0xBD, 0xBB, 0xFF] => gender == 1, // MONICA* - [0xC7, 0xBB, 0xCC, 0xCE, 0xBB, 0xFF, 0xCA] => gender == 1, // MARTA*P - [0xCA, 0xC3, 0xBB, 0xFF, 0xCC, 0xC3, 0xCE] => gender == 1, // PIA*RIT - [0xCC, 0xC3, 0xCE, 0xBB, 0xFF, 0xBF, 0xCC] => gender == 1, // RITA*ER - [0xBF, 0xCC, 0xC3, 0xBD, 0xBB, 0xFF, 0xCC] => gender == 1, // ERICA*R - [0xCC, 0xC9, 0xCD, 0xBB, 0xFF, 0xC7, 0xBF] => gender == 1, // ROSA*ME - // [0xC7, 0xBF, 0xC6, 0xC3, 0xCD, 0xCD, 0xBB] => gender == 1, // MELISSA - // [0xC7, 0xBB, 0xCC, 0xC3, 0xC8, 0xBB, 0xFF] => gender == 1, // MARINA* - [0xBF, 0xC6, 0xC3, 0xCD, 0xBB, 0xFF, 0xC6] => gender == 1, // ELISA*L - [0xC6, 0xC3, 0xC8, 0xBB, 0xFF, 0xCE, 0xBF] => gender == 1, // LINA*TE - // [0xCE, 0xBF, 0xCC, 0xBF, 0xCD, 0xBB, 0xFF] => gender == 1, // TERESA* - // [0xC6, 0xCF, 0xBD, 0xBF, 0xCE, 0xCE, 0xBB] => gender == 1, // LUCETTA - [0xC6, 0xCF, 0xBD, 0xC3, 0xBB, 0xFF, 0xCB] => gender == 1, // LUCIA*Q - _ => false, - }, - LanguageID.German => trash switch - { - // [0xCD, 0xCE, 0xBF, 0xC0, 0xBB, 0xC8, 0xFF] => gender == 0, // STEFAN* - // [0xC0, 0xC6, 0xC9, 0xCC, 0xC3, 0xBB, 0xC8] => gender == 0, // FLORIAN - [0xC4, 0xBB, 0xC8, 0xFF, 0xBF, 0xCC, 0xC3] => gender == 0, // JAN*ERI - [0xBF, 0xCC, 0xC3, 0xC5, 0xFF, 0xCE, 0xC2] => gender == 0, // ERIK*TH - // [0xCE, 0xC2, 0xC9, 0xC7, 0xBB, 0xCD, 0xFF] => gender == 0, // THOMAS* - // [0xC7, 0xBB, 0xCC, 0xCE, 0xC3, 0xC8, 0xFF] => gender == 0, // MARTIN* - // [0xC7, 0xBB, 0xCC, 0xC5, 0xCF, 0xCD, 0xFF] => gender == 0, // MARKUS* - [0xC5, 0xC6, 0xBB, 0xCF, 0xCD, 0xFF, 0xCA] => gender == 0, // KLAUS*P - [0xCA, 0xBB, 0xCF, 0xC6, 0xFF, 0xCC, 0xC9] => gender == 0, // PAUL*RO - [0xCC, 0xC9, 0xC6, 0xC0, 0xFF, 0xC4, 0xF2] => gender == 0, // ROLF*JÖ - [0xC4, 0xF2, 0xCC, 0xC1, 0xFF, 0xC2, 0xBB] => gender == 0, // JÖRG*HA - [0xC2, 0xBB, 0xC3, 0xC5, 0xC9, 0xFF, 0xC2] => gender == 0, // HAIKO*H - [0xC2, 0xBF, 0xC6, 0xC1, 0xBF, 0xFF, 0xBE] => gender == 0, // HELGE*D - // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xFF] => gender == 0, // DANIEL* - // [0xC7, 0xC3, 0xBD, 0xC2, 0xBB, 0xBF, 0xC6] => gender == 0, // MICHAEL - [0xBE, 0xBB, 0xD0, 0xC3, 0xBE, 0xFF, 0xCC] => gender == 0, // DAVID*R - // [0xCC, 0xC9, 0xC6, 0xBB, 0xC8, 0xBE, 0xFF] => gender == 0, // ROLAND* - // [0xC4, 0xC9, 0xC2, 0xBB, 0xC8, 0xC8, 0xFF] => gender == 0, // JOHANN* - // [0xBE, 0xC3, 0xBF, 0xCE, 0xBF, 0xCC, 0xFF] => gender == 0, // DIETER* - // [0xBB, 0xC8, 0xCD, 0xBF, 0xC6, 0xC7, 0xFF] => gender == 0, // ANSELM* - [0xCE, 0xBB, 0xC8, 0xC4, 0xBB, 0xFF, 0xC7] => gender == 1, // TANJA*M - // [0xC7, 0xC3, 0xCC, 0xC4, 0xBB, 0xC7, 0xFF] => gender == 1, // MIRJAM* - // [0xC7, 0xBB, 0xCC, 0xCE, 0xC3, 0xC8, 0xBB] => gender == 1, // MARTINA - [0xC4, 0xBB, 0xC7, 0xC3, 0xBF, 0xFF, 0xBD] => gender == 1, // JAMIE*C - // [0xBD, 0xBB, 0xCC, 0xC9, 0xC6, 0xC3, 0xC8] => gender == 1, // CAROLIN - // [0xCD, 0xC3, 0xC7, 0xC9, 0xC8, 0xBF, 0xFF] => gender == 1, // SIMONE* - [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xBD, 0xC6] => gender == 1, // SARA*CL - // [0xBD, 0xC6, 0xBB, 0xCF, 0xBE, 0xC3, 0xBB] => gender == 1, // CLAUDIA - // [0xC4, 0xBB, 0xCD, 0xC7, 0xC3, 0xC8, 0xFF] => gender == 1, // JASMIN* - // [0xBE, 0xBF, 0xC8, 0xC3, 0xCD, 0xBF, 0xFF] => gender == 1, // DENISE* - // [0xC5, 0xBB, 0xCE, 0xCC, 0xC3, 0xC8, 0xFF] => gender == 1, // KATRIN* - // [0xC5, 0xBF, 0xCC, 0xCD, 0xCE, 0xC3, 0xC8] => gender == 1, // KERSTIN - // [0xCD, 0xD0, 0xBF, 0xC8, 0xC4, 0xBB, 0xFF] => gender == 1, // SVENJA* - [0xBC, 0xBF, 0xBB, 0xCE, 0xBF, 0xFF, 0xC7] => gender == 1, // BEATE*M - [0xC7, 0xBF, 0xC3, 0xC5, 0xBF, 0xFF, 0xBB] => gender == 1, // MEIKE*A - // [0xBB, 0xC8, 0xBE, 0xCC, 0xBF, 0xBB, 0xFF] => gender == 1, // ANDREA* - [0xBF, 0xD0, 0xBB, 0xFF, 0xCA, 0xBF, 0xCE] => gender == 1, // EVA*PET - [0xCA, 0xBF, 0xCE, 0xCC, 0xBB, 0xFF, 0xC1] => gender == 1, // PETRA*G - [0xC1, 0xBB, 0xBC, 0xC3, 0xFF, 0xC8, 0xBB] => gender == 1, // GABI*NA - // [0xC8, 0xBB, 0xBE, 0xC3, 0xC8, 0xBF, 0xFF] => gender == 1, // NADINE* - _ => false, - }, - LanguageID.Spanish => trash switch - { - [0xBF, 0xC6, 0xBF, 0xC8, 0xC9, 0xFF, 0xC6] => gender == 0, // ELENO*L - [0xC6, 0xBB, 0xCC, 0xBF, 0xC9, 0xFF, 0xBB] => gender == 0, // LAREO*A - // [0xBB, 0xCC, 0xCE, 0xCF, 0xCC, 0xC9, 0xFF] => gender == 0, // ARTURO* - [0xBD, 0xBB, 0xCC, 0xC6, 0xC9, 0xFF, 0xC7] => gender == 0, // CARLO*M - [0xC7, 0xBB, 0xCF, 0xCC, 0xC3, 0xFF, 0xBE] => gender == 0, // MAURI*D - // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xFF] => gender == 0, // DANIEL* - // [0xC7, 0xBB, 0xCC, 0xBD, 0xBF, 0xC6, 0xC9] => gender == 0, // MARCELO - // [0xCC, 0xC9, 0xBC, 0xBF, 0xCC, 0xCE, 0xC9] => gender == 0, // ROBERTO - [0xBB, 0xC3, 0xCE, 0xC9, 0xCC, 0xFF, 0xC4] => gender == 0, // AITOR*J - [0xC4, 0xCF, 0xC6, 0xC3, 0xFF, 0xC8, 0xBB] => gender == 0, // JULI*NA - // [0xC8, 0xBB, 0xCC, 0xBD, 0xC3, 0xCD, 0xC9] => gender == 0, // NARCISO - [0xC6, 0xCF, 0xC3, 0xCD, 0xFF, 0xCC, 0xCF] => gender == 0, // LUIS*RU - [0xCC, 0xCF, 0xC0, 0xC9, 0xFF, 0xCB, 0xCF] => gender == 0, // RUFO*QU - [0xCB, 0xCF, 0xC3, 0xC7, 0xC3, 0xFF, 0xC4] => gender == 0, // QUIMI*J - // [0xC4, 0xBF, 0xCD, 0xCF, 0xCD, 0xC9, 0xFF] => gender == 0, // JESUSO* - [0xC7, 0xBB, 0xCC, 0xBD, 0xC9, 0xFF, 0xCE] => gender == 0, // MARCO*T - [0xCE, 0xBF, 0xCC, 0xBF, 0xC8, 0xFF, 0xC7] => gender == 0, // TEREN*M - [0xC7, 0xBB, 0xCC, 0xC3, 0xC9, 0xFF, 0xCA] => gender == 0, // MARIO*P - [0xCA, 0xBF, 0xBE, 0xCC, 0xC9, 0xFF, 0xBF] => gender == 0, // PEDRO*E - // [0xBF, 0xC8, 0xCC, 0xC3, 0xCB, 0xCF, 0xBF] => gender == 0, // ENRIQUE - // [0xCC, 0xBB, 0xCB, 0xCF, 0xBF, 0xC6, 0xFF] => gender == 1, // RAQUEL* - [0xBF, 0xC6, 0xBF, 0xC8, 0xBB, 0xFF, 0xCA] => gender == 1, // ELENA*P - [0xCA, 0xBB, 0xC6, 0xC7, 0xBB, 0xFF, 0xC6] => gender == 1, // PALMA*L - [0xC6, 0xBB, 0xCC, 0xBB, 0xFF, 0xBD, 0xBB] => gender == 1, // LARA*CA - // [0xBD, 0xBB, 0xCC, 0xC6, 0xC9, 0xCE, 0xBB] => gender == 1, // CARLOTA - [0xC7, 0xC9, 0xC8, 0xBB, 0xFF, 0xCD, 0xBB] => gender == 1, // MONA*SA - [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xBE, 0xBB] => gender == 1, // SARA*DA - // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xBB] => gender == 1, // DANIELA - // [0xC9, 0xC6, 0xC3, 0xC7, 0xCA, 0xC3, 0xBB] => gender == 1, // OLIMPIA - // [0xC7, 0xBB, 0xCC, 0xBD, 0xBF, 0xC6, 0xBB] => gender == 1, // MARCELA - // [0xCC, 0xC9, 0xBC, 0xBF, 0xCC, 0xCE, 0xBB] => gender == 1, // ROBERTA - // [0xBB, 0xCC, 0xBB, 0xC8, 0xBD, 0xC2, 0xBB] => gender == 1, // ARANCHA - // [0xC4, 0xCF, 0xC6, 0xC3, 0xBF, 0xCE, 0xBB] => gender == 1, // JULIETA - // [0xC8, 0xC9, 0xBF, 0xC6, 0xC3, 0xBB, 0xFF] => gender == 1, // NOELIA* - // [0xC6, 0xCF, 0xBD, 0xC3, 0xCE, 0xBB, 0xFF] => gender == 1, // LUCITA* - // [0xC7, 0xBB, 0xCC, 0xC3, 0xBB, 0xCF, 0xFF] => gender == 1, // MARIAU* - [0xCA, 0xBB, 0xC9, 0xC6, 0xBB, 0xFF, 0xCE] => gender == 1, // PAOLA*T - // [0xCE, 0xBF, 0xCC, 0xBF, 0xCD, 0xBB, 0xFF] => gender == 1, // TERESA* - [0xC8, 0xCF, 0xCC, 0xC3, 0xBB, 0xFF, 0xC6] => gender == 1, // NURIA*L - [0xC6, 0xC3, 0xC8, 0xBB, 0xFF, 0xBB, 0xE5] => gender == 1, // LINA*Aq - _ => false, - }, - _ => false, - }; } diff --git a/PKHeX.Core/PKM/Strings/Trash/TrashTrainer3.cs b/PKHeX.Core/PKM/Strings/Trash/TrashTrainer3.cs new file mode 100644 index 000000000..0be25ba17 --- /dev/null +++ b/PKHeX.Core/PKM/Strings/Trash/TrashTrainer3.cs @@ -0,0 +1,410 @@ +using System; +using static PKHeX.Core.GameVersion; +using static PKHeX.Core.LanguageID; + +namespace PKHeX.Core; + +/// +/// Provides methods for identifying and validating default "trash byte" patterns in original trainer (OT) names for Generation 3 Pokémon games. +/// +public static class TrashTrainer3 +{ + // TRASH BYTES: New Game Default OTs + // Default OT names in International (not JPN) Gen3 mainline R/S/E games memcpy exactly 7 chars then FF from the "default OT name" table, regardless of the entry's strlen. + // - Japanese has every default OT name padded with FF's (to strlen=6), and is thus not affected. + // - FireRed/LeafGreen uses different logic (Oak Speech) which writes until EOS (0xFF) then filling the rest with 0xFF (thus is entirely clean). + // Copied strings therefore contain "trash" from the next string entry encoded into the ROM's string table. + // Below is a list of possible (version, language, trash) default OTs, as initialized by the game. An `*` is used to denote the terminator, with the following chars from next entry. + + // Sequential entries are provided for documentation purposes; entries that result in no difference from a manually entered name are commented out. + // If it is a default name, it must match the associated gender; otherwise, it must have been manually entered for the other gender. + + // Potential optimization: Entries could be encoded into a single ulong via: + // 7 bytes trash, + // 1 byte: version (2bit) - gender (1bit), language (3bit). + // Then, a simple sorted-array lookup could quickly check presence via binary search (147 entries, 5 pivot checks). + // However, this is such a low-traffic method that such an optimization (sacrificing code documentation) isn't worth it. + + /// + /// Checks if the specified version and language can arise a default original trainer (OT) name trash byte pattern. + /// + /// The game version the Original Trainer is from. + /// The ROM language the Original Trainer is from. + /// if the input combination can have default OT trash byte patterns. + public static bool HasPatternDefault(GameVersion version, LanguageID language) => language != Japanese && version is (R or S or E); + + /// + /// Checks if the specified trash byte pattern matches a default trainer name pattern for the given game and . + /// + /// Default trainer names in certain Generation 3 Pokémon games may include trailing bytes ("trash") due to how names are stored in the game's ROM. + /// This method checks if the provided pattern matches any of these known default patterns for the specified version and language. + /// + public static bool IsPatternDefault(ReadOnlySpan trash, GameVersion version, LanguageID language, byte gender) => version switch + { + R => IsPatternDefaultR(trash, language, gender), + S => IsPatternDefaultS(trash, language, gender), + E => IsPatternDefaultE(trash, language, gender), + _ => false, + }; + + /// Default OT names present in based on the language of the game. + /// + public static bool IsPatternDefaultR(ReadOnlySpan trash, LanguageID language, byte gender) => language switch + { + English => trash switch + { + // [0xC6, 0xBB, 0xC8, 0xBE, 0xC9, 0xC8, 0xFF] => gender == 0, // LANDON* + [0xCE, 0xBF, 0xCC, 0xCC, 0xD3, 0xFF, 0xCD] => gender == 0, // TERRY*S + [0xCD, 0xBF, 0xCE, 0xC2, 0xFF, 0xCE, 0xC9] => gender == 0, // SETH*TO + [0xCE, 0xC9, 0xC7, 0xFF, 0xCE, 0xBF, 0xCC] => gender == 0, // TOM*TER + [0xCE, 0xBF, 0xCC, 0xCC, 0xBB, 0xFF, 0xC5] => gender == 1, // TERRA*K + [0xC5, 0xC3, 0xC7, 0xC7, 0xD3, 0xFF, 0xC8] => gender == 1, // KIMMY*N + // [0xC8, 0xC3, 0xBD, 0xC9, 0xC6, 0xBB, 0xFF] => gender == 1, // NICOLA* + [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xCE, 0xDC] => gender == 1, // SARA*Th + _ => false, + }, + French => trash switch + { + // [0xCE, 0xC2, 0xC3, 0xBF, 0xCC, 0xCC, 0xD3] => gender == 0, // THIERRY + // [0xCE, 0xC2, 0xC9, 0xC7, 0xBB, 0xCD, 0xFF] => gender == 0, // THOMAS* + // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xFF] => gender == 0, // DANIEL* + [0xCD, 0xBF, 0xBC, 0xFF, 0xCD, 0xC9, 0xC6] => gender == 0, // SEB*SOL + // [0xCD, 0xC9, 0xC6, 0xBF, 0xC8, 0xBF, 0xFF] => gender == 1, // SOLENE* + [0xBB, 0xC1, 0xC8, 0xBF, 0xCD, 0xFF, 0xBD] => gender == 1, // AGNES*C + // [0xBD, 0xC6, 0xBB, 0xC3, 0xCC, 0xBF, 0xFF] => gender == 1, // CLAIRE* + // [0xCD, 0xC9, 0xCA, 0xC2, 0xC3, 0xBF, 0xFF] => gender == 1, // SOPHIE* + _ => false, + }, + Italian => trash switch + { + // [0xC6, 0xBB, 0xC8, 0xBE, 0xC9, 0xC8, 0xFF] => gender == 0, // LANDON* + [0xC7, 0xBB, 0xCC, 0xBD, 0xC9, 0xFF, 0xCA] => gender == 0, // MARCO*P + [0xCA, 0xBB, 0xC9, 0xC6, 0xC9, 0xFF, 0xC6] => gender == 0, // PAOLO*L + [0xC6, 0xCF, 0xBD, 0xC3, 0xC9, 0xFF, 0xCE] => gender == 0, // LUCIO*T + // [0xCE, 0xBF, 0xCC, 0xBF, 0xCD, 0xBB, 0xFF] => gender == 1, // TERESA* + [0xBB, 0xC8, 0xC8, 0xC3, 0xBF, 0xFF, 0xBF] => gender == 1, // ANNIE*E + [0xBF, 0xC6, 0xC3, 0xCD, 0xBB, 0xFF, 0xCD] => gender == 1, // ELISA*S + [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xCB, 0xE9] => gender == 1, // SARA*Qu + _ => false, + }, + German => trash switch + { + // [0xCC, 0xC9, 0xC6, 0xBB, 0xC8, 0xBE, 0xFF] => gender == 0, // ROLAND* + // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xFF] => gender == 0, // DANIEL* + [0xC2, 0xBF, 0xC6, 0xC1, 0xBF, 0xFF, 0xC4] => gender == 0, // HELGE*J + [0xC4, 0xBB, 0xC8, 0xFF, 0xCA, 0xBF, 0xCE] => gender == 0, // JAN*PET + [0xCA, 0xBF, 0xCE, 0xCC, 0xBB, 0xFF, 0xCE] => gender == 1, // PETRA*T + [0xCE, 0xBB, 0xC8, 0xC4, 0xBB, 0xFF, 0xBB] => gender == 1, // TANJA*A + // [0xBB, 0xC8, 0xBE, 0xCC, 0xBF, 0xBB, 0xFF] => gender == 1, // ANDREA* + [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xBE, 0xDD] => gender == 1, // SARA*Di + _ => false, + }, + Spanish => trash switch + { + [0xCE, 0xBF, 0xCC, 0xBF, 0xC8, 0xFF, 0xCB] => gender == 0, // TEREN*Q + [0xCB, 0xCF, 0xC3, 0xC7, 0xC3, 0xFF, 0xCC] => gender == 0, // QUIMI*R + [0xCC, 0xCF, 0xC0, 0xC9, 0xFF, 0xBB, 0xCC] => gender == 0, // RUFO*AR + // [0xBB, 0xCC, 0xCE, 0xCF, 0xCC, 0xC9, 0xFF] => gender == 0, // ARTURO* + // [0xCE, 0xBF, 0xCC, 0xBF, 0xCD, 0xBB, 0xFF] => gender == 1, // TERESA* + // [0xCC, 0xBB, 0xCB, 0xCF, 0xBF, 0xC6, 0xFF] => gender == 1, // RAQUEL* + // [0xC7, 0xBB, 0xCC, 0xC3, 0xBB, 0xCF, 0xFF] => gender == 1, // MARIAU* + [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xBB, 0xE5] => gender == 1, // SARA*Aq + _ => false, + }, + _ => false, + }; + + /// Default OT names present in based on the language of the game. + /// + public static bool IsPatternDefaultS(ReadOnlySpan trash, LanguageID language, byte gender) => language switch + { + English => trash switch + { + [0xCD, 0xBF, 0xBB, 0xC8, 0xFF, 0xCE, 0xBF] => gender == 0, // SEAN*TE + [0xCE, 0xBF, 0xCC, 0xCC, 0xD3, 0xFF, 0xCD] => gender == 0, // TERRY*S + [0xCD, 0xBF, 0xCE, 0xC2, 0xFF, 0xCE, 0xC9] => gender == 0, // SETH*TO + [0xCE, 0xC9, 0xC7, 0xFF, 0xC7, 0xBB, 0xCC] => gender == 0, // TOM*MAR + // [0xC7, 0xBB, 0xCC, 0xC3, 0xC8, 0xBB, 0xFF] => gender == 1, // MARINA* + [0xC5, 0xC3, 0xC7, 0xC7, 0xD3, 0xFF, 0xC8] => gender == 1, // KIMMY*N + // [0xC8, 0xC3, 0xBD, 0xC9, 0xC6, 0xBB, 0xFF] => gender == 1, // NICOLA* + [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xCE, 0xDC] => gender == 1, // SARA*Th + _ => false, + }, + French => trash switch + { + // [0xC7, 0xBB, 0xCC, 0xCE, 0xC3, 0xBB, 0xC6] => gender == 0, // MARTIAL + // [0xCE, 0xC2, 0xC9, 0xC7, 0xBB, 0xCD, 0xFF] => gender == 0, // THOMAS* + // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xFF] => gender == 0, // DANIEL* + [0xCD, 0xBF, 0xBC, 0xFF, 0xC7, 0xBB, 0xCC] => gender == 0, // SEB*MAR + // [0xC7, 0xBB, 0xCC, 0xC3, 0xC8, 0xBF, 0xFF] => gender == 1, // MARINE* + [0xBB, 0xC1, 0xC8, 0xBF, 0xCD, 0xFF, 0xBD] => gender == 1, // AGNES*C + // [0xBD, 0xC6, 0xBB, 0xC3, 0xCC, 0xBF, 0xFF] => gender == 1, // CLAIRE* + // [0xCD, 0xC9, 0xCA, 0xC2, 0xC3, 0xBF, 0xFF] => gender == 1, // SOPHIE* + _ => false, + }, + Italian => trash switch + { + // [0xC7, 0xBB, 0xCC, 0xCE, 0xC3, 0xC8, 0xFF] => gender == 0, // MARTIN* + [0xC7, 0xBB, 0xCC, 0xBD, 0xC9, 0xFF, 0xCA] => gender == 0, // MARCO*P + [0xCA, 0xBB, 0xC9, 0xC6, 0xC9, 0xFF, 0xC6] => gender == 0, // PAOLO*L + [0xC6, 0xCF, 0xBD, 0xC3, 0xC9, 0xFF, 0xC7] => gender == 0, // LUCIO*M + // [0xC7, 0xBB, 0xCC, 0xC3, 0xC8, 0xBB, 0xFF] => gender == 1, // MARINA* + [0xBB, 0xC8, 0xC8, 0xC3, 0xBF, 0xFF, 0xBF] => gender == 1, // ANNIE*E + [0xBF, 0xC6, 0xC3, 0xCD, 0xBB, 0xFF, 0xCD] => gender == 1, // ELISA*S + [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xCB, 0xE9] => gender == 1, // SARA*Qu + _ => false, + }, + German => trash switch + { + // [0xCD, 0xBF, 0xBC, 0xC9, 0xC6, 0xBE, 0xFF] => gender == 0, // SEBOLD* + // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xFF] => gender == 0, // DANIEL* + [0xC2, 0xBF, 0xC6, 0xC1, 0xBF, 0xFF, 0xC4] => gender == 0, // HELGE*J + [0xC4, 0xBB, 0xC8, 0xFF, 0xC7, 0xBB, 0xCC] => gender == 0, // JAN*MAR + // [0xC7, 0xBB, 0xCC, 0xCE, 0xC3, 0xC8, 0xBB] => gender == 1, // MARTINA + [0xCE, 0xBB, 0xC8, 0xC4, 0xBB, 0xFF, 0xBB] => gender == 1, // TANJA*A + // [0xBB, 0xC8, 0xBE, 0xCC, 0xBF, 0xBB, 0xFF] => gender == 1, // ANDREA* + [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xBE, 0xDD] => gender == 1, // SARA*Di + _ => false, + }, + Spanish => trash switch + { + // [0xC7, 0xBB, 0xCC, 0xC3, 0xC8, 0xC9, 0xFF] => gender == 0, // MARINO* + [0xCB, 0xCF, 0xC3, 0xC7, 0xC3, 0xFF, 0xCC] => gender == 0, // QUIMI*R + [0xCC, 0xCF, 0xC0, 0xC9, 0xFF, 0xBB, 0xCC] => gender == 0, // RUFO*AR + // [0xBB, 0xCC, 0xCE, 0xCF, 0xCC, 0xC9, 0xFF] => gender == 0, // ARTURO* + // [0xC7, 0xBB, 0xCC, 0xC3, 0xC8, 0xBB, 0xFF] => gender == 1, // MARINA* + // [0xCC, 0xBB, 0xCB, 0xCF, 0xBF, 0xC6, 0xFF] => gender == 1, // RAQUEL* + // [0xC7, 0xBB, 0xCC, 0xC3, 0xBB, 0xCF, 0xFF] => gender == 1, // MARIAU* + [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xBB, 0xE5] => gender == 1, // SARA*Aq + _ => false, + }, + _ => false, + }; + + /// Default OT names present in based on the language of the game. + /// + public static bool IsPatternDefaultE(ReadOnlySpan trash, LanguageID language, byte gender) => language switch + { + English => trash switch + { + [0xCD, 0xCE, 0xCF, 0xFF, 0xC7, 0xC3, 0xC6] => gender == 0, // STU*MIL + // [0xC7, 0xC3, 0xC6, 0xCE, 0xC9, 0xC8, 0xFF] => gender == 0, // MILTON* + [0xCE, 0xC9, 0xC7, 0xFF, 0xC5, 0xBF, 0xC8] => gender == 0, // TOM*KEN + [0xC5, 0xBF, 0xC8, 0xC8, 0xD3, 0xFF, 0xCC] => gender == 0, // KENNY*R + [0xCC, 0xBF, 0xC3, 0xBE, 0xFF, 0xC4, 0xCF] => gender == 0, // REID*JU + [0xC4, 0xCF, 0xBE, 0xBF, 0xFF, 0xC4, 0xBB] => gender == 0, // JUDE*JA + // [0xC4, 0xBB, 0xD2, 0xCD, 0xC9, 0xC8, 0xFF] => gender == 0, // JAXSON* + // [0xBF, 0xBB, 0xCD, 0xCE, 0xC9, 0xC8, 0xFF] => gender == 0, // EASTON* + // [0xD1, 0xBB, 0xC6, 0xC5, 0xBF, 0xCC, 0xFF] => gender == 0, // WALKER* + [0xCE, 0xBF, 0xCC, 0xCF, 0xFF, 0xC4, 0xC9] => gender == 0, // TERU*JO + // [0xC4, 0xC9, 0xC2, 0xC8, 0xC8, 0xD3, 0xFF] => gender == 0, // JOHNNY* + [0xBC, 0xCC, 0xBF, 0xCE, 0xCE, 0xFF, 0xCD] => gender == 0, // BRETT*S + [0xCD, 0xBF, 0xCE, 0xC2, 0xFF, 0xCE, 0xBF] => gender == 0, // SETH*TE + [0xCE, 0xBF, 0xCC, 0xCC, 0xD3, 0xFF, 0xBD] => gender == 0, // TERRY*C + [0xBD, 0xBB, 0xCD, 0xBF, 0xD3, 0xFF, 0xBE] => gender == 0, // CASEY*D + // [0xBE, 0xBB, 0xCC, 0xCC, 0xBF, 0xC8, 0xFF] => gender == 0, // DARREN* + // [0xC6, 0xBB, 0xC8, 0xBE, 0xC9, 0xC8, 0xFF] => gender == 0, // LANDON* + // [0xBD, 0xC9, 0xC6, 0xC6, 0xC3, 0xC8, 0xFF] => gender == 0, // COLLIN* + // [0xCD, 0xCE, 0xBB, 0xC8, 0xC6, 0xBF, 0xD3] => gender == 0, // STANLEY + // [0xCB, 0xCF, 0xC3, 0xC8, 0xBD, 0xD3, 0xFF] => gender == 0, // QUINCY* + [0xC5, 0xC3, 0xC7, 0xC7, 0xD3, 0xFF, 0xCE] => gender == 1, // KIMMY*T + [0xCE, 0xC3, 0xBB, 0xCC, 0xBB, 0xFF, 0xBC] => gender == 1, // TIARA*B + [0xBC, 0xBF, 0xC6, 0xC6, 0xBB, 0xFF, 0xC4] => gender == 1, // BELLA*J + [0xC4, 0xBB, 0xD3, 0xC6, 0xBB, 0xFF, 0xBB] => gender == 1, // JAYLA*A + [0xBB, 0xC6, 0xC6, 0xC3, 0xBF, 0xFF, 0xC6] => gender == 1, // ALLIE*L + // [0xC6, 0xC3, 0xBB, 0xC8, 0xC8, 0xBB, 0xFF] => gender == 1, // LIANNA* + [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xC7, 0xC9] => gender == 1, // SARA*MO + // [0xC7, 0xC9, 0xC8, 0xC3, 0xBD, 0xBB, 0xFF] => gender == 1, // MONICA* + // [0xBD, 0xBB, 0xC7, 0xC3, 0xC6, 0xBB, 0xFF] => gender == 1, // CAMILA* + // [0xBB, 0xCF, 0xBC, 0xCC, 0xBF, 0xBF, 0xFF] => gender == 1, // AUBREE* + // [0xCC, 0xCF, 0xCE, 0xC2, 0xC3, 0xBF, 0xFF] => gender == 1, // RUTHIE* + [0xC2, 0xBB, 0xD4, 0xBF, 0xC6, 0xFF, 0xC8] => gender == 1, // HAZEL*N + // [0xC8, 0xBB, 0xBE, 0xC3, 0xC8, 0xBF, 0xFF] => gender == 1, // NADINE* + [0xCE, 0xBB, 0xC8, 0xC4, 0xBB, 0xFF, 0xD3] => gender == 1, // TANJA*Y + // [0xD3, 0xBB, 0xCD, 0xC7, 0xC3, 0xC8, 0xFF] => gender == 1, // YASMIN* + // [0xC8, 0xC3, 0xBD, 0xC9, 0xC6, 0xBB, 0xFF] => gender == 1, // NICOLA* + // [0xC6, 0xC3, 0xC6, 0xC6, 0xC3, 0xBF, 0xFF] => gender == 1, // LILLIE* + [0xCE, 0xBF, 0xCC, 0xCC, 0xBB, 0xFF, 0xC6] => gender == 1, // TERRA*L + [0xC6, 0xCF, 0xBD, 0xD3, 0xFF, 0xC2, 0xBB] => gender == 1, // LUCY*HA + [0xC2, 0xBB, 0xC6, 0xC3, 0xBF, 0xFF, 0xCE] => gender == 1, // HALIE*T + _ => false, + }, + French => trash switch + { + [0xCD, 0xCE, 0xBF, 0xC0, 0xFF, 0xC7, 0xBB] => gender == 0, // STEF*MA + // [0xC7, 0xBB, 0xC8, 0xCF, 0xBF, 0xC6, 0xFF] => gender == 0, // MANUEL* + [0xCD, 0xBF, 0xBC, 0xFF, 0xC1, 0xD1, 0xBF] => gender == 0, // SEB*GWE + [0xC1, 0xD1, 0xBF, 0xC8, 0xC8, 0xFF, 0xBB] => gender == 0, // GWENN*A + [0xBB, 0xCC, 0xC8, 0xC9, 0xFF, 0xC4, 0xCF] => gender == 0, // ARNO*JU + [0xC4, 0xCF, 0xC6, 0xBF, 0xCD, 0xFF, 0xC4] => gender == 0, // JULES*J + // [0xC4, 0xC9, 0xC2, 0xBB, 0xC8, 0xC8, 0xFF] => gender == 0, // JOHANN* + // [0xCE, 0xC2, 0xC3, 0xBC, 0xBB, 0xCF, 0xBE] => gender == 0, // THIBAUD + [0xBB, 0xC6, 0xBF, 0xBD, 0xFF, 0xC1, 0xC3] => gender == 0, // ALEC*GI + [0xC1, 0xC3, 0xBC, 0xCF, 0xCD, 0xFF, 0xC4] => gender == 0, // GIBUS*J + // [0xC4, 0xC9, 0xC2, 0xC8, 0xC8, 0xD3, 0xFF] => gender == 0, // JOHNNY* + // [0xC0, 0xBB, 0xBC, 0xCC, 0xC3, 0xBD, 0xBF] => gender == 0, // FABRICE + // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xFF] => gender == 0, // DANIEL* + // [0xCE, 0xC2, 0xC9, 0xC7, 0xBB, 0xCD, 0xFF] => gender == 0, // THOMAS* + [0xC1, 0xBB, 0xCC, 0xD3, 0xFF, 0xCC, 0xCF] => gender == 0, // GARY*RU + [0xCC, 0xCF, 0xBE, 0xBE, 0xD3, 0xFF, 0xCE] => gender == 0, // RUDDY*T + // [0xCE, 0xC2, 0xC3, 0xBF, 0xCC, 0xCC, 0xD3] => gender == 0, // THIERRY + [0xBD, 0xC9, 0xC6, 0xC3, 0xC8, 0xFF, 0xCD] => gender == 0, // COLIN*S + [0xCD, 0xCE, 0xBB, 0xC8, 0xFF, 0xCD, 0xBF] => gender == 0, // STAN*SE + // [0xCD, 0xBF, 0xD0, 0xBF, 0xCC, 0xC3, 0xC8] => gender == 0, // SEVERIN + [0xBB, 0xC1, 0xC8, 0xBF, 0xCD, 0xFF, 0xBB] => gender == 1, // AGNES*A + // [0xBB, 0xCC, 0xC3, 0xBB, 0xC8, 0xBF, 0xFF] => gender == 1, // ARIANE* + [0xBC, 0xBF, 0xC6, 0xC6, 0xBB, 0xFF, 0xC7] => gender == 1, // BELLA*M + [0xC7, 0xBB, 0xBF, 0xD0, 0xBB, 0xFF, 0xCA] => gender == 1, // MAEVA*P + // [0xCA, 0xBB, 0xCF, 0xC6, 0xC3, 0xC8, 0xBF] => gender == 1, // PAULINE + [0xBD, 0xC3, 0xC8, 0xBE, 0xD3, 0xFF, 0xCD] => gender == 1, // CINDY*S + // [0xCD, 0xC9, 0xCA, 0xC2, 0xC3, 0xBF, 0xFF] => gender == 1, // SOPHIE* + // [0xC7, 0xC9, 0xC8, 0xC3, 0xBD, 0xBB, 0xFF] => gender == 1, // MONICA* + [0xBD, 0xBB, 0xCE, 0xC2, 0xD3, 0xFF, 0xC0] => gender == 1, // CATHY*F + [0xC0, 0xBB, 0xC8, 0xC8, 0xD3, 0xFF, 0xCC] => gender == 1, // FANNY*R + // [0xCC, 0xC9, 0xD2, 0xBB, 0xC8, 0xBF, 0xFF] => gender == 1, // ROXANE* + [0xBF, 0xBE, 0xC3, 0xCE, 0xC2, 0xFF, 0xC8] => gender == 1, // EDITH*N + // [0xC8, 0xBB, 0xBE, 0xC3, 0xC8, 0xBF, 0xFF] => gender == 1, // NADINE* + [0xCE, 0xBB, 0xC8, 0xC3, 0xBB, 0xFF, 0xC4] => gender == 1, // TANIA*J + // [0xC4, 0xBB, 0xC8, 0xD3, 0xBD, 0xBF, 0xFF] => gender == 1, // JANYCE* + // [0xBD, 0xC6, 0xBB, 0xC3, 0xCC, 0xBF, 0xFF] => gender == 1, // CLAIRE* + [0xC6, 0xC3, 0xC6, 0xC6, 0xD3, 0xFF, 0xCD] => gender == 1, // LILLY*S + // [0xCD, 0xC9, 0xC6, 0xBF, 0xC8, 0xBF, 0xFF] => gender == 1, // SOLENE* + // [0xBD, 0xD3, 0xC8, 0xCE, 0xC2, 0xC3, 0xBB] => gender == 1, // CYNTHIA + [0xC7, 0xBB, 0xCF, 0xBE, 0xFF, 0xD0, 0xE3] => gender == 1, // MAUD*Vo + _ => false, + }, + Italian => trash switch + { + // [0xC0, 0xCC, 0xBB, 0xC8, 0xBD, 0xD3, 0xFF] => gender == 0, // FRANCY* + // [0xC1, 0xC3, 0xC9, 0xCC, 0xC1, 0xC3, 0xC9] => gender == 0, // GIORGIO + [0xC6, 0xCF, 0xBD, 0xC3, 0xC9, 0xFF, 0xC0] => gender == 0, // LUCIO*F + [0xC0, 0xBB, 0xBC, 0xD3, 0xFF, 0xBB, 0xC8] => gender == 0, // FABY*AN + // [0xBB, 0xC8, 0xBE, 0xCC, 0xBF, 0xBB, 0xFF] => gender == 0, // ANDREA* + // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xBF] => gender == 0, // DANIELE + // [0xC7, 0xC3, 0xBD, 0xC2, 0xBF, 0xC6, 0xBF] => gender == 0, // MICHELE + [0xCC, 0xBF, 0xC8, 0xD4, 0xC9, 0xFF, 0xBF] => gender == 0, // RENZO*E + // [0xBF, 0xCF, 0xC1, 0xBF, 0xC8, 0xC3, 0xC9] => gender == 0, // EUGENIO + [0xBF, 0xC6, 0xC3, 0xBB, 0xFF, 0xCD, 0xBB] => gender == 0, // ELIA*SA + // [0xCD, 0xBB, 0xC8, 0xBE, 0xCC, 0xC9, 0xFF] => gender == 0, // SANDRO* + // [0xCA, 0xC3, 0xBF, 0xCE, 0xCC, 0xC9, 0xFF] => gender == 0, // PIETRO* + [0xCA, 0xBB, 0xC9, 0xC6, 0xC9, 0xFF, 0xC7] => gender == 0, // PAOLO*M + [0xC7, 0xBB, 0xCC, 0xBD, 0xC9, 0xFF, 0xBB] => gender == 0, // MARCO*A + // [0xBB, 0xC6, 0xBC, 0xBF, 0xCC, 0xCE, 0xC9] => gender == 0, // ALBERTO + // [0xC0, 0xC3, 0xC6, 0xC3, 0xCA, 0xCA, 0xC9] => gender == 0, // FILIPPO + // [0xC6, 0xBB, 0xC8, 0xBE, 0xC9, 0xC8, 0xFF] => gender == 0, // LANDON* + [0xC1, 0xC3, 0xC8, 0xC9, 0xFF, 0xBD, 0xBF] => gender == 0, // GINO*CE + [0xBD, 0xBF, 0xBD, 0xBD, 0xC9, 0xFF, 0xC7] => gender == 0, // CECCO*M + [0xC7, 0xBB, 0xCC, 0xC3, 0xC9, 0xFF, 0xBB] => gender == 0, // MARIO*A + [0xBB, 0xC8, 0xC8, 0xC3, 0xBF, 0xFF, 0xBD] => gender == 1, // ANNIE*C + [0xBD, 0xBB, 0xCE, 0xC3, 0xBB, 0xFF, 0xBC] => gender == 1, // CATIA*B + [0xBC, 0xBF, 0xC6, 0xC6, 0xBB, 0xFF, 0xCA] => gender == 1, // BELLA*P + [0xCA, 0xBB, 0xC9, 0xC6, 0xBB, 0xFF, 0xC6] => gender == 1, // PAOLA*L + [0xC6, 0xCF, 0xC3, 0xCD, 0xBB, 0xFF, 0xC1] => gender == 1, // LUISA*G + // [0xC1, 0xCC, 0xBB, 0xD4, 0xC3, 0xBB, 0xFF] => gender == 1, // GRAZIA* + [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xC7, 0xC9] => gender == 1, // SARA*MO + // [0xC7, 0xC9, 0xC8, 0xC3, 0xBD, 0xBB, 0xFF] => gender == 1, // MONICA* + [0xC7, 0xBB, 0xCC, 0xCE, 0xBB, 0xFF, 0xCA] => gender == 1, // MARTA*P + [0xCA, 0xC3, 0xBB, 0xFF, 0xCC, 0xC3, 0xCE] => gender == 1, // PIA*RIT + [0xCC, 0xC3, 0xCE, 0xBB, 0xFF, 0xBF, 0xCC] => gender == 1, // RITA*ER + [0xBF, 0xCC, 0xC3, 0xBD, 0xBB, 0xFF, 0xCC] => gender == 1, // ERICA*R + [0xCC, 0xC9, 0xCD, 0xBB, 0xFF, 0xC7, 0xBF] => gender == 1, // ROSA*ME + // [0xC7, 0xBF, 0xC6, 0xC3, 0xCD, 0xCD, 0xBB] => gender == 1, // MELISSA + // [0xC7, 0xBB, 0xCC, 0xC3, 0xC8, 0xBB, 0xFF] => gender == 1, // MARINA* + [0xBF, 0xC6, 0xC3, 0xCD, 0xBB, 0xFF, 0xC6] => gender == 1, // ELISA*L + [0xC6, 0xC3, 0xC8, 0xBB, 0xFF, 0xCE, 0xBF] => gender == 1, // LINA*TE + // [0xCE, 0xBF, 0xCC, 0xBF, 0xCD, 0xBB, 0xFF] => gender == 1, // TERESA* + // [0xC6, 0xCF, 0xBD, 0xBF, 0xCE, 0xCE, 0xBB] => gender == 1, // LUCETTA + [0xC6, 0xCF, 0xBD, 0xC3, 0xBB, 0xFF, 0xCB] => gender == 1, // LUCIA*Q + _ => false, + }, + German => trash switch + { + // [0xCD, 0xCE, 0xBF, 0xC0, 0xBB, 0xC8, 0xFF] => gender == 0, // STEFAN* + // [0xC0, 0xC6, 0xC9, 0xCC, 0xC3, 0xBB, 0xC8] => gender == 0, // FLORIAN + [0xC4, 0xBB, 0xC8, 0xFF, 0xBF, 0xCC, 0xC3] => gender == 0, // JAN*ERI + [0xBF, 0xCC, 0xC3, 0xC5, 0xFF, 0xCE, 0xC2] => gender == 0, // ERIK*TH + // [0xCE, 0xC2, 0xC9, 0xC7, 0xBB, 0xCD, 0xFF] => gender == 0, // THOMAS* + // [0xC7, 0xBB, 0xCC, 0xCE, 0xC3, 0xC8, 0xFF] => gender == 0, // MARTIN* + // [0xC7, 0xBB, 0xCC, 0xC5, 0xCF, 0xCD, 0xFF] => gender == 0, // MARKUS* + [0xC5, 0xC6, 0xBB, 0xCF, 0xCD, 0xFF, 0xCA] => gender == 0, // KLAUS*P + [0xCA, 0xBB, 0xCF, 0xC6, 0xFF, 0xCC, 0xC9] => gender == 0, // PAUL*RO + [0xCC, 0xC9, 0xC6, 0xC0, 0xFF, 0xC4, 0xF2] => gender == 0, // ROLF*JÖ + [0xC4, 0xF2, 0xCC, 0xC1, 0xFF, 0xC2, 0xBB] => gender == 0, // JÖRG*HA + [0xC2, 0xBB, 0xC3, 0xC5, 0xC9, 0xFF, 0xC2] => gender == 0, // HAIKO*H + [0xC2, 0xBF, 0xC6, 0xC1, 0xBF, 0xFF, 0xBE] => gender == 0, // HELGE*D + // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xFF] => gender == 0, // DANIEL* + // [0xC7, 0xC3, 0xBD, 0xC2, 0xBB, 0xBF, 0xC6] => gender == 0, // MICHAEL + [0xBE, 0xBB, 0xD0, 0xC3, 0xBE, 0xFF, 0xCC] => gender == 0, // DAVID*R + // [0xCC, 0xC9, 0xC6, 0xBB, 0xC8, 0xBE, 0xFF] => gender == 0, // ROLAND* + // [0xC4, 0xC9, 0xC2, 0xBB, 0xC8, 0xC8, 0xFF] => gender == 0, // JOHANN* + // [0xBE, 0xC3, 0xBF, 0xCE, 0xBF, 0xCC, 0xFF] => gender == 0, // DIETER* + // [0xBB, 0xC8, 0xCD, 0xBF, 0xC6, 0xC7, 0xFF] => gender == 0, // ANSELM* + [0xCE, 0xBB, 0xC8, 0xC4, 0xBB, 0xFF, 0xC7] => gender == 1, // TANJA*M + // [0xC7, 0xC3, 0xCC, 0xC4, 0xBB, 0xC7, 0xFF] => gender == 1, // MIRJAM* + // [0xC7, 0xBB, 0xCC, 0xCE, 0xC3, 0xC8, 0xBB] => gender == 1, // MARTINA + [0xC4, 0xBB, 0xC7, 0xC3, 0xBF, 0xFF, 0xBD] => gender == 1, // JAMIE*C + // [0xBD, 0xBB, 0xCC, 0xC9, 0xC6, 0xC3, 0xC8] => gender == 1, // CAROLIN + // [0xCD, 0xC3, 0xC7, 0xC9, 0xC8, 0xBF, 0xFF] => gender == 1, // SIMONE* + [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xBD, 0xC6] => gender == 1, // SARA*CL + // [0xBD, 0xC6, 0xBB, 0xCF, 0xBE, 0xC3, 0xBB] => gender == 1, // CLAUDIA + // [0xC4, 0xBB, 0xCD, 0xC7, 0xC3, 0xC8, 0xFF] => gender == 1, // JASMIN* + // [0xBE, 0xBF, 0xC8, 0xC3, 0xCD, 0xBF, 0xFF] => gender == 1, // DENISE* + // [0xC5, 0xBB, 0xCE, 0xCC, 0xC3, 0xC8, 0xFF] => gender == 1, // KATRIN* + // [0xC5, 0xBF, 0xCC, 0xCD, 0xCE, 0xC3, 0xC8] => gender == 1, // KERSTIN + // [0xCD, 0xD0, 0xBF, 0xC8, 0xC4, 0xBB, 0xFF] => gender == 1, // SVENJA* + [0xBC, 0xBF, 0xBB, 0xCE, 0xBF, 0xFF, 0xC7] => gender == 1, // BEATE*M + [0xC7, 0xBF, 0xC3, 0xC5, 0xBF, 0xFF, 0xBB] => gender == 1, // MEIKE*A + // [0xBB, 0xC8, 0xBE, 0xCC, 0xBF, 0xBB, 0xFF] => gender == 1, // ANDREA* + [0xBF, 0xD0, 0xBB, 0xFF, 0xCA, 0xBF, 0xCE] => gender == 1, // EVA*PET + [0xCA, 0xBF, 0xCE, 0xCC, 0xBB, 0xFF, 0xC1] => gender == 1, // PETRA*G + [0xC1, 0xBB, 0xBC, 0xC3, 0xFF, 0xC8, 0xBB] => gender == 1, // GABI*NA + // [0xC8, 0xBB, 0xBE, 0xC3, 0xC8, 0xBF, 0xFF] => gender == 1, // NADINE* + _ => false, + }, + Spanish => trash switch + { + [0xBF, 0xC6, 0xBF, 0xC8, 0xC9, 0xFF, 0xC6] => gender == 0, // ELENO*L + [0xC6, 0xBB, 0xCC, 0xBF, 0xC9, 0xFF, 0xBB] => gender == 0, // LAREO*A + // [0xBB, 0xCC, 0xCE, 0xCF, 0xCC, 0xC9, 0xFF] => gender == 0, // ARTURO* + [0xBD, 0xBB, 0xCC, 0xC6, 0xC9, 0xFF, 0xC7] => gender == 0, // CARLO*M + [0xC7, 0xBB, 0xCF, 0xCC, 0xC3, 0xFF, 0xBE] => gender == 0, // MAURI*D + // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xFF] => gender == 0, // DANIEL* + // [0xC7, 0xBB, 0xCC, 0xBD, 0xBF, 0xC6, 0xC9] => gender == 0, // MARCELO + // [0xCC, 0xC9, 0xBC, 0xBF, 0xCC, 0xCE, 0xC9] => gender == 0, // ROBERTO + [0xBB, 0xC3, 0xCE, 0xC9, 0xCC, 0xFF, 0xC4] => gender == 0, // AITOR*J + [0xC4, 0xCF, 0xC6, 0xC3, 0xFF, 0xC8, 0xBB] => gender == 0, // JULI*NA + // [0xC8, 0xBB, 0xCC, 0xBD, 0xC3, 0xCD, 0xC9] => gender == 0, // NARCISO + [0xC6, 0xCF, 0xC3, 0xCD, 0xFF, 0xCC, 0xCF] => gender == 0, // LUIS*RU + [0xCC, 0xCF, 0xC0, 0xC9, 0xFF, 0xCB, 0xCF] => gender == 0, // RUFO*QU + [0xCB, 0xCF, 0xC3, 0xC7, 0xC3, 0xFF, 0xC4] => gender == 0, // QUIMI*J + // [0xC4, 0xBF, 0xCD, 0xCF, 0xCD, 0xC9, 0xFF] => gender == 0, // JESUSO* + [0xC7, 0xBB, 0xCC, 0xBD, 0xC9, 0xFF, 0xCE] => gender == 0, // MARCO*T + [0xCE, 0xBF, 0xCC, 0xBF, 0xC8, 0xFF, 0xC7] => gender == 0, // TEREN*M + [0xC7, 0xBB, 0xCC, 0xC3, 0xC9, 0xFF, 0xCA] => gender == 0, // MARIO*P + [0xCA, 0xBF, 0xBE, 0xCC, 0xC9, 0xFF, 0xBF] => gender == 0, // PEDRO*E + // [0xBF, 0xC8, 0xCC, 0xC3, 0xCB, 0xCF, 0xBF] => gender == 0, // ENRIQUE + // [0xCC, 0xBB, 0xCB, 0xCF, 0xBF, 0xC6, 0xFF] => gender == 1, // RAQUEL* + [0xBF, 0xC6, 0xBF, 0xC8, 0xBB, 0xFF, 0xCA] => gender == 1, // ELENA*P + [0xCA, 0xBB, 0xC6, 0xC7, 0xBB, 0xFF, 0xC6] => gender == 1, // PALMA*L + [0xC6, 0xBB, 0xCC, 0xBB, 0xFF, 0xBD, 0xBB] => gender == 1, // LARA*CA + // [0xBD, 0xBB, 0xCC, 0xC6, 0xC9, 0xCE, 0xBB] => gender == 1, // CARLOTA + [0xC7, 0xC9, 0xC8, 0xBB, 0xFF, 0xCD, 0xBB] => gender == 1, // MONA*SA + [0xCD, 0xBB, 0xCC, 0xBB, 0xFF, 0xBE, 0xBB] => gender == 1, // SARA*DA + // [0xBE, 0xBB, 0xC8, 0xC3, 0xBF, 0xC6, 0xBB] => gender == 1, // DANIELA + // [0xC9, 0xC6, 0xC3, 0xC7, 0xCA, 0xC3, 0xBB] => gender == 1, // OLIMPIA + // [0xC7, 0xBB, 0xCC, 0xBD, 0xBF, 0xC6, 0xBB] => gender == 1, // MARCELA + // [0xCC, 0xC9, 0xBC, 0xBF, 0xCC, 0xCE, 0xBB] => gender == 1, // ROBERTA + // [0xBB, 0xCC, 0xBB, 0xC8, 0xBD, 0xC2, 0xBB] => gender == 1, // ARANCHA + // [0xC4, 0xCF, 0xC6, 0xC3, 0xBF, 0xCE, 0xBB] => gender == 1, // JULIETA + // [0xC8, 0xC9, 0xBF, 0xC6, 0xC3, 0xBB, 0xFF] => gender == 1, // NOELIA* + // [0xC6, 0xCF, 0xBD, 0xC3, 0xCE, 0xBB, 0xFF] => gender == 1, // LUCITA* + // [0xC7, 0xBB, 0xCC, 0xC3, 0xBB, 0xCF, 0xFF] => gender == 1, // MARIAU* + [0xCA, 0xBB, 0xC9, 0xC6, 0xBB, 0xFF, 0xCE] => gender == 1, // PAOLA*T + // [0xCE, 0xBF, 0xCC, 0xBF, 0xCD, 0xBB, 0xFF] => gender == 1, // TERESA* + [0xC8, 0xCF, 0xCC, 0xC3, 0xBB, 0xFF, 0xC6] => gender == 1, // NURIA*L + [0xC6, 0xC3, 0xC8, 0xBB, 0xFF, 0xBB, 0xE5] => gender == 1, // LINA*Aq + _ => false, + }, + _ => false, + }; +} diff --git a/PKHeX.Core/Saves/Util/SaveLanguage.cs b/PKHeX.Core/Saves/Util/SaveLanguage.cs index 37f040a78..0f4fa0e24 100644 --- a/PKHeX.Core/Saves/Util/SaveLanguage.cs +++ b/PKHeX.Core/Saves/Util/SaveLanguage.cs @@ -247,7 +247,7 @@ public static SaveLanguageResult InferFrom3(ReadOnlySpan name, GameVersion { if (MaybeFR(hint)) { if (Contains(name, "fir")) return (English, FR); - if (Contains(name, "feu")) return (French, FR); + if (Contains(name, "feu") && !Contains(name, "feui")) return (French, FR); // ignore vert feuille if (Contains(name, "feuer")) return (German, FR); if (Contains(name, "fuoco")) return (Italian, FR); if (Contains(name, "fueg")) return (Spanish, FR); diff --git a/PKHeX.WinForms/Subforms/PKM Editors/MoveShopEditor.cs b/PKHeX.WinForms/Subforms/PKM Editors/MoveShopEditor.cs index bb0fdcf35..aa006ab75 100644 --- a/PKHeX.WinForms/Subforms/PKM Editors/MoveShopEditor.cs +++ b/PKHeX.WinForms/Subforms/PKM Editors/MoveShopEditor.cs @@ -203,6 +203,7 @@ private void B_All_Click(object sender, EventArgs e) switch (ModifierKeys) { case Keys.Shift: + Master.SetPurchasedFlagsAll(Entity); Master.SetMoveShopFlagsAll(Entity); break; case Keys.Control: From c0a81a7164aaaca627e761b22ba3b47a6f9cc3fe Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 1 May 2026 23:32:12 -0500 Subject: [PATCH 04/81] Gen4: Rewrite 31IV reject loop, inline activation Thanks Unknown Warrior for reporting a BCC Volbeat that failed the detection. Not sure why I implemented the logic that way originally, but this cleans it up slightly. After looking at it further, it was missing a bit of tree pruning for Synchronization fails/lock-in, so we have a little bit of parameter passing hell happening. It's internal to the private methods, so I guess it's not too bad. GPT-5.4 was given it as a first pass, of which it identified both existing bugs: - seed was mutated in TryGetMatch before passing to the recursion - frame reversal to origin inside the recursion (to get the seed that generates the rejected pid-iv) was off-by-one The two fixes did allow it to solve, but it was missing the synchronize lock-in effect and sync-fail paths; no fault to GPT. Once those were added, everything worked as expected! The frame-exit activation check was being run on the first-match of all lead candidates; due to leads consuming different amounts of calls, not all exit frame paths were checked. This resulted in a very very rare chance that a valid frame wouldn't be possible for non-sweet-scent encounters. So, those had to get inlined to each lead-check. Now, they're fully encounterable before being emitted to the "best result" aggregator at the top of the call chain. They're already preferentially emitted inside the lead-checker set (hence the weird if-else arrangement), just that separate PID-loop frames will possibly yield a less-restricted/more-common lead arrangement. Peppers in a few more context dumps to help future me (or future AI) better maintain context. Also de-magics the Format numbers to better clarify what "0" does/means. Unrelated: remove an unnecessary space (at the end of a line) in HomeQuirks I'm pleasantly surprised that GPT-5.4 was able to deduce the two bugs in the implementation; I didn't provide enough context/requests, but it was quite confident in the two bugs (as it should have been -- it was correct) when I challenged it for explanation. --- .../Templates/Gen4/EncounterSlot4.cs | 3 + .../RNG/ClassicEra/Gen3/GenerateMethodH.cs | 3 +- .../Legality/RNG/ClassicEra/Gen3/MethodH.cs | 134 ++++---- .../RNG/ClassicEra/Gen4/GenerateMethodJ.cs | 4 +- .../RNG/ClassicEra/Gen4/GenerateMethodK.cs | 3 +- .../Legality/RNG/ClassicEra/Gen4/MethodJ.cs | 121 ++++--- .../Legality/RNG/ClassicEra/Gen4/MethodK.cs | 306 ++++++++++-------- .../Legality/Restrictions/HomeQuirks.cs | 2 +- 8 files changed, 291 insertions(+), 285 deletions(-) diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterSlot4.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterSlot4.cs index cd5bccb60..ad3c935d7 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterSlot4.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterSlot4.cs @@ -190,6 +190,9 @@ public RandomCorrelationRating IsCompatible(PIDType type, PKM pk) public PIDType GetSuggestedCorrelation() => PIDType.Method_1; public byte PressureLevel => Type != Grass ? LevelMax : Parent.GetPressureMax(Species, LevelMax); + + // HG/SS has some encounter generation routines that sample rejects until a minimum of one 31 IV is present, up to 4x. public bool IsBugContest => Type == BugContest; public bool IsSafariHGSS => Locations4.IsSafari(Location); + public bool IsRerollMinimum31 => IsBugContest || IsSafariHGSS; } diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/GenerateMethodH.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/GenerateMethodH.cs index fe7ffdfbf..c9c7e85ee 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/GenerateMethodH.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/GenerateMethodH.cs @@ -22,8 +22,7 @@ public static void SetRandom(this T enc, PK3 pk, PersonalInfo3 pi, in Encount { if (checkProc) { - var check = new LeadSeed(seed, LeadRequired.None); - if (!MethodH.CheckEncounterActivation(enc, ref check)) + if (!MethodH.CheckEncounterActivation(enc, seed, LeadRequired.None, out _)) { seed = LCRNG.Next(seed); continue; diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/MethodH.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/MethodH.cs index bc21aa489..9d54a067f 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/MethodH.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/MethodH.cs @@ -37,7 +37,7 @@ public static class MethodH /// public static LeadSeed GetSeed(TEnc enc, uint seed, bool emerald, byte gender) where TEnc : IEncounterSlot3 - => GetSeed(enc, seed, enc, emerald, gender, 0); + => GetSeed(enc, seed, enc, emerald, gender, FormatNoLevelCheck); /// Used when generating with specific level ranges. /// @@ -55,6 +55,7 @@ public static LeadSeed GetSeed(TEnc enc, uint seed, bool emerald, byte gen // Intimidate/Keen Eye: rand() & 1 == 1; -- 0 will reject the encounter. private const byte Format = 3; + private const byte FormatNoLevelCheck = 0; // anything but `Format` will ignore met level precision (overwritten via transfer, test logic, etc.) private static bool IsCuteCharmFail(uint rand) => (rand % 3) == 0; // 1/3 odds private static bool IsCuteCharmPass(uint rand) => (rand % 3) != 0; // 2/3 odds @@ -140,13 +141,10 @@ private static LeadSeed GetOriginSeedEmerald(T enc, uint seed, byte nature, i { if (TryGetMatch(enc, levelMin, levelMax, seed, nature, format, out var result)) { - if (CheckEncounterActivationEmerald(enc, ref result)) - { - if (result.IsNoRequirement) - return result; - if (result.IsBetterThan(prefer)) - prefer = result; - } + if (result.IsNoRequirement) + return result; + if (result.IsBetterThan(prefer)) + prefer = result; } if (reverseCount == 0) @@ -165,13 +163,10 @@ private static LeadSeed GetOriginSeedEmerald(T enc, uint seed, byte nature, i if (TryGetMatch(enc, levelMin, levelMax, seed, nature, format, out var result) && result.IsNoRequirement) { result.Lead = CuteCharm; - if (CheckEncounterActivationEmerald(enc, ref result)) - { - if (result.IsNoRequirement) - return result; - if (result.IsBetterThan(prefer)) - prefer = result; - } + if (result.IsNoRequirement) + return result; + if (result.IsBetterThan(prefer)) + prefer = result; } revCute--; if (revCute == 0) @@ -180,28 +175,13 @@ private static LeadSeed GetOriginSeedEmerald(T enc, uint seed, byte nature, i } } - private static bool CheckEncounterActivationEmerald(T enc, ref LeadSeed result) - where T : IEncounterSlot3 - { - if (enc.Type is Rock_Smash) - return IsRockSmashPossible(enc.AreaRate, ref result.Seed); - if (enc.Type.IsFishingRodType()) - return true; // can just wait and trigger after hooking. - - // Can sweet scent trigger. - return true; - } - private static LeadSeed GetOriginSeed(T enc, uint seed, byte nature, int reverseCount, byte levelMin, byte levelMax, byte format = Format) where T : IEncounterSlot3 { while (true) { if (TryGetMatchNoLead(enc, levelMin, levelMax, seed, nature, format, out var result)) - { - if (CheckEncounterActivation(enc, ref result)) - return result; - } + return result; if (reverseCount == 0) break; reverseCount--; @@ -224,11 +204,30 @@ public static uint SkipToLevelRand(T enc, uint seed) return LCRNG.Next2(seed); // ESV, level. } - public static bool CheckEncounterActivation(T enc, ref LeadSeed result) + /// + /// Checks an input seed and lead by unrolling to the encounter trigger state and checking the encounter conditions along the way. + /// + /// Encounter to check against. + /// Seed that immediately selects the encounter slot. + /// Party lead effect that is active at the moment of encounter slot selection. + /// Un-rolled seed and lead at the moment of encounter trigger, if the check passes. + /// if the seed and lead can trigger the encounter; otherwise, . + /// + /// It is necessary to check this when exploring possible leads, as different leads (or lack thereof) may consume a different quantity of RNG calls. + /// + public static bool CheckEncounterActivation(T enc, uint seed, LeadRequired lead, out LeadSeed result) + where T : IEncounterSlot3 + { + var pass = CheckEncounterActivation(enc, ref seed, ref lead); + result = new(seed, lead); + return pass; + } + + private static bool CheckEncounterActivation(T enc, ref uint seed, ref LeadRequired _) where T : IEncounterSlot3 { if (enc.Type is Rock_Smash) - return IsRockSmashPossible(enc.AreaRate, ref result.Seed); + return IsRockSmashPossible(enc.AreaRate, ref seed); if (enc.Type.IsFishingRodType()) return true; // can just wait and trigger after hooking. // Can sweet scent trigger. @@ -303,8 +302,8 @@ private static bool TryGetMatchNoLead(T enc, byte levelMin, byte levelMax, ui if (IsSafariBlockProc(safariBlockSeed)) { var ctx = new FrameCheckDetails(enc, safariBlockSeed, levelMin, levelMax, format); - if (IsSlotValidRegular(ctx, out uint origin)) - { result = new(origin, None); return true; } + if (IsSlotValidRegular(ctx, out result)) + return true; } } if (enc.Species is (ushort)Species.Unown) // No Nature in loop @@ -312,8 +311,8 @@ private static bool TryGetMatchNoLead(T enc, byte levelMin, byte levelMax, ui // Consumers of the seed will assume nature is used; shift the frames so the values line up with their uses. var noNatureCallUsed = LCRNG.Next(seed); var ctx = new FrameCheckDetails(enc, noNatureCallUsed, levelMin, levelMax, format); - if (IsSlotValidRegular(ctx, out uint origin)) - { result = new(origin, None); return true; } + if (IsSlotValidRegular(ctx, out result)) + return true; } else if (GetNature(p0) == nature) { @@ -323,8 +322,8 @@ private static bool TryGetMatchNoLead(T enc, byte levelMin, byte levelMax, ui seed = LCRNG.Prev(seed); var ctx = new FrameCheckDetails(enc, seed, levelMin, levelMax, format); - if (IsSlotValidRegular(ctx, out uint origin)) - { result = new(origin, None); return true; } + if (IsSlotValidRegular(ctx, out result)) + return true; } result = default; return false; } @@ -344,7 +343,7 @@ private static bool TryGetMatch(T enc, byte levelMin, byte levelMax, uint see if (IsSafariBlockProc(safariBlockSeed)) { var ctx = new FrameCheckDetails(enc, safariBlockSeed, levelMin, levelMax, format); - if (TryGetMatchNoSync(ctx, out result)) + if (TryGetMatchNoSync(ctx, out result) && CheckEncounterActivation(enc, safariBlockSeed, None, out result)) return true; } @@ -358,11 +357,8 @@ private static bool TryGetMatch(T enc, byte levelMin, byte levelMax, uint see if (syncProc) { var ctx = new FrameCheckDetails(enc, seed, levelMin, levelMax, format); - if (IsSlotValidRegular(ctx, out var regular)) - { - result = new(regular, Synchronize); + if (IsSlotValidRegular(ctx, out result, Synchronize)) return true; - } } var reg = GetNature(p0) == nature; if (reg) @@ -450,27 +446,27 @@ private static bool IsSlotValidHustleVitalFail(in FrameCheckDetails ctx, o private static bool TryGetMatchNoSync(in FrameCheckDetails ctx, out LeadSeed result) where T : IEncounterSlot3 { - if (IsSlotValidRegular(ctx, out uint seed)) - { result = new(seed, None); return true; } + if (IsSlotValidRegular(ctx, out result)) + return true; - if (IsSlotValidSyncFail(ctx, out seed)) - { result = new(seed, SynchronizeFail); return true; } - if (IsSlotValidCuteCharmFail(ctx, out seed)) - { result = new(seed, CuteCharmFail); return true; } - if (IsSlotValidHustleVitalFail(ctx, out seed)) - { result = new(seed, PressureHustleSpiritFail); return true; } - if (IsSlotValidStaticMagnetFail(ctx, out seed)) - { result = new(seed, StaticMagnetFail); return true; } + if (IsSlotValidSyncFail(ctx, out var seed) && CheckEncounterActivation(ctx.Encounter, seed, SynchronizeFail, out result)) + return true; + if (IsSlotValidCuteCharmFail(ctx, out seed) && CheckEncounterActivation(ctx.Encounter, seed, CuteCharmFail, out result)) + return true; + if (IsSlotValidHustleVitalFail(ctx, out seed) && CheckEncounterActivation(ctx.Encounter, seed, PressureHustleSpiritFail, out result)) + return true; + if (IsSlotValidStaticMagnetFail(ctx, out seed) && CheckEncounterActivation(ctx.Encounter, seed, StaticMagnetFail, out result)) + return true; // Intimidate/Keen Eye failing will result in no encounter. - if (IsSlotValidStaticMagnet(ctx, out seed, out var lead)) - { result = new(seed, lead); return true; } - if (IsSlotValidHustleVital(ctx, out seed)) - { result = new(seed, PressureHustleSpirit); return true; } - if (IsSlotValidIntimidate(ctx, out seed)) - { result = new(seed, IntimidateKeenEyeFail); return true; } - if (TryGetMatchCuteCharm(ctx, out seed)) - { result = new(seed, CuteCharm); return true; } + if (IsSlotValidStaticMagnet(ctx, out seed, out var lead) && CheckEncounterActivation(ctx.Encounter, seed, lead, out result)) + return true; + if (IsSlotValidHustleVital(ctx, out seed) && CheckEncounterActivation(ctx.Encounter, seed, PressureHustleSpirit, out result)) + return true; + if (IsSlotValidIntimidate(ctx, out seed) && CheckEncounterActivation(ctx.Encounter, seed, IntimidateKeenEyeFail, out result)) + return true; + if (TryGetMatchCuteCharm(ctx, out seed) && CheckEncounterActivation(ctx.Encounter, seed, CuteCharm, out result)) + return true; result = default; return false; } @@ -505,7 +501,7 @@ private static bool IsSlotValidFrom1SkipMinus1(FrameCheckDetails ctx, out result = 0; return false; } - private static bool IsSlotValidRegular(in FrameCheckDetails ctx, out uint result) + private static bool IsSlotValidRegular(in FrameCheckDetails ctx, out LeadSeed result, LeadRequired lead = None) where T : IEncounterSlot3 { // -2 ESV @@ -513,10 +509,10 @@ private static bool IsSlotValidRegular(in FrameCheckDetails ctx, out uint // 0 Nature if (IsLevelValid(ctx.Encounter, ctx.LevelMin, ctx.LevelMax, ctx.Format, ctx.Prev1)) { - if (IsSlotValid(ctx.Encounter, ctx.Prev2)) - { result = ctx.Seed3; return true; } + if (IsSlotValid(ctx.Encounter, ctx.Prev2) && CheckEncounterActivation(ctx.Encounter, ctx.Seed3, lead, out result)) + return true; } - result = 0; return false; + result = default; return false; } private static bool IsSlotValidHustleVital(in FrameCheckDetails ctx, out uint result) @@ -634,7 +630,7 @@ private static bool IsOriginalLevelValid(byte min, byte max, byte format, uint l private static bool IsRockSmashPossible(byte areaRate, ref uint seed) { - if (IsRatePass(seed, areaRate, None)) // Lead doesn't matter, doesn't influence. + if (IsRatePass(seed, areaRate)) // Lead doesn't matter, doesn't influence (Emerald Rock Smash ignores ability). { seed = LCRNG.Prev(seed); return true; @@ -644,7 +640,7 @@ private static bool IsRockSmashPossible(byte areaRate, ref uint seed) private const ushort MaxEncounterRate = 2880; // 0xB40 - private static bool IsRatePass(uint seed, byte areaRate, LeadRequired lead, bool ignoreAbility = true) + private static bool IsRatePass(uint seed, byte areaRate, LeadRequired lead = None, bool ignoreAbility = true) { var u16 = seed >> 16; var encRate = GetEncounterRate(areaRate, lead, ignoreAbility); @@ -654,7 +650,7 @@ private static bool IsRatePass(uint seed, byte areaRate, LeadRequired lead, bool private static uint GetEncounterRate(byte areaRate, LeadRequired lead, bool ignoreAbility) { uint encRate = areaRate * 16u; - // We intend to pass the encounter, as we want an encounter to trigger. + // We desire to pass the encounter, as we want an encounter to trigger. // Player on a Bike adjusts by *80 /100. We assume the player is not on a bike. // Cleanse Tag adjusts by *2 /3. We assume the player is not using a Cleanse Tag. // Black Flute adjusts by /2. We assume the player is not using a Black Flute. diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodJ.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodJ.cs index 908df94fe..4c51b327b 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodJ.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodJ.cs @@ -7,7 +7,6 @@ namespace PKHeX.Core; /// public static class GenerateMethodJ { - /// Encounter slot to generate for extension(T enc) where T : IEncounterSlot4 { /// @@ -33,8 +32,7 @@ public uint SetRandomJ(PK4 pk, PersonalInfo4 pi, in EncounterCriteria criteria, { if (checkProc) { - var check = new LeadSeed(seed, LeadRequired.None); - if (!MethodJ.CheckEncounterActivation(enc, ref check)) + if (!MethodJ.CheckEncounterActivation(enc, seed, LeadRequired.None, out _)) { seed = LCRNG.Next(seed); continue; diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodK.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodK.cs index 10625ed30..9bff9423a 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodK.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodK.cs @@ -33,8 +33,7 @@ public uint SetRandomK(PK4 pk, PersonalInfo4 pi, in EncounterCriteria criteria, { if (checkProc) { - var check = new LeadSeed(seed, LeadRequired.None); - if (!MethodK.CheckEncounterActivation(enc, ref check)) + if (!MethodK.CheckEncounterActivation(enc, seed, LeadRequired.None, out _)) { seed = LCRNG.Next(seed); continue; diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodJ.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodJ.cs index 3a7235b4b..8fffbca2f 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodJ.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodJ.cs @@ -32,7 +32,7 @@ public static class MethodJ /// Used when generating or ignoring level ranges. /// public static LeadSeed GetSeed(TEnc enc, uint seed) where TEnc : IEncounterSlot4 - => GetSeed(enc, seed, enc, 0); + => GetSeed(enc, seed, enc, FormatNoLevelCheck); /// Used when generating with specific level ranges. /// @@ -54,6 +54,7 @@ public static class MethodJ // Feebas Spot: rand() >> 15 == 1; -- 0 will use regular encounters. private const byte Format = 4; + private const byte FormatNoLevelCheck = 0; // anything but `Format` will ignore met level precision (overwritten via transfer, test logic, etc.) private static bool IsCuteCharmFail(uint rand) => (rand / 0x5556) == 0; // 1/3 odds private static bool IsCuteCharmPass(uint rand) => (rand / 0x5556) != 0; // 2/3 odds @@ -86,13 +87,10 @@ public static LeadSeed GetOriginSeed(T enc, uint seed, byte nature, int rever { if (TryGetMatch(enc, levelMin, levelMax, seed, nature, format, out var result)) { - if (CheckEncounterActivation(enc, ref result)) - { - if (result.IsNoRequirement) - return result; - if (result.IsBetterThan(prefer)) - prefer = result; - } + if (result.IsNoRequirement) + return result; + if (result.IsBetterThan(prefer)) + prefer = result; } if (reverseCount == 0) return prefer; @@ -122,48 +120,45 @@ public static uint SkipToLevelRand(T enc, uint seed) return LCRNG.Next3(seed); // Proc, ESV, level. } - public static bool CheckEncounterActivation(T enc, ref LeadSeed result) + /// + /// Checks an input seed and lead by unrolling to the encounter trigger state and checking the encounter conditions along the way. + /// + /// Encounter to check against. + /// Seed that immediately selects the encounter slot. + /// Party lead effect that is active at the moment of encounter slot selection. + /// Un-rolled seed and lead at the moment of encounter trigger, if the check passes. + /// if the seed and lead can trigger the encounter; otherwise, . + /// + /// It is necessary to check this when exploring possible leads, as different leads (or lack thereof) may consume a different quantity of RNG calls. + /// + public static bool CheckEncounterActivation(T enc, uint seed, LeadRequired lead, out LeadSeed result) where T : IEncounterSlot4 { - if (enc.Type.IsFishingRodType()) - { - if (enc is EncounterSlot4 { Parent.IsCoronetFeebasArea: true } s4) - { - if (!IsValidCoronetB1F(s4, ref result.Seed)) - return false; - } - // D/P/Pt don't update the rod rate boost for Suction Cups or Sticky Hold correctly. - return IsFishPossible(enc.Type, ref result.Seed); - } - if (enc.Type is HoneyTree) - { - // Doesn't actually consume the Encounter Slot call, we return true when comparing ESV. - // Roll forward once here rather than add a branch in each method. - ref var seed = ref result.Seed; - seed = LCRNG.Next(seed); - } - // Can sweet scent trigger. - return true; + var pass = CheckEncounterActivation(enc, ref seed, ref lead); + result = new(seed, lead); + return pass; } - private static bool CheckEncounterActivation(T enc, ref uint result) + private static bool CheckEncounterActivation(T enc, ref uint seed, ref LeadRequired _) where T : IEncounterSlot4 { - // Lead is required to be Cute Charm. if (enc.Type.IsFishingRodType()) { if (enc is EncounterSlot4 { Parent.IsCoronetFeebasArea: true } s4) { - if (!IsValidCoronetB1F(s4, ref result)) + // 50% chance to replace the regular encounter with Feebas, only if on the tile. + if (!IsValidCoronetB1F(s4, ref seed)) return false; + // Previous frame still has to pass the rod check. } - return IsFishPossible(enc.Type, ref result); + // D/P/Pt don't update the rod rate boost for Suction Cups or Sticky Hold correctly. Having them as lead is equivalent to None. + return IsFishPossible(enc.Type, ref seed); } if (enc.Type is HoneyTree) { // Doesn't actually consume the Encounter Slot call, we return true when comparing ESV. // Roll forward once here rather than add a branch in each method. - result = LCRNG.Next(result); + seed = LCRNG.Next(seed); } // Can sweet scent trigger. return true; @@ -173,6 +168,7 @@ private static bool CheckEncounterActivation(T enc, ref uint result) { // The game rolls to check if it might need to replace the slots with Feebas. // This occurs in Mt. Coronet B1F; if passed, check if the player is on a Feebas tile before replacing. + // The rand() call is unavoidable when fishing in the area, regardless of fishing from a valid tile. // 0 - Hook // 1 - CheckTiles -- current seed // 2 - ESV @@ -181,7 +177,6 @@ private static bool CheckEncounterActivation(T enc, ref uint result) // Regular slots don't need to falsify the rand(). // Players can just fish from a non-Feebas tile. - // The rand() call is unavoidable when in the area. result = LCRNG.Prev(result); return true; } @@ -202,9 +197,8 @@ public static bool TryGetMatchCuteCharm(T enc, ReadOnlySpan seeds, byte if (!TryGetMatchCuteCharm(ctx, out var s)) continue; - if (!CheckEncounterActivation(enc, ref s)) + if (!CheckEncounterActivation(enc, s, CuteCharm, out result)) continue; - result = new(s, CuteCharm); return true; } if (CanRadar(enc)) @@ -243,11 +237,8 @@ private static bool TryGetMatch(T enc, byte levelMin, byte levelMax, uint see if (syncProc && !(enc.Type is Grass && enc.LevelMax < levelMin)) { var ctx = new FrameCheckDetails(enc, seed, levelMin, levelMax, format); - if (IsSlotValidRegular(ctx, out seed)) - { - result = new(seed, Synchronize); + if (IsSlotValidRegular(ctx, out result, Synchronize)) return true; - } if (CanRadar(enc)) { result = new(ctx.Seed1, SynchronizeRadar); @@ -311,33 +302,33 @@ private static bool TryGetMatchNoSync(in FrameCheckDetails ctx, out LeadSe { if (ctx.Encounter.LevelMax > ctx.LevelMin) // Must be boosted via Pressure/Hustle/Vital Spirit { - if (IsSlotValidHustleVital(ctx, out var pressure)) - { result = new(pressure, PressureHustleSpirit); return true; } + if (IsSlotValidHustleVital(ctx, out var pressure) && CheckEncounterActivation(ctx.Encounter, pressure, PressureHustleSpirit, out result)) + return true; result = default; return false; } } - if (IsSlotValidRegular(ctx, out uint seed)) - { result = new(seed, None); return true; } + if (IsSlotValidRegular(ctx, out result)) + return true; - if (IsSlotValidSyncFail(ctx, out seed)) - { result = new(seed, SynchronizeFail); return true; } - if (IsSlotValidCuteCharmFail(ctx, out seed)) - { result = new(seed, CuteCharmFail); return true; } - if (IsSlotValidHustleVitalFail(ctx, out seed)) - { result = new(seed, PressureHustleSpiritFail); return true; } - if (IsSlotValidStaticMagnetFail(ctx, out seed)) - { result = new(seed, StaticMagnetFail); return true; } + if (IsSlotValidSyncFail(ctx, out var seed) && CheckEncounterActivation(ctx.Encounter, seed, SynchronizeFail, out result)) + return true; + if (IsSlotValidCuteCharmFail(ctx, out seed) && CheckEncounterActivation(ctx.Encounter, seed, CuteCharmFail, out result)) + return true; + if (IsSlotValidHustleVitalFail(ctx, out seed) && CheckEncounterActivation(ctx.Encounter, seed, PressureHustleSpiritFail, out result)) + return true; + if (IsSlotValidStaticMagnetFail(ctx, out seed) && CheckEncounterActivation(ctx.Encounter, seed, StaticMagnetFail, out result)) + return true; // Intimidate/Keen Eye failing will result in no encounter. - if (IsSlotValidStaticMagnet(ctx, out seed, out var lead)) - { result = new(seed, lead); return true; } - if (IsSlotValidIntimidate(ctx, out seed)) - { result = new(seed, IntimidateKeenEyeFail); return true; } + if (IsSlotValidStaticMagnet(ctx, out seed, out var sm) && CheckEncounterActivation(ctx.Encounter, seed, sm, out result)) + return true; + if (IsSlotValidIntimidate(ctx, out seed) && CheckEncounterActivation(ctx.Encounter, seed, IntimidateKeenEyeFail, out result)) + return true; if (ctx.Encounter.PressureLevel <= ctx.LevelMax) // Can be boosted, or not. { - if (IsSlotValidHustleVital(ctx, out var pressure)) - { result = new(pressure, PressureHustleSpirit); return true; } + if (IsSlotValidHustleVital(ctx, out var pressure) && CheckEncounterActivation(ctx.Encounter, pressure, PressureHustleSpirit, out result)) + return true; } if (CanRadar(ctx.Encounter)) @@ -367,23 +358,23 @@ private static bool IsSlotValidFrom1Skip(FrameCheckDetails ctx, out uint r result = 0; return false; } - private static bool IsSlotValidRegular(in FrameCheckDetails ctx, out uint result) + private static bool IsSlotValidRegular(in FrameCheckDetails ctx, out LeadSeed result, LeadRequired lead = None) where T : IEncounterSlot4 { if (IsLevelRand(ctx.Encounter)) { - if (ctx.Encounter.IsFixedLevel|| IsLevelValid(ctx.Encounter, ctx.LevelMin, ctx.LevelMax, ctx.Format, ctx.Prev1)) + if (ctx.Encounter.IsFixedLevel || IsLevelValid(ctx.Encounter, ctx.LevelMin, ctx.LevelMax, ctx.Format, ctx.Prev1)) { - if (IsSlotValid(ctx.Encounter, ctx.Prev2)) - { result = ctx.Seed3; return true; } + if (IsSlotValid(ctx.Encounter, ctx.Prev2) && CheckEncounterActivation(ctx.Encounter, ctx.Seed3, lead, out result)) + return true; } } else // Not random level { - if (IsSlotValid(ctx.Encounter, ctx.Prev1)) - { result = ctx.Seed2; return true; } + if (IsSlotValid(ctx.Encounter, ctx.Prev1) && CheckEncounterActivation(ctx.Encounter, ctx.Seed2, lead, out result)) + return true; } - result = 0; return false; + result = default; return false; } private static bool IsSlotValidHustleVital(in FrameCheckDetails ctx, out uint result) diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs index fdb0467b9..9080d12c3 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs @@ -25,23 +25,31 @@ public static class MethodK /// Used when generating or ignoring level ranges. /// public static LeadSeed GetSeed(TEnc enc, uint seed) where TEnc : IEncounterSlot4 - => GetSeed(enc, seed, enc, 0); + => GetSeed(enc, seed, enc, FormatNoLevelCheck); /// Used when generating with specific level ranges. /// public static LeadSeed GetSeed(TEnc enc, uint seed, TEvo evo) where TEnc : IEncounterSlot4 where TEvo : ILevelRange - => GetSeed(enc, seed, evo, 4); + => GetSeed(enc, seed, evo, Format); - public static LeadSeed GetSeed(TEnc enc, uint seed, byte levelMin, byte levelMax, byte format = Format, int depth = 0) + /// Recursion depth for checking re-rolls. 0 for no recursion, up to 4 for exhausted recursion (default 0). + /// Force a specific nature for synchronization (default random). + /// + /// The additional optional parameters are used internally to track the state of recursion solving for repeat IV attempts. Calling this method externally should omit them. + /// + /// + // ReSharper disable InvalidXmlDocComment + public static LeadSeed GetSeed(TEnc enc, uint seed, byte levelMin, byte levelMax, byte format = Format, int depth = 0, Nature forceSyncLead = UnsetLead) + // ReSharper restore InvalidXmlDocComment where TEnc : IEncounterSlot4 { var pid = ClassicEraRNG.GetSequentialPID(seed); var nature = (byte)(pid % 25); var frames = GetReversalWindow(seed, nature); - return GetOriginSeed(enc, seed, nature, frames, levelMin, levelMax, format, depth); + return GetOriginSeed(enc, seed, nature, frames, levelMin, levelMax, format, depth, forceSyncLead); } /// @@ -57,6 +65,7 @@ public static LeadSeed GetSeed(TEnc enc, uint seed, byte levelMin, byte le // Intimidate/Keen Eye: rand() & 1 == 1; -- 0 will reject the encounter. private const byte Format = 4; + private const byte FormatNoLevelCheck = 0; // anything but `Format` will ignore met level precision (overwritten via transfer, test logic, etc.) private static bool IsCuteCharmFail(uint rand) => (rand % 3) == 0; // 1/3 odds private static bool IsCuteCharmPass(uint rand) => (rand % 3) != 0; // 2/3 odds @@ -78,13 +87,13 @@ public static LeadSeed GetSeed(TEnc enc, uint seed, byte levelMin, byte le /// /// Gets the first possible origin seed and lead for the input encounter & constraints. /// - public static LeadSeed GetOriginSeed(T enc, uint seed, byte nature, int reverseCount, byte levelMin, byte levelMax, byte format = Format, int depth = 0) + public static LeadSeed GetOriginSeed(T enc, uint seed, byte nature, int reverseCount, byte levelMin, byte levelMax, byte format = Format, int depth = 0, Nature forceSyncLead = UnsetLead) where T : IEncounterSlot4 { LeadSeed prefer = default; while (true) { - if (TryGetMatch(enc, levelMin, levelMax, seed, nature, format, out var result, depth)) + if (TryGetMatch(enc, levelMin, levelMax, seed, nature, format, out var result, depth, forceSyncLead)) { if (result.IsNoRequirement) return result; @@ -114,18 +123,36 @@ public static uint SkipToLevelRand(T enc, uint seed, LeadRequired lead) return LCRNG.Next2(seed); // ESV, level. } - public static bool CheckEncounterActivation(T enc, ref LeadSeed result) + /// + /// Checks an input seed and lead by unrolling to the encounter trigger state and checking the encounter conditions along the way. + /// + /// Encounter to check against. + /// Seed that immediately selects the encounter slot. + /// Party lead effect that is active at the moment of encounter slot selection. + /// Un-rolled seed and lead at the moment of encounter trigger, if the check passes. + /// if the seed and lead can trigger the encounter; otherwise, . + /// + /// It is necessary to check this when exploring possible leads, as different leads (or lack thereof) may consume a different quantity of RNG calls. + /// + public static bool CheckEncounterActivation(T enc, uint seed, LeadRequired lead, out LeadSeed result) + where T : IEncounterSlot4 + { + var pass = CheckEncounterActivation(enc, ref seed, ref lead); + result = new(seed, lead); + return pass; + } + + private static bool CheckEncounterActivation(T enc, ref uint seed, ref LeadRequired lead) where T : IEncounterSlot4 { if (enc.Type.IsFishingRodType()) - return IsFishPossible(enc.Type, ref result.Seed, ref result.Lead); + return IsFishPossible(enc.Type, ref seed, ref lead); if (enc.Type is Rock_Smash) - return IsRockSmashPossible(enc.AreaRate, ref result.Seed, ref result.Lead); + return IsRockSmashPossible(enc.AreaRate, ref seed, ref lead); // Ability & Sweet Scent deadlock for BCC: - if (enc.Type is BugContest && !result.Lead.IsAbleToSweetScent()) - return IsBugContestPossibleDeadlock(enc.AreaRate, ref result.Seed); - + if (enc.Type is BugContest && !lead.IsAbleToSweetScent()) + return IsBugContestPossibleDeadlock(enc.AreaRate, ref seed); // Can sweet scent trigger. return true; } @@ -139,22 +166,6 @@ public static bool CheckEncounterActivation(T enc, ref LeadSeed result) // Static/Magnet Pull: None ; - private static bool CheckEncounterActivationCuteCharm(T enc, ref uint result) where T : IEncounterSlot4 - { - // Lead is required to be Cute Charm. - if (enc.Type.IsFishingRodType()) - return IsFishPossible(enc.Type, ref result); - if (enc.Type is Rock_Smash) - return IsRockSmashPossible(enc.AreaRate, ref result); - - // Ability & Sweet Scent deadlock for BCC: - if (enc.Type is BugContest) // No species with Sweet Scent can have Cute Charm. - return IsBugContestPossibleDeadlock(enc.AreaRate, ref result); - - // Can sweet scent trigger. - return true; - } - /// /// Attempts to find a matching seed for the given encounter and constraints for Cute Charm buffered PIDs. /// @@ -170,17 +181,16 @@ public static bool TryGetMatchCuteCharm(T enc, ReadOnlySpan seeds, byte var ctx = new FrameCheckDetails(enc, seed, levelMin, levelMax, format); if (!TryGetMatchCuteCharm(ctx, out var s)) continue; - if (!CheckEncounterActivationCuteCharm(enc, ref s)) + if (!CheckEncounterActivation(enc, s, CuteCharm, out result)) continue; - - result = new(s, CuteCharm); return true; } result = default; return false; } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static bool TryGetMatch(T enc, byte levelMin, byte levelMax, uint seed, byte nature, byte format, out LeadSeed result, int depth = 0) + private static bool TryGetMatch(T enc, byte levelMin, byte levelMax, uint seed, byte nature, byte format, + out LeadSeed result, int depth = 0, Nature forceSyncLead = UnsetLead) where T : IEncounterSlot4 { var p0 = seed >> 16; // 0 @@ -188,35 +198,77 @@ private static bool TryGetMatch(T enc, byte levelMin, byte levelMax, uint see if (reg) { var ctx = new FrameCheckDetails(enc, seed, levelMin, levelMax, format); - if (TryGetMatchNoSync(ctx, out result) && CheckEncounterActivation(enc, ref result)) - return true; - if (depth != 4 && enc is EncounterSlot4 s && (s.IsBugContest || s.IsSafariHGSS)) - return Recurse4x(enc, levelMin, levelMax, seed, nature, format, out result, ++depth); - } - else if (IsSyncPass(p0) && !(enc.Type is Grass && enc.LevelMax < levelMin)) - { - var ctx = new FrameCheckDetails(enc, seed, levelMin, levelMax, format); - if (IsSlotValidRegular(ctx, out seed)) + // Ideally, we don't need to check the recursion. Eagerly check the non-recursive paths. + if (forceSyncLead == UnsetLead) { - result = new(seed, Synchronize); - if (CheckEncounterActivation(enc, ref result)) + if (TryGetMatchNoSync(ctx, out result)) + return true; + } + else // Recursion demands a specific/unspecific synchronization nature. + { + if (TryGetMatchOnlyFailSync(ctx, out result)) + { + if (forceSyncLead is not FailSyncLead) // If we locked in a specific synchronization nature yet, prefer to indicate the end result. + result.Lead = Synchronize; // Override back to the end-result synchronize. + return true; + } + } + + // If rerolls can reach here from a failed synchronize check (unknown nature), then check that path as well. + if (depth != MaxSafariContest && enc is EncounterSlot4 { IsRerollMinimum31: true }) + { + var prev = ctx.Seed1; + if (!IsSyncPass(prev >> 16)) + { + var lead = forceSyncLead == UnsetLead ? FailSyncLead : forceSyncLead; + if (RecurseReject(enc, levelMin, levelMax, prev, format, out result, depth + 1, lead)) + return true; + } + } + } + + // Check for a successful sync activation. + // If recursion demands us to be a specific synchronization nature, ensure it matches. If not, can't be a sync activation. + if (forceSyncLead is not (UnsetLead or FailSyncLead)) + { + if (forceSyncLead != (Nature)nature) + { + result = default; + return false; + } + } + + var syncProc = IsSyncPass(p0); + if (syncProc && !(enc.Type is Grass && enc.LevelMax < levelMin)) + { + var ctx = new FrameCheckDetails(enc, seed, levelMin, levelMax, format); + if (IsSlotValidRegular(ctx, out result, Synchronize)) + return true; + + if (depth != MaxSafariContest && enc is EncounterSlot4 { IsRerollMinimum31: true }) + { + if (RecurseReject(enc, levelMin, levelMax, seed, format, out result, depth + 1, (Nature)nature)) return true; } - if (depth != 4 && enc is EncounterSlot4 s && (s.IsBugContest || s.IsSafariHGSS)) - return Recurse4x(enc, levelMin, levelMax, seed, nature, format, out result, ++depth); } result = default; return false; } private const int MaxSafariContest = 4; + private const Nature UnsetLead = Nature.Random; // lock in if the generation target requires a sync lead + private const Nature FailSyncLead = unchecked((Nature)(-1)); - private static bool Recurse4x(T enc, byte levelMin, byte levelMax, uint seed, byte nature, byte format, - out LeadSeed result, int depth) + /// + /// Recursive method to check if the input seed could have been generated after 1-4 failed attempts at re-rolling for 31-IVs. + /// + private static bool RecurseReject(T enc, byte levelMin, byte levelMax, uint seed, byte format, out LeadSeed result, int depth, Nature forceSyncLead) where T : IEncounterSlot4 { - // When generating Pokémon's IVs, the game tries to give at least one flawless IV. - // The game will roll the {nature,PID/IV} up to 4 times if none of the IVs are at 31 (total of 3 re-rolls) + // The game will roll the {(sync,)nature..PID/IV} up to 4 times if none of the IVs are at 31 (total of 3 failed attempts at re-rolls). + + // Entering this method, the RNG state (seed) is the nature/sync call that generates the Pokémon we're solving for. + // Check that the previous 2 frames are a valid rejection for IVs, then recurse to generate that "failed" as our PID/IV origin search. result = default; // Use the depth to keep track of how many we have already burned. @@ -224,47 +276,29 @@ private static bool TryGetMatch(T enc, byte levelMin, byte levelMax, uint see if (depth == MaxSafariContest) return false; - // Check if the previous 4 frames were a 31-IV Pokémon. If so, it couldn't have been re-rolled from. - // If it was, we can adjust our parameters and try the entire search again (expensive!) + // Ensure if the previous 4 consumed frames {PID,PID,IV,IV} yielded a 31-IV Pokémon. If so, it couldn't have been re-rolled from. + var iv2 = LCRNG.Prev16(ref seed); + if (IsAny31(iv2)) + return false; + var iv1 = LCRNG.Prev16(ref seed); + if (IsAny31(iv1)) + return false; + // Cool, the skipped Pokémon was not 31-IV. + // The skipped Pokémon probably had a different nature, so we need to be sure to use that result when recursing. + seed = LCRNG.Prev3(seed); // Jump back before the PID frames; origin generates the (PID+badIVs) - // First we need to determine how far back we can permit the previous skipped encounter to be originating from. - // Our only requirement is that the nature PID we currently have not been generated. - // This is the same "solved" problem as the regular reversal window. + // We need to repeat the entire top-level check with slightly adjusted parameters. + // The recursion will check that this fail-skipped can be generated (skipped PID/IV could have been landed on via its nature/sync check). + // The innate recursion will return true if the skipped frame could have been landed on, or if an even-more previous fail-skipped was landed. + // We pass in the `forceSyncLead` param in the event we just locked into a specific synchronization nature that must be used by all previous fail-skips. + // The synchronization nature lock-in is required, to prevent the recursion fail-skips from matching a different lead/sync nature. + result = GetSeed(enc, seed, levelMin, levelMax, format, depth, forceSyncLead); + if (result.IsValid) + return true; - // Each loop we have a ~18.75% chance to hit a >=1 31 IV setup and return false. - // On average, we look back 5-6 times. - bool breakNext = false; - while (true) - { - var iv2 = seed >> 16; - if (IsAny31(iv2)) - return false; - - var iv1 = LCRNG.Prev16(ref seed); - if (IsAny31(iv1)) - return false; - - // Since we're looking backwards and doing recursion in the same method, we need to ensure we don't exceed our previous nature window. - var sanityNature = ClassicEraRNG.GetSequentialPID(seed) % 25; - if (sanityNature == nature) - breakNext = true; - - // Cool, the skipped Pokémon was not 31-IV. Let's try again. - // The skipped Pokémon probably had a different nature, so we need to use that value instead. - // We basically need to repeat the entire top-level check with slightly adjusted parameters. - var origin = LCRNG.Prev2(seed); - - // We need to double-check that this skipped PID/IV could have been landed on via the nature/sync check. - // The innate recursion will return true if the skipped frame could have been landed on, or if an even-more previous skipped was landed. - result = GetSeed(enc, origin, levelMin, levelMax, format, depth); - if (result.IsValid) - return true; - - // If the forwards window no longer lets us land on the frame we entered this method from, the window is exhausted. - // We need to do at least one recursion as the 4 calls we look backwards from will hide a double-nature PID/frame pair. - if (breakNext) - return false; // Window exhausted, this nature would have been chosen instead of the frame we entered this method from. - } + // This rejection target can't be reached from any starting point. + // The (unreachable) RNG calls that follow will not be able to generate our input target. + return false; } /// @@ -325,6 +359,23 @@ private static bool IsSlotValidHustleVitalFail(in FrameCheckDetails ctx, o return IsSlotValidFrom1Skip(ctx, out result); } + private static bool TryGetMatchOnlyFailSync(in FrameCheckDetails ctx, out LeadSeed result) + where T : IEncounterSlot4 + { + if (ctx.Encounter.Type is Grass) + { + if (ctx.Encounter.LevelMax < ctx.LevelMin) // Must be boosted via Pressure/Hustle/Vital Spirit + { + result = default; return false; + } + } + + if (IsSlotValidSyncFail(ctx, out var seed) && CheckEncounterActivation(ctx.Encounter, seed, SynchronizeFail, out result)) + return true; + + result = default; return false; + } + private static bool TryGetMatchNoSync(in FrameCheckDetails ctx, out LeadSeed result) where T : IEncounterSlot4 { @@ -332,33 +383,33 @@ private static bool TryGetMatchNoSync(in FrameCheckDetails ctx, out LeadSe { if (ctx.Encounter.LevelMax < ctx.LevelMin) // Must be boosted via Pressure/Hustle/Vital Spirit { - if (IsSlotValidHustleVital(ctx, out var pressure)) - { result = new(pressure, PressureHustleSpirit); return true; } + if (IsSlotValidHustleVital(ctx, out var pressure) && CheckEncounterActivation(ctx.Encounter, pressure, PressureHustleSpirit, out result)) + return true; result = default; return false; } } - if (IsSlotValidRegular(ctx, out uint seed)) - { result = new(seed, None); return true; } + if (IsSlotValidRegular(ctx, out result)) + return true; - if (IsSlotValidSyncFail(ctx, out seed)) - { result = new(seed, SynchronizeFail); return true; } - if (IsSlotValidCuteCharmFail(ctx, out seed)) - { result = new(seed, CuteCharmFail); return true; } - if (IsSlotValidHustleVitalFail(ctx, out seed)) - { result = new(seed, PressureHustleSpiritFail); return true; } - if (IsSlotValidStaticMagnetFail(ctx, out seed)) - { result = new(seed, StaticMagnetFail); return true; } + if (IsSlotValidSyncFail(ctx, out var seed) && CheckEncounterActivation(ctx.Encounter, seed, SynchronizeFail, out result)) + return true; + if (IsSlotValidCuteCharmFail(ctx, out seed) && CheckEncounterActivation(ctx.Encounter, seed, CuteCharmFail, out result)) + return true; + if (IsSlotValidHustleVitalFail(ctx, out seed) && CheckEncounterActivation(ctx.Encounter, seed, PressureHustleSpiritFail, out result)) + return true; + if (IsSlotValidStaticMagnetFail(ctx, out seed) && CheckEncounterActivation(ctx.Encounter, seed, StaticMagnetFail, out result)) + return true; // Intimidate/Keen Eye failing will result in no encounter. - if (IsSlotValidStaticMagnet(ctx, out seed, out var sm)) - { result = new(seed, sm); return true; } - if (IsSlotValidIntimidate(ctx, out seed)) - { result = new(seed, IntimidateKeenEyeFail); return true; } + if (IsSlotValidStaticMagnet(ctx, out seed, out var sm) && CheckEncounterActivation(ctx.Encounter, seed, sm, out result)) + return true; + if (IsSlotValidIntimidate(ctx, out seed) && CheckEncounterActivation(ctx.Encounter, seed, IntimidateKeenEyeFail, out result)) + return true; if (ctx.Encounter.PressureLevel <= ctx.LevelMax) // Can be boosted, or not. { - if (IsSlotValidHustleVital(ctx, out var pressure)) - { result = new(pressure, PressureHustleSpirit); return true; } + if (IsSlotValidHustleVital(ctx, out var pressure) && CheckEncounterActivation(ctx.Encounter, pressure, PressureHustleSpirit, out result)) + return true; } result = default; return false; @@ -385,23 +436,23 @@ private static bool IsSlotValidFrom1Skip(FrameCheckDetails ctx, out uint r result = 0; return false; } - private static bool IsSlotValidRegular(in FrameCheckDetails ctx, out uint result) + private static bool IsSlotValidRegular(in FrameCheckDetails ctx, out LeadSeed result, LeadRequired lead = None) where T : IEncounterSlot4 { if (IsLevelRand(ctx.Encounter)) { if (ctx.Encounter.IsFixedLevel || IsLevelValid(ctx.Encounter, ctx.LevelMin, ctx.LevelMax, ctx.Format, ctx.Prev1)) { - if (IsSlotValid(ctx.Encounter, ctx.Prev2)) - { result = ctx.Seed3; return true; } + if (IsSlotValid(ctx.Encounter, ctx.Prev2) && CheckEncounterActivation(ctx.Encounter, ctx.Seed3, lead, out result)) + return true; } } else // Not random level { - if (IsSlotValid(ctx.Encounter, ctx.Prev1)) - { result = ctx.Seed2; return true; } + if (IsSlotValid(ctx.Encounter, ctx.Prev1) && CheckEncounterActivation(ctx.Encounter, ctx.Seed2, lead, out result)) + return true; } - result = 0; return false; + result = default; return false; } private static bool IsSlotValidHustleVital(in FrameCheckDetails ctx, out uint result) @@ -572,37 +623,6 @@ private static bool IsFishPossible(SlotType4 encType, ref uint seed, ref LeadReq return false; } - // Lead is something else, and cannot be changed. Does the same as the above method without a ref LeadRequired. - private static bool IsFishPossible(SlotType4 encType, ref uint seed) - { - var rodRate = GetRodRate(encType); - var u16 = seed >> 16; - var roll = u16 % 100; - - // HG/SS: Lead (Following) Pokémon with >= 250 adds +50 to the rate. Assume the best case. - rodRate += 50; // This happens before Suction Cups / Sticky Hold, can be compounded. - if (roll < rodRate) // This will always succeed for Good/Super rod due to the base+bonus being >=100 - { - seed = LCRNG.Prev(seed); - return true; - } - - // Old Rod might reach here (75% < 100%) - return false; - } - - private static bool IsRockSmashPossible(byte areaRate, ref uint seed) - { - var u16 = seed >> 16; - var roll = u16 % 100; - if (roll < areaRate) - { - seed = LCRNG.Prev(seed); - return true; - } - return false; - } - private static bool IsRockSmashPossible(byte areaRate, ref uint seed, ref LeadRequired lead) { // No flute boost. diff --git a/PKHeX.Core/Legality/Restrictions/HomeQuirks.cs b/PKHeX.Core/Legality/Restrictions/HomeQuirks.cs index 1f3bd65a1..3898b7dc5 100644 --- a/PKHeX.Core/Legality/Restrictions/HomeQuirks.cs +++ b/PKHeX.Core/Legality/Restrictions/HomeQuirks.cs @@ -102,7 +102,7 @@ public static bool IsGlitchedHisuianZoroarkSV(PKM pk, IScaledSize s, int cardID) if (s is { HeightScalar: 255, WeightScalar: 255 }) { // if Scale is also present, should be 255. - return pk is not IScaledSize3 { Scale: not 255 }; + return pk is not IScaledSize3 { Scale: not 255 }; } return false; } From fa1d34d9703a39ff78cb54fe3bae0bd7fd660360 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 2 May 2026 00:03:34 -0500 Subject: [PATCH 05/81] Update EncounterStatic8.cs --- .../Legality/Encounters/Templates/Gen8/EncounterStatic8.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterStatic8.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterStatic8.cs index aa70d7a80..c5563c96c 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterStatic8.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterStatic8.cs @@ -27,7 +27,7 @@ public sealed record EncounterStatic8(GameVersion Version = GameVersion.SWSH) public Crossover8 Crossover { get; init; } public AreaWeather8 Weather { get; init; } = AreaWeather8.Normal; public byte DynamaxLevel { get; init; } - public Nature Nature { get; init; } + public Nature Nature { get; init; } = Nature.Random; public Shiny Shiny { get; init; } public AbilityPermission Ability { get; init; } public byte Gender { get; init; } = FixedGenderUtil.GenderRandom; From d11db7a1cb858f7e2a3ad9bf76b49808e597da95 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 2 May 2026 10:46:17 -0500 Subject: [PATCH 06/81] Gen4: add bcc/safari badIV recursion requirement Since BCC/Safari only roll PIDIV up to 4 times, a large amount of resulting-pk4 will still lack a 31 IV. These require the full recursion failure to be reached, so the traversal needs to travel up 4x before accepting an origin. Reduce parameter passing by wrapping the immutables/derived in a struct. Also clean up some level comparisons for lead:pressure boosting check, maybe DPPt's MethodJ impl was comparing wrong (didn't match MethodK). If we're above the encounter slot's level range, then it must have been pressure boosted. Don't bother checking for Grass type (the only type that can boost) as we already check that in the IsMatchExact yield. Unrelated: Add a unit test of an obvious genned mon EVs I laughed at when scrolling thru my HG save file. --- .../Legality/RNG/ClassicEra/Gen4/MethodJ.cs | 16 +-- .../Legality/RNG/ClassicEra/Gen4/MethodK.cs | 123 +++++++++++++----- ... KYOGRE - 7D62F8447ED2 untrained 85EVs.pk4 | Bin 0 -> 236 bytes 3 files changed, 95 insertions(+), 44 deletions(-) create mode 100644 Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/0382 - KYOGRE - 7D62F8447ED2 untrained 85EVs.pk4 diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodJ.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodJ.cs index 8fffbca2f..46bc975bf 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodJ.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodJ.cs @@ -234,7 +234,7 @@ private static bool TryGetMatch(T enc, byte levelMin, byte levelMax, uint see return TryGetMatchNoSync(ctx, out result); } var syncProc = IsSyncPass(p0); - if (syncProc && !(enc.Type is Grass && enc.LevelMax < levelMin)) + if (syncProc && !(levelMin > enc.LevelMax)) // can't boost level if already using Synchronize { var ctx = new FrameCheckDetails(enc, seed, levelMin, levelMax, format); if (IsSlotValidRegular(ctx, out result, Synchronize)) @@ -298,14 +298,12 @@ private static bool IsSlotValidHustleVitalFail(in FrameCheckDetails ctx, o private static bool TryGetMatchNoSync(in FrameCheckDetails ctx, out LeadSeed result) where T : IEncounterSlot4 { - if (ctx.Encounter.Type is Grass) + if (ctx.LevelMin > ctx.Encounter.LevelMax) { - if (ctx.Encounter.LevelMax > ctx.LevelMin) // Must be boosted via Pressure/Hustle/Vital Spirit - { - if (IsSlotValidHustleVital(ctx, out var pressure) && CheckEncounterActivation(ctx.Encounter, pressure, PressureHustleSpirit, out result)) - return true; - result = default; return false; - } + // Must be boosted via Pressure/Hustle/Vital Spirit + if (IsSlotValidHustleVital(ctx, out var pressure) && CheckEncounterActivation(ctx.Encounter, pressure, PressureHustleSpirit, out result)) + return true; + result = default; return false; } if (IsSlotValidRegular(ctx, out result)) @@ -325,7 +323,7 @@ private static bool TryGetMatchNoSync(in FrameCheckDetails ctx, out LeadSe return true; if (IsSlotValidIntimidate(ctx, out seed) && CheckEncounterActivation(ctx.Encounter, seed, IntimidateKeenEyeFail, out result)) return true; - if (ctx.Encounter.PressureLevel <= ctx.LevelMax) // Can be boosted, or not. + if (ctx.LevelMax >= ctx.Encounter.PressureLevel) // Can be boosted, or not. { if (IsSlotValidHustleVital(ctx, out var pressure) && CheckEncounterActivation(ctx.Encounter, pressure, PressureHustleSpirit, out result)) return true; diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs index 9080d12c3..e680457c7 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs @@ -41,15 +41,22 @@ public static class MethodK /// /// // ReSharper disable InvalidXmlDocComment - public static LeadSeed GetSeed(TEnc enc, uint seed, byte levelMin, byte levelMax, byte format = Format, int depth = 0, Nature forceSyncLead = UnsetLead) + private static LeadSeed GetSeed(TEnc enc, uint seed, byte levelMin, byte levelMax, byte format = Format, int depth = 0, Nature forceSyncLead = UnsetLead) // ReSharper restore InvalidXmlDocComment where TEnc : IEncounterSlot4 + { + var ctx = GetSearchContext(enc, seed, levelMin, levelMax, format); + return GetSeedCore(ctx, seed, depth, forceSyncLead); + } + + private static LeadSeed GetSeedCore(in SearchContext ctx, uint seed, int depth = 0, Nature forceSyncLead = UnsetLead) + where TEnc : IEncounterSlot4 { var pid = ClassicEraRNG.GetSequentialPID(seed); var nature = (byte)(pid % 25); var frames = GetReversalWindow(seed, nature); - return GetOriginSeed(enc, seed, nature, frames, levelMin, levelMax, format, depth, forceSyncLead); + return GetOriginSeed(ctx, seed, nature, frames, depth, forceSyncLead); } /// @@ -84,16 +91,31 @@ public static LeadSeed GetSeed(TEnc enc, uint seed, byte levelMin, byte le public static uint GetNature(uint rand) => rand % 25; + private static SearchContext GetSearchContext(T enc, uint seed, byte levelMin, byte levelMax, byte format) + where T : IEncounterSlot4 + { + var isRerollMinimum31 = enc is EncounterSlot4 { IsRerollMinimum31: true }; + var mustFailAllPreviousRerolls = isRerollMinimum31 && !HasAny31IV(seed); // 1-((31/32)^6)^4) = 53.32% for a BCC/Safari to arise with a 31-IV + return new(enc, levelMin, levelMax, format, isRerollMinimum31, mustFailAllPreviousRerolls); + } + /// /// Gets the first possible origin seed and lead for the input encounter & constraints. /// public static LeadSeed GetOriginSeed(T enc, uint seed, byte nature, int reverseCount, byte levelMin, byte levelMax, byte format = Format, int depth = 0, Nature forceSyncLead = UnsetLead) where T : IEncounterSlot4 + { + var ctx = GetSearchContext(enc, seed, levelMin, levelMax, format); + return GetOriginSeed(ctx, seed, nature, reverseCount, depth, forceSyncLead); + } + + private static LeadSeed GetOriginSeed(in SearchContext ctx, uint seed, byte nature, int reverseCount, int depth = 0, Nature forceSyncLead = UnsetLead) + where T : IEncounterSlot4 { LeadSeed prefer = default; while (true) { - if (TryGetMatch(enc, levelMin, levelMax, seed, nature, format, out var result, depth, forceSyncLead)) + if (TryGetMatch(ctx, seed, nature, out var result, depth, forceSyncLead)) { if (result.IsNoRequirement) return result; @@ -189,24 +211,23 @@ public static bool TryGetMatchCuteCharm(T enc, ReadOnlySpan seeds, byte } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static bool TryGetMatch(T enc, byte levelMin, byte levelMax, uint seed, byte nature, byte format, - out LeadSeed result, int depth = 0, Nature forceSyncLead = UnsetLead) + private static bool TryGetMatch(in SearchContext ctx, uint seed, byte nature, out LeadSeed result, int depth = 0, Nature forceSyncLead = UnsetLead) where T : IEncounterSlot4 { var p0 = seed >> 16; // 0 var reg = GetNature(p0) == nature; if (reg) { - var ctx = new FrameCheckDetails(enc, seed, levelMin, levelMax, format); + var frame = ctx.GetFrameRef(seed); // Ideally, we don't need to check the recursion. Eagerly check the non-recursive paths. if (forceSyncLead == UnsetLead) { - if (TryGetMatchNoSync(ctx, out result)) + if (TryGetMatchNoSync(frame, out result) && ctx.CanAcceptDirectMatch(depth)) return true; } else // Recursion demands a specific/unspecific synchronization nature. { - if (TryGetMatchOnlyFailSync(ctx, out result)) + if (TryGetMatchOnlyFailSync(frame, out result) && ctx.CanAcceptDirectMatch(depth)) { if (forceSyncLead is not FailSyncLead) // If we locked in a specific synchronization nature yet, prefer to indicate the end result. result.Lead = Synchronize; // Override back to the end-result synchronize. @@ -215,13 +236,13 @@ public static bool TryGetMatchCuteCharm(T enc, ReadOnlySpan seeds, byte } // If rerolls can reach here from a failed synchronize check (unknown nature), then check that path as well. - if (depth != MaxSafariContest && enc is EncounterSlot4 { IsRerollMinimum31: true }) + if (ctx.ShouldRecurse(depth)) { - var prev = ctx.Seed1; - if (!IsSyncPass(prev >> 16)) + var prev = frame.Seed1; + if (!IsSyncPass(prev >> 16) && !(ctx.LevelMin > ctx.Encounter.LevelMax)) // can't boost level if already using Synchronize { var lead = forceSyncLead == UnsetLead ? FailSyncLead : forceSyncLead; - if (RecurseReject(enc, levelMin, levelMax, prev, format, out result, depth + 1, lead)) + if (RecurseReject(ctx, prev, out result, depth + 1, lead)) return true; } } @@ -239,15 +260,15 @@ public static bool TryGetMatchCuteCharm(T enc, ReadOnlySpan seeds, byte } var syncProc = IsSyncPass(p0); - if (syncProc && !(enc.Type is Grass && enc.LevelMax < levelMin)) + if (syncProc && !(ctx.LevelMin > ctx.Encounter.LevelMax)) // can't boost level if already using Synchronize { - var ctx = new FrameCheckDetails(enc, seed, levelMin, levelMax, format); - if (IsSlotValidRegular(ctx, out result, Synchronize)) + var frame = ctx.GetFrameRef(seed); + if (IsSlotValidRegular(frame, out result, Synchronize) && ctx.CanAcceptDirectMatch(depth)) return true; - if (depth != MaxSafariContest && enc is EncounterSlot4 { IsRerollMinimum31: true }) + if (ctx.ShouldRecurse(depth)) { - if (RecurseReject(enc, levelMin, levelMax, seed, format, out result, depth + 1, (Nature)nature)) + if (RecurseReject(ctx, seed, out result, depth + 1, (Nature)nature)) return true; } } @@ -255,14 +276,13 @@ public static bool TryGetMatchCuteCharm(T enc, ReadOnlySpan seeds, byte return false; } - private const int MaxSafariContest = 4; private const Nature UnsetLead = Nature.Random; // lock in if the generation target requires a sync lead private const Nature FailSyncLead = unchecked((Nature)(-1)); /// /// Recursive method to check if the input seed could have been generated after 1-4 failed attempts at re-rolling for 31-IVs. /// - private static bool RecurseReject(T enc, byte levelMin, byte levelMax, uint seed, byte format, out LeadSeed result, int depth, Nature forceSyncLead) + private static bool RecurseReject(in SearchContext ctx, uint seed, out LeadSeed result, int depth, Nature forceSyncLead) where T : IEncounterSlot4 { // The game will roll the {(sync,)nature..PID/IV} up to 4 times if none of the IVs are at 31 (total of 3 failed attempts at re-rolls). @@ -273,8 +293,6 @@ private static bool RecurseReject(T enc, byte levelMin, byte levelMax, uint s // Use the depth to keep track of how many we have already burned. // First entry to this method will be 1/4 burned (final result). - if (depth == MaxSafariContest) - return false; // Ensure if the previous 4 consumed frames {PID,PID,IV,IV} yielded a 31-IV Pokémon. If so, it couldn't have been re-rolled from. var iv2 = LCRNG.Prev16(ref seed); @@ -292,7 +310,7 @@ private static bool RecurseReject(T enc, byte levelMin, byte levelMax, uint s // The innate recursion will return true if the skipped frame could have been landed on, or if an even-more previous fail-skipped was landed. // We pass in the `forceSyncLead` param in the event we just locked into a specific synchronization nature that must be used by all previous fail-skips. // The synchronization nature lock-in is required, to prevent the recursion fail-skips from matching a different lead/sync nature. - result = GetSeed(enc, seed, levelMin, levelMax, format, depth, forceSyncLead); + result = GetSeedCore(ctx, seed, depth, forceSyncLead); if (result.IsValid) return true; @@ -314,6 +332,16 @@ public static bool IsAny31(uint iv16) [MethodImpl(MethodImplOptions.AggressiveInlining)] private static bool IsLow5Bits31(uint iv16) => (iv16 & 0x1F) == 0x1F; + private static bool HasAny31IV(uint origin) + { + var seed = LCRNG.Next3(origin); // hop over pid,pid to get iv1 + var iv1 = seed >> 16; + if (IsAny31(iv1)) + return true; + var iv2 = LCRNG.Next16(ref seed); + return IsAny31(iv2); + } + private static bool TryGetMatchCuteCharm(in FrameCheckDetails ctx, out uint result) where T : IEncounterSlot4 { @@ -362,12 +390,10 @@ private static bool IsSlotValidHustleVitalFail(in FrameCheckDetails ctx, o private static bool TryGetMatchOnlyFailSync(in FrameCheckDetails ctx, out LeadSeed result) where T : IEncounterSlot4 { - if (ctx.Encounter.Type is Grass) + if (ctx.LevelMin > ctx.Encounter.LevelMax) { - if (ctx.Encounter.LevelMax < ctx.LevelMin) // Must be boosted via Pressure/Hustle/Vital Spirit - { - result = default; return false; - } + // Must be boosted via Pressure/Hustle/Vital Spirit + result = default; return false; } if (IsSlotValidSyncFail(ctx, out var seed) && CheckEncounterActivation(ctx.Encounter, seed, SynchronizeFail, out result)) @@ -379,14 +405,12 @@ private static bool TryGetMatchOnlyFailSync(in FrameCheckDetails ctx, out private static bool TryGetMatchNoSync(in FrameCheckDetails ctx, out LeadSeed result) where T : IEncounterSlot4 { - if (ctx.Encounter.Type is Grass) + if (ctx.LevelMin > ctx.Encounter.LevelMax) { - if (ctx.Encounter.LevelMax < ctx.LevelMin) // Must be boosted via Pressure/Hustle/Vital Spirit - { - if (IsSlotValidHustleVital(ctx, out var pressure) && CheckEncounterActivation(ctx.Encounter, pressure, PressureHustleSpirit, out result)) - return true; - result = default; return false; - } + // Must be boosted via Pressure/Hustle/Vital Spirit + if (IsSlotValidHustleVital(ctx, out var pressure) && CheckEncounterActivation(ctx.Encounter, pressure, PressureHustleSpirit, out result)) + return true; + result = default; return false; } if (IsSlotValidRegular(ctx, out result)) @@ -406,7 +430,7 @@ private static bool TryGetMatchNoSync(in FrameCheckDetails ctx, out LeadSe return true; if (IsSlotValidIntimidate(ctx, out seed) && CheckEncounterActivation(ctx.Encounter, seed, IntimidateKeenEyeFail, out result)) return true; - if (ctx.Encounter.PressureLevel <= ctx.LevelMax) // Can be boosted, or not. + if (ctx.LevelMax >= ctx.Encounter.PressureLevel) // Can be boosted, or not. { if (IsSlotValidHustleVital(ctx, out var pressure) && CheckEncounterActivation(ctx.Encounter, pressure, PressureHustleSpirit, out result)) return true; @@ -665,4 +689,33 @@ or Super_Rod or Safari_Old_Rod or Safari_Good_Rod or Safari_Super_Rod; + + /// + /// Wrapper to cache the encounter details for a given seed and level range, to avoid redundant calculations during recursion for Method K's minimum 31-IV re-roll logic. + /// + private readonly record struct SearchContext(T Encounter, byte LevelMin, byte LevelMax, byte CurrentEntityFormat, + bool IsRerollMinimum31, + bool MustFailAllPreviousRerolls) + where T : IEncounterSlot4 + { + public FrameCheckDetails GetFrameRef(uint seed) => new(Encounter, seed, LevelMin, LevelMax, CurrentEntityFormat); + + /// + /// For HG/SS Safari Zone and Bug Catching Contest: + /// When generating Pokémon's IVs, the game will reroll the numbers up to 4 times if none of the IVs are at 31. + /// + + private const int MaxSafariContest = 4; + + public bool CanAcceptDirectMatch(int depth) => !MustFailAllPreviousRerolls || depth == (MaxSafariContest - 1); + + public bool ShouldRecurse(int depth) + { + if (!IsRerollMinimum31) + return false; // No reroll requirement, no recursion. + if (depth >= MaxSafariContest) + return false; // Exhausted all possible rerolls. + return true; + } + } } diff --git a/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/0382 - KYOGRE - 7D62F8447ED2 untrained 85EVs.pk4 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/0382 - KYOGRE - 7D62F8447ED2 untrained 85EVs.pk4 new file mode 100644 index 0000000000000000000000000000000000000000..d2fcf15a8f1f7ac5414f094c4bf62cf0dd2877e7 GIT binary patch literal 236 zcmcaq=kkMrA*r^Gk%8gB*Dd#>l9(90nHX3@!GHk{EE%jAEEwi6@N=U literal 0 HcmV?d00001 From 7f752ebe7db9429f4e71c4a29f7b46da302a2705 Mon Sep 17 00:00:00 2001 From: Ka-n00b Date: Sat, 2 May 2026 19:23:37 -0400 Subject: [PATCH 07/81] Update Translations (#4792) - Updated Ribbons for all languages to match the most recent official names. - Finished off Italian UI and legality translations. - Some updates to FRLG's Spanish Event Flags. - Other miscellaneous additions, fixes, text fitting, and improvements for other languages. --- .../localize/legality/legality_de.json | 6 +- .../localize/legality/legality_es-419.json | 8 +- .../localize/legality/legality_es.json | 8 +- .../localize/legality/legality_it.json | 242 ++++++------- .../localize/legality/legality_ko.json | 28 +- .../text/other/de/text_Ribbons_de.txt | 82 ++--- .../text/other/en/text_Ribbons_en.txt | 4 +- .../text/other/es-419/text_Ribbons_es-419.txt | 92 ++--- .../text/other/es/text_Ribbons_es.txt | 86 ++--- .../text/other/fr/text_Ribbons_fr.txt | 16 +- .../text/other/it/text_Ribbons_it.txt | 110 +++--- .../text/other/ja/text_Ribbons_ja.txt | 208 +++++------ .../text/other/ko/text_Ribbons_ko.txt | 26 +- .../other/zh-Hans/text_Ribbons_zh-Hans.txt | 4 +- .../other/zh-Hant/text_Ribbons_zh-Hant.txt | 204 +++++------ .../text/script/gen3/const_frlg_es-419.txt | 2 +- .../text/script/gen3/const_frlg_es.txt | 2 +- .../text/script/gen3/flags_frlg_es-419.txt | 106 +++--- .../text/script/gen3/flags_frlg_es.txt | 106 +++--- PKHeX.WinForms/Resources/text/lang_de.txt | 57 +-- PKHeX.WinForms/Resources/text/lang_en.txt | 14 +- PKHeX.WinForms/Resources/text/lang_es-419.txt | 69 ++-- PKHeX.WinForms/Resources/text/lang_es.txt | 79 ++--- PKHeX.WinForms/Resources/text/lang_fr.txt | 101 +++--- PKHeX.WinForms/Resources/text/lang_it.txt | 331 +++++++++--------- PKHeX.WinForms/Resources/text/lang_ja.txt | 7 +- PKHeX.WinForms/Resources/text/lang_ko.txt | 81 ++--- .../Resources/text/lang_zh-Hans.txt | 5 +- .../Resources/text/lang_zh-Hant.txt | 9 +- 29 files changed, 1051 insertions(+), 1042 deletions(-) diff --git a/PKHeX.Core/Resources/localize/legality/legality_de.json b/PKHeX.Core/Resources/localize/legality/legality_de.json index 3ee79d412..7d0f0823a 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_de.json +++ b/PKHeX.Core/Resources/localize/legality/legality_de.json @@ -324,9 +324,9 @@ "TransferNotPossible": "Übertragung vom Ursprungsformat in das aktuelle Format nicht möglich.", "TransferMetLocation": "Ungültiger Transfer-Fundort.", "TransferNature": "Ungültiges Wesen für die Transfer-Erfahrungswerte.", - "TransferObedienceLevel": "Ungültiges Gehorsamskeits-Level.", - "TransferPIDECBitFlip": "PID sollte der EC entsprechen [mit umgekehrtem höchstwertigen Bit]!", - "TransferPIDECEquals": "PID sollte der EC entsprechen!", + "TransferObedienceLevel": "Ungültiges Gehorsams-Level.", + "TransferPIDECBitFlip": "PID sollte der Verschlüsselungskonstante entsprechen [mit umgekehrtem höchstwertigen Bit]!", + "TransferPIDECEquals": "PID sollte der Verschlüsselungskonstante entsprechen!", "TransferPIDECXor": "Verschlüsselungskonstante entspricht der mittels Shiny-XOR modifizierten PID.", "TransferTrackerMissing": "Pokémon HOME-Transfer-Tracker fehlt.", "TransferTrackerShouldBeZero": "Pokémon HOME-Transfer-Tracker sollte 0 sein.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_es-419.json b/PKHeX.Core/Resources/localize/legality/legality_es-419.json index 3862be252..92bc4720e 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_es-419.json +++ b/PKHeX.Core/Resources/localize/legality/legality_es-419.json @@ -254,9 +254,9 @@ "OT_SID0Invalid": "El SID16 debería ser 0.", "OT_TID0": "El TID16 es cero.", "OT_IDInvalid": "La combinación TID y SID no es posible.", - "PIDEncryptWurmple": "La constante de encriptado para la evolución de Wurmple no coincide.", - "PIDEncryptZero": "La constante de encriptado no está establecida.", - "PIDEqualsEC": "La constante de encriptado coincide con el PID.", + "PIDEncryptWurmple": "La constante de encriptación para la evolución de Wurmple no coincide.", + "PIDEncryptZero": "La constante de encriptación no está establecida.", + "PIDEqualsEC": "La constante de encriptación coincide con el PID.", "PIDGenderMatch": "El género coincide con el PID.", "PIDGenderMismatch": "El género y el PID no coinciden.", "PIDNatureMatch": "La naturaleza coincide con el PID.", @@ -327,7 +327,7 @@ "TransferObedienceLevel": "Nivel de obediencia inválido.", "TransferPIDECBitFlip": "¡El PID debería de ser igual a la CE [Con el primer dígito invertido]!", "TransferPIDECEquals": "¡El PID debería de ser igual a la CE!", - "TransferPIDECXor": "La constante de encriptado coincide con el PID brillante.", + "TransferPIDECXor": "La constante de encriptación coincide con el PID brillante.", "TransferTrackerMissing": "Falta el rastreador de transferencia de Pokémon HOME.", "TransferTrackerShouldBeZero": "El rastreador de transferencia de Pokémon HOME debería ser 0.", "TrashBytesExpected": "Se esperaban bytes de basura.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_es.json b/PKHeX.Core/Resources/localize/legality/legality_es.json index 5dee9a871..cfdd957e0 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_es.json +++ b/PKHeX.Core/Resources/localize/legality/legality_es.json @@ -254,9 +254,9 @@ "OT_SID0Invalid": "El SID16 debería ser 0.", "OT_TID0": "El TID16 es cero.", "OT_IDInvalid": "La combinación TID y SID no es posible.", - "PIDEncryptWurmple": "La constante de encriptado para la evolución de Wurmple no coincide.", - "PIDEncryptZero": "La constante de encriptado no está establecida.", - "PIDEqualsEC": "La constante de encriptado coincide con el PID.", + "PIDEncryptWurmple": "La constante de encriptación para la evolución de Wurmple no coincide.", + "PIDEncryptZero": "La constante de encriptación no está establecida.", + "PIDEqualsEC": "La constante de encriptación coincide con el PID.", "PIDGenderMatch": "El género coincide con el PID.", "PIDGenderMismatch": "El género y el PID no coinciden.", "PIDNatureMatch": "La naturaleza coincide con el PID.", @@ -327,7 +327,7 @@ "TransferObedienceLevel": "Nivel de obediencia inválido.", "TransferPIDECBitFlip": "¡El PID debería de ser igual a la CE [Con el primer dígito invertido]!", "TransferPIDECEquals": "¡El PID debería de ser igual a la CE!", - "TransferPIDECXor": "La constante de encriptado coincide con el PID variocolor.", + "TransferPIDECXor": "La constante de encriptación coincide con el PID variocolor.", "TransferTrackerMissing": "Falta el rastreador de transferencia de Pokémon HOME.", "TransferTrackerShouldBeZero": "El rastreador de transferencia de Pokémon HOME debería ser 0.", "TrashBytesExpected": "Se esperaban bytes de basura.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_it.json b/PKHeX.Core/Resources/localize/legality/legality_it.json index 871a329c2..0b75fb5d7 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_it.json +++ b/PKHeX.Core/Resources/localize/legality/legality_it.json @@ -10,7 +10,7 @@ "NotImplemented": "Non implementato", "AbilityCapsuleUsed": "Abilità disponibile con la Capsula Abilità.", "AbilityPatchUsed": "Abilità disponibile con il Cerotto Abilità.", - "AbilityPatchRevertUsed": "Ability available with Ability Patch Revert.", + "AbilityPatchRevertUsed": "Abilità disponibile con il ripristino del Cerotto Abilità.", "AbilityFlag": "Abilità corrispondente al Numero Abilità.", "AbilityHiddenFail": "Abilità Nascosta non corrispondente al Tipo di Incontro.", "AbilityHiddenUnavailable": "Abilità Nascosta non disponibile.", @@ -31,16 +31,16 @@ "BallSpecies": "Impossibile ottenere questa specie in questa Ball.", "BallSpeciesPass": "Ball possibile per la specie.", "BallUnavailable": "Ball inottenibile nella generazione di origine.", - "BallG4Sinnoh": "Ball value for D/P/Pt (0x83) is not within range.", - "BallG4Johto": "Extended Ball value for HG/SS (0x86) is not within range.", + "BallG4Sinnoh": "Il valore della Ball per D/P/Pt (0x83) non è compreso nell'intervallo.", + "BallG4Johto": "Il valore esteso della Ball per HG/SS (0x86) non è compreso nell'intervallo.", "ContestZero": "Le statistiche delle Gare dovrebbero essere 0.", "ContestZeroSheen": "Il Lustro dovrebbe essere 0.", "ContestSheenGEQ_0": "Il Lustro dovrebbe essere >= {0}.", "ContestSheenLEQ_0": "Il Lustro dovrebbe essere <= {0}.", - "DateCalendarInvalidMet": "Met Date is not a valid calendar date.", - "DateCalendarInvalidEgg": "Egg Met Date is not a valid calendar date.", - "DateLocalInvalidDate": "Local Date is outside of console's local time window.", - "DateLocalInvalidTime": "Local Time is not a valid timestamp.", + "DateCalendarInvalidMet": "La data di incontro non è una data valida del calendario.", + "DateCalendarInvalidEgg": "La data di ricezione dell'uovo non è una data valida del calendario.", + "DateLocalInvalidDate": "La data locale è al di fuori della finestra temporale della console.", + "DateLocalInvalidTime": "L'orario locale non è un timestamp valido.", "DateOutsideDistributionWindow": "La data di incontro è al di fuori del periodo di Distribuzione.", "EggContest": "Le statistiche delle gare non possono crescere per un Uovo.", "EggEXP": "Le Uova non possono ricevere esperienza.", @@ -69,16 +69,16 @@ "EncGiftNicknamed": "il Dono Segreto è stato soprannominato.", "EncGiftNotFound": "Impossibile trovare una corrispondenza ai Doni Segreti nel Database.", "EncGiftPIDMismatch": "Il PID non corrisponde a quello del Dono Segreto.", - "EncGiftShinyMismatch": "Il Dono Segreto non può essere Shiny.", + "EncGiftShinyMismatch": "Il Dono Segreto non può essere cromatico.", "EncGiftVersionNotDistributed": "Il Dono Segreto non può essere ricevuto in questa versione di gioco.", "EncInvalid": "Impossibile trovare una corrispondenza per l'incontro nel gioco di origine.", - "EncMasteryInitial": "Initial move mastery flags do not match the encounter's expected state.", + "EncMasteryInitial": "I flag iniziali della padronanza mosse non corrispondono allo stato previsto per l'incontro.", "EncTradeChangedNickname": "Il soprannome del Pokémon ottenuto con uno scambio in gioco è stato alterato.", "EncTradeChangedOT": "Il Nome dell'AO di un Pokémon ottenuto con uno scambio in gioco è stato alterato.", "EncTradeIndexBad": "Indice di scambio in gioco invalido?", "EncTradeMatch": "Scambio in gioco valido.", "EncTradeUnchanged": "Il nome dell'AO e il soprannome del Pokémon ottenuto con uno scambio in gioco sono validi.", - "EncStaticPIDShiny": "L'Incontro statico non può essere shiny.", + "EncStaticPIDShiny": "L'Incontro statico non può essere cromatico.", "EncTypeMatch": "Il tipo di incontro corrisponde all'incontro.", "EncTypeMismatch": "il tipo di incontro non corrisponde all'incontro.", "EncUnreleased": "Evento non rilasciato ufficialmente.", @@ -145,27 +145,27 @@ "G3EReader": "Incontro Ombra E-Reader non Giapponese. Evento non rilasciato.", "G3OTGender": "AO di Colosseum/XD non possono essere femmina.", "G4InvalidTileR45Surf": "Incontro da surf nel Percorso 45 di Johto, la casella d'acqua è irraggiungibile.", - "G4PartnerMoodEgg": "Eggs cannot have an Mood stat value.", - "G4PartnerMoodZero": "Mood stat value should be zero when not in the player's party.", - "G4ShinyLeafBitsInvalid": "Shiny Leaf/Crown bits are not valid.", + "G4PartnerMoodEgg": "Le uova non possono avere un valore per la statistica Umore.", + "G4PartnerMoodZero": "Il valore della statistica Umore deve essere zero quando il Pokémon non è in squadra.", + "G4ShinyLeafBitsInvalid": "I bit delle Foglielucenti o della Corona Lucente non sono validi.", "G4ShinyLeafBitsEgg": "Le Uova non possono avere Foglielucenti o la Corona di Foglie.", "G5IVAll30": "Tutti gli IV dei Pokémon di N dovrebbero essere 30.", - "G5PIDShinyGrotto": "Gli incontri del Meandro Nascosto non possono essere Shiny.", + "G5PIDShinyGrotto": "Gli incontri del Meandro Nascosto non possono essere cromatico.", "G5SparkleInvalid": "Il segnale speciale di luccichio dei Pokémon di N non dovrebbe essere ablitato.", "G5SparkleRequired": "Segnale speciale di luccichio dei Pokémon di N assente.", - "G5PokeStarMustBeZero": "Pokéstar Studios fame must be zero, cannot participate.", - "G5PokeStarImpossibleValue": "Pokéstar Studios fame value is unreachable.", - "G7BSocialShouldBe100Spirit": "Spirit should be 100 for Pokémon not in the player's party.", - "G7BSocialShouldBe100Mood": "Mood should be 100 for Pokémon not in the player's party.", + "G5PokeStarMustBeZero": "La fama del Pokéwood deve essere zero; il Pokémon non può partecipare.", + "G5PokeStarImpossibleValue": "Il valore della fama del Pokéwood non è raggiungibile.", + "G7BSocialShouldBe100Spirit": "L'Entusiasmo deve essere 100 per i Pokémon non presenti in squadra.", + "G7BSocialShouldBe100Mood": "L'Umore deve essere 100 per i Pokémon non presenti in squadra.", "GanbaruStatTooHigh": "Uno o più valori Ganbaru è oltre il limite naturale di (10 - IV bonus).", "GenderInvalidNone": "I Pokémon senza sesso non dovrebbero avere un Sesso.", - "GeoBadOrder": "Memoria GeoLocation: Gap/Blank.", - "GeoHardwareInvalid": "Geolocation: La nazione non è disponibile nel 3DS.", + "GeoBadOrder": "Ricordo geolocalizzazione: presenza di lacune o spazi vuoti.", + "GeoHardwareInvalid": "Geolocalizzazione: La nazione non è disponibile nel 3DS.", "GeoHardwareRange": "Regione della console non valida.", - "GeoHardwareValid": "Geolocation: la nazione è disponibile nel 3DS.", - "GeoMemoryMissing": "Memoria GeoLocation: le memorie dovrebbero essere presenti.", - "GeoNoCountryHT": "Memoria GeoLocation: è presente un nome per l'Ultimo Allenatore, ma non ha una nazione.", - "GeoNoRegion": "Memoria GeoLocation: la regione è senza nazione.", + "GeoHardwareValid": "Geolocalizzazione: la nazione è disponibile nel 3DS.", + "GeoMemoryMissing": "Ricordo geolocalizzazione: le Ricordi dovrebbero essere presenti.", + "GeoNoCountryHT": "Ricordo geolocalizzazione: è presente un nome per l'Ultimo Allenatore, ma non ha una nazione.", + "GeoNoRegion": "Ricordo geolocalizzazione: la regione è senza nazione.", "HyperTrainLevelGEQ_0": "Impossibile usare l'Allenamento Pro su un Pokémon che non sia al livello {0}.", "HyperPerfectAll": "Impossibile usare l'Allenamento Pro su un Pokémon con IV perfetti.", "HyperPerfectOne": "Impossibile usare l'Allenamento Pro un IV perfetto.", @@ -182,47 +182,47 @@ "LevelMetGift": "Il livello di incontro non corrisponde al Dono Segreto.", "LevelMetGiftFail": "Il livello attuale è al di sotto del livello del Dono Segreto.", "LevelMetSane": "Il livello attuale non è al di sotto del livello di incontro.", - "MarkValueOutOfRange_0": "Individual marking at index {0} is not within the allowed value range.", - "MarkValueShouldBeZero": "Marking flags cannot be set.", - "MarkValueUnusedBitsPresent": "Marking flags uses bits beyond the accessible range.", - "MemoryArgBadCatch_H": "Memoria {0}: {0} non lo ha catturato.", - "MemoryArgBadHatch_H": "Memoria {0}: {0} non lo ha schiuso.", - "MemoryArgBadHT": "Memoria: Non può avere memorie di un Ultimo Allenatore da Uovo.", - "MemoryArgBadID_H": "Memoria {0}: Impossibile ottenere la Memoria nella versione {0}.", - "MemoryArgBadItem_H1": "Memoria {0}: La specie non può tenere questo oggetto.", - "MemoryArgBadLocation_H": "Memoria {0}: Impossibile avere il Luogo nella versione {0}.", - "MemoryArgBadMove_H1": "Memoria {0}: La specie non può imparare {1}.", - "MemoryArgBadOTEgg_H": "Memoria {0}: Scambio in Link non è valida come prima memoria.", - "MemoryArgBadSpecies_H1": "Memoria {0}: Impossibile catturare questa {1} nel gioco.", - "MemoryArgSpecies_H": "Memoria {0}: La specie può essere catturata nel gioco.", - "MemoryCleared_H": "Memoria: Non ripulita correttamente.", - "MemoryValid_H": "Memoria {0} valida.", - "MemoryFeelInvalid_H": "Memoria {0}: Sentimenti invalidi.", - "MemoryHTFlagInvalid": "Untraded: L'Allenatore Attuale non dovrebbe essere l'Ultimo Allenatore (non AO).", + "MarkValueOutOfRange_0": "Il singolo segno all'indice {0} non è compreso nell'intervallo di valori consentito.", + "MarkValueShouldBeZero": "I flag dei segni non possono essere impostati.", + "MarkValueUnusedBitsPresent": "I flag dei segni utilizzano bit oltre l'intervallo accessibile.", + "MemoryArgBadCatch_H": "Ricordo {0}: {0} non lo ha catturato.", + "MemoryArgBadHatch_H": "Ricordo {0}: {0} non lo ha schiuso.", + "MemoryArgBadHT": "Ricordo: Non può avere Ricordi di un Ultimo Allenatore da Uovo.", + "MemoryArgBadID_H": "Ricordo {0}: Impossibile ottenere la Ricordo nella versione {0}.", + "MemoryArgBadItem_H1": "Ricordo {0}: La specie non può tenere questo oggetto.", + "MemoryArgBadLocation_H": "Ricordo {0}: Impossibile avere il Luogo nella versione {0}.", + "MemoryArgBadMove_H1": "Ricordo {0}: La specie non può imparare {1}.", + "MemoryArgBadOTEgg_H": "Ricordo {0}: Scambio in Link non è valida come prima Ricordo.", + "MemoryArgBadSpecies_H1": "Ricordo {0}: Impossibile catturare questa {1} nel gioco.", + "MemoryArgSpecies_H": "Ricordo {0}: La specie può essere catturata nel gioco.", + "MemoryCleared_H": "Ricordo: Non ripulita correttamente.", + "MemoryValid_H": "Ricordo {0} valida.", + "MemoryFeelInvalid_H": "Ricordo {0}: Sentimenti invalidi.", + "MemoryHTFlagInvalid": "Non scambiato: L'Allenatore Attuale non dovrebbe essere l'Ultimo Allenatore (non AO).", "MemoryHTGender_0": "Genere dell'Ultimo Allenatore invalido: {0}", "MemoryHTLanguage": "Lingua dell'Ultimo Allenatore mancante.", - "MemoryIndexArgHT": "Dovrebbe avere una memoria per l'Ultimo Allenatore TextVar.", - "MemoryIndexFeel_H1": "Memoria {0}: il Sentimento dovrebbe essere di indice {1}.", + "MemoryIndexArgHT": "Dovrebbe avere una Ricordo per l'Ultimo Allenatore TextVar.", + "MemoryIndexFeel_H1": "Ricordo {0}: il Sentimento dovrebbe essere di indice {1}.", "MemoryIndexFeelHTLEQ9": "Dovrebbe avere un feeling per l'Ultimo Allenatore di 0-9.", - "MemoryIndexID_H1": "Memoria {0}: Dovrebbe essere di indice {1}.", - "MemoryIndexIntensity_H1": "Memoria {0}: L'Intensità dovrebbe essere di indice {1}.", + "MemoryIndexID_H1": "Ricordo {0}: Dovrebbe essere di indice {1}.", + "MemoryIndexIntensity_H1": "Ricordo {0}: L'Intensità dovrebbe essere di indice {1}.", "MemoryIndexIntensityHT1": "Dovrebbe avere un valore di intensità per l'Ultimo Allenatore (primo).", - "MemoryIndexIntensityMin_H1": "Memoria {0}: l'Intensità dovrebbe essere di almeno {1}.", - "MemoryIndexLinkHT": "Dovrebbe avere memoria di un Ultimo Allenatore per Scambio in Link.", - "MemoryIndexVar": "Memoria {0}: TextVar dovrebbe essere di indice {1}.", - "MemoryMissingHT": "Memoria: Le memorie per l'Ultimo Allenatore sono assenti.", - "MemoryMissingOT": "Memoria: memoria per l'Allenatore Originale mancante.", - "MemorySocialZero": "Social Stat dovrebbe essere zero.", - "MemoryStatSocialLEQ_0": "Social Stat dovrebbe essere <= {0}", - "MemoryStatAffectionHT0": "Untraded: l'Affetto per l'Ultimo Allenatore dovrebbe essere 0.", + "MemoryIndexIntensityMin_H1": "Ricordo {0}: l'Intensità dovrebbe essere di almeno {1}.", + "MemoryIndexLinkHT": "Dovrebbe avere Ricordo di un Ultimo Allenatore per Scambio in Link.", + "MemoryIndexVar": "Ricordo {0}: TextVar dovrebbe essere di indice {1}.", + "MemoryMissingHT": "Ricordo: Le Ricordi per l'Ultimo Allenatore sono assenti.", + "MemoryMissingOT": "Ricordo: Ricordo per l'Allenatore Originale mancante.", + "MemorySocialZero": "La statistica Sociabilità dovrebbe essere pari a zero.", + "MemoryStatSocialLEQ_0": "Statistica Sociabilità dovrebbe essere <= {0}", + "MemoryStatAffectionHT0": "Non scambiato: l'Affetto per l'Ultimo Allenatore dovrebbe essere 0.", "MemoryStatAffectionOT0": "l'Affetto per l'AO dovrebbe essere 0.", - "MemoryStatFriendshipHT0": "Untraded: l'Amicizia per l'Ultimo Allenatore dovrebbe essere 0.", + "MemoryStatFriendshipHT0": "Non scambiato: l'Amicizia per l'Ultimo Allenatore dovrebbe essere 0.", "MemoryStatFriendshipOTBaseEvent_0": "L'Amicizia all'AO evento non corrisponde con l'amicizia base.", "MetDetailTimeOfDay": "L'Ora di incontro non è all'interno della gamma attesa.", "MoveEvoFCombination_0": "la combinazione di mosse non è compatibile con l'evoluzione di {0}.", - "MoveFExpectSingle_0": "Expected: {0}", + "MoveFExpectSingle_0": "Previsto: {0}", "MoveKeldeoMismatch": "Mossa/Forma di Keldeo non corrispondente.", - "MovePPExpectHealed_01": "Move {0} PP is below the amount expected ({1}).", + "MovePPExpectHealed_01": "I PP della mossa {0} sono inferiori alla quantità prevista ({1}).", "MovePPTooHigh_01": "I PP della mossa {0} sono oltre il massimo consentito ({1}).", "MovePPUpsTooHigh_01": "I PP Up della mossa {0} sono oltre il massimo consentito ({1}).", "MoveShopAlphaMoveShouldBeMastered_0": "La Mossa Alfa dovrebbe essere registrata come masterata.", @@ -233,7 +233,7 @@ "MoveShopPurchaseInvalid_0": "Impossibile acquistare {0} dal negozio mosse.", "MoveTechRecordFlagMissing_0": "Record per Disco Tecnico non aspettato: {0}", "NickFlagEggNo": "L'Uovo non deve avere soprannomi.", - "NickFlagEggYes": "L'Egg deve avere il soprannome.", + "NickFlagEggYes": "L'Uovo deve avere il soprannome.", "NickInvalidChar": "Non può avere questo soprannome.", "NickLengthLong": "Soprannome troppo lungo.", "NickLengthShort": "Il soprannome è vuoto.", @@ -254,22 +254,22 @@ "OT_SID0Invalid": "SID16 dovrebbe essere 0.", "OT_TID0": "TID16 è zero.", "OT_IDInvalid": "la combinazione di TID e SID non è possibile.", - "PIDEncryptWurmple": "Wurmple evolution Encryption Constant mismatch.", - "PIDEncryptZero": "Encryption Constant non impostata.", - "PIDEqualsEC": "Encryption Constant uguale al PID.", + "PIDEncryptWurmple": "Mancata corrispondenza della costante di crittografia per l'evoluzione di Wurmple.", + "PIDEncryptZero": "Costante di crittografia non impostata.", + "PIDEqualsEC": "Costante di crittografia uguale al PID.", "PIDGenderMatch": "Il sesso combacia con il PID.", "PIDGenderMismatch": "Il sesso non combacia con il PID.", "PIDNatureMatch": "La Natura combacia il PID.", "PIDNatureMismatch": "La Natura non combacia con il PID.", - "PIDTypeMismatch": "PID+ correlation does not match what was expected for the Encounter's type.", + "PIDTypeMismatch": "La correlazione PID+ non corrisponde a quanto previsto per il tipo di incontro.", "PIDZero": "Il PID non è impostato.", - "PlusMoveAlphaMissing_0": "Expected to have mastered the move {0} when encountered as an alpha.", - "PlusMoveMultipleInvalid": "Multiple Plus Move flags are invalid.", - "PlusMoveInvalid_0": "{0} cannot be learned and set as a Plus Move.", - "PlusMoveSufficientLevelMissing_0": "Plus Move flag for {0} must be set.", - "PlusMoveCountInvalid": "Out of range Plus Move flag index is set.", + "PlusMoveAlphaMissing_0": "Il Pokémon dovrebbe aver padroneggiato la mossa {0} poiché è stato incontrato come Alfa.", + "PlusMoveMultipleInvalid": "Segnali multipli per le Mosse+ non sono validi.", + "PlusMoveInvalid_0": "{0} non può essere appresa e impostata come Mossa+.", + "PlusMoveSufficientLevelMissing_0": "Il segnale Mossa+ per {0} deve essere impostato.", + "PlusMoveCountInvalid": "È impostato un indice del segnale Mossa+ al di fuori dell'intervallo.", "PokerusDaysTooHigh_0": "I giorni di Pokérus rimanenti sono troppi, previsto <= {0}.", - "PokerusStrainUnobtainable_0": "Pokérus Strain {0} non può essere ottenuta.", + "PokerusStrainUnobtainable_0": "Il ceppo Pokérus {0} non può essere ottenuto.", "RibbonAllValid": "Tutti i fiocchi sono stati contabilizzati.", "RibbonEgg": "Non può avere fiocchi da Uovo.", "RibbonsInvalid_0": "Fiocchi invalidi: {0}", @@ -280,9 +280,9 @@ "StatDynamaxInvalid": "Il Livello Dynamax non è in un range accettabile.", "StatIncorrectHeight": "L'Altezza calcolata non corrisponde con il valore nei dati.", "StatIncorrectWeight": "Il Peso calcolato non corrisponde con il valore nei dati.", - "StatIncorrectHeightValue_0": "Height should be {0}.", - "StatIncorrectWeightValue_0": "Weight should be {0}.", - "StatIncorrectScaleValue_0": "Scale should be {0}.", + "StatIncorrectHeightValue_0": "L'Altezza dovrebbe essere {0}.", + "StatIncorrectWeightValue_0": "Il Peso dovrebbe essere {0}.", + "StatIncorrectScaleValue_0": "La Scala dovrebbe essere {0}.", "StatInvalidHeightWeight": "Il valore di Altezza e Peso è statisticamente improbabile.", "StatIncorrectCP": "I PL calcolati non combaciano con il valore nei dati.", "StatGigantamaxInvalid": "Gigamax non corrispondente.", @@ -291,8 +291,8 @@ "StatBattleVersionInvalid": "la Versione Lotta non è in un range accettabile.", "StatNobleInvalid": "Sgnale Nobile non corrispondente.", "StatAlphaInvalid": "Alfa non corrispondente.", - "StoredSourceEgg": "Egg must be in Box or Party.", - "StoredSlotSourceInvalid_0": "Invalid Stored Source: {0}", + "StoredSourceEgg": "L'uovo deve trovarsi nei Box o in squadra.", + "StoredSlotSourceInvalid_0": "Origine della fusione non valida: {0}", "SuperComplete": "Segnale di completamento del Super Allenamento non corrispondente.", "SuperDistro": "Le missioni evento per il Super Allenamento non sono state rilasciate.", "SuperEgg": "Un Uovo non può partecipare al Super Allenamento.", @@ -300,74 +300,74 @@ "SuperNoUnlocked": "Non può avere il segnale di Sblocco Super Allenamento per l'origine.", "SuperUnavailable": "Le missioni di Super Allenamento non sono disponibili nei giochi visitati.", "SuperUnused": "Il segnale inutilizzato per il Super Allenamento è stato abilitato.", - "G6SuperTrainEggBag": "Egg cannot use a Training Bag.", - "G6SuperTrainEggHits": "Eggs cannot hit Training Bags.", - "G6SuperTrainBagInvalid_0": "Unrecognized Training Bag ID: {0}", - "G6SuperTrainBagHitsInvalid_012": "Training bag cannot have {0} hits; expected value within [{1},{2}].", - "TeraTypeIncorrect": "Il Tera Tipo non corrisponde al valore atteso.", - "TeraTypeMismatch": "Il Tera Tipo non corrisponde a nessuno dei due tipi base.", + "G6SuperTrainEggBag": "L'uovo non può usare un Sacco di sabbia.", + "G6SuperTrainEggHits": "Le uova non possono colpire i Sacchi di sabbia.", + "G6SuperTrainBagInvalid_0": "ID del Sacco di sabbia non riconosciuto: {0}", + "G6SuperTrainBagHitsInvalid_012": "Il Sacco di sabbia non può avere {0} colpi; il valore previsto deve essere compreso tra [{1},{2}].", + "TeraTypeIncorrect": "Il Teratipo non corrisponde al valore atteso.", + "TeraTypeMismatch": "Il Teratipo non corrisponde a nessuno dei due tipi base.", "TradeNotAvailable": "Il Pokémon non può essere scambiato all'Allenatore attuale.", - "TrainerIDNoSeed": "Trainer ID is not obtainable from any RNG seed.", + "TrainerIDNoSeed": "L'ID Allenatore non è ottenibile da alcun seed RNG.", "TransferBad": "Il Pokémon trasferito da una generazione passata non è stato trasferito correttamente, o non è compatibile con questo salvataggio.", "TransferCurrentHandlerInvalid": "Il valore dell'Ultimo Allenatore è invalido, i dettagli allenatori del salvataggio non sono corretti.", "TransferEgg": "Impossibile tarsferire Uova tra Generazioni diverse.", "TransferEggLocationTransporter": "Luogo di incontro non valido, previsto Pokétrasporto.", "TransferEggMetLevel": "Livello di incontro non valido per il trasferimento.", - "TransferEggVersion": "Can't transfer Eggs to this game.", + "TransferEggVersion": "Impossibile trasferire uova in questo gioco.", "TransferFlagIllegal": "Segnato come Illegale dal gioco (abuso di glitch o clonazione).", "TransferHTFlagRequired": "l'Allenatore Originale non può essere l'Ultimo Allenatore.", "TransferHTMismatchName": "Il nome dell'Ultimo Allenatore non corrisponde al valore atteso.", - "TransferHTMismatchGender": "Handling trainer does not match the expected trainer gender.", + "TransferHTMismatchGender": "L'allenatore attuale non corrisponde al sesso dell'allenatore previsto.", "TransferHTMismatchLanguage": "La lingua dell'Ultimo Allenatore non corrisponde al valore atteso.", - "TransferKoreanGen4": "Korean Generation 4 games cannot interact with International Generation 4 games.", + "TransferKoreanGen4": "I giochi di quarta generazione coreani non possono interagire con i giochi di quarta generazione internazionali.", "TransferMet": "Luogo di incontro invalido, previsto Pokétrasporto/Zoroark (Bestie Leggendarie), Pokétrasporto/Celebi (Celebi).", "TransferNotPossible": "Impossibile trasferire il Pokémon dal formato originale al formato attuale.", "TransferMetLocation": "Luogo di trasferimento non valido.", "TransferNature": "Natura non valida per il processo di trasferimento.", "TransferObedienceLevel": "Livello di Obbedienza invalido.", - "TransferPIDECBitFlip": "Il PID dovrebbe essere uguale alla EC [con i bit superiori flippati]!", - "TransferPIDECEquals": "Il PID dovrebbe essere uguale alla EC!", - "TransferPIDECXor": "La Encryption Constant corrisponde ad un PID shiny.", - "TransferTrackerMissing": "Il codice di monitoraggio di Pokémon Home è mancante.", - "TransferTrackerShouldBeZero": "Il codice di monitoraggio di Pokémon Home dovrebbe essere 0.", + "TransferPIDECBitFlip": "Il PID dovrebbe essere uguale alla costante di crittografia [con i bit superiori flippati]!", + "TransferPIDECEquals": "Il PID dovrebbe essere uguale alla costante di crittografia!", + "TransferPIDECXor": "La costante di crittografia corrisponde ad un PID cromatico.", + "TransferTrackerMissing": "Il codice di monitoraggio di Pokémon HOME è mancante.", + "TransferTrackerShouldBeZero": "Il codice di monitoraggio di Pokémon HOME dovrebbe essere 0.", "TrashBytesExpected": "Previsti byte spazzatura.", "TrashBytesMismatchInitial": "I byte spazzatura iniziali previsti devono corrispondere all'incontro.", "TrashBytesMissingTerminatorFinal": "Manca il terminatore finale.", "TrashBytesShouldBeEmpty": "I byte spazzatura dovrebbero essere azzerati.", "TrashBytesResetViaTransfer": "I byte spazzatura sono stati reimpostati tramite trasferimento.", - "EncTradeShouldHaveEvolvedToSpecies_0": "Trade Encounter should have evolved to species: {0}.", - "EncGiftLanguageNotDistributed": "Gift Encounter was never distributed with this language.", - "EncGiftRegionNotDistributed": "Gift Encounter was never distributed to this Console Region.", + "EncTradeShouldHaveEvolvedToSpecies_0": "L'incontro tramite scambio dovrebbe essersi evoluto nella specie: {0}.", + "EncGiftLanguageNotDistributed": "L'evento non è mai stato distribuito in questa lingua.", + "EncGiftRegionNotDistributed": "L'evento non è mai stato distribuito per questa regione della console.", "FormInvalidRangeLEQ_0F": "Il conteggio della forma è fuori dall'indice. Valore previsto <= {0}, non {1}.", - "MovesShouldMatchRelearnMoves": "Moves should exactly match Relearn Moves.", - "MemoryStatEnjoyment_0": "Enjoyment dovrebbe essere {0}.", - "MemoryStatFullness_0": "Fullness dovrebbe essere {0}.", - "MemoryStatFullnessLEQ_0": "Fullness dovrebbe essere <= {0}.", - "OTLanguageShouldBe_0": "Language ID should be {0}, not {1}.", - "OTLanguageShouldBe_0or1": "Language ID should be {0} or {1}, not {2}.", - "OTLanguageShouldBeLeq_0": "Language ID should be <= {0}, not {1}.", - "OTLanguageCannotPlayOnVersion_0": "Language ID {0} cannot be played on this version.", - "OTLanguageCannotTransferToConsoleRegion_0": "Language ID {0} cannot be transferred to this Console Region.", - "WordFilterInvalidCharacter_0": "Word Filter: Invalid character '{0}' (0x{1}).", - "WordFilterFlaggedPattern_01": "Word Filter ({1}): Flagged pattern '{0}'.", - "WordFilterTooManyNumbers_0": "Word Filter: Too many numbers (>{0}).", - "BulkCloneDetectedDetails": "Clone detected (Details).", - "BulkCloneDetectedTracker": "Clone detected (Duplicate Tracker).", - "HintEvolvesToSpecies_0": "Evolves to species: {0}.", - "HintEvolvesToRareForm_0": "Evolves to rare form: {0}.", - "BulkSharingEncryptionConstantGenerationDifferent": "Detected sharing of Encryption Constant across generations.", - "BulkSharingEncryptionConstantGenerationSame": "Detected sharing of Encryption Constant.", - "BulkSharingEncryptionConstantRNGType": "Detected sharing of Encryption Constant sharing for different RNG encounters.", - "BulkSharingPIDGenerationDifferent": "Detected sharing of PID across generations.", - "BulkSharingPIDGenerationSame": "Detected sharing of PID.", - "BulkSharingPIDRNGType": "Detected sharing of PID for different RNG encounters.", - "BulkDuplicateMysteryGiftEggReceived": "Detected multiple redemptions of the same non-repeatable Mystery Gift Egg.", - "BulkSharingTrainerID": "Detected sharing of Trainer ID across multiple trainer names.", - "BulkSharingTrainerVersion": "Detected sharing of Trainer ID across multiple versions.", - "BulkDuplicateFusionSlot": "Detected multiple fusions of the same fusion stored slot species.", - "BulkHeldItemInventoryAssignedNoneHeld_0": "{0} is marked as held player inventory, but no Pokémon found in slots checked.", - "BulkHeldItemInventoryMultipleSlots_0": "{0} is a unique item and cannot be held by multiple Pokémon.", - "BulkHeldItemInventoryNotAcquired_0": "{0} has not been acquired in player inventory.", - "BulkHeldItemInventoryUnassigned_0": "{0} is not marked as assigned in player inventory.", - "BulkFusionSourceInvalid": "The subsumed Species-Form stored in the save file does not match the expected Species-Form of the fused slot." + "MovesShouldMatchRelearnMoves": "Le mosse devono corrispondere esattamente alle Mosse Ricordabili.", + "MemoryStatEnjoyment_0": "Divertimento dovrebbe essere {0}.", + "MemoryStatFullness_0": "Sazietà dovrebbe essere {0}.", + "MemoryStatFullnessLEQ_0": "Sazietà dovrebbe essere <= {0}.", + "OTLanguageShouldBe_0": "L'ID lingua dovrebbe essere {0}, non {1}.", + "OTLanguageShouldBe_0or1": "L'ID lingua dovrebbe essere {0} o {1}, non {2}.", + "OTLanguageShouldBeLeq_0": "L'ID lingua dovrebbe essere <= {0}, non {1}.", + "OTLanguageCannotPlayOnVersion_0": "L'ID lingua {0} non è disponibile per questa versione di gioco.", + "OTLanguageCannotTransferToConsoleRegion_0": "L'ID lingua {0} non può essere trasferito in questa regione della console.", + "WordFilterInvalidCharacter_0": "Filtro parole: carattere non valido '{0}' (0x{1}).", + "WordFilterFlaggedPattern_01": "Filtro parole ({1}): pattern segnalato '{0}'.", + "WordFilterTooManyNumbers_0": "Filtro parole: troppi numeri (>{0}).", + "BulkCloneDetectedDetails": "Clone rilevato (Dettagli).", + "BulkCloneDetectedTracker": "Clone rilevato (Tracker duplicati).", + "HintEvolvesToSpecies_0": "Si evolve nella specie: {0}.", + "HintEvolvesToRareForm_0": "Si evolve in una forma rara: {0}.", + "BulkSharingEncryptionConstantGenerationDifferent": "Rilevata condivisione della costante di crittografia tra generazioni diverse.", + "BulkSharingEncryptionConstantGenerationSame": "Rilevata condivisione della costante di crittografia.", + "BulkSharingEncryptionConstantRNGType": "Rilevata condivisione della costante di crittografia tra diversi tipi di incontro RNG.", + "BulkSharingPIDGenerationDifferent": "Rilevata condivisione del PID tra generazioni diverse.", + "BulkSharingPIDGenerationSame": "Rilevata condivisione del PID.", + "BulkSharingPIDRNGType": "Rilevata condivisione del PID tra diversi tipi di incontro RNG.", + "BulkDuplicateMysteryGiftEggReceived": "Rilevato il riscatto multiplo dello stesso uovo Dono Segreto non ripetibile.", + "BulkSharingTrainerID": "Rilevata condivisione dell'ID Allenatore tra più nomi allenatore.", + "BulkSharingTrainerVersion": "Rilevata condivisione dell'ID Allenatore tra più versioni di gioco.", + "BulkDuplicateFusionSlot": "Rilevate fusioni multiple della stessa specie memorizzata nello slot di fusione.", + "BulkHeldItemInventoryAssignedNoneHeld_0": "{0} è contrassegnato come rimosso dall'inventario del giocatore, ma non è stato trovato alcun Pokémon con tale strumento negli slot controllati.", + "BulkHeldItemInventoryMultipleSlots_0": "{0} è uno strumento unico e non può essere tenuto da più Pokémon contemporaneamente.", + "BulkHeldItemInventoryNotAcquired_0": "{0} non è presente nell'inventario del giocatore.", + "BulkHeldItemInventoryUnassigned_0": "{0} non è contrassegnato come assegnato nell'inventario del giocatore.", + "BulkFusionSourceInvalid": "La combinazione Specie-Forma inclusa nel file di salvataggio non corrisponde alla combinazione Specie-Forma prevista per lo slot di fusione." } diff --git a/PKHeX.Core/Resources/localize/legality/legality_ko.json b/PKHeX.Core/Resources/localize/legality/legality_ko.json index 551145808..b7abd2891 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_ko.json +++ b/PKHeX.Core/Resources/localize/legality/legality_ko.json @@ -66,18 +66,18 @@ "EncGift": "만난 게임의 선물받은 알 인카운터와 일치하지 않습니다.", "EncGiftEggEvent": "만난 게임의 이벤트 알 인카운터와 일치하지 않습니다.", "EncGiftIVMismatch": "IV가 이상한소포 데이터와 일치하지 않습니다.", - "EncGiftNicknamed": "이벤트 선물의 이름 플래그가 켜져 있습니다.", + "EncGiftNicknamed": "이벤트 선물의 닉네임 플래그가 켜져 있습니다.", "EncGiftNotFound": "이상한소포 데이터베이스에 존재하지 않습니다.", "EncGiftPIDMismatch": "이상한소포의 고정된 PID가 일치하지 않습니다.", "EncGiftShinyMismatch": "이상한소포의 색이 다른 포켓몬 여부가 일치하지 않습니다.", "EncGiftVersionNotDistributed": "이 버전에서 받을 수 없는 이상한소포입니다.", "EncInvalid": "만난 게임의 인카운터와 일치하지 않습니다.", "EncMasteryInitial": "초기 기술 개전 플래그가 해당 만남에서 예상되는 상태와 일치하지 않습니다.", - "EncTradeChangedNickname": "게임 내 교환의 이름이 달라졌습니다.", + "EncTradeChangedNickname": "인게임 교환 포켓몬의 닉네임이 변경되었습니다.", "EncTradeChangedOT": "게임 내 교환의 어버이가 달라졌습니다.", "EncTradeIndexBad": "게임 내 교환의 인덱스가 잘못되었을 수 있습니다.", "EncTradeMatch": "사용 가능한 게임 내 교환입니다.", - "EncTradeUnchanged": "게임 내 교환의 어버이와 이름이 달라졌습니다.", + "EncTradeUnchanged": "인게임 교환 포켓몬의 어버이 및 닉네임이 변경되지 않았습니다.", "EncStaticPIDShiny": "고정된 인카운터의 색이 다른 포켓몬 여부가 일치하지 않습니다.", "EncTypeMatch": "인카운터 유형과 인카운터가 일치합니다.", "EncTypeMismatch": "인카운터 유형과 인카운터가 일치하지 않습니다.", @@ -127,7 +127,7 @@ "G1CatchRateMatchPrevious": "포획률이 포켓몬 진화 체인의 아무 포켓몬과 일치합니다.", "G1CatchRateMatchTradeback": "포획률이 2세대의 유효한 지닌 물건과 일치합니다.", "G1CatchRateNone": "포획률이 포켓몬 진화 체인의 아무 포켓몬, 또는 2세대의 지닌 물건과 일치하지 않습니다.", - "G1CharNick": "1/2세대에서 사용할 수 없는 문자가 포켓몬 이름에 포함되어 있습니다.", + "G1CharNick": "1/2세대 소프트웨어에서 온 닉네임에 사용할 수 없는 문자가 포함되어 있습니다.", "G1CharOT": "1/2세대에서 사용할 수 없는 문자가 어버이 이름에 포함되어 있습니다.", "G1OTGender": "1/2세대에서는 여성 어버이를 사용할 수 없습니다.", "G1Stadium": "스타디움 어버이가 잘못되었습니다.", @@ -232,18 +232,18 @@ "MoveShopMasterNotLearned_0": "{0} 기술을 수동으로 개전할 수 없습니다: 레벨 업으로 배울 수 있는 기술이 아닙니다.", "MoveShopPurchaseInvalid_0": "기술상점에서 {0} 기술을 전수받을 수 없습니다.", "MoveTechRecordFlagMissing_0": "예상치 못한 기술레코드 습득 플래그가 발견되었습니다: {0}", - "NickFlagEggNo": "알은 반드시 이름 플래그가 꺼져 있어야 합니다.", - "NickFlagEggYes": "알은 반드시 이름 플래그가 켜져 있어야 합니다.", - "NickInvalidChar": "이 이름은 사용할 수 없습니다.", - "NickLengthLong": "이름이 너무 깁니다.", - "NickLengthShort": "이름이 비어 있습니다.", - "NickMatchLanguage": "이름이 포켓몬 종류와 일치합니다.", + "NickFlagEggNo": "알은 반드시 닉네임 플래그가 꺼져 있어야 합니다.", + "NickFlagEggYes": "알은 반드시 닉네임 플래그가 켜져 있어야 합니다.", + "NickInvalidChar": "이 닉네임은 설정할 수 없습니다.", + "NickLengthLong": "닉네임이 너무 깁니다.", + "NickLengthShort": "닉네임이 비어 있습니다.", + "NickMatchLanguage": "닉네임이 포켓몬의 종류명과 일치합니다.", "NickMatchLanguageEgg": "알이 나라별 알 이름과 일치합니다.", "NickMatchLanguageEggFail": "알 이름이 언어별 알 이름과 일치하지 않습니다.", - "NickMatchLanguageFail": "이름이 포켓몬 종류와 일치하지 않습니다.", - "NickMatchLanguageFlag": "이름 플래그가 켜져 있으나 이름이 포켓몬 종류와 일치합니다.", - "NickMatchNoOthers": "이름이 다른 포켓몬 종류와 일치하지 않습니다.", - "NickMatchNoOthersFail": "이름이 다른 포켓몬 종류와 일치합니다 (+언어).", + "NickMatchLanguageFail": "닉네임이 종류명과 일치하지 않습니다.", + "NickMatchLanguageFlag": "닉네임 플래그가 켜져 있으나 이름이 포켓몬 종류와 일치합니다.", + "NickMatchNoOthers": "닉네임이 다른 포켓몬 종류와 일치하지 않습니다.", + "NickMatchNoOthersFail": "닉네임이 다른 종류명(언어 포함)과 일치합니다.", "OTLanguage": "언어 ID는 {1}이 아니라 {0}이어야 합니다.", "OTLong": "어버이 이름이 너무 깁니다.", "OTShort": "어버이의 이름이 너무 짧습니다.", diff --git a/PKHeX.Core/Resources/text/other/de/text_Ribbons_de.txt b/PKHeX.Core/Resources/text/other/de/text_Ribbons_de.txt index 1bea39e5a..7bdfbf87a 100644 --- a/PKHeX.Core/Resources/text/other/de/text_Ribbons_de.txt +++ b/PKHeX.Core/Resources/text/other/de/text_Ribbons_de.txt @@ -1,49 +1,49 @@ -RibbonChampionKalos Kalos Champion -RibbonChampionG3 Champion (Gen3) -RibbonChampionSinnoh Sinnoh Champion -RibbonBestFriends Beste Freunde -RibbonTraining Training -RibbonBattlerSkillful Erfahrener Kämpfer -RibbonBattlerExpert Experten Kämpfer +RibbonChampionKalos Kalos-Champs +RibbonChampionG3 Champs (Gen3) +RibbonChampionSinnoh Sinnoh-Champs +RibbonBestFriends Zutraulichkeits +RibbonTraining Trainings +RibbonBattlerSkillful Profikampf +RibbonBattlerExpert Meisterkampf RibbonEffort Fleiß RibbonAlert Wachsamkeit -RibbonShock Schock -RibbonDowncast Niederschlag +RibbonShock Schocks +RibbonDowncast Traurigkeit RibbonCareless Sorglosigkeit RibbonRelax Entspannung -RibbonSnooze Schlafen -RibbonSmile Lächeln -RibbonGorgeous Hinreißend -RibbonRoyal Königlich -RibbonGorgeousRoyal Hinreißend Königl. -RibbonArtist Künstler +RibbonSnooze Schlafens +RibbonSmile Lächelns +RibbonGorgeous Hinreißendes +RibbonRoyal Königliches +RibbonGorgeousRoyal Hinreißendes Königliches +RibbonArtist Künstlers RibbonFootprint Fußabdruck RibbonRecord Rekord RibbonLegend Legende -RibbonCountry Land +RibbonCountry Landes RibbonNational Nation RibbonEarth Erde RibbonWorld Welt -RibbonClassic Klassisch +RibbonClassic Klassisches RibbonPremier Premier -RibbonEvent Geschichte -RibbonBirthday Geburtstag -RibbonSpecial Spezial +RibbonEvent Veranstaltungs +RibbonBirthday Geburtstags +RibbonSpecial Sonder RibbonSouvenir Gedenk RibbonWishing Wunsch -RibbonChampionBattle Kampfchampion -RibbonChampionRegional Regionaler Champion -RibbonChampionNational Nationaler Champion -RibbonChampionWorld Weltchampion -RibbonCountMemoryContest Verg. Wettbewerbsb. -RibbonCountMemoryBattle Verg. Kampfb. -RibbonChampionG6Hoenn Hoenn Champion (ORAS) -RibbonContestStar Wettbewerbs-Star -RibbonMasterCoolness Coolness Meister -RibbonMasterBeauty Schönheit Meister -RibbonMasterCuteness Putzigkeit Meister -RibbonMasterCleverness Klugheit Meister -RibbonMasterToughness Stärke Meister +RibbonChampionBattle Kampfmeister +RibbonChampionRegional Regionalmeister +RibbonChampionNational Nationalmeister +RibbonChampionWorld Weltmeister +RibbonCountMemoryContest Wettbewerbsgedenk +RibbonCountMemoryBattle Kampfgedenk +RibbonChampionG6Hoenn Hoenn-Champs (ORAS) +RibbonContestStar Wettbewerbsstars +RibbonMasterCoolness Coolness Master +RibbonMasterBeauty Schönheit Master +RibbonMasterCuteness Anmut Master +RibbonMasterCleverness Klugheit Master +RibbonMasterToughness Stärke Master RibbonG3Cool Coolness (G3) RibbonG3CoolSuper Coolness Super RibbonG3CoolHyper Coolness Hyper @@ -84,8 +84,8 @@ RibbonG4Tough Stärke (G4) RibbonG4ToughGreat Stärke Mega RibbonG4ToughUltra Stärke Ultra RibbonG4ToughMaster Stärke Master -RibbonWinning Gewinner -RibbonVictory Sieger +RibbonWinning Gewinners +RibbonVictory Sieges RibbonAbility Fähigkeit RibbonAbilityGreat Fähigkeit Groß RibbonAbilityDouble Fähigkeit Doppel @@ -97,12 +97,12 @@ RibbonCountG3Beauty Schönheit RibbonCountG3Cute Anmut RibbonCountG3Smart Klugheit RibbonCountG3Tough Stärke -RibbonChampionAlola Alola Champion -RibbonBattleRoyale Battle Royal Champion -RibbonBattleTreeGreat Battle Tree Great -RibbonBattleTreeMaster Battle Tree Master +RibbonChampionAlola Alola-Champs +RibbonBattleRoyale Battle-Royale-Meister +RibbonBattleTreeGreat Profibaum +RibbonBattleTreeMaster Meisterbaum RibbonChampionGalar Galar-Champs -RibbonTowerMaster Turmmeister +RibbonTowerMaster Meisterturm RibbonMasterRank Meisterrang RibbonMarkLunchtime Mittags-Zeichen RibbonMarkSleepyTime Mitternachts-Zeichen @@ -161,4 +161,4 @@ RibbonOnceInALifetime Glückstrefferband RibbonMarkAlpha Elite-Zeichen RibbonMarkMightiest Titanen-Zeichen RibbonMarkTitan Herrscher-Zeichen -RibbonPartner Partnerband \ No newline at end of file +RibbonPartner Partner diff --git a/PKHeX.Core/Resources/text/other/en/text_Ribbons_en.txt b/PKHeX.Core/Resources/text/other/en/text_Ribbons_en.txt index 37a81b5fa..4abaa4410 100644 --- a/PKHeX.Core/Resources/text/other/en/text_Ribbons_en.txt +++ b/PKHeX.Core/Resources/text/other/en/text_Ribbons_en.txt @@ -98,7 +98,7 @@ RibbonCountG3Cute Cute RibbonCountG3Smart Smart RibbonCountG3Tough Tough RibbonChampionAlola Alola Champion -RibbonBattleRoyale Battle Royal Champion +RibbonBattleRoyale Battle Royal Master RibbonBattleTreeGreat Battle Tree Great RibbonBattleTreeMaster Battle Tree Master RibbonChampionGalar Galar Champion @@ -161,4 +161,4 @@ RibbonOnceInALifetime Once-in-a-Lifetime RibbonMarkAlpha Alpha Mark RibbonMarkMightiest Mightiest Mark RibbonMarkTitan Titan Mark -RibbonPartner Partner Ribbon \ No newline at end of file +RibbonPartner Partner diff --git a/PKHeX.Core/Resources/text/other/es-419/text_Ribbons_es-419.txt b/PKHeX.Core/Resources/text/other/es-419/text_Ribbons_es-419.txt index 2aa7646f0..4e9e60969 100644 --- a/PKHeX.Core/Resources/text/other/es-419/text_Ribbons_es-419.txt +++ b/PKHeX.Core/Resources/text/other/es-419/text_Ribbons_es-419.txt @@ -1,21 +1,21 @@ RibbonChampionKalos Campeón de Kalos RibbonChampionG3 Campeón (Gen3) RibbonChampionSinnoh Campeón de Sinnoh -RibbonBestFriends Afecto -RibbonTraining Entrenamiento -RibbonBattlerSkillful Élite del Combate -RibbonBattlerExpert Experto del Combate +RibbonBestFriends Amistad +RibbonTraining Ejercicio +RibbonBattlerSkillful Figura del Combate +RibbonBattlerExpert As del Combate RibbonEffort Esfuerzo RibbonAlert Alerta RibbonShock Impacto RibbonDowncast Abatimiento RibbonCareless Descuido -RibbonRelax Relajación -RibbonSnooze Siesta +RibbonRelax Relax +RibbonSnooze Cabezada RibbonSmile Sonrisa RibbonGorgeous Maravilla RibbonRoyal Realeza -RibbonGorgeousRoyal Realeza Maravila +RibbonGorgeousRoyal Realeza Maravilla RibbonArtist Artista RibbonFootprint Huella RibbonRecord Récord @@ -35,55 +35,55 @@ RibbonChampionBattle Campeón de Torneo RibbonChampionRegional Campeón de Área RibbonChampionNational Campeón Nacional RibbonChampionWorld Campeón Mundial -RibbonCountMemoryContest Cintas de concursos anteriores -RibbonCountMemoryBattle Cintas de batallas anteriores +RibbonCountMemoryContest Recuerdo de Concurso +RibbonCountMemoryBattle Recuerdo de Combate RibbonChampionG6Hoenn Campeón de Hoenn (ORAS) -RibbonContestStar Cinta estelar de los concursos -RibbonMasterCoolness Cinta estrella del carisma -RibbonMasterBeauty Cinta estrella de la belleza -RibbonMasterCuteness Cinta estrella de la dulzura -RibbonMasterCleverness Cinta estrella del ingenio -RibbonMasterToughness Cinta estrella de la solidez +RibbonContestStar Estelar de Concursos +RibbonMasterCoolness Carisma experto +RibbonMasterBeauty Belleza experto +RibbonMasterCuteness Dulzura experto +RibbonMasterCleverness Ingenio experto +RibbonMasterToughness Solidez experto RibbonG3Cool Carisma (G3) -RibbonG3CoolSuper Carisma Alto -RibbonG3CoolHyper Carisma Avanzado -RibbonG3CoolMaster Carisma Experto +RibbonG3CoolSuper Carisma alto +RibbonG3CoolHyper Carisma avanzado +RibbonG3CoolMaster Carisma experto RibbonG3Beauty Belleza (G3) -RibbonG3BeautySuper Belleza Alto -RibbonG3BeautyHyper Belleza Avanzado -RibbonG3BeautyMaster Belleza Experto +RibbonG3BeautySuper Belleza alto +RibbonG3BeautyHyper Belleza avanzado +RibbonG3BeautyMaster Belleza experto RibbonG3Cute Dulzura (G3) -RibbonG3CuteSuper Dulzura Alto -RibbonG3CuteHyper Dulzura Avanzado -RibbonG3CuteMaster Dulzura Experto +RibbonG3CuteSuper Dulzura alto +RibbonG3CuteHyper Dulzura avanzado +RibbonG3CuteMaster Dulzura experto RibbonG3Smart Ingenio (G3) -RibbonG3SmartSuper Ingenio Alto -RibbonG3SmartHyper Ingenio Avanzado -RibbonG3SmartMaster Ingenio Experto +RibbonG3SmartSuper Ingenio alto +RibbonG3SmartHyper Ingenio avanzado +RibbonG3SmartMaster Ingenio experto RibbonG3Tough Solidez (G3) -RibbonG3ToughSuper Solidez Alto -RibbonG3ToughHyper Solidez Avanzado -RibbonG3ToughMaster Solidez Experto +RibbonG3ToughSuper Solidez alto +RibbonG3ToughHyper Solidez avanzado +RibbonG3ToughMaster Solidez experto RibbonG4Cool Carisma (G4) -RibbonG4CoolGreat Carisma Difícil -RibbonG4CoolUltra Carisma Superior -RibbonG4CoolMaster Carisma Experto +RibbonG4CoolGreat Carisma difícil +RibbonG4CoolUltra Carisma superior +RibbonG4CoolMaster Carisma experto RibbonG4Beauty Belleza (G4) -RibbonG4BeautyGreat Belleza Difícil -RibbonG4BeautyUltra Belleza Superior -RibbonG4BeautyMaster Belleza Experto +RibbonG4BeautyGreat Belleza difícil +RibbonG4BeautyUltra Belleza superior +RibbonG4BeautyMaster Belleza experto RibbonG4Cute Dulzura (G4) -RibbonG4CuteGreat Dulzura Difícil -RibbonG4CuteUltra Dulzura Superior -RibbonG4CuteMaster Dulzura Experto +RibbonG4CuteGreat Dulzura difícil +RibbonG4CuteUltra Dulzura superior +RibbonG4CuteMaster Dulzura experto RibbonG4Smart Ingenio (G4) -RibbonG4SmartGreat Ingenio Difícil -RibbonG4SmartUltra Ingenio Superior -RibbonG4SmartMaster Ingenio Experto +RibbonG4SmartGreat Ingenio difícil +RibbonG4SmartUltra Ingenio superior +RibbonG4SmartMaster Ingenio experto RibbonG4Tough Solidez (G4) -RibbonG4ToughGreat Solidez Difícil -RibbonG4ToughUltra Solidez Superior -RibbonG4ToughMaster Solidez Experto +RibbonG4ToughGreat Solidez difícil +RibbonG4ToughUltra Solidez superior +RibbonG4ToughMaster Solidez experto RibbonWinning Ganador RibbonVictory Victoria RibbonAbility Habilidad @@ -161,4 +161,4 @@ RibbonOnceInALifetime Excepcionalidad RibbonMarkAlpha Emblema Alfa RibbonMarkMightiest Emblema Imbatibilidad RibbonMarkTitan Emblema Dominio -RibbonPartner Camarada \ No newline at end of file +RibbonPartner Camarada diff --git a/PKHeX.Core/Resources/text/other/es/text_Ribbons_es.txt b/PKHeX.Core/Resources/text/other/es/text_Ribbons_es.txt index b3f4289d6..cae922d18 100644 --- a/PKHeX.Core/Resources/text/other/es/text_Ribbons_es.txt +++ b/PKHeX.Core/Resources/text/other/es/text_Ribbons_es.txt @@ -1,10 +1,10 @@ RibbonChampionKalos Campeón de Kalos RibbonChampionG3 Campeón (Gen3) RibbonChampionSinnoh Campeón de Sinnoh -RibbonBestFriends Afecto +RibbonBestFriends Amistad RibbonTraining Ejercicio RibbonBattlerSkillful Figura del Combate -RibbonBattlerExpert Experto del Combate +RibbonBattlerExpert As del Combate RibbonEffort Esfuerzo RibbonAlert Alerta RibbonShock Impacto @@ -15,7 +15,7 @@ RibbonSnooze Cabezada RibbonSmile Sonrisa RibbonGorgeous Maravilla RibbonRoyal Realeza -RibbonGorgeousRoyal Realeza Maravila +RibbonGorgeousRoyal Realeza Maravilla RibbonArtist Artista RibbonFootprint Huella RibbonRecord Récord @@ -35,55 +35,55 @@ RibbonChampionBattle Campeón de Torneo RibbonChampionRegional Campeón de Área RibbonChampionNational Campeón Nacional RibbonChampionWorld Campeón Mundial -RibbonCountMemoryContest Cintas de concursos anteriores -RibbonCountMemoryBattle Cintas de batallas anteriores -RibbonChampionG6Hoenn Campeón de Hoenn (ORAS) -RibbonContestStar Cinta estelar de los concursos -RibbonMasterCoolness Cinta estrella del carisma -RibbonMasterBeauty Cinta estrella de la belleza -RibbonMasterCuteness Cinta estrella de la dulzura -RibbonMasterCleverness Cinta estrella del ingenio -RibbonMasterToughness Cinta estrella de la dureza +RibbonCountMemoryContest Recuerdo de Concurso +RibbonCountMemoryBattle Recuerdo de Combate +RibbonChampionG6Hoenn Campeón de Hoenn (ROZA) +RibbonContestStar Estelar de Concursos +RibbonMasterCoolness Carisma experto +RibbonMasterBeauty Belleza experto +RibbonMasterCuteness Dulzura experto +RibbonMasterCleverness Ingenio experto +RibbonMasterToughness Dureza experto RibbonG3Cool Carisma (G3) -RibbonG3CoolSuper Carisma Alto -RibbonG3CoolHyper Carisma Avanzado -RibbonG3CoolMaster Carisma Experto +RibbonG3CoolSuper Carisma alto +RibbonG3CoolHyper Carisma avanzado +RibbonG3CoolMaster Carisma experto RibbonG3Beauty Belleza (G3) -RibbonG3BeautySuper Belleza Alto -RibbonG3BeautyHyper Belleza Avanzado -RibbonG3BeautyMaster Belleza Experto +RibbonG3BeautySuper Belleza alto +RibbonG3BeautyHyper Belleza avanzado +RibbonG3BeautyMaster Belleza experto RibbonG3Cute Dulzura (G3) -RibbonG3CuteSuper Dulzura Alto -RibbonG3CuteHyper Dulzura Avanzado -RibbonG3CuteMaster Dulzura Experto +RibbonG3CuteSuper Dulzura alto +RibbonG3CuteHyper Dulzura avanzado +RibbonG3CuteMaster Dulzura experto RibbonG3Smart Ingenio (G3) -RibbonG3SmartSuper Ingenio Alto -RibbonG3SmartHyper Ingenio Avanzado -RibbonG3SmartMaster Ingenio Experto +RibbonG3SmartSuper Ingenio alto +RibbonG3SmartHyper Ingenio avanzado +RibbonG3SmartMaster Ingenio experto RibbonG3Tough Dureza (G3) -RibbonG3ToughSuper Dureza Alto -RibbonG3ToughHyper Dureza Avanzado -RibbonG3ToughMaster Dureza Experto +RibbonG3ToughSuper Dureza alto +RibbonG3ToughHyper Dureza avanzado +RibbonG3ToughMaster Dureza experto RibbonG4Cool Carisma (G4) -RibbonG4CoolGreat Carisma Difícil -RibbonG4CoolUltra Carisma Superior -RibbonG4CoolMaster Carisma Experto +RibbonG4CoolGreat Carisma difícil +RibbonG4CoolUltra Carisma superior +RibbonG4CoolMaster Carisma experto RibbonG4Beauty Belleza (G4) -RibbonG4BeautyGreat Belleza Difícil -RibbonG4BeautyUltra Belleza Superior -RibbonG4BeautyMaster Belleza Experto +RibbonG4BeautyGreat Belleza difícil +RibbonG4BeautyUltra Belleza superior +RibbonG4BeautyMaster Belleza experto RibbonG4Cute Dulzura (G4) -RibbonG4CuteGreat Dulzura Difícil -RibbonG4CuteUltra Dulzura Superior -RibbonG4CuteMaster Dulzura Experto +RibbonG4CuteGreat Dulzura difícil +RibbonG4CuteUltra Dulzura superior +RibbonG4CuteMaster Dulzura experto RibbonG4Smart Ingenio (G4) -RibbonG4SmartGreat Ingenio Difícil -RibbonG4SmartUltra Ingenio Superior -RibbonG4SmartMaster Ingenio Experto +RibbonG4SmartGreat Ingenio difícil +RibbonG4SmartUltra Ingenio superior +RibbonG4SmartMaster Ingenio experto RibbonG4Tough Dureza (G4) -RibbonG4ToughGreat Dureza Difícil -RibbonG4ToughUltra Dureza Superior -RibbonG4ToughMaster Dureza Experto +RibbonG4ToughGreat Dureza difícil +RibbonG4ToughUltra Dureza superior +RibbonG4ToughMaster Dureza experto RibbonWinning Ganador RibbonVictory Victoria RibbonAbility Habilidad @@ -161,4 +161,4 @@ RibbonOnceInALifetime Excepcionalidad RibbonMarkAlpha Emblema Alfa RibbonMarkMightiest Emblema Imbatibilidad RibbonMarkTitan Emblema Dominancia -RibbonPartner Camarada \ No newline at end of file +RibbonPartner Camarada diff --git a/PKHeX.Core/Resources/text/other/fr/text_Ribbons_fr.txt b/PKHeX.Core/Resources/text/other/fr/text_Ribbons_fr.txt index 2d4a908db..3c5595ea3 100644 --- a/PKHeX.Core/Resources/text/other/fr/text_Ribbons_fr.txt +++ b/PKHeX.Core/Resources/text/other/fr/text_Ribbons_fr.txt @@ -1,10 +1,10 @@ -RibbonChampionKalos Maître Kalos +RibbonChampionKalos Maître de Kalos RibbonChampionG3 Maître (Gen3) -RibbonChampionSinnoh Maître Sinnoh +RibbonChampionSinnoh Maître de Sinnoh RibbonBestFriends Affection RibbonTraining Perfectionnement -RibbonBattlerSkillful Élite -RibbonBattlerExpert Génie +RibbonBattlerSkillful Élite du Combat +RibbonBattlerExpert Génie du Combat RibbonEffort Effort RibbonAlert Alerte RibbonShock Choc @@ -37,7 +37,7 @@ RibbonChampionNational Champion National RibbonChampionWorld Champion du Monde RibbonCountMemoryContest Souvenir Concours RibbonCountMemoryBattle Souvenir Combat -RibbonChampionG6Hoenn Maître de Hoenn (ORAS) +RibbonChampionG6Hoenn Maître de Hoenn (ROSA) RibbonContestStar Star des Concours RibbonMasterCoolness Maître Sang-Froid RibbonMasterBeauty Maître Beauté @@ -80,11 +80,11 @@ RibbonG4Cute Grâce (G4) RibbonG4CuteGreat Grâce Méga RibbonG4CuteUltra Grâce Ultra RibbonG4CuteMaster Grâce Master -RibbonG4Smart Smart (G4) +RibbonG4Smart Intelligence (G4) RibbonG4SmartGreat Intelligence Méga RibbonG4SmartUltra Intelligence Ultra RibbonG4SmartMaster Intelligence Master -RibbonG4Tough Tough (G4) +RibbonG4Tough Robustesse (G4) RibbonG4ToughGreat Robustesse Méga RibbonG4ToughUltra Robustesse Ultra RibbonG4ToughMaster Robustesse Master @@ -161,4 +161,4 @@ RibbonOnceInALifetime Exceptionnel RibbonMarkAlpha Insigne Baron RibbonMarkMightiest Insigne Surpuissant RibbonMarkTitan Insigne Dominant -RibbonPartner Partner Ribbon \ No newline at end of file +RibbonPartner Partenaire diff --git a/PKHeX.Core/Resources/text/other/it/text_Ribbons_it.txt b/PKHeX.Core/Resources/text/other/it/text_Ribbons_it.txt index 841034b6a..a5ffb6dbb 100644 --- a/PKHeX.Core/Resources/text/other/it/text_Ribbons_it.txt +++ b/PKHeX.Core/Resources/text/other/it/text_Ribbons_it.txt @@ -37,66 +37,66 @@ RibbonChampionNational Campione Nazionale RibbonChampionWorld Campione Mondiale RibbonCountMemoryContest Ricordo delle Gare RibbonCountMemoryBattle Ricordo delle Lotte -RibbonChampionG6Hoenn Campione Hoenn (ORAS) +RibbonChampionG6Hoenn Campione Hoenn (ROSA) RibbonContestStar Stella delle Gare RibbonMasterCoolness Classe Suprema RibbonMasterBeauty Bellezza Suprema RibbonMasterCuteness Grazia Suprema RibbonMasterCleverness Acume Supremo RibbonMasterToughness Grinta Suprema -RibbonG3Cool Cool (G3) -RibbonG3CoolSuper Cool Super -RibbonG3CoolHyper Cool Hyper -RibbonG3CoolMaster Cool Master -RibbonG3Beauty Beauty (G3) -RibbonG3BeautySuper Beauty Super -RibbonG3BeautyHyper Beauty Hyper -RibbonG3BeautyMaster Beauty Master -RibbonG3Cute Cute (G3) -RibbonG3CuteSuper Cute Super -RibbonG3CuteHyper Cute Hyper -RibbonG3CuteMaster Cute Master -RibbonG3Smart Smart (G3) -RibbonG3SmartSuper Smart Super -RibbonG3SmartHyper Smart Hyper -RibbonG3SmartMaster Smart Master -RibbonG3Tough Tough (G3) -RibbonG3ToughSuper Tough Super -RibbonG3ToughHyper Tough Hyper -RibbonG3ToughMaster Tough Master -RibbonG4Cool Cool (G4) -RibbonG4CoolGreat Cool Great -RibbonG4CoolUltra Cool Ultra -RibbonG4CoolMaster Cool Master -RibbonG4Beauty Beauty (G4) -RibbonG4BeautyGreat Beauty Great -RibbonG4BeautyUltra Beauty Ultra -RibbonG4BeautyMaster Beauty Master -RibbonG4Cute Cute (G4) -RibbonG4CuteGreat Cute Great -RibbonG4CuteUltra Cute Ultra -RibbonG4CuteMaster Cute Master -RibbonG4Smart Smart (G4) -RibbonG4SmartGreat Smart Great -RibbonG4SmartUltra Smart Ultra -RibbonG4SmartMaster Smart Master -RibbonG4Tough Tough (G4) -RibbonG4ToughGreat Tough Great -RibbonG4ToughUltra Tough Ultra -RibbonG4ToughMaster Tough Master -RibbonWinning Winning -RibbonVictory Victory -RibbonAbility Ability -RibbonAbilityGreat Great Ability -RibbonAbilityDouble Double Ability -RibbonAbilityMulti Multi Ability -RibbonAbilityPair Pair Ability -RibbonAbilityWorld World Ability -RibbonCountG3Cool Cool -RibbonCountG3Beauty Beauty -RibbonCountG3Cute Cute -RibbonCountG3Smart Smart -RibbonCountG3Tough Tough +RibbonG3Cool Classe (G3) +RibbonG3CoolSuper Classe: Livello Super +RibbonG3CoolHyper Classe: Livello Iper +RibbonG3CoolMaster Classe: Livello Master +RibbonG3Beauty Bellezza (G3) +RibbonG3BeautySuper Bellezza: Livello Super +RibbonG3BeautyHyper Bellezza: Livello Iper +RibbonG3BeautyMaster Bellezza: Livello Master +RibbonG3Cute Grazia (G3) +RibbonG3CuteSuper Grazia: Livello Super +RibbonG3CuteHyper Grazia: Livello Iper +RibbonG3CuteMaster Grazia: Livello Master +RibbonG3Smart Acume (G3) +RibbonG3SmartSuper Acume: Livello Super +RibbonG3SmartHyper Acume: Livello Iper +RibbonG3SmartMaster Acume: Livello Master +RibbonG3Tough Grinta (G3) +RibbonG3ToughSuper Grinta: Livello Super +RibbonG3ToughHyper Grinta: Livello Iper +RibbonG3ToughMaster Grinta: Livello Master +RibbonG4Cool Classe (G4) +RibbonG4CoolGreat Classe: Livello Mega +RibbonG4CoolUltra Classe: Livello Ultra +RibbonG4CoolMaster Classe: Livello Master +RibbonG4Beauty Bellezza (G4) +RibbonG4BeautyGreat Bellezza: Livello Mega +RibbonG4BeautyUltra Bellezza: Livello Ultra +RibbonG4BeautyMaster Bellezza: Livello Master +RibbonG4Cute Grazia (G4) +RibbonG4CuteGreat Grazia: Livello Mega +RibbonG4CuteUltra Grazia: Livello Ultra +RibbonG4CuteMaster Grazia: Livello Master +RibbonG4Smart Acume (G4) +RibbonG4SmartGreat Acume: Livello Mega +RibbonG4SmartUltra Acume: Livello Ultra +RibbonG4SmartMaster Acume: Livello Master +RibbonG4Tough Grinta (G4) +RibbonG4ToughGreat Grinta: Livello Mega +RibbonG4ToughUltra Grinta: Livello Ultra +RibbonG4ToughMaster Grinta: Livello Master +RibbonWinning Vittoria +RibbonVictory Trionfo +RibbonAbility Abilità +RibbonAbilityGreat Abilità Mega +RibbonAbilityDouble Abilità Doppia +RibbonAbilityMulti Abilità Multipla +RibbonAbilityPair Abilità Insieme +RibbonAbilityWorld Abilità Mondiale +RibbonCountG3Cool Classe +RibbonCountG3Beauty Bellezza +RibbonCountG3Cute Grazia +RibbonCountG3Smart Acume +RibbonCountG3Tough Grinta RibbonChampionAlola Campione Alola RibbonBattleRoyale Asso Royale RibbonBattleTreeGreat Asso dell’Albero @@ -161,4 +161,4 @@ RibbonOnceInALifetime Eccezionale RibbonMarkAlpha Emblema dell’Alfa RibbonMarkMightiest Emblema della Forza Assoluta RibbonMarkTitan Emblema del dominante -RibbonPartner Compagno \ No newline at end of file +RibbonPartner Compagno diff --git a/PKHeX.Core/Resources/text/other/ja/text_Ribbons_ja.txt b/PKHeX.Core/Resources/text/other/ja/text_Ribbons_ja.txt index 964aec165..92a22cf93 100644 --- a/PKHeX.Core/Resources/text/other/ja/text_Ribbons_ja.txt +++ b/PKHeX.Core/Resources/text/other/ja/text_Ribbons_ja.txt @@ -1,106 +1,106 @@ -RibbonChampionKalos カロス チャンプ -RibbonChampionG3 チャンプ (Gen3) -RibbonChampionSinnoh シンオウ チャンプ -RibbonBestFriends なかよし -RibbonTraining しゅぎょう -RibbonBattlerSkillful グレートバトル -RibbonBattlerExpert マスターバトル -RibbonEffort がんば -RibbonAlert しゃっき -RibbonShock どっき -RibbonDowncast しょんぼ -RibbonCareless うっか -RibbonRelax すっき -RibbonSnooze ぐっす -RibbonSmile にっこ -RibbonGorgeous ゴージャス -RibbonRoyal ロイヤル -RibbonGorgeousRoyal ゴージャスロイヤル -RibbonArtist ブロマイド -RibbonFootprint あしあと -RibbonRecord レコード -RibbonLegend レジェンド -RibbonCountry カントリー -RibbonNational ナショナル -RibbonEarth アース -RibbonWorld ワールド -RibbonClassic クラシック -RibbonPremier プレミア -RibbonEvent イベント -RibbonBirthday バースデー -RibbonSpecial スペシャル -RibbonSouvenir メモリアル -RibbonWishing ウィッシュ -RibbonChampionBattle バトルチャンプ -RibbonChampionRegional エリアチャンプ -RibbonChampionNational ナショナルチャンプ -RibbonChampionWorld ワールドチャンプ -RibbonCountMemoryContest おもいでコンテスト -RibbonCountMemoryBattle おもいでバトル -RibbonChampionG6Hoenn ホウエン チャンプ (ORAS) -RibbonContestStar コンテストスター -RibbonMasterCoolness かっこよさマスター -RibbonMasterBeauty うつくしさマスター -RibbonMasterCuteness かわいさマスター -RibbonMasterCleverness かしこさマスター -RibbonMasterToughness たくましさマスター -RibbonG3Cool クール (G3) -RibbonG3CoolSuper クールリボンスーパー (G3) -RibbonG3CoolHyper クールリボンハイパー (G3) -RibbonG3CoolMaster クールリボンマスター (G3) -RibbonG3Beauty ビューティー (G3) -RibbonG3BeautySuper ビューティーリボンスーパー (G3) -RibbonG3BeautyHyper ビューティーリボンハイパー (G3) -RibbonG3BeautyMaster ビューティーリボンマスター (G3) -RibbonG3Cute キュート (G3) -RibbonG3CuteSuper キュートリボンスーパー (G3) -RibbonG3CuteHyper キュートリボンハイパー (G3) -RibbonG3CuteMaster キュートリボンマスター (G3) -RibbonG3Smart ジーニアス (G3) -RibbonG3SmartSuper ジーニアスリボンスーパー (G3) -RibbonG3SmartHyper ジーニアスリボンハイパー (G3) -RibbonG3SmartMaster ジーニアスリボンマスター (G3) -RibbonG3Tough パワフル (G3) -RibbonG3ToughSuper パワフルリボンスーパー (G3) -RibbonG3ToughHyper パワフルリボンハイパー (G3) -RibbonG3ToughMaster パワフルリボンマスター (G3) -RibbonG4Cool クール (G4) -RibbonG4CoolGreat クールリボングレート (G4) -RibbonG4CoolUltra クールリボンウルトラ (G4) -RibbonG4CoolMaster クールリボンマスター (G4) -RibbonG4Beauty ビューティー (G4) -RibbonG4BeautyGreat ビューティーリボングレート (G4) -RibbonG4BeautyUltra ビューティーリボンウルトラ (G4) -RibbonG4BeautyMaster ビューティーリボンマスター (G4) -RibbonG4Cute キュート (G4) -RibbonG4CuteGreat キュートリボングレート (G4) -RibbonG4CuteUltra キュートリボンウルトラ (G4) -RibbonG4CuteMaster キュートリボンマスター (G4) -RibbonG4Smart ジーニアス (G4) -RibbonG4SmartGreat ジーニアスリボングレート (G4) -RibbonG4SmartUltra ジーニアスリボンウルトラ (G4) -RibbonG4SmartMaster ジーニアスリボンマスター (G4) -RibbonG4Tough パワフル (G4) -RibbonG4ToughGreat パワフルリボングレート (G4) -RibbonG4ToughUltra パワフルリボンウルトラ (G4) -RibbonG4ToughMaster パワフルリボンマスター (G4) -RibbonWinning ウイニング -RibbonVictory ビクトリー -RibbonAbility アビリティ -RibbonAbilityGreat グレートアビリティ -RibbonAbilityDouble ダブルアビリティ -RibbonAbilityMulti マルチアビリティ -RibbonAbilityPair ペアアビリティ -RibbonAbilityWorld ワールドアビリティ -RibbonCountG3Cool かっこよさ -RibbonCountG3Beauty うつくしさ -RibbonCountG3Cute かわいさ -RibbonCountG3Smart かしこさ -RibbonCountG3Tough たくましさ -RibbonChampionAlola アローラ チャンプ -RibbonBattleRoyale ロイヤルマスター -RibbonBattleTreeGreat グレートツリー -RibbonBattleTreeMaster マスターツリー +RibbonChampionKalos カロス チャンプリボン +RibbonChampionG3 チャンプリボン (3世代) +RibbonChampionSinnoh シンオウ チャンプリボン +RibbonBestFriends なかよしリボン +RibbonTraining しゅぎょうリボン +RibbonBattlerSkillful グレートバトルリボン +RibbonBattlerExpert マスターバトルリボン +RibbonEffort がんばリボン +RibbonAlert しゃっきリボン +RibbonShock どっきリボン +RibbonDowncast しょんぼリボン +RibbonCareless うっかリボン +RibbonRelax すっきリボン +RibbonSnooze ぐっすリボン +RibbonSmile にっこリボン +RibbonGorgeous ゴージャスリボン +RibbonRoyal ロイヤルリボン +RibbonGorgeousRoyal ゴージャスロイヤルリボン +RibbonArtist ブロマイドリボン +RibbonFootprint あしあとリボン +RibbonRecord レコードリボン +RibbonLegend レジェンドリボン +RibbonCountry カントリーリボン +RibbonNational ナショナルリボン +RibbonEarth アースリボン +RibbonWorld ワールドリボン +RibbonClassic クラシックリボン +RibbonPremier プレミアリボン +RibbonEvent イベントリボン +RibbonBirthday バースデーリボン +RibbonSpecial スペシャルリボン +RibbonSouvenir メモリアルリボン +RibbonWishing ウィッシュリボン +RibbonChampionBattle バトルチャンプリボン +RibbonChampionRegional エリアチャンプリボン +RibbonChampionNational ナショナルチャンプリボン +RibbonChampionWorld ワールドチャンプリボン +RibbonCountMemoryContest おもいでコンテストリボン +RibbonCountMemoryBattle おもいでバトルリボン +RibbonChampionG6Hoenn ホウエン チャンプリボン (ORAS) +RibbonContestStar コンテストスターリボン +RibbonMasterCoolness かっこよさマスターリボン +RibbonMasterBeauty うつくしさマスターリボン +RibbonMasterCuteness かわいさマスターリボン +RibbonMasterCleverness かしこさマスターリボン +RibbonMasterToughness たくましさマスターリボン +RibbonG3Cool クールリボン (3世代) +RibbonG3CoolSuper クールリボンスーパー (3世代) +RibbonG3CoolHyper クールリボンハイパー (3世代) +RibbonG3CoolMaster クールリボンマスター (3世代) +RibbonG3Beauty ビューティリボン (3世代) +RibbonG3BeautySuper ビューティリボンスーパー (3世代) +RibbonG3BeautyHyper ビューティリボンハイパー (3世代) +RibbonG3BeautyMaster ビューティリボンマスター (3世代) +RibbonG3Cute キュートリボン (3世代) +RibbonG3CuteSuper キュートリボンスーパー (3世代) +RibbonG3CuteHyper キュートリボンハイパー (3世代) +RibbonG3CuteMaster キュートリボンマスター (3世代) +RibbonG3Smart ジーニアスリボン (3世代) +RibbonG3SmartSuper ジーニアスリボンスーパー (3世代) +RibbonG3SmartHyper ジーニアスリボンハイパー (3世代) +RibbonG3SmartMaster ジーニアスリボンマスター (3世代) +RibbonG3Tough パワフルリボン (3世代) +RibbonG3ToughSuper パワフルリボンスーパー (3世代) +RibbonG3ToughHyper パワフルリボンハイパー (3世代) +RibbonG3ToughMaster パワフルリボンマスター (3世代) +RibbonG4Cool クールリボン (4世代) +RibbonG4CoolGreat クールリボングレート (4世代) +RibbonG4CoolUltra クールリボンウルトラ (4世代) +RibbonG4CoolMaster クールリボンマスター (4世代) +RibbonG4Beauty ビューティリボン (4世代) +RibbonG4BeautyGreat ビューティーリボングレート (4世代) +RibbonG4BeautyUltra ビューティーリボンウルトラ (4世代) +RibbonG4BeautyMaster ビューティーリボンマスター (4世代) +RibbonG4Cute キュートリボン (4世代) +RibbonG4CuteGreat キュートリボングレート (4世代) +RibbonG4CuteUltra キュートリボンウルトラ (4世代) +RibbonG4CuteMaster キュートリボンマスター (4世代) +RibbonG4Smart ジーニアスリボン (4世代) +RibbonG4SmartGreat ジーニアスリボングレート (4世代) +RibbonG4SmartUltra ジーニアスリボンウルトラ (4世代) +RibbonG4SmartMaster ジーニアスリボンマスター (4世代) +RibbonG4Tough パワフルリボン (4世代) +RibbonG4ToughGreat パワフルリボングレート (4世代) +RibbonG4ToughUltra パワフルリボンウルトラ (4世代) +RibbonG4ToughMaster パワフルリボンマスター (4世代) +RibbonWinning ウイニングリボン +RibbonVictory ビクトリーリボン +RibbonAbility アビリティリボン +RibbonAbilityGreat グレートアビリティリボン +RibbonAbilityDouble ダブルアビリティリボン +RibbonAbilityMulti マルチアビリティリボン +RibbonAbilityPair ペアアビリティリボン +RibbonAbilityWorld ワールドアビリティリボン +RibbonCountG3Cool かっこよさリボン +RibbonCountG3Beauty うつくしさリボン +RibbonCountG3Cute かわいさリボン +RibbonCountG3Smart かしこさリボン +RibbonCountG3Tough たくましさリボン +RibbonChampionAlola アローラ チャンプリボン +RibbonBattleRoyale ロイヤルマスターリボン +RibbonBattleTreeGreat グレートツリーリボン +RibbonBattleTreeMaster マスターツリーリボン RibbonChampionGalar ガラル チャンプリボン RibbonTowerMaster マスタータワーリボン RibbonMasterRank マスターランクリボン @@ -161,4 +161,4 @@ RibbonOnceInALifetime せんざいいちぐうリボン RibbonMarkAlpha オヤブンのあかし RibbonMarkMightiest さいきょうのあかし RibbonMarkTitan ヌシのあかし -RibbonPartner パートナーリボン \ No newline at end of file +RibbonPartner パートナーリボン diff --git a/PKHeX.Core/Resources/text/other/ko/text_Ribbons_ko.txt b/PKHeX.Core/Resources/text/other/ko/text_Ribbons_ko.txt index e4a5faa65..185246a0a 100644 --- a/PKHeX.Core/Resources/text/other/ko/text_Ribbons_ko.txt +++ b/PKHeX.Core/Resources/text/other/ko/text_Ribbons_ko.txt @@ -1,5 +1,5 @@ RibbonChampionKalos 칼로스챔피언리본 -RibbonChampionG3 챔피언리본 (Gen3) +RibbonChampionG3 챔피언리본 (3세대) RibbonChampionSinnoh 신오챔피언리본 RibbonBestFriends 절친리본 RibbonTraining 수행리본 @@ -44,43 +44,43 @@ RibbonMasterBeauty 아름다움마스터리본 RibbonMasterCuteness 귀여움마스터리본 RibbonMasterCleverness 슬기로움마스터리본 RibbonMasterToughness 강인함마스터리본 -RibbonG3Cool 쿨리본 (G3) +RibbonG3Cool 쿨리본 (3세대) RibbonG3CoolSuper 쿨리본슈퍼 RibbonG3CoolHyper 쿨리본하이퍼 RibbonG3CoolMaster 쿨리본마스터 -RibbonG3Beauty 뷰티리본 (G3) +RibbonG3Beauty 뷰티리본 (3세대) RibbonG3BeautySuper 뷰티리본슈퍼 RibbonG3BeautyHyper 뷰티리본하이퍼 RibbonG3BeautyMaster 뷰티리본마스터 -RibbonG3Cute 큐트리본 (G3) +RibbonG3Cute 큐트리본 (3세대) RibbonG3CuteSuper 큐트리본슈퍼 RibbonG3CuteHyper 큐트리본하이퍼 RibbonG3CuteMaster 큐트리본마스터 -RibbonG3Smart 지니어스리본 (G3) +RibbonG3Smart 지니어스리본 (3세대) RibbonG3SmartSuper 지니어스리본슈퍼 RibbonG3SmartHyper 지니어스리본하이퍼 RibbonG3SmartMaster 지니어스리본마스터 -RibbonG3Tough 파워풀리본 (G3) +RibbonG3Tough 파워풀리본 (3세대) RibbonG3ToughSuper 파워풀리본슈퍼 RibbonG3ToughHyper 파워풀리본하이퍼 RibbonG3ToughMaster 파워풀리본마스터 -RibbonG4Cool 쿨리본 (G4) +RibbonG4Cool 쿨리본 (4세대) RibbonG4CoolGreat 쿨리본그레이트 RibbonG4CoolUltra 쿨리본울트라 RibbonG4CoolMaster 쿨리본마스터 -RibbonG4Beauty 뷰티리본 (G4) +RibbonG4Beauty 뷰티리본 (4세대) RibbonG4BeautyGreat 뷰티리본그레이트 RibbonG4BeautyUltra 뷰티리본울트라 RibbonG4BeautyMaster 뷰티리본마스터 -RibbonG4Cute 큐트리본 (G4) +RibbonG4Cute 큐트리본 (4세대) RibbonG4CuteGreat 큐트리본그레이트 RibbonG4CuteUltra 큐트리본울트라 RibbonG4CuteMaster 큐트리본마스터 -RibbonG4Smart 지니어스리본 (G4) +RibbonG4Smart 지니어스리본 (4세대) RibbonG4SmartGreat 지니어스리본그레이트 RibbonG4SmartUltra 지니어스리본울트라 RibbonG4SmartMaster 지니어스리본마스터 -RibbonG4Tough 파워풀리본 (G4) +RibbonG4Tough 파워풀리본 (4세대) RibbonG4ToughGreat 파워풀리본그레이트 RibbonG4ToughUltra 파워풀리본울트라 RibbonG4ToughMaster 파워풀리본마스터 @@ -149,7 +149,7 @@ RibbonMarkHumble 순박의증표 RibbonMarkThorny 불순의증표 RibbonMarkVigor 기력의증표 RibbonMarkSlump 피곤의증표 -RibbonHisui Hisui +RibbonHisui 히스이리본 RibbonTwinklingStar 트윙클스타리본 RibbonChampionPaldea 팔데아챔피언리본 RibbonMarkJumbo 커다란증표 @@ -161,4 +161,4 @@ RibbonOnceInALifetime 천재일우리본 RibbonMarkAlpha 우두머리의증표 RibbonMarkMightiest 최강의증표 RibbonMarkTitan 주인의증표 -RibbonPartner 파트너리본 \ No newline at end of file +RibbonPartner 파트너리본 diff --git a/PKHeX.Core/Resources/text/other/zh-Hans/text_Ribbons_zh-Hans.txt b/PKHeX.Core/Resources/text/other/zh-Hans/text_Ribbons_zh-Hans.txt index 1b7fa4321..755758aa4 100644 --- a/PKHeX.Core/Resources/text/other/zh-Hans/text_Ribbons_zh-Hans.txt +++ b/PKHeX.Core/Resources/text/other/zh-Hans/text_Ribbons_zh-Hans.txt @@ -37,7 +37,7 @@ RibbonChampionNational 国家冠军奖章 RibbonChampionWorld 世界冠军奖章 RibbonCountMemoryContest 华丽大赛回忆奖章 RibbonCountMemoryBattle 对战回忆奖章 -RibbonChampionG6Hoenn 丰缘冠军奖章 (6代) +RibbonChampionG6Hoenn 丰缘冠军奖章 (ORAS) RibbonContestStar 华丽大赛之星奖章 RibbonMasterCoolness 帅气大师奖章 (6代) RibbonMasterBeauty 美丽大师奖章 (6代) @@ -161,4 +161,4 @@ RibbonOnceInALifetime 千载难逢奖章 RibbonMarkAlpha 头目之证 RibbonMarkMightiest 最强之证 RibbonMarkTitan 宝主之证 -RibbonPartner 同伴奖章 \ No newline at end of file +RibbonPartner 同伴奖章 diff --git a/PKHeX.Core/Resources/text/other/zh-Hant/text_Ribbons_zh-Hant.txt b/PKHeX.Core/Resources/text/other/zh-Hant/text_Ribbons_zh-Hant.txt index 9fc81479b..95b822711 100644 --- a/PKHeX.Core/Resources/text/other/zh-Hant/text_Ribbons_zh-Hant.txt +++ b/PKHeX.Core/Resources/text/other/zh-Hant/text_Ribbons_zh-Hant.txt @@ -1,106 +1,106 @@ -RibbonChampionKalos 卡洛斯冠軍 -RibbonChampionG3 冠軍 (Gen3) -RibbonChampionSinnoh 神奧冠軍 -RibbonBestFriends 好友 -RibbonTraining 修行 -RibbonBattlerSkillful 高手對戰 -RibbonBattlerExpert 大師對戰 -RibbonEffort 努力 -RibbonAlert 振奮 -RibbonShock 心跳 -RibbonDowncast 失望 -RibbonCareless 大意 -RibbonRelax 暢快 -RibbonSnooze 酣睡 -RibbonSmile 歡笑 -RibbonGorgeous 豪華 -RibbonRoyal 高貴 -RibbonGorgeousRoyal 豪華高貴 -RibbonArtist 肖像 -RibbonFootprint 腳印 -RibbonRecord 紀錄 -RibbonLegend 傳說 -RibbonCountry 地區 -RibbonNational 國家 -RibbonEarth 地球 -RibbonWorld 世界 -RibbonClassic 經典 -RibbonPremier 紀念 -RibbonEvent 活動 -RibbonBirthday 生日 -RibbonSpecial 特殊 -RibbonSouvenir 回憶 -RibbonWishing 許願 -RibbonChampionBattle 對戰冠軍 -RibbonChampionRegional 地區冠軍 -RibbonChampionNational 國家冠軍 -RibbonChampionWorld 世界冠軍 +RibbonChampionKalos 卡洛斯冠軍獎章 +RibbonChampionG3 冠軍獎章 (3代) +RibbonChampionSinnoh 神奧冠軍獎章 +RibbonBestFriends 好友獎章 +RibbonTraining 修行獎章 +RibbonBattlerSkillful 高手對戰獎章 +RibbonBattlerExpert 大師對戰獎章 +RibbonEffort 努力獎章 +RibbonAlert 振奮獎章 +RibbonShock 心跳獎章 +RibbonDowncast 失望獎章 +RibbonCareless 大意獎章 +RibbonRelax 爽快獎章 +RibbonSnooze 酣睡獎章 +RibbonSmile 歡笑獎章 +RibbonGorgeous 豪華獎章 +RibbonRoyal 高貴獎章 +RibbonGorgeousRoyal 豪華高貴獎章 +RibbonArtist 肖像獎章 +RibbonFootprint 腳印獎章 +RibbonRecord 紀錄獎章 +RibbonLegend 傳說獎章 +RibbonCountry 地區獎章 +RibbonNational 國家獎章 +RibbonEarth 地球獎章 +RibbonWorld 世界獎章 +RibbonClassic 經典獎章 +RibbonPremier 紀念獎章 +RibbonEvent 活動獎章 +RibbonBirthday 生日獎章 +RibbonSpecial 特殊獎章 +RibbonSouvenir 回憶獎章 +RibbonWishing 許願獎章 +RibbonChampionBattle 對戰冠軍獎章 +RibbonChampionRegional 地區冠軍獎章 +RibbonChampionNational 國家冠軍獎章 +RibbonChampionWorld 世界冠軍獎章 RibbonCountMemoryContest 華麗大賽回憶獎章 RibbonCountMemoryBattle 對戰回憶獎章 -RibbonChampionG6Hoenn 豐緣冠軍 (Gen6) -RibbonContestStar 華麗大賽之星 -RibbonMasterCoolness 帥氣大師 -RibbonMasterBeauty 美麗大師 -RibbonMasterCuteness 可愛大師 -RibbonMasterCleverness 聰明大師 -RibbonMasterToughness 強壯大師 -RibbonG3Cool 帥氣 (Gen3) -RibbonG3CoolSuper 帥氣超級 -RibbonG3CoolHyper 帥氣專家 -RibbonG3CoolMaster 帥氣大師 -RibbonG3Beauty 美麗 (Gen3) -RibbonG3BeautySuper 美麗超級 -RibbonG3BeautyHyper 美麗專家 -RibbonG3BeautyMaster 美麗大師 -RibbonG3Cute 可愛 (Gen3) -RibbonG3CuteSuper 可愛超級 -RibbonG3CuteHyper 可愛專家 -RibbonG3CuteMaster 可愛大師 -RibbonG3Smart 聰明 (Gen3) -RibbonG3SmartSuper 聰明超級 -RibbonG3SmartHyper 聰明專家 -RibbonG3SmartMaster 聰明大師 -RibbonG3Tough 強壯 (Gen3) -RibbonG3ToughSuper 強壯超級 -RibbonG3ToughHyper 強壯專家 -RibbonG3ToughMaster 強壯大師 -RibbonG4Cool 帥氣 (Gen4) -RibbonG4CoolGreat 帥氣超級 -RibbonG4CoolUltra 帥氣究極 -RibbonG4CoolMaster 帥氣大師 -RibbonG4Beauty 美麗 (Gen4) -RibbonG4BeautyGreat 美麗超級 -RibbonG4BeautyUltra 美麗究極 -RibbonG4BeautyMaster 美麗大師 -RibbonG4Cute 可愛 (Gen4) -RibbonG4CuteGreat 可愛超級 -RibbonG4CuteUltra 可愛究極 -RibbonG4CuteMaster 可愛大師 -RibbonG4Smart 聰明 (Gen4) -RibbonG4SmartGreat 聰明超級 -RibbonG4SmartUltra 聰明究極 -RibbonG4SmartMaster 聰明大師 -RibbonG4Tough 強壯 (G4) -RibbonG4ToughGreat 強壯超級 -RibbonG4ToughUltra 強壯究極 -RibbonG4ToughMaster 強壯大師 -RibbonWinning 成功 -RibbonVictory 勝利 -RibbonAbility 才能 -RibbonAbilityGreat 超級才能 -RibbonAbilityDouble 雙人才能 -RibbonAbilityMulti 多人才能 -RibbonAbilityPair 組隊雙打才能 -RibbonAbilityWorld 世界才能 -RibbonCountG3Cool 帥氣 -RibbonCountG3Beauty 美麗 -RibbonCountG3Cute 可愛 -RibbonCountG3Smart 聰明 -RibbonCountG3Tough 強壯 -RibbonChampionAlola 阿羅拉冠軍 -RibbonBattleRoyale 皇家大師 -RibbonBattleTreeGreat 高手對戰樹 -RibbonBattleTreeMaster 大師對戰樹 +RibbonChampionG6Hoenn 豐緣冠軍獎章 (ORAS) +RibbonContestStar 華麗大賽之星獎章 +RibbonMasterCoolness 帥氣大師獎章 (6代) +RibbonMasterBeauty 美麗大師獎章 (6代) +RibbonMasterCuteness 可愛大師獎章 (6代) +RibbonMasterCleverness 聰明大師獎章 (6代) +RibbonMasterToughness 強壯大師獎章 (6代) +RibbonG3Cool 帥氣獎章 (3代) +RibbonG3CoolSuper 帥氣超級獎章 (3代) +RibbonG3CoolHyper 帥氣高級獎章 (3代) +RibbonG3CoolMaster 帥氣大師獎章 (3代) +RibbonG3Beauty 美麗獎章 (3代) +RibbonG3BeautySuper 美麗超級獎章 (3代) +RibbonG3BeautyHyper 美麗高級獎章 (3代) +RibbonG3BeautyMaster 美麗大師獎章 (3代) +RibbonG3Cute 可愛獎章 (3代) +RibbonG3CuteSuper 可愛超級獎章 (3代) +RibbonG3CuteHyper 可愛高級獎章 (3代) +RibbonG3CuteMaster 可愛大師獎章 (3代) +RibbonG3Smart 聰明獎章 (3代) +RibbonG3SmartSuper 聰明超級獎章 (3代) +RibbonG3SmartHyper 聰明高級獎章 (3代) +RibbonG3SmartMaster 聰明大師獎章 (3代) +RibbonG3Tough 強壯獎章 (3代) +RibbonG3ToughSuper 強壯超級獎章 (3代) +RibbonG3ToughHyper 強壯高級獎章 (3代) +RibbonG3ToughMaster 強壯大師獎章 (3代) +RibbonG4Cool 帥氣獎章 (4代) +RibbonG4CoolGreat 帥氣上級獎章 (4代) +RibbonG4CoolUltra 帥氣究極獎章 (4代) +RibbonG4CoolMaster 帥氣大師獎章 (4代) +RibbonG4Beauty 美麗獎章 (4代) +RibbonG4BeautyGreat 美麗上級獎章 (4代) +RibbonG4BeautyUltra 美麗究極獎章 (4代) +RibbonG4BeautyMaster 美麗大師獎章 (4代) +RibbonG4Cute 可愛獎章 (4代) +RibbonG4CuteGreat 可愛上級獎章 (4代) +RibbonG4CuteUltra 可愛究極獎章 (4代) +RibbonG4CuteMaster 可愛大師獎章 (4代) +RibbonG4Smart 聰明獎章 (4代) +RibbonG4SmartGreat 聰明上級獎章 (4代) +RibbonG4SmartUltra 聰明究極獎章 (4代) +RibbonG4SmartMaster 聰明大師獎章 (4代) +RibbonG4Tough 強壯獎章 (4代) +RibbonG4ToughGreat 強壯上級獎章 (4代) +RibbonG4ToughUltra 強壯究極獎章 (4代) +RibbonG4ToughMaster 強壯大師獎章 (4代) +RibbonWinning 成功獎章 +RibbonVictory 勝利獎章 +RibbonAbility 才能獎章 +RibbonAbilityGreat 超級才能獎章 +RibbonAbilityDouble 雙人才能獎章 +RibbonAbilityMulti 多人才能獎章 +RibbonAbilityPair 組隊雙打才能獎章 +RibbonAbilityWorld 世界才能獎章 +RibbonCountG3Cool 帥氣獎章 +RibbonCountG3Beauty 美麗獎章 +RibbonCountG3Cute 可愛獎章 +RibbonCountG3Smart 聰明獎章 +RibbonCountG3Tough 強壯獎章 +RibbonChampionAlola 阿羅拉冠軍獎章 +RibbonBattleRoyale 皇家大師獎章 +RibbonBattleTreeGreat 高手對戰樹獎章 +RibbonBattleTreeMaster 大師對戰樹獎章 RibbonChampionGalar 伽勒爾冠軍獎章 RibbonTowerMaster 對戰塔大師獎章 RibbonMasterRank 級別對戰大師獎章 @@ -161,4 +161,4 @@ RibbonOnceInALifetime 千載難逢獎章 RibbonMarkAlpha 頭目之證 RibbonMarkMightiest 最強之證 RibbonMarkTitan 寳主之證 -RibbonPartner 同伴獎章 \ No newline at end of file +RibbonPartner 同伴獎章 diff --git a/PKHeX.Core/Resources/text/script/gen3/const_frlg_es-419.txt b/PKHeX.Core/Resources/text/script/gen3/const_frlg_es-419.txt index 6e0b31ae4..be029a9bf 100644 --- a/PKHeX.Core/Resources/text/script/gen3/const_frlg_es-419.txt +++ b/PKHeX.Core/Resources/text/script/gen3/const_frlg_es-419.txt @@ -13,7 +13,7 @@ 0x4024 r Pokémon Salvaje en Cueva Cambiante 00:Zubat,01:Mareep (Ilegal),02:Pineco (Ilegal),03:Houndour (Ilegal),04:Teddiursa (Ilegal),05:Aipom (Ilegal),06:Shuckle (Ilegal),07:Stantler (Ilegal),08:Smeargle (Ilegal) 0x4049 a Sticker del Hall de la Fama en la Tarjeta Entrenador 0:Ningún,1:Nivel 1,2:Nivel 2,3:Nivel 3 -0x404A a Sticker de Huevos Eclosionados en la Tarjeta Entrenador 0:Ningún,1:Nivel 1,2:Nivel 2,3:Nivel 3 +0x404A a Sticker de Huevos Eclosionados en la Tarjeta Entrenador 0:Ningún,1:Nivel 1,2:Nivel 2,3:Nivel 3 0x404B a Sticker de Batallas Link en la Tarjeta Entrenador 0:Ningún,1:Nivel 1,2:Nivel 2,3:Nivel 3 0x408B s Super Nerd Fósil Derrotado (Mt. Moon) 0:No,1:Sí diff --git a/PKHeX.Core/Resources/text/script/gen3/const_frlg_es.txt b/PKHeX.Core/Resources/text/script/gen3/const_frlg_es.txt index 6e0b31ae4..be029a9bf 100644 --- a/PKHeX.Core/Resources/text/script/gen3/const_frlg_es.txt +++ b/PKHeX.Core/Resources/text/script/gen3/const_frlg_es.txt @@ -13,7 +13,7 @@ 0x4024 r Pokémon Salvaje en Cueva Cambiante 00:Zubat,01:Mareep (Ilegal),02:Pineco (Ilegal),03:Houndour (Ilegal),04:Teddiursa (Ilegal),05:Aipom (Ilegal),06:Shuckle (Ilegal),07:Stantler (Ilegal),08:Smeargle (Ilegal) 0x4049 a Sticker del Hall de la Fama en la Tarjeta Entrenador 0:Ningún,1:Nivel 1,2:Nivel 2,3:Nivel 3 -0x404A a Sticker de Huevos Eclosionados en la Tarjeta Entrenador 0:Ningún,1:Nivel 1,2:Nivel 2,3:Nivel 3 +0x404A a Sticker de Huevos Eclosionados en la Tarjeta Entrenador 0:Ningún,1:Nivel 1,2:Nivel 2,3:Nivel 3 0x404B a Sticker de Batallas Link en la Tarjeta Entrenador 0:Ningún,1:Nivel 1,2:Nivel 2,3:Nivel 3 0x408B s Super Nerd Fósil Derrotado (Mt. Moon) 0:No,1:Sí 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 d3a331cf1..8c3b53d31 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 @@ -412,8 +412,8 @@ 679 e Ori-Ticket recibido mediante Regalo Misterioso (GBA)/Salón de la Fama (Switch) 680 e Misti-Ticket recibido mediante Regalo Misterioso (GBA)/Salón de la Fama (Switch) -699 m Powder Jar received -700 r Mewtwo caught/defeated +699 m Bote Polvos recibido +700 r Capturado/Derrotado Mewtwo 701 r Capturado/Derrotado Moltres 702 r Capturado/Derrotado Articuno 703 r Capturado/Derrotado Zapdos @@ -1461,54 +1461,54 @@ 2122 e Puede viajar a Roca Ombligo 2123 e Puede viajar a Isla Origen -2192 f Visited/Can Fly to Pallet Town -2193 f Visited/Can Fly to Viridian City -2194 f Visited/Can Fly to Pewter City -2195 f Visited/Can Fly to Cerulean City -2196 f Visited/Can Fly to Lavender Town -2197 f Visited/Can Fly to Vermilion City -2198 f Visited/Can Fly to Celadon City -2199 f Visited/Can Fly to Fuchsia City -2200 f Visited/Can Fly to Cinnabar Island -2201 f Visited/Can Fly to Indigo Plateau -2202 f Visited/Can Fly to Saffron City -2203 f Visited/Can Fly to One Island -2204 f Visited/Can Fly to Two Island -2205 f Visited/Can Fly to Three Island -2206 f Visited/Can Fly to Four Island -2207 f Visited/Can Fly to Five Island -2208 f Visited/Can Fly to Seven Island -2209 f Visited/Can Fly to Six Island -2210 f Visited/Can Fly to Mt. Moon Pokémon Center -2211 f Visited/Can Fly to Route 10 Pokémon Center -2212 m Visited Viridian Forest -2213 m Visited Mt. Moon -2214 m Visited S.S. Anne -2215 m Visited Underground Path -2216 m Visited Underground Path Celadon City - Lavender Town -2217 m Visited Diglett's Cave -2218 m Visited Victory Road -2219 m Visited Rocket Hideout -2220 m Visited Silph Co. -2221 m Visited Pokémon Mansion -2222 m Visited Safari Zone -2223 m Visited Elite Four -2224 m Visited Rock Tunnel -2225 m Visited Seafoam Islands -2226 m Visited Pokémon Tower -2227 m Visited Cerulean Cave -2228 m Visited Power Plant -2229 m Visited Navel Rock -2230 m Visited Mt. Ember -2231 m Visited Berry Forest -2232 m Visited Icefall Cave -2233 m Visited Rocket Warehouse -2234 m Visited Trainer Tower -2235 m Visited Dotted Hole -2236 m Visited Lost Cave -2237 m Visited Pattern Bush -2238 m Visited Altering Cave -2239 m Visited Monean Chamber -2240 m Visited Three Isle Path -2241 m Visited Tanoby Key -2242 m Visited Birth Island +2192 f Visitó/Vuelo disponible a Pueblo Paleta +2193 f Visitó/Vuelo disponible a Ciudad Verde +2194 f Visitó/Vuelo disponible a Ciudad Plateada +2195 f Visitó/Vuelo disponible a Ciudad Celeste +2196 f Visitó/Vuelo disponible a Pueblo Lavanda +2197 f Visitó/Vuelo disponible a Ciudad Carmín +2198 f Visitó/Vuelo disponible a Ciudad Azulona +2199 f Visitó/Vuelo disponible a Ciudad Fucsia +2200 f Visitó/Vuelo disponible a Isla Canela +2201 f Visitó/Vuelo disponible a Meseta Añil +2202 f Visitó/Vuelo disponible a Ciudad Azafrán +2203 f Visitó/Vuelo disponible a Isla Prima +2204 f Visitó/Vuelo disponible a Isla Secundaria +2205 f Visitó/Vuelo disponible a Isla Tercia +2206 f Visitó/Vuelo disponible a Isla Cuarta +2207 f Visitó/Vuelo disponible a Isla Quinta +2208 f Visitó/Vuelo disponible a Isla Sétima +2209 f Visitó/Vuelo disponible a Isla Sexta +2210 f Visitó/Vuelo disponible a Centro Pokémon del Mt. Moon +2211 f Visitó/Vuelo disponible a Centro Pokémon de la Ruta 10 +2212 m Visitó Bosque Verde +2213 m Visitó Mt. Moon +2214 m Visitó S.S. Anne +2215 m Visitó Vía Subterránea +2216 m Visitó Vía Subterránea Ciudad Azulona - Pueblo Lavanda +2217 m Visitó Cueva Diglett +2218 m Visitó Calle Victoria +2219 m Visitó Guarida Rocket +2220 m Visitó Silph S.A. +2221 m Visitó Mansión Pokémon +2222 m Visitó Zona Safari +2223 m Visitó Élite Cuatro +2224 m Visitó Túnel Roca +2225 m Visitó Islas Espuma +2226 m Visitó Torre Pokémon +2227 m Visitó Cueva Celeste +2228 m Visitó Central Energía +2229 m Visitó Roca Ombligo +2230 m Visitó Monte Ascuas +2231 m Visitó Bosque Baya +2232 m Visitó Cueva Glaciada +2233 m Visitó Almacén Rocket +2234 m Visitó Torre Desafío +2235 m Visitó Cueva Teira +2236 m Visitó Cueva Perdida +2237 m Visitó Bosquejo +2238 m Visitó Cueva Cambiante +2239 m Visitó Cámara Anómala +2240 m Visitó Vía Isla Tercia +2241 m Visitó Llave Sete +2242 m Visitó Isla Origen 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 a389b33e3..9e1eeb29a 100644 --- a/PKHeX.Core/Resources/text/script/gen3/flags_frlg_es.txt +++ b/PKHeX.Core/Resources/text/script/gen3/flags_frlg_es.txt @@ -412,8 +412,8 @@ 679 e Ori-Ticket recibido mediante Regalo Misterioso (GBA)/Hall de la Fama (Switch) 680 e Misti-Ticket recibido mediante Regalo Misterioso (GBA)/Hall de la Fama (Switch) -699 m Powder Jar received -700 r Mewtwo caught/defeated +699 m Bote Polvos recibido +700 r Capturado/Derrotado Mewtwo 701 r Capturado/Derrotado Moltres 702 r Capturado/Derrotado Articuno 703 r Capturado/Derrotado Zapdos @@ -1461,54 +1461,54 @@ 2122 e Puede viajar a Roca Ombligo 2123 e Puede viajar a Isla Origen -2192 f Visited/Can Fly to Pallet Town -2193 f Visited/Can Fly to Viridian City -2194 f Visited/Can Fly to Pewter City -2195 f Visited/Can Fly to Cerulean City -2196 f Visited/Can Fly to Lavender Town -2197 f Visited/Can Fly to Vermilion City -2198 f Visited/Can Fly to Celadon City -2199 f Visited/Can Fly to Fuchsia City -2200 f Visited/Can Fly to Cinnabar Island -2201 f Visited/Can Fly to Indigo Plateau -2202 f Visited/Can Fly to Saffron City -2203 f Visited/Can Fly to One Island -2204 f Visited/Can Fly to Two Island -2205 f Visited/Can Fly to Three Island -2206 f Visited/Can Fly to Four Island -2207 f Visited/Can Fly to Five Island -2208 f Visited/Can Fly to Seven Island -2209 f Visited/Can Fly to Six Island -2210 f Visited/Can Fly to Mt. Moon Pokémon Center -2211 f Visited/Can Fly to Route 10 Pokémon Center -2212 m Visited Viridian Forest -2213 m Visited Mt. Moon -2214 m Visited S.S. Anne -2215 m Visited Underground Path -2216 m Visited Underground Path Celadon City - Lavender Town -2217 m Visited Diglett's Cave -2218 m Visited Victory Road -2219 m Visited Rocket Hideout -2220 m Visited Silph Co. -2221 m Visited Pokémon Mansion -2222 m Visited Safari Zone -2223 m Visited Elite Four -2224 m Visited Rock Tunnel -2225 m Visited Seafoam Islands -2226 m Visited Pokémon Tower -2227 m Visited Cerulean Cave -2228 m Visited Power Plant -2229 m Visited Navel Rock -2230 m Visited Mt. Ember -2231 m Visited Berry Forest -2232 m Visited Icefall Cave -2233 m Visited Rocket Warehouse -2234 m Visited Trainer Tower -2235 m Visited Dotted Hole -2236 m Visited Lost Cave -2237 m Visited Pattern Bush -2238 m Visited Altering Cave -2239 m Visited Monean Chamber -2240 m Visited Three Isle Path -2241 m Visited Tanoby Key -2242 m Visited Birth Island +2192 f Visitó/Vuelo disponible a Pueblo Paleta +2193 f Visitó/Vuelo disponible a Ciudad Verde +2194 f Visitó/Vuelo disponible a Ciudad Plateada +2195 f Visitó/Vuelo disponible a Ciudad Celeste +2196 f Visitó/Vuelo disponible a Pueblo Lavanda +2197 f Visitó/Vuelo disponible a Ciudad Carmín +2198 f Visitó/Vuelo disponible a Ciudad Azulona +2199 f Visitó/Vuelo disponible a Ciudad Fucsia +2200 f Visitó/Vuelo disponible a Isla Canela +2201 f Visitó/Vuelo disponible a Meseta Añil +2202 f Visitó/Vuelo disponible a Ciudad Azafrán +2203 f Visitó/Vuelo disponible a Isla Prima +2204 f Visitó/Vuelo disponible a Isla Secundaria +2205 f Visitó/Vuelo disponible a Isla Tercia +2206 f Visitó/Vuelo disponible a Isla Cuarta +2207 f Visitó/Vuelo disponible a Isla Quinta +2208 f Visitó/Vuelo disponible a Isla Sétima +2209 f Visitó/Vuelo disponible a Isla Sexta +2210 f Visitó/Vuelo disponible a Centro Pokémon del Mt. Moon +2211 f Visitó/Vuelo disponible a Centro Pokémon de la Ruta 10 +2212 m Visitó Bosque Verde +2213 m Visitó Mt. Moon +2214 m Visitó S.S. Anne +2215 m Visitó Vía Subterránea +2216 m Visitó Vía Subterránea Ciudad Azulona - Pueblo Lavanda +2217 m Visitó Cueva Diglett +2218 m Visitó Calle Victoria +2219 m Visitó Guarida Rocket +2220 m Visitó Silph S.A. +2221 m Visitó Mansión Pokémon +2222 m Visitó Zona Safari +2223 m Visitó Alto Mando +2224 m Visitó Túnel Roca +2225 m Visitó Islas Espuma +2226 m Visitó Torre Pokémon +2227 m Visitó Cueva Celeste +2228 m Visitó Central Energía +2229 m Visitó Roca Ombligo +2230 m Visitó Monte Ascuas +2231 m Visitó Bosque Baya +2232 m Visitó Cueva Glaciada +2233 m Visitó Almacén Rocket +2234 m Visitó Torre Desafío +2235 m Visitó Cueva Teira +2236 m Visitó Cueva Perdida +2237 m Visitó Bosquejo +2238 m Visitó Cueva Cambiante +2239 m Visitó Cámara Anómala +2240 m Visitó Vía Isla Tercia +2241 m Visitó Llave Sete +2242 m Visitó Isla Origen diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index be6392620..47c8d043f 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -7,7 +7,7 @@ KChart=Tabelle Main=PKHeX MemoryAmie=Erinnerung / Ami-Editor MoveShopEditor=Attacken-Tutor-Editor -QR=PKHeX QR-Code (Klicke auf den QR-Code, um das Bild zu kopieren) +QR=PKHeX QR-Code (Klicken zum Kopieren) RibbonEditor=Band-Editor SAV_Apricorn=Aprikoko-Editor SAV_BattlePass=Kampfpass-Editor @@ -134,7 +134,7 @@ BoxExporter.L_Namer=Namer: EntitySearchSetup.B_Add=Hinzuf. EntitySearchSetup.B_Next=Weiter EntitySearchSetup.B_Previous=Zurück -EntitySearchSetup.B_Reset=Filter zurücksetzen +EntitySearchSetup.B_Reset=Filter zurücks. EntitySearchSetup.B_Search=Suchen! EntitySearchSetup.CHK_IsEgg=Ei EntitySearchSetup.CHK_Shiny=Schillernd @@ -270,6 +270,7 @@ LocalizedDescription.DatabasePath=Pfad zum Ordner der PKM-Datenbank. LocalizedDescription.DefaultBoxExportNamer=Ausgewähltes Dateibenennungsschema für Box-Exporte über die Benutzeroberfläche, falls mehrere verfügbar sind. LocalizedDescription.DisableScalingDpi=Deaktiviert beim Programmstart die auf DPI basierende Skalierung der Benutzeroberfläche und nutzt stattdessen die Schriftart-Skalierung. LocalizedDescription.DisableWordFilterPastGen=Deaktiviert nachträgliche Wortfilter-Prüfungen für ältere Formate. +LocalizedDescription.DragStartThreshold=Mindestdistanz, die die Mausbewegung überschreiten muss, bevor ein Drag-Vorgang aus einem Slot gestartet wird. LocalizedDescription.EggRandomAnyType3=Erlaubt gezüchteten Eiern aus Generation 3 beliebige PID/DV-Kombinationen, unter der Annahme, dass diese durch RNG-Manipulation statt durch Cheats entstanden sind. LocalizedDescription.EggRandomAnyType4=Erlaubt gezüchteten Eiern aus Generation 4 beliebige PID/DV-Kombinationen, unter der Annahme, dass diese durch RNG-Manipulation statt durch Cheats entstanden sind. LocalizedDescription.Export=Einstellungen zur Anzeige von Details beim Exportieren eines Slots. @@ -313,12 +314,12 @@ LocalizedDescription.Nickname4=Spitznamen-Regeln für Generation 4. LocalizedDescription.Nickname5=Spitznamen-Regeln für Generation 5. LocalizedDescription.Nickname6=Spitznamen-Regeln für Generation 6. LocalizedDescription.Nickname7=Spitznamen-Regeln für Generation 7. -LocalizedDescription.Nickname7b=Spitznamen-Regeln für Generation 7b. +LocalizedDescription.Nickname7b=Spitznamen-Regeln für Generation 7b (Let's Go). LocalizedDescription.Nickname8=Spitznamen-Regeln für Generation 8. -LocalizedDescription.Nickname8a=Spitznamen-Regeln für Generation 8a. -LocalizedDescription.Nickname8b=Spitznamen-Regeln für Generation 8b. +LocalizedDescription.Nickname8a=Spitznamen-Regeln für Generation 8a (Arceus). +LocalizedDescription.Nickname8b=Spitznamen-Regeln für Generation 8b (SDLP). LocalizedDescription.Nickname9=Spitznamen-Regeln für Generation 9. -LocalizedDescription.Nickname9a=Spitznamen-Regeln für Generation 9a. +LocalizedDescription.Nickname9a=Spitznamen-Regeln für Generation 9a (Z-A). LocalizedDescription.NicknamedAnotherSpecies=Kennzeichnet in der Legalitäts Analyse, wenn das Pokémon einen Spitznamen hat, der der Spezies eines anderen Pokémon entspricht. LocalizedDescription.NicknamedMysteryGift=Kennzeichnet in der Legalitäts Analyse, wenn es sich um ein Geschenk mit Spitznamen handelt, welches der Spieler nicht umbenennen kann. LocalizedDescription.NicknamedTrade=Kennzeichnet in der Legalitäts Analyse, wenn es sich um ein ertauschtes Pokémon mit Spitznamen handelt, welches der Spieler nicht umbenennen kann. @@ -489,7 +490,7 @@ Main.L_LanguageHT=Sprache: Main.L_MetTimeOfDay=Tageszeit: Main.L_Mood7b=Laune: Main.L_NSparkle=Ns Glanz: -Main.L_ObedienceLevel=Gehorsamkeits Level: +Main.L_ObedienceLevel=Gehorsams-Level: Main.L_PokeStarFame=Ruhm: Main.L_ReadOnlyOther=Dieser Tab ist nur lesbar. Main.L_SaveSlot=Speicher-Slot: @@ -901,7 +902,7 @@ PokeSizeDetailed.XXL=XXL PokeSizeDetailed.XXS=XXS PokeSizeDetailed.XXXL=XXXL PokeSizeDetailed.XXXS=XXXS -QR.B_Refresh=Refresh +QR.B_Refresh=Neu laden RibbonEditor.B_All=Alle RibbonEditor.B_Cancel=Abbrechen RibbonEditor.B_None=Alle entfernen @@ -1065,7 +1066,7 @@ SAV_Chatter.B_Save=Speichern SAV_Chatter.CHK_Initialized=Initialisiert SAV_Chatter.L_Confusion=Verwirrung %: SAV_Database.B_Add=Hinzuf. -SAV_Database.B_Reset=Filter zurücksetzen +SAV_Database.B_Reset=Filter zurücks. SAV_Database.B_Search=Suchen! SAV_Database.CHK_IsEgg=Ei SAV_Database.CHK_Shiny=Schillernd @@ -1177,7 +1178,7 @@ SAV_DonutGenerator9a.L_RangeSeparator=to SAV_Encounters.B_Add=Hinzuf. SAV_Encounters.B_CriteriaFromTabs=Vom Editor SAV_Encounters.B_CriteriaReset=Zurücksetzen -SAV_Encounters.B_Reset=Filter zurücksetzen +SAV_Encounters.B_Reset=Filter zurücks. SAV_Encounters.B_Search=Suchen! SAV_Encounters.CHK_IsEgg=Ei SAV_Encounters.CHK_Shiny=Schillernd @@ -1206,9 +1207,9 @@ SAV_EventFlags.GB_FlagStatus=Status SAV_EventFlags.GB_Research=Untersuchen SAV_EventFlags.GB_Researcher=Flag Vergleich SAV_EventFlags.L_EventFlagWarn=Wandelhöhlen Event-Flags könnten andere Story Events beeinflussen. Backups sind empfohlen. -SAV_EventFlags.L_IsSet=Set: +SAV_EventFlags.L_IsSet=Aktiviert: SAV_EventFlags.L_Stats=Konstante: -SAV_EventFlags.L_UnSet=Unset: +SAV_EventFlags.L_UnSet=Deaktiv.: SAV_EventWork.B_ApplyFlag=Anwenden SAV_EventWork.B_ApplyWork=Anwenden SAV_EventWork.B_Cancel=Abbrechen @@ -1457,7 +1458,7 @@ SAV_Misc3.L_BerryPowder=Beerenpuder: SAV_Misc3.L_BHigh=Höchstpunk.: SAV_Misc3.L_BP=GP: SAV_Misc3.L_BPEarned=Gewonnene GP: -SAV_Misc3.L_Caption=Caption: +SAV_Misc3.L_Caption=Beschriftung: SAV_Misc3.L_Championships=Meisterschaften: SAV_Misc3.L_Coins=Münzen: SAV_Misc3.L_Continue=Fortsetzen @@ -1486,9 +1487,9 @@ SAV_Misc3.RB_Stats3_02=Offen SAV_Misc3.TAB_BF=Kampfzone SAV_Misc3.Tab_Decorations=Dekorationen SAV_Misc3.TAB_Ferry=Fähre -SAV_Misc3.TAB_Joyful=Spielhalle +SAV_Misc3.TAB_Joyful=Minispiele SAV_Misc3.TAB_Main=Verschiedenes -SAV_Misc3.Tab_Paintings=Paintings +SAV_Misc3.Tab_Paintings=Gemälde SAV_Misc3.Tab_Pokeblocks=Pokériegel SAV_Misc3.Tab_Records=Statistik SAV_Misc3.TB_Chair=Stuhl @@ -1518,8 +1519,8 @@ SAV_Misc4.B_GiveAllNoTrainers=Alle Nicht-Trainer erhalten SAV_Misc4.B_PoffinAll=Alle erhalten SAV_Misc4.B_PoffinDel=Alle löschen SAV_Misc4.B_Save=Speichern -SAV_Misc4.BTN_PrintArcade=Arkade -SAV_Misc4.BTN_PrintCastle=Kampfschloss +SAV_Misc4.BTN_PrintArcade=Arkaden +SAV_Misc4.BTN_PrintCastle=Palais SAV_Misc4.BTN_PrintFactory=Fabrik SAV_Misc4.BTN_PrintHall=Saal SAV_Misc4.BTN_PrintTower=Turm @@ -1599,7 +1600,7 @@ SAV_Misc5.GB_Multi=Multi SAV_Misc5.GB_PassPowers=Transferkraft SAV_Misc5.GB_Roamer=Wanderer SAV_Misc5.GB_Singles=Einzel -SAV_Misc5.GB_SubwayChecks=Subway Flags +SAV_Misc5.GB_SubwayChecks=Metro-Flags SAV_Misc5.GB_SubwaySets=Serie aktiv? SAV_Misc5.GB_SuperDoubles=Super Doppel SAV_Misc5.GB_SuperMulti=Super Multi @@ -1613,14 +1614,14 @@ SAV_Misc5.L_DoubleRecord=Rekord SAV_Misc5.L_EntreeBlack=S SAV_Misc5.L_EntreeWhite=W SAV_Misc5.L_FC=Daten aus einem weißen Spielstand extrahieren und in einen schwarzen importieren (oder umgekehrt). So kannst du sowohl die Stadt als auch den Wald in einem einzigen Spielstand haben! -SAV_Misc5.L_FMBestScore=Wertung +SAV_Misc5.L_FMBestScore=Rekord SAV_Misc5.L_FMBestTotal=Gesamtpunkte SAV_Misc5.L_FMCompleted=Abgeschlossen SAV_Misc5.L_FMHosted=Gehosted SAV_Misc5.L_FMLocked=Geschlossen -SAV_Misc5.L_FMParticipants=Meiste Teilnehmer -SAV_Misc5.L_FMParticipated=Teilnehmer -SAV_Misc5.L_FMTopScore=Höchstpunktz. +SAV_Misc5.L_FMParticipants=Höchstteilnehmerz. +SAV_Misc5.L_FMParticipated=Teilnahmen +SAV_Misc5.L_FMTopScore=Höchstpunktzahl SAV_Misc5.L_FMUnlocked=Freigeschaltet SAV_Misc5.L_Form=Form: SAV_Misc5.L_Move=Attacke: @@ -1654,9 +1655,9 @@ SAV_Misc5.L_SSingleRecord=Rekord SAV_Misc5.L_SuperSets=Super SAV_Misc5.TAB_BWCityForest=WeißerWald/SchwarzeStadt SAV_Misc5.TAB_Entralink=Kontaktebene -SAV_Misc5.TAB_Forest=Wald +SAV_Misc5.TAB_Forest=Hain SAV_Misc5.TAB_Main=Verschiedenes -SAV_Misc5.TAB_Medals=Medals +SAV_Misc5.TAB_Medals=Medaillen SAV_Misc5.TAB_Muscial=Musical SAV_Misc5.TAB_Subway=Metro SAV_Misc8b.B_Arceus=Arceus Event freischalten @@ -1673,7 +1674,7 @@ SAV_Misc8b.B_Spiritomb=Alle Untergrund NPCs grüßen (Kryppuk) SAV_Misc8b.B_Zones=Alle Zonen freischalten SAV_Misc8b.TAB_Main=Main SAV_MysteryGiftDB.B_Add=Hinzuf. -SAV_MysteryGiftDB.B_Reset=Filter zurücksetzen +SAV_MysteryGiftDB.B_Reset=Filter zurücks. SAV_MysteryGiftDB.B_Search=Suchen! SAV_MysteryGiftDB.CHK_IsEgg=Ei SAV_MysteryGiftDB.CHK_Shiny=Schillernd @@ -2364,7 +2365,7 @@ SAV_Trainer7.GB_Stats=Statistik SAV_Trainer7.GB_Surf=Surfer Wertung SAV_Trainer7.GB_UnlockSupers=Super* freigeschaltet SAV_Trainer7.L_3DSReg=3DS Region: -SAV_Trainer7.L_AlolaTime=Zeitunterschied: +SAV_Trainer7.L_AlolaTime=Zeit-Diff.: SAV_Trainer7.L_BallThrowType=Trainer-Stil: SAV_Trainer7.L_BP=GP: SAV_Trainer7.L_CameraVersion=Kamera Version: @@ -2375,7 +2376,7 @@ SAV_Trainer7.L_CStreak2=Aktuelle Multi Serie: SAV_Trainer7.L_CurrentMap=Aktuelle Karte: SAV_Trainer7.L_DaysFromRefreshed=Tage seit Aktualisierung: SAV_Trainer7.L_Fame=Ruhmeshalle: -SAV_Trainer7.L_FC=Festa Münzen: +SAV_Trainer7.L_FC=Festival-Münzen: SAV_Trainer7.L_Hours=Std: SAV_Trainer7.L_Language=Sprache: SAV_Trainer7.L_LastSaved=Zuletzt gespei.: @@ -2390,7 +2391,7 @@ SAV_Trainer7.L_R=Rotation: SAV_Trainer7.L_Region=Unterregion: SAV_Trainer7.L_Regular=Regulär SAV_Trainer7.L_RotomAffection=Zutrauen: -SAV_Trainer7.L_RotomOT=Rotom-OT-Name: +SAV_Trainer7.L_RotomOT=OT-Spitzname: SAV_Trainer7.L_Seconds=Sek: SAV_Trainer7.L_SkinColor=Hautfarbe: SAV_Trainer7.L_SnapCount=Snap Anzahl: diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index 26043041b..b73e61080 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -314,12 +314,12 @@ LocalizedDescription.Nickname4=Nickname rules for Generation 4. LocalizedDescription.Nickname5=Nickname rules for Generation 5. LocalizedDescription.Nickname6=Nickname rules for Generation 6. LocalizedDescription.Nickname7=Nickname rules for Generation 7. -LocalizedDescription.Nickname7b=Nickname rules for Generation 7b. +LocalizedDescription.Nickname7b=Nickname rules for Generation 7b (Let's Go). LocalizedDescription.Nickname8=Nickname rules for Generation 8. -LocalizedDescription.Nickname8a=Nickname rules for Generation 8a. -LocalizedDescription.Nickname8b=Nickname rules for Generation 8b. +LocalizedDescription.Nickname8a=Nickname rules for Generation 8a (Arceus). +LocalizedDescription.Nickname8b=Nickname rules for Generation 8b (BDSP). LocalizedDescription.Nickname9=Nickname rules for Generation 9. -LocalizedDescription.Nickname9a=Nickname rules for Generation 9a. +LocalizedDescription.Nickname9a=Nickname rules for Generation 9a (Z-A). LocalizedDescription.NicknamedAnotherSpecies=Severity to flag a Legality Check if Pokémon has a Nickname matching another Species. LocalizedDescription.NicknamedMysteryGift=Severity to flag a Legality Check if it is a nicknamed Mystery Gift the player cannot normally nickname. LocalizedDescription.NicknamedTrade=Severity to flag a Legality Check if it is a nicknamed In-Game Trade the player cannot normally nickname. @@ -1487,7 +1487,7 @@ SAV_Misc3.RB_Stats3_02=Open SAV_Misc3.TAB_BF=Battle Frontier SAV_Misc3.Tab_Decorations=Decorations SAV_Misc3.TAB_Ferry=Ferry -SAV_Misc3.TAB_Joyful=Joyful +SAV_Misc3.TAB_Joyful=Minigames SAV_Misc3.TAB_Main=Main SAV_Misc3.Tab_Paintings=Paintings SAV_Misc3.Tab_Pokeblocks=Pokéblocks @@ -2376,7 +2376,7 @@ SAV_Trainer7.L_CStreak2=Current Streak Multi: SAV_Trainer7.L_CurrentMap=Current Map: SAV_Trainer7.L_DaysFromRefreshed=Days from Refreshed: SAV_Trainer7.L_Fame=HoF Entered: -SAV_Trainer7.L_FC=Festa Coins: +SAV_Trainer7.L_FC=Festival Coins: SAV_Trainer7.L_Hours=Hrs: SAV_Trainer7.L_Language=Language: SAV_Trainer7.L_LastSaved=Last Saved: @@ -2391,7 +2391,7 @@ SAV_Trainer7.L_R=Rotation: SAV_Trainer7.L_Region=Sub Region: SAV_Trainer7.L_Regular=Regular SAV_Trainer7.L_RotomAffection=Affection: -SAV_Trainer7.L_RotomOT=Rotom OT Name: +SAV_Trainer7.L_RotomOT=OT Nickname: SAV_Trainer7.L_Seconds=Sec: SAV_Trainer7.L_SkinColor=Skin Color: SAV_Trainer7.L_SnapCount=Snap Count: diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index 5aa74346e..abb3da5cd 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -7,7 +7,7 @@ KChart=KChart Main=PKHeX MemoryAmie=Editor de Recuerdos / Poké Recreo MoveShopEditor=Editor de la Tienda de Movimientos -QR=Código QR de PKHeX (Haz clic en el QR para copiar la imagen) +QR=Código QR de PKHeX (Haz clic para copiar) RibbonEditor=Editor de Cintas SAV_Apricorn=Editor de Bonguri SAV_BattlePass=Editor de pases de combate @@ -81,7 +81,7 @@ SAV_Trainer8=Editor de datos del Entrenador SAV_Trainer8a=Editor de datos del Entrenador SAV_Trainer8b=Editor de datos del Entrenador SAV_Trainer9=Editor de datos del Entrenador -SAV_Trainer9a=Trainer Data Editor +SAV_Trainer9a=Editor de datos del Entrenador SAV_Underground=Editor del Subsuelo SAV_Underground8b=Editor de Objetos del Subsuelo SAV_UnityTower=Editor de la Torre Unión @@ -270,6 +270,7 @@ LocalizedDescription.DatabasePath=Ruta a la carpeta de la base de datos PKM. LocalizedDescription.DefaultBoxExportNamer=Nombre seleccionado para los archivos referentes a las exportaciones de cajas, si hubiese varios. LocalizedDescription.DisableScalingDpi=Desactiva el escalado de la GUI basado en los DPI al arrancar el programa, se usa el escalado de la fuente. LocalizedDescription.DisableWordFilterPastGen=Desactiva el filtro de palabras en formatos anteriors a la era 3DS. +LocalizedDescription.DragStartThreshold=Umbral de distancia mínima que el movimiento del mouse debe superar antes de que se inicie una operación de arrastre desde una casilla. LocalizedDescription.EggRandomAnyType3=Permitir que los huevos criados de Generación 3 tengan cualquier tipo de PID/IV asumiendo que fueron abusados ​​​​por RNG para ser colisiones en lugar de pirateados. LocalizedDescription.EggRandomAnyType4=Permitir que los huevos criados por la Generación 4 tengan cualquier tipo de PID/IV asumiendo que fueron abusados ​​​​por RNG para ser colisiones en lugar de pirateados. LocalizedDescription.Export=Configuración para mostrar detalles al exportar una ranura. @@ -313,12 +314,12 @@ LocalizedDescription.Nickname4=Normas de apodos en 4 generación. LocalizedDescription.Nickname5=Normas de apodos en 5 generación. LocalizedDescription.Nickname6=Normas de apodos en 6 generación. LocalizedDescription.Nickname7=Normas de apodos en 7 generación. -LocalizedDescription.Nickname7b=Normas de apodos en 7b generación. +LocalizedDescription.Nickname7b=Normas de apodos en 7b generación (Let's Go). LocalizedDescription.Nickname8=Normas de apodos en 8 generación. -LocalizedDescription.Nickname8a=Normas de apodos en 8a generación. -LocalizedDescription.Nickname8b=Normas de apodos en 8b generación. +LocalizedDescription.Nickname8a=Normas de apodos en 8a generación (Arceus). +LocalizedDescription.Nickname8b=Normas de apodos en 8b generación (DBPR). LocalizedDescription.Nickname9=Normas de apodos en 9 generación. -LocalizedDescription.Nickname9a=Normas de apodos en 9a generación. +LocalizedDescription.Nickname9a=Normas de apodos en 9a generación (Z-A). LocalizedDescription.NicknamedAnotherSpecies=En la comprobación de legalidad, marcar Severidad si se detecta que un Pokémon tiene un apodo que coincide con otra especie. LocalizedDescription.NicknamedMysteryGift=En la comprobación de legalidad, marcar Severidad si se detecta que se trata de un regalo misterioso apodado que el jugador normalmente no puede apodar. LocalizedDescription.NicknamedTrade=En la comprobación de legalidad, marcar Severidad si se detecta que se trata de un intercambio dentro del juego que el jugador normalmente no puede apodar. @@ -474,7 +475,7 @@ Main.L_ArrivedDateTime=Adquirido por el entrenador actual en... Main.L_BattleVersion=Versión de Batalla: Main.L_CatchRate=Ratio de captura: Main.L_CP=PC: -Main.L_CurrentHandler=Entren. actual: +Main.L_CurrentHandler=Entrenador actual: Main.L_DaycareSeed=Semilla Main.L_DC1=1: Main.L_DC2=2: @@ -491,7 +492,7 @@ Main.L_Mood7b=Humor: Main.L_NSparkle=Brillo de N Main.L_ObedienceLevel=Niv. Obediencia: Main.L_PokeStarFame=Fama: -Main.L_ReadOnlyOther=Sólo lectura. +Main.L_ReadOnlyOther=Esta pestaña es de solo lectura. Main.L_SaveSlot=Ranura de guardado: Main.L_Scale=Escala: Main.L_ShadowID=ID Oscuro: @@ -648,11 +649,11 @@ Main.Tab_Cosmetic=Cosmética Main.Tab_Main=Inicio Main.Tab_Met=Encuentro Main.Tab_Moves=Movimiento -Main.Tab_Other=Otros +Main.Tab_Other=Otro Main.Tab_OTMisc=EO/Misc Main.Tab_PartyBattle=Equipo Main.Tab_SAV=SAV -Main.Tab_Stats=Estad. +Main.Tab_Stats=Estadísticas MemoryAmie.B_ClearAll=Limpiar todo MemoryAmie.BTN_Cancel=Cancelar MemoryAmie.BTN_Save=Guardar @@ -673,7 +674,7 @@ MemoryAmie.L_Geo1=Anterior 1: MemoryAmie.L_Geo2=Anterior 2: MemoryAmie.L_Geo3=Anterior 3: MemoryAmie.L_Geo4=Anterior 4: -MemoryAmie.L_Handler=Entren. actual: +MemoryAmie.L_Handler=Entrenador actual: MemoryAmie.L_OT_Affection=Afecto: MemoryAmie.L_OT_Feeling=Sentimiento: MemoryAmie.L_OT_Friendship=Amistad: @@ -1065,7 +1066,7 @@ SAV_Chatter.B_Save=Guardar SAV_Chatter.CHK_Initialized=Inicializado SAV_Chatter.L_Confusion=% confusión: SAV_Database.B_Add=Añadir -SAV_Database.B_Reset=Borrar filtros +SAV_Database.B_Reset=Reiniciar filtros SAV_Database.B_Search=¡Buscar! SAV_Database.CHK_IsEgg=Huevo SAV_Database.CHK_Shiny=Brillante @@ -1483,10 +1484,10 @@ SAV_Misc3.label4=Salto Pokémon SAV_Misc3.label5=A por bayas SAV_Misc3.RB_Stats3_01=Nv. 50 SAV_Misc3.RB_Stats3_02=Abierto -SAV_Misc3.TAB_BF=Frente Batalla +SAV_Misc3.TAB_BF=Batalla Frontera SAV_Misc3.Tab_Decorations=Adornos SAV_Misc3.TAB_Ferry=Ferry -SAV_Misc3.TAB_Joyful=Alegre +SAV_Misc3.TAB_Joyful=Minijuegos SAV_Misc3.TAB_Main=Inicio SAV_Misc3.Tab_Paintings=Pinturas SAV_Misc3.Tab_Pokeblocks=Pokécubos @@ -1589,7 +1590,7 @@ SAV_Misc5.CHK_SuperDouble=Super Dobles? SAV_Misc5.CHK_SuperMulti=Super Multi? SAV_Misc5.CHK_SuperSingle=Super Indiv.? SAV_Misc5.CHK_SWNPCMet=PNJ visto -SAV_Misc5.GB_CurrentData=Datos del progreso actual +SAV_Misc5.GB_CurrentData=Datos actuales SAV_Misc5.GB_Doubles=Dobles SAV_Misc5.GB_EntreeLevel=Nivel de Nexárbol SAV_Misc5.GB_FlyDest=Destino de vuelo @@ -1599,7 +1600,7 @@ SAV_Misc5.GB_Multi=Multi SAV_Misc5.GB_PassPowers=Poderes Regalo SAV_Misc5.GB_Roamer=Errante SAV_Misc5.GB_Singles=Indiv. -SAV_Misc5.GB_SubwayChecks=Marcas Metro +SAV_Misc5.GB_SubwayChecks=Marcas Subterráneo SAV_Misc5.GB_SubwaySets=Está activa la partida? SAV_Misc5.GB_SuperDoubles=Super Dobles SAV_Misc5.GB_SuperMulti=Super Multi @@ -1613,14 +1614,14 @@ SAV_Misc5.L_DoubleRecord=Récord SAV_Misc5.L_EntreeBlack=N SAV_Misc5.L_EntreeWhite=B SAV_Misc5.L_FC=Exporta datos de una partida del Blanco e impórtalos en una partida del Negro y viceversa, así podrás tener tanto la Ciudad como el Bosque en una sola partida! -SAV_Misc5.L_FMBestScore=Puntuación -SAV_Misc5.L_FMBestTotal=Total de mejores récords -SAV_Misc5.L_FMCompleted=Completado -SAV_Misc5.L_FMHosted=Hospedado +SAV_Misc5.L_FMBestScore=Récord +SAV_Misc5.L_FMBestTotal=Total mejores pts +SAV_Misc5.L_FMCompleted=Completadas +SAV_Misc5.L_FMHosted=Iniciadas SAV_Misc5.L_FMLocked=Bloqueado -SAV_Misc5.L_FMParticipants=Máximo particip. -SAV_Misc5.L_FMParticipated=Participados -SAV_Misc5.L_FMTopScore=Puntuación tope +SAV_Misc5.L_FMParticipants=Máximos particip. +SAV_Misc5.L_FMParticipated=Participado en +SAV_Misc5.L_FMTopScore=Máx. Puntos SAV_Misc5.L_FMUnlocked=Desbloqueado SAV_Misc5.L_Form=Forma: SAV_Misc5.L_Move=Movimiento: @@ -1658,22 +1659,22 @@ SAV_Misc5.TAB_Forest=Bosque SAV_Misc5.TAB_Main=Inicio SAV_Misc5.TAB_Medals=Medallas SAV_Misc5.TAB_Muscial=Musical -SAV_Misc5.TAB_Subway=Metro -SAV_Misc8b.B_Arceus=Desbloq. evento de Arceus +SAV_Misc5.TAB_Subway=Subterráneo +SAV_Misc8b.B_Arceus=Desbloquear evento de Arceus SAV_Misc8b.B_Cancel=Cancelar -SAV_Misc8b.B_Darkrai=Desbloq. evento de Darkrai -SAV_Misc8b.B_DefeatEyecatch=Derrotar todos los Entren. +SAV_Misc8b.B_Darkrai=Desbloquear evento de Darkrai +SAV_Misc8b.B_DefeatEyecatch=Derrotar a todos los Entrenadores Eyecatch SAV_Misc8b.B_DialgaPalkia=Reiniciar encuent. Dialga/Palkia SAV_Misc8b.B_Fashion=Dar todos los objetos de moda -SAV_Misc8b.B_RebattleEyecatch=Combatir con todos los Entren. +SAV_Misc8b.B_RebattleEyecatch=Luchar de nuevo con todos los Entrenadores Eyecatch SAV_Misc8b.B_Roamer=Reiniciar Errantes SAV_Misc8b.B_Save=Guardar -SAV_Misc8b.B_Shaymin=Desbloq. evento de Shaymin +SAV_Misc8b.B_Shaymin=Desbloquear evento de Shaymin SAV_Misc8b.B_Spiritomb=Saludar todos los PNJs Subsuelo (Spiritomb) -SAV_Misc8b.B_Zones=Desbloq. todas las zonas +SAV_Misc8b.B_Zones=Desbloquear todas las zonas SAV_Misc8b.TAB_Main=Inicio SAV_MysteryGiftDB.B_Add=Añadir -SAV_MysteryGiftDB.B_Reset=Borrar filtros +SAV_MysteryGiftDB.B_Reset=Reiniciar filtros SAV_MysteryGiftDB.B_Search=¡Buscar! SAV_MysteryGiftDB.CHK_IsEgg=Huevo SAV_MysteryGiftDB.CHK_Shiny=Brillante @@ -2218,7 +2219,7 @@ SAV_SimpleTrainer.L_Seconds=Seg.: SAV_SimpleTrainer.L_SID=IDS: SAV_SimpleTrainer.L_Started=Inicio: SAV_SimpleTrainer.L_TID=ID: -SAV_SimpleTrainer.L_TrainerName=Nombre Entr.: +SAV_SimpleTrainer.L_TrainerName=Nombre: SAV_SimpleTrainer.L_X=Coord. X: SAV_SimpleTrainer.L_Y=Coord. Y: SAV_SimpleTrainer.L_Z=Coord. Z: @@ -2390,7 +2391,7 @@ SAV_Trainer7.L_R=Rotación: SAV_Trainer7.L_Region=Subregión: SAV_Trainer7.L_Regular=Regular SAV_Trainer7.L_RotomAffection=Afecto: -SAV_Trainer7.L_RotomOT=Nombre EO de Rotom: +SAV_Trainer7.L_RotomOT=Apodo de EO: SAV_Trainer7.L_Seconds=Seg.: SAV_Trainer7.L_SkinColor=Color de piel: SAV_Trainer7.L_SnapCount=Cuenta Snap: @@ -2412,7 +2413,7 @@ SAV_Trainer7.L_Z=Coord. Z: SAV_Trainer7.Label_SID=IDS: SAV_Trainer7.Label_TID=ID: SAV_Trainer7.Tab_BadgeMap=Mapa -SAV_Trainer7.Tab_BattleTree=Árbol de batalla +SAV_Trainer7.Tab_BattleTree=Árbol de Combate SAV_Trainer7.Tab_Misc=Misc. SAV_Trainer7.Tab_Overview=General SAV_Trainer7.Tab_Ultra=Ultra diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index 3976300c6..712838b7c 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -7,7 +7,7 @@ KChart=KChart Main=PKHeX MemoryAmie=Editor de Recuerdos / Poké Recreo MoveShopEditor=Editor de la Tienda de Movimientos -QR=Código QR de PKHeX (Haz clic en el QR para copiar la imagen) +QR=Código QR de PKHeX (Haz clic para copiar) RibbonEditor=Editor de Cintas SAV_Apricorn=Editor de Bonguri SAV_BattlePass=Editor de pases de combate @@ -81,7 +81,7 @@ SAV_Trainer8=Editor de datos del Entrenador SAV_Trainer8a=Editor de datos del Entrenador SAV_Trainer8b=Editor de datos del Entrenador SAV_Trainer9=Editor de datos del Entrenador -SAV_Trainer9a=Trainer Data Editor +SAV_Trainer9a=Editor de datos del Entrenador SAV_Underground=Editor del Subsuelo SAV_Underground8b=Editor de Objetos del Subsuelo SAV_UnityTower=Editor de la Torre Unión @@ -270,6 +270,7 @@ LocalizedDescription.DatabasePath=Ruta a la carpeta de la base de datos PKM. LocalizedDescription.DefaultBoxExportNamer=Nombre seleccionado para los archivos referentes a las exportaciones de cajas, si hubiese varios. LocalizedDescription.DisableScalingDpi=Desactiva el escalado de la GUI basado en los DPI al arrancar el programa, se usa el escalado de la fuente. LocalizedDescription.DisableWordFilterPastGen=Desactiva el filtro de palabras en formatos anteriors a la era 3DS. +LocalizedDescription.DragStartThreshold=Umbral de distancia mínima que el movimiento del ratón debe superar antes de que se inicie una operación de arrastre desde una casilla. LocalizedDescription.EggRandomAnyType3=Permitir que los huevos criados de Generación 3 tengan cualquier tipo de PID/IV asumiendo que fueron abusados ​​​​por RNG para ser colisiones en lugar de pirateados. LocalizedDescription.EggRandomAnyType4=Permitir que los huevos criados por la Generación 4 tengan cualquier tipo de PID/IV asumiendo que fueron abusados ​​​​por RNG para ser colisiones en lugar de pirateados. LocalizedDescription.Export=Configuración para mostrar detalles al exportar una ranura. @@ -307,18 +308,18 @@ LocalizedDescription.MarkBlue=Marca de color azul. LocalizedDescription.MarkPink=Marca de color rosa. LocalizedDescription.MGDatabasePath=Ruta a la carpeta de la Base de Datos de Regalos Misteriosos para almacenar plantillas de Regalos Misteriosos adicionales que aún no se reconocen. LocalizedDescription.ModifyUnset=Notificar cambios no hechos -LocalizedDescription.Nickname12=Normas de Emotes Generación 1 y 2. -LocalizedDescription.Nickname3=Normas de Emotes Generación 3. -LocalizedDescription.Nickname4=Normas de Emotes Generación 4. -LocalizedDescription.Nickname5=Normas de Emotes Generación 5. -LocalizedDescription.Nickname6=Normas de Emotes Generación 6. -LocalizedDescription.Nickname7=Normas de Emotes Generación 7. -LocalizedDescription.Nickname7b=Normas de Emotes Generación 7b. -LocalizedDescription.Nickname8=Normas de Emotes Generación 8. -LocalizedDescription.Nickname8a=Normas de Emotes Generación 8a. -LocalizedDescription.Nickname8b=Normas de Emotes Generación 8b. -LocalizedDescription.Nickname9=Normas de Emotes Generación 9. -LocalizedDescription.Nickname9a=Normas de Emotes Generación 9a. +LocalizedDescription.Nickname12=Normas de motes en 1 y 2 generación. +LocalizedDescription.Nickname3=Normas de motes en 3 generación. +LocalizedDescription.Nickname4=Normas de motes en 4 generación. +LocalizedDescription.Nickname5=Normas de motes en 5 generación. +LocalizedDescription.Nickname6=Normas de motes en 6 generación. +LocalizedDescription.Nickname7=Normas de motes en 7 generación. +LocalizedDescription.Nickname7b=Normas de motes en 7b generación (Let's Go). +LocalizedDescription.Nickname8=Normas de motes en 8 generación. +LocalizedDescription.Nickname8a=Normas de motes en 8a generación (Arceus). +LocalizedDescription.Nickname8b=Normas de motes en 8b generación (DBPR). +LocalizedDescription.Nickname9=Normas de motes en 9 generación. +LocalizedDescription.Nickname9a=Normas de motes en 9a generación (Z-A). LocalizedDescription.NicknamedAnotherSpecies=En la comprobación de legalidad, marcar Severidad si se detecta que un Pokémon tiene un mote que coincide con otra especie. LocalizedDescription.NicknamedMysteryGift=En la comprobación de legalidad, marcar Severidad si se detecta que se trata de un regalo misterioso apodado que el jugador normalmente no puede apodar. LocalizedDescription.NicknamedTrade=En la comprobación de legalidad, marcar Severidad si se detecta que se trata de un intercambio dentro del juego que el jugador normalmente no puede apodar. @@ -474,7 +475,7 @@ Main.L_ArrivedDateTime=Adquirido por el entrenador actual en... Main.L_BattleVersion=Versión de Batalla: Main.L_CatchRate=Ratio de captura: Main.L_CP=PC: -Main.L_CurrentHandler=Entren. actual: +Main.L_CurrentHandler=Entrenador actual: Main.L_DaycareSeed=Semilla Main.L_DC1=1: Main.L_DC2=2: @@ -491,7 +492,7 @@ Main.L_Mood7b=Humor: Main.L_NSparkle=Brillo de N Main.L_ObedienceLevel=Niv. Obediencia: Main.L_PokeStarFame=Fama: -Main.L_ReadOnlyOther=Sólo lectura. +Main.L_ReadOnlyOther=Esta pestaña es de solo lectura. Main.L_SaveSlot=Ranura de guardado: Main.L_Scale=Escala: Main.L_ShadowID=ID Oscuro: @@ -648,11 +649,11 @@ Main.Tab_Cosmetic=Cosmética Main.Tab_Main=Inicio Main.Tab_Met=Encuentro Main.Tab_Moves=Movimiento -Main.Tab_Other=Otros +Main.Tab_Other=Otro Main.Tab_OTMisc=EO/Varios Main.Tab_PartyBattle=Equipo Main.Tab_SAV=SAV -Main.Tab_Stats=Estad. +Main.Tab_Stats=Estadísticas MemoryAmie.B_ClearAll=Limpiar todo MemoryAmie.BTN_Cancel=Cancelar MemoryAmie.BTN_Save=Guardar @@ -673,7 +674,7 @@ MemoryAmie.L_Geo1=Anterior 1: MemoryAmie.L_Geo2=Anterior 2: MemoryAmie.L_Geo3=Anterior 3: MemoryAmie.L_Geo4=Anterior 4: -MemoryAmie.L_Handler=Entren. actual: +MemoryAmie.L_Handler=Entrenador actual: MemoryAmie.L_OT_Affection=Afecto: MemoryAmie.L_OT_Feeling=Sentimiento: MemoryAmie.L_OT_Friendship=Amistad: @@ -1065,7 +1066,7 @@ SAV_Chatter.B_Save=Guardar SAV_Chatter.CHK_Initialized=Inicializado SAV_Chatter.L_Confusion=% confusión: SAV_Database.B_Add=Añadir -SAV_Database.B_Reset=Borrar filtros +SAV_Database.B_Reset=Reiniciar filtros SAV_Database.B_Search=¡Buscar! SAV_Database.CHK_IsEgg=Huevo SAV_Database.CHK_Shiny=Variocolor @@ -1486,7 +1487,7 @@ SAV_Misc3.RB_Stats3_02=Abierto SAV_Misc3.TAB_BF=Frente Batalla SAV_Misc3.Tab_Decorations=Adornos SAV_Misc3.TAB_Ferry=Ferry -SAV_Misc3.TAB_Joyful=Alegre +SAV_Misc3.TAB_Joyful=Minijuegos SAV_Misc3.TAB_Main=Inicio SAV_Misc3.Tab_Paintings=Pinturas SAV_Misc3.Tab_Pokeblocks=Pokécubos @@ -1589,7 +1590,7 @@ SAV_Misc5.CHK_SuperDouble=Super Dobles? SAV_Misc5.CHK_SuperMulti=Super Multi? SAV_Misc5.CHK_SuperSingle=Super Indiv.? SAV_Misc5.CHK_SWNPCMet=PNJ visto -SAV_Misc5.GB_CurrentData=Datos de la partida actual +SAV_Misc5.GB_CurrentData=Datos actuales SAV_Misc5.GB_Doubles=Dobles SAV_Misc5.GB_EntreeLevel=Nivel de Nexárbol SAV_Misc5.GB_FlyDest=Destino de vuelo @@ -1613,14 +1614,14 @@ SAV_Misc5.L_DoubleRecord=Récord SAV_Misc5.L_EntreeBlack=N SAV_Misc5.L_EntreeWhite=B SAV_Misc5.L_FC=Exporta datos de una partida del Blanco e impórtalos en una partida del Negro y viceversa, así podrás tener tanto la Ciudad como el Bosque en una sola partida! -SAV_Misc5.L_FMBestScore=Puntuación -SAV_Misc5.L_FMBestTotal=Total de mejores récords -SAV_Misc5.L_FMCompleted=Completado -SAV_Misc5.L_FMHosted=Hospedado +SAV_Misc5.L_FMBestScore=Récord +SAV_Misc5.L_FMBestTotal=Total mejores pts +SAV_Misc5.L_FMCompleted=Completadas +SAV_Misc5.L_FMHosted=Iniciadas SAV_Misc5.L_FMLocked=Bloqueado -SAV_Misc5.L_FMParticipants=Máximo particip. -SAV_Misc5.L_FMParticipated=Participados -SAV_Misc5.L_FMTopScore=Puntuación tope +SAV_Misc5.L_FMParticipants=Máximos particip. +SAV_Misc5.L_FMParticipated=Participado en +SAV_Misc5.L_FMTopScore=Máx. Puntos SAV_Misc5.L_FMUnlocked=Desbloqueado SAV_Misc5.L_Form=Forma: SAV_Misc5.L_Move=Movimiento: @@ -1659,21 +1660,21 @@ SAV_Misc5.TAB_Main=Inicio SAV_Misc5.TAB_Medals=Medallas SAV_Misc5.TAB_Muscial=Musical SAV_Misc5.TAB_Subway=Metro -SAV_Misc8b.B_Arceus=Desbloq. evento de Arceus +SAV_Misc8b.B_Arceus=Desbloquear evento de Arceus SAV_Misc8b.B_Cancel=Cancelar -SAV_Misc8b.B_Darkrai=Desbloq. evento de Darkrai -SAV_Misc8b.B_DefeatEyecatch=Derrotar todos los Entren. +SAV_Misc8b.B_Darkrai=Desbloquear evento de Darkrai +SAV_Misc8b.B_DefeatEyecatch=Derrotar a todos los Entrenadores Eyecatch SAV_Misc8b.B_DialgaPalkia=Reiniciar encuent. Dialga/Palkia SAV_Misc8b.B_Fashion=Dar todos los objetos de moda -SAV_Misc8b.B_RebattleEyecatch=Combatir con todos los Entren. +SAV_Misc8b.B_RebattleEyecatch=Luchar de nuevo con todos los Entrenadores Eyecatch SAV_Misc8b.B_Roamer=Reiniciar Errantes SAV_Misc8b.B_Save=Guardar -SAV_Misc8b.B_Shaymin=Desbloq. evento de Shaymin +SAV_Misc8b.B_Shaymin=Desbloquear evento de Shaymin SAV_Misc8b.B_Spiritomb=Saludar todos los PNJs Subsuelo (Spiritomb) -SAV_Misc8b.B_Zones=Desbloq. todas las zonas +SAV_Misc8b.B_Zones=Desbloquear todas las zonas SAV_Misc8b.TAB_Main=Inicio SAV_MysteryGiftDB.B_Add=Añadir -SAV_MysteryGiftDB.B_Reset=Borrar filtros +SAV_MysteryGiftDB.B_Reset=Reiniciar filtros SAV_MysteryGiftDB.B_Search=¡Buscar! SAV_MysteryGiftDB.CHK_IsEgg=Huevo SAV_MysteryGiftDB.CHK_Shiny=Variocolor @@ -2218,7 +2219,7 @@ SAV_SimpleTrainer.L_Seconds=Seg.: SAV_SimpleTrainer.L_SID=IDS: SAV_SimpleTrainer.L_Started=Inicio: SAV_SimpleTrainer.L_TID=ID: -SAV_SimpleTrainer.L_TrainerName=Nombre Entr.: +SAV_SimpleTrainer.L_TrainerName=Nombre: SAV_SimpleTrainer.L_X=Coord. X: SAV_SimpleTrainer.L_Y=Coord. Y: SAV_SimpleTrainer.L_Z=Coord. Z: @@ -2390,7 +2391,7 @@ SAV_Trainer7.L_R=Rotación: SAV_Trainer7.L_Region=Subregión: SAV_Trainer7.L_Regular=Regular SAV_Trainer7.L_RotomAffection=Afecto: -SAV_Trainer7.L_RotomOT=Nombre EO de Rotom: +SAV_Trainer7.L_RotomOT=Mote de EO: SAV_Trainer7.L_Seconds=Seg.: SAV_Trainer7.L_SkinColor=Color de piel: SAV_Trainer7.L_SnapCount=Cuenta Snap: @@ -2412,7 +2413,7 @@ SAV_Trainer7.L_Z=Coord Z: SAV_Trainer7.Label_SID=IDS: SAV_Trainer7.Label_TID=ID: SAV_Trainer7.Tab_BadgeMap=Mapa -SAV_Trainer7.Tab_BattleTree=Árbol de batalla +SAV_Trainer7.Tab_BattleTree=Árbol de Combate SAV_Trainer7.Tab_Misc=Varios SAV_Trainer7.Tab_Overview=General SAV_Trainer7.Tab_Ultra=Ultra diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index 72e52f2c3..8f9a7dd4b 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -131,32 +131,32 @@ BattlePassType.Other3=Autre 3 BattlePassType.Rental=Location BoxExporter.B_Export=Exporter BoxExporter.L_Namer=Nommer : -EntitySearchSetup.B_Add=Add -EntitySearchSetup.B_Next=Next -EntitySearchSetup.B_Previous=Previous -EntitySearchSetup.B_Reset=Reset Filters -EntitySearchSetup.B_Search=Search! -EntitySearchSetup.CHK_IsEgg=Egg -EntitySearchSetup.CHK_Shiny=Shiny -EntitySearchSetup.L_ESV=ESV: -EntitySearchSetup.L_EVTraining=EV Training: -EntitySearchSetup.L_Format=Format: -EntitySearchSetup.L_Generation=Generation: -EntitySearchSetup.L_Move1=Move 1: -EntitySearchSetup.L_Move2=Move 2: -EntitySearchSetup.L_Move3=Move 3: -EntitySearchSetup.L_Move4=Move 4: -EntitySearchSetup.L_Potential=IV Potential: -EntitySearchSetup.L_Version=OT Version: -EntitySearchSetup.Label_Ability=Ability: -EntitySearchSetup.Label_CurLevel=Level: -EntitySearchSetup.Label_HeldItem=Held Item: -EntitySearchSetup.Label_HiddenPowerPrefix=Hidden Power: -EntitySearchSetup.Label_Nature=Nature: -EntitySearchSetup.Label_Nickname=Nickname: -EntitySearchSetup.Label_Species=Species: -EntitySearchSetup.Tab_Advanced=Advanced -EntitySearchSetup.Tab_General=General +EntitySearchSetup.B_Add=Ajouter +EntitySearchSetup.B_Next=Suivant +EntitySearchSetup.B_Previous=Précédent +EntitySearchSetup.B_Reset=Réinit. Filtres +EntitySearchSetup.B_Search=Rechercher ! +EntitySearchSetup.CHK_IsEgg=Œuf +EntitySearchSetup.CHK_Shiny=Chromatique +EntitySearchSetup.L_ESV=ESV : +EntitySearchSetup.L_EVTraining=Entraînement EV : +EntitySearchSetup.L_Format=Format : +EntitySearchSetup.L_Generation=Génération : +EntitySearchSetup.L_Move1=Capacité 1 : +EntitySearchSetup.L_Move2=Capacité 2 : +EntitySearchSetup.L_Move3=Capacité 3 : +EntitySearchSetup.L_Move4=Capacité 4 : +EntitySearchSetup.L_Potential=Potentiel IV : +EntitySearchSetup.L_Version=Version d'origine : +EntitySearchSetup.Label_Ability=Talent : +EntitySearchSetup.Label_CurLevel=Niveau : +EntitySearchSetup.Label_HeldItem=Objet tenu : +EntitySearchSetup.Label_HiddenPowerPrefix=Puissance Cachée : +EntitySearchSetup.Label_Nature=Nature : +EntitySearchSetup.Label_Nickname=Surnom : +EntitySearchSetup.Label_Species=Espèce : +EntitySearchSetup.Tab_Advanced=Avancé +EntitySearchSetup.Tab_General=Général ErrorWindow.B_Abort=Abandonner ErrorWindow.B_Continue=Continuer ErrorWindow.B_CopyToClipboard=Copier dans le presse-papiers @@ -270,6 +270,7 @@ LocalizedDescription.DatabasePath=Chemin vers le dossier de la Base de Données LocalizedDescription.DefaultBoxExportNamer=Sélectionne le nom de fichier à utiliser pour les exports de boîtes pour l'interface, si plusieurs options sont disponibles. LocalizedDescription.DisableScalingDpi=Désactive l'agrandissement de l'interface basé sur les points par pouce au démarrage du programme, utilisant à la place l'agrandissement de police. LocalizedDescription.DisableWordFilterPastGen=Désactive la vérification rétroactive du filtre de mots pour les formats plus anciens. +LocalizedDescription.DragStartThreshold=Distance minimale que le mouvement de la souris doit dépasser avant qu'une opération de glisser ne commence à partir d'un emplacement. LocalizedDescription.EggRandomAnyType3=Permet aux Œufs pondus de 3ème génération d'avoir n'importe quel type de PID/IV en assumant qu'ils ont été obtenus par abus de RNG pour être des collisions au lieu d'être hackés. LocalizedDescription.EggRandomAnyType4=Permet aux Œufs pondus de 4ème génération d'avoir n'importe quel type de PID/IV en assumant qu'ils ont été obtenus par abus de RNG pour être des collisions au lieu d'être hackés. LocalizedDescription.Export=Paramètres pour montrer les détails lors de l'exportation d'un emplacement. @@ -315,10 +316,10 @@ LocalizedDescription.Nickname6=Règles pour les surnoms en génération 6. LocalizedDescription.Nickname7=Règles pour les surnoms en génération 7. LocalizedDescription.Nickname7b=Règles pour les surnoms en génération 7b (Let's Go). LocalizedDescription.Nickname8=Règles pour les surnoms en génération 8. -LocalizedDescription.Nickname8a=Règles pour les surnoms en génération 8a (DEPS). -LocalizedDescription.Nickname8b=Règles pour les surnoms en génération 8b (Arceus). +LocalizedDescription.Nickname8a=Règles pour les surnoms en génération 8a (Arceus). +LocalizedDescription.Nickname8b=Règles pour les surnoms en génération 8b (DEPS). LocalizedDescription.Nickname9=Règles pour les surnoms en génération 9. -LocalizedDescription.Nickname9a=Règles pour les surnoms en génération 9a (ZA). +LocalizedDescription.Nickname9a=Règles pour les surnoms en génération 9a (Z-A). LocalizedDescription.NicknamedAnotherSpecies=Degré de sévérité pour signaler lors d'une Vérification de la Légalité si le Pokémon a un Surnom correspondant à celui d'une autre espèce. LocalizedDescription.NicknamedMysteryGift=Degré de sévérité pour signaler lors d'une Vérification de la Légalité si le Pokémon surnommé vient d'un Cadeau Mystère ne pouvant pas normalement être surnommé par le joueur. LocalizedDescription.NicknamedTrade=Degré de sévérité pour signaler lors d'une Vérification de la Légalité si le Pokémon surnommé vient d'un Échange Interne ne pouvant pas normalement être surnommé par le joueur. @@ -521,7 +522,7 @@ Main.Label_Cute=Grâce Main.Label_DEF=Défense : Main.Label_EggDate=Date : Main.Label_EggLocation=Lieu : -Main.Label_EncryptionConstant=Valeur de cryptage : +Main.Label_EncryptionConstant=Constante de chiff. : Main.Label_EVs=EVs Main.Label_EXP=Expérience : Main.Label_Form=Forme : @@ -648,7 +649,7 @@ Main.Tab_Cosmetic=Cosmétique Main.Tab_Main=Général Main.Tab_Met=Origine Main.Tab_Moves=Capacités -Main.Tab_Other=Autres +Main.Tab_Other=Autre Main.Tab_OTMisc=DO/Divers Main.Tab_PartyBattle=Équipe Main.Tab_SAV=SAV @@ -1177,7 +1178,7 @@ SAV_DonutGenerator9a.L_RangeSeparator=à SAV_Encounters.B_Add=Ajouter SAV_Encounters.B_CriteriaFromTabs=Depuis l'éditeur SAV_Encounters.B_CriteriaReset=Réinitialiser -SAV_Encounters.B_Reset=Réinitialiser les filtres +SAV_Encounters.B_Reset=Réinit. les filtres SAV_Encounters.B_Search=Rechercher ! SAV_Encounters.CHK_IsEgg=Œuf SAV_Encounters.CHK_Shiny=Chromatique @@ -1223,9 +1224,9 @@ SAV_EventWork.GB_Research=Rechercher SAV_EventWork.GB_Researcher=Chercher une différence de drapeaux SAV_EventWork.L_EventFlagWarn=Modifier les drapeaux peut avoir un impact sur d'autres évènements. Il est recommandé de faire une copie. SAV_EventWork.L_Stats=Valeur : -SAV_Fashion9.B_Cancel=Cancel -SAV_Fashion9.B_Save=Save -SAV_Fashion9.B_SetAllOwned=Set All Owned +SAV_Fashion9.B_Cancel=Annuler +SAV_Fashion9.B_Save=Sauvegarder +SAV_Fashion9.B_SetAllOwned=Tout débloquer SAV_FlagWork8b.B_ApplyFlag=Appliquer SAV_FlagWork8b.B_ApplyFlagSystem=Appliquer SAV_FlagWork8b.B_ApplyWork=Appliquer @@ -1294,7 +1295,7 @@ SAV_HallOfFame.L_Level=Niveau : SAV_HallOfFame.L_PartyNum=Index équipe : SAV_HallOfFame.L_Shiny=* : SAV_HallOfFame.L_Victory=Nbr. victoires : -SAV_HallOfFame.Label_EncryptionConstant=Valeur cryptage : +SAV_HallOfFame.Label_EncryptionConstant=Constante de chiff. : SAV_HallOfFame.Label_Form=Forme : SAV_HallOfFame.Label_HeldItem=Objet tenu : SAV_HallOfFame.Label_MetDate=Date : @@ -1333,7 +1334,7 @@ SAV_HallOfFame7.L_C4=PKMN 4 : SAV_HallOfFame7.L_C5=PKMN 5 : SAV_HallOfFame7.L_C6=PKMN 6 : SAV_HallOfFame7.L_Current=Actuel -SAV_HallOfFame7.L_EC=Val. crypt. base : +SAV_HallOfFame7.L_EC=Const. chiff. base : SAV_HallOfFame7.L_F1=PKMN 1 : SAV_HallOfFame7.L_F2=PKMN 2 : SAV_HallOfFame7.L_F3=PKMN 3 : @@ -1613,13 +1614,13 @@ SAV_Misc5.L_DoubleRecord=Record SAV_Misc5.L_EntreeBlack=N SAV_Misc5.L_EntreeWhite=B SAV_Misc5.L_FC=Vous pouvez importer des données d'une sauvegarde de Blanche et l'importer vers une sauvegarde de Noire et vice-versa, vous permettant d'avoir la Ville ou la Forêt dans une seule sauvegarde ! -SAV_Misc5.L_FMBestScore=Score perso +SAV_Misc5.L_FMBestScore=Record SAV_Misc5.L_FMBestTotal=Total meilleur score -SAV_Misc5.L_FMCompleted=Terminé -SAV_Misc5.L_FMHosted=Hébergé +SAV_Misc5.L_FMCompleted=Effectuées +SAV_Misc5.L_FMHosted=Organisées SAV_Misc5.L_FMLocked=Verrouillé -SAV_Misc5.L_FMParticipants=Record nbr. joueurs -SAV_Misc5.L_FMParticipated=Participé +SAV_Misc5.L_FMParticipants=Max. participants +SAV_Misc5.L_FMParticipated=Participations SAV_Misc5.L_FMTopScore=Meilleur score SAV_Misc5.L_FMUnlocked=Déverrouillé SAV_Misc5.L_Form=Forme : @@ -1673,7 +1674,7 @@ SAV_Misc8b.B_Spiritomb=Parler à tous les PNJs du Souterrain (Spiritomb) SAV_Misc8b.B_Zones=Déverrouiller toutes les zones SAV_Misc8b.TAB_Main=Principal SAV_MysteryGiftDB.B_Add=Ajouter -SAV_MysteryGiftDB.B_Reset=Réinitialiser les filtres +SAV_MysteryGiftDB.B_Reset=Réinit. les filtres SAV_MysteryGiftDB.B_Search=Rechercher ! SAV_MysteryGiftDB.CHK_IsEgg=Œuf SAV_MysteryGiftDB.CHK_Shiny=Chromatique @@ -1919,7 +1920,7 @@ SAV_PokedexLA.GB_Weight=Poids SAV_PokedexLA.L_ConnectHeight=- SAV_PokedexLA.L_ConnectWeight=- SAV_PokedexLA.L_DisplayedForm=Forme affichée : -SAV_PokedexLA.L_goto=Aller à : +SAV_PokedexLA.L_goto=Vers : SAV_PokedexLA.L_ResearchLevelReported=Rapporté : SAV_PokedexLA.L_ResearchLevelUnreported=Non rapporté : SAV_PokedexLA.L_TheoryHeight=- @@ -2170,7 +2171,7 @@ SAV_SecretBase.GB_Object=Disposition des objets SAV_SecretBase.L_ATK=ATQ SAV_SecretBase.L_Decoration=Décoration : SAV_SecretBase.L_DEF=DÉF -SAV_SecretBase.L_EncryptionConstant=Val. crypt. : +SAV_SecretBase.L_EncryptionConstant=Cst Chiff. : SAV_SecretBase.L_EVs=EVs SAV_SecretBase.L_Favorite=Favoris : SAV_SecretBase.L_FlagsCaptured=Drapeaux capturés : @@ -2375,7 +2376,7 @@ SAV_Trainer7.L_CStreak2=Série Actuelle Multi : SAV_Trainer7.L_CurrentMap=Carte actuelle : SAV_Trainer7.L_DaysFromRefreshed=Dern. Détente (j) : SAV_Trainer7.L_Fame=Panthéon : -SAV_Trainer7.L_FC=Festi-Pièces : +SAV_Trainer7.L_FC=Festipièces : SAV_Trainer7.L_Hours=Hrs : SAV_Trainer7.L_Language=Langue : SAV_Trainer7.L_LastSaved=Der. sauv. @@ -2390,7 +2391,7 @@ SAV_Trainer7.L_R=Rotation : SAV_Trainer7.L_Region=Sous-région : SAV_Trainer7.L_Regular=Normal SAV_Trainer7.L_RotomAffection=Affection : -SAV_Trainer7.L_RotomOT=Surnom Motisma : +SAV_Trainer7.L_RotomOT=Surnom DO : SAV_Trainer7.L_Seconds=Sec : SAV_Trainer7.L_SkinColor=Couleur de peau : SAV_Trainer7.L_SnapCount=Nb de photos prises : @@ -2473,10 +2474,10 @@ SAV_Trainer8.L_BP=PCo : SAV_Trainer8.L_CurrentMap=Carte actuelle : SAV_Trainer8.L_Doubles=Duo : SAV_Trainer8.L_Fame=Entrées au Panthéon : -SAV_Trainer8.L_Hours=Heures : +SAV_Trainer8.L_Hours=Hrs : SAV_Trainer8.L_Language=Langue : SAV_Trainer8.L_LastSaved=Der. sauv. -SAV_Trainer8.L_Minutes=Minutes : +SAV_Trainer8.L_Minutes=Min : SAV_Trainer8.L_Money=$ : SAV_Trainer8.L_Offset=(offset) SAV_Trainer8.L_R=Rotation : @@ -2513,7 +2514,7 @@ SAV_Trainer8a.GB_Map=Position carte SAV_Trainer8a.GB_Stats=Stats SAV_Trainer8a.L_CurrentMap=Carte actuelle : SAV_Trainer8a.L_GalaxyRank=Rang Galaxy : -SAV_Trainer8a.L_Hours=Heures : +SAV_Trainer8a.L_Hours=Hrs : SAV_Trainer8a.L_Language=Langue : SAV_Trainer8a.L_LastSaved=Der. sauv. SAV_Trainer8a.L_MeritCurrent=PBA actuels : diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index b51705f79..41c786289 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -38,11 +38,11 @@ SAV_HoneyTree=Editor Alberi di Miele SAV_Inventory=Editor Inventario SAV_Link6=Strumenti Link SAV_MailBox=Editor Messaggi -SAV_Misc2=Editor Vari +SAV_Misc2=Editor Varie SAV_Misc3=Editor Dati Allenatore -SAV_Misc4=Editor Vari -SAV_Misc5=Editor Vari -SAV_Misc8b=Editor vari +SAV_Misc4=Editor Varie +SAV_Misc5=Editor Varie +SAV_Misc8b=Editor Varie SAV_MysteryGiftDB=Database SAV_OPower=Editor Poteri-O SAV_Poffin8b=Editor Poffin @@ -72,7 +72,7 @@ SAV_SealStickers8b=Lista Bolli SAV_SecretBase=Editor Base Segreta SAV_SimplePokedex=Editor Pokedex SAV_SimpleTrainer=Editor Dati Allenatore -SAV_SuperTrain=Record Super Allenamento +SAV_SuperTrain=Record Super Allenamento Virtuale SAV_Trainer=Editor Dati Allenatore SAV_Trainer4BR=Editor Dati Allenatore SAV_Trainer7=Editor Dati Allenatore @@ -251,94 +251,95 @@ KChart.DGV_SpecName=Nome KChart.DGV_Sprite=Sprite KChart.DGV_Type1=Tipo1 KChart.DGV_Type2=Tipo2 -LocalizedDescription.AllowBoxDataDrop=Allow drag and drop of boxdata binary files from the GUI via the Box tab. +LocalizedDescription.AllowBoxDataDrop=Consente il trascinamento dei file binari boxdata dall'interfaccia grafica tramite la scheda Box. LocalizedDescription.AllowGen1Tradeback=GB:Consenti insieme di mosse tradeback da 2° Generazione. LocalizedDescription.AllowGuessRejuvenateHOME=Prova ad indovinare dati di incontro originali legali, quando questi non sono contenuti all'interno del file di origine. LocalizedDescription.AllowIncompatibleConversion=Consenti conversioni di file PKM via percorsi non possibili con metodi ufficiali. Le proprietà individuali verranno copiate in maniera sequenziale. LocalizedDescription.ApplyMarkings=Applica Segnalini durante l'importazione LocalizedDescription.ApplyNature=Applica la Natura delle Statistiche alla Natura durante l'importazine. LocalizedDescription.AutoLoadSaveOnStartup=Rileva automaticamente il tipo del Salvtaggio durante l'Avvio. -LocalizedDescription.BackupPath=Path to the backup folder for keeping save file backups. +LocalizedDescription.BackupPath=Percorso della cartella di backup per la conservazione dei salvataggi. LocalizedDescription.BAKEnabled=Backup automatico dei File di Salvataggio attivo. LocalizedDescription.BAKPrompt=Controlla se è stato chiesto all'utente di Creare un Backup. -LocalizedDescription.BoxExport=Settings to use for box exports. +LocalizedDescription.BoxExport=Impostazioni da utilizzare per l'esportazione dei Box. LocalizedDescription.CheckActiveHandler=Controlla i dati allenatore dall'ultimo salvataggio caricato per determinare se l'Ultimo Allenatore non corrisponde al valore aspettato. LocalizedDescription.CheckWordFilter=Controlla la volgarità di Soprannomi e Nomi Allenatore. Parole proibite saranno segnalate utilizzando gli elenchi di espressione del 3DS. LocalizedDescription.CurrentHandlerMismatch=Forza una segnalazione di legalità se l'Ultimo Allenatore non corrisponde al valore aspettato. -LocalizedDescription.DarkMode=Use the Dark color mode for the application on startup. -LocalizedDescription.DatabasePath=Path to the PKM Database folder. -LocalizedDescription.DefaultBoxExportNamer=Selected File namer to use for box exports for the GUI, if multiple are available. -LocalizedDescription.DisableScalingDpi=Disables the GUI scaling based on Dpi on program startup, falling back to font scaling. -LocalizedDescription.DisableWordFilterPastGen=Disables retroactive Word Filter checks for earlier formats. -LocalizedDescription.EggRandomAnyType3=Allow Generation 3 bred eggs to have any PID/IV type by assuming they were RNG abused to be collisions instead of hacked. -LocalizedDescription.EggRandomAnyType4=Allow Generation 4 bred eggs to have any PID/IV type by assuming they were RNG abused to be collisions instead of hacked. -LocalizedDescription.Export=Settings for showing details when exporting a slot. -LocalizedDescription.ExportLegalityAlwaysVerbose=Always displays the verbose legality report, and inverts the hotkey behavior to instead disable. -LocalizedDescription.ExportLegalityNeverClipboard=Always skips the prompt option asking if you would like to export a legality report to clipboard. -LocalizedDescription.ExportLegalityVerboseProperties=Display all properties of the encounter (auto-generated) when exporting a verbose report. -LocalizedDescription.ExtraProperties=Extra entity properties to try and show in addition to the default properties displayed. -LocalizedDescription.FilterMismatchGrayscale=Grayscale amount to apply to an entity that does not match a filter (0.0 = no grayscale, 1.0 = fully grayscale). -LocalizedDescription.FilterMismatchOpacity=Opacity of an entity that does not match a filter. +LocalizedDescription.DarkMode=Utilizza la modalità scura per l'applicazione all'avvio. +LocalizedDescription.DatabasePath=Percorso della cartella del Database PKM. +LocalizedDescription.DefaultBoxExportNamer=Seleziona il sistema di denominazione file da utilizzare per l'esportazione dei box dall'interfaccia, se ne sono disponibili diversi. +LocalizedDescription.DisableScalingDpi=Disabilita il ridimensionamento dell'interfaccia basato sui DPI all'avvio del programma, ripiegando sul ridimensionamento del carattere. +LocalizedDescription.DisableWordFilterPastGen=Disabilita i controlli retroattivi del Filtro Parole per i formati delle generazioni precedenti. +LocalizedDescription.DragStartThreshold=Soglia di distanza minima che il movimento del mouse deve superare prima che venga avviata un'operazione di trascinamento da uno slot. +LocalizedDescription.EggRandomAnyType3=Consente alle uova nate in Gen 3 di avere qualsiasi tipo di PID/IV, presumendo che siano state ottenute tramite manipolazione dell'RNG invece di essere alterate. +LocalizedDescription.EggRandomAnyType4=Consente alle uova nate in Gen 4 di avere qualsiasi tipo di PID/IV, presumendo che siano state ottenute tramite manipolazione dell'RNG invece di essere alterate. +LocalizedDescription.Export=Impostazioni per la visualizzazione dei dettagli durante l'esportazione di uno slot. +LocalizedDescription.ExportLegalityAlwaysVerbose=Mostra sempre il report di legalità dettagliato e inverte il comportamento del tasto di scelta rapida per disabilitarlo. +LocalizedDescription.ExportLegalityNeverClipboard=Salta sempre la richiesta che chiede se si desidera esportare un report di legalità negli appunti. +LocalizedDescription.ExportLegalityVerboseProperties=Visualizza tutte le proprietà dell'incontro (generate automaticamente) quando si esporta un report dettagliato. +LocalizedDescription.ExtraProperties=Proprietà extra dell'entità da mostrare in aggiunta alle proprietà predefinite visualizzate. +LocalizedDescription.FilterMismatchGrayscale=Livello di scala di grigi da applicare a un'entità che non corrisponde a un filtro (0.0 = nessuna scala di grigi, 1.0 = completamente in grigio). +LocalizedDescription.FilterMismatchOpacity=Opacità di un'entità che non corrisponde a un filtro. LocalizedDescription.FilterUnavailableSpecies=Nascondi specie non disponibili se il salvatggio caricato non è in grado di importarli. LocalizedDescription.FlagIllegal=Segnala Slot Illegali nel Salvataggio -LocalizedDescription.FocusBorderDeflate=Focus border indentation for custom drawn image controls. +LocalizedDescription.FocusBorderDeflate=Rientro del bordo di attivazione (focus) per i controlli immagine personalizzati. LocalizedDescription.ForceHaXOnLaunch=Forza l'avvio del programma in modalità HaX LocalizedDescription.Gen7TransferStarPID=Forza una segnalazione di Legalità se un Pokémon da Gen1/2 ha un PID Star Shiny. LocalizedDescription.Gen8MemoryMissingHT=Forza una segnalazione di Legalità se una Ricordo Gen8 è assente per l'Allenatore Attuale. -LocalizedDescription.HiddenPowerOnChangeMaxPower=Massimizza automaticamente gli IV quando si cambia il tipo di Introforza per assicurare il massimo punteggio di Potenza Base. Altrimenti, mantieni gli IV il più vicino possibile agli originali. -LocalizedDescription.HiddenProperties=Properties to hide from the report grid. -LocalizedDescription.HideEvent8Contains=Nascondi i nomi delle variabili evento che contengono una qualsiasi delle sottostringhe separate da virgole di seguito riportate. Rimuove i valori evento dall'Interfaccia di non interesse dell'utente. +LocalizedDescription.HiddenPowerOnChangeMaxPower=Massimizza gli IV al cambio tipo di Introforza per la massima Potenza Base. Altrimenti, li mantiene il più possibile vicini agli originali. +LocalizedDescription.HiddenProperties=Proprietà da nascondere dalla griglia del report. +LocalizedDescription.HideEvent8Contains=Nascondi le variabili evento contenenti le sottostringhe indicate (separate da virgola). Rimuove dall'interfaccia i valori non d'interesse. LocalizedDescription.HideSAVDetails=Nascondi i dettagli del File di Salvataggio dal Titolo del Programma. LocalizedDescription.HideSecretDetails=Nascondi i Dettagli Segreti dagli Editor. LocalizedDescription.HOMETransferTrackerNotPresent=Forza una segnalazione di legalità se il codice di Tracciamento di Pokémon Home è assente. -LocalizedDescription.Hover=Settings for showing details when hovering a slot. -LocalizedDescription.HoverSlotGlowEdges=Mostra l'evidenziatura del Pokémon al passaggio del Mouse -LocalizedDescription.HoverSlotPlayCry=Ascolta il verso del Pokémon al passaggio del Mouse -LocalizedDescription.HoverSlotShowEncounter=Show Encounter Info in on Hover -LocalizedDescription.HoverSlotShowEncounterVerbose=Show all Encounter Info properties on Hover -LocalizedDescription.HoverSlotShowLegalityHint=Show first Legality Check message if Illegal on Hover -LocalizedDescription.HoverSlotShowPreview=Show PKM Slot Preview on Hover -LocalizedDescription.HoverSlotShowText=Mostra la descrizione dello Slot Pokémon al passaggio del Mouse +LocalizedDescription.Hover=Impostazioni per la visualizzazione dei dettagli al passaggio del mouse su uno slot. +LocalizedDescription.HoverSlotGlowEdges=Mostra l'evidenziatura del Pokémon al passaggio del mouse. +LocalizedDescription.HoverSlotPlayCry=Ascolta il verso del Pokémon al passaggio del mouse. +LocalizedDescription.HoverSlotShowEncounter=Mostra le info dell'incontro al passaggio del mouse. +LocalizedDescription.HoverSlotShowEncounterVerbose=Mostra tutte le proprietà dell'incontro al passaggio del mouse. +LocalizedDescription.HoverSlotShowLegalityHint=Mostra il primo messaggio del controllo di legalità se non legale al passaggio del mouse. +LocalizedDescription.HoverSlotShowPreview=Mostra l'anteprima dello slot PKM al passaggio del mouse. +LocalizedDescription.HoverSlotShowText=Mostra la descrizione dello Slot Pokémon al passaggio del mouse. LocalizedDescription.IgnoreLegalPopup=Non mostrare avviso se il Pokémon è "Legale!" LocalizedDescription.InitialSortMode=Durante il caricamento del Database Pokémon, la lista verrà ordinata in base a questa opzione. -LocalizedDescription.InvalidSelection=Background color of a ComboBox when the selected item is not valid. -LocalizedDescription.Language=Language to use when exporting a battle template. If not specified in settings, will use current language. -LocalizedDescription.MarkBlue=Blue colored marking. -LocalizedDescription.MarkPink=Pink colored marking. -LocalizedDescription.MGDatabasePath=Path to the Mystery Gift Database folder for storing extra mystery gift templates that aren't yet recognized. -LocalizedDescription.ModifyUnset=Notifica modifiche non complete -LocalizedDescription.Nickname12=Nickname rules for Generation 1 and 2. -LocalizedDescription.Nickname3=Nickname rules for Generation 3. -LocalizedDescription.Nickname4=Nickname rules for Generation 4. -LocalizedDescription.Nickname5=Nickname rules for Generation 5. -LocalizedDescription.Nickname6=Nickname rules for Generation 6. -LocalizedDescription.Nickname7=Nickname rules for Generation 7. -LocalizedDescription.Nickname7b=Nickname rules for Generation 7b. -LocalizedDescription.Nickname8=Nickname rules for Generation 8. -LocalizedDescription.Nickname8a=Nickname rules for Generation 8a. -LocalizedDescription.Nickname8b=Nickname rules for Generation 8b. -LocalizedDescription.Nickname9=Nickname rules for Generation 9. -LocalizedDescription.Nickname9a=Nickname rules for Generation 9a. +LocalizedDescription.InvalidSelection=Colore di sfondo di una ComboBox quando l'elemento selezionato non è valido. +LocalizedDescription.Language=Lingua da utilizzare quando si esporta un template di lotta. Se non specificata nelle impostazioni, verrà utilizzata la lingua corrente. +LocalizedDescription.MarkBlue=Segno di colore blu. +LocalizedDescription.MarkPink=Segno di colore rosa. +LocalizedDescription.MGDatabasePath=Percorso della cartella del Database Doni Segreti per l'archiviazione di template extra non ancora riconosciuti. +LocalizedDescription.ModifyUnset=Notifica modifiche non complete. +LocalizedDescription.Nickname12=Regole per i soprannomi per la Gen 1 e 2. +LocalizedDescription.Nickname3=Regole per i soprannomi per la Gen 3. +LocalizedDescription.Nickname4=Regole per i soprannomi per la Gen 4. +LocalizedDescription.Nickname5=Regole per i soprannomi per la Gen 5. +LocalizedDescription.Nickname6=Regole per i soprannomi per la Gen 6. +LocalizedDescription.Nickname7=Regole per i soprannomi per la Gen 7. +LocalizedDescription.Nickname7b=Regole per i soprannomi per la Gen 7b (Let's Go). +LocalizedDescription.Nickname8=Regole per i soprannomi per la Gen 8. +LocalizedDescription.Nickname8a=Regole per i soprannomi per la Gen 8a (Arceus). +LocalizedDescription.Nickname8b=Regole per i soprannomi per la Gen 8b (DLPS). +LocalizedDescription.Nickname9=Regole per i soprannomi per la Gen 9. +LocalizedDescription.Nickname9a=Regole per i soprannomi per la Gen 9a (Z-A). LocalizedDescription.NicknamedAnotherSpecies=Forza una segnalazione di Legalità se un Pokémon ha un Soprannome che coincide con il nome di un'altra Specie. LocalizedDescription.NicknamedMysteryGift=Forza una segnalazione di Legalità se il Pokémon ha un Soprannome e proviene da un Dono Segreto. LocalizedDescription.NicknamedTrade=Forza una segnalazione di Legalità se il Pokémon proveniente da uno scambio ha un Soprannome che non potrebbe normalmente avere. LocalizedDescription.OtherBackupPaths=Lista di percorsi da controllare per cercare File di Salvataggio. LocalizedDescription.OtherSaveFileExtensions=Estensioni per i File di Salvataggio che il programma dovrebbe riconoscere (senza punto) -LocalizedDescription.OverrideGen1=Gen1: If unable to detect a language or version for a save file, use these instead. -LocalizedDescription.OverrideGen2=Gen2: If unable to detect a language or version for a save file, use these instead. -LocalizedDescription.OverrideGen3FRLG=Gen3 FR/LG: If unable to detect a language or version for a save file, use these instead. -LocalizedDescription.OverrideGen3RS=Gen3 R/S: If unable to detect a language or version for a save file, use these instead. -LocalizedDescription.PathBlockKeyList=Percorso che contiene i Dump dei blocchi dei nomi hash. Se il Dump di uno specifico elemento non esiste, solamente i nomi specificati nel codice del programma verranno caricati. -LocalizedDescription.PlaySoundLegalityCheck=AvviaSuoniPerControlliLegalità -LocalizedDescription.PlaySoundOther=Play Sound when performing any other action that would be reasonable to sound alert. -LocalizedDescription.PlaySoundSAVLoad=AvviaSuoniAlCaricamentoDelSAV -LocalizedDescription.PluginLoadEnable=Carica Plugins dlla cartella plugins, se esiste. -LocalizedDescription.PluginLoadMerged=Loads any plugins that were merged into the main executable file. -LocalizedDescription.PluginPath=Path to the plugins folder. -LocalizedDescription.PreviewCursorShift=Show a Glow effect around the PKM on Hover -LocalizedDescription.PreviewShowPaste=Show Showdown Paste in special Preview on Hover -LocalizedDescription.RecentlyLoadedMaxCount=Amount of recently loaded save files to remember. -LocalizedDescription.RetainMetDateTransfer45=Retain the Met Date when transferring from Generation 4 to Generation 5. +LocalizedDescription.OverrideGen1=Gen1: Se non è possibile rilevare la lingua o la versione di un salvataggio, usa queste al loro posto. +LocalizedDescription.OverrideGen2=Gen2: Se non è possibile rilevare la lingua o la versione di un salvataggio, usa queste al loro posto. +LocalizedDescription.OverrideGen3FRLG=Gen3 RF/VF: Se non è possibile rilevare la lingua o la versione di un salvataggio, usa queste al loro posto. +LocalizedDescription.OverrideGen3RS=Gen3 R/Z: Se non è possibile rilevare la lingua o la versione di un salvataggio, usa queste al loro posto. +LocalizedDescription.PathBlockKeyList=Percorso dei dump dei nomi hash. Se un dump manca, verranno caricati solo i nomi predefiniti specificati nel codice del programma. +LocalizedDescription.PlaySoundLegalityCheck=Riproduci suono all'apertura del report di legalità +LocalizedDescription.PlaySoundOther=Riproduce un suono quando si esegue qualsiasi altra azione per la quale sia opportuno un avviso sonoro. +LocalizedDescription.PlaySoundSAVLoad=Riproduci suono al caricamento di un nuovo file di salvataggio +LocalizedDescription.PluginLoadEnable=Carica i plugin dalla cartella "plugins", se esistente. +LocalizedDescription.PluginLoadMerged=Carica tutti i plugin che sono stati incorporati nel file eseguibile principale. +LocalizedDescription.PluginPath=Percorso della cartella dei plugin. +LocalizedDescription.PreviewCursorShift=Mostra un effetto bagliore attorno al PKM al passaggio del mouse. +LocalizedDescription.PreviewShowPaste=Mostra il formato Showdown Paste nell'anteprima speciale al passaggio del mouse. +LocalizedDescription.RecentlyLoadedMaxCount=Numero di file di salvataggio caricati recentemente da ricordare. +LocalizedDescription.RetainMetDateTransfer45=Mantieni la Data di Incontro durante il trasferimento dalla Gen 4 alla Gen 5. 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. @@ -349,10 +350,10 @@ LocalizedDescription.SearchExtraSaves=Cerca in OtherBackupPaths quando carica il LocalizedDescription.SearchExtraSavesDeep=Cerca nelle sottocartelle di OtherBackupPaths quando carica il contenuto per il Database Pokémon. LocalizedDescription.SetUpdateDex=Modifica Pokédex LocalizedDescription.SetUpdatePKM=Modifica info Pokémon -LocalizedDescription.SetUpdateRecords=Automatically increment the Save File's counters for obtained Pokémon (eggs/captures) when injecting a PKM. -LocalizedDescription.ShinyDefault=Shiny star when not using unicode characters. -LocalizedDescription.ShinySprites=Sprite Shiny -LocalizedDescription.ShinyUnicode=Shiny star when using unicode characters. +LocalizedDescription.SetUpdateRecords=Incrementa automaticamente i contatori del file di salvataggio per i Pokémon ottenuti (uova/catture) quando si inietta un PKM. +LocalizedDescription.ShinyDefault=Stella cromatica quando non si utilizzano i caratteri Unicode. +LocalizedDescription.ShinySprites=Sprite Cromatici +LocalizedDescription.ShinyUnicode=Stella cromatica quando si utilizzano i caratteri Unicode. LocalizedDescription.ShowChangelogOnUpdate=Mostra il Log di Modifiche quando una nuova versione del programma si avvia per la prima volta. LocalizedDescription.ShowEggSpriteAsHeldItem=Mostra l'Icona Uovo come Strumento Tenuto. LocalizedDescription.ShowEncounterBall=Mostra la Ball richiesta per un Modello di Incontro @@ -362,29 +363,29 @@ LocalizedDescription.ShowEncounterOpacityBackground=Opacità per lo sfondo del T LocalizedDescription.ShowEncounterOpacityStripe=Opacità per la barra del Tipo di Incontro. LocalizedDescription.ShowEncounterThicknessStripe=Spessore dei Pixel da mostrare per la barra del Tipo di Incontro. LocalizedDescription.ShowExperiencePercent=Mostra una piccola barra per indicare la percentuale di progresso di Aumento Livello -LocalizedDescription.ShowGenderGen1=When showing a Generation 1 format entity, show the gender it would have if transferred to other generations. +LocalizedDescription.ShowGenderGen1=Quando viene mostrata un'entità in formato Gen 1, mostra il sesso che avrebbe se venisse trasferita nelle altre generazioni. LocalizedDescription.ShowLegalBallsFirst= Quando viene mostrata la lista di Ball, mostra le Ball legali prima di quelle illegali, anziché andare per ordine di ID. -LocalizedDescription.ShowStatusCondition=When showing an entity, show any stored Status Condition (Sleep/Burn/etc) it may have. +LocalizedDescription.ShowStatusCondition=Quando viene mostrata un'entità, mostra ogni eventuale condizione di stato memorizzata (Sonno/Scottatura/ecc.). LocalizedDescription.ShowTeraOpacityBackground=Opacità del background Layer per il Teratipo. LocalizedDescription.ShowTeraOpacityStripe=Opacità dello stripe layer per il Teratipo. LocalizedDescription.ShowTeraThicknessStripe=Spessore dei pixel mostrati nella color stripe per il Teratipo. LocalizedDescription.ShowTeraType=>Mostra un background negli Slot PKM per differenziare il Teratipo. -LocalizedDescription.SkipSplashScreen=Skips displaying the splash screen on Program Launch. -LocalizedDescription.SlotLegalityAlwaysVisible=Skips the context menu hotkey requirement and instead always presents the option to check legality of a slot. -LocalizedDescription.SoundPath=Path to the sounds folder for sounds to play when hovering over a slot (species cry). +LocalizedDescription.SkipSplashScreen=Salta la visualizzazione della schermata di avvio all'apertura del programma. +LocalizedDescription.SlotLegalityAlwaysVisible=Ignora il requisito del tasto di scelta rapida nel menu contestuale e presenta sempre l'opzione per controllare la legalità di uno slot. +LocalizedDescription.SoundPath=Percorso della cartella dei suoni per la riproduzione del verso della specie al passaggio del mouse su uno slot. LocalizedDescription.SpritePreference=Quale modalità di costruzione sprite utilizzare -LocalizedDescription.StatsCustom=Custom stat labels and grammar. -LocalizedDescription.TemplatePath=Path to the template folder (with *.pk files) for initializing the PKM editor fields when a save file is loaded. -LocalizedDescription.TokenOrder=Display format to use when exporting a battle template from the program. -LocalizedDescription.TokenOrderCustom=Custom ordering for exporting a set, if chosen via export display style. -LocalizedDescription.TrainerPath=Path to the Trainers folder (with *.pk files) used for generating encounters with known Trainer data. +LocalizedDescription.StatsCustom=Etichette delle statistiche e grammatica personalizzate. +LocalizedDescription.TemplatePath=Percorso della cartella dei template (con file .pk) per inizializzare i campi dell'editor PKM al caricamento di un file di salvataggio. +LocalizedDescription.TokenOrder=Formato di visualizzazione da utilizzare quando si esporta un template di lotta dal programma. +LocalizedDescription.TokenOrderCustom=Ordinamento personalizzato per l'esportazione di un set, se selezionato tramite lo stile di visualizzazione esportazione. +LocalizedDescription.TrainerPath=Percorso della cartella Allenatori (con file .pk) utilizzata per generare incontri con dati Allenatore conosciuti. LocalizedDescription.TryDetectRecentSave=Localizza automaticamente l'ultimo File salvato quando apri un nuovo File. LocalizedDescription.Unicode=Unicode LocalizedDescription.UseTabsAsCriteria=Usa proprietà dell'Editor Pokémon per specificare criteri come il Sesso o la Natura quando si genera un incontro. LocalizedDescription.UseTabsAsCriteriaAnySpecies=Usa prorietà dell'Editor Pokémon anche se il nuovo incontro non è della stessa catena evolutiva. LocalizedDescription.Version=Ultima versione con cui il programma era stato eseguito. -LocalizedDescription.VirtualConsoleSourceGen1=Default version to set when transferring from Generation 1 3DS Virtual Console to Generation 7. -LocalizedDescription.VirtualConsoleSourceGen2=Default version to set when transferring from Generation 2 3DS Virtual Console to Generation 7. +LocalizedDescription.VirtualConsoleSourceGen1=Versione predefinita da impostare quando si trasferisce dalla Virtual Console 3DS di Gen 1 alla Gen 7. +LocalizedDescription.VirtualConsoleSourceGen2=Versione predefinita da impostare quando si trasferisce dalla Virtual Console 3DS di Gen 2 alla Gen 7. LocalizedDescription.ZeroHeightWeight=Forza una segnalazione di Legalità se il Pokémon ha zero sia nel Peso che nell'Altezza. Main.B_Blocks=Blocchi di Dati Main.B_CellsStickers=Cell./Adesivi @@ -445,8 +446,8 @@ Main.BTN_OTNameWarn=? Main.BTN_RandomAVs=Casualizza AVs Main.BTN_RandomEVs=Casualizza EVs Main.BTN_RandomIVs=Casualizza IVs -Main.BTN_RerollEC=Reroll -Main.BTN_RerollPID=Reroll +Main.BTN_RerollEC=Rigenera +Main.BTN_RerollPID=Rigenera Main.BTN_Ribbons=Fiocchi Main.CHK_AsEgg=Da un Uovo Main.CHK_Auto=Automatico @@ -521,7 +522,7 @@ Main.Label_Cute=Grazia Main.Label_DEF=Difesa: Main.Label_EggDate=Data: Main.Label_EggLocation=Luogo: -Main.Label_EncryptionConstant=Encryption Constant: +Main.Label_EncryptionConstant=Costante di crittografia: Main.Label_EVs=EVs Main.Label_EXP=EXP: Main.Label_Form=Forma: @@ -648,10 +649,10 @@ Main.Tab_Cosmetic=Cosmetica Main.Tab_Main=Generale Main.Tab_Met=Incontro Main.Tab_Moves=Mosse -Main.Tab_Other=Varie +Main.Tab_Other=Altro Main.Tab_OTMisc=AO/Varie Main.Tab_PartyBattle=Squadra -Main.Tab_SAV=Salvataggio +Main.Tab_SAV=SAV Main.Tab_Stats=Statistiche MemoryAmie.B_ClearAll=Ripulisci MemoryAmie.BTN_Cancel=Annulla @@ -871,22 +872,22 @@ PlayerBattleStyle7.Normal=Stile classico PlayerBattleStyle7.Passionate=Stile dinamico PlayerBattleStyle7.Reverent=Stile ispirato PlayerBattleStyle7.Smug=Stile deciso -PlayerSkinColor7.DarkF=Dark (Female) -PlayerSkinColor7.DarkM=Dark (Male) -PlayerSkinColor7.DefaultF=Default (Female) -PlayerSkinColor7.DefaultM=Default (Male) -PlayerSkinColor7.PaleF=Pale (Female) -PlayerSkinColor7.PaleM=Pale (Male) -PlayerSkinColor7.TanF=Tan (Female) -PlayerSkinColor7.TanM=Tan (Male) -PlayerSkinColor8.DarkF=Dark (Female) -PlayerSkinColor8.DarkM=Dark (Male) -PlayerSkinColor8.DefaultF=Default (Female) -PlayerSkinColor8.DefaultM=Default (Male) -PlayerSkinColor8.PaleF=Pale (Female) -PlayerSkinColor8.PaleM=Pale (Male) -PlayerSkinColor8.TanF=Tan (Female) -PlayerSkinColor8.TanM=Tan (Male) +PlayerSkinColor7.DarkF=Scura (Femmina) +PlayerSkinColor7.DarkM=Scura (Maschio) +PlayerSkinColor7.DefaultF=Predefinita (Femmina) +PlayerSkinColor7.DefaultM=Predefinita (Maschio) +PlayerSkinColor7.PaleF=Chiara (Femmina) +PlayerSkinColor7.PaleM=Chiara (Maschio) +PlayerSkinColor7.TanF=Olivastra (Femmina) +PlayerSkinColor7.TanM=Olivastra (Maschio) +PlayerSkinColor8.DarkF=Scura (Femmina) +PlayerSkinColor8.DarkM=Scura (Maschio) +PlayerSkinColor8.DefaultF=Predefinita (Femmina) +PlayerSkinColor8.DefaultM=Predefinita (Maschio) +PlayerSkinColor8.PaleF=Chiara (Femmina) +PlayerSkinColor8.PaleM=Chiara (Maschio) +PlayerSkinColor8.TanF=Olivastra (Femmina) +PlayerSkinColor8.TanM=Olivastra (Maschio) PokeSize.L=L PokeSize.M=M PokeSize.S=S @@ -1206,9 +1207,9 @@ SAV_EventFlags.GB_FlagStatus=Controllo Status SAV_EventFlags.GB_Research=Ricerca SAV_EventFlags.GB_Researcher=Ricerca Differenze SAV_EventFlags.L_EventFlagWarn=Modificare i segnali evento può alterare la storia. Si consiglia un backup del salvataggio. -SAV_EventFlags.L_IsSet=IsSet: -SAV_EventFlags.L_Stats=Constant: -SAV_EventFlags.L_UnSet=UnSet: +SAV_EventFlags.L_IsSet=Attivi: +SAV_EventFlags.L_Stats=Costante: +SAV_EventFlags.L_UnSet=Inattivi: SAV_EventWork.B_ApplyFlag=Applica SAV_EventWork.B_ApplyWork=Applica SAV_EventWork.B_Cancel=Annulla @@ -1222,12 +1223,12 @@ SAV_EventWork.GB_FlagStatus=Controllo Status SAV_EventWork.GB_Research=Ricerca SAV_EventWork.GB_Researcher=Ricerca Differenze SAV_EventWork.L_EventFlagWarn=Alterare i segnali Evento può impattare altri eventi legati alla storia di gioco. È consigliabile effettuare un Backup del salvataggio. -SAV_EventWork.L_Stats=Constant: +SAV_EventWork.L_Stats=Costante: SAV_Fashion9.B_Cancel=Annulla SAV_Fashion9.B_Save=Salva -SAV_Fashion9.B_SetAllOwned=Set All Owned +SAV_Fashion9.B_SetAllOwned=Tutti posseduti SAV_FlagWork8b.B_ApplyFlag=Applica -SAV_FlagWork8b.B_ApplyFlagSystem=Apply +SAV_FlagWork8b.B_ApplyFlagSystem=Applica SAV_FlagWork8b.B_ApplyWork=Applica SAV_FlagWork8b.B_Cancel=Annulla SAV_FlagWork8b.B_LoadNew=Carica Nuovo @@ -1259,9 +1260,9 @@ SAV_FolderList.Tab_Backup=Backup SAV_FolderList.Tab_Folders=Cartelle SAV_FolderList.Tab_Recent=Recenti SAV_Gear.B_Cancel=Annulla -SAV_Gear.B_Clear=Reset Gear to Default +SAV_Gear.B_Clear=Ripristina accessori SAV_Gear.B_Save=Salva -SAV_Gear.B_UnlockAll=Unlock All Gear +SAV_Gear.B_UnlockAll=Sblocca tutti gli accessori SAV_Gear.CHK_Electivire=Electivire SAV_Gear.CHK_Groudon=Groudon SAV_Gear.CHK_Kyogre=Kyogre @@ -1294,7 +1295,7 @@ SAV_HallOfFame.L_Level=Livello: SAV_HallOfFame.L_PartyNum=Indice Squadra: SAV_HallOfFame.L_Shiny=Cromatico: SAV_HallOfFame.L_Victory=Numero Vittorie: -SAV_HallOfFame.Label_EncryptionConstant=Encryption Constant: +SAV_HallOfFame.Label_EncryptionConstant=Costante di crittografia: SAV_HallOfFame.Label_Form=Forma: SAV_HallOfFame.Label_HeldItem=Strumento tenuto: SAV_HallOfFame.Label_MetDate=Data: @@ -1333,7 +1334,7 @@ SAV_HallOfFame7.L_C4=PKM 4: SAV_HallOfFame7.L_C5=PKM 5: SAV_HallOfFame7.L_C6=PKM 6: SAV_HallOfFame7.L_Current=Attuale -SAV_HallOfFame7.L_EC=EC Pokémon iniziale: +SAV_HallOfFame7.L_EC=CC iniziale: SAV_HallOfFame7.L_F1=PKM 1: SAV_HallOfFame7.L_F2=PKM 2: SAV_HallOfFame7.L_F3=PKM 3: @@ -1435,7 +1436,7 @@ SAV_Misc3.CHK_ReachBirth=Isola Materna SAV_Misc3.CHK_ReachFaraway=Isola Suprema SAV_Misc3.CHK_ReachNavel=Monte Cordone SAV_Misc3.CHK_ReachSouthern=Isola Remota -SAV_Misc3.CHK_Shiny=Cromatico +SAV_Misc3.CHK_Shiny=Crom. SAV_Misc3.DGV_Item_Chair=Strumento SAV_Misc3.DGV_Item_Cushion=Strumento SAV_Misc3.DGV_Item_Desk=Strumento @@ -1453,11 +1454,11 @@ SAV_Misc3.GB_Stats=Statistiche SAV_Misc3.GB_TCM=Icone Scheda Allenatore SAV_Misc3.L_B5Score=5 in fila: SAV_Misc3.L_BCaught=Catturato: -SAV_Misc3.L_BerryPowder=Farina di Bacche: +SAV_Misc3.L_BerryPowder=Farina Bacche: SAV_Misc3.L_BHigh=Migliore: SAV_Misc3.L_BP=PL: SAV_Misc3.L_BPEarned=PL Ottenuti: -SAV_Misc3.L_Caption=Caption: +SAV_Misc3.L_Caption=Didascalia: SAV_Misc3.L_Championships=Campionati: SAV_Misc3.L_Coins=Gettoni: SAV_Misc3.L_Continue=Continua @@ -1466,11 +1467,11 @@ SAV_Misc3.L_CurrentSwapped=Scambio attuale: SAV_Misc3.L_Facility=Struttura: SAV_Misc3.L_J5Score=5 In Fila: SAV_Misc3.L_JHigh=Migliore: -SAV_Misc3.L_JMaxPlayers=Max Players: +SAV_Misc3.L_JMaxPlayers=Max giocatori: SAV_Misc3.L_JRow=In fila: SAV_Misc3.L_Mode=Modalità: -SAV_Misc3.L_Nickname=Nickname: -SAV_Misc3.L_OT=OT: +SAV_Misc3.L_Nickname=Soprannome: +SAV_Misc3.L_OT=AO: SAV_Misc3.L_PID=PID: SAV_Misc3.L_RecordCleared=Completato: SAV_Misc3.L_RecordStreak=Serie record: @@ -1486,9 +1487,9 @@ SAV_Misc3.RB_Stats3_02=Apri SAV_Misc3.TAB_BF=Parco Lotta SAV_Misc3.Tab_Decorations=Decorazioni SAV_Misc3.TAB_Ferry=Traghetto -SAV_Misc3.TAB_Joyful=Arena Giochi -SAV_Misc3.TAB_Main=Main -SAV_Misc3.Tab_Paintings=Paintings +SAV_Misc3.TAB_Joyful=Minigiochi +SAV_Misc3.TAB_Main=Principale +SAV_Misc3.Tab_Paintings=Dipinti SAV_Misc3.Tab_Pokeblocks=Pokémelle SAV_Misc3.Tab_Records=Record SAV_Misc3.TB_Chair=Sedia @@ -1530,10 +1531,10 @@ SAV_Misc4.GB_FlyDest=Destinazione di Volo SAV_Misc4.GB_Hall=Palco Lotta () SAV_Misc4.GB_Poketch=PokéKron SAV_Misc4.GB_Prints=Stampa -SAV_Misc4.GB_Streaks=Streaks +SAV_Misc4.GB_Streaks=Serie SAV_Misc4.GB_WalkerCourses=Percorsi Pokéwalker SAV_Misc4.L_BP=PL: -SAV_Misc4.L_CastleRank01=Recovery / Item / Info +SAV_Misc4.L_CastleRank01=Recupero / Strumenti / Info SAV_Misc4.L_Coin=Gett: SAV_Misc4.L_CurrentApp=Applicazione Attuale SAV_Misc4.L_CurrentMap=Mappa Attuale @@ -1554,7 +1555,7 @@ SAV_Misc4.RB_Stats3_01=Lv. 50 SAV_Misc4.RB_Stats3_02=Aperto SAV_Misc4.TAB_BF=Parco Lotta SAV_Misc4.Tab_FashionCase=Scatola chic -SAV_Misc4.TAB_Main=Main +SAV_Misc4.TAB_Main=Principale SAV_Misc4.Tab_Poffins=Poffins SAV_Misc4.Tab_PokeGear=PokéGear SAV_Misc4.Tab_Records=Record @@ -1613,12 +1614,12 @@ SAV_Misc5.L_DoubleRecord=Record SAV_Misc5.L_EntreeBlack=N SAV_Misc5.L_EntreeWhite=B SAV_Misc5.L_FC=Estrai i dati da un salvataggio di Versione Bianca e importali in Versione Nera (e viceversa) per avere sia la città che la foresta nello stesso salvataggio! -SAV_Misc5.L_FMBestScore=Punteggio +SAV_Misc5.L_FMBestScore=Record SAV_Misc5.L_FMBestTotal=Miglior Record Totale -SAV_Misc5.L_FMCompleted=Completato -SAV_Misc5.L_FMHosted=Ospitato +SAV_Misc5.L_FMCompleted=Compiute +SAV_Misc5.L_FMHosted=Organizzate SAV_Misc5.L_FMLocked=Bloccato -SAV_Misc5.L_FMParticipants=Più Partecipanti +SAV_Misc5.L_FMParticipants=Max partecipanti SAV_Misc5.L_FMParticipated=Partecipato SAV_Misc5.L_FMTopScore=Miglior Punteggio SAV_Misc5.L_FMUnlocked=Sbloccato @@ -1654,8 +1655,8 @@ SAV_Misc5.L_SSingleRecord=Record SAV_Misc5.L_SuperSets=Super SAV_Misc5.TAB_BWCityForest=ForestaBianca/CittàNera SAV_Misc5.TAB_Entralink=Intramondo -SAV_Misc5.TAB_Forest=Foresta -SAV_Misc5.TAB_Main=Main +SAV_Misc5.TAB_Forest=Bosco +SAV_Misc5.TAB_Main=Principale SAV_Misc5.TAB_Medals=Premi SAV_Misc5.TAB_Muscial=Musical SAV_Misc5.TAB_Subway=Metrò @@ -1671,7 +1672,7 @@ SAV_Misc8b.B_Save=Salva SAV_Misc8b.B_Shaymin=Sblocca l'Evento di Shaymin SAV_Misc8b.B_Spiritomb=Incontra tutti gli NPC nei Sotterranei (Spiritomb) SAV_Misc8b.B_Zones=Sblocca tutte le zone -SAV_Misc8b.TAB_Main=Main +SAV_Misc8b.TAB_Main=Principale SAV_MysteryGiftDB.B_Add=Aggiungi SAV_MysteryGiftDB.B_Reset=Reset Filtri SAV_MysteryGiftDB.B_Search=Cerca! @@ -1735,7 +1736,7 @@ SAV_Pokedex4.B_GiveAll=Sel. Tutto SAV_Pokedex4.B_GLeft=< SAV_Pokedex4.B_GRight=> SAV_Pokedex4.B_GUp=↑ -SAV_Pokedex4.B_Modify=Modifica... +SAV_Pokedex4.B_Modify=Mod... SAV_Pokedex4.B_Save=Salva SAV_Pokedex4.CHK_Caught=Catturato SAV_Pokedex4.CHK_L1=Giapponese @@ -1751,8 +1752,8 @@ SAV_Pokedex4.L_NotSeen=Non Visti SAV_Pokedex4.L_Seen=Visti SAV_Pokedex5.B_Cancel=Annulla SAV_Pokedex5.B_GiveAll=Sel. Tutto -SAV_Pokedex5.B_Modify=Modifica... -SAV_Pokedex5.B_ModifyForms=Modifica... +SAV_Pokedex5.B_Modify=Mod... +SAV_Pokedex5.B_ModifyForms=Mod... SAV_Pokedex5.B_Save=Salva SAV_Pokedex5.CHK_L1=Giapponese SAV_Pokedex5.CHK_L2=Inglese @@ -1811,8 +1812,8 @@ SAV_Pokedex9a.L_Seen=Visti: SAV_Pokedex9a.L_SeenShiny=Visti (Cromatico): SAV_PokedexBDSP.B_Cancel=Annulla SAV_PokedexBDSP.B_GiveAll=Sel. Tutto -SAV_PokedexBDSP.B_Modify=Modifica... -SAV_PokedexBDSP.B_ModifyForms=Modifica... +SAV_PokedexBDSP.B_Modify=Mod... +SAV_PokedexBDSP.B_ModifyForms=Mod... SAV_PokedexBDSP.B_Save=Salva SAV_PokedexBDSP.CHK_F=Femmina SAV_PokedexBDSP.CHK_FS=*Femmina* @@ -1836,7 +1837,7 @@ SAV_PokedexBDSP.L_goto=vai a: SAV_PokedexGG.B_Cancel=Annulla SAV_PokedexGG.B_Counts=Conteggio SAV_PokedexGG.B_GiveAll=Sel. Tutto -SAV_PokedexGG.B_Modify=Modifica... +SAV_PokedexGG.B_Modify=Mod... SAV_PokedexGG.B_Save=Salva SAV_PokedexGG.CHK_L1=Giapponese SAV_PokedexGG.CHK_L2=Inglese @@ -1874,7 +1875,7 @@ SAV_PokedexGG.L_RWeightMax=Max SAV_PokedexGG.L_RWeightMin=Min SAV_PokedexLA.B_AdvancedResearch=Modifica Incarichi SAV_PokedexLA.B_Cancel=Annulla -SAV_PokedexLA.B_Report=Report Data +SAV_PokedexLA.B_Report=Dati Report SAV_PokedexLA.B_Save=Salva SAV_PokedexLA.CHK_A=Alfa SAV_PokedexLA.CHK_C0=Maschio @@ -1920,16 +1921,16 @@ SAV_PokedexLA.L_ConnectHeight=- SAV_PokedexLA.L_ConnectWeight=- SAV_PokedexLA.L_DisplayedForm=Forma visualizzata: SAV_PokedexLA.L_goto=vai a: -SAV_PokedexLA.L_ResearchLevelReported=Reported: -SAV_PokedexLA.L_ResearchLevelUnreported=Unreported: +SAV_PokedexLA.L_ResearchLevelReported=Inviati: +SAV_PokedexLA.L_ResearchLevelUnreported=Non inviati:: SAV_PokedexLA.L_TheoryHeight=- SAV_PokedexLA.L_TheoryWeight=- -SAV_PokedexLA.L_UpdateIndex=Index: -SAV_PokedexLA.Label_Task=Task Description: +SAV_PokedexLA.L_UpdateIndex=Indice: +SAV_PokedexLA.Label_Task=Descrizione incarico: SAV_PokedexORAS.B_Cancel=Annulla SAV_PokedexORAS.B_GiveAll=Sel. Tutto -SAV_PokedexORAS.B_Modify=Modifica... -SAV_PokedexORAS.B_ModifyForms=Modifica... +SAV_PokedexORAS.B_Modify=Mod... +SAV_PokedexORAS.B_ModifyForms=Mod... SAV_PokedexORAS.B_Save=Salva SAV_PokedexORAS.CHK_L1=Giapponese SAV_PokedexORAS.CHK_L2=Inglese @@ -1967,7 +1968,7 @@ SAV_PokedexResearchEditorLA.GB_Interact=Interazioni SAV_PokedexResearchEditorLA.GB_Observe=Osservazioni SAV_PokedexSM.B_Cancel=Annulla SAV_PokedexSM.B_GiveAll=Sel. Tutto -SAV_PokedexSM.B_Modify=Modifica... +SAV_PokedexSM.B_Modify=Mod... SAV_PokedexSM.B_Save=Salva SAV_PokedexSM.CHK_L1=Giapponese SAV_PokedexSM.CHK_L2=Inglese @@ -2049,7 +2050,7 @@ SAV_PokedexSVKitakami.L_Seen=Visti: SAV_PokedexSVKitakami.L_Viewed=Visualizzati: SAV_PokedexSWSH.B_Cancel=Annulla SAV_PokedexSWSH.B_GiveAll=Sel. Tutto -SAV_PokedexSWSH.B_Modify=Modifica... +SAV_PokedexSWSH.B_Modify=Mod... SAV_PokedexSWSH.B_Save=Salva SAV_PokedexSWSH.CHK_Caught=Ottenuto SAV_PokedexSWSH.CHK_G=Gigamax @@ -2076,8 +2077,8 @@ SAV_PokedexSWSH.L_Male=Maschio SAV_PokedexSWSH.L_MaleShiny=*Maschio* SAV_PokedexXY.B_Cancel=Annulla SAV_PokedexXY.B_GiveAll=Sel. Tutto -SAV_PokedexXY.B_Modify=Modifica... -SAV_PokedexXY.B_ModifyForms=Modifica... +SAV_PokedexXY.B_Modify=Mod... +SAV_PokedexXY.B_ModifyForms=Mod... SAV_PokedexXY.B_Save=Salva SAV_PokedexXY.CHK_F1=Straniero (Pre) SAV_PokedexXY.CHK_L1=Giapponese @@ -2160,17 +2161,17 @@ SAV_SealStickers8b.B_Save=Salva SAV_SecretBase.B_Cancel=Annulla SAV_SecretBase.B_Export=Esporta SAV_SecretBase.B_FDelete=X -SAV_SecretBase.B_GiveDecor=Dai Tutte le Decorazioni +SAV_SecretBase.B_GiveDecor=Dai Tutte Decor. SAV_SecretBase.B_Import=Importa SAV_SecretBase.B_Save=Salva SAV_SecretBase.CHK_Shiny=☆ -SAV_SecretBase.f_MAIN=Main +SAV_SecretBase.f_MAIN=Principale SAV_SecretBase.f_PKM=Pokémon Allenatore -SAV_SecretBase.GB_Object=Object Layout +SAV_SecretBase.GB_Object=Disposizione Oggetti SAV_SecretBase.L_ATK=Attacco SAV_SecretBase.L_Decoration=Decorazione: SAV_SecretBase.L_DEF=Difesa -SAV_SecretBase.L_EncryptionConstant=ENC: +SAV_SecretBase.L_EncryptionConstant=CC: SAV_SecretBase.L_EVs=EV SAV_SecretBase.L_Favorite=Preferito: SAV_SecretBase.L_FlagsCaptured=Segnale Cattura: @@ -2378,7 +2379,7 @@ SAV_Trainer7.L_Fame=Entrata SdO: SAV_Trainer7.L_FC=Festigettoni: SAV_Trainer7.L_Hours=Ore: SAV_Trainer7.L_Language=Lingua: -SAV_Trainer7.L_LastSaved=Ultimo salvataggio: +SAV_Trainer7.L_LastSaved=Ult. salvat.: SAV_Trainer7.L_Minutes=Min: SAV_Trainer7.L_Money=$: SAV_Trainer7.L_MStreak0=Max Streak Singole: @@ -2390,7 +2391,7 @@ SAV_Trainer7.L_R=Rotazione: SAV_Trainer7.L_Region=Sottoregione: SAV_Trainer7.L_Regular=Regolare SAV_Trainer7.L_RotomAffection=Afetto: -SAV_Trainer7.L_RotomOT=Rotom AO: +SAV_Trainer7.L_RotomOT=Soprann. AO: SAV_Trainer7.L_Seconds=Sec: SAV_Trainer7.L_SkinColor=Colore Pelle: SAV_Trainer7.L_SnapCount=Conteggio Foto: @@ -2416,7 +2417,7 @@ SAV_Trainer7.Tab_BattleTree=Albero Lotta SAV_Trainer7.Tab_Misc=Varie SAV_Trainer7.Tab_Overview=Panoramica SAV_Trainer7.Tab_Ultra=Ultra -SAV_Trainer7GG.B_AllFashionItems=Unlock all Fashion Items +SAV_Trainer7GG.B_AllFashionItems=Sblocca tutti gli articoli di moda SAV_Trainer7GG.B_AllTrainerTitles=Sblocca tutti i Titoli Allenatore SAV_Trainer7GG.B_Cancel=Annulla SAV_Trainer7GG.B_DeleteAll=Elimina Tutto @@ -2435,7 +2436,7 @@ SAV_Trainer7GG.L_GoSlot=Slot: SAV_Trainer7GG.L_GoSlotSummary=Sommario SAV_Trainer7GG.L_Hours=Ore: SAV_Trainer7GG.L_Language=Lingua: -SAV_Trainer7GG.L_LastSaved=Ultimo salvataggio: +SAV_Trainer7GG.L_LastSaved=Ult. salvat.: SAV_Trainer7GG.L_Minutes=Min: SAV_Trainer7GG.L_Money=$: SAV_Trainer7GG.L_R=Rotazione: @@ -2475,7 +2476,7 @@ SAV_Trainer8.L_Doubles=Doppie: SAV_Trainer8.L_Fame=Entrata SdO: SAV_Trainer8.L_Hours=Ore: SAV_Trainer8.L_Language=Lingua: -SAV_Trainer8.L_LastSaved=Ultimo salvataggio: +SAV_Trainer8.L_LastSaved=Ult. salvat.: SAV_Trainer8.L_Minutes=Min: SAV_Trainer8.L_Money=$: SAV_Trainer8.L_Offset=(offset) @@ -2492,7 +2493,7 @@ SAV_Trainer8.L_SY=Scala Y: SAV_Trainer8.L_SZ=Scala Z: SAV_Trainer8.L_TrainerName=Nome Allenatore: SAV_Trainer8.L_TRCardID=ID Allenatore della Lega: -SAV_Trainer8.L_TRCardName=Nome Scheda della Lega: +SAV_Trainer8.L_TRCardName=Nome Scheda Lega: SAV_Trainer8.L_TRCardNumber=ID Uniforma della Lega: SAV_Trainer8.L_Value=Valore SAV_Trainer8.L_Watt=W: @@ -2515,7 +2516,7 @@ SAV_Trainer8a.L_CurrentMap=Mappa corrente: SAV_Trainer8a.L_GalaxyRank=Rango Galassia: SAV_Trainer8a.L_Hours=Ore: SAV_Trainer8a.L_Language=Lingua: -SAV_Trainer8a.L_LastSaved=Ultimo salvataggio: +SAV_Trainer8a.L_LastSaved=Ult. salvat.: SAV_Trainer8a.L_MeritCurrent=Punti di Merito Attuali: SAV_Trainer8a.L_MeritEarned=Punti di Merito Ottenuti: SAV_Trainer8a.L_Minutes=Min: @@ -2552,7 +2553,7 @@ SAV_Trainer8b.L_Fame=Entrata SdO: SAV_Trainer8b.L_Height=Altezza: SAV_Trainer8b.L_Hours=Ore: SAV_Trainer8b.L_Language=Lingua: -SAV_Trainer8b.L_LastSaved=Ultimo salvataggio: +SAV_Trainer8b.L_LastSaved=Ult. salvat.: SAV_Trainer8b.L_Minutes=Min: SAV_Trainer8b.L_Money=$: SAV_Trainer8b.L_Offset=(offset) @@ -2576,7 +2577,7 @@ SAV_Trainer9.B_MaxCash=+ SAV_Trainer9.B_MaxLP=+ SAV_Trainer9.B_Save=Salva SAV_Trainer9.B_UnlockBikeUpgrades=Tutti Potenz. Montura -SAV_Trainer9.B_UnlockClothing=Tutto l'Abbigliamento +SAV_Trainer9.B_UnlockClothing=Tutto l'Abbigliam. SAV_Trainer9.B_UnlockCoaches=Sblocca tutti i tutor SAV_Trainer9.B_UnlockFlyLocations=Sblocca tutti i Punti di Volo SAV_Trainer9.B_UnlockThrowStyles=Sblocca tutti gli stili di lotta @@ -2588,7 +2589,7 @@ SAV_Trainer9.L_BBQSolo=Missioni in solitaria: SAV_Trainer9.L_BP=BP: SAV_Trainer9.L_Hours=Ore: SAV_Trainer9.L_Language=Lingua: -SAV_Trainer9.L_LastSaved=Ultimo salvataggio: +SAV_Trainer9.L_LastSaved=Ult. salvat.: SAV_Trainer9.L_LP=CL: SAV_Trainer9.L_Minutes=Min: SAV_Trainer9.L_Money=$: @@ -2618,7 +2619,7 @@ SAV_Trainer9a.GB_Map=Posizione Mappa SAV_Trainer9a.L_Hours=Hrs: SAV_Trainer9a.L_HyperspaceSurveyPoints=Punti sopralluoghi Dimensionali: SAV_Trainer9a.L_Language=Lingua: -SAV_Trainer9a.L_LastSaved=Ultimo salvataggio: +SAV_Trainer9a.L_LastSaved=Ult. salvat.: SAV_Trainer9a.L_Map=Mappa: SAV_Trainer9a.L_Minutes=Min: SAV_Trainer9a.L_Money=$: diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index f2b2165c8..846283091 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -270,6 +270,7 @@ LocalizedDescription.DatabasePath=Path to the PKM Database folder. LocalizedDescription.DefaultBoxExportNamer=Selected File namer to use for box exports for the GUI, if multiple are available. LocalizedDescription.DisableScalingDpi=Disables the GUI scaling based on Dpi on program startup, falling back to font scaling. LocalizedDescription.DisableWordFilterPastGen=3DS時代より前のワードチェックを無効にします。 +LocalizedDescription.DragStartThreshold=スロットからドラッグ操作を開始するまでに必要なマウスの最小移動距離です。 LocalizedDescription.EggRandomAnyType3=Allow Generation 3 bred eggs to have any PID/IV type by assuming they were RNG abused to be collisions instead of hacked. LocalizedDescription.EggRandomAnyType4=Allow Generation 4 bred eggs to have any PID/IV type by assuming they were RNG abused to be collisions instead of hacked. LocalizedDescription.Export=Settings for showing details when exporting a slot. @@ -318,7 +319,7 @@ LocalizedDescription.Nickname8=剣盾のニックネームルール。 LocalizedDescription.Nickname8a=レジェンズアルセウスのニックネームルール。 LocalizedDescription.Nickname8b=BDSPのニックネームルール。 LocalizedDescription.Nickname9=第9世代のニックネームルール。 -LocalizedDescription.Nickname9a=Nickname rules for Generation 9a. +LocalizedDescription.Nickname9a=レジェンズZ-Aのニックネームルール。 LocalizedDescription.NicknamedAnotherSpecies=別のポケモンと一致するニックネームを持っているかどうかで正規チェックにフラグを立てる。 LocalizedDescription.NicknamedMysteryGift=プレイヤーが通常つけられないニックネームのふしぎなおくりもの産ポケモンに正規チェックフラグを立てる。 LocalizedDescription.NicknamedTrade=プレイヤーが通常つけられないニックネームのポケモンをゲーム内で交換した場合、正規チェックにフラグを立てる。 @@ -651,7 +652,7 @@ Main.Tab_Moves=わざ Main.Tab_Other=その他 Main.Tab_OTMisc=親など Main.Tab_PartyBattle=手持ちポケモン -Main.Tab_SAV=SAV +Main.Tab_SAV=セーブ Main.Tab_Stats=ステータス MemoryAmie.B_ClearAll=全て消去 MemoryAmie.BTN_Cancel=キャンセル @@ -2390,7 +2391,7 @@ SAV_Trainer7.L_R=回転座標 SAV_Trainer7.L_Region=地域 SAV_Trainer7.L_Regular=通常 SAV_Trainer7.L_RotomAffection=なかよし: -SAV_Trainer7.L_RotomOT=トレーナー名(ロトム図鑑) +SAV_Trainer7.L_RotomOT=トレーナー名 SAV_Trainer7.L_Seconds=秒: SAV_Trainer7.L_SkinColor=肌の色 SAV_Trainer7.L_SnapCount=撮影回数 diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index 9822c1a4c..094713c17 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -270,6 +270,7 @@ LocalizedDescription.DatabasePath=PKM 데이터베이스 폴더 경로 LocalizedDescription.DefaultBoxExportNamer=GUI에서 박스 내보내기를 위한 파일 이름 생성기 선택, 여러 개가 있는 경우 적용. LocalizedDescription.DisableScalingDpi=프로그램 시작 시 DPI 기반 GUI 스케일링을 비활성화하고 폰트 스케일링으로 대체. LocalizedDescription.DisableWordFilterPastGen=이전 형식에 대한 과거 워드 필터 검사를 비활성화. +LocalizedDescription.DragStartThreshold=슬롯에서 드래그 조작이 시작되기 전 마우스 이동이 초과해야 하는 최소 거리 임계값입니다. LocalizedDescription.EggRandomAnyType3=3세대 알의 PID/IV 조합이 루프(RNG)를 통한 데이터 충돌(Collision) 결과물이라고 가정하여, 에디트 판정 대신 모든 유형을 허용합니다. LocalizedDescription.EggRandomAnyType4=4세대 알의 PID/IV 조합이 루프(RNG)를 통한 데이터 충돌(Collision) 결과물이라고 가정하여, 에디트 판정 대신 모든 유형을 허용합니다. LocalizedDescription.Export=슬롯 내보내기 시 세부 정보를 표시하기 위한 설정. @@ -313,12 +314,12 @@ LocalizedDescription.Nickname4=4세대의 닉네임 규칙입니다. LocalizedDescription.Nickname5=5세대의 닉네임 규칙입니다. LocalizedDescription.Nickname6=6세대의 닉네임 규칙입니다. LocalizedDescription.Nickname7=7세대의 닉네임 규칙입니다. -LocalizedDescription.Nickname7b=7b세대의 닉네임 규칙입니다.. +LocalizedDescription.Nickname7b=7b세대의 닉네임 규칙입니다 (레츠고). LocalizedDescription.Nickname8=8세대의 닉네임 규칙입니다. -LocalizedDescription.Nickname8a=8a세대의 닉네임 규칙입니다. -LocalizedDescription.Nickname8b=8b세대의 닉네임 규칙입니다. +LocalizedDescription.Nickname8a=8a세대의 닉네임 규칙입니다 (아르세우스). +LocalizedDescription.Nickname8b=8b세대의 닉네임 규칙입니다 (BDSP). LocalizedDescription.Nickname9=9세대의 닉네임 규칙입니다. -LocalizedDescription.Nickname9a=9a세대의 닉네임 규칙입니다. +LocalizedDescription.Nickname9a=9a세대의 닉네임 규칙입니다 (Z-A). LocalizedDescription.NicknamedAnotherSpecies=다른 종의 이름과 일치하는 닉네임을 가진 포켓몬에 대한 합법성 검사 플래그의 심각도입니다. LocalizedDescription.NicknamedMysteryGift=플레이어가 일반적으로 닉네임을 지어줄 수 없는 이상한 소포 포켓몬이 닉네임을 가지고 있을 경우, 합법성 검사 플래그의 심각도입니다. LocalizedDescription.NicknamedTrade=플레이어가 일반적으로 닉네임을 지어줄 수 없는 인게임 교환 포켓몬이 닉네임을 가지고 있을 경우, 합법성 검사 플래그의 심각도입니다. @@ -458,7 +459,7 @@ Main.CHK_Infected=감염 Main.CHK_IsAlpha=우두머리 Main.CHK_IsEgg=알 여부 Main.CHK_IsNoble=왕/여 -Main.CHK_Nicknamed=이름: +Main.CHK_Nicknamed=닉네임: Main.CHK_NSparkle=켜짐 Main.CHK_Shadow=다크 Main.DayCare_HasEgg=알 획득 가능 @@ -607,7 +608,7 @@ Main.mnu_ModifyMaxFriendship=친밀도 최대 Main.mnu_ModifyMaxLevel=레벨 최대 Main.mnu_ModifyRandomMoves=기술 무작위 Main.mnu_ModifyRemoveItem=지닌 물건 삭제 -Main.mnu_ModifyRemoveNicknames=포켓몬 이름 제거 +Main.mnu_ModifyRemoveNicknames=포켓몬 닉네임 제거 Main.mnu_ModifyResetMoves=기술 초기화 Main.mnu_Sort=박스 정렬 Main.mnu_SortAdvanced=박스 정렬 (고급) @@ -651,7 +652,7 @@ Main.Tab_Moves=기술 Main.Tab_Other=기타 Main.Tab_OTMisc=어버이/기타 Main.Tab_PartyBattle=파티 -Main.Tab_SAV=SAV +Main.Tab_SAV=세이브 Main.Tab_Stats=능력치 MemoryAmie.B_ClearAll=모두 비우기 MemoryAmie.BTN_Cancel=취소 @@ -1026,8 +1027,8 @@ SAV_BlockDump8.B_ExportAllSingle=모두 내보내기 (단일 파일) SAV_BlockDump8.B_ExportCurrent=현재 블록 내보내기 SAV_BlockDump8.B_ImportCurrent=현재 블록 가져오기 SAV_BlockDump8.B_ImportFolder=폴더에서 블록 가져오기 -SAV_BlockDump8.B_LoadNew=새로 불러오기 -SAV_BlockDump8.B_LoadOld=이전 불러오기 +SAV_BlockDump8.B_LoadNew=새로불러오기 +SAV_BlockDump8.B_LoadOld=이전불러오기 SAV_BlockDump8.CHK_DataOnly=데이터 블록만 SAV_BlockDump8.CHK_FakeHeader=블록 시작 마킹 (ASCII) SAV_BlockDump8.CHK_Key=32비트 키 포함 @@ -1196,8 +1197,8 @@ SAV_Encounters.Tab_Criteria=조건 SAV_Encounters.Tab_General=일반 SAV_Encounters.Tab_Settings=설정 SAV_EventFlags.B_Cancel=취소 -SAV_EventFlags.B_LoadNew=새로 불러오기 -SAV_EventFlags.B_LoadOld=이전 불러오기 +SAV_EventFlags.B_LoadNew=새로불러오기 +SAV_EventFlags.B_LoadOld=이전불러오기 SAV_EventFlags.B_Save=저장 SAV_EventFlags.CHK_CustomFlag=플래그: SAV_EventFlags.GB_Constants=이벤트 상수 @@ -1212,8 +1213,8 @@ SAV_EventFlags.L_UnSet=UnSet: SAV_EventWork.B_ApplyFlag=적용 SAV_EventWork.B_ApplyWork=적용 SAV_EventWork.B_Cancel=취소 -SAV_EventWork.B_LoadNew=새로 불러오기 -SAV_EventWork.B_LoadOld=이전 불러오기 +SAV_EventWork.B_LoadNew=새로불러오기 +SAV_EventWork.B_LoadOld=이전불러오기 SAV_EventWork.B_Save=저장 SAV_EventWork.CHK_CustomFlag=플래그: SAV_EventWork.GB_Constants=이벤트 상수 @@ -1230,26 +1231,26 @@ SAV_FlagWork8b.B_ApplyFlag=적용 SAV_FlagWork8b.B_ApplyFlagSystem=적용 SAV_FlagWork8b.B_ApplyWork=적용 SAV_FlagWork8b.B_Cancel=취소 -SAV_FlagWork8b.B_LoadNew=새로 불러오기 -SAV_FlagWork8b.B_LoadOld=이전 불러오기 +SAV_FlagWork8b.B_LoadNew=새로불러오기 +SAV_FlagWork8b.B_LoadOld=이전불러오기 SAV_FlagWork8b.B_Save=저장 -SAV_FlagWork8b.CHK_CustomFlag=Event Flag: -SAV_FlagWork8b.CHK_CustomSystem=System Flag: -SAV_FlagWork8b.GB_Flags=Event Flags -SAV_FlagWork8b.GB_FlagStatus=Check Status -SAV_FlagWork8b.GB_Research=Research -SAV_FlagWork8b.GB_Researcher=FlagDiff Researcher -SAV_FlagWork8b.GB_System=System Flags -SAV_FlagWork8b.GB_Work=Work Values -SAV_FlagWork8b.L_CustomWork=Constant: +SAV_FlagWork8b.CHK_CustomFlag=이벤트 플래그: +SAV_FlagWork8b.CHK_CustomSystem=시스템 플래그: +SAV_FlagWork8b.GB_Flags=이벤트 플래그 +SAV_FlagWork8b.GB_FlagStatus=상태 확인 +SAV_FlagWork8b.GB_Research=조사 +SAV_FlagWork8b.GB_Researcher=플래그 차이 조사 도구 +SAV_FlagWork8b.GB_System=시스템 플래그 +SAV_FlagWork8b.GB_Work=워크 값 +SAV_FlagWork8b.L_CustomWork=상수: SAV_FlagWork8b.L_EventFlagWarn=이벤트 플래그를 변경하면 다른 스토리 이벤트에 영향을 줄 수 있습니다. 저장 파일 백업을 권장합니다. -SAV_FolderList.DGV_FileTime=FileTime +SAV_FolderList.DGV_FileTime=파일시간 SAV_FolderList.DGV_Folder=폴더 SAV_FolderList.DGV_G=G SAV_FolderList.DGV_Game=게임 SAV_FolderList.DGV_Name=이름 SAV_FolderList.DGV_OT=OT -SAV_FolderList.DGV_Played=Played +SAV_FolderList.DGV_Played=플레이시간 SAV_FolderList.DGV_SID=SID SAV_FolderList.DGV_TID=TID SAV_FolderList.mnuBrowseAt=찾아보기... @@ -1286,7 +1287,7 @@ SAV_HallOfFame.B_Cancel=취소 SAV_HallOfFame.B_Close=저장 SAV_HallOfFame.B_CopyText=글 복사 SAV_HallOfFame.B_Delete=삭제 -SAV_HallOfFame.CHK_Nicknamed=이름: +SAV_HallOfFame.CHK_Nicknamed=닉네임: SAV_HallOfFame.GB_CurrentMoves=가진 기술 SAV_HallOfFame.GB_OT=트레이너 정보 SAV_HallOfFame.groupBox1=기록 @@ -1444,14 +1445,14 @@ SAV_Misc3.DGV_Item_Mat=아이템 SAV_Misc3.DGV_Item_Ornament=아이템 SAV_Misc3.DGV_Item_Plant=아이템 SAV_Misc3.DGV_Item_Poster=아이템 -SAV_Misc3.GB_FrontierPass=Frontier Pass -SAV_Misc3.GB_Icons=Symbol Icons +SAV_Misc3.GB_FrontierPass=프런티어패스 +SAV_Misc3.GB_Icons=심볼 아이콘 SAV_Misc3.GB_InitialEvent=초기 이벤트 -SAV_Misc3.GB_Painting=Details +SAV_Misc3.GB_Painting=상세 정보 SAV_Misc3.GB_Reachable=도달 가능 지역 SAV_Misc3.GB_Stats=스탯 SAV_Misc3.GB_TCM=트레이너 카드 포켓몬 아이콘 -SAV_Misc3.L_B5Score=5 In a Row: +SAV_Misc3.L_B5Score=5연승: SAV_Misc3.L_BCaught=잡음: SAV_Misc3.L_BerryPowder=열매가루: SAV_Misc3.L_BHigh=최고 점수: @@ -1464,10 +1465,10 @@ SAV_Misc3.L_Continue=계속 SAV_Misc3.L_CurrentStreak=현재 연승: SAV_Misc3.L_CurrentSwapped=현재 교환됨: SAV_Misc3.L_Facility=시설: -SAV_Misc3.L_J5Score=5 In a Row: +SAV_Misc3.L_J5Score=5연승: SAV_Misc3.L_JHigh=최고 점수: -SAV_Misc3.L_JMaxPlayers=Max Players: -SAV_Misc3.L_JRow=In a Row: +SAV_Misc3.L_JMaxPlayers=최대 인원: +SAV_Misc3.L_JRow=연승 기록: SAV_Misc3.L_Mode=모드: SAV_Misc3.L_Nickname=닉네임: SAV_Misc3.L_OT=어버이: @@ -1479,16 +1480,16 @@ SAV_Misc3.L_SID=SID: SAV_Misc3.L_Species=종류: SAV_Misc3.L_TID=TID: SAV_Misc3.L_TrainerName=라이벌 이름: -SAV_Misc3.label4=Pokémon Jump -SAV_Misc3.label5=Berry Picking +SAV_Misc3.label4=포켓몬 점프 +SAV_Misc3.label5=나무열매 뽑기 SAV_Misc3.RB_Stats3_01=레벨 50 SAV_Misc3.RB_Stats3_02=열기 SAV_Misc3.TAB_BF=배틀프런티어 SAV_Misc3.Tab_Decorations=굿즈 -SAV_Misc3.TAB_Ferry=Ferry -SAV_Misc3.TAB_Joyful=Joyful +SAV_Misc3.TAB_Ferry=페리 +SAV_Misc3.TAB_Joyful=미니게임 SAV_Misc3.TAB_Main=기본 -SAV_Misc3.Tab_Paintings=Paintings +SAV_Misc3.Tab_Paintings=그림 SAV_Misc3.Tab_Pokeblocks=포켓몬스넥 SAV_Misc3.Tab_Records=기록 SAV_Misc3.TB_Chair=의자 @@ -2390,7 +2391,7 @@ SAV_Trainer7.L_R=회전: SAV_Trainer7.L_Region=보조 지역: SAV_Trainer7.L_Regular=일반배틀 SAV_Trainer7.L_RotomAffection=절친: -SAV_Trainer7.L_RotomOT=로토무 어버이 이름: +SAV_Trainer7.L_RotomOT=어버이 닉네임: SAV_Trainer7.L_Seconds=초: SAV_Trainer7.L_SkinColor=피부 색상: SAV_Trainer7.L_SnapCount=촬영 횟수: diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index d10ee8978..63f72812d 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -270,6 +270,7 @@ LocalizedDescription.DatabasePath=PKM 数据库文件夹的路径。 LocalizedDescription.DefaultBoxExportNamer=如果有多个可用的文件名,则选择文件名用于GUI的框导出。 LocalizedDescription.DisableScalingDpi=在程序启动时禁用基于 Dpi 的 GUI 缩放,回退到字体缩放。 LocalizedDescription.DisableWordFilterPastGen=禁用3DS时代之前格式的文字过滤检查。 +LocalizedDescription.DragStartThreshold=从槽位开始拖放操作前,鼠标移动必须超过的最小距离阈值。 LocalizedDescription.EggRandomAnyType3=允许三代孵化蛋拥有任意PID/个体值类型,假设其通过乱数方式制造碰撞获得,而非通过修改手段获得。 LocalizedDescription.EggRandomAnyType4=允许四代孵化蛋拥有任意PID/个体值类型,假设其通过乱数方式制造碰撞获得,而非通过修改手段获得。 LocalizedDescription.Export=导出单个宝可梦时显示详细信息的相关设置。 @@ -1486,7 +1487,7 @@ SAV_Misc3.RB_Stats3_02=打开 SAV_Misc3.TAB_BF=对战开拓区 SAV_Misc3.Tab_Decorations=物品 SAV_Misc3.TAB_Ferry=游轮 -SAV_Misc3.TAB_Joyful=欢乐游戏城 +SAV_Misc3.TAB_Joyful=小游戏 SAV_Misc3.TAB_Main=主界面 SAV_Misc3.Tab_Paintings=肖像 SAV_Misc3.Tab_Pokeblocks=宝可方块 @@ -2390,7 +2391,7 @@ SAV_Trainer7.L_R=轮盘: SAV_Trainer7.L_Region=地区: SAV_Trainer7.L_Regular=一般 SAV_Trainer7.L_RotomAffection=友好度: -SAV_Trainer7.L_RotomOT=洛托姆昵称: +SAV_Trainer7.L_RotomOT=训练家昵称: SAV_Trainer7.L_Seconds=秒: SAV_Trainer7.L_SkinColor=皮肤颜色: SAV_Trainer7.L_SnapCount=拍照数: diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index 8920f4af6..b111abc25 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -270,6 +270,7 @@ LocalizedDescription.DatabasePath=PKM 資料庫資料夾的路徑。 LocalizedDescription.DefaultBoxExportNamer=如果有多個可用的檔名,則選擇檔名用於 GUI 的框匯出。 LocalizedDescription.DisableScalingDpi=在程式啟動時禁用基於 Dpi 的 GUI 縮放,回退到字型縮放。 LocalizedDescription.DisableWordFilterPastGen=禁用 3DS 時代之前格式的文字過濾檢查。 +LocalizedDescription.DragStartThreshold=從槽位開始拖放操作前,滑鼠移動必須超過的最小距離閾值。 LocalizedDescription.EggRandomAnyType3=允許三代孵化蛋擁有任意 PID/個體值類型,假設其透過亂數方式製造碰撞獲得,而非透過修改手段獲得。 LocalizedDescription.EggRandomAnyType4=允許四代孵化蛋擁有任意 PID/個體值類型,假設其透過亂數方式製造碰撞獲得,而非透過修改手段獲得。 LocalizedDescription.Export=匯出單個寶可夢時顯示詳細資訊的相關設定。 @@ -323,7 +324,7 @@ LocalizedDescription.NicknamedAnotherSpecies=寶可夢昵稱和其他種類名 LocalizedDescription.NicknamedMysteryGift=玩家無法取昵稱的神秘禮物合法性檢查等級。 LocalizedDescription.NicknamedTrade=遊戲內交換寶可夢昵稱合法性檢查等級。 LocalizedDescription.OtherBackupPaths=查找儲存資料檔的位置列表。 -LocalizedDescription.OtherSaveFileExtensions=程式可識別的其他儲存資料檔副檔名(不包含副檔名前的點) +LocalizedDescription.OtherSaveFileExtensions=程式可識別的其他儲存資料檔副檔名(不包含副檔名前的點)。 LocalizedDescription.OverrideGen1=第1代:如果無法檢測到存檔文件的語言或版本,請改用這些設定。 LocalizedDescription.OverrideGen2=第2代:如果無法檢測到存檔文件的語言或版本,請改用這些設定。 LocalizedDescription.OverrideGen3FRLG=第3代火紅/葉綠:如果無法檢測到存檔文件的語言或版本,請改用這些設定。 @@ -651,7 +652,7 @@ Main.Tab_Moves=招式 Main.Tab_Other=其它 Main.Tab_OTMisc=初訓家/雜項 Main.Tab_PartyBattle=同行寶可夢 -Main.Tab_SAV=儲存資料 +Main.Tab_SAV=存檔 Main.Tab_Stats=數值 MemoryAmie.B_ClearAll=清空 MemoryAmie.BTN_Cancel=取消 @@ -1486,7 +1487,7 @@ SAV_Misc3.RB_Stats3_02=打開 SAV_Misc3.TAB_BF=對戰開拓區 SAV_Misc3.Tab_Decorations=物品 SAV_Misc3.TAB_Ferry=遊輪 -SAV_Misc3.TAB_Joyful=歡樂遊戲城 +SAV_Misc3.TAB_Joyful=小遊戲 SAV_Misc3.TAB_Main=主介面 SAV_Misc3.Tab_Paintings=肖像 SAV_Misc3.Tab_Pokeblocks=寶可方塊 @@ -2390,7 +2391,7 @@ SAV_Trainer7.L_R=輪盤: SAV_Trainer7.L_Region=地區: SAV_Trainer7.L_Regular=一般 SAV_Trainer7.L_RotomAffection=友好度: -SAV_Trainer7.L_RotomOT=洛托姆昵稱: +SAV_Trainer7.L_RotomOT=訓練家暱稱: SAV_Trainer7.L_Seconds=秒: SAV_Trainer7.L_SkinColor=皮膚顏色: SAV_Trainer7.L_SnapCount=拍照數: From 230c1aaf6062ad71d7e657ba91a81321fa2142c4 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 2 May 2026 21:44:14 -0500 Subject: [PATCH 08/81] Add mirage island force appear button cheat Closes #4791 --- .../Save Editors/Gen3/SAV_Misc3.Designer.cs | 42 +++++++++++++++++++ .../Subforms/Save Editors/Gen3/SAV_Misc3.cs | 23 ++++++++++ 2 files changed, 65 insertions(+) diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen3/SAV_Misc3.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen3/SAV_Misc3.Designer.cs index 3168dcd98..e0c079c09 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen3/SAV_Misc3.Designer.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen3/SAV_Misc3.Designer.cs @@ -163,6 +163,9 @@ private void InitializeComponent() TB_SID = new System.Windows.Forms.MaskedTextBox(); NUD_Painting = new System.Windows.Forms.NumericUpDown(); CHK_EnablePaint = new System.Windows.Forms.CheckBox(); + Tab_Other = new System.Windows.Forms.TabPage(); + FLP_Other = new System.Windows.Forms.FlowLayoutPanel(); + B_ForceMirageIsland = new System.Windows.Forms.Button(); TC_Misc.SuspendLayout(); TAB_Main.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)NUD_BPEarned).BeginInit(); @@ -209,6 +212,8 @@ private void InitializeComponent() GB_Painting.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)NUD_Caption).BeginInit(); ((System.ComponentModel.ISupportInitialize)NUD_Painting).BeginInit(); + Tab_Other.SuspendLayout(); + FLP_Other.SuspendLayout(); SuspendLayout(); // // B_Save @@ -246,6 +251,7 @@ private void InitializeComponent() TC_Misc.Controls.Add(Tab_Pokeblocks); TC_Misc.Controls.Add(Tab_Decorations); TC_Misc.Controls.Add(Tab_Paintings); + TC_Misc.Controls.Add(Tab_Other); TC_Misc.Location = new System.Drawing.Point(14, 14); TC_Misc.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); TC_Misc.Multiline = true; @@ -1784,6 +1790,37 @@ private void InitializeComponent() CHK_EnablePaint.UseVisualStyleBackColor = true; CHK_EnablePaint.CheckedChanged += CHK_EnablePaint_CheckedChanged; // + // Tab_Other + // + Tab_Other.Controls.Add(FLP_Other); + Tab_Other.Location = new System.Drawing.Point(4, 48); + Tab_Other.Name = "Tab_Other"; + Tab_Other.Padding = new System.Windows.Forms.Padding(3); + Tab_Other.Size = new System.Drawing.Size(357, 230); + Tab_Other.TabIndex = 8; + Tab_Other.Text = "Other"; + Tab_Other.UseVisualStyleBackColor = true; + // + // FLP_Other + // + FLP_Other.Controls.Add(B_ForceMirageIsland); + FLP_Other.Dock = System.Windows.Forms.DockStyle.Fill; + FLP_Other.Location = new System.Drawing.Point(3, 3); + FLP_Other.Name = "FLP_Other"; + FLP_Other.Size = new System.Drawing.Size(351, 224); + FLP_Other.TabIndex = 0; + // + // B_ForceMirageIsland + // + B_ForceMirageIsland.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + B_ForceMirageIsland.Location = new System.Drawing.Point(3, 3); + B_ForceMirageIsland.Name = "B_ForceMirageIsland"; + B_ForceMirageIsland.Size = new System.Drawing.Size(240, 48); + B_ForceMirageIsland.TabIndex = 0; + B_ForceMirageIsland.Text = "Mirage Island Appear: Match First Party Member"; + B_ForceMirageIsland.UseVisualStyleBackColor = true; + B_ForceMirageIsland.Click += B_ForceMirageIsland_Click; + // // SAV_Misc3 // AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; @@ -1853,6 +1890,8 @@ private void InitializeComponent() GB_Painting.PerformLayout(); ((System.ComponentModel.ISupportInitialize)NUD_Caption).EndInit(); ((System.ComponentModel.ISupportInitialize)NUD_Painting).EndInit(); + Tab_Other.ResumeLayout(false); + FLP_Other.ResumeLayout(false); ResumeLayout(false); } @@ -1990,5 +2029,8 @@ private void InitializeComponent() private System.Windows.Forms.Label L_Mode; private System.Windows.Forms.Label L_Facility; private System.Windows.Forms.Label L_Continue; + private System.Windows.Forms.TabPage Tab_Other; + private System.Windows.Forms.FlowLayoutPanel FLP_Other; + private System.Windows.Forms.Button B_ForceMirageIsland; } } diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen3/SAV_Misc3.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen3/SAV_Misc3.cs index ef5117f37..34cb4e612 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen3/SAV_Misc3.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen3/SAV_Misc3.cs @@ -35,6 +35,8 @@ public SAV_Misc3(SAV3 sav) TC_Misc.Controls.Remove(Tab_Pokeblocks); TC_Misc.Controls.Remove(Tab_Decorations); TC_Misc.Controls.Remove(Tab_Paintings); + + FLP_Other.Controls.Remove(B_ForceMirageIsland); } if (SAV.SmallBlock is ISaveBlock3SmallExpansion j) @@ -53,6 +55,9 @@ public SAV_Misc3(SAV3 sav) TC_Misc.Controls.Remove(TAB_BF); } + if (FLP_Other.Controls.Count == 0) + TC_Misc.Controls.Remove(Tab_Other); + if (SAV is SAV3FRLG frlg) { TB_RivalName.Text = frlg.RivalName; @@ -762,4 +767,22 @@ private void ValidatePaintingIDs() TB_SID.Text = sid.ToString(); } #endregion + + private void B_ForceMirageIsland_Click(object sender, EventArgs e) + { + if (SAV.SmallBlock is not ISaveBlock3SmallHoenn) // Only run for R/S/E + return; + + // Set the mirage island value to match the PID of the first party Pokémon, which will trigger the island to appear in-game. + + // First Party member slot is at offset 0 of party data. + var party1 = SAV.LargeBlock.PartyBuffer; + // PK3 structure: PID is at offset 0 of a PK3, and is 4 bytes long. We only need the lower 2 bytes for the mirage island compare value. + var pidLow = System.Buffers.Binary.BinaryPrimitives.ReadUInt16LittleEndian(party1); + + // Mirage island rand value is work val 0x24. + SAV.SetWork(0x24, pidLow); + B_ForceMirageIsland.Enabled = false; // disable to indicate the cheat was activated. + WinFormsUtil.Asterisk(); + } } From 55f47f0f8910aea8f579bd6412aeebaade204df5 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 2 May 2026 21:52:15 -0500 Subject: [PATCH 09/81] Update translations for prior commit commit: 230c1aaf6062ad71d7e657ba91a81321fa2142c4 --- PKHeX.WinForms/Resources/text/lang_de.txt | 2 ++ PKHeX.WinForms/Resources/text/lang_en.txt | 2 ++ PKHeX.WinForms/Resources/text/lang_es-419.txt | 2 ++ PKHeX.WinForms/Resources/text/lang_es.txt | 2 ++ PKHeX.WinForms/Resources/text/lang_fr.txt | 2 ++ PKHeX.WinForms/Resources/text/lang_it.txt | 2 ++ PKHeX.WinForms/Resources/text/lang_ja.txt | 2 ++ PKHeX.WinForms/Resources/text/lang_ko.txt | 2 ++ PKHeX.WinForms/Resources/text/lang_zh-Hans.txt | 2 ++ PKHeX.WinForms/Resources/text/lang_zh-Hant.txt | 2 ++ 10 files changed, 20 insertions(+) diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index 47c8d043f..26c5cab6b 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -1420,6 +1420,7 @@ SAV_Misc2.B_Cancel=Abbrechen SAV_Misc2.B_Save=Speichern SAV_Misc2.B_VirtualConsoleGSBall=GS-Ball-Event aktivieren (Virtual Console) SAV_Misc3.B_Cancel=Abbrechen +SAV_Misc3.B_ForceMirageIsland=Wundereiland aktivieren: Erstes Team-Pokémon abgleichen SAV_Misc3.B_GetTickets=Erhalte Tickets SAV_Misc3.B_PokeblockAll=Alle erhalten SAV_Misc3.B_PokeblockDel=Alle löschen @@ -1489,6 +1490,7 @@ SAV_Misc3.Tab_Decorations=Dekorationen SAV_Misc3.TAB_Ferry=Fähre SAV_Misc3.TAB_Joyful=Minispiele SAV_Misc3.TAB_Main=Verschiedenes +SAV_Misc3.Tab_Other=Andere SAV_Misc3.Tab_Paintings=Gemälde SAV_Misc3.Tab_Pokeblocks=Pokériegel SAV_Misc3.Tab_Records=Statistik diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index b73e61080..57ab179af 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -1420,6 +1420,7 @@ SAV_Misc2.B_Cancel=Cancel SAV_Misc2.B_Save=Save SAV_Misc2.B_VirtualConsoleGSBall=Enable GS Ball Event (Virtual Console) SAV_Misc3.B_Cancel=Cancel +SAV_Misc3.B_ForceMirageIsland=Mirage Island Appear: Match First Party Member SAV_Misc3.B_GetTickets=Get Tickets SAV_Misc3.B_PokeblockAll=Give All SAV_Misc3.B_PokeblockDel=Delete All @@ -1489,6 +1490,7 @@ SAV_Misc3.Tab_Decorations=Decorations SAV_Misc3.TAB_Ferry=Ferry SAV_Misc3.TAB_Joyful=Minigames SAV_Misc3.TAB_Main=Main +SAV_Misc3.Tab_Other=Other SAV_Misc3.Tab_Paintings=Paintings SAV_Misc3.Tab_Pokeblocks=Pokéblocks SAV_Misc3.Tab_Records=Records diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index abb3da5cd..506ef3585 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -1420,6 +1420,7 @@ SAV_Misc2.B_Cancel=Cancelar SAV_Misc2.B_Save=Guardar SAV_Misc2.B_VirtualConsoleGSBall=Activar Evento GS Ball (Virtual Console) SAV_Misc3.B_Cancel=Cancelar +SAV_Misc3.B_ForceMirageIsland=Hacer aparecer Isla Mirage: Coincidir con el primer Pokémon del equipo SAV_Misc3.B_GetTickets=Obtener Tickets SAV_Misc3.B_PokeblockAll=Obtener todos SAV_Misc3.B_PokeblockDel=Quitar todos @@ -1489,6 +1490,7 @@ SAV_Misc3.Tab_Decorations=Adornos SAV_Misc3.TAB_Ferry=Ferry SAV_Misc3.TAB_Joyful=Minijuegos SAV_Misc3.TAB_Main=Inicio +SAV_Misc3.Tab_Other=Otros SAV_Misc3.Tab_Paintings=Pinturas SAV_Misc3.Tab_Pokeblocks=Pokécubos SAV_Misc3.Tab_Records=Registros diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index 712838b7c..1b52d8746 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -1420,6 +1420,7 @@ SAV_Misc2.B_Cancel=Cancelar SAV_Misc2.B_Save=Guardar SAV_Misc2.B_VirtualConsoleGSBall=Activar Evento GS Ball (Virtual Console) SAV_Misc3.B_Cancel=Cancelar +SAV_Misc3.B_ForceMirageIsland=Hacer aparecer Isla Espejismo: Coincidir con el primer Pokémon del equipo SAV_Misc3.B_GetTickets=Obtener Tickets SAV_Misc3.B_PokeblockAll=Obtener todos SAV_Misc3.B_PokeblockDel=Quitar todos @@ -1489,6 +1490,7 @@ SAV_Misc3.Tab_Decorations=Adornos SAV_Misc3.TAB_Ferry=Ferry SAV_Misc3.TAB_Joyful=Minijuegos SAV_Misc3.TAB_Main=Inicio +SAV_Misc3.Tab_Other=Otros SAV_Misc3.Tab_Paintings=Pinturas SAV_Misc3.Tab_Pokeblocks=Pokécubos SAV_Misc3.Tab_Records=Registros diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index 8f9a7dd4b..ffddb03ae 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -1420,6 +1420,7 @@ SAV_Misc2.B_Cancel=Annuler SAV_Misc2.B_Save=Sauvegarder SAV_Misc2.B_VirtualConsoleGSBall=Activer évènement GS Ball (Console Virtuelle) SAV_Misc3.B_Cancel=Annuler +SAV_Misc3.B_ForceMirageIsland=Faire apparaître l'Île Mirage : correspond au premier Pokémon de l'équipe SAV_Misc3.B_GetTickets=Obtenir tickets SAV_Misc3.B_PokeblockAll=Tout donner SAV_Misc3.B_PokeblockDel=Tout supprimer @@ -1489,6 +1490,7 @@ SAV_Misc3.Tab_Decorations=Décorations SAV_Misc3.TAB_Ferry=Ferry SAV_Misc3.TAB_Joyful=Mini-jeux SAV_Misc3.TAB_Main=Principal +SAV_Misc3.Tab_Other=Autres SAV_Misc3.Tab_Paintings=Peintures SAV_Misc3.Tab_Pokeblocks=Pokéblocs SAV_Misc3.Tab_Records=Records diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index 41c786289..92558fb17 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -1420,6 +1420,7 @@ SAV_Misc2.B_Cancel=Annulla SAV_Misc2.B_Save=Salva SAV_Misc2.B_VirtualConsoleGSBall=Attiva evento Celebi (Virtual Console) SAV_Misc3.B_Cancel=Annulla +SAV_Misc3.B_ForceMirageIsland=Fai apparire Isola Miraggio: abbina il primo Pokémon in squadra SAV_Misc3.B_GetTickets=Ottieni Biglietti SAV_Misc3.B_PokeblockAll=Dai Tutto SAV_Misc3.B_PokeblockDel=Elimina Tutto @@ -1489,6 +1490,7 @@ SAV_Misc3.Tab_Decorations=Decorazioni SAV_Misc3.TAB_Ferry=Traghetto SAV_Misc3.TAB_Joyful=Minigiochi SAV_Misc3.TAB_Main=Principale +SAV_Misc3.Tab_Other=Altro SAV_Misc3.Tab_Paintings=Dipinti SAV_Misc3.Tab_Pokeblocks=Pokémelle SAV_Misc3.Tab_Records=Record diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index 846283091..09b07a560 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -1420,6 +1420,7 @@ SAV_Misc2.B_Cancel=キャンセル SAV_Misc2.B_Save=保存 SAV_Misc2.B_VirtualConsoleGSBall=GSボールイベント有効化(VC) SAV_Misc3.B_Cancel=キャンセル +SAV_Misc3.B_ForceMirageIsland=まぼろしじま出現: 手持ち先頭と一致 SAV_Misc3.B_GetTickets=チケット入手 SAV_Misc3.B_PokeblockAll=全て取得 SAV_Misc3.B_PokeblockDel=全て消去 @@ -1489,6 +1490,7 @@ SAV_Misc3.Tab_Decorations=グッズ SAV_Misc3.TAB_Ferry=タイドリップ号 SAV_Misc3.TAB_Joyful=ミニゲーム SAV_Misc3.TAB_Main=メイン +SAV_Misc3.Tab_Other=その他 SAV_Misc3.Tab_Paintings=絵画 SAV_Misc3.Tab_Pokeblocks=ポロック SAV_Misc3.Tab_Records=記録 diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index 094713c17..caf040fa4 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -1420,6 +1420,7 @@ SAV_Misc2.B_Cancel=취소 SAV_Misc2.B_Save=저장 SAV_Misc2.B_VirtualConsoleGSBall=GS볼 이벤트 활성화 (버추얼 콘솔) SAV_Misc3.B_Cancel=취소 +SAV_Misc3.B_ForceMirageIsland=환상섬 출현: 첫 번째 파티 포켓몬과 일치 SAV_Misc3.B_GetTickets=티켓 받기 SAV_Misc3.B_PokeblockAll=모두 주기 SAV_Misc3.B_PokeblockDel=모두 삭제 @@ -1489,6 +1490,7 @@ SAV_Misc3.Tab_Decorations=굿즈 SAV_Misc3.TAB_Ferry=페리 SAV_Misc3.TAB_Joyful=미니게임 SAV_Misc3.TAB_Main=기본 +SAV_Misc3.Tab_Other=기타 SAV_Misc3.Tab_Paintings=그림 SAV_Misc3.Tab_Pokeblocks=포켓몬스넥 SAV_Misc3.Tab_Records=기록 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index 63f72812d..636511cf5 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -1420,6 +1420,7 @@ SAV_Misc2.B_Cancel=取消 SAV_Misc2.B_Save=保存 SAV_Misc2.B_VirtualConsoleGSBall=启用GS球事件(虚拟主机) SAV_Misc3.B_Cancel=取消 +SAV_Misc3.B_ForceMirageIsland=幻之岛出现: 匹配队伍首位宝可梦 SAV_Misc3.B_GetTickets=获得船票 SAV_Misc3.B_PokeblockAll=获得全部 SAV_Misc3.B_PokeblockDel=删除全部 @@ -1489,6 +1490,7 @@ SAV_Misc3.Tab_Decorations=物品 SAV_Misc3.TAB_Ferry=游轮 SAV_Misc3.TAB_Joyful=小游戏 SAV_Misc3.TAB_Main=主界面 +SAV_Misc3.Tab_Other=其他 SAV_Misc3.Tab_Paintings=肖像 SAV_Misc3.Tab_Pokeblocks=宝可方块 SAV_Misc3.Tab_Records=记录 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index b111abc25..682f9f559 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -1420,6 +1420,7 @@ SAV_Misc2.B_Cancel=取消 SAV_Misc2.B_Save=保存 SAV_Misc2.B_VirtualConsoleGSBall=啟用GS球事件(虛擬主機) SAV_Misc3.B_Cancel=取消 +SAV_Misc3.B_ForceMirageIsland=幻之島出現: 符合隊伍首位寶可夢 SAV_Misc3.B_GetTickets=獲得船票 SAV_Misc3.B_PokeblockAll=獲得全部 SAV_Misc3.B_PokeblockDel=刪除全部 @@ -1489,6 +1490,7 @@ SAV_Misc3.Tab_Decorations=物品 SAV_Misc3.TAB_Ferry=遊輪 SAV_Misc3.TAB_Joyful=小遊戲 SAV_Misc3.TAB_Main=主介面 +SAV_Misc3.Tab_Other=其他 SAV_Misc3.Tab_Paintings=肖像 SAV_Misc3.Tab_Pokeblocks=寶可方塊 SAV_Misc3.Tab_Records=記錄 From f2ffca749fa222bbd32a458df68c671381b29932 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 3 May 2026 00:55:13 -0500 Subject: [PATCH 10/81] Gen9a: fix 2^32 solver end chunk search uint cast, was an "exclusive range" so it truncated back to 0, immediately terminating the loop and not searching the highest-end of seeds. replace with tuple deconstruct so they stay as ulongs. --- .../Legality/Encounters/Templates/Gen9a/LumioseSolver.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen9a/LumioseSolver.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen9a/LumioseSolver.cs index 61439a7bd..9d44da953 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen9a/LumioseSolver.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen9a/LumioseSolver.cs @@ -224,9 +224,7 @@ private static bool TryGetSeedNoPID(in GenerateParam9a param, PKM pk, out ulong { if (Volatile.Read(ref found)) { state.Stop(); return; } - uint start = (uint)range.start; - uint endExclusive = (uint)range.end; // safe due to batching within 0..2^32 - + var (start, endExclusive) = range; // keep as ulong, can't overflow since endExclusive is at most 2^32 for (ulong high = start; high < endExclusive; high++) { if (Volatile.Read(ref found)) { state.Stop(); return; } From 571de117fbc88b463b557a19c955beec76f8ea1b Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 3 May 2026 22:33:29 -0500 Subject: [PATCH 11/81] Allow downwards traversal for evo move check https://projectpokemon.org/home/forums/topic/67681-move-evolution-pokemon-from-gen-4-gen-7-flagging-at-level-100/#findComment-299264 --- PKHeX.Core/Legality/LearnSource/Group/LearnGroup8.cs | 7 +++++++ PKHeX.Core/Legality/LearnSource/Group/LearnGroup8a.cs | 2 +- PKHeX.Core/Legality/LearnSource/Group/LearnGroup8b.cs | 2 +- PKHeX.Core/Legality/LearnSource/Group/LearnGroup9.cs | 2 +- PKHeX.Core/Legality/LearnSource/Group/LearnGroup9a.cs | 2 +- .../Legality/LearnSource/Group/LearnGroupHOME.cs | 3 ++- .../Legality/LearnSource/Sources/Shared/LearnOption.cs | 10 +++++++++- .../Legality/Restrictions/EvolutionRestrictions.cs | 4 ++-- .../Restrictions/Memories/MemoryPermissions.cs | 4 ++-- 9 files changed, 26 insertions(+), 10 deletions(-) diff --git a/PKHeX.Core/Legality/LearnSource/Group/LearnGroup8.cs b/PKHeX.Core/Legality/LearnSource/Group/LearnGroup8.cs index ed091462b..2eed4275c 100644 --- a/PKHeX.Core/Legality/LearnSource/Group/LearnGroup8.cs +++ b/PKHeX.Core/Legality/LearnSource/Group/LearnGroup8.cs @@ -13,6 +13,13 @@ public sealed class LearnGroup8 : ILearnGroup public ushort MaxMoveID => Legal.MaxMoveID_8; public ILearnGroup? GetPrevious(PKM pk, EvolutionHistory history, IEncounterTemplate enc, LearnOption option) + { + if (option is LearnOption.AtAnyTimeChain) + return LearnGroupHOME.Instance; + return GoBackwards(pk, history, enc, option); + } + + internal static ILearnGroup? GoBackwards(PKM pk, EvolutionHistory history, IEncounterTemplate enc, LearnOption option) { if (enc.Generation >= Generation) return null; diff --git a/PKHeX.Core/Legality/LearnSource/Group/LearnGroup8a.cs b/PKHeX.Core/Legality/LearnSource/Group/LearnGroup8a.cs index 7af432530..aae1b745e 100644 --- a/PKHeX.Core/Legality/LearnSource/Group/LearnGroup8a.cs +++ b/PKHeX.Core/Legality/LearnSource/Group/LearnGroup8a.cs @@ -12,7 +12,7 @@ public sealed class LearnGroup8a : ILearnGroup private const EntityContext Context = EntityContext.Gen8a; public ushort MaxMoveID => Legal.MaxMoveID_8a; - public ILearnGroup? GetPrevious(PKM pk, EvolutionHistory history, IEncounterTemplate enc, LearnOption option) => null; + public ILearnGroup? GetPrevious(PKM pk, EvolutionHistory history, IEncounterTemplate enc, LearnOption option) => option == LearnOption.AtAnyTimeChain ? LearnGroupHOME.Instance : null; public bool HasVisited(PKM pk, EvolutionHistory history) => history.HasVisitedPLA; public bool Check(Span result, ReadOnlySpan current, PKM pk, EvolutionHistory history, diff --git a/PKHeX.Core/Legality/LearnSource/Group/LearnGroup8b.cs b/PKHeX.Core/Legality/LearnSource/Group/LearnGroup8b.cs index 5225e0c90..55ee16b40 100644 --- a/PKHeX.Core/Legality/LearnSource/Group/LearnGroup8b.cs +++ b/PKHeX.Core/Legality/LearnSource/Group/LearnGroup8b.cs @@ -12,7 +12,7 @@ public sealed class LearnGroup8b : ILearnGroup private const EntityContext Context = EntityContext.Gen8b; public ushort MaxMoveID => Legal.MaxMoveID_8b; - public ILearnGroup? GetPrevious(PKM pk, EvolutionHistory history, IEncounterTemplate enc, LearnOption option) => null; + public ILearnGroup? GetPrevious(PKM pk, EvolutionHistory history, IEncounterTemplate enc, LearnOption option) => option == LearnOption.AtAnyTimeChain ? LearnGroupHOME.Instance : null; public bool HasVisited(PKM pk, EvolutionHistory history) => history.HasVisitedBDSP; public bool Check(Span result, ReadOnlySpan current, PKM pk, EvolutionHistory history, diff --git a/PKHeX.Core/Legality/LearnSource/Group/LearnGroup9.cs b/PKHeX.Core/Legality/LearnSource/Group/LearnGroup9.cs index f88ebd1d5..8f5bc6c68 100644 --- a/PKHeX.Core/Legality/LearnSource/Group/LearnGroup9.cs +++ b/PKHeX.Core/Legality/LearnSource/Group/LearnGroup9.cs @@ -12,7 +12,7 @@ public sealed class LearnGroup9 : ILearnGroup private const EntityContext Context = EntityContext.Gen9; public ushort MaxMoveID => Legal.MaxMoveID_9; - public ILearnGroup? GetPrevious(PKM pk, EvolutionHistory history, IEncounterTemplate enc, LearnOption option) => null; + public ILearnGroup? GetPrevious(PKM pk, EvolutionHistory history, IEncounterTemplate enc, LearnOption option) => option == LearnOption.AtAnyTimeChain ? LearnGroupHOME.Instance : null; public bool HasVisited(PKM pk, EvolutionHistory history) => history.HasVisitedGen9; public bool Check(Span result, ReadOnlySpan current, PKM pk, EvolutionHistory history, diff --git a/PKHeX.Core/Legality/LearnSource/Group/LearnGroup9a.cs b/PKHeX.Core/Legality/LearnSource/Group/LearnGroup9a.cs index d9fcd5cc0..576ed1002 100644 --- a/PKHeX.Core/Legality/LearnSource/Group/LearnGroup9a.cs +++ b/PKHeX.Core/Legality/LearnSource/Group/LearnGroup9a.cs @@ -12,7 +12,7 @@ public sealed class LearnGroup9a : ILearnGroup private const EntityContext Context = EntityContext.Gen9a; public ushort MaxMoveID => Legal.MaxMoveID_9a; - public ILearnGroup? GetPrevious(PKM pk, EvolutionHistory history, IEncounterTemplate enc, LearnOption option) => null; + public ILearnGroup? GetPrevious(PKM pk, EvolutionHistory history, IEncounterTemplate enc, LearnOption option) => option == LearnOption.AtAnyTimeChain ? LearnGroupHOME.Instance : null; public bool HasVisited(PKM pk, EvolutionHistory history) => history.HasVisitedZA; public bool Check(Span result, ReadOnlySpan current, PKM pk, EvolutionHistory history, diff --git a/PKHeX.Core/Legality/LearnSource/Group/LearnGroupHOME.cs b/PKHeX.Core/Legality/LearnSource/Group/LearnGroupHOME.cs index f3e40c78b..d2c35072d 100644 --- a/PKHeX.Core/Legality/LearnSource/Group/LearnGroupHOME.cs +++ b/PKHeX.Core/Legality/LearnSource/Group/LearnGroupHOME.cs @@ -15,7 +15,8 @@ public sealed class LearnGroupHOME : ILearnGroup private const LearnOption Option = LearnOption.HOME; public ushort MaxMoveID => 0; - public ILearnGroup? GetPrevious(PKM pk, EvolutionHistory history, IEncounterTemplate enc, LearnOption option) => null; + public ILearnGroup? GetPrevious(PKM pk, EvolutionHistory history, IEncounterTemplate enc, LearnOption option) => + option is LearnOption.AtAnyTimeChain ? LearnGroup8.GoBackwards(pk, history, enc, option) : null; public bool HasVisited(PKM pk, EvolutionHistory history) => pk is IHomeTrack { HasTracker: true } || !ParseSettings.IgnoreTransferIfNoTracker; public bool Check(Span result, ReadOnlySpan current, PKM pk, EvolutionHistory history, diff --git a/PKHeX.Core/Legality/LearnSource/Sources/Shared/LearnOption.cs b/PKHeX.Core/Legality/LearnSource/Sources/Shared/LearnOption.cs index 14c281516..9e860f760 100644 --- a/PKHeX.Core/Legality/LearnSource/Sources/Shared/LearnOption.cs +++ b/PKHeX.Core/Legality/LearnSource/Sources/Shared/LearnOption.cs @@ -28,6 +28,14 @@ public enum LearnOption /// Required to be distinct in that the rules are different from the other two options. TR/TM flags aren't required if the move was learned via HOME. /// HOME, + + /// + /// Check backwards of knowing moves within any game in the visitation chain. + /// + /// + /// Relevant for Evolution move sanity checks, where the move could have been picked up at any point in the game visitation chain. + /// + AtAnyTimeChain, } public static class LearnOptionExtensions @@ -35,7 +43,7 @@ public static class LearnOptionExtensions extension(LearnOption option) { public bool IsCurrent() => option == LearnOption.Current; - public bool IsPast() => option is LearnOption.AtAnyTime or LearnOption.HOME; + public bool IsPast() => option is LearnOption.AtAnyTime or LearnOption.HOME or LearnOption.AtAnyTimeChain; public bool IsFlagCheckRequired() => option != LearnOption.HOME; } } diff --git a/PKHeX.Core/Legality/Restrictions/EvolutionRestrictions.cs b/PKHeX.Core/Legality/Restrictions/EvolutionRestrictions.cs index ec54e71ca..9584c80c0 100644 --- a/PKHeX.Core/Legality/Restrictions/EvolutionRestrictions.cs +++ b/PKHeX.Core/Legality/Restrictions/EvolutionRestrictions.cs @@ -130,7 +130,7 @@ public static bool IsValidEvolutionWithMove(PKM pk, LegalInfo info) if (move is EEVEE) return IsValidEvolutionWithMoveAny(enc, EeveeFairyMoves, pruned, pk, head); - return MemoryPermissions.GetCanKnowMove(enc, move, pruned, pk, head); + return MemoryPermissions.GetCanKnowMove(enc, move, pruned, pk, head, LearnOption.AtAnyTimeChain); } private static bool IsMoveInRelearnSource(PKM pk, LegalInfo info, ushort move) @@ -182,7 +182,7 @@ private static bool IsValidEvolutionWithMoveAny(IEncounterTemplate enc, ReadOnly { foreach (var move in any) { - if (MemoryPermissions.GetCanKnowMove(enc, move, history, pk, head)) + if (MemoryPermissions.GetCanKnowMove(enc, move, history, pk, head, LearnOption.AtAnyTimeChain)) return true; } return false; diff --git a/PKHeX.Core/Legality/Restrictions/Memories/MemoryPermissions.cs b/PKHeX.Core/Legality/Restrictions/Memories/MemoryPermissions.cs index b7512c472..845474b0c 100644 --- a/PKHeX.Core/Legality/Restrictions/Memories/MemoryPermissions.cs +++ b/PKHeX.Core/Legality/Restrictions/Memories/MemoryPermissions.cs @@ -161,11 +161,11 @@ private static bool GetCanKnowMove(PKM pk, ushort move, EntityContext context, E return GetCanKnowMove(enc, move, history, pk, game); } - public static bool GetCanKnowMove(IEncounterTemplate enc, ushort move, EvolutionHistory history, PKM pk, ILearnGroup game) + public static bool GetCanKnowMove(IEncounterTemplate enc, ushort move, EvolutionHistory history, PKM pk, ILearnGroup game, LearnOption option = LearnOption.AtAnyTime) { Span result = stackalloc MoveResult[1]; Span moves = [move]; - LearnVerifierHistory.MarkAndIterate(result, moves, enc, pk, history, game, MoveSourceType.All, LearnOption.AtAnyTime); + LearnVerifierHistory.MarkAndIterate(result, moves, enc, pk, history, game, MoveSourceType.All, option); return result[0].Valid; } From de5e983fafea128e668d30490dcd44ec3ac7888b Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 3 May 2026 22:34:55 -0500 Subject: [PATCH 12/81] Differentiate HG/SS save files (no HGSS) Pt/HG/SS store the ROMCode, but D/P do not. In D/P, every "get version" function for the ROM is inlined to return a fixed value, not from the save file. --- PKHeX.Core/Saves/SAV4.cs | 34 ++++++++++++++++--- PKHeX.Core/Saves/SAV4HGSS.cs | 2 +- .../Save Editors/SAV_SimpleTrainer.cs | 2 +- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/PKHeX.Core/Saves/SAV4.cs b/PKHeX.Core/Saves/SAV4.cs index 9533b0ce2..c46087cd1 100644 --- a/PKHeX.Core/Saves/SAV4.cs +++ b/PKHeX.Core/Saves/SAV4.cs @@ -300,18 +300,44 @@ public override int Language set => General[Trainer1 + 0x19] = (byte)value; } - public int Badges + public byte Badges { get => General[Trainer1 + 0x1A]; - set { if (value < 0) return; General[Trainer1 + 0x1A] = (byte)value; } + set => General[Trainer1 + 0x1A] = value; } - public int Sprite + public byte Sprite { get => General[Trainer1 + 0x1B]; - set { if (value < 0) return; General[Trainer1 + 0x1B] = (byte)value; } + set => General[Trainer1 + 0x1B] = value; } + public byte ROMCode // Unused by D/P + { + get => General[Trainer1 + 0x1C]; + set => General[Trainer1 + 0x1C] = value; + } + + public byte ProgressFlags + { + get => General[Trainer1 + 0x1D]; + set => General[Trainer1 + 0x1D] = value; + } + + public bool GameClear + { + get => (ProgressFlags & 1) == 1; + set => ProgressFlags = (byte)((ProgressFlags & 0xFE) | (value ? 1 : 0)); + } + + public bool NationalDex + { + get => (ProgressFlags & 2) == 2; + set => ProgressFlags = (byte)((ProgressFlags & 0xFD) | (value ? 2 : 0)); + } + + // 1E-1F are unused (alignment) + public uint Coin { get => ReadUInt16LittleEndian(General[(Trainer1 + 0x20)..]); diff --git a/PKHeX.Core/Saves/SAV4HGSS.cs b/PKHeX.Core/Saves/SAV4HGSS.cs index 09b7d7706..d05523d71 100644 --- a/PKHeX.Core/Saves/SAV4HGSS.cs +++ b/PKHeX.Core/Saves/SAV4HGSS.cs @@ -26,7 +26,7 @@ public SAV4HGSS(Memory data) : base(data, GeneralSize, StorageSize, Genera public override Zukan4 Dex { get; } protected override SAV4 CloneInternal4() => State.Exportable ? new SAV4HGSS(Data.ToArray()) : new SAV4HGSS(); - public override GameVersion Version { get => GameVersion.HGSS; set { } } + public override GameVersion Version { get => (GameVersion)ROMCode; set => ROMCode = (byte)value; } public override PersonalTable4 Personal => PersonalTable.HGSS; public override ReadOnlySpan HeldItems => Legal.HeldItems_HGSS; public override int MaxItemID => Legal.MaxItemID_4_HGSS; diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_SimpleTrainer.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_SimpleTrainer.cs index d2fbceeac..57256d805 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_SimpleTrainer.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_SimpleTrainer.cs @@ -288,7 +288,7 @@ private void B_Save_Click(object sender, EventArgs e) sav4.Z = (int)NUD_Z.Value; sav4.Y = (int)NUD_Y.Value; } - sav4.Badges = badgeval & 0xFF; + sav4.Badges = (byte)badgeval; if (sav4 is SAV4HGSS hgss) { hgss.Badges16 = badgeval >> 8; From 22083b07c510bd44b01049bd488e4175e965a7b4 Mon Sep 17 00:00:00 2001 From: Kurt Date: Mon, 4 May 2026 09:20:55 -0500 Subject: [PATCH 13/81] Fix inverted shedinja affix ribbon loss check --- PKHeX.Core/Legality/Verifiers/MarkVerifier.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PKHeX.Core/Legality/Verifiers/MarkVerifier.cs b/PKHeX.Core/Legality/Verifiers/MarkVerifier.cs index 3a12c0f9b..43a07d3cc 100644 --- a/PKHeX.Core/Legality/Verifiers/MarkVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/MarkVerifier.cs @@ -129,8 +129,8 @@ private void VerifyShedinjaAffixed(LegalityAnalysis data, RibbonIndex affix, PKM clone.Species = (int) Species.Nincada; var args = new RibbonVerifierArguments(clone, enc, data.Info.EvoChainsAllGens); affix.Fix(args, true); - bool invalid = RibbonVerifier.IsValidExtra(affix, args); - var severity = invalid ? Severity.Invalid : Severity.Fishy; + var valid = RibbonVerifier.IsValidExtra(affix, args); + var severity = !valid ? Severity.Invalid : Severity.Fishy; data.AddLine(Get(severity, RibbonMarkingAffixed_0, (ushort)affix)); } From 3e7caeec0918e1ffa38e87749182ab55de618349 Mon Sep 17 00:00:00 2001 From: Ka-n00b Date: Mon, 4 May 2026 17:21:03 -0400 Subject: [PATCH 14/81] Translation Updates (#4799) * Update legality_es-419.json * Update legality_es.json * Update legality_it.json * Update text_rsefrlg_00000_de.txt * Update text_rsefrlg_00000_fr.txt * Update text_rsefrlg_00000_it.txt * Update lang_de.txt * Update lang_es-419.txt * Update lang_es.txt * Update lang_fr.txt * Update lang_it.txt * Update lang_ko.txt * Update legality_de.json * Update legality_es.json * Update legality_es-419.json * Update lang_it.txt * Update lang_fr.txt * Update lang_it.txt * Update lang_es-419.txt * Update lang_es.txt * Update lang_fr.txt * Update lang_it.txt --- .../localize/legality/legality_de.json | 20 ++--- .../localize/legality/legality_es-419.json | 8 +- .../localize/legality/legality_es.json | 8 +- .../localize/legality/legality_it.json | 2 +- .../locations/gen3/text_rsefrlg_00000_de.txt | 28 +++--- .../locations/gen3/text_rsefrlg_00000_fr.txt | 4 +- .../locations/gen3/text_rsefrlg_00000_it.txt | 22 ++--- PKHeX.WinForms/Resources/text/lang_de.txt | 56 ++++++------ PKHeX.WinForms/Resources/text/lang_es-419.txt | 34 +++---- PKHeX.WinForms/Resources/text/lang_es.txt | 34 +++---- PKHeX.WinForms/Resources/text/lang_fr.txt | 42 ++++----- PKHeX.WinForms/Resources/text/lang_it.txt | 90 +++++++++---------- PKHeX.WinForms/Resources/text/lang_ko.txt | 2 +- 13 files changed, 175 insertions(+), 175 deletions(-) diff --git a/PKHeX.Core/Resources/localize/legality/legality_de.json b/PKHeX.Core/Resources/localize/legality/legality_de.json index 7d0f0823a..2b25b95a6 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_de.json +++ b/PKHeX.Core/Resources/localize/legality/legality_de.json @@ -15,7 +15,7 @@ "AbilityHiddenFail": "Versteckte Fähigkeit passt nicht zum Begegnungstyp.", "AbilityHiddenUnavailable": "Versteckte Fähigkeit nicht verfügbar.", "AbilityMismatch": "Fähigkeit passt nicht zur Begegnung.", - "AbilityMismatch3": "Fähigkeit entspricht nicht der Spezies-Fähigkeit aus Generation 3", + "AbilityMismatch3": "Fähigkeit entspricht nicht der Spezies-Fähigkeit aus Generation 3.", "AbilityMismatchFlag": "Fähigkeit entspricht nicht der Fähigkeits-Nummer.", "AbilityMismatchGift": "Fähigkeit entspricht nicht dem Geheimgeschehen-Geschenk.", "AbilityMismatchPID": "Fähigkeit entspricht nicht der PID.", @@ -80,7 +80,7 @@ "EncTradeUnchanged": "OT und Spitzname des In-Game-Tauschs wurden nicht verändert.", "EncStaticPIDShiny": "Schillernd-Status der stationären Begegnung passt nicht.", "EncTypeMatch": "Begegnungstyp entspricht der Begegnung.", - "EncTypeMismatch": "Begegnungstyp entspricht nicht der Begegnung", + "EncTypeMismatch": "Begegnungstyp entspricht nicht der Begegnung.", "EncUnreleased": "Nicht veröffentlichtes Event.", "EncUnreleasedEMewJP": "Nicht-japanisches Mew von Ferneiland. Nicht veröffentlichtes Event.", "EReaderAmerica": "Amerikanische E-Reader-Beere in einem japanischen Spielstand.", @@ -126,7 +126,7 @@ "G1CatchRateItem": "Fangrate entspricht keinem gültigen Trageitem aus Generation 2.", "G1CatchRateMatchPrevious": "Fangrate entspricht einer Spezies aus der Entwicklungsreihe.", "G1CatchRateMatchTradeback": "Fangrate entspricht einem gültigen Trageitem aus Generation 2.", - "G1CatchRateNone": "Fangrate entspricht weder einer Spezies aus der Entwicklungsreihe noch einem Trageitem aus Generation 2", + "G1CatchRateNone": "Fangrate entspricht weder einer Spezies aus der Entwicklungsreihe noch einem Trageitem aus Generation 2.", "G1CharNick": "Spitzname aus Generation 1/2 verwendet nicht verfügbare Zeichen.", "G1CharOT": "OT aus Generation 1/2 verwendet nicht verfügbare Zeichen.", "G1OTGender": "Weiblicher OT aus Generation 1/2 ist ungültig.", @@ -197,8 +197,8 @@ "MemoryArgSpecies_H": "{0}-Erinnerung: Spezies kann im Spiel gefangen werden.", "MemoryCleared_H": "Erinnerung: Nicht ordnungsgemäß gelöscht.", "MemoryValid_H": "{0}-Erinnerung ist gültig.", - "MemoryFeelInvalid_H": "{0}-Erinnerung: Ungültiges Zuneigung", - "MemoryHTFlagInvalid": "Nicht getauscht: Der aktuelle Besitzer sollte nicht als HT markiert sein", + "MemoryFeelInvalid_H": "{0}-Erinnerung: Ungültiges Zuneigung.", + "MemoryHTFlagInvalid": "Nicht getauscht: Der aktuelle Besitzer sollte nicht als HT markiert sein.", "MemoryHTGender_0": "HT-Geschlecht ungültig: {0}", "MemoryHTLanguage": "HT-Sprache fehlt.", "MemoryIndexArgHT": "Sollte (irgendwo) einen TextVar-Wert für die HT-Erinnerung haben.", @@ -208,7 +208,7 @@ "MemoryIndexIntensity_H1": "{0}-Erinnerung: Intensität sollte Index {1} sein.", "MemoryIndexIntensityHT1": "Sollte einen Intensitäts-Wert für die HT-Erinnerung haben (1.).", "MemoryIndexIntensityMin_H1": "{0}-Erinnerung: Intensität sollte mindestens {1} sein.", - "MemoryIndexLinkHT": "Sollte eine Linktausch-Erinnerung für den HT haben", + "MemoryIndexLinkHT": "Sollte eine Linktausch-Erinnerung für den HT haben.", "MemoryIndexVar": "{0}-Erinnerung: TextVar sollte Index {1} sein.", "MemoryMissingHT": "Erinnerung: Erinnerung des Handling Trainers fehlt.", "MemoryMissingOT": "Erinnerung: Erinnerung des Originaltrainers fehlt.", @@ -226,8 +226,8 @@ "MovePPTooHigh_01": "Die AP der Attacke {0} liegen über dem erlaubten Wert ({1}).", "MovePPUpsTooHigh_01": "Die Anzahl der AP-Plus bei der Attacke {0} liegt über dem erlaubten Limit ({1}).", "MoveShopAlphaMoveShouldBeMastered_0": "Elite-Attacke sollte als gemeistert markiert sein.", - "MoveShopAlphaMoveShouldBeOther": "Elite-Begegnung kann nicht mit dieser Elite-Attacke gefunden werden", - "MoveShopAlphaMoveShouldBeZero": "Nur Elite-Pokémon dürfen eine Elite-Attacke besitzen", + "MoveShopAlphaMoveShouldBeOther": "Elite-Begegnung kann nicht mit dieser Elite-Attacke gefunden werden.", + "MoveShopAlphaMoveShouldBeZero": "Nur Elite-Pokémon dürfen eine Elite-Attacke besitzen.", "MoveShopMasterInvalid_0": "{0} kann nicht manuell gemeistert werden: Meisterung nicht zulässig.", "MoveShopMasterNotLearned_0": "{0} kann nicht manuell gemeistert werden: Gehört nicht zu den erlernbaren Level-Up-Attacken.", "MoveShopPurchaseInvalid_0": "{0} kann nicht im Attacken-Shop erworben werden.", @@ -312,7 +312,7 @@ "TransferCurrentHandlerInvalid": "Ungültiger Wert für den aktuellen Besitzer; Trainer-Details des Spielstands erwarten einen anderen Wert.", "TransferEgg": "Eier können nicht zwischen Generationen übertragen werden.", "TransferEggLocationTransporter": "Ungültiger Fundort; Poképorter erwartet.", - "TransferEggMetLevel": "Ungültiges Fundlevel für den Transfer", + "TransferEggMetLevel": "Ungültiges Fundlevel für den Transfer.", "TransferEggVersion": "Eier können nicht auf dieses Spiel übertragen werden.", "TransferFlagIllegal": "Vom Spiel als illegal markiert (Glitch-Missbrauch).", "TransferHTFlagRequired": "Der aktuelle Besitzer kann nicht der OT sein.", @@ -344,7 +344,7 @@ "MemoryStatFullness_0": "Sattheit sollte {0} sein.", "MemoryStatFullnessLEQ_0": "Sattheit sollte <= {0} sein.", "OTLanguageShouldBe_0": "Sprach-ID sollte {0} sein, nicht {1}.", - "OTLanguageShouldBe_0or1": "Sprach-ID sollte {0} oder {1} sein, nicht {2}", + "OTLanguageShouldBe_0or1": "Sprach-ID sollte {0} oder {1} sein, nicht {2}.", "OTLanguageShouldBeLeq_0": "Sprach-ID sollte <= {0} sein, nicht {1}.", "OTLanguageCannotPlayOnVersion_0": "Sprach-ID {0} kann auf dieser Spielversion nicht gespielt werden.", "OTLanguageCannotTransferToConsoleRegion_0": "Sprach-ID {0} kann nicht auf diese Konsolen-Region übertragen werden.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_es-419.json b/PKHeX.Core/Resources/localize/legality/legality_es-419.json index 92bc4720e..ac5c3f86e 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_es-419.json +++ b/PKHeX.Core/Resources/localize/legality/legality_es-419.json @@ -56,7 +56,7 @@ "EggNature": "Los Huevos no pueden tener Naturaleza estadística.", "EggPP": "Los Huevos no pueden tener los contadores de PP modificados.", "EggPPUp": "No se puede aplicar Más PP a un huevo.", - "EggRelearnFlags": "Los Huevos no pueden tener Discos Técnicos marcados. ", + "EggRelearnFlags": "Los Huevos no pueden tener Discos Técnicos marcados.", "EggShinyPokeStar": "Los Huevos no pueden ser estrellas cinematográficas de Estudios Pokéstar.", "EggSpecies": "Esta especie no puede tener Huevos.", "EggUnhatched": "Huevo eclosionado inválido.", @@ -157,8 +157,8 @@ "G5PokeStarImpossibleValue": "El valor de fama de Estudios Pokéstar es inalcanzable.", "G7BSocialShouldBe100Spirit": "El ánimo debería ser 100 para Pokémon que no están en el equipo.", "G7BSocialShouldBe100Mood": "El humor debería ser 100 para Pokémon que no están en el equipo.", - "GanbaruStatTooHigh": "Un nivel o más de esfuerzo es mayor del límite natural de (10 - bonus IV).", - "GenderInvalidNone": "Pokémon sn género no debería tener género.", + "GanbaruStatTooHigh": "Uno o más niveles de esfuerzo están por encima del límite natural de (10 - bonificación de IV).", + "GenderInvalidNone": "Pokémon sin género no debería tener género.", "GeoBadOrder": "Recuerdo de Geolocalización: En blanco/nulo.", "GeoHardwareInvalid": "Geolocalización: El país no se encuentra en la región de la 3DS.", "GeoHardwareRange": "Región de consola inválida.", @@ -188,7 +188,7 @@ "MemoryArgBadCatch_H": "{0} Recuerdo: {0} no capturó esto.", "MemoryArgBadHatch_H": "{0} Recuerdo: {0} no eclosionó esto.", "MemoryArgBadHT": "Recuerdo: No puede tener recuerdo de un entrenador anterior siendo un Huevo.", - "MemoryArgBadID_H": "{0} Recuerdo: No se puede obtener un recuerdo en la edición {0} .", + "MemoryArgBadID_H": "{0} Recuerdo: No se puede obtener un recuerdo en la edición {0}.", "MemoryArgBadItem_H1": "{0} Recuerdo: Las especies no pueden contener este objeto.", "MemoryArgBadLocation_H": "{0} Recuerdo: No se puede obtener la localización en la edición {0}.", "MemoryArgBadMove_H1": "{0} Recuerdo: La especie no puede aprender {1}.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_es.json b/PKHeX.Core/Resources/localize/legality/legality_es.json index cfdd957e0..966fa326a 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_es.json +++ b/PKHeX.Core/Resources/localize/legality/legality_es.json @@ -56,7 +56,7 @@ "EggNature": "Los Huevos no pueden tener Naturaleza estadística.", "EggPP": "Los Huevos no pueden tener los contadores de PP modificados.", "EggPPUp": "No se puede aplicar Más PP a un huevo.", - "EggRelearnFlags": "Los Huevos no pueden tener Discos Técnicos marcados. ", + "EggRelearnFlags": "Los Huevos no pueden tener Discos Técnicos marcados.", "EggShinyPokeStar": "Los Huevos no pueden ser estrellas cinematográficas de Pokéwood.", "EggSpecies": "Esta especie no puede tener Huevos.", "EggUnhatched": "Huevo eclosionado inválido.", @@ -157,8 +157,8 @@ "G5PokeStarImpossibleValue": "El valor de fama de Pokéwood es inalcanzable.", "G7BSocialShouldBe100Spirit": "El ánimo debería ser 100 para Pokémon que no están en el equipo.", "G7BSocialShouldBe100Mood": "El humor debería ser 100 para Pokémon que no están en el equipo.", - "GanbaruStatTooHigh": "Un nivel o más de esfuerzo es mayor del límite natural de (10 - bonus IV).", - "GenderInvalidNone": "Pokémon sn género no debería tener género.", + "GanbaruStatTooHigh": "Uno o más niveles de esfuerzo están por encima del límite natural de (10 - bonificación de IV).", + "GenderInvalidNone": "Pokémon sin género no debería tener género.", "GeoBadOrder": "Recuerdo de Geolocalización: En blanco/nulo.", "GeoHardwareInvalid": "Geolocalización: El país no se encuentra en la región de la 3DS.", "GeoHardwareRange": "Región de consola inválida.", @@ -188,7 +188,7 @@ "MemoryArgBadCatch_H": "{0} Recuerdo: {0} no capturó esto.", "MemoryArgBadHatch_H": "{0} Recuerdo: {0} no eclosionó esto.", "MemoryArgBadHT": "Recuerdo: No puede tener recuerdo de un entrenador anterior siendo un Huevo.", - "MemoryArgBadID_H": "{0} Recuerdo: No se puede obtener un recuerdo en la edición {0} .", + "MemoryArgBadID_H": "{0} Recuerdo: No se puede obtener un recuerdo en la edición {0}.", "MemoryArgBadItem_H1": "{0} Recuerdo: Las especies no pueden contener este objeto.", "MemoryArgBadLocation_H": "{0} Recuerdo: No se puede obtener la localización en la edición {0}.", "MemoryArgBadMove_H1": "{0} Recuerdo: La especie no puede aprender {1}.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_it.json b/PKHeX.Core/Resources/localize/legality/legality_it.json index 0b75fb5d7..fd1def172 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_it.json +++ b/PKHeX.Core/Resources/localize/legality/legality_it.json @@ -157,7 +157,7 @@ "G5PokeStarImpossibleValue": "Il valore della fama del Pokéwood non è raggiungibile.", "G7BSocialShouldBe100Spirit": "L'Entusiasmo deve essere 100 per i Pokémon non presenti in squadra.", "G7BSocialShouldBe100Mood": "L'Umore deve essere 100 per i Pokémon non presenti in squadra.", - "GanbaruStatTooHigh": "Uno o più valori Ganbaru è oltre il limite naturale di (10 - IV bonus).", + "GanbaruStatTooHigh": "Uno o più livelli di impegno sono superiori al limite naturale di (10 - bonus IV).", "GenderInvalidNone": "I Pokémon senza sesso non dovrebbero avere un Sesso.", "GeoBadOrder": "Ricordo geolocalizzazione: presenza di lacune o spazi vuoti.", "GeoHardwareInvalid": "Geolocalizzazione: La nazione non è disponibile nel 3DS.", diff --git a/PKHeX.Core/Resources/text/locations/gen3/text_rsefrlg_00000_de.txt b/PKHeX.Core/Resources/text/locations/gen3/text_rsefrlg_00000_de.txt index e1635c510..02f3bf99e 100644 --- a/PKHeX.Core/Resources/text/locations/gen3/text_rsefrlg_00000_de.txt +++ b/PKHeX.Core/Resources/text/locations/gen3/text_rsefrlg_00000_de.txt @@ -55,8 +55,8 @@ Unterwasser (Route 128) Unterwasser (Prachtpolis City) Granithöhle Schlotberg -Safari-Zone (RSE) -Duellturm (RS) / Kampfzone (E) +Safari-Zone (RSS) +Duellturm (RS) / Kampfzone (Sm) Blütenburgwald Metaflurtunnel Schiffswrack @@ -68,7 +68,7 @@ Versteck Küstenhöhle Tiefseehöhle Unterwasser (Tiefseehöhle) -Siegesstraße (RSE) +Siegesstraße (RSS) Wundereiland Urzeithöhle Insel im Süden @@ -97,8 +97,8 @@ Fuchsania City Zinnoberinsel Indigo Plateau Saffronia City -Route 4 (Pokémon Center) -Route 10 (Pokémon Center) +Route 4 (Pokémon-Center) +Route 10 (Pokémon-Center) Route 1 Route 2 Route 3 @@ -172,7 +172,7 @@ Tanibo-Ruinen Sevii Eiland 22 Sevii Eiland 23 Sevii Eiland 24 -Nabelfels (FRLG) +Nabelfels (FRBG) Glutberg Beerenforst Eiskaskadenhöhle @@ -181,11 +181,11 @@ Trainerturm Punktloch Verlorene Höhle Musterbuschwald -Wandelhöhle (FRLG) +Wandelhöhle (FRBG) Tanibo-Kammer Tri-Eiland-Pfad Tanibo-Schlüssel -Entstehungsinsel (FRLG) +Entstehungsinsel (FRBG) Einamon-Kammer Pezwulp-Kammer Dreicke-Kammer @@ -194,22 +194,22 @@ Fünibisku-Kammer Lilechs-Kammer Sieborbia-Kammer Gluttherme -Prismania Eink. (FRLG) +Prismania Eink. (FRBG) Aquas Versteck Magmas Versteck Wunderturm -Entstehungsinsel (E) +Entstehungsinsel (Sm) Ferneiland Höhlenatelier Ozeanhöhle -Unterwasser (Marine Cave) +Unterwasser (Ozeanhöhle) Terrahöhle Unterwasser (Route 105) Unterwasser (Route 125) Unterwasser (Route 129) Wüstentunnel -Wandelhöhle (E) -Nabelfels (E) +Wandelhöhle (Sm) +Nabelfels (Sm) Trainerberg @@ -253,4 +253,4 @@ Trainerberg (Ei Geschenk) (In-Game Tausch) -(Schicksalhafte Begegnung) \ No newline at end of file +(Schicksalhafte Begegnung) diff --git a/PKHeX.Core/Resources/text/locations/gen3/text_rsefrlg_00000_fr.txt b/PKHeX.Core/Resources/text/locations/gen3/text_rsefrlg_00000_fr.txt index fc2b2a102..b0e358717 100644 --- a/PKHeX.Core/Resources/text/locations/gen3/text_rsefrlg_00000_fr.txt +++ b/PKHeX.Core/Resources/text/locations/gen3/text_rsefrlg_00000_fr.txt @@ -202,7 +202,7 @@ Tour Mirage Île Lointaine Grotte Atelier Grotte Marine -Fond marin (Marine Cave) +Fond marin (Grotte Marine) Grotte Terra Fond marin (Chenal 105) Fond marin (Chenal 125) @@ -253,4 +253,4 @@ Mont Dresseurs (Œuf reçu en cadeau) (échange in-game) -(rencontré par hasard) \ No newline at end of file +(rencontré par hasard) diff --git a/PKHeX.Core/Resources/text/locations/gen3/text_rsefrlg_00000_it.txt b/PKHeX.Core/Resources/text/locations/gen3/text_rsefrlg_00000_it.txt index 687281de5..e3fcf89c4 100644 --- a/PKHeX.Core/Resources/text/locations/gen3/text_rsefrlg_00000_it.txt +++ b/PKHeX.Core/Resources/text/locations/gen3/text_rsefrlg_00000_it.txt @@ -55,8 +55,8 @@ Sott'acqua (Percorso 128) Sott'acqua (Ceneride) Grotta Pietrosa Monte Camino -Zona Safari (RZE) -Torre Lotta (RZ) / Parco Lotta (E) +Zona Safari (RZS) +Torre Lotta (RZ) / Parco Lotta (S) Bosco Petalo Tunnel Menferro Vecchia Nave @@ -68,7 +68,7 @@ Rifugio Grotta Ondosa Antro Abissale Sott'acqua (Antro Abissale) -Via Vittoria (RZE) +Via Vittoria (RZS) Isola Miraggio Grotta dei Tempi Isola Remota @@ -172,7 +172,7 @@ Rovine Florabeto Settipelago 22 Settipelago 23 Settipelago 24 -Monte Cordone (FRLG) +Monte Cordone (RFVF) Monte Brace Bosco Baccoso Grotta Gelata @@ -181,11 +181,11 @@ Torre Allenatori Cripta dei Punti Grotta Sperduta Bosco Disegnato -Grotta Mutevole (FRLG) +Grotta Mutevole (RFVF) Sale Florabeto Via Terzisola Chiave Florabeto -Isola Materna (FRLG) +Isola Materna (RFVF) Sala A-loe Sala B-etulla Sala C-iclamino @@ -194,11 +194,11 @@ Sala E-dera Sala F-elce Sala G-ardenia Terme Laviche -Centro Azzurrop. (FRLG) +Centro Azzurrop. (RFVF) Rifugio Idro Rifugio Magma Torre Miraggio -Isola Materna (E) +Isola Materna (S) Isola Suprema Grotta Artistica Grotta Mare @@ -208,8 +208,8 @@ Sott'acqua (Percorso 105) Sott'acqua (Percorso 125) Sott'acqua (Percorso 129) Galleria Deserto -Grotta Mutevole (E) -Monte Cordone (E) +Grotta Mutevole (S) +Monte Cordone (S) Monte Allenatori @@ -253,4 +253,4 @@ Monte Allenatori (Uovo donato) (scambio in gioco) -(occasione speciale) \ No newline at end of file +(occasione speciale) diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index 26c5cab6b..42674ea4b 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -527,7 +527,7 @@ Main.Label_EVs=FPs Main.Label_EXP=EP: Main.Label_Form=Form: Main.Label_Friendship=Freundschaft: -Main.Label_GroundTile=Begegnung: +Main.Label_GroundTile=Begegnungstyp: Main.Label_GVs=LLs Main.Label_HatchCounter=Ei Schritte: Main.Label_HeldItem=Getragenes Item: @@ -647,7 +647,7 @@ Main.mnuView=&Ansehen Main.Tab_Box=Box Main.Tab_Cosmetic=Kosmetisch Main.Tab_Main=Haupt -Main.Tab_Met=Fundort +Main.Tab_Met=Begegnung Main.Tab_Moves=Attacken Main.Tab_Other=Andere Main.Tab_OTMisc=OT/Sonstiges @@ -1275,10 +1275,10 @@ SAV_Gear.DGV_Model=Trainertyp SAV_Gear.DGV_Obtained=Erhalten SAV_Gear.GB_ShinyOutfits=Schillernde Outfits SAV_Geonet4.B_Cancel=Abbrechen -SAV_Geonet4.B_ClearLocations=Standorte löschen +SAV_Geonet4.B_ClearLocations=Orte löschen SAV_Geonet4.B_Save=Speichern -SAV_Geonet4.B_SetAllLegalLocations=Zulässige Orte setzen -SAV_Geonet4.B_SetAllLocations=Alle Standorte setzen +SAV_Geonet4.B_SetAllLegalLocations=Legale Orte setzen +SAV_Geonet4.B_SetAllLocations=Alle Orte setzen SAV_Geonet4.CHK_GlobalFlag=Ganze Weltkugel sichtbar SAV_Geonet4.DGV_Item_Country=Land SAV_Geonet4.DGV_Item_Point=Punkt @@ -1393,13 +1393,13 @@ SAV_MailBox.B_Delete=Löschen SAV_MailBox.B_PartyDown=v SAV_MailBox.B_PartyUp=^ SAV_MailBox.B_Save=Speichern -SAV_MailBox.CHK_UserEntered=User-Entered +SAV_MailBox.CHK_UserEntered=Benutzereingabe SAV_MailBox.GB_Author=Autor SAV_MailBox.GB_MessageNUD=Nachricht SAV_MailBox.GB_MessageTB=Nachricht SAV_MailBox.GB_PKM=Getragener Brief (ID) SAV_MailBox.L_AppearPKM=PKM Icons: -SAV_MailBox.L_BoxSize=Briefbox (PC): +SAV_MailBox.L_BoxSize=Briefbox (PC) belegt: SAV_MailBox.L_HeldItem1=(Brief) SAV_MailBox.L_HeldItem2=(Brief) SAV_MailBox.L_HeldItem3=(Brief) @@ -1882,34 +1882,34 @@ SAV_PokedexLA.B_Save=Speichern SAV_PokedexLA.CHK_A=Elite SAV_PokedexLA.CHK_C0=Männlich SAV_PokedexLA.CHK_C1=Weiblich -SAV_PokedexLA.CHK_C2=Elite männl. -SAV_PokedexLA.CHK_C3=Elite weibl. -SAV_PokedexLA.CHK_C4=Schillernd männl. -SAV_PokedexLA.CHK_C5=Schillernd weibl. -SAV_PokedexLA.CHK_C6=Sch. Elite männl. -SAV_PokedexLA.CHK_C7=Sch. Elite weibl. +SAV_PokedexLA.CHK_C2=Elite männlich +SAV_PokedexLA.CHK_C3=Elite weiblich +SAV_PokedexLA.CHK_C4=Schillernd männlich +SAV_PokedexLA.CHK_C5=Schillernd weiblich +SAV_PokedexLA.CHK_C6=Sch. Elite männlich +SAV_PokedexLA.CHK_C7=Sch. Elite weiblich SAV_PokedexLA.CHK_Complete=Komplett SAV_PokedexLA.CHK_G=Weiblich SAV_PokedexLA.CHK_MinAndMax=Hat Min && Max SAV_PokedexLA.CHK_O0=Männlich SAV_PokedexLA.CHK_O1=Weiblich -SAV_PokedexLA.CHK_O2=Elite männl. -SAV_PokedexLA.CHK_O3=Elite weibl. -SAV_PokedexLA.CHK_O4=Schillernd männl. -SAV_PokedexLA.CHK_O5=Schillernd weibl. -SAV_PokedexLA.CHK_O6=Sch. Elite männl. -SAV_PokedexLA.CHK_O7=Sch. Elite weibl. +SAV_PokedexLA.CHK_O2=Elite männlich +SAV_PokedexLA.CHK_O3=Elite weiblich +SAV_PokedexLA.CHK_O4=Schillernd männlich +SAV_PokedexLA.CHK_O5=Schillernd weiblich +SAV_PokedexLA.CHK_O6=Sch. Elite männlich +SAV_PokedexLA.CHK_O7=Sch. Elite weiblich SAV_PokedexLA.CHK_Perfect=Perfekt SAV_PokedexLA.CHK_S=Schillernd SAV_PokedexLA.CHK_S0=Männlich SAV_PokedexLA.CHK_S1=Weiblich -SAV_PokedexLA.CHK_S2=Elite männl. -SAV_PokedexLA.CHK_S3=Elite weibl. -SAV_PokedexLA.CHK_S4=Schillernd männl. -SAV_PokedexLA.CHK_S5=Schillernd weibl. -SAV_PokedexLA.CHK_S6=Sch. Elite männl. -SAV_PokedexLA.CHK_S7=Sch. Elite weibl. -SAV_PokedexLA.CHK_Seen=Gesehen +SAV_PokedexLA.CHK_S2=Elite männlich +SAV_PokedexLA.CHK_S3=Elite weiblich +SAV_PokedexLA.CHK_S4=Schillernd männlich +SAV_PokedexLA.CHK_S5=Schillernd weiblich +SAV_PokedexLA.CHK_S6=Sch. Elite männlich +SAV_PokedexLA.CHK_S7=Sch. Elite weiblich +SAV_PokedexLA.CHK_Seen=Geseh. SAV_PokedexLA.CHK_Solitude=Solokämpferpfad abgeschlossen SAV_PokedexLA.GB_CaughtInWild=Gefangen (wild) SAV_PokedexLA.GB_Displayed=Angezeigt @@ -1923,8 +1923,8 @@ SAV_PokedexLA.L_ConnectHeight=- SAV_PokedexLA.L_ConnectWeight=- SAV_PokedexLA.L_DisplayedForm=Angezeigte Form: SAV_PokedexLA.L_goto=→ -SAV_PokedexLA.L_ResearchLevelReported=Gemeldet: -SAV_PokedexLA.L_ResearchLevelUnreported=Ungemeldet: +SAV_PokedexLA.L_ResearchLevelReported=Berichtet: +SAV_PokedexLA.L_ResearchLevelUnreported=Nicht berich.: SAV_PokedexLA.L_TheoryHeight=- SAV_PokedexLA.L_TheoryWeight=- SAV_PokedexLA.L_UpdateIndex=Index: diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index 506ef3585..1d936beed 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -527,8 +527,8 @@ Main.Label_EVs=EVs Main.Label_EXP=EXP: Main.Label_Form=Forma: Main.Label_Friendship=Felicidad: -Main.Label_GroundTile=Encuentro: -Main.Label_GVs=GVs +Main.Label_GroundTile=Tipo de Encuentro: +Main.Label_GVs=NEs Main.Label_HatchCounter=Contador de Eclosión: Main.Label_HeldItem=Objeto Equipado: Main.Label_HiddenPowerPower=60 @@ -917,12 +917,12 @@ SAV_BattlePass.B_Export=Exportar SAV_BattlePass.B_FDelete=X SAV_BattlePass.B_Import=Importar SAV_BattlePass.B_Save=Guardar -SAV_BattlePass.B_UnlockCustom=Desbloquear Todos los Pases personalizados -SAV_BattlePass.B_UnlockRental=Desbloquear Todos los Pases préstamo +SAV_BattlePass.B_UnlockCustom=Desbloq. todos Pases personal +SAV_BattlePass.B_UnlockRental=Desbloq. todos Pases préstamo SAV_BattlePass.B_Up=^ SAV_BattlePass.CHK_Available=Pase Disponible SAV_BattlePass.CHK_Friend=Pase de amigo -SAV_BattlePass.CHK_Issued=Pase Entregado +SAV_BattlePass.CHK_Issued=Pase Entreg. SAV_BattlePass.CHK_PresetGreeting=Frase predeterminada SAV_BattlePass.CHK_PresetLose=Frase predeterminada SAV_BattlePass.CHK_PresetSentOut=Frase predeterminada @@ -1393,23 +1393,23 @@ SAV_MailBox.B_Delete=Eliminar SAV_MailBox.B_PartyDown=v SAV_MailBox.B_PartyUp=^ SAV_MailBox.B_Save=Guardar -SAV_MailBox.CHK_UserEntered=User-Entered +SAV_MailBox.CHK_UserEntered=Entrada del usuario SAV_MailBox.GB_Author=Autor SAV_MailBox.GB_MessageNUD=Mensaje SAV_MailBox.GB_MessageTB=Mensaje SAV_MailBox.GB_PKM=ID carta equipada SAV_MailBox.L_AppearPKM=Aparecer PKM: -SAV_MailBox.L_BoxSize=Caja de carta servida (PC): +SAV_MailBox.L_BoxSize=Buzón servida (PC): SAV_MailBox.L_HeldItem1=(Carta) SAV_MailBox.L_HeldItem2=(Carta) SAV_MailBox.L_HeldItem3=(Carta) SAV_MailBox.L_HeldItem4=(Carta) SAV_MailBox.L_HeldItem5=(Carta) SAV_MailBox.L_HeldItem6=(Carta) -SAV_MailBox.L_MailType=Carta: +SAV_MailBox.L_MailType=Tipo Carta: SAV_MailBox.L_MiscValue=Misc.: -SAV_MailBox.L_PartyHeld=Caja de Cartas (equipo) -SAV_MailBox.L_PCBOX=Caja de Cartas (PC) +SAV_MailBox.L_PartyHeld=Buzón (Equipo) +SAV_MailBox.L_PCBOX=Buzón (PC) SAV_MailBox.L_PKM1=Bulbasaur: SAV_MailBox.L_PKM2=Bulbasaur: SAV_MailBox.L_PKM3=Bulbasaur: @@ -1888,7 +1888,7 @@ SAV_PokedexLA.CHK_C4=Macho brillante SAV_PokedexLA.CHK_C5=Hembra brillante SAV_PokedexLA.CHK_C6=Macho alfa brillante SAV_PokedexLA.CHK_C7=Hembra alfa brillante -SAV_PokedexLA.CHK_Complete=Completar +SAV_PokedexLA.CHK_Complete=Completado SAV_PokedexLA.CHK_G=Hembra SAV_PokedexLA.CHK_MinAndMax=Ambos min. y máx. SAV_PokedexLA.CHK_O0=Macho @@ -1911,20 +1911,20 @@ SAV_PokedexLA.CHK_S6=Macho alfa brillante SAV_PokedexLA.CHK_S7=Hembra alfa brillante SAV_PokedexLA.CHK_Seen=Visto SAV_PokedexLA.CHK_Solitude=Vía solitaria completada -SAV_PokedexLA.GB_CaughtInWild=Capturado en hierba +SAV_PokedexLA.GB_CaughtInWild=Capturado (salvaje) SAV_PokedexLA.GB_Displayed=Mostrado SAV_PokedexLA.GB_Height=Altura SAV_PokedexLA.GB_Obtained=Obtenido SAV_PokedexLA.GB_ResearchTasks=Tareas -SAV_PokedexLA.GB_SeenInWild=Visto en hierba +SAV_PokedexLA.GB_SeenInWild=Visto (salvaje) SAV_PokedexLA.GB_Statistics=Estadísticas SAV_PokedexLA.GB_Weight=Peso SAV_PokedexLA.L_ConnectHeight=- SAV_PokedexLA.L_ConnectWeight=- SAV_PokedexLA.L_DisplayedForm=Forma mostrada: SAV_PokedexLA.L_goto=Ir a: -SAV_PokedexLA.L_ResearchLevelReported=Informado: -SAV_PokedexLA.L_ResearchLevelUnreported=Sin informar: +SAV_PokedexLA.L_ResearchLevelReported=Registrado: +SAV_PokedexLA.L_ResearchLevelUnreported=Sin registrar: SAV_PokedexLA.L_TheoryHeight=- SAV_PokedexLA.L_TheoryWeight=- SAV_PokedexLA.L_UpdateIndex=Índice: @@ -2519,8 +2519,8 @@ SAV_Trainer8a.L_GalaxyRank=Rango Galaxia: SAV_Trainer8a.L_Hours=Hrs.: SAV_Trainer8a.L_Language=Idioma: SAV_Trainer8a.L_LastSaved=Último guardado: -SAV_Trainer8a.L_MeritCurrent=Puntos de Gratitud actuales: -SAV_Trainer8a.L_MeritEarned=Puntos de Gratitud conseguidos: +SAV_Trainer8a.L_MeritCurrent=PG actuales: +SAV_Trainer8a.L_MeritEarned=PG conseguidos: SAV_Trainer8a.L_Minutes=Min.: SAV_Trainer8a.L_Money=$: SAV_Trainer8a.L_R=Rotation: diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index 1b52d8746..cf5db32ec 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -527,8 +527,8 @@ Main.Label_EVs=EVs Main.Label_EXP=EXP: Main.Label_Form=Forma: Main.Label_Friendship=Felicidad: -Main.Label_GroundTile=Encuentro: -Main.Label_GVs=GVs +Main.Label_GroundTile=Tipo de Encuentro: +Main.Label_GVs=NEs Main.Label_HatchCounter=Contador de Eclosión: Main.Label_HeldItem=Objeto Equipado: Main.Label_HiddenPowerPower=60 @@ -917,12 +917,12 @@ SAV_BattlePass.B_Export=Exportar SAV_BattlePass.B_FDelete=X SAV_BattlePass.B_Import=Importar SAV_BattlePass.B_Save=Guardar -SAV_BattlePass.B_UnlockCustom=Desbloquear Todos los Pases personalizados -SAV_BattlePass.B_UnlockRental=Desbloquear Todos los Pases préstamo +SAV_BattlePass.B_UnlockCustom=Desbloq. todos Pases personal +SAV_BattlePass.B_UnlockRental=Desbloq. todos Pases préstamo SAV_BattlePass.B_Up=^ SAV_BattlePass.CHK_Available=Pase Disponible SAV_BattlePass.CHK_Friend=Pase de amigo -SAV_BattlePass.CHK_Issued=Pase Entregado +SAV_BattlePass.CHK_Issued=Pase Entreg. SAV_BattlePass.CHK_PresetGreeting=Frase predeterminada SAV_BattlePass.CHK_PresetLose=Frase predeterminada SAV_BattlePass.CHK_PresetSentOut=Frase predeterminada @@ -1393,23 +1393,23 @@ SAV_MailBox.B_Delete=Eliminar SAV_MailBox.B_PartyDown=v SAV_MailBox.B_PartyUp=^ SAV_MailBox.B_Save=Guardar -SAV_MailBox.CHK_UserEntered=User-Entered +SAV_MailBox.CHK_UserEntered=Entrada del usuario SAV_MailBox.GB_Author=Autor SAV_MailBox.GB_MessageNUD=Mensaje SAV_MailBox.GB_MessageTB=Mensaje SAV_MailBox.GB_PKM=ID carta equipada SAV_MailBox.L_AppearPKM=Aparecer PKM: -SAV_MailBox.L_BoxSize=Caja de carta servida (PC): +SAV_MailBox.L_BoxSize=Buzón servida (PC): SAV_MailBox.L_HeldItem1=(Carta) SAV_MailBox.L_HeldItem2=(Carta) SAV_MailBox.L_HeldItem3=(Carta) SAV_MailBox.L_HeldItem4=(Carta) SAV_MailBox.L_HeldItem5=(Carta) SAV_MailBox.L_HeldItem6=(Carta) -SAV_MailBox.L_MailType=Carta: +SAV_MailBox.L_MailType=Tipo Carta: SAV_MailBox.L_MiscValue=Varios: -SAV_MailBox.L_PartyHeld=Caja de Cartas (equipo) -SAV_MailBox.L_PCBOX=Caja de Cartas (PC) +SAV_MailBox.L_PartyHeld=Buzón (Equipo) +SAV_MailBox.L_PCBOX=Buzón (PC) SAV_MailBox.L_PKM1=Bulbasaur: SAV_MailBox.L_PKM2=Bulbasaur: SAV_MailBox.L_PKM3=Bulbasaur: @@ -1888,7 +1888,7 @@ SAV_PokedexLA.CHK_C4=Macho variocolor SAV_PokedexLA.CHK_C5=Hembra variocolor SAV_PokedexLA.CHK_C6=Macho alfa variocolor SAV_PokedexLA.CHK_C7=Hembra alfa variocolor -SAV_PokedexLA.CHK_Complete=Completar +SAV_PokedexLA.CHK_Complete=Completado SAV_PokedexLA.CHK_G=Hembra SAV_PokedexLA.CHK_MinAndMax=Ambos min. y máx. SAV_PokedexLA.CHK_O0=Macho @@ -1911,20 +1911,20 @@ SAV_PokedexLA.CHK_S6=Macho alfa variocolor SAV_PokedexLA.CHK_S7=Hembra alfa variocolor SAV_PokedexLA.CHK_Seen=Visto SAV_PokedexLA.CHK_Solitude=Vía solitaria completada -SAV_PokedexLA.GB_CaughtInWild=Capturado en hierba +SAV_PokedexLA.GB_CaughtInWild=Capturado (salvaje) SAV_PokedexLA.GB_Displayed=Mostrado SAV_PokedexLA.GB_Height=Altura SAV_PokedexLA.GB_Obtained=Obtenido SAV_PokedexLA.GB_ResearchTasks=Tareas -SAV_PokedexLA.GB_SeenInWild=Visto en hierba +SAV_PokedexLA.GB_SeenInWild=Visto (salvaje) SAV_PokedexLA.GB_Statistics=Estadísticas SAV_PokedexLA.GB_Weight=Peso SAV_PokedexLA.L_ConnectHeight=- SAV_PokedexLA.L_ConnectWeight=- SAV_PokedexLA.L_DisplayedForm=Forma mostrada: SAV_PokedexLA.L_goto=Ir a: -SAV_PokedexLA.L_ResearchLevelReported=Informado: -SAV_PokedexLA.L_ResearchLevelUnreported=Sin informar: +SAV_PokedexLA.L_ResearchLevelReported=Registrado: +SAV_PokedexLA.L_ResearchLevelUnreported=Sin registrar: SAV_PokedexLA.L_TheoryHeight=- SAV_PokedexLA.L_TheoryWeight=- SAV_PokedexLA.L_UpdateIndex=Índice: @@ -2519,8 +2519,8 @@ SAV_Trainer8a.L_GalaxyRank=Rango Galaxia: SAV_Trainer8a.L_Hours=Hrs.: SAV_Trainer8a.L_Language=Idioma: SAV_Trainer8a.L_LastSaved=Último guardado: -SAV_Trainer8a.L_MeritCurrent=Puntos de Gratitud actuales: -SAV_Trainer8a.L_MeritEarned=Puntos de Gratitud conseguidos: +SAV_Trainer8a.L_MeritCurrent=PG actuales: +SAV_Trainer8a.L_MeritEarned=PG conseguidos: SAV_Trainer8a.L_Minutes=Min.: SAV_Trainer8a.L_Money=$: SAV_Trainer8a.L_R=Rotación: diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index ffddb03ae..89e7e17fc 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -527,8 +527,8 @@ Main.Label_EVs=EVs Main.Label_EXP=Expérience : Main.Label_Form=Forme : Main.Label_Friendship=Bonheur : -Main.Label_GroundTile=Zone : -Main.Label_GVs=GVs +Main.Label_GroundTile=Type de rencontre : +Main.Label_GVs=NEs Main.Label_HatchCounter=Compte d'éclosion : Main.Label_HeldItem=Objet : Main.Label_HiddenPowerPower=60 @@ -917,8 +917,8 @@ SAV_BattlePass.B_Export=Exporter SAV_BattlePass.B_FDelete=X SAV_BattlePass.B_Import=Importer SAV_BattlePass.B_Save=Sauvegarder -SAV_BattlePass.B_UnlockCustom=Débloquer cartes perso. -SAV_BattlePass.B_UnlockRental=Débloquer cartes loc. +SAV_BattlePass.B_UnlockCustom=Débloquer toutes Cartes perso +SAV_BattlePass.B_UnlockRental=Débloquer toutes Cartes loc. SAV_BattlePass.B_Up=^ SAV_BattlePass.CHK_Available=Carte disponible SAV_BattlePass.CHK_Friend=Carte ami @@ -1277,8 +1277,8 @@ SAV_Gear.GB_ShinyOutfits=Tenues Chromatiques SAV_Geonet4.B_Cancel=Annuler SAV_Geonet4.B_ClearLocations=Réinitialiser SAV_Geonet4.B_Save=Sauvegarder -SAV_Geonet4.B_SetAllLegalLocations=Activer tous les lieux légaux -SAV_Geonet4.B_SetAllLocations=Activer tous les lieux +SAV_Geonet4.B_SetAllLegalLocations=Lieux légaux +SAV_Geonet4.B_SetAllLocations=Tous les lieux SAV_Geonet4.CHK_GlobalFlag=Globe entier visible SAV_Geonet4.DGV_Item_Country=Pays SAV_Geonet4.DGV_Item_Point=Point @@ -1406,7 +1406,7 @@ SAV_MailBox.L_HeldItem3=(Lettre) SAV_MailBox.L_HeldItem4=(Lettre) SAV_MailBox.L_HeldItem5=(Lettre) SAV_MailBox.L_HeldItem6=(Lettre) -SAV_MailBox.L_MailType=Type de Lettre : +SAV_MailBox.L_MailType=Type Lettre : SAV_MailBox.L_MiscValue=Divers : SAV_MailBox.L_PartyHeld=Lettres dans l'équipe SAV_MailBox.L_PCBOX=Lettres dans le PC @@ -1875,9 +1875,9 @@ SAV_PokedexGG.L_RHeightMin=Minimum SAV_PokedexGG.L_RWeight=Poids SAV_PokedexGG.L_RWeightMax=Maximum SAV_PokedexGG.L_RWeightMin=Minimum -SAV_PokedexLA.B_AdvancedResearch=Éditer toutes les tâches... +SAV_PokedexLA.B_AdvancedResearch=Éditer tâches... SAV_PokedexLA.B_Cancel=Annuler -SAV_PokedexLA.B_Report=Données du rapport +SAV_PokedexLA.B_Report=Rapport SAV_PokedexLA.B_Save=Sauvegarder SAV_PokedexLA.CHK_A=Baron SAV_PokedexLA.CHK_C0=Mâle @@ -1888,9 +1888,9 @@ SAV_PokedexLA.CHK_C4=Mâle Chromatique SAV_PokedexLA.CHK_C5=Femelle Chroma. SAV_PokedexLA.CHK_C6=Baron Mâle Chroma. SAV_PokedexLA.CHK_C7=Baron Femelle Chroma. -SAV_PokedexLA.CHK_Complete=Terminé +SAV_PokedexLA.CHK_Complete=Complété SAV_PokedexLA.CHK_G=Femelle -SAV_PokedexLA.CHK_MinAndMax=À la fois Minimum et Maximum +SAV_PokedexLA.CHK_MinAndMax=À la fois Min et Max SAV_PokedexLA.CHK_O0=Mâle SAV_PokedexLA.CHK_O1=Femelle SAV_PokedexLA.CHK_O2=Baron Mâle @@ -1909,22 +1909,22 @@ SAV_PokedexLA.CHK_S4=Mâle Chromatique SAV_PokedexLA.CHK_S5=Femelle Chroma. SAV_PokedexLA.CHK_S6=Baron Mâle Chroma. SAV_PokedexLA.CHK_S7=Baron Femelle Chroma. -SAV_PokedexLA.CHK_Seen=Rencontré -SAV_PokedexLA.CHK_Solitude=Quête solitaire terminée -SAV_PokedexLA.GB_CaughtInWild=Attrapé dans la nature +SAV_PokedexLA.CHK_Seen=Vu +SAV_PokedexLA.CHK_Solitude=Voie Solitaire complété +SAV_PokedexLA.GB_CaughtInWild=Capturé (sauvage) SAV_PokedexLA.GB_Displayed=Montré SAV_PokedexLA.GB_Height=Taille SAV_PokedexLA.GB_Obtained=Obtenue SAV_PokedexLA.GB_ResearchTasks=Tâches de recherche -SAV_PokedexLA.GB_SeenInWild=Vu dans la nature +SAV_PokedexLA.GB_SeenInWild=Vu (sauvage) SAV_PokedexLA.GB_Statistics=Statistiques SAV_PokedexLA.GB_Weight=Poids SAV_PokedexLA.L_ConnectHeight=- SAV_PokedexLA.L_ConnectWeight=- SAV_PokedexLA.L_DisplayedForm=Forme affichée : SAV_PokedexLA.L_goto=Vers : -SAV_PokedexLA.L_ResearchLevelReported=Rapporté : -SAV_PokedexLA.L_ResearchLevelUnreported=Non rapporté : +SAV_PokedexLA.L_ResearchLevelReported=Analysé : +SAV_PokedexLA.L_ResearchLevelUnreported=Non analysé : SAV_PokedexLA.L_TheoryHeight=- SAV_PokedexLA.L_TheoryWeight=- SAV_PokedexLA.L_UpdateIndex=Index : @@ -2515,7 +2515,7 @@ SAV_Trainer8a.GB_Adventure=Info aventure SAV_Trainer8a.GB_Map=Position carte SAV_Trainer8a.GB_Stats=Stats SAV_Trainer8a.L_CurrentMap=Carte actuelle : -SAV_Trainer8a.L_GalaxyRank=Rang Galaxy : +SAV_Trainer8a.L_GalaxyRank=Rang Galaxie : SAV_Trainer8a.L_Hours=Hrs : SAV_Trainer8a.L_Language=Langue : SAV_Trainer8a.L_LastSaved=Der. sauv. @@ -2524,7 +2524,7 @@ SAV_Trainer8a.L_MeritEarned=PBA obtenus : SAV_Trainer8a.L_Minutes=Min : SAV_Trainer8a.L_Money=$ : SAV_Trainer8a.L_R=Rotation : -SAV_Trainer8a.L_SatchelUpgrades=Améliorations de la sacoche : +SAV_Trainer8a.L_SatchelUpgrades=Amélio. sacoche : SAV_Trainer8a.L_Seconds=Sec : SAV_Trainer8a.L_Started=Début jeu : SAV_Trainer8a.L_TrainerName=Nom de Dress. : @@ -2673,8 +2673,8 @@ SAV_Underground8b.B_Save=Sauvegarder SAV_UnityTower.B_Cancel=Annuler SAV_UnityTower.B_ClearLocations=Réinitialiser SAV_UnityTower.B_Save=Sauvegarder -SAV_UnityTower.B_SetAllLegalLocations=Activer tous les lieux légaux -SAV_UnityTower.B_SetAllLocations=Activer tous les lieux +SAV_UnityTower.B_SetAllLegalLocations=Lieux légaux +SAV_UnityTower.B_SetAllLocations=Tous les lieux SAV_UnityTower.CHK_GlobalFlag=Globe entier visible SAV_UnityTower.CHK_UnityTowerFlag=Tour Union débloquée SAV_UnityTower.DGV_Item_Country=Pays diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index 92558fb17..fc1e58546 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -527,8 +527,8 @@ Main.Label_EVs=EVs Main.Label_EXP=EXP: Main.Label_Form=Forma: Main.Label_Friendship=Amicizia: -Main.Label_GroundTile=Incontro: -Main.Label_GVs=GVs +Main.Label_GroundTile=Tipo di Incontro: +Main.Label_GVs=LIs Main.Label_HatchCounter=Contatore Schiusura: Main.Label_HeldItem=Strumento tenuto: Main.Label_HiddenPowerPower=60 @@ -705,18 +705,18 @@ MoveShopEditor.B_All=Dai Tutto MoveShopEditor.B_Cancel=Annulla MoveShopEditor.B_None=Rimuovi Tutto MoveShopEditor.B_Save=Salva -NamedEventType.Achievement=Achievement -NamedEventType.EventEncounter=EventEncounter -NamedEventType.FlyToggle=FlyToggle -NamedEventType.GiftAvailable=GiftAvailable -NamedEventType.HiddenItem=HiddenItem -NamedEventType.Misc=Misc -NamedEventType.None=None -NamedEventType.Rebattle=Rebattle -NamedEventType.Statistic=Statistic -NamedEventType.StoryProgress=StoryProgress -NamedEventType.TrainerToggle=TrainerToggle -NamedEventType.UsefulFeature=UsefulFeature +NamedEventType.Achievement=Obiettivo +NamedEventType.EventEncounter=Incontro evento +NamedEventType.FlyToggle=Volo +NamedEventType.GiftAvailable=Dono disponibile +NamedEventType.HiddenItem=Strumento nascosto +NamedEventType.Misc=Varie +NamedEventType.None=Nessuno +NamedEventType.Rebattle=Risfida +NamedEventType.Statistic=Statistica +NamedEventType.StoryProgress=Progresso storia +NamedEventType.TrainerToggle=Allenatore +NamedEventType.UsefulFeature=Funzione utile OPower6BattleType.Accuracy=Precisione OPower6BattleType.Attack=Attacco OPower6BattleType.Critical=Bruttocolpo @@ -917,12 +917,12 @@ SAV_BattlePass.B_Export=Esporta SAV_BattlePass.B_FDelete=X SAV_BattlePass.B_Import=Importa SAV_BattlePass.B_Save=Salva -SAV_BattlePass.B_UnlockCustom=Sblocca tutti i Pass personalizzati -SAV_BattlePass.B_UnlockRental=Sblocca tutti i Pass a noleggio +SAV_BattlePass.B_UnlockCustom=Sblocca tutti i Pass Personale +SAV_BattlePass.B_UnlockRental=Sblocca tutti i Pass Noleggio SAV_BattlePass.B_Up=^ SAV_BattlePass.CHK_Available=Pass disponibile SAV_BattlePass.CHK_Friend=Pass Amico -SAV_BattlePass.CHK_Issued=Pass Issued +SAV_BattlePass.CHK_Issued=Pass rilasciato SAV_BattlePass.CHK_PresetGreeting=Predefinita SAV_BattlePass.CHK_PresetLose=Predefinita SAV_BattlePass.CHK_PresetSentOut=Predefinita @@ -932,7 +932,7 @@ SAV_BattlePass.CHK_PresetWin=Predefinita SAV_BattlePass.CHK_Rental=Pass Noleggio SAV_BattlePass.f_CATCHPHRASES=Esclamazioni SAV_BattlePass.f_CREATOR=Creatore -SAV_BattlePass.f_MAIN=Main +SAV_BattlePass.f_MAIN=Principale SAV_BattlePass.f_PKM=Pokémon SAV_BattlePass.GB_Appearance=Aspetto SAV_BattlePass.GB_Creator=Creatore @@ -1061,10 +1061,10 @@ SAV_Chatter.B_Cancel=Annulla SAV_Chatter.B_ExportPCM=Esporta .pcm SAV_Chatter.B_ExportWAV=Esporta .wav SAV_Chatter.B_ImportPCM=Importa .pcm -SAV_Chatter.B_PlayRecording=Riproduci registrazione +SAV_Chatter.B_PlayRecording=Riproduci SAV_Chatter.B_Save=Salva SAV_Chatter.CHK_Initialized=Inizializzato -SAV_Chatter.L_Confusion=Confusione %: +SAV_Chatter.L_Confusion=Confusione % SAV_Database.B_Add=Aggiungi SAV_Database.B_Reset=Reset Filtri SAV_Database.B_Search=Cerca! @@ -1277,7 +1277,7 @@ SAV_Gear.GB_ShinyOutfits=Completi cromatici SAV_Geonet4.B_Cancel=Annulla SAV_Geonet4.B_ClearLocations=Cancella località SAV_Geonet4.B_Save=Salva -SAV_Geonet4.B_SetAllLegalLocations=Imposta tutte le località legittime +SAV_Geonet4.B_SetAllLegalLocations=Imposta località legali SAV_Geonet4.B_SetAllLocations=Imposta tutte le località SAV_Geonet4.CHK_GlobalFlag=Globo intero visibile SAV_Geonet4.DGV_Item_Country=Nazione @@ -1384,7 +1384,7 @@ SAV_Link6.L_PKM5=#5: SAV_Link6.L_PKM6=#6: SAV_Link6.L_Pokemiles=Pokémiglia: SAV_Link6.TAB_Items=Strumenti -SAV_Link6.TAB_Main=Main +SAV_Link6.TAB_Main=Principale SAV_Link6.TAB_PKM=Pokémon SAV_MailBox.B_BoxDown=v SAV_MailBox.B_BoxUp=^ @@ -1393,23 +1393,23 @@ SAV_MailBox.B_Delete=Elimina SAV_MailBox.B_PartyDown=v SAV_MailBox.B_PartyUp=^ SAV_MailBox.B_Save=Salva -SAV_MailBox.CHK_UserEntered=User-Entered +SAV_MailBox.CHK_UserEntered=Inserito dall'utente SAV_MailBox.GB_Author=Autore SAV_MailBox.GB_MessageNUD=Messaggio SAV_MailBox.GB_MessageTB=Messaggio -SAV_MailBox.GB_PKM=Held MailID +SAV_MailBox.GB_PKM=ID Messaggio (tenuto) SAV_MailBox.L_AppearPKM=Comparsa: -SAV_MailBox.L_BoxSize=Casella Messaggi (PC) Served: -SAV_MailBox.L_HeldItem1=(Mail) -SAV_MailBox.L_HeldItem2=(Mail) -SAV_MailBox.L_HeldItem3=(Mail) -SAV_MailBox.L_HeldItem4=(Mail) -SAV_MailBox.L_HeldItem5=(Mail) -SAV_MailBox.L_HeldItem6=(Mail) -SAV_MailBox.L_MailType=Tipo Messaggio: +SAV_MailBox.L_BoxSize=Messaggi (PC) salvata: +SAV_MailBox.L_HeldItem1=(Mess.) +SAV_MailBox.L_HeldItem2=(Mess.) +SAV_MailBox.L_HeldItem3=(Mess.) +SAV_MailBox.L_HeldItem4=(Mess.) +SAV_MailBox.L_HeldItem5=(Mess.) +SAV_MailBox.L_HeldItem6=(Mess.) +SAV_MailBox.L_MailType=Tipo Mess.: SAV_MailBox.L_MiscValue=Varie: -SAV_MailBox.L_PartyHeld=Casella Messaggi (Squadra) -SAV_MailBox.L_PCBOX=Casella Messaggi (PC) +SAV_MailBox.L_PartyHeld=Cas. Mess. (Squadra) +SAV_MailBox.L_PCBOX=Casella Mess. (PC) SAV_MailBox.L_PKM1=Bulbasaur: SAV_MailBox.L_PKM2=Bulbasaur: SAV_MailBox.L_PKM3=Bulbasaur: @@ -1875,7 +1875,7 @@ SAV_PokedexGG.L_RHeightMin=Min SAV_PokedexGG.L_RWeight=Peso SAV_PokedexGG.L_RWeightMax=Max SAV_PokedexGG.L_RWeightMin=Min -SAV_PokedexLA.B_AdvancedResearch=Modifica Incarichi +SAV_PokedexLA.B_AdvancedResearch=Mod. Incarichi... SAV_PokedexLA.B_Cancel=Annulla SAV_PokedexLA.B_Report=Dati Report SAV_PokedexLA.B_Save=Salva @@ -1888,7 +1888,7 @@ SAV_PokedexLA.CHK_C4=*Maschio* SAV_PokedexLA.CHK_C5=*Femmina* SAV_PokedexLA.CHK_C6=*Alfa Maschio* SAV_PokedexLA.CHK_C7=*Alfa Femmina* -SAV_PokedexLA.CHK_Complete=Completo +SAV_PokedexLA.CHK_Complete=Completa SAV_PokedexLA.CHK_G=Femmina SAV_PokedexLA.CHK_MinAndMax=Ha sia Min che Max SAV_PokedexLA.CHK_O0=Maschio @@ -1899,7 +1899,7 @@ SAV_PokedexLA.CHK_O4=*Maschio* SAV_PokedexLA.CHK_O5=*Femmina* SAV_PokedexLA.CHK_O6=*Alfa Maschio* SAV_PokedexLA.CHK_O7=*Alfa Femmina* -SAV_PokedexLA.CHK_Perfect=Perfetto +SAV_PokedexLA.CHK_Perfect=Perfetta SAV_PokedexLA.CHK_S=Cromatico SAV_PokedexLA.CHK_S0=Maschio SAV_PokedexLA.CHK_S1=Femmina @@ -1909,22 +1909,22 @@ SAV_PokedexLA.CHK_S4=*Maschio* SAV_PokedexLA.CHK_S5=*Femmina* SAV_PokedexLA.CHK_S6=*Alfa Maschio* SAV_PokedexLA.CHK_S7=*Alfa Femmina* -SAV_PokedexLA.CHK_Seen=Visti: -SAV_PokedexLA.CHK_Solitude=Via dei Solitari completata -SAV_PokedexLA.GB_CaughtInWild=Catturato come Selv. +SAV_PokedexLA.CHK_Seen=Visto +SAV_PokedexLA.CHK_Solitude=Via dei solitari completata +SAV_PokedexLA.GB_CaughtInWild=Catturato (Selvatico) SAV_PokedexLA.GB_Displayed=Visualizzato SAV_PokedexLA.GB_Height=Altezza SAV_PokedexLA.GB_Obtained=Ottenuto SAV_PokedexLA.GB_ResearchTasks=Missioni Ricerca -SAV_PokedexLA.GB_SeenInWild=Visto come Selvatico +SAV_PokedexLA.GB_SeenInWild=Visto (Selvatico) SAV_PokedexLA.GB_Statistics=Statistiche SAV_PokedexLA.GB_Weight=Peso SAV_PokedexLA.L_ConnectHeight=- SAV_PokedexLA.L_ConnectWeight=- SAV_PokedexLA.L_DisplayedForm=Forma visualizzata: SAV_PokedexLA.L_goto=vai a: -SAV_PokedexLA.L_ResearchLevelReported=Inviati: -SAV_PokedexLA.L_ResearchLevelUnreported=Non inviati:: +SAV_PokedexLA.L_ResearchLevelReported=Rapportato: +SAV_PokedexLA.L_ResearchLevelUnreported=Senza rapp.: SAV_PokedexLA.L_TheoryHeight=- SAV_PokedexLA.L_TheoryWeight=- SAV_PokedexLA.L_UpdateIndex=Indice: @@ -2524,7 +2524,7 @@ SAV_Trainer8a.L_MeritEarned=Punti di Merito Ottenuti: SAV_Trainer8a.L_Minutes=Min: SAV_Trainer8a.L_Money=$: SAV_Trainer8a.L_R=Rotazione: -SAV_Trainer8a.L_SatchelUpgrades=Ampliamenti di Crescenzo: +SAV_Trainer8a.L_SatchelUpgrades=Espansioni Borsello: SAV_Trainer8a.L_Seconds=Sec: SAV_Trainer8a.L_Started=Gioco iniziato: SAV_Trainer8a.L_TrainerName=Nome Allenatore: @@ -2675,7 +2675,7 @@ SAV_UnityTower.B_ClearLocations=Cancella località SAV_UnityTower.B_Save=Salva SAV_UnityTower.B_SetAllLegalLocations=Imposta località legali SAV_UnityTower.B_SetAllLocations=Imposta tutte le località -SAV_UnityTower.CHK_GlobalFlag=Intero globo visibile +SAV_UnityTower.CHK_GlobalFlag=Globo intero visibile SAV_UnityTower.CHK_UnityTowerFlag=Torre Unione sbloccata SAV_UnityTower.DGV_Item_Country=Paese SAV_UnityTower.DGV_Item_Floor=Piano diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index caf040fa4..7c6f698a0 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -1888,7 +1888,7 @@ SAV_PokedexLA.CHK_C4=이로치 수컷 SAV_PokedexLA.CHK_C5=이로치 암컷 SAV_PokedexLA.CHK_C6=이로치 우두머리 수컷 SAV_PokedexLA.CHK_C7=이로치 우두머리 암컷 -SAV_PokedexLA.CHK_Complete=완료 +SAV_PokedexLA.CHK_Complete=완성 SAV_PokedexLA.CHK_G=암컷 SAV_PokedexLA.CHK_MinAndMax=최소 및 최대 보유 SAV_PokedexLA.CHK_O0=수컷 From 583a45781806c68ac4eb04a240c9bee85ab79918 Mon Sep 17 00:00:00 2001 From: Kurt Date: Mon, 4 May 2026 19:22:03 -0500 Subject: [PATCH 15/81] Gen6/7: Check for missing geo history region Also update the report to indicate which index triggered the flag. --- .../Localization/LegalityCheckLocalization.cs | 4 +- .../LegalityCheckResultCodeExtensions.cs | 5 +- .../Structures/LegalityCheckResultCode.cs | 5 +- .../Legality/Verifiers/HistoryVerifier.cs | 9 ++-- PKHeX.Core/PKM/Interfaces/IGeoTrack.cs | 52 ++++++++++++------- .../localize/legality/legality_de.json | 5 +- .../localize/legality/legality_en.json | 5 +- .../localize/legality/legality_es-419.json | 5 +- .../localize/legality/legality_es.json | 5 +- .../localize/legality/legality_fr.json | 5 +- .../localize/legality/legality_it.json | 5 +- .../localize/legality/legality_ja.json | 5 +- .../localize/legality/legality_ko.json | 5 +- .../localize/legality/legality_zh-hans.json | 5 +- .../localize/legality/legality_zh-hant.json | 5 +- 15 files changed, 77 insertions(+), 48 deletions(-) diff --git a/PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs b/PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs index d410a236e..15af09a06 100644 --- a/PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs +++ b/PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs @@ -221,7 +221,9 @@ public sealed class LegalityCheckLocalization public string GeoHardwareValid { get; init; } = "Geolocation: Country is in 3DS region."; public string GeoMemoryMissing { get; init; } = "GeoLocation Memory: Memories should be present."; public string GeoNoCountryHT { get; init; } = "GeoLocation Memory: HT Name present but has no previous Country."; - public string GeoNoRegion { get; init; } = "GeoLocation Memory: Region without Country."; + public string GeoBadOrder_0 { get; init; } = "GeoLocation Memory #{0}: Gap/Blank present."; + public string GeoNoCountry_0 { get; init; } = "GeoLocation Memory #{0}: Region without Country."; + public string GeoNoRegion_0 { get; init; } = "GeoLocation Memory #{0}: Country without Region."; public string HyperTrainLevelGEQ_0 { get; init; } = "Can't Hyper Train a Pokémon that isn't level {0}."; public string HyperPerfectAll { get; init; } = "Can't Hyper Train a Pokémon with perfect IVs."; diff --git a/PKHeX.Core/Legality/Localization/LegalityCheckResultCodeExtensions.cs b/PKHeX.Core/Legality/Localization/LegalityCheckResultCodeExtensions.cs index 711cc6d8f..f577c052a 100644 --- a/PKHeX.Core/Legality/Localization/LegalityCheckResultCodeExtensions.cs +++ b/PKHeX.Core/Legality/Localization/LegalityCheckResultCodeExtensions.cs @@ -247,13 +247,14 @@ public static class LegalityCheckResultCodeExtensions G7BSocialShouldBe100Mood => localization.G7BSocialShouldBe100Mood, GanbaruStatLEQ_01 => localization.GanbaruStatTooHigh, GenderInvalidNone => localization.GenderInvalidNone, - GeoBadOrder => localization.GeoBadOrder, GeoHardwareInvalid => localization.GeoHardwareInvalid, GeoHardwareRange => localization.GeoHardwareRange, GeoHardwareValid => localization.GeoHardwareValid, GeoMemoryMissing => localization.GeoMemoryMissing, GeoNoCountryHT => localization.GeoNoCountryHT, - GeoNoRegion => localization.GeoNoRegion, + GeoBadOrder_0 => localization.GeoBadOrder_0, + GeoNoCountry_0 => localization.GeoNoCountry_0, + GeoNoRegion_0 => localization.GeoNoRegion_0, HintEvolvesToSpecies_0 => localization.HintEvolvesToSpecies_0, HintEvolvesToRareForm_0 => localization.HintEvolvesToRareForm_0, ItemEgg => localization.ItemEgg, diff --git a/PKHeX.Core/Legality/Structures/LegalityCheckResultCode.cs b/PKHeX.Core/Legality/Structures/LegalityCheckResultCode.cs index dd6eea4d0..e9ee76017 100644 --- a/PKHeX.Core/Legality/Structures/LegalityCheckResultCode.cs +++ b/PKHeX.Core/Legality/Structures/LegalityCheckResultCode.cs @@ -193,13 +193,11 @@ public enum LegalityCheckResultCode : ushort GenderInvalidNone, // Geography - GeoBadOrder, GeoHardwareInvalid, GeoHardwareRange, GeoHardwareValid, GeoMemoryMissing, GeoNoCountryHT, - GeoNoRegion, // Hints @@ -405,6 +403,9 @@ public enum LegalityCheckResultCode : ushort PokerusStrainUnobtainable_0, // strain MemoryHTGender_0, // gender value G6SuperTrainBagInvalid_0, + GeoBadOrder_0, + GeoNoCountry_0, + GeoNoRegion_0, StatIncorrectHeightValue_0, StatIncorrectWeightValue_0, StatIncorrectScaleValue_0, diff --git a/PKHeX.Core/Legality/Verifiers/HistoryVerifier.cs b/PKHeX.Core/Legality/Verifiers/HistoryVerifier.cs index 6ed635bc6..baab047f6 100644 --- a/PKHeX.Core/Legality/Verifiers/HistoryVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/HistoryVerifier.cs @@ -261,11 +261,14 @@ private void VerifyHTMisc(LegalityAnalysis data) private void VerifyGeoLocationData(LegalityAnalysis data, IGeoTrack t, PKM pk) { - var valid = t.GetValidity(); + var (valid, index) = t.GetValidity(); if (valid == GeoValid.CountryAfterPreviousEmpty) - data.AddLine(GetInvalid(GeoBadOrder)); + data.AddLine(GetInvalid(GeoBadOrder_0, index)); else if (valid == GeoValid.RegionWithoutCountry) - data.AddLine(GetInvalid(GeoNoRegion)); + data.AddLine(GetInvalid(GeoNoCountry_0, index)); + else if (valid == GeoValid.CountryDoesNotHaveRegion) + data.AddLine(GetInvalid(GeoNoRegion_0, index)); + if (t.Geo1_Country != 0 && pk.IsUntraded) // traded data.AddLine(GetInvalid(GeoNoCountryHT)); } diff --git a/PKHeX.Core/PKM/Interfaces/IGeoTrack.cs b/PKHeX.Core/PKM/Interfaces/IGeoTrack.cs index 3e9c69e2e..e20743853 100644 --- a/PKHeX.Core/PKM/Interfaces/IGeoTrack.cs +++ b/PKHeX.Core/PKM/Interfaces/IGeoTrack.cs @@ -99,36 +99,43 @@ public void SanitizeGeoLocationData() /// /// Checks if all Geolocation tuples are valid. /// - public bool GetIsValid() => g.GetValidity() == GeoValid.Valid; + public bool GetIsValid() => g.GetValidity().Result == GeoValid.Valid; /// /// Checks if all Geolocation tuples are valid. /// - internal GeoValid GetValidity() + internal (GeoValid Result, byte Index) GetValidity() { - bool end = false; + bool seenEmpty = false; GeoValid result; - if ((result = UpdateCheck(g.Geo1_Country, g.Geo1_Region, ref end)) != GeoValid.Valid) - return result; - if ((result = UpdateCheck(g.Geo2_Country, g.Geo2_Region, ref end)) != GeoValid.Valid) - return result; - if ((result = UpdateCheck(g.Geo3_Country, g.Geo3_Region, ref end)) != GeoValid.Valid) - return result; - if ((result = UpdateCheck(g.Geo4_Country, g.Geo4_Region, ref end)) != GeoValid.Valid) - return result; - if ((result = UpdateCheck(g.Geo5_Country, g.Geo5_Region, ref end)) != GeoValid.Valid) - return result; + if ((result = UpdateCheck(g.Geo1_Country, g.Geo1_Region, ref seenEmpty)) != GeoValid.Valid) + return (result, 1); + if ((result = UpdateCheck(g.Geo2_Country, g.Geo2_Region, ref seenEmpty)) != GeoValid.Valid) + return (result, 2); + if ((result = UpdateCheck(g.Geo3_Country, g.Geo3_Region, ref seenEmpty)) != GeoValid.Valid) + return (result, 3); + if ((result = UpdateCheck(g.Geo4_Country, g.Geo4_Region, ref seenEmpty)) != GeoValid.Valid) + return (result, 4); + if ((result = UpdateCheck(g.Geo5_Country, g.Geo5_Region, ref seenEmpty)) != GeoValid.Valid) + return (result, 5); - return GeoValid.Valid; + return (GeoValid.Valid, 0); - static GeoValid UpdateCheck(byte country, byte region, ref bool end) + static GeoValid UpdateCheck(byte country, byte region, ref bool seenEmpty) { - if (country != 0) - return end ? GeoValid.CountryAfterPreviousEmpty : GeoValid.Valid; - if (region != 0) // c == 0 + if (country == 0) + { + if (region == 0) + { + seenEmpty = true; + return GeoValid.Valid; + } return GeoValid.RegionWithoutCountry; - end = true; - return GeoValid.Valid; + } + if (!GeoLocation.GetIsCountryRegionExist(country, region)) + return GeoValid.CountryDoesNotHaveRegion; + + return seenEmpty ? GeoValid.CountryAfterPreviousEmpty : GeoValid.Valid; } } } @@ -151,4 +158,9 @@ internal enum GeoValid /// Zero-value country (None) with a non-zero Region (invalid). /// RegionWithoutCountry, + + /// + /// Region does not exist within the Country (invalid). + /// + CountryDoesNotHaveRegion, } diff --git a/PKHeX.Core/Resources/localize/legality/legality_de.json b/PKHeX.Core/Resources/localize/legality/legality_de.json index 2b25b95a6..31badb058 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_de.json +++ b/PKHeX.Core/Resources/localize/legality/legality_de.json @@ -159,13 +159,14 @@ "G7BSocialShouldBe100Mood": "Der Laune-Wert sollte bei 100 liegen, wenn sich das Pokémon nicht im Team des Spielers befindet.", "GanbaruStatTooHigh": "Ein oder mehrere Leistungslevel liegen über dem natürlichen Limit von (10 - DV-Bonus).", "GenderInvalidNone": "Geschlechtslose Pokémon sollten kein Geschlecht haben.", - "GeoBadOrder": "Standort-Verlauf: Lücke oder leerer Eintrag vorhanden.", + "GeoBadOrder_0": "Standort-Verlauf #{0}: Lücke oder leerer Eintrag vorhanden.", "GeoHardwareInvalid": "Standort: Land liegt nicht in der 3DS-Region.", "GeoHardwareRange": "Ungültige Konsolen-Region.", "GeoHardwareValid": "Standort: Land liegt in der 3DS-Region.", "GeoMemoryMissing": "Standort-Verlauf: Einträge sollten vorhanden sein.", "GeoNoCountryHT": "Standort-Verlauf: Name des HT vorhanden, aber kein vorheriges Land angegeben.", - "GeoNoRegion": "Standort-Verlauf: Region ohne Land angegeben.", + "GeoNoCountry_0": "Standort-Verlauf #{0}: Region ohne Land angegeben.", + "GeoNoRegion_0": "Standort-Verlauf #{0}: Land ohne Region angegeben.", "HyperTrainLevelGEQ_0": "Super-Spezialtraining ist erst ab Level {0} möglich.", "HyperPerfectAll": "Ein Pokémon mit perfekten DV-Werten kann kein Supertraining absolvieren.", "HyperPerfectOne": "Ein perfekter DV-Wert kann nicht durch Super-Spezialtraining erhöht werden.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_en.json b/PKHeX.Core/Resources/localize/legality/legality_en.json index 64f03f4ea..649a8c774 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_en.json +++ b/PKHeX.Core/Resources/localize/legality/legality_en.json @@ -159,13 +159,14 @@ "G7BSocialShouldBe100Mood": "Mood should be 100 for Pokémon not in the player's party.", "GanbaruStatTooHigh": "One or more Ganbaru Value is above the natural limit of (10 - IV bonus).", "GenderInvalidNone": "Genderless Pokémon should not have a gender.", - "GeoBadOrder": "GeoLocation Memory: Gap/Blank present.", + "GeoBadOrder_0": "GeoLocation Memory #{0}: Gap/Blank present.", "GeoHardwareInvalid": "Geolocation: Country is not in 3DS region.", "GeoHardwareRange": "Invalid Console Region.", "GeoHardwareValid": "Geolocation: Country is in 3DS region.", "GeoMemoryMissing": "GeoLocation Memory: Memories should be present.", "GeoNoCountryHT": "GeoLocation Memory: HT Name present but has no previous Country.", - "GeoNoRegion": "GeoLocation Memory: Region without Country.", + "GeoNoCountry_0": "GeoLocation Memory #{0}: Region without Country.", + "GeoNoRegion_0": "GeoLocation Memory #{0}: Country without Region.", "HyperTrainLevelGEQ_0": "Can't Hyper Train a Pokémon that isn't level {0}.", "HyperPerfectAll": "Can't Hyper Train a Pokémon with perfect IVs.", "HyperPerfectOne": "Can't Hyper Train a perfect IV.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_es-419.json b/PKHeX.Core/Resources/localize/legality/legality_es-419.json index ac5c3f86e..699ae61c0 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_es-419.json +++ b/PKHeX.Core/Resources/localize/legality/legality_es-419.json @@ -159,13 +159,14 @@ "G7BSocialShouldBe100Mood": "El humor debería ser 100 para Pokémon que no están en el equipo.", "GanbaruStatTooHigh": "Uno o más niveles de esfuerzo están por encima del límite natural de (10 - bonificación de IV).", "GenderInvalidNone": "Pokémon sin género no debería tener género.", - "GeoBadOrder": "Recuerdo de Geolocalización: En blanco/nulo.", + "GeoBadOrder_0": "Recuerdo de Geolocalización #{0}: En blanco/nulo.", "GeoHardwareInvalid": "Geolocalización: El país no se encuentra en la región de la 3DS.", "GeoHardwareRange": "Región de consola inválida.", "GeoHardwareValid": "Geolocalización: El país está en la región de la 3DS.", "GeoMemoryMissing": "Recuerdo de Geolocalización: Los recuerdos deberían estar presentes.", "GeoNoCountryHT": "Recuerdo de Geolocalización: El nombre del entrenador anterior aparece pero no tiene país anterior.", - "GeoNoRegion": "Recuerdo de Geolocalización: Región sin país.", + "GeoNoCountry_0": "Recuerdo de Geolocalización #{0}: Región sin país.", + "GeoNoRegion_0": "Recuerdo de Geolocalización #{0}: País sin región.", "HyperTrainLevelGEQ_0": "No se puede usar el Entrenamiento Extremo en un Pokémon que no esté al nivel {0}.", "HyperPerfectAll": "No se puede usar el Entrenamiento Extremo con IVs perfectos.", "HyperPerfectOne": "No se puede usar el Entrenamiento Extremo con un IV perfecto.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_es.json b/PKHeX.Core/Resources/localize/legality/legality_es.json index 966fa326a..dd8b7c399 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_es.json +++ b/PKHeX.Core/Resources/localize/legality/legality_es.json @@ -159,13 +159,14 @@ "G7BSocialShouldBe100Mood": "El humor debería ser 100 para Pokémon que no están en el equipo.", "GanbaruStatTooHigh": "Uno o más niveles de esfuerzo están por encima del límite natural de (10 - bonificación de IV).", "GenderInvalidNone": "Pokémon sin género no debería tener género.", - "GeoBadOrder": "Recuerdo de Geolocalización: En blanco/nulo.", + "GeoBadOrder_0": "Recuerdo de Geolocalización #{0}: En blanco/nulo.", "GeoHardwareInvalid": "Geolocalización: El país no se encuentra en la región de la 3DS.", "GeoHardwareRange": "Región de consola inválida.", "GeoHardwareValid": "Geolocalización: El país está en la región de la 3DS.", "GeoMemoryMissing": "Recuerdo de Geolocalización: Los recuerdos deberían estar presentes.", "GeoNoCountryHT": "Recuerdo de Geolocalización: El nombre del entrenador anterior aparece pero no tiene país anterior.", - "GeoNoRegion": "Recuerdo de Geolocalización: Región sin país.", + "GeoNoCountry_0": "Recuerdo de Geolocalización #{0}: Región sin país.", + "GeoNoRegion_0": "Recuerdo de Geolocalización #{0}: País sin región.", "HyperTrainLevelGEQ_0": "No se puede usar el Entrenamiento Extremo en un Pokémon que no esté al nivel {0}.", "HyperPerfectAll": "No se puede usar el Entrenamiento Extremo con IVs perfectos.", "HyperPerfectOne": "No se puede usar el Entrenamiento Extremo con un IV perfecto.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_fr.json b/PKHeX.Core/Resources/localize/legality/legality_fr.json index 2438242c3..1d12cd611 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_fr.json +++ b/PKHeX.Core/Resources/localize/legality/legality_fr.json @@ -159,13 +159,14 @@ "G7BSocialShouldBe100Mood": "Les Pokémon hors de l'Équipe devraient avoir leur Humeur à 100.", "GanbaruStatTooHigh": "Une ou plusieurs valeurs du niveau d'effort sont supérieures à la limite naturelle de (10 - IV bonus).", "GenderInvalidNone": "Les Pokémon asexués ne peuvent pas être genrés.", - "GeoBadOrder": "Mémoire géolocalisations : Vide présent.", + "GeoBadOrder_0": "Mémoire géolocalisations #{0} : Vide présent.", "GeoHardwareInvalid": "Géolocalisations : Le pays n'est pas inclus dans une région 3DS.", "GeoHardwareRange": "Région de Console invalide.", "GeoHardwareValid": "Géolocalisations : Le pays est inclus dans une région 3DS.", "GeoMemoryMissing": "Souvenirs géolocalisations : des Souvenirs devraient être présents.", "GeoNoCountryHT": "Souvenirs géolocalisations : Nom de Dresseur Connu présent mais pays précédent manquant.", - "GeoNoRegion": "Mémoire géolocalisations : Région sans pays.", + "GeoNoCountry_0": "Mémoire géolocalisations #{0} : Région sans pays.", + "GeoNoRegion_0": "Mémoire géolocalisations #{0} : Pays sans région.", "HyperTrainLevelGEQ_0": "Impossible de faire subir l'Entraînement Ultime à un Pokémon au-dessous du niveau {0}.", "HyperPerfectAll": "Impossible de faire subir l'Entraînement Ultime à un Pokémon aux IVs parfaits.", "HyperPerfectOne": "Impossible de faire subir l'Entraînement Ultime à une statistique aux IVs parfaits.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_it.json b/PKHeX.Core/Resources/localize/legality/legality_it.json index fd1def172..bf2175215 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_it.json +++ b/PKHeX.Core/Resources/localize/legality/legality_it.json @@ -159,13 +159,14 @@ "G7BSocialShouldBe100Mood": "L'Umore deve essere 100 per i Pokémon non presenti in squadra.", "GanbaruStatTooHigh": "Uno o più livelli di impegno sono superiori al limite naturale di (10 - bonus IV).", "GenderInvalidNone": "I Pokémon senza sesso non dovrebbero avere un Sesso.", - "GeoBadOrder": "Ricordo geolocalizzazione: presenza di lacune o spazi vuoti.", + "GeoBadOrder_0": "Ricordo geolocalizzazione #{0}: presenza di lacune o spazi vuoti.", "GeoHardwareInvalid": "Geolocalizzazione: La nazione non è disponibile nel 3DS.", "GeoHardwareRange": "Regione della console non valida.", "GeoHardwareValid": "Geolocalizzazione: la nazione è disponibile nel 3DS.", "GeoMemoryMissing": "Ricordo geolocalizzazione: le Ricordi dovrebbero essere presenti.", "GeoNoCountryHT": "Ricordo geolocalizzazione: è presente un nome per l'Ultimo Allenatore, ma non ha una nazione.", - "GeoNoRegion": "Ricordo geolocalizzazione: la regione è senza nazione.", + "GeoNoCountry_0": "Ricordo geolocalizzazione #{0}: la regione è senza nazione.", + "GeoNoRegion_0": "Ricordo geolocalizzazione #{0}: la nazione è senza regione.", "HyperTrainLevelGEQ_0": "Impossibile usare l'Allenamento Pro su un Pokémon che non sia al livello {0}.", "HyperPerfectAll": "Impossibile usare l'Allenamento Pro su un Pokémon con IV perfetti.", "HyperPerfectOne": "Impossibile usare l'Allenamento Pro un IV perfetto.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_ja.json b/PKHeX.Core/Resources/localize/legality/legality_ja.json index 5a4858b1f..21d195867 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_ja.json +++ b/PKHeX.Core/Resources/localize/legality/legality_ja.json @@ -159,13 +159,14 @@ "G7BSocialShouldBe100Mood": "Mood should be 100 for Pokémon not in the player's party.", "GanbaruStatTooHigh": "1つ以上のがんばレベルが通常限界値(10-個体値ボーナス)を超えています。", "GenderInvalidNone": "性別不明のポケモンは性別を持ちません。", - "GeoBadOrder": "地域(おもいで):空白があります。", + "GeoBadOrder_0": "地域(おもいで)#{0}:空白があります。", "GeoHardwareInvalid": "地域設定:この国は3DS地域設定にありません。", "GeoHardwareRange": "不正な地域", "GeoHardwareValid": "地域設定:この国は3DS地域設定にあります。", "GeoMemoryMissing": "地域設定(おもいで): おもいでがありません。", "GeoNoCountryHT": "地域設定(おもいで): トレーナー名が存在しますが、国の設定がされていません。", - "GeoNoRegion": "地域設定(おもいで): 国設定なしに地域設定されています。", + "GeoNoCountry_0": "地域設定(おもいで)#{0}: 国設定なしに地域設定されています。", + "GeoNoRegion_0": "地域設定(おもいで)#{0}: 国設定ありで地域設定がありません。", "HyperTrainLevelGEQ_0": "すごいとっくんをするにはレベル{0}でなければなりません。", "HyperPerfectAll": "全ての個体値が31のためすごいとっくんはできません。", "HyperPerfectOne": "個体値31にはすごいとっくんはできません。", diff --git a/PKHeX.Core/Resources/localize/legality/legality_ko.json b/PKHeX.Core/Resources/localize/legality/legality_ko.json index b7abd2891..40aef64e4 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_ko.json +++ b/PKHeX.Core/Resources/localize/legality/legality_ko.json @@ -159,13 +159,14 @@ "G7BSocialShouldBe100Mood": "지니고 있는 포켓몬이 아닐 경우 '기분' 수치는 100이어야 합니다.", "GanbaruStatTooHigh": "하나 이상의 노력 레벨이 자연적인 한도(10 - IV 보너스)를 초과했습니다.", "GenderInvalidNone": "무성 포켓몬은 성별을 가질 수 없습니다.", - "GeoBadOrder": "지오로케이션 기억: 빈 공간이 존재합니다.", + "GeoBadOrder_0": "지오로케이션 기억 #{0}: 빈 공간이 존재합니다.", "GeoHardwareInvalid": "지오로케이션: 국가가 3DS 지역 내에 있지 않습니다.", "GeoHardwareRange": "사용할 수 없는 3DS 지역입니다.", "GeoHardwareValid": "지오로케이션: 국가가 3DS 지역 내에 있습니다.", "GeoMemoryMissing": "지오로케이션 기억: 기억이 존재해야 합니다.", "GeoNoCountryHT": "지오로케이션 기억: 소유했던 트레이너의 이름이 존재하지만 이전 국가가 설정되어 있지 않습니다.", - "GeoNoRegion": "지오로케이션 기억: 국가는 설정되어 있지만 지역이 설정되어 있지 않습니다.", + "GeoNoCountry_0": "지오로케이션 기억 #{0}: 국가는 없지만 지역이 설정되어 있습니다.", + "GeoNoRegion_0": "지오로케이션 기억 #{0}: 국가는 설정되어 있지만 지역이 설정되어 있지 않습니다.", "HyperTrainLevelGEQ_0": "레벨 {0} 미만인 포켓몬은 대단한 특훈을 받을 수 없습니다.", "HyperPerfectAll": "모든 IV가 31인 포켓몬은 대단한 특훈을 받을 수 없습니다.", "HyperPerfectOne": "IV 31은 대단한 특훈을 시킬 수 없습니다.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json b/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json index f9b4234f2..28b6a14c0 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json +++ b/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json @@ -159,13 +159,14 @@ "G7BSocialShouldBe100Mood": "不在玩家队伍中的宝可梦,其心情值应为 100。", "GanbaruStatTooHigh": "一项或多项奋斗等级超过上限 (10 - IV个体值提升等级)。", "GenderInvalidNone": "无性别宝可梦不能有性别。", - "GeoBadOrder": "地理位置回忆: 间隔/空白存在。", + "GeoBadOrder_0": "地理位置回忆#{0}: 间隔/空白存在。", "GeoHardwareInvalid": "地理位置: 国家不在3DS区域内。", "GeoHardwareRange": "非法主机系统。", "GeoHardwareValid": "地理位置: 国家在3DS区域内。", "GeoMemoryMissing": "地理位置回忆: 回忆应该存在。", "GeoNoCountryHT": "地理位置回忆: 持有人名称存在但没有故居。", - "GeoNoRegion": "地理位置回忆: 地区没有国家。", + "GeoNoCountry_0": "地理位置回忆#{0}: 地区没有国家。", + "GeoNoRegion_0": "地理位置回忆#{0}: 国家没有地区。", "HyperTrainLevelGEQ_0": "不能对未满{0}级的宝可梦极限特训。", "HyperPerfectAll": "不能对完美个体的宝可梦极限特训。", "HyperPerfectOne": "不能对完美个体项极限特训。", diff --git a/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json b/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json index c67fedc84..08cd18ecf 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json +++ b/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json @@ -159,13 +159,14 @@ "G7BSocialShouldBe100Mood": "不在玩家隊伍中的寶可夢,其心情值應為 100。", "GanbaruStatTooHigh": "一項或多項奮鬥等級超過上限 (10 減 IV 個體值提升奮鬥等級)。", "GenderInvalidNone": "無性別寶可夢不能有性別。", - "GeoBadOrder": "地理位置回憶: 間隔/空白存在。", + "GeoBadOrder_0": "地理位置回憶#{0}: 間隔/空白存在。", "GeoHardwareInvalid": "地理位置: 國家/地區不在3DS區域內。", "GeoHardwareRange": "不合法主機系統。", "GeoHardwareValid": "地理位置: 國家/地區在3DS區域內。", "GeoMemoryMissing": "地理位置回憶: 回憶應該存在。", "GeoNoCountryHT": "地理位置回憶: 持有人名稱存在但沒有故居。", - "GeoNoRegion": "地理位置回憶: 地區沒有國家。", + "GeoNoCountry_0": "地理位置回憶#{0}: 地區沒有國家。", + "GeoNoRegion_0": "地理位置回憶#{0}: 國家沒有地區。", "HyperTrainLevelGEQ_0": "不能對未滿{0}級之寶可夢極限特訓。", "HyperPerfectAll": "不能對完美個體之寶可夢極限特訓。", "HyperPerfectOne": "不能對完美個體項極限特訓。", From c7d63571331a84f4340327a1bfdef0eaff702a6f Mon Sep 17 00:00:00 2001 From: Kurt Date: Mon, 4 May 2026 21:18:46 -0500 Subject: [PATCH 16/81] Reflow trainer9 editor now allows for wider label text --- .../Gen9/SAV_Trainer9.Designer.cs | 206 +++++++++++------- 1 file changed, 124 insertions(+), 82 deletions(-) diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen9/SAV_Trainer9.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen9/SAV_Trainer9.Designer.cs index bcdb2de9d..1babf45d8 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen9/SAV_Trainer9.Designer.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen9/SAV_Trainer9.Designer.cs @@ -133,6 +133,8 @@ private void InitializeComponent() B_ActivateSnacksworthLegendaries = new System.Windows.Forms.Button(); CB_ThrowStyle = new System.Windows.Forms.ComboBox(); L_ThrowStyle = new System.Windows.Forms.Label(); + TLP_BBQ = new System.Windows.Forms.TableLayoutPanel(); + FLP_BP = new System.Windows.Forms.FlowLayoutPanel(); TC_Editor.SuspendLayout(); Tab_Overview.SuspendLayout(); Tab_MiscValues.SuspendLayout(); @@ -149,6 +151,8 @@ private void InitializeComponent() GB_BBQ.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)NUD_BBQSolo).BeginInit(); ((System.ComponentModel.ISupportInitialize)NUD_BBQGroup).BeginInit(); + TLP_BBQ.SuspendLayout(); + FLP_BP.SuspendLayout(); SuspendLayout(); // // B_Cancel @@ -190,10 +194,10 @@ private void InitializeComponent() // // L_TrainerName // - L_TrainerName.Location = new System.Drawing.Point(66, 13); + L_TrainerName.Location = new System.Drawing.Point(5, 13); L_TrainerName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); L_TrainerName.Name = "L_TrainerName"; - L_TrainerName.Size = new System.Drawing.Size(104, 24); + L_TrainerName.Size = new System.Drawing.Size(165, 24); L_TrainerName.TabIndex = 3; L_TrainerName.Text = "Trainer Name:"; L_TrainerName.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -211,10 +215,10 @@ private void InitializeComponent() // // L_Money // - L_Money.Location = new System.Drawing.Point(132, 69); + L_Money.Location = new System.Drawing.Point(5, 69); L_Money.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); L_Money.Name = "L_Money"; - L_Money.Size = new System.Drawing.Size(37, 23); + L_Money.Size = new System.Drawing.Size(165, 24); L_Money.TabIndex = 5; L_Money.Text = "$:"; L_Money.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -333,10 +337,10 @@ private void InitializeComponent() // // L_Hours // - L_Hours.Location = new System.Drawing.Point(100, 178); + L_Hours.Location = new System.Drawing.Point(5, 178); L_Hours.Margin = new System.Windows.Forms.Padding(0); L_Hours.Name = "L_Hours"; - L_Hours.Size = new System.Drawing.Size(70, 24); + L_Hours.Size = new System.Drawing.Size(165, 24); L_Hours.TabIndex = 26; L_Hours.Text = "Hrs:"; L_Hours.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -347,16 +351,16 @@ private void InitializeComponent() MT_Hours.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); MT_Hours.Mask = "00000"; MT_Hours.Name = "MT_Hours"; - MT_Hours.Size = new System.Drawing.Size(56, 25); + MT_Hours.Size = new System.Drawing.Size(48, 25); MT_Hours.TabIndex = 25; MT_Hours.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; // // L_Language // - L_Language.Location = new System.Drawing.Point(66, 150); + L_Language.Location = new System.Drawing.Point(5, 150); L_Language.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); L_Language.Name = "L_Language"; - L_Language.Size = new System.Drawing.Size(104, 24); + L_Language.Size = new System.Drawing.Size(165, 24); L_Language.TabIndex = 21; L_Language.Text = "Language:"; L_Language.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -649,7 +653,7 @@ private void InitializeComponent() TC_Editor.Controls.Add(Tab_Images); TC_Editor.Controls.Add(Tab_Blueberry); TC_Editor.Location = new System.Drawing.Point(0, 0); - TC_Editor.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + TC_Editor.Margin = new System.Windows.Forms.Padding(4); TC_Editor.Name = "TC_Editor"; TC_Editor.SelectedIndex = 0; TC_Editor.Size = new System.Drawing.Size(496, 307); @@ -703,10 +707,10 @@ private void InitializeComponent() // // L_LastSaved // - L_LastSaved.Location = new System.Drawing.Point(75, 232); + L_LastSaved.Location = new System.Drawing.Point(5, 232); L_LastSaved.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); L_LastSaved.Name = "L_LastSaved"; - L_LastSaved.Size = new System.Drawing.Size(93, 23); + L_LastSaved.Size = new System.Drawing.Size(165, 24); L_LastSaved.TabIndex = 56; L_LastSaved.Text = "Last Saved:"; L_LastSaved.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -735,10 +739,10 @@ private void InitializeComponent() // // L_Started // - L_Started.Location = new System.Drawing.Point(46, 206); + L_Started.Location = new System.Drawing.Point(5, 206); L_Started.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); L_Started.Name = "L_Started"; - L_Started.Size = new System.Drawing.Size(124, 23); + L_Started.Size = new System.Drawing.Size(165, 24); L_Started.TabIndex = 73; L_Started.Text = "Game Started:"; L_Started.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -777,10 +781,10 @@ private void InitializeComponent() // // L_LP // - L_LP.Location = new System.Drawing.Point(132, 96); + L_LP.Location = new System.Drawing.Point(5, 96); L_LP.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); L_LP.Name = "L_LP"; - L_LP.Size = new System.Drawing.Size(37, 23); + L_LP.Size = new System.Drawing.Size(165, 24); L_LP.TabIndex = 68; L_LP.Text = "LP:"; L_LP.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -794,9 +798,8 @@ private void InitializeComponent() Tab_MiscValues.Controls.Add(B_UnlockFlyLocations); Tab_MiscValues.Controls.Add(GB_Map); Tab_MiscValues.Location = new System.Drawing.Point(4, 26); - Tab_MiscValues.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + Tab_MiscValues.Margin = new System.Windows.Forms.Padding(4); Tab_MiscValues.Name = "Tab_MiscValues"; - Tab_MiscValues.Padding = new System.Windows.Forms.Padding(5, 4, 5, 4); Tab_MiscValues.Size = new System.Drawing.Size(488, 277); Tab_MiscValues.TabIndex = 4; Tab_MiscValues.Text = "Misc"; @@ -804,10 +807,10 @@ private void InitializeComponent() // // B_UnlockClothing // - B_UnlockClothing.Location = new System.Drawing.Point(290, 125); - B_UnlockClothing.Margin = new System.Windows.Forms.Padding(0); + B_UnlockClothing.Location = new System.Drawing.Point(284, 212); + B_UnlockClothing.Margin = new System.Windows.Forms.Padding(4); B_UnlockClothing.Name = "B_UnlockClothing"; - B_UnlockClothing.Size = new System.Drawing.Size(90, 45); + B_UnlockClothing.Size = new System.Drawing.Size(200, 44); B_UnlockClothing.TabIndex = 64; B_UnlockClothing.Text = "Unlock All Fashion"; B_UnlockClothing.UseVisualStyleBackColor = true; @@ -815,10 +818,10 @@ private void InitializeComponent() // // B_UnlockBikeUpgrades // - B_UnlockBikeUpgrades.Location = new System.Drawing.Point(390, 75); - B_UnlockBikeUpgrades.Margin = new System.Windows.Forms.Padding(0); + B_UnlockBikeUpgrades.Location = new System.Drawing.Point(284, 108); + B_UnlockBikeUpgrades.Margin = new System.Windows.Forms.Padding(4); B_UnlockBikeUpgrades.Name = "B_UnlockBikeUpgrades"; - B_UnlockBikeUpgrades.Size = new System.Drawing.Size(90, 45); + B_UnlockBikeUpgrades.Size = new System.Drawing.Size(200, 44); B_UnlockBikeUpgrades.TabIndex = 63; B_UnlockBikeUpgrades.Text = "Unlock All Bike Upgrades"; B_UnlockBikeUpgrades.UseVisualStyleBackColor = true; @@ -826,10 +829,10 @@ private void InitializeComponent() // // B_UnlockTMRecipes // - B_UnlockTMRecipes.Location = new System.Drawing.Point(290, 75); - B_UnlockTMRecipes.Margin = new System.Windows.Forms.Padding(0); + B_UnlockTMRecipes.Location = new System.Drawing.Point(284, 160); + B_UnlockTMRecipes.Margin = new System.Windows.Forms.Padding(4); B_UnlockTMRecipes.Name = "B_UnlockTMRecipes"; - B_UnlockTMRecipes.Size = new System.Drawing.Size(90, 45); + B_UnlockTMRecipes.Size = new System.Drawing.Size(200, 44); B_UnlockTMRecipes.TabIndex = 62; B_UnlockTMRecipes.Text = "Unlock All TM Recipes"; B_UnlockTMRecipes.UseVisualStyleBackColor = true; @@ -837,10 +840,10 @@ private void InitializeComponent() // // B_CollectAllStakes // - B_CollectAllStakes.Location = new System.Drawing.Point(390, 25); - B_CollectAllStakes.Margin = new System.Windows.Forms.Padding(0); + B_CollectAllStakes.Location = new System.Drawing.Point(284, 56); + B_CollectAllStakes.Margin = new System.Windows.Forms.Padding(4); B_CollectAllStakes.Name = "B_CollectAllStakes"; - B_CollectAllStakes.Size = new System.Drawing.Size(90, 45); + B_CollectAllStakes.Size = new System.Drawing.Size(200, 44); B_CollectAllStakes.TabIndex = 61; B_CollectAllStakes.Text = "Collect All Stakes"; B_CollectAllStakes.UseVisualStyleBackColor = true; @@ -848,10 +851,10 @@ private void InitializeComponent() // // B_UnlockFlyLocations // - B_UnlockFlyLocations.Location = new System.Drawing.Point(290, 25); - B_UnlockFlyLocations.Margin = new System.Windows.Forms.Padding(0); + B_UnlockFlyLocations.Location = new System.Drawing.Point(284, 4); + B_UnlockFlyLocations.Margin = new System.Windows.Forms.Padding(4); B_UnlockFlyLocations.Name = "B_UnlockFlyLocations"; - B_UnlockFlyLocations.Size = new System.Drawing.Size(90, 45); + B_UnlockFlyLocations.Size = new System.Drawing.Size(200, 44); B_UnlockFlyLocations.TabIndex = 60; B_UnlockFlyLocations.Text = "Unlock All Fly Locations"; B_UnlockFlyLocations.UseVisualStyleBackColor = true; @@ -880,12 +883,12 @@ private void InitializeComponent() // NUD_R.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; NUD_R.DecimalPlaces = 6; - NUD_R.Location = new System.Drawing.Point(95, 128); + NUD_R.Location = new System.Drawing.Point(113, 128); NUD_R.Margin = new System.Windows.Forms.Padding(0); NUD_R.Maximum = new decimal(new int[] { 99999999, 0, 0, 0 }); NUD_R.Minimum = new decimal(new int[] { 99999999, 0, 0, int.MinValue }); NUD_R.Name = "NUD_R"; - NUD_R.Size = new System.Drawing.Size(148, 25); + NUD_R.Size = new System.Drawing.Size(130, 25); NUD_R.TabIndex = 55; NUD_R.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; NUD_R.ValueChanged += ChangeMapValue; @@ -895,7 +898,7 @@ private void InitializeComponent() L_R.Location = new System.Drawing.Point(-15, 125); L_R.Margin = new System.Windows.Forms.Padding(0); L_R.Name = "L_R"; - L_R.Size = new System.Drawing.Size(110, 31); + L_R.Size = new System.Drawing.Size(128, 31); L_R.TabIndex = 54; L_R.Text = "Rotation:"; L_R.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -904,12 +907,12 @@ private void InitializeComponent() // NUD_Z.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; NUD_Z.DecimalPlaces = 6; - NUD_Z.Location = new System.Drawing.Point(95, 56); + NUD_Z.Location = new System.Drawing.Point(113, 56); NUD_Z.Margin = new System.Windows.Forms.Padding(0); NUD_Z.Maximum = new decimal(new int[] { 99999999, 0, 0, 0 }); NUD_Z.Minimum = new decimal(new int[] { 99999999, 0, 0, int.MinValue }); NUD_Z.Name = "NUD_Z"; - NUD_Z.Size = new System.Drawing.Size(148, 25); + NUD_Z.Size = new System.Drawing.Size(130, 25); NUD_Z.TabIndex = 53; NUD_Z.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; NUD_Z.ValueChanged += ChangeMapValue; @@ -918,12 +921,12 @@ private void InitializeComponent() // NUD_Y.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; NUD_Y.DecimalPlaces = 6; - NUD_Y.Location = new System.Drawing.Point(95, 92); + NUD_Y.Location = new System.Drawing.Point(113, 92); NUD_Y.Margin = new System.Windows.Forms.Padding(0); NUD_Y.Maximum = new decimal(new int[] { 99999999, 0, 0, 0 }); NUD_Y.Minimum = new decimal(new int[] { 99999999, 0, 0, int.MinValue }); NUD_Y.Name = "NUD_Y"; - NUD_Y.Size = new System.Drawing.Size(148, 25); + NUD_Y.Size = new System.Drawing.Size(130, 25); NUD_Y.TabIndex = 51; NUD_Y.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; NUD_Y.ValueChanged += ChangeMapValue; @@ -932,12 +935,12 @@ private void InitializeComponent() // NUD_X.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; NUD_X.DecimalPlaces = 6; - NUD_X.Location = new System.Drawing.Point(95, 21); + NUD_X.Location = new System.Drawing.Point(113, 21); NUD_X.Margin = new System.Windows.Forms.Padding(0); NUD_X.Maximum = new decimal(new int[] { 99999999, 0, 0, 0 }); NUD_X.Minimum = new decimal(new int[] { 99999999, 0, 0, int.MinValue }); NUD_X.Name = "NUD_X"; - NUD_X.Size = new System.Drawing.Size(148, 25); + NUD_X.Size = new System.Drawing.Size(130, 25); NUD_X.TabIndex = 50; NUD_X.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; NUD_X.ValueChanged += ChangeMapValue; @@ -947,7 +950,7 @@ private void InitializeComponent() L_Y.Location = new System.Drawing.Point(-15, 89); L_Y.Margin = new System.Windows.Forms.Padding(0); L_Y.Name = "L_Y"; - L_Y.Size = new System.Drawing.Size(110, 31); + L_Y.Size = new System.Drawing.Size(128, 31); L_Y.TabIndex = 49; L_Y.Text = "Y Coordinate:"; L_Y.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -957,7 +960,7 @@ private void InitializeComponent() L_Z.Location = new System.Drawing.Point(-15, 53); L_Z.Margin = new System.Windows.Forms.Padding(0); L_Z.Name = "L_Z"; - L_Z.Size = new System.Drawing.Size(110, 31); + L_Z.Size = new System.Drawing.Size(128, 31); L_Z.TabIndex = 48; L_Z.Text = "Z Coordinate:"; L_Z.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -967,7 +970,7 @@ private void InitializeComponent() L_X.Location = new System.Drawing.Point(-15, 18); L_X.Margin = new System.Windows.Forms.Padding(0); L_X.Name = "L_X"; - L_X.Size = new System.Drawing.Size(110, 31); + L_X.Size = new System.Drawing.Size(128, 31); L_X.TabIndex = 47; L_X.Text = "X Coordinate:"; L_X.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -1030,7 +1033,6 @@ private void InitializeComponent() Tab_Blueberry.Controls.Add(L_ThrowStyle); Tab_Blueberry.Location = new System.Drawing.Point(4, 26); Tab_Blueberry.Name = "Tab_Blueberry"; - Tab_Blueberry.Padding = new System.Windows.Forms.Padding(3); Tab_Blueberry.Size = new System.Drawing.Size(488, 277); Tab_Blueberry.TabIndex = 6; Tab_Blueberry.Text = "Blueberry"; @@ -1038,33 +1040,29 @@ private void InitializeComponent() // // GB_BBQ // - GB_BBQ.Controls.Add(L_BP); - GB_BBQ.Controls.Add(B_MaxBP); - GB_BBQ.Controls.Add(MT_BP); - GB_BBQ.Controls.Add(L_BBQSolo); - GB_BBQ.Controls.Add(L_BBQGroup); - GB_BBQ.Controls.Add(NUD_BBQSolo); - GB_BBQ.Controls.Add(NUD_BBQGroup); + GB_BBQ.Controls.Add(TLP_BBQ); GB_BBQ.Location = new System.Drawing.Point(6, 17); GB_BBQ.Name = "GB_BBQ"; - GB_BBQ.Size = new System.Drawing.Size(240, 110); + GB_BBQ.Size = new System.Drawing.Size(271, 110); GB_BBQ.TabIndex = 91; GB_BBQ.TabStop = false; GB_BBQ.Text = "BBQ"; // // L_BP // - L_BP.Location = new System.Drawing.Point(88, 18); - L_BP.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + L_BP.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_BP.AutoSize = true; + L_BP.Location = new System.Drawing.Point(67, 4); + L_BP.Margin = new System.Windows.Forms.Padding(0); L_BP.Name = "L_BP"; - L_BP.Size = new System.Drawing.Size(37, 23); + L_BP.Size = new System.Drawing.Size(25, 17); L_BP.TabIndex = 79; L_BP.Text = "BP:"; L_BP.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // B_MaxBP // - B_MaxBP.Location = new System.Drawing.Point(201, 19); + B_MaxBP.Location = new System.Drawing.Point(67, 0); B_MaxBP.Margin = new System.Windows.Forms.Padding(0); B_MaxBP.Name = "B_MaxBP"; B_MaxBP.Size = new System.Drawing.Size(23, 23); @@ -1074,8 +1072,8 @@ private void InitializeComponent() // // MT_BP // - MT_BP.Location = new System.Drawing.Point(130, 19); - MT_BP.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + MT_BP.Location = new System.Drawing.Point(0, 0); + MT_BP.Margin = new System.Windows.Forms.Padding(0); MT_BP.Mask = "0000000"; MT_BP.Name = "MT_BP"; MT_BP.Size = new System.Drawing.Size(67, 25); @@ -1084,27 +1082,32 @@ private void InitializeComponent() // // L_BBQSolo // - L_BBQSolo.Location = new System.Drawing.Point(7, 45); - L_BBQSolo.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + L_BBQSolo.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_BBQSolo.AutoSize = true; + L_BBQSolo.Location = new System.Drawing.Point(11, 29); + L_BBQSolo.Margin = new System.Windows.Forms.Padding(0); L_BBQSolo.Name = "L_BBQSolo"; - L_BBQSolo.Size = new System.Drawing.Size(120, 23); + L_BBQSolo.Size = new System.Drawing.Size(81, 17); L_BBQSolo.TabIndex = 82; L_BBQSolo.Text = "Solo Quests:"; L_BBQSolo.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // L_BBQGroup // - L_BBQGroup.Location = new System.Drawing.Point(5, 74); - L_BBQGroup.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + L_BBQGroup.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_BBQGroup.AutoSize = true; + L_BBQGroup.Location = new System.Drawing.Point(0, 54); + L_BBQGroup.Margin = new System.Windows.Forms.Padding(0); L_BBQGroup.Name = "L_BBQGroup"; - L_BBQGroup.Size = new System.Drawing.Size(120, 23); + L_BBQGroup.Size = new System.Drawing.Size(92, 17); L_BBQGroup.TabIndex = 83; L_BBQGroup.Text = "Group Quests:"; L_BBQGroup.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // NUD_BBQSolo // - NUD_BBQSolo.Location = new System.Drawing.Point(132, 45); + NUD_BBQSolo.Location = new System.Drawing.Point(92, 25); + NUD_BBQSolo.Margin = new System.Windows.Forms.Padding(0); NUD_BBQSolo.Maximum = new decimal(new int[] { -1, 0, 0, 0 }); NUD_BBQSolo.Name = "NUD_BBQSolo"; NUD_BBQSolo.Size = new System.Drawing.Size(94, 25); @@ -1112,7 +1115,8 @@ private void InitializeComponent() // // NUD_BBQGroup // - NUD_BBQGroup.Location = new System.Drawing.Point(132, 74); + NUD_BBQGroup.Location = new System.Drawing.Point(92, 50); + NUD_BBQGroup.Margin = new System.Windows.Forms.Padding(0); NUD_BBQGroup.Maximum = new decimal(new int[] { -1, 0, 0, 0 }); NUD_BBQGroup.Name = "NUD_BBQGroup"; NUD_BBQGroup.Size = new System.Drawing.Size(94, 25); @@ -1120,9 +1124,10 @@ private void InitializeComponent() // // B_UnlockThrowStyles // - B_UnlockThrowStyles.Location = new System.Drawing.Point(290, 75); + B_UnlockThrowStyles.Location = new System.Drawing.Point(284, 108); + B_UnlockThrowStyles.Margin = new System.Windows.Forms.Padding(4); B_UnlockThrowStyles.Name = "B_UnlockThrowStyles"; - B_UnlockThrowStyles.Size = new System.Drawing.Size(90, 45); + B_UnlockThrowStyles.Size = new System.Drawing.Size(200, 44); B_UnlockThrowStyles.TabIndex = 90; B_UnlockThrowStyles.Text = "Unlock All Throw Styles"; B_UnlockThrowStyles.UseVisualStyleBackColor = true; @@ -1130,10 +1135,10 @@ private void InitializeComponent() // // B_UnlockCoaches // - B_UnlockCoaches.Location = new System.Drawing.Point(390, 25); - B_UnlockCoaches.Margin = new System.Windows.Forms.Padding(0); + B_UnlockCoaches.Location = new System.Drawing.Point(284, 56); + B_UnlockCoaches.Margin = new System.Windows.Forms.Padding(4); B_UnlockCoaches.Name = "B_UnlockCoaches"; - B_UnlockCoaches.Size = new System.Drawing.Size(90, 45); + B_UnlockCoaches.Size = new System.Drawing.Size(200, 44); B_UnlockCoaches.TabIndex = 89; B_UnlockCoaches.Text = "Unlock All Coaches"; B_UnlockCoaches.UseVisualStyleBackColor = true; @@ -1141,10 +1146,10 @@ private void InitializeComponent() // // B_ActivateSnacksworthLegendaries // - B_ActivateSnacksworthLegendaries.Location = new System.Drawing.Point(290, 25); - B_ActivateSnacksworthLegendaries.Margin = new System.Windows.Forms.Padding(0); + B_ActivateSnacksworthLegendaries.Location = new System.Drawing.Point(284, 4); + B_ActivateSnacksworthLegendaries.Margin = new System.Windows.Forms.Padding(4); B_ActivateSnacksworthLegendaries.Name = "B_ActivateSnacksworthLegendaries"; - B_ActivateSnacksworthLegendaries.Size = new System.Drawing.Size(90, 45); + B_ActivateSnacksworthLegendaries.Size = new System.Drawing.Size(200, 44); B_ActivateSnacksworthLegendaries.TabIndex = 88; B_ActivateSnacksworthLegendaries.Text = "Activate Legendaries"; B_ActivateSnacksworthLegendaries.UseVisualStyleBackColor = true; @@ -1153,19 +1158,52 @@ private void InitializeComponent() // CB_ThrowStyle // CB_ThrowStyle.FormattingEnabled = true; - CB_ThrowStyle.Location = new System.Drawing.Point(115, 139); + CB_ThrowStyle.Location = new System.Drawing.Point(153, 139); CB_ThrowStyle.Name = "CB_ThrowStyle"; CB_ThrowStyle.Size = new System.Drawing.Size(121, 25); CB_ThrowStyle.TabIndex = 87; // // L_ThrowStyle // - L_ThrowStyle.AutoSize = true; - L_ThrowStyle.Location = new System.Drawing.Point(37, 142); + L_ThrowStyle.Location = new System.Drawing.Point(9, 140); L_ThrowStyle.Name = "L_ThrowStyle"; - L_ThrowStyle.Size = new System.Drawing.Size(78, 17); + L_ThrowStyle.Size = new System.Drawing.Size(138, 24); L_ThrowStyle.TabIndex = 86; L_ThrowStyle.Text = "Throw Style:"; + L_ThrowStyle.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // TLP_BBQ + // + TLP_BBQ.ColumnCount = 2; + TLP_BBQ.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_BBQ.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_BBQ.Controls.Add(L_BP, 0, 0); + TLP_BBQ.Controls.Add(L_BBQSolo, 0, 1); + TLP_BBQ.Controls.Add(L_BBQGroup, 0, 2); + TLP_BBQ.Controls.Add(FLP_BP, 1, 0); + TLP_BBQ.Controls.Add(NUD_BBQSolo, 1, 1); + TLP_BBQ.Controls.Add(NUD_BBQGroup, 1, 2); + TLP_BBQ.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_BBQ.Location = new System.Drawing.Point(3, 21); + TLP_BBQ.Name = "TLP_BBQ"; + TLP_BBQ.RowCount = 4; + TLP_BBQ.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + TLP_BBQ.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + TLP_BBQ.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + TLP_BBQ.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + TLP_BBQ.Size = new System.Drawing.Size(265, 86); + TLP_BBQ.TabIndex = 0; + // + // FLP_BP + // + FLP_BP.Controls.Add(MT_BP); + FLP_BP.Controls.Add(B_MaxBP); + FLP_BP.Dock = System.Windows.Forms.DockStyle.Fill; + FLP_BP.Location = new System.Drawing.Point(92, 0); + FLP_BP.Margin = new System.Windows.Forms.Padding(0); + FLP_BP.Name = "FLP_BP"; + FLP_BP.Size = new System.Drawing.Size(173, 25); + FLP_BP.TabIndex = 84; // // SAV_Trainer9 // @@ -1196,11 +1234,13 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)P_CurrIcon).EndInit(); ((System.ComponentModel.ISupportInitialize)P_CurrPhoto).EndInit(); Tab_Blueberry.ResumeLayout(false); - Tab_Blueberry.PerformLayout(); GB_BBQ.ResumeLayout(false); - GB_BBQ.PerformLayout(); ((System.ComponentModel.ISupportInitialize)NUD_BBQSolo).EndInit(); ((System.ComponentModel.ISupportInitialize)NUD_BBQGroup).EndInit(); + TLP_BBQ.ResumeLayout(false); + TLP_BBQ.PerformLayout(); + FLP_BP.ResumeLayout(false); + FLP_BP.PerformLayout(); ResumeLayout(false); } @@ -1311,5 +1351,7 @@ private void InitializeComponent() private System.Windows.Forms.DateTimePicker CAL_LastSavedDate; private System.Windows.Forms.Label L_LastSaved; private System.Windows.Forms.DateTimePicker CAL_LastSavedTime; + private System.Windows.Forms.TableLayoutPanel TLP_BBQ; + private System.Windows.Forms.FlowLayoutPanel FLP_BP; } } From b2bcb1db0c69ffde46c05a3f89ba2c7a2ad4a382 Mon Sep 17 00:00:00 2001 From: abcboy101 <16735361+abcboy101@users.noreply.github.com> Date: Mon, 4 May 2026 22:25:28 -0400 Subject: [PATCH 17/81] Gen2: Adjust Korean string detection logic (#4800) --- PKHeX.Core/PKM/PK2.cs | 30 +++++-------------- PKHeX.Core/PKM/Strings/StringConverter2.cs | 9 ++++++ PKHeX.Core/PKM/Strings/StringConverter2KOR.cs | 12 +++++++- PKHeX.Core/Saves/SAV2.cs | 20 ++----------- 4 files changed, 31 insertions(+), 40 deletions(-) diff --git a/PKHeX.Core/PKM/PK2.cs b/PKHeX.Core/PKM/PK2.cs index cfc062bf9..61fab94fa 100644 --- a/PKHeX.Core/PKM/PK2.cs +++ b/PKHeX.Core/PKM/PK2.cs @@ -12,7 +12,7 @@ public sealed class PK2 : GBPKML, ICaughtData2 public override int SIZE_STORED => Japanese ? PokeCrypto.SIZE_2JLIST : PokeCrypto.SIZE_2ULIST; public override int SIZE_PARTY => SIZE_STORED; - public override bool Korean => !Japanese && OriginalTrainerTrash[0] <= 0xB; + public override bool Korean => !Japanese && StringConverter2KOR.IsHangul(OriginalTrainerTrash); public override EntityContext Context => EntityContext.Gen2; @@ -208,7 +208,7 @@ public PK7 ConvertToPK7() else if (IsNicknamedBank) { pk7.IsNicknamed = true; - pk7.Nickname = Korean ? Nickname : StringConverter12Transporter.GetString(NicknameTrash, Japanese); + pk7.Nickname = StringConverter2KOR.IsHangul(NicknameTrash) ? Nickname : StringConverter12Transporter.GetString(NicknameTrash, Japanese); } // Dizzy Punch cannot be transferred @@ -228,7 +228,7 @@ private string GetTransferTrainerName(int lang) { if (OriginalTrainerTrash[0] == StringConverter1.TradeOTCode) // In-game Trade return StringConverter12Transporter.GetTradeNameGen1(lang); - if (Korean) + if (StringConverter2KOR.IsHangul(OriginalTrainerTrash)) return OriginalTrainerName; return StringConverter12Transporter.GetString(OriginalTrainerTrash, Japanese); } @@ -269,29 +269,15 @@ public SK2 ConvertToSK2() => new(Japanese) }; public override string GetString(ReadOnlySpan data) - { - if (Korean) - return StringConverter2KOR.GetString(data); - return StringConverter2.GetString(data, Language); - } - + => StringConverter2.GetString(data, Language); public override int LoadString(ReadOnlySpan data, Span destBuffer) - { - if (Korean) - return StringConverter2KOR.LoadString(data, destBuffer); - return StringConverter2.LoadString(data, destBuffer, Language); - } - + => StringConverter2.LoadString(data, destBuffer, Language); public override int SetString(Span destBuffer, ReadOnlySpan value, int maxLength, StringConverterOption option) - { - if (Korean) - return StringConverter2KOR.SetString(destBuffer, value, maxLength, option); - return StringConverter2.SetString(destBuffer, value, maxLength, Language, option); - } + => StringConverter2.SetString(destBuffer, value, maxLength, Language, option); public override int GetStringTerminatorIndex(ReadOnlySpan data) - => Korean ? StringConverter2KOR.GetTerminatorIndex(data) : TrashBytesGB.GetTerminatorIndex(data); + => (!Japanese && StringConverter2KOR.IsHangul(data)) ? StringConverter2KOR.GetTerminatorIndex(data) : TrashBytesGB.GetTerminatorIndex(data); public override int GetStringLength(ReadOnlySpan data) - => Korean ? StringConverter2KOR.GetStringLength(data) : TrashBytesGB.GetStringLength(data); + => (!Japanese && StringConverter2KOR.IsHangul(data)) ? StringConverter2KOR.GetStringLength(data) : TrashBytesGB.GetStringLength(data); public override int GetBytesPerChar() => 1; /// diff --git a/PKHeX.Core/PKM/Strings/StringConverter2.cs b/PKHeX.Core/PKM/Strings/StringConverter2.cs index f7d7ed347..067e23989 100644 --- a/PKHeX.Core/PKM/Strings/StringConverter2.cs +++ b/PKHeX.Core/PKM/Strings/StringConverter2.cs @@ -43,6 +43,9 @@ private static bool AllCharsInTable(ReadOnlySpan data, ReadOnlySpan /// Decoded string. public static string GetString(ReadOnlySpan data, int language) { + if (language == (int)LanguageID.Korean || (language != (int)LanguageID.Japanese && StringConverter2KOR.IsHangul(data))) + return StringConverter2KOR.GetString(data); + Span result = stackalloc char[data.Length]; int length = LoadString(data, result, language); return new string(result[..length]); @@ -55,6 +58,9 @@ public static string GetString(ReadOnlySpan data, int language) /// Character count loaded. public static int LoadString(ReadOnlySpan data, Span result, int language) { + if (language == (int)LanguageID.Korean || (language != (int)LanguageID.Japanese && StringConverter2KOR.IsHangul(data))) + return StringConverter2KOR.LoadString(data, result); + if (data.Length == 0) return 0; if (data[0] == TradeOTCode) // In-game Trade @@ -96,6 +102,9 @@ public static int LoadString(ReadOnlySpan data, Span result, int lan public static int SetString(Span destBuffer, ReadOnlySpan value, int maxLength, int language, StringConverterOption option = StringConverterOption.Clear50) { + if (language == (int)LanguageID.Korean || (language != (int)LanguageID.Japanese && StringConverter2KOR.IsHangul(value))) + return StringConverter2KOR.SetString(destBuffer, value, maxLength, option); + ConditionBuffer(destBuffer, option); if (value.Length == 0) return 0; diff --git a/PKHeX.Core/PKM/Strings/StringConverter2KOR.cs b/PKHeX.Core/PKM/Strings/StringConverter2KOR.cs index 5c3cf1fe2..5678831b2 100644 --- a/PKHeX.Core/PKM/Strings/StringConverter2KOR.cs +++ b/PKHeX.Core/PKM/Strings/StringConverter2KOR.cs @@ -13,7 +13,7 @@ public static class StringConverter2KOR public const char LineBreak = StringConverter2.LineBreak; /// - /// Checks if any of the characters inside are from the special Korean codepoint pages. + /// Checks if all of the characters inside are from the special Korean codepoint pages. /// public static bool GetIsKorean(ReadOnlySpan str) { @@ -25,6 +25,16 @@ public static bool GetIsKorean(ReadOnlySpan str) return true; } + /// + /// Checks if the encoded data appears to consist of Korean characters. + /// + public static bool IsHangul(ReadOnlySpan data) => data.Length > 0 && data[0] <= 0xB; + + /// + /// Checks if the string appears to consist of Korean characters. + /// + public static bool IsHangul(ReadOnlySpan str) => str.Length > 0 && str[0] is (>= (char)0xAC00 and <= (char)0xD7AF) or (>= (char)0x3130 and <= (char)0x318F) or ' '; + /// /// Converts Generation 2 Korean encoded data into a string. /// diff --git a/PKHeX.Core/Saves/SAV2.cs b/PKHeX.Core/Saves/SAV2.cs index c5a56146e..f7302a9fa 100644 --- a/PKHeX.Core/Saves/SAV2.cs +++ b/PKHeX.Core/Saves/SAV2.cs @@ -778,25 +778,11 @@ public void UnlockAllDecorations() } public override string GetString(ReadOnlySpan data) - { - if (Korean) - return StringConverter2KOR.GetString(data); - return StringConverter2.GetString(data, Language); - } - + => StringConverter2.GetString(data, Language); public override int LoadString(ReadOnlySpan data, Span text) - { - if (Korean) - return StringConverter2KOR.LoadString(data, text); - return StringConverter2.LoadString(data, text, Language); - } - + => StringConverter2.LoadString(data, text, Language); public override int SetString(Span destBuffer, ReadOnlySpan value, int maxLength, StringConverterOption option) - { - if (Korean) - return StringConverter2KOR.SetString(destBuffer, value, maxLength, option); - return StringConverter2.SetString(destBuffer, value, maxLength, Language, option); - } + => StringConverter2.SetString(destBuffer, value, maxLength, Language, option); public bool IsGBMobileAvailable => Japanese && Version == GameVersion.C; public bool IsGBMobileEnabled => Japanese && Enum.IsDefined(GBMobileCable); From b8ebbebdbc88a347b539e32d85b1270816956a5a Mon Sep 17 00:00:00 2001 From: Kurt Date: Mon, 4 May 2026 22:47:30 -0500 Subject: [PATCH 18/81] Update 26.05.05 --- Directory.Build.props | 2 +- .../Legality/RNG/ClassicEra/Gen3/MethodH.cs | 2 +- .../Legality/RNG/ClassicEra/Gen4/MethodJ.cs | 2 +- .../Legality/RNG/ClassicEra/Gen4/MethodK.cs | 4 +- PKHeX.Core/Legality/RNG/Frame/LockInfo.cs | 22 ----- PKHeX.Core/MysteryGifts/WA9.cs | 5 +- PKHeX.Core/PKM/HOME/IGameDataSide.cs | 10 +- .../Strings/Trainer/ReplaceTrainerNameHOME.cs | 8 ++ PKHeX.Core/Resources/legality/mgdb/wa9.pkl | Bin 8544 -> 11392 bytes .../legality/wild/encounter_go_home.pkl | Bin 183788 -> 184876 bytes .../legality/wild/encounter_go_lgpe.pkl | Bin 36544 -> 36632 bytes .../Saves/Substructures/Gen9/SV/PouchSize9.cs | 52 ----------- PKHeX.Drawing.PokeSprite/Util/StatusColor.cs | 2 +- .../PKM Editor/MoveDisplay.Designer.cs | 87 ------------------ .../Controls/PKM Editor/MoveDisplay.cs | 43 --------- PKHeX.WinForms/Resources/text/changelog.txt | 24 ++++- 16 files changed, 44 insertions(+), 219 deletions(-) delete mode 100644 PKHeX.Core/Legality/RNG/Frame/LockInfo.cs delete mode 100644 PKHeX.Core/Saves/Substructures/Gen9/SV/PouchSize9.cs delete mode 100644 PKHeX.WinForms/Controls/PKM Editor/MoveDisplay.Designer.cs delete mode 100644 PKHeX.WinForms/Controls/PKM Editor/MoveDisplay.cs diff --git a/Directory.Build.props b/Directory.Build.props index f88fb1322..d8519a051 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 26.04.11 + 26.05.05 14 enable en diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/MethodH.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/MethodH.cs index 9d54a067f..4d4e45b21 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/MethodH.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/MethodH.cs @@ -343,7 +343,7 @@ private static bool TryGetMatch(T enc, byte levelMin, byte levelMax, uint see if (IsSafariBlockProc(safariBlockSeed)) { var ctx = new FrameCheckDetails(enc, safariBlockSeed, levelMin, levelMax, format); - if (TryGetMatchNoSync(ctx, out result) && CheckEncounterActivation(enc, safariBlockSeed, None, out result)) + if (TryGetMatchNoSync(ctx, out result)) return true; } diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodJ.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodJ.cs index 46bc975bf..9a6e79984 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodJ.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodJ.cs @@ -234,7 +234,7 @@ private static bool TryGetMatch(T enc, byte levelMin, byte levelMax, uint see return TryGetMatchNoSync(ctx, out result); } var syncProc = IsSyncPass(p0); - if (syncProc && !(levelMin > enc.LevelMax)) // can't boost level if already using Synchronize + if (syncProc && levelMin <= enc.LevelMax) // can't boost level if already using Synchronize { var ctx = new FrameCheckDetails(enc, seed, levelMin, levelMax, format); if (IsSlotValidRegular(ctx, out result, Synchronize)) diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs index e680457c7..5422183ee 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs @@ -239,7 +239,7 @@ private static bool TryGetMatch(in SearchContext ctx, uint seed, byte natu if (ctx.ShouldRecurse(depth)) { var prev = frame.Seed1; - if (!IsSyncPass(prev >> 16) && !(ctx.LevelMin > ctx.Encounter.LevelMax)) // can't boost level if already using Synchronize + if (!IsSyncPass(prev >> 16) && ctx.LevelMin <= ctx.Encounter.LevelMax) // can't boost level if already using Synchronize { var lead = forceSyncLead == UnsetLead ? FailSyncLead : forceSyncLead; if (RecurseReject(ctx, prev, out result, depth + 1, lead)) @@ -260,7 +260,7 @@ private static bool TryGetMatch(in SearchContext ctx, uint seed, byte natu } var syncProc = IsSyncPass(p0); - if (syncProc && !(ctx.LevelMin > ctx.Encounter.LevelMax)) // can't boost level if already using Synchronize + if (syncProc && ctx.LevelMin <= ctx.Encounter.LevelMax) // can't boost level if already using Synchronize { var frame = ctx.GetFrameRef(seed); if (IsSlotValidRegular(frame, out result, Synchronize) && ctx.CanAcceptDirectMatch(depth)) diff --git a/PKHeX.Core/Legality/RNG/Frame/LockInfo.cs b/PKHeX.Core/Legality/RNG/Frame/LockInfo.cs deleted file mode 100644 index f1b20b8c8..000000000 --- a/PKHeX.Core/Legality/RNG/Frame/LockInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace PKHeX.Core; - -/// -/// Status of passing or failing frame match results. -/// -public enum LockInfo -{ - /// - /// PID matches the required parameters. - /// - Pass, - - /// - /// PID did not match the required Nature. - /// - Nature, - - /// - /// PID did not match the required Gender. - /// - Gender, -} diff --git a/PKHeX.Core/MysteryGifts/WA9.cs b/PKHeX.Core/MysteryGifts/WA9.cs index 3cc7aa77a..d9d5f2a8c 100644 --- a/PKHeX.Core/MysteryGifts/WA9.cs +++ b/PKHeX.Core/MysteryGifts/WA9.cs @@ -708,10 +708,9 @@ public override bool IsMatchExact(PKM pk, EvoCriteria evo) if (pk.FlawlessIVCount != FlawlessIVCount) return false; // HOME ZA-starters have non-perfect IVs to 20, so IVs at 31 can't exceed the flawless count. - Span IVs = stackalloc int[6]; - pk.GetIVs(IVs); - foreach (var iv in IVs) + for (var i = 0; i < 6; i++) { + var iv = pk.GetIV(i); if (iv != 31 && iv != HomeBaseIV) return false; } diff --git a/PKHeX.Core/PKM/HOME/IGameDataSide.cs b/PKHeX.Core/PKM/HOME/IGameDataSide.cs index f787ebbbc..661a3f53a 100644 --- a/PKHeX.Core/PKM/HOME/IGameDataSide.cs +++ b/PKHeX.Core/PKM/HOME/IGameDataSide.cs @@ -127,12 +127,12 @@ public void CopyFrom(PKM pk) data.MetLocation = pk.MetLocation; data.EggLocation = pk.EggLocation; - if (pk is IGameDataSidePP ppk && data is IGameDataSidePP pps) + if (data is IGameDataSidePP pps) { - pps.Move1_PP = ppk.Move1_PP; pps.Move1_PPUps = ppk.Move1_PPUps; - pps.Move2_PP = ppk.Move2_PP; pps.Move2_PPUps = ppk.Move2_PPUps; - pps.Move3_PP = ppk.Move3_PP; pps.Move3_PPUps = ppk.Move3_PPUps; - pps.Move4_PP = ppk.Move4_PP; pps.Move4_PPUps = ppk.Move4_PPUps; + pps.Move1_PP = (byte)pk.Move1_PP; pps.Move1_PPUps = (byte)pk.Move1_PPUps; + pps.Move2_PP = (byte)pk.Move2_PP; pps.Move2_PPUps = (byte)pk.Move2_PPUps; + pps.Move3_PP = (byte)pk.Move3_PP; pps.Move3_PPUps = (byte)pk.Move3_PPUps; + pps.Move4_PP = (byte)pk.Move4_PP; pps.Move4_PPUps = (byte)pk.Move4_PPUps; } } diff --git a/PKHeX.Core/PKM/Strings/Trainer/ReplaceTrainerNameHOME.cs b/PKHeX.Core/PKM/Strings/Trainer/ReplaceTrainerNameHOME.cs index 4f6e726fd..e59ac6ec6 100644 --- a/PKHeX.Core/PKM/Strings/Trainer/ReplaceTrainerNameHOME.cs +++ b/PKHeX.Core/PKM/Strings/Trainer/ReplaceTrainerNameHOME.cs @@ -37,6 +37,8 @@ public static EntityContext IsTriggerAndReplace(ReadOnlySpan original, Rea return Gen8b; if (SV .IsPresentInGame(species, form) && ReplaceTrainerName9 .IsTriggerAndReplace(original, current, language)) return Gen9; + if (ZA .IsPresentInGame(species, form) && ReplaceTrainerName9a.IsTriggerAndReplace(original, current, language)) + return Gen9a; if (IsTrigger(original, language) && IsReplace(current)) return Context; return EntityContext.None; // No replacement @@ -53,6 +55,8 @@ public static EntityContext IsTriggerAndReplace(ReadOnlySpan original, Rea return Gen8b; if (history.HasVisitedGen9 && ReplaceTrainerName9 .IsTriggerAndReplace(original, current, language)) return Gen9; + if (history.HasVisitedZA && ReplaceTrainerName9a.IsTriggerAndReplace(original, current, language)) + return Gen9a; if (IsTrigger(original, language) && IsReplace(current)) return Context; return EntityContext.None; // No replacement @@ -77,6 +81,8 @@ public static EntityContext IsReplace(ReadOnlySpan current, LanguageID lan return Gen8b; if (SV .IsPresentInGame(species, form) && ReplaceTrainerName9 .IsReplace(current, language)) return Gen9; + if (ZA .IsPresentInGame(species, form) && ReplaceTrainerName9a.IsReplace(current, language)) + return Gen9a; if (current.SequenceEqual(ReplaceName)) return Context; return EntityContext.None; // No replacement @@ -93,6 +99,8 @@ public static EntityContext IsReplace(ReadOnlySpan current, LanguageID lan return Gen8b; if (history.HasVisitedGen9 && ReplaceTrainerName9 .IsReplace(current, language)) return Gen9; + if (history.HasVisitedZA && ReplaceTrainerName9a.IsReplace(current, language)) + return Gen9a; if (IsReplace(current)) return Context; return EntityContext.None; // No replacement diff --git a/PKHeX.Core/Resources/legality/mgdb/wa9.pkl b/PKHeX.Core/Resources/legality/mgdb/wa9.pkl index bda4324503c5a58effb9c4db4fb1ef963837b44b..efba72fa45c28df2f9157061271a7bd8ab5c8e16 100644 GIT binary patch delta 637 zcmaFh)DXELK~aMN3fz@J3`Pb`CFBjVPk=da!UKm3n)zokAN<#G2;Bt&NG|vU zbTumj6NxU^(F(U5%<#nFf_i_6{j=`8pN8rJZH7QlSV6%&AkE6aLZS=GC1Cm?v=^ES zPT#MV0>#4NottcU7(9LgT_C~8?!n;C;LG4T(NL83OmR1-QURa~0+_lOEf}7_eSDFL gfys!0pMk|l9)Fbo7m*i{mlv75fJuR)C<)?C0G;c~(*OVf delta 7 OcmZpOeBiVpK@k8A_5&>d diff --git a/PKHeX.Core/Resources/legality/wild/encounter_go_home.pkl b/PKHeX.Core/Resources/legality/wild/encounter_go_home.pkl index 32994cf0e7e498c69a1c7d4bd671e15439dc3c24..5fd2b5c3b35abd4bbeef95d50d13c5dbad44a620 100644 GIT binary patch delta 6666 zcmZwL0esWdwZQRnZ$n!`iUEpLEf6r%sGaMy)3QYfF3y5gi|b~^iq#bq>?@)twFtx=0F&H~x<{Q{0Ay!rWjL;m-F z|L2^0?oC=7-ZY^(Fu}8IMYX{;S)^-#X^u$# zk3|}h{Sy(Vok^&_Lc~0e;?U;c{(OR7NfAzwx~oKTe@0%9tGEk zbfPR@B;#6Qpz=Bvc|D6jw7|o|iwJguNW;%XN(u@13z3nSUy68dBuNp)-6UdI%)>~( znE=HiskdN>NYAYzavRBRr+`wCoTVg1;0}>N6fI*MRb?W1%ZYI(9V(~5yIF|m9#*?T zq#IEeN$;hYm8|kU3aSvPzMmC6zzMqsh;^e#mY?>c zsGb6zAsB28jBRFYi^u>R&(ckVVQyr_$lFRBWIe|=2Z;4N@n0a%i{yQY{O*?sf=&#< z{4xn%5h;F6qzTRz61*-_v7I7YNzz8;JGj4-MCcAu%VJal)k1#s=9 zyZboMZ{YxY4|f-xJLsWh2ifPh3Gfa{x@j>=4{;FRW%cjzFzS%nL)92X?)&UF+{il2 z^RRwE;V48os*wL7`;7rKf5bxnK=FShCz}4md`~}#|4i_Y*-!Mq`JbG83?g@c2T}7E z_7I)_MX7V zO;-{^-wfW*RFY>=(lJZPAiT4c1Q0?m3eKens}j?B%sZbVZAx4hC@H?sL*Oiee4nHj zD;Y(_52!YqM5zBE$uFVmOO@2+D5?Gt^Da}8aXA4IMkJT(IZCpAOz}wniIQ3v>^zGw zO0FR0T&`i8$ATRc4TEPsgUG&8iS?)4yh_Qy)!fKaVn+$w3%FiLCt$mV1o^m@mS3l& z3|+8YPg^02C=PsTvXY1}}LHBTf1)W0&EH1VNy{Nob zNz1+LfBs4yMBRM^tYF_@xt~NR`!xkUz)IjkUL}E6(dyL%akJWoI7Fys8yhj`Rnqnd zo%#)DrHa-+N+%v8Hilq&oZ@1tiTwoIu$G6aYiR#E0@SjS4IB<1tFL3l8`)bw@9Syl zGqf49iM>Te1BqbU%-KO;i<0JN=~yFMvz5eXd5%T=76D?Q^m*>R!1Ks>k!y5%cyVl_ zZOz z5%wR|XhZ~gN0r)49?abDLR+nD6?wm zLH_r&bfMrpEnzs$rw|OG(xxT#0xj(*ypRB>xQN2D2#)mc^E|3xxtMODD4TzONKuy% z7mb%{apn-`M|ALV4>#wK#7bawqMdhg{VXWIxvXTU$OsLzhcFx zKs`bjfT5ICA|Ec)p&k8@rR+KKP>x!(p$}15?qH8mh8nb>7o*5rrp19$R4-%yn|Wg? zBLSMxiGD<2T23O^QHXL>p#g2^#vr1x>pQuB7YWK4N6y`J40br+L>}@{fI<{`cnRM_ zOI@^hB`ZYneXOv8iKxdQvhSxj*niDxF$n7e6oVG@BeRlc(S+1htR7t`eUNQI*=pjs z$@35kfc0Va-_A=5taPFZJurKz5G{zpzJ>s3L+T^ULkJOc{Du}+aUL)T>!Yk36&OL~ zV{9i3k5dRb5rwOog;&S+{|VZLcJxD@Jb5cDDU6&8w448dc1m3E>Km1uzZHIkqS z-55j^=`E}rIdGy7rKrFVieIP2$lT5r!j4YlxAO5raU0jj+CdTM+rj>ucX9(&K~~yM z#R&Y4;J>Gp2<_qk!4RSVWWkAAgwTzCgi-qjZQe~Bl)!~*jG%N62~pTV*WP3id+G2# z4-@w>5!GnMAfia`BpIA2Mg?jRKnT4E!@QqhC`U8GFu%nZir_{gx-kmt0q((xLJu!> z=tX)L)uSA4)F6NmdJ%@fdssc{5kfaC?=yxjWF98?;no?Ge`=jFZa5_wUS&ugPDzDVwU%GD zGiCf#!*I%Uczv_xe!u~4jm+I{^ley@?(6D%L|yDVa^bYr{Dn6pji1P*Gfzz1eC^B0 zBA1F%zS<9FwBC80HOXlBX98nu?IQ0y)2XmV5ubVeK*B)l$ogU1*)w9nO2;P+r%Z;| z7^_0~&s*xx-mB8L?=q#N#fPbDeX7Hw5(Cxj+o_FXlYGv%A|_+Xa7r4yq;AbUP(6EW zgkR`<9iP5xJT*o6T*E8lF9(N*<1c$Y8%TV*CA=j5zWMXL@t3`y51cU;TjZdm`Yt*; z)A!LA#}dQzd|7zfM5FJ$V^e+h5qsjq%8}u;v4{u7bYhzONNM7>Y zVxrokr*~kQ@0`d?U-B_~e1Xnm3H5d#TNr;g<9Nbeb{&u3%T{~zV;y&@S~I`RR;IC2 zCbA=6H6|wM4_MG8KDvpO_BWgPd?#tr*dELF>beM^-$*%EnVIdz4cd?oy)tJ&&lv!G&v7BsK2y z8FW0Uwy5}lfwfBOaVJ*l|MOF7c`$FCDlnKP5$~*6W&ABPSieDiJbvsuz`tjUn(FU= zMs4(4Hmeyy$7W@lYRX{tiBB+3_{+Ad!i14vXuEoDLR?~h$!;|qcOA^%qw1~yZ|xgb zDSOa1sCK6sWBsGIDc-c;P*^Rt7?VzA^gGk^s}shqt^Qjk>gB;D6SbahI`!SfSAxIf zBK@jyY$RyT(lx1RV_#tW2;*8LMrnS9Tk_%4nW6Ma&zG>(k~U2C;doiR4R|0in|-1UT>fBLBQfBU3f z5&vxYI^CO`kkQXCQ0|10VCZRW)`@4n+pkw9rH>uN*t-*5UhJQ{Nk5$a-HGOio_e=9 z7}}((m08E8!h2$C(#H86n{~PAPz}aQwX9c71zt+>eN0?jGGg zZq}|OF-+jW*l}HB;Lp#eUBBVKZNI)ISh8Qw*2dUwjf)+->Hew%ddoxuKd+4J;+pC2 z@|b@~m$n59y7UW%39*o|nQNv;{Ob?t1#tsk`(NqS3yfnk{I!Sl!n4P&j}vQ};nR~P I@ssNR0ImDSc3R4rIFYIPASb}mYEaRjWhlSl#< ztlF_cs!xRqK|AeOCY44~N6{)B7LBgD%vIO1s2vL>YGFmAgt=evv;FaX`n=qG?m6e) z@)GXIO>NBeFJ7|7WSu6`_Z^Y;lSS+WB4ekC#7-B96p2(>d7dFsZ4(K@dX`8EWiv$@ zk$<*G9l}|~B9?PRnoxHx^N@cY_lTpmM8sPv(qk9#%o54W62Fv`G3jEF@=HWoV7-(i z%0;@+beYKbYy!^_X{%tt%SDFgGQLuz;R=z$D@o)kzQa*PU{uX#{sM|Y$<-nuR8|uQ zE!Xh;@6njUvT01igtsSvNEI$0FjSidz_riiIQqQ?1Bg)@>wq zyU0MDNWmQ}>Y^$%-${jckr=Ftd5>zhNZ#GVxQCD)io2H%`MFq@h_s^L%c4t3W*OUY z9|_e{)%{fQ0QYb-h;+d8O9G(uK@szEkp#>Su`t?Jux%988lZzKiPcD~)pTnOF&?47 zCW?8Kb&z>X#6R#j3H*v|QNLCs&_b5$$P8tz3_|<~s(z9L3>Io*|DU3o4I)DudG|E$ zHqk|lp(kBZDoNlNo}J_jKln* zh;6$_O*e~RB*OO{ECgSaWL_4LoovA_x`M%1M3SiQV=G{Jou9io2YX274GtmFXdR$c z)qAND@iz(n7K_GcDZ+2FukVly^8Uo(gME;oh#-bEI^ShJLhsR53?d2nGxOsVfZD&% z`u90oe`Q;SSn~r4`jGMdzp?Nz!T(NGsNP2hkpB;UZ4g0mf)0GdIY7n71p9=*BW%?_ zv7bQyqWwwc9iXyN;$ZL~3#CZ>Q{p4?8Sg%4>=;`F*CC38KY5t8jgvhRh#z5pzU0)V zS@M1^Xl=p~*@l zS4r|jC7F|yG)z%`smx;nhEXt0Nq@eQF;t$cq!wLhKSfF2sY-kW1UyZN>2xK{h#^_X z{TWJ}MM?&zD;Yj zu%6FCKTy(%rcx@nKuO1iO4@$NIJ=VK9}y54m@eWOzgY~|1BjEDPsX*1f8hV$pdgkuSXFJb>}Ub2H{ zDcQldjDe`XkID6H!~IH1Q3dNS2=o98H_(j-sSbt93HA`xBD{im0Xnym?yTbZVJdB; z-RMLN*40=;mmVR(NBu1Fn3BZfEU=adzh>e(7Fka#TRBKiaQ`HS$xz~IV^Nem#WNfm zIIO7ONQ`zoO()Q~iB4?h0Eb9?3!Whk(&&7at?OVNq~Y}chJAaU;9L3dd(Hrc(DVZB z-^M~H@1iT{h51DiMHAx4-%jP|MI82Swg&|f5`Yg8q+olAPQ$f>cTqaf!~V<5wEhpY zY$yASaaelE6z#kC)p><)uQCbsXhsJHQP)S8UZW$gvlwb&-A!_+@8|m;IS+g2(i<$c zmkz;$I8tbNll@P=Mcdv{(l^L{zROhXV4J)^a07i^&yGyic5EujBFh*$!pe;vB>;%o9zgpZ#qiK?sIINSkIMD-ZF7IKoXz4`d ziCV@{dy>K$%TTGZL_$MaHO^ zNi}C{38A!DOCP-F5d2)tKRTI@!R-BcBwnJW<@@~nfffg(ltkgXfW$9k4ZEM#%_8W< zT6$4=35%iRQY{T|mDBFaXx(fopTj~JLh0pNTIZ7RJm#VqDa0zZbX>s#SJM8gh*PCy z46gaaMH-z8w0N%8Vyk8w{9IbmgE54zVeqvqaGjPa)WPP^GK|pmyuX18QGO$pp{j4!99O8@e!n z1k%V`%rgRR7Py=DsJe%a!GRh$QHwgb;D*P~MLe|hURu0_3gPuq;Zg=7j5I2jksKWN zQ7zIat0x)sV+^JDGZ(!m`~}rx7!41wE$}rE@0YCeAO)aoIs5P6(gUlH>=A?IAu>l8 zX_T!X2)baRV*&JF47~xiZY6C-0@hU|0xwdif0!g7jTD4Fq~Tf3maJy~i`UQ!L@#38d*MVQ`jLTs9m%bu zf(SR}^-Mqn<{MaNyv1mI^!g4(D&E458;ZKhLu* z$e^~9jZS;yco)dy!7SvYq{}+|CE|bdyMgMKSmilXj4ClxIi}_pqZHE_5M|5sbt1 zGKs+X2NFaBnh=6{C$TXGPcH|07ja(U=d0|$_f-}{8+tJgOCJlO95wKu5$%W|h7n|7 zeT|O6hhAi0eVuo3qZwTohIuzdpb|B3`MGpp1h#%!2OpZzjtF8HK?eDMqw%HTIN=BseY3#pcOr^zr{VqQ4^z;Xh#@nRKCrY zVHl~myJt?DXUm;1I?)XN@h#oHSvw{Mi!N&jMrJSU&YQD+a&YbkYrCBb?#T&ys<)bc zC`twQeOT1J;aXb`o7+8bePB+oW?iDYV*P0GO#bIA0oSCQ(TUR#m^{t$@x<)Al_qoU z{^NH66O)`fEfc%FuLo3jX7>(Fm|*Xo@$TL?n$8S5Mmcm6G#^}cg2-OU2_8H=J-FfM z7wjy>{E6{f^DBAa`y6@zdSWP_}u4T2g74ELCc|A(N{&?wl7OncU`(r5hy>nQsGqblOy{&oHd#>ufKhL+9&e zbJTm0uGQ+6=+cYytvXs!u3d8t{w8y)J;wC`eS5UguYD&OmbH2raSlXxHS2jQ=YUqx zSDW?a**k4aS*w>&_(4tKrR%jfTCiT%O;Fl6X6WTn%Tqc}M~gQSz<6PkUJteccE z9MW#Xu|+Q;Y@zY@ke*?DxJ8#|6SF>}t1YL^&Jk@k9r*Tes}m<5n0N|SPM%{--KOu0 z=55onCS^xEdURcmavLA*)Za4_JN0|nm%Y9EjtSYD;@x`q1hvapx>sKv_3qVYX3ve$ z{+8ZE#_#0t*VBraE{=L*`Z-hfi}hW-fQ*h9Zx8DE$8To5tLIM>Im*~m|DTS?e*uNt B@_GOO diff --git a/PKHeX.Core/Resources/legality/wild/encounter_go_lgpe.pkl b/PKHeX.Core/Resources/legality/wild/encounter_go_lgpe.pkl index fbc3371211bd570604e8e3042be91064a4a7c85d..1b3d432ccdb7f385076659f70d558eaa593c2229 100644 GIT binary patch delta 751 zcmYk(Pi%{E9LMobAJxa2A(4_LNSbw8HsMb-a5Vg5x){qJn5JP(RtLeeFA zA&7&6EK8mp9Clb_2ZtUU9CmQn!9kiHDskw+!8;E0@Ot|EzR&mf{r$&X8YJERGuc3PZj7e#S8A!#?aff~A#eA~mJkl4%Q z`?X@IBl{FMmNFO|nw#CO3#kPI?XB zE$ZK9VuqcxsdbmUd+f$6<->q>9TX#BrjDulD2yk4_xPKWJvYT2GCzNux?1KZ{Hl+9_dU2~l~mg#bAD>CyB DEeEga delta 666 zcmWmBJxo(!6vpv~O9Lb_6yv}^2%!b3R76CGf_xUdCIt)l1rn_vMAWMiXrY0Imf*+L zG{)o_!=R=y4h)8vl)-_45C#SZLKqwz7#s|7fP}%p!GDKe+Mb^GywACJ;iIwo!FZEO zSRTpimE0B5GSZb&;HVU?l2X`#%SR16Fpo(;;Hs9c;Q$MMsqnaD!&@WmA$CH#TPuA< z{G_yqfB0D^S*N6udg<+HB@}Luf{hfXKB>jTBkCbTcm;S&W zV5>`#|1w+Q0Ol2G!WnqEX^n1@iD z{}G$zJj>ci>H8cD&GWiZX+5R+8Sm&h7rkJB&7qglkymVrl@tMAXO@gWnRB?j+v)Js z8B!+VX~=VGe5KBouQdC6&sT0ZR`t8gvj0;B1t;9Ul&u#J?0RyEn%R#Q7H^_W%F@ diff --git a/PKHeX.Core/Saves/Substructures/Gen9/SV/PouchSize9.cs b/PKHeX.Core/Saves/Substructures/Gen9/SV/PouchSize9.cs deleted file mode 100644 index 1269e69ea..000000000 --- a/PKHeX.Core/Saves/Substructures/Gen9/SV/PouchSize9.cs +++ /dev/null @@ -1,52 +0,0 @@ -namespace PKHeX.Core; - -/// -/// Contains information pertaining to Inventory Pouch capacity in Generation 9. -/// -public static class PouchSize9 -{ - /// - /// Pouch0 Item Max Capacity - /// - public const int Medicine = 60; - - /// - /// Pouch1 Item Max Capacity - /// - public const int Balls = 30; - - /// - /// Pouch2 Item Max Capacity - /// - public const int Battle = 20; - - /// - /// Pouch3 Item Max Capacity - /// - public const int Berries = 80; - - /// - /// Pouch4 Item Max Capacity - /// - public const int Items = 550; - - /// - /// Pouch5 Item Max Capacity - /// - public const int TMs = 210; - - /// - /// Pouch5 Item Max Capacity - /// - public const int Treasures = 100; - - /// - /// Pouch5 Item Max Capacity - /// - public const int Ingredients = 100; - - /// - /// Pouch5 Item Max Capacity - /// - public const int Key = 64; -} diff --git a/PKHeX.Drawing.PokeSprite/Util/StatusColor.cs b/PKHeX.Drawing.PokeSprite/Util/StatusColor.cs index fbfc3420c..88bd70323 100644 --- a/PKHeX.Drawing.PokeSprite/Util/StatusColor.cs +++ b/PKHeX.Drawing.PokeSprite/Util/StatusColor.cs @@ -14,7 +14,7 @@ public static class StatusColor public static Color Burn => Color.FromArgb(255, 0, 0); public static Color Poison => Color.FromArgb(128, 0, 255); public static Color PoisonBad => Color.FromArgb(200, 0, 255); - public static Color None => Color.FromArgb(255, 255, 255, 255); // Transparent + public static Color None => Color.FromArgb(0, 0, 0, 0); // Transparent /// /// Gets the color of a . diff --git a/PKHeX.WinForms/Controls/PKM Editor/MoveDisplay.Designer.cs b/PKHeX.WinForms/Controls/PKM Editor/MoveDisplay.Designer.cs deleted file mode 100644 index c0086ee02..000000000 --- a/PKHeX.WinForms/Controls/PKM Editor/MoveDisplay.Designer.cs +++ /dev/null @@ -1,87 +0,0 @@ -namespace PKHeX.WinForms.Controls -{ - partial class MoveDisplay - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - FLP_Move = new System.Windows.Forms.FlowLayoutPanel(); - PB_Type = new System.Windows.Forms.PictureBox(); - L_Move = new System.Windows.Forms.Label(); - FLP_Move.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)PB_Type).BeginInit(); - SuspendLayout(); - // - // FLP_Move - // - FLP_Move.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - FLP_Move.Controls.Add(PB_Type); - FLP_Move.Controls.Add(L_Move); - FLP_Move.Location = new System.Drawing.Point(0, 0); - FLP_Move.Name = "FLP_Move"; - FLP_Move.Size = new System.Drawing.Size(138, 24); - FLP_Move.TabIndex = 18; - // - // PB_Type - // - PB_Type.Location = new System.Drawing.Point(0, 0); - PB_Type.Margin = new System.Windows.Forms.Padding(0, 0, 2, 0); - PB_Type.Name = "PB_Type"; - PB_Type.Size = new System.Drawing.Size(24, 24); - PB_Type.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; - PB_Type.TabIndex = 4; - PB_Type.TabStop = false; - // - // L_Move - // - L_Move.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - L_Move.Location = new System.Drawing.Point(26, 0); - L_Move.Margin = new System.Windows.Forms.Padding(0); - L_Move.Name = "L_Move"; - L_Move.Size = new System.Drawing.Size(112, 24); - L_Move.TabIndex = 79; - L_Move.Text = "Name"; - L_Move.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - // - // MoveDisplay - // - AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; - AutoSize = true; - AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - Controls.Add(FLP_Move); - Name = "MoveDisplay"; - Size = new System.Drawing.Size(138, 24); - FLP_Move.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)PB_Type).EndInit(); - ResumeLayout(false); - } - - #endregion - private System.Windows.Forms.FlowLayoutPanel FLP_Move; - private System.Windows.Forms.PictureBox PB_Type; - private System.Windows.Forms.Label L_Move; - } -} diff --git a/PKHeX.WinForms/Controls/PKM Editor/MoveDisplay.cs b/PKHeX.WinForms/Controls/PKM Editor/MoveDisplay.cs deleted file mode 100644 index 71e027325..000000000 --- a/PKHeX.WinForms/Controls/PKM Editor/MoveDisplay.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Windows.Forms; -using PKHeX.Core; -using PKHeX.Drawing.Misc; - -namespace PKHeX.WinForms.Controls; - -public partial class MoveDisplay : UserControl -{ - public MoveDisplay() => InitializeComponent(); - - public int Populate(PKM pk, GameStrings strings, ushort move, EntityContext context, ReadOnlySpan moves, bool valid = true) - { - if (move == 0 || move >= moves.Length) - { - Visible = false; - return 0; - } - Visible = true; - - byte type = MoveInfo.GetType(move, context); - var name = moves[move]; - if (move == (int)Core.Move.HiddenPower && pk.Context is not EntityContext.Gen8a) - { - if (HiddenPower.TryGetTypeIndex(pk.HPType, out type)) - name = $"{name} ({strings.types[type]}) [{pk.HPPower}]"; - } - - var size = PokePreview.MeasureSize(name, L_Move.Font); - var ctrlWidth = PB_Type.Width + PB_Type.Margin.Horizontal + size.Width + L_Move.Margin.Horizontal; - - PB_Type.Image = TypeSpriteUtil.GetTypeSpriteIconSmall(type); - L_Move.Text = name; - if (valid) - L_Move.ResetForeColor(); - else - L_Move.ForeColor = WinFormsUtil.ColorWarn; - L_Move.Width = size.Width; - Width = ctrlWidth; - - return ctrlWidth; - } -} diff --git a/PKHeX.WinForms/Resources/text/changelog.txt b/PKHeX.WinForms/Resources/text/changelog.txt index a0cd86eab..61b1e51bf 100644 --- a/PKHeX.WinForms/Resources/text/changelog.txt +++ b/PKHeX.WinForms/Resources/text/changelog.txt @@ -1,7 +1,29 @@ PKHeX - By Kaphotics http://projectpokemon.org/pkhex/ -26/04/11 - New Update: +26/05/05 - New Update: + - Legality: Updated handling for HOME=>ZA transfers. + - - Added: Gen9a HOME gifts are now recognized. Thanks @Manu098vm ! + - - Added: Gen9a HOME 4.0.0 scale reset handling. Thanks ILCA ! + - - Added: Gen9 Hisuian Zoroark WC9 being forced to Max size is now recognized as legal. + - - Added: Gen3 default trainer trash bytes are now handled, and regular OT trash bytes are more tightly checked. + - - Fixed: Gen8+ Shedinja with affixed ribbons now correctly check when ribbon is missing (due to evolution creation). + - - Fixed: Gen4 Evolution Move checks now work properly when transferred to Gen8+ with a met level of 100 (Gen4=>Gen5). + - - Fixed: Gen4 HG/SS Bug Catching Contest/Safari encounters now correctly check for the 4x 31IV reroll attempts. Thanks Unknown Warrior! + - - Fixed: Gen2 Odd Egg IVs are now enforced. Thanks @ry4242 ! + - - Fixed: Gen1 Trade Evolution outsider check no longer throws an error. Thanks MrCMFTRBLE ! + - Added: Gen6 XY Battle Chateau Rank can now be changed. Thanks @joelsrzalvarez ! + - Added: Gen4 HG/SS save files now differentiate between versions. + - Added: Gen3 Mirage Island appear cheat button to match first party slot PID, making the island appear for the day. + - Fixed: Box export now always saves party stats rather than leaving blank. + - Fixed: Gen9a pc data import now behaves as expected. + - Fixed: Gen3 French LeafGreen now detects better instead of assuming FireRed ("feu"). + - Fixed: Transparent sprite pixel handling for hovering over sprites improved. Thanks @BtEtta & @abcboy101 ! + - Updated: PK2 transfers Korean<->English now work for anything with western text chars. Thanks @abcboy101 ! + - Updated: Drag Drop threshold setting added to lessen click accidents. Thanks @BtEtta ! + - Updated: Translations improved for all languages. Thanks @Ka-n00b, @Coki628 ! + +26/04/11 - New Update: (149259) [13066970] - Added handling for HOME's update for Z-A transfers. - Added backwards transfer logic for Z-A and LATAM language to previous Gen8/9 games. - Added: Sound setting to disable all other beeping sounds the program makes where appropriate. From c7f0063b44d7e292ae824ec56f4235762969f2ae Mon Sep 17 00:00:00 2001 From: Easy World Date: Tue, 5 May 2026 19:50:15 +0800 Subject: [PATCH 19/81] Update Simplified Chinese translations (#4801) Translate several strings to Simplified Chinese (zh-Hans). Updated legality_zh-hans.json (LevelBoostNotZero) and multiple UI text entries in lang_zh-Hans.txt, replacing English phrases with Chinese equivalents for sound prompts, menu labels, buttons, and trainer fields (e.g., PlaySoundOther, SAV_BattlePass.f_MAIN, SAV_Database.B_Add, SAV_Misc8b.TAB_Main, SAV_Trainer4BR.L_PlayerID, SID/TID). --- .../localize/legality/legality_zh-hans.json | 2 +- PKHeX.WinForms/Resources/text/lang_zh-Hans.txt | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json b/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json index 28b6a14c0..8d68536a8 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json +++ b/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json @@ -176,7 +176,7 @@ "IVAllEqual_0": "所有个体值都是 {0}。", "IVNotCorrect": "个体值与相遇要求不匹配", "IVFlawlessCountGEQ_0": "至少有 {0} 项个体值 = 31。", - "LevelBoostNotZero": "Level Boost should be zero.", + "LevelBoostNotZero": "等级提升应为零。", "LevelEXPThreshold": "当前经验与等级匹配。", "LevelEXPTooHigh": "当前经验值超过此宝可梦100级的经验值上限。", "LevelMetBelow": "当前等级低于相遇等级。", diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index 636511cf5..5a3a1cba6 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -331,7 +331,7 @@ LocalizedDescription.OverrideGen3FRLG=第3代火红/叶绿:如果无法检测 LocalizedDescription.OverrideGen3RS=第3代红宝石/蓝宝石:如果无法检测到存档文件的语言或版本,请改用这些设置。 LocalizedDescription.PathBlockKeyList=包含特定长度名称保存的文件夹路径。如果特定的转储文件不存在,则只会加载程序代码中定义的名称。 LocalizedDescription.PlaySoundLegalityCheck=弹窗合法性报告时播放声音。 -LocalizedDescription.PlaySoundOther=Play Sound when performing any other action that would be reasonable to sound alert. +LocalizedDescription.PlaySoundOther=执行其他合理需要声音提醒的操作时播放提示音。 LocalizedDescription.PlaySoundSAVLoad=读取新档时播放声音。 LocalizedDescription.PluginLoadEnable=从plugins文件夹加载插件,假设该文件夹存在。 LocalizedDescription.PluginLoadMerged=加载已合并到主可执行文件中的所有插件。 @@ -932,7 +932,7 @@ SAV_BattlePass.CHK_PresetWin=预设口号 SAV_BattlePass.CHK_Rental=租借通行证 SAV_BattlePass.f_CATCHPHRASES=口号 SAV_BattlePass.f_CREATOR=创建者 -SAV_BattlePass.f_MAIN=主要 +SAV_BattlePass.f_MAIN=主界面 SAV_BattlePass.f_PKM=宝可梦 SAV_BattlePass.GB_Appearance=外观 SAV_BattlePass.GB_Creator=创建者 @@ -1065,7 +1065,7 @@ SAV_Chatter.B_PlayRecording=播放录音 SAV_Chatter.B_Save=保存 SAV_Chatter.CHK_Initialized=已初始化 SAV_Chatter.L_Confusion=混乱 %: -SAV_Database.B_Add=Add +SAV_Database.B_Add=添加 SAV_Database.B_Reset=重置筛选 SAV_Database.B_Search=检索! SAV_Database.CHK_IsEgg=蛋 @@ -1674,7 +1674,7 @@ SAV_Misc8b.B_Save=保存 SAV_Misc8b.B_Shaymin=解锁谢米事件 SAV_Misc8b.B_Spiritomb=与所有地下NPC打过招呼(花岩怪) SAV_Misc8b.B_Zones=解锁所有区域 -SAV_Misc8b.TAB_Main=Main +SAV_Misc8b.TAB_Main=主界面 SAV_MysteryGiftDB.B_Add=添加 SAV_MysteryGiftDB.B_Reset=重置筛选 SAV_MysteryGiftDB.B_Search=检索! @@ -2322,7 +2322,7 @@ SAV_Trainer4BR.L_Coupons=宝可券数: SAV_Trainer4BR.L_Hours=时: SAV_Trainer4BR.L_Language=语言: SAV_Trainer4BR.L_Minutes=分: -SAV_Trainer4BR.L_PlayerID=Player ID: +SAV_Trainer4BR.L_PlayerID=玩家ID: SAV_Trainer4BR.L_RecordColosseumBattles=竞技场对战数: SAV_Trainer4BR.L_RecordCourtyardColosseumClears=城堡竞技场: SAV_Trainer4BR.L_RecordCrystalColosseumClears=水晶竞技场: @@ -2340,8 +2340,8 @@ SAV_Trainer4BR.L_RecordWiFiBattles=Wi-Fi对战数: SAV_Trainer4BR.L_Region=居住地: SAV_Trainer4BR.L_Seconds=秒: SAV_Trainer4BR.L_SelfIntroduction=自我介绍: -SAV_Trainer4BR.L_SID=Nintendo DS SID: -SAV_Trainer4BR.L_TID=Nintendo DS TID: +SAV_Trainer4BR.L_SID=Nintendo DS里ID: +SAV_Trainer4BR.L_TID=Nintendo DS表ID: SAV_Trainer4BR.L_TrainerName=名字: SAV_Trainer7.B_AllFlyDest=全勾选 SAV_Trainer7.B_AllMapUnmask=全勾选 From 5aa1d5143899fc76a9a843c7b75c9109cd0d56bb Mon Sep 17 00:00:00 2001 From: Ka-n00b Date: Tue, 5 May 2026 18:33:20 -0400 Subject: [PATCH 20/81] Translation Updates (#4802) * Update lang_zh-Hant.txt * Update lang_ko.txt * Update lang_it.txt * Update lang_de.txt * Update lang_fr.txt * Update lang_es-419.txt * Update lang_es.txt * Update text_gear_es-419.txt * Update lang_de.txt * Update lang_de.txt * Update lang_it.txt * Update legality_zh-hant.json * Update lang_it.txt * Update lang_es-419.txt * Update lang_es.txt --- .../localize/legality/legality_zh-hant.json | 2 +- .../game/battle_pass_br/text_gear_es-419.txt | 94 +++++++++---------- PKHeX.WinForms/Resources/text/lang_de.txt | 18 ++-- PKHeX.WinForms/Resources/text/lang_es-419.txt | 28 +++--- PKHeX.WinForms/Resources/text/lang_es.txt | 28 +++--- PKHeX.WinForms/Resources/text/lang_fr.txt | 14 +-- PKHeX.WinForms/Resources/text/lang_it.txt | 14 +-- PKHeX.WinForms/Resources/text/lang_ko.txt | 4 +- .../Resources/text/lang_zh-Hant.txt | 10 +- 9 files changed, 106 insertions(+), 106 deletions(-) diff --git a/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json b/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json index 08cd18ecf..0e9c110c7 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json +++ b/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json @@ -176,7 +176,7 @@ "IVAllEqual_0": "所有個體值均為「 {0} 」。", "IVNotCorrect": "個體值與遇見要求不匹配。", "IVFlawlessCountGEQ_0": "至少有 {0} 項個體值 = 31。", - "LevelBoostNotZero": "Level Boost should be zero.", + "LevelBoostNotZero": "等級提升應為零。", "LevelEXPThreshold": "當前經驗值與等級匹配。", "LevelEXPTooHigh": "當前經驗值超過此寶可夢100級時之經驗值上限。", "LevelMetBelow": "當前等級低於遇見等級。", diff --git a/PKHeX.Core/Resources/text/game/battle_pass_br/text_gear_es-419.txt b/PKHeX.Core/Resources/text/game/battle_pass_br/text_gear_es-419.txt index 24b7fefad..9be040770 100644 --- a/PKHeX.Core/Resources/text/game/battle_pass_br/text_gear_es-419.txt +++ b/PKHeX.Core/Resources/text/game/battle_pass_br/text_gear_es-419.txt @@ -11,7 +11,7 @@ Sombrero vaquero B Sombrero vaquero C Sombrero vaquero D Disfraz de Groudon -Disfraz de Groudon (Variocolor) +Disfraz de Groudon (Brillante) Gorro Pikachu Corona Boina Pokétopia @@ -22,12 +22,12 @@ Rojo Azul Verde azulado Disfraz de Groudon -Disfraz de Groudon (Variocolor) +Disfraz de Groudon (Brillante) (Quitar) Lentillas marrón miel Tirita nariz Disfraz de Groudon -Disfraz de Groudon (Variocolor) +Disfraz de Groudon (Brillante) Maquillaje Pikachu Maquillaje Poké Ball Maquillaje siniestro @@ -43,7 +43,7 @@ Camiseta urbana B Camisa del Oeste A Camisa del Oeste B Disfraz de Groudon -Disfraz de Groudon (Variocolor) +Disfraz de Groudon (Brillante) Camiseta Pikachu Camiseta Pokétopia Camiseta Poké Ball @@ -61,7 +61,7 @@ Pantalones urbanos B Pantalones Oeste A Pantalones Oeste B Disfraz de Groudon -Disfraz de Groudon (Variocolor) +Disfraz de Groudon (Brillante) Pantalones Pikachu Pantalones Pokétopia Pantalones Poké Ball @@ -83,7 +83,7 @@ Zapatos del Oeste B Zapatos del Oeste C Zapatos del Oeste D Disfraz de Groudon -Disfraz de Groudon (Variocolor) +Disfraz de Groudon (Brillante) (Quitar) Muñequera skater A Muñequera skater B @@ -98,7 +98,7 @@ Guantes Oeste B Guantes Oeste C Guantes Oeste D Disfraz de Groudon -Disfraz de Groudon (Variocolor) +Disfraz de Groudon (Brillante) Guantes Pikachu Mitones (Quitar) @@ -115,7 +115,7 @@ Bolsa Oeste B Bolsa Oeste C Bolsa Oeste D Disfraz de Groudon -Disfraz de Groudon (Variocolor) +Disfraz de Groudon (Brillante) Bolsa Pikachu Riñonera Poké Ball (Quitar) @@ -267,7 +267,7 @@ Sombrero de gala B Sombrero de gala C Sombrero de gala D Disfraz de Lucario -Disfraz de Lucario (Variocolor) +Disfraz de Lucario (Brillante) Gorro Pikachu Corona Boina Pokétopia @@ -278,12 +278,12 @@ Rubio claro Verde menta Azul hielo Disfraz de Lucario -Disfraz de Lucario (Variocolor) +Disfraz de Lucario (Brillante) (Quitar) Lentillas verde agua Maquillaje de gala Disfraz de Lucario -Disfraz de Lucario (Variocolor) +Disfraz de Lucario (Brillante) Maquillaje Pikachu Maquillaje Poké Ball Maquillaje siniestro @@ -299,7 +299,7 @@ Chaqueta bicicross B Chaqueta de gala A Chaqueta de gala B Disfraz de Lucario -Disfraz de Lucario (Variocolor) +Disfraz de Lucario (Brillante) Chaqueta Pikachu Chaqueta Pokétopia Chaqueta Poké Ball @@ -317,7 +317,7 @@ Pantalones bicicross B Pantalones de gala A Pantalones de gala B Disfraz de Lucario -Disfraz de Lucario (Variocolor) +Disfraz de Lucario (Brillante) Pantalones Pikachu Pantalones Pokétopia Pantalones Poké Ball @@ -339,19 +339,19 @@ Zapatos de gala B Zapatos de gala C Zapatos de gala D Disfraz de Lucario -Disfraz de Lucario (Variocolor) +Disfraz de Lucario (Brillante) (Quitar) Guantes bicicross A Guantes bicicross B Guantes bicicross C Guantes bicicross D Disfraz de Lucario -Disfraz de Lucario (Variocolor) +Disfraz de Lucario (Brillante) Guantes Pikachu Mitones (Quitar) Disfraz de Lucario -Disfraz de Lucario (Variocolor) +Disfraz de Lucario (Brillante) Bolsa Pikachu Riñonera Poké Ball (Quitar) @@ -520,7 +520,7 @@ Casco futurista B Casco futurista C Casco futurista D Disfraz de Electivire -Disfraz de Electivire (Variocolor) +Disfraz de Electivire (Brillante) Gorro Pikachu Corona Boina Pokétopia @@ -531,11 +531,11 @@ Rubio Caoba Caqui Disfraz de Electivire -Disfraz de Electivire (Variocolor) +Disfraz de Electivire (Brillante) (Quitar) Tirita deportiva Disfraz de Electivire -Disfraz de Electivire (Variocolor) +Disfraz de Electivire (Brillante) Maquillaje Pikachu Maquillaje Poké Ball Maquillaje siniestro @@ -551,7 +551,7 @@ Camiseta deportiva B Camiseta futurista A Camiseta futurista B Disfraz de Electivire -Disfraz de Electivire (Variocolor) +Disfraz de Electivire (Brillante) Camiseta tirante Pikachu Camiseta tirante PKtopia Camiseta Poké Ball @@ -569,7 +569,7 @@ Pantalón deportivo B Pantalón futurista A Pantalón futurista B Disfraz de Electivire -Disfraz de Electivire (Variocolor) +Disfraz de Electivire (Brillante) Pantalones Pikachu Pantalones Pokétopia Pantalones Poké Ball @@ -591,7 +591,7 @@ Botas futuristas B Botas futuristas C Botas futuristas D Disfraz de Electivire -Disfraz de Electivire (Variocolor) +Disfraz de Electivire (Brillante) (Quitar) Muñequera militar A Muñequera militar B @@ -606,7 +606,7 @@ Guantes futuristas B Guantes futuristas C Guantes futuristas D Disfraz de Electivire -Disfraz de Electivire (Variocolor) +Disfraz de Electivire (Brillante) Guantes Pikachu Mitones (Quitar) @@ -623,7 +623,7 @@ Mochila futurista B Mochila futurista C Mochila futurista D Disfraz de Electivire -Disfraz de Electivire (Variocolor) +Disfraz de Electivire (Brillante) Bolsa Pikachu Mochila Poké Ball (Quitar) @@ -779,7 +779,7 @@ Sombrero pirata B Sombrero pirata C Sombrero pirata D Disfraz de Kyogre -Disfraz de Kyogre (Variocolor) +Disfraz de Kyogre (Brillante) Gorro Pikachu Corona Boina Pokétopia @@ -790,12 +790,12 @@ Fresa Castaño cobrizo Ágata azul Disfraz de Kyogre -Disfraz de Kyogre (Variocolor) +Disfraz de Kyogre (Brillante) (Quitar) Lentillas azul cielo Lentillas violeta Disfraz de Kyogre -Disfraz de Kyogre (Variocolor) +Disfraz de Kyogre (Brillante) Maquillaje Pikachu Maquillaje Poké Ball Maquillaje siniestro @@ -811,7 +811,7 @@ Minivestido picnic B Minivestido pirata A Minivestido pirata B Disfraz de Kyogre -Disfraz de Kyogre (Variocolor) +Disfraz de Kyogre (Brillante) Minivestido Pikachu Minivestido Pokétopia Minivestido Poké Ball @@ -829,7 +829,7 @@ Short picnic B Short pirata A Short pirata B Disfraz de Kyogre -Disfraz de Kyogre (Variocolor) +Disfraz de Kyogre (Brillante) Ciclistas Pikachu Ciclistas Pokétopia Ciclistas Poké Ball @@ -851,7 +851,7 @@ Zapatos pirata B Zapatos pirata C Zapatos pirata D Disfraz de Kyogre -Disfraz de Kyogre (Variocolor) +Disfraz de Kyogre (Brillante) (Quitar) Muñequera tenista A Muñequera tenista B @@ -866,7 +866,7 @@ Guantes piratas B Guantes piratas C Guantes piratas D Disfraz de Kyogre -Disfraz de Kyogre (Variocolor) +Disfraz de Kyogre (Brillante) Guantes Pikachu Mitones (Quitar) @@ -883,7 +883,7 @@ Bolsa pirata B Bolsa pirata C Bolsa pirata D Disfraz de Kyogre -Disfraz de Kyogre (Variocolor) +Disfraz de Kyogre (Brillante) Bolsa Pikachu Bolsa Poké Ball (Quitar) @@ -1035,7 +1035,7 @@ Gorro floresta B Gorro floresta C Gorro floresta D Disfraz de Roserade -Disfraz de Roserade (Variocolor) +Disfraz de Roserade (Brillante) Gorro Pikachu Corona Boina Pokétopia @@ -1046,12 +1046,12 @@ Arena Negro seda Caoba claro Disfraz de Roserade -Disfraz de Roserade (Variocolor) +Disfraz de Roserade (Brillante) (Quitar) Lentillas glamurosas Lentillas verde mar Disfraz de Roserade -Disfraz de Roserade (Variocolor) +Disfraz de Roserade (Brillante) Maquillaje Pikachu Maquillaje Poké Ball Maquillaje siniestro @@ -1067,7 +1067,7 @@ Top glamuroso B Top floresta A Top floresta B Disfraz de Roserade -Disfraz de Roserade (Variocolor) +Disfraz de Roserade (Brillante) Top Pikachu Top Pokétopia Top Poké Ball @@ -1085,7 +1085,7 @@ Pantalones glamour B Pantalones floresta A Pantalones floresta B Disfraz de Roserade -Disfraz de Roserade (Variocolor) +Disfraz de Roserade (Brillante) Pantalones Pikachu Pantalones Pokétopia Pantalones Poké Ball @@ -1107,7 +1107,7 @@ Sandalias floresta B Sandalias floresta C Sandalias floresta D Disfraz de Roserade -Disfraz de Roserade (Variocolor) +Disfraz de Roserade (Brillante) (Quitar) Brazalete guay A Brazalete guay B @@ -1122,7 +1122,7 @@ Guantes floresta B Guantes floresta C Guantes floresta D Disfraz de Roserade -Disfraz de Roserade (Variocolor) +Disfraz de Roserade (Brillante) Guantes Pikachu Mitones (Quitar) @@ -1138,7 +1138,7 @@ Gafas de sol glamour B Gafas de sol glamour C Gafas de sol glamour D Disfraz de Roserade -Disfraz de Roserade (Variocolor) +Disfraz de Roserade (Brillante) Gafas de intelectual Gafas de sol salvajes Gafas sin montura @@ -1291,7 +1291,7 @@ Diadema sideral B Diadema sideral C Diadema sideral D Disfraz de Pachirisu -Disfraz de Pachirisu (Variocolor) +Disfraz de Pachirisu (Brillante) Orejas de Pikachu Corona Diadema Pokétopia @@ -1302,12 +1302,12 @@ Gris perla Castaño miel Aguamarina Disfraz de Pachirisu -Disfraz de Pachirisu (Variocolor) +Disfraz de Pachirisu (Brillante) (Quitar) Lentillas celestes Lentillas rosa Disfraz de Pachirisu -Disfraz de Pachirisu (Variocolor) +Disfraz de Pachirisu (Brillante) Maquillaje Pikachu Maquillaje Poké Ball Maquillaje siniestro @@ -1323,7 +1323,7 @@ Uniforme escolar B Vestido sideral A Vestido sideral B Disfraz de Pachirisu -Disfraz de Pachirisu (Variocolor) +Disfraz de Pachirisu (Brillante) Vestido Pikachu Vestido Pokétopia Vestido Poké Ball @@ -1347,7 +1347,7 @@ Zapatos siderales B Zapatos siderales C Zapatos siderales D Disfraz de Pachirisu -Disfraz de Pachirisu (Variocolor) +Disfraz de Pachirisu (Brillante) (Quitar) Pulseritas A Pulseritas B @@ -1362,7 +1362,7 @@ Guantes siderales B Guantes siderales C Guantes siderales D Disfraz de Pachirisu -Disfraz de Pachirisu (Variocolor) +Disfraz de Pachirisu (Brillante) Guantes Pikachu Mitones (Quitar) @@ -1371,7 +1371,7 @@ Bolsa sideral B Bolsa sideral C Bolsa sideral D Disfraz de Pachirisu -Disfraz de Pachirisu (Variocolor) +Disfraz de Pachirisu (Brillante) Bolsa Pikachu Bolsa Poké Ball (Quitar) diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index 42674ea4b..18f4261c4 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -1260,9 +1260,9 @@ SAV_FolderList.Tab_Backup=Backups SAV_FolderList.Tab_Folders=Ordner SAV_FolderList.Tab_Recent=Letzte SAV_Gear.B_Cancel=Abbrechen -SAV_Gear.B_Clear=Gear zurücksetzen +SAV_Gear.B_Clear=Accessoires zurücksetzen SAV_Gear.B_Save=Speichern -SAV_Gear.B_UnlockAll=Alles freischalten +SAV_Gear.B_UnlockAll=Alles Accessoires freischalten SAV_Gear.CHK_Electivire=Elevoltek SAV_Gear.CHK_Groudon=Groudon SAV_Gear.CHK_Kyogre=Kyogre @@ -2573,21 +2573,21 @@ SAV_Trainer8b.Tab_BadgeMap=Karte SAV_Trainer8b.Tab_Overview=Übersicht SAV_Trainer9.B_ActivateSnacksworthLegendaries=Legenden aktivieren SAV_Trainer9.B_Cancel=Abbrechen -SAV_Trainer9.B_CollectAllStakes=Alle Anteile +SAV_Trainer9.B_CollectAllStakes=Alle Pfähle einsammeln SAV_Trainer9.B_MaxBP=+ SAV_Trainer9.B_MaxCash=+ SAV_Trainer9.B_MaxLP=+ SAV_Trainer9.B_Save=Speichern -SAV_Trainer9.B_UnlockBikeUpgrades=Alle Fahrrad Upgrades -SAV_Trainer9.B_UnlockClothing=Alle Modeartikel +SAV_Trainer9.B_UnlockBikeUpgrades=Alle Fahrrad Upgrades freischalten +SAV_Trainer9.B_UnlockClothing=Alle Modeartikel freischalten SAV_Trainer9.B_UnlockCoaches=Alle Mentoren freischalten -SAV_Trainer9.B_UnlockFlyLocations=Alle Flug Ziele +SAV_Trainer9.B_UnlockFlyLocations=Alle Flugpunkte freischalten SAV_Trainer9.B_UnlockThrowStyles=Alle Wurfstile freischalten -SAV_Trainer9.B_UnlockTMRecipes=Alle TM Rezepte +SAV_Trainer9.B_UnlockTMRecipes=Alle TM-Rezepte freischalten SAV_Trainer9.GB_BBQ=Missionen SAV_Trainer9.GB_Map=Karte -SAV_Trainer9.L_BBQGroup=Gruppen-Quests: -SAV_Trainer9.L_BBQSolo=Solo-Quests: +SAV_Trainer9.L_BBQGroup=Gruppen-Missionen: +SAV_Trainer9.L_BBQSolo=Solo-Missionen: SAV_Trainer9.L_BP=BP: SAV_Trainer9.L_Hours=Std: SAV_Trainer9.L_Language=Sprache: diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index 1d936beed..7510553ae 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -481,7 +481,7 @@ Main.L_DC1=1: Main.L_DC2=2: Main.L_DynamaxLevel=Nivel Dinamax: Main.L_ExtraBytes=Bytes extras: -Main.L_FormArgument=Forma: +Main.L_FormArgument=Argumento Forma: Main.L_FriendshipHT=Felicidad: Main.L_HeartGauge=Medidor de Corazón: Main.L_Height=Altura: @@ -540,7 +540,7 @@ Main.Label_MetDate=Fecha: Main.Label_MetLevel=Nivel: Main.Label_MetLocation=Lugar: Main.Label_Nature=Naturaleza: -Main.Label_OriginGame=Juego original: +Main.Label_OriginGame=Juego de Origen: Main.Label_OT=EO: Main.Label_PID=PID: Main.Label_PKRS=PkRs.: @@ -1260,9 +1260,9 @@ SAV_FolderList.Tab_Backup=Copia de seg. SAV_FolderList.Tab_Folders=Carpetas SAV_FolderList.Tab_Recent=Reciente SAV_Gear.B_Cancel=Cancelar -SAV_Gear.B_Clear=Reset Gear to Default +SAV_Gear.B_Clear=Restablecer accesorios por defecto SAV_Gear.B_Save=Guardar -SAV_Gear.B_UnlockAll=Unlock All Gear +SAV_Gear.B_UnlockAll=Desbloquear todos los accesorios SAV_Gear.CHK_Electivire=Electivire SAV_Gear.CHK_Groudon=Groudon SAV_Gear.CHK_Kyogre=Kyogre @@ -2578,17 +2578,17 @@ SAV_Trainer9.B_MaxBP=+ SAV_Trainer9.B_MaxCash=+ SAV_Trainer9.B_MaxLP=+ SAV_Trainer9.B_Save=Guardar -SAV_Trainer9.B_UnlockBikeUpgrades=Todo: Mejoras Montura -SAV_Trainer9.B_UnlockClothing=Todo: Objetos de Moda -SAV_Trainer9.B_UnlockCoaches=Todo: Invitados -SAV_Trainer9.B_UnlockFlyLocations=Todo: Lugares de Vuelo -SAV_Trainer9.B_UnlockThrowStyles=Todo: Estilos de Lanz. -SAV_Trainer9.B_UnlockTMRecipes=Todo: Recetas MT +SAV_Trainer9.B_UnlockBikeUpgrades=Desbloquear todas las mejoras de la Montura +SAV_Trainer9.B_UnlockClothing=Desbloquear todos los artículos de moda +SAV_Trainer9.B_UnlockCoaches=Desbloquear todos los invitados especiales +SAV_Trainer9.B_UnlockFlyLocations=Desbloquear todos los puntos de Vuelo +SAV_Trainer9.B_UnlockThrowStyles=Desbloquear todos los estilos de lanzamiento +SAV_Trainer9.B_UnlockTMRecipes=Desbloquear todas las recetas de MT SAV_Trainer9.GB_BBQ=TEA SAV_Trainer9.GB_Map=Posición en el mapa -SAV_Trainer9.L_BBQGroup=Tareas en grupo: -SAV_Trainer9.L_BBQSolo=Tareas indiv.: -SAV_Trainer9.L_BP=PB: +SAV_Trainer9.L_BBQGroup=Tareas grupales: +SAV_Trainer9.L_BBQSolo=Tareas individuales: +SAV_Trainer9.L_BP=PA: SAV_Trainer9.L_Hours=Hrs.: SAV_Trainer9.L_Language=Idioma: SAV_Trainer9.L_LastSaved=Último guardado: @@ -2598,7 +2598,7 @@ SAV_Trainer9.L_Money=$: SAV_Trainer9.L_R=Rotation: SAV_Trainer9.L_Seconds=Seg.: SAV_Trainer9.L_Started=Inicio partida: -SAV_Trainer9.L_ThrowStyle=Estilo de lanz.: +SAV_Trainer9.L_ThrowStyle=Estilo de lanzamiento: SAV_Trainer9.L_TrainerName=Nombre Entr.: SAV_Trainer9.L_X=Coord. X: SAV_Trainer9.L_Y=Coord. Y: diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index cf5db32ec..a3298b7bd 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -481,7 +481,7 @@ Main.L_DC1=1: Main.L_DC2=2: Main.L_DynamaxLevel=Nivel Dinamax: Main.L_ExtraBytes=Bytes extras: -Main.L_FormArgument=Forma: +Main.L_FormArgument=Argumento Forma: Main.L_FriendshipHT=Felicidad: Main.L_HeartGauge=Medidor de Corazón: Main.L_Height=Altura: @@ -540,7 +540,7 @@ Main.Label_MetDate=Fecha: Main.Label_MetLevel=Nivel: Main.Label_MetLocation=Lugar: Main.Label_Nature=Naturaleza: -Main.Label_OriginGame=Juego original: +Main.Label_OriginGame=Juego de Origen: Main.Label_OT=EO: Main.Label_PID=PID: Main.Label_PKRS=PkRs.: @@ -1260,9 +1260,9 @@ SAV_FolderList.Tab_Backup=Copia de seg. SAV_FolderList.Tab_Folders=Carpetas SAV_FolderList.Tab_Recent=Reciente SAV_Gear.B_Cancel=Cancelar -SAV_Gear.B_Clear=Reset Gear to Default +SAV_Gear.B_Clear=Restablecer accesorios por defecto SAV_Gear.B_Save=Guardar -SAV_Gear.B_UnlockAll=Unlock All Gear +SAV_Gear.B_UnlockAll=Desbloquear todos los accesorios SAV_Gear.CHK_Electivire=Electivire SAV_Gear.CHK_Groudon=Groudon SAV_Gear.CHK_Kyogre=Kyogre @@ -2578,17 +2578,17 @@ SAV_Trainer9.B_MaxBP=+ SAV_Trainer9.B_MaxCash=+ SAV_Trainer9.B_MaxLP=+ SAV_Trainer9.B_Save=Guardar -SAV_Trainer9.B_UnlockBikeUpgrades=Todo: Mejoras Montura -SAV_Trainer9.B_UnlockClothing=Todo: Objetos de Moda -SAV_Trainer9.B_UnlockCoaches=Todo: Invitados -SAV_Trainer9.B_UnlockFlyLocations=Todo: Lugares de Vuelo -SAV_Trainer9.B_UnlockThrowStyles=Todo: Estilos de Lanz. -SAV_Trainer9.B_UnlockTMRecipes=Todo: Recetas MT +SAV_Trainer9.B_UnlockBikeUpgrades=Desbloquear todas las mejoras de la Montura +SAV_Trainer9.B_UnlockClothing=Desbloquear todos los artículos de moda +SAV_Trainer9.B_UnlockCoaches=Desbloquear todos los invitados especiales +SAV_Trainer9.B_UnlockFlyLocations=Desbloquear todos los puntos de Vuelo +SAV_Trainer9.B_UnlockThrowStyles=Desbloquear todos los estilos de lanzamiento +SAV_Trainer9.B_UnlockTMRecipes=Desbloquear todas las recetas de MT SAV_Trainer9.GB_BBQ=TEA SAV_Trainer9.GB_Map=Posición en el mapa -SAV_Trainer9.L_BBQGroup=Tareas en grupo: -SAV_Trainer9.L_BBQSolo=Tareas indiv.: -SAV_Trainer9.L_BP=PB: +SAV_Trainer9.L_BBQGroup=Tareas grupales: +SAV_Trainer9.L_BBQSolo=Tareas individuales: +SAV_Trainer9.L_BP=PA: SAV_Trainer9.L_Hours=Hrs.: SAV_Trainer9.L_Language=Idioma: SAV_Trainer9.L_LastSaved=Último guardado: @@ -2598,7 +2598,7 @@ SAV_Trainer9.L_Money=$: SAV_Trainer9.L_R=Rotacion: SAV_Trainer9.L_Seconds=Seg.: SAV_Trainer9.L_Started=Inicio partida: -SAV_Trainer9.L_ThrowStyle=Estilo de lanz.: +SAV_Trainer9.L_ThrowStyle=Estilo de lanzamiento: SAV_Trainer9.L_TrainerName=Nombre Entr.: SAV_Trainer9.L_X=Coord. X: SAV_Trainer9.L_Y=Coord. Y: diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index 89e7e17fc..d6f02a795 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -2578,12 +2578,12 @@ SAV_Trainer9.B_MaxBP=+ SAV_Trainer9.B_MaxCash=+ SAV_Trainer9.B_MaxLP=+ SAV_Trainer9.B_Save=Sauvegarder -SAV_Trainer9.B_UnlockBikeUpgrades=Toutes les Améliorations -SAV_Trainer9.B_UnlockClothing=Tous les articles Mode -SAV_Trainer9.B_UnlockCoaches=Tous les Intervenants -SAV_Trainer9.B_UnlockFlyLocations=Tous les pts de Vol -SAV_Trainer9.B_UnlockThrowStyles=Tous les Styles de Lancer -SAV_Trainer9.B_UnlockTMRecipes=Toutes les Recettes CT +SAV_Trainer9.B_UnlockBikeUpgrades=Débloquer toutes les améliorations Monture +SAV_Trainer9.B_UnlockClothing=Débloquer tous les articles de mode +SAV_Trainer9.B_UnlockCoaches=Débloquer tous les intervenants +SAV_Trainer9.B_UnlockFlyLocations=Débloquer tous les points de Destination Volante +SAV_Trainer9.B_UnlockThrowStyles=Débloquer tous les styles de lancer +SAV_Trainer9.B_UnlockTMRecipes=Débloquer toutes les recettes de CT SAV_Trainer9.GB_BBQ=Act. Myrtille SAV_Trainer9.GB_Map=Position de la carte SAV_Trainer9.L_BBQGroup=Activités Union : @@ -2598,7 +2598,7 @@ SAV_Trainer9.L_Money=$ : SAV_Trainer9.L_R=Rotation : SAV_Trainer9.L_Seconds=Sec : SAV_Trainer9.L_Started=Début jeu : -SAV_Trainer9.L_ThrowStyle=Style de lan. : +SAV_Trainer9.L_ThrowStyle=Style de lancer : SAV_Trainer9.L_TrainerName=Nom de Dresseur : SAV_Trainer9.L_X=Coordonnée X : SAV_Trainer9.L_Y=Coordonnée Y : diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index fc1e58546..533d844fe 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -481,7 +481,7 @@ Main.L_DC1=1: Main.L_DC2=2: Main.L_DynamaxLevel=Livello Dynamax: Main.L_ExtraBytes=Byte Extra: -Main.L_FormArgument=Form Argument: +Main.L_FormArgument=Argomento Forma: Main.L_FriendshipHT=Amicizia: Main.L_HeartGauge=Cuore: Main.L_Height=Altezza: @@ -2578,17 +2578,17 @@ SAV_Trainer9.B_MaxBP=+ SAV_Trainer9.B_MaxCash=+ SAV_Trainer9.B_MaxLP=+ SAV_Trainer9.B_Save=Salva -SAV_Trainer9.B_UnlockBikeUpgrades=Tutti Potenz. Montura -SAV_Trainer9.B_UnlockClothing=Tutto l'Abbigliam. +SAV_Trainer9.B_UnlockBikeUpgrades=Sblocca tutti i potenziamenti della bici +SAV_Trainer9.B_UnlockClothing=Sblocca tutti i capi d'abbigliamento SAV_Trainer9.B_UnlockCoaches=Sblocca tutti i tutor -SAV_Trainer9.B_UnlockFlyLocations=Sblocca tutti i Punti di Volo +SAV_Trainer9.B_UnlockFlyLocations=Sblocca tutti i punti di Volo SAV_Trainer9.B_UnlockThrowStyles=Sblocca tutti gli stili di lotta SAV_Trainer9.B_UnlockTMRecipes=Ottieni tutte ricette per MT SAV_Trainer9.GB_BBQ=Le Ricreattività SAV_Trainer9.GB_Map=Posizione Mappa -SAV_Trainer9.L_BBQGroup=Missioni di gruppo: -SAV_Trainer9.L_BBQSolo=Missioni in solitaria: -SAV_Trainer9.L_BP=BP: +SAV_Trainer9.L_BBQGroup=Ricreattività di gruppo: +SAV_Trainer9.L_BBQSolo=Ricreattività in solitaria: +SAV_Trainer9.L_BP=PM: SAV_Trainer9.L_Hours=Ore: SAV_Trainer9.L_Language=Lingua: SAV_Trainer9.L_LastSaved=Ult. salvat.: diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index 7c6f698a0..f323e50bb 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -481,7 +481,7 @@ Main.L_DC1=1: Main.L_DC2=2: Main.L_DynamaxLevel=다이맥스 레벨: Main.L_ExtraBytes=추가 바이트: -Main.L_FormArgument=폼 변수: +Main.L_FormArgument=폼 인수: Main.L_FriendshipHT=친밀도: Main.L_HeartGauge=배부름 게이지: Main.L_Height=키: @@ -2578,7 +2578,7 @@ SAV_Trainer9.B_MaxBP=+ SAV_Trainer9.B_MaxCash=+ SAV_Trainer9.B_MaxLP=+ SAV_Trainer9.B_Save=저장 -SAV_Trainer9.B_UnlockBikeUpgrades=자전거 기능 모두 잠금해제 +SAV_Trainer9.B_UnlockBikeUpgrades=자전거 기능 모두 잠금 해제 SAV_Trainer9.B_UnlockClothing=모든 패션 잠금 해제 SAV_Trainer9.B_UnlockCoaches=모든 특별 강사 해제 SAV_Trainer9.B_UnlockFlyLocations=모든 공중날기 장소 해금 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index 682f9f559..6cbad7ae6 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -331,7 +331,7 @@ LocalizedDescription.OverrideGen3FRLG=第3代火紅/葉綠:如果無法檢測 LocalizedDescription.OverrideGen3RS=第3代紅寶石/藍寶石:如果無法檢測到存檔文件的語言或版本,請改用這些設定。 LocalizedDescription.PathBlockKeyList=包含特定長度名稱儲存的資料夾路徑。如果特定的轉儲文件不存在,則只會加載程式碼中定義的名稱。 LocalizedDescription.PlaySoundLegalityCheck=彈窗合法性報告時播放聲音 -LocalizedDescription.PlaySoundOther=Play Sound when performing any other action that would be reasonable to sound alert. +LocalizedDescription.PlaySoundOther=執行其他合理需要聲音提醒的操作時播放提示音。 LocalizedDescription.PlaySoundSAVLoad=讀取新檔時播放聲音 LocalizedDescription.PluginLoadEnable=從plugins資料夾加載插件,假設該資料夾存在。 LocalizedDescription.PluginLoadMerged=加載已合併到主可執行文件中的所有插件。 @@ -932,7 +932,7 @@ SAV_BattlePass.CHK_PresetWin=預設口號 SAV_BattlePass.CHK_Rental=租借通行證 SAV_BattlePass.f_CATCHPHRASES=口號 SAV_BattlePass.f_CREATOR=創建者 -SAV_BattlePass.f_MAIN=主要 +SAV_BattlePass.f_MAIN=主介面 SAV_BattlePass.f_PKM=寶可夢 SAV_BattlePass.GB_Appearance=外觀 SAV_BattlePass.GB_Creator=創建者 @@ -2322,7 +2322,7 @@ SAV_Trainer4BR.L_Coupons=寶可券數: SAV_Trainer4BR.L_Hours=時: SAV_Trainer4BR.L_Language=語言: SAV_Trainer4BR.L_Minutes=分: -SAV_Trainer4BR.L_PlayerID=Player ID: +SAV_Trainer4BR.L_PlayerID=玩家ID: SAV_Trainer4BR.L_RecordColosseumBattles=競技場對戰數: SAV_Trainer4BR.L_RecordCourtyardColosseumClears=城堡競技場: SAV_Trainer4BR.L_RecordCrystalColosseumClears=水晶競技場: @@ -2340,8 +2340,8 @@ SAV_Trainer4BR.L_RecordWiFiBattles=Wi-Fi對戰數: SAV_Trainer4BR.L_Region=地區: SAV_Trainer4BR.L_Seconds=秒: SAV_Trainer4BR.L_SelfIntroduction=自我介紹: -SAV_Trainer4BR.L_SID=Nintendo DS SID: -SAV_Trainer4BR.L_TID=Nintendo DS TID: +SAV_Trainer4BR.L_SID=Nintendo DS裡ID: +SAV_Trainer4BR.L_TID=Nintendo DS表ID: SAV_Trainer4BR.L_TrainerName=名字: SAV_Trainer7.B_AllFlyDest=全勾選 SAV_Trainer7.B_AllMapUnmask=全勾選 From 74ae08572a79b858aad470d2b2cac3628fc9f7aa Mon Sep 17 00:00:00 2001 From: Kurt Date: Wed, 6 May 2026 22:22:23 -0500 Subject: [PATCH 21/81] Add better sanity flag init fix debug assert when calling decrypt --- PKHeX.Core/PKM/BK4.cs | 19 ++++++++++++++++++- PKHeX.Core/Saves/SAV4BR.cs | 10 +++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/PKHeX.Core/PKM/BK4.cs b/PKHeX.Core/PKM/BK4.cs index d67d853de..0fc5e85fa 100644 --- a/PKHeX.Core/PKM/BK4.cs +++ b/PKHeX.Core/PKM/BK4.cs @@ -29,7 +29,9 @@ public sealed class BK4 : G4PKM public BK4(Memory data) : base(data) { - Sanity = 0x4000; + IsDecryptedStateBox = true; + if (data.Length > SIZE_STORED) + IsDecryptedStateParty = true; ResetPartyStats(); } @@ -39,7 +41,22 @@ public BK4(Memory data) : base(data) // Structure public override uint PID { get => ReadUInt32BigEndian(Data); set => WriteUInt32BigEndian(Data, value); } + + // Flags indicating overall state public override ushort Sanity { get => ReadUInt16BigEndian(Data[0x04..]); set => WriteUInt16BigEndian(Data[0x04..], value); } + + public bool IsDecryptedStateBox + { + get => (Sanity & 0x4000) != 0; + set => Sanity = (ushort)((Sanity & ~0x4000) | (value ? 0x4000 : 0)); + } + + public bool IsDecryptedStateParty + { + get => (Sanity & 0x8000) != 0; + set => Sanity = (ushort)((Sanity & ~0x8000) | (value ? 0x8000 : 0)); + } + public override ushort Checksum { get => ReadUInt16BigEndian(Data[0x06..]); set => WriteUInt16BigEndian(Data[0x06..], value); } #region Block A diff --git a/PKHeX.Core/Saves/SAV4BR.cs b/PKHeX.Core/Saves/SAV4BR.cs index ce4ace69e..8533f9d62 100644 --- a/PKHeX.Core/Saves/SAV4BR.cs +++ b/PKHeX.Core/Saves/SAV4BR.cs @@ -464,7 +464,7 @@ public void SetBoxName(int box, ReadOnlySpan value) } protected override BK4 GetPKM(Memory data) => new(data); - protected override void DecryptPKM(Span data) => PokeCrypto.Decrypt4BE(data); + protected override void DecryptPKM(Span data) => PokeCrypto.Decrypt4BE(data[..SIZE_STORED]); protected override void SetPKM(PKM pk, bool isParty = false) { @@ -476,8 +476,12 @@ protected override void SetPKM(PKM pk, bool isParty = false) protected override void SetPartyValues(PKM pk, bool isParty) { - if (pk is G4PKM g4) - g4.Sanity = isParty ? (ushort)0xC000 : (ushort)0x4000; + if (pk is not BK4 bk4) + return; + + // Update sanity flags to the correct state + bk4.IsDecryptedStateBox = true; + bk4.IsDecryptedStateParty = isParty; } /// From f0a9c33daf028ace490c6698186b308f67c0ddd1 Mon Sep 17 00:00:00 2001 From: Kurt Date: Thu, 7 May 2026 00:18:35 -0500 Subject: [PATCH 22/81] Add more attributes to indicate reflection Useful for code trimming gates to not trim interior/uses Removes reflection use from EntityBlank, change signature to use EntityContext and Language for safest interaction. --- .../Editing/Bulk/Base/BatchEditingBase.cs | 3 + .../Editing/Bulk/Base/BatchEditingUtil.cs | 2 + PKHeX.Core/PKM/PKM.cs | 1 + PKHeX.Core/PKM/Util/EntityBlank.cs | 94 ++++++++++--------- PKHeX.Core/Ribbons/RibbonInfo.cs | 2 + PKHeX.Core/Saves/Access/SaveBlockMetadata.cs | 2 + .../Encryption/SwishCrypto/SCBlockMetadata.cs | 2 + PKHeX.Core/Util/ReflectUtil.cs | 14 +++ PKHeX.WinForms/Util/Plugins/PluginLoader.cs | 8 ++ PKHeX.WinForms/Util/WinFormsTranslator.cs | 4 + 10 files changed, 87 insertions(+), 45 deletions(-) diff --git a/PKHeX.Core/Editing/Bulk/Base/BatchEditingBase.cs b/PKHeX.Core/Editing/Bulk/Base/BatchEditingBase.cs index 39031f146..7e99ecf44 100644 --- a/PKHeX.Core/Editing/Bulk/Base/BatchEditingBase.cs +++ b/PKHeX.Core/Editing/Bulk/Base/BatchEditingBase.cs @@ -123,6 +123,7 @@ public bool TryGetPropertyType(string propertyName, [NotNullWhen(true)] out stri /// /// Checks if the entity is filtered by the provided filters. /// + [RequiresUnreferencedCode("Uses reflection-backed property caches to evaluate batch filters.")] public bool IsFilterMatch(IEnumerable filters, TObject entity) { var info = CreateMeta(entity); @@ -138,12 +139,14 @@ public bool IsFilterMatch(IEnumerable filters, TObject entity /// /// Tries to modify the entity. /// + [RequiresUnreferencedCode("Uses reflection-backed property caches to modify entity properties.")] public bool TryModifyIsSuccess(TObject entity, IEnumerable filters, IEnumerable modifications, Func? modifier = null) => TryModify(entity, filters, modifications, modifier) is ModifyResult.Modified; /// /// Tries to modify the entity using instructions and a custom modifier delegate. /// + [RequiresUnreferencedCode("Uses reflection-backed property caches to modify entity properties.")] public ModifyResult TryModify(TObject entity, IEnumerable filters, IEnumerable modifications, Func? modifier = null) { if (!ShouldModify(entity)) diff --git a/PKHeX.Core/Editing/Bulk/Base/BatchEditingUtil.cs b/PKHeX.Core/Editing/Bulk/Base/BatchEditingUtil.cs index d82fa34aa..fd3eddc9b 100644 --- a/PKHeX.Core/Editing/Bulk/Base/BatchEditingUtil.cs +++ b/PKHeX.Core/Editing/Bulk/Base/BatchEditingUtil.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; namespace PKHeX.Core; @@ -18,6 +19,7 @@ public static class BatchEditingUtil /// Filters which must be satisfied. /// Object to check. /// True if matches all filters. + [RequiresUnreferencedCode("Uses reflection to evaluate property-based batch filters.")] public static bool IsFilterMatch(IEnumerable filters, T obj) where T : notnull { foreach (var cmd in filters) diff --git a/PKHeX.Core/PKM/PKM.cs b/PKHeX.Core/PKM/PKM.cs index 0e3a24aba..f184778ea 100644 --- a/PKHeX.Core/PKM/PKM.cs +++ b/PKHeX.Core/PKM/PKM.cs @@ -1034,6 +1034,7 @@ public void SetRandomIVsGO(Span ivs, int minIV = 0, int maxIV = 15) /// Applies all shared properties from the current to the . /// /// that receives property values. + [RequiresUnreferencedCode("Copies format-specific PKM properties via reflection for unsupported cross-format conversions.")] public void TransferPropertiesWithReflection(PKM result) { // Only transfer declared properties not defined in PKM.cs but in the actual type diff --git a/PKHeX.Core/PKM/Util/EntityBlank.cs b/PKHeX.Core/PKM/Util/EntityBlank.cs index 19ef6ca4e..4a1e742ee 100644 --- a/PKHeX.Core/PKM/Util/EntityBlank.cs +++ b/PKHeX.Core/PKM/Util/EntityBlank.cs @@ -1,10 +1,9 @@ using System; -using System.Reflection; namespace PKHeX.Core; /// -/// Reflection utility to create blank without specifying a constructor. +/// Utility to create blank instances. /// public static class EntityBlank { @@ -13,45 +12,44 @@ public static class EntityBlank /// /// Type of instance desired. /// New instance of a blank object. - public static PKM GetBlank(Type type) + public static PKM GetBlank(Type type) => type.Name switch { - var typeInfo = type.GetTypeInfo(); - return GetBlank(typeInfo); - } + nameof(PK1) => new PK1(), + nameof(PK2) => new PK2(), + nameof(SK2) => new SK2(), + nameof(PK3) => new PK3(), + nameof(CK3) => new CK3(), + nameof(XK3) => new XK3(), + nameof(PK4) => new PK4(), + nameof(BK4) => new BK4(), + nameof(RK4) => new RK4(), + nameof(PK5) => new PK5(), + nameof(PK6) => new PK6(), + nameof(PK7) => new PK7(), + nameof(PB7) => new PB7(), + nameof(PK8) => new PK8(), + nameof(PA8) => new PA8(), + nameof(PB8) => new PB8(), + nameof(PK9) => new PK9(), + nameof(PA9) => new PA9(), + nameof(PKH) => new PKH(), + _ => throw new ArgumentOutOfRangeException(nameof(type), type, null), + }; - /// - public static PKM GetBlank(TypeInfo type) + /// + /// Gets a Blank object compatible with the provided inputs. + /// + /// The context of the entity. + /// The language of the entity. Only used for Gen 1 Japanese PKM, otherwise ignored. + /// A blank object. + public static PKM GetBlank(EntityContext context, LanguageID language = LanguageID.None) => context switch { - // Not all derived types have a parameter-less constructor, so find the minimal constructor and use that. - ConstructorInfo? info = null; - int count = int.MaxValue; - foreach (var ctor in type.DeclaredConstructors) - { - if (ctor.IsStatic) - continue; - var parameters = ctor.GetParameters(); - int length = parameters.Length; - if (length >= count) - continue; - count = length; - info = ctor; - } - - ArgumentNullException.ThrowIfNull(info); - var result = info.Invoke(new object?[count]); - if (result is not PKM x) - throw new InvalidCastException($"Unable to cast {result} to {typeof(PKM)}"); - return x; - } - - public static PKM GetBlank(byte gen, GameVersion version) => gen switch - { - 1 when version is GameVersion.BU => new PK1(true), - 7 when version is GameVersion.GP or GameVersion.GE => new PB7(), - 8 when version is GameVersion.BD or GameVersion.SP => new PB8(), - 8 when version is GameVersion.PLA => new PA8(), - 9 when version is GameVersion.ZA => new PA9(), - _ => GetBlank(gen), + EntityContext.Gen1 => new PK1(language == LanguageID.Japanese), + EntityContext.Gen7b => new PB7(), + EntityContext.Gen8b => new PB8(), + EntityContext.Gen8a => new PA8(), + EntityContext.Gen9a => new PA9(), + _ => GetBlank(context.Generation), }; /// @@ -61,17 +59,23 @@ public static PKM GetBlank(ITrainerInfo tr) { if (tr is SaveFile s) return s.BlankPKM; - return GetBlank(tr.Generation, tr.Version); + return GetBlank(tr.Context, (LanguageID)tr.Language); } /// - public static PKM GetBlank(byte gen) + public static PKM GetBlank(byte gen) => gen switch { - var type = Type.GetType($"PKHeX.Core.PK{gen}"); - ArgumentNullException.ThrowIfNull(type); - - return GetBlank(type); - } + 1 => new PK1(), + 2 => new PK2(), + 3 => new PK3(), + 4 => new PK4(), + 5 => new PK5(), + 6 => new PK6(), + 7 => new PK7(), + 8 => new PK8(), + 9 => new PK9(), + _ => throw new ArgumentOutOfRangeException(nameof(gen), gen, null), + }; public static PKM GetIdealBlank(ushort species, byte form) { diff --git a/PKHeX.Core/Ribbons/RibbonInfo.cs b/PKHeX.Core/Ribbons/RibbonInfo.cs index 4c877b5c7..2ae7785c7 100644 --- a/PKHeX.Core/Ribbons/RibbonInfo.cs +++ b/PKHeX.Core/Ribbons/RibbonInfo.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; namespace PKHeX.Core; @@ -49,6 +50,7 @@ public int MaxCount /// /// Gets a list of all ribbons available for the entity and their state. /// + [RequiresUnreferencedCode("Uses reflection to enumerate ribbon properties on PKM types.")] public static List GetRibbonInfo(PKM pk) { var riblist = new List(); diff --git a/PKHeX.Core/Saves/Access/SaveBlockMetadata.cs b/PKHeX.Core/Saves/Access/SaveBlockMetadata.cs index d2460275a..35d293122 100644 --- a/PKHeX.Core/Saves/Access/SaveBlockMetadata.cs +++ b/PKHeX.Core/Saves/Access/SaveBlockMetadata.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; namespace PKHeX.Core; @@ -11,6 +12,7 @@ public sealed class SaveBlockMetadata { private readonly Dictionary BlockList; + [RequiresUnreferencedCode("Uses reflection to enumerate save block accessor properties for PropertyGrid-style inspection.")] public SaveBlockMetadata(ISaveBlockAccessor accessor) { var aType = accessor.GetType(); diff --git a/PKHeX.Core/Saves/Encryption/SwishCrypto/SCBlockMetadata.cs b/PKHeX.Core/Saves/Encryption/SwishCrypto/SCBlockMetadata.cs index e78247848..df581827d 100644 --- a/PKHeX.Core/Saves/Encryption/SwishCrypto/SCBlockMetadata.cs +++ b/PKHeX.Core/Saves/Encryption/SwishCrypto/SCBlockMetadata.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Linq; @@ -18,6 +19,7 @@ public sealed class SCBlockMetadata /// /// Creates a new instance of by loading properties and constants declared via reflection. /// + [RequiresUnreferencedCode("Uses reflection to enumerate save block accessor properties and constants.")] public SCBlockMetadata(SCBlockAccessor accessor, IEnumerable extraKeyNames, params string[] exclusions) { var aType = accessor.GetType(); diff --git a/PKHeX.Core/Util/ReflectUtil.cs b/PKHeX.Core/Util/ReflectUtil.cs index c47de4340..b68f2361e 100644 --- a/PKHeX.Core/Util/ReflectUtil.cs +++ b/PKHeX.Core/Util/ReflectUtil.cs @@ -19,6 +19,7 @@ public static class ReflectUtil /// Object to fetch property from /// Value to compare to /// Comparison result + [RequiresUnreferencedCode("Uses reflection to inspect property metadata and values.")] public static int CompareTo(this PropertyInfo pi, T obj, object value) { var v = pi.GetValue(obj, null); @@ -30,12 +31,14 @@ public static int CompareTo(this PropertyInfo pi, T obj, object value) return 0; } + [RequiresUnreferencedCode("Uses reflection to set property values by metadata.")] public static void SetValue(PropertyInfo pi, T obj, object value) { var c = ConvertValue(value, pi.PropertyType); pi.SetValue(obj, c, null); } + [RequiresUnreferencedCode("Uses reflection to access properties by name.")] public static object? GetValue(T obj, string name) where T : notnull { if (obj.GetType().GetTypeInfo().TryGetPropertyInfo(name, out var pi)) @@ -43,6 +46,7 @@ public static void SetValue(PropertyInfo pi, T obj, object value) return null; } + [RequiresUnreferencedCode("Uses reflection to access properties by name.")] public static bool SetValue(T obj, string name, object value) where T : notnull { if (!obj.GetType().GetTypeInfo().TryGetPropertyInfo(name, out var pi)) @@ -53,6 +57,7 @@ public static void SetValue(PropertyInfo pi, T obj, object value) return true; } + [RequiresUnreferencedCode("Uses reflection to enumerate properties on runtime types.")] public static IEnumerable GetPropertiesStartWithPrefix(Type type, string prefix) { return type.GetTypeInfo().GetAllTypeInfo().SelectMany(GetAllProperties) @@ -62,6 +67,7 @@ public static IEnumerable GetPropertiesStartWithPrefix(Type type, string ; } + [RequiresUnreferencedCode("Uses reflection to enumerate properties on runtime types.")] public static IEnumerable GetPropertiesCanWritePublic(Type type) { return GetAllPropertyInfoCanWritePublic(type).Select(p => p.Name) @@ -69,12 +75,14 @@ public static IEnumerable GetPropertiesCanWritePublic(Type type) ; } + [RequiresUnreferencedCode("Uses reflection to enumerate properties on runtime types.")] public static IEnumerable GetAllPropertyInfoCanWritePublic(Type type) { return type.GetTypeInfo().GetAllTypeInfo().SelectMany(GetAllProperties) .Where(CanWritePublic); } + [RequiresUnreferencedCode("Uses reflection to enumerate properties on runtime types.")] public static IEnumerable GetAllPropertyInfoPublic(Type type) { return type.GetTypeInfo().GetAllTypeInfo().SelectMany(GetAllProperties) @@ -88,6 +96,7 @@ public static IEnumerable GetAllPropertyInfoPublic(Type type) private bool CanReadOrWritePublic() => p.CanReadPublic() || p.CanWritePublic(); } + [RequiresUnreferencedCode("Uses reflection to enumerate properties on runtime types.")] public static IEnumerable GetPropertiesPublic(Type type) { return GetAllPropertyInfoPublic(type).Select(p => p.Name) @@ -95,6 +104,7 @@ public static IEnumerable GetPropertiesPublic(Type type) ; } + [RequiresUnreferencedCode("Uses reflection to enumerate properties on runtime types.")] public static IEnumerable GetPropertiesCanWritePublicDeclared(Type type) { return type.GetTypeInfo().GetAllProperties() @@ -151,6 +161,7 @@ public static IEnumerable GetAllTypeInfo(this TypeInfo? typeInfo) /// Name of the property. /// Reference to the property info for the object, if it exists. /// True if it has property, and false if it does not have property. is null when returning false. + [RequiresUnreferencedCode("Uses reflection to inspect properties on runtime types.")] public static bool HasProperty(T obj, string name, [NotNullWhen(true)] out PropertyInfo? pi) where T : notnull { var type = obj.GetType(); @@ -159,6 +170,7 @@ public static IEnumerable GetAllTypeInfo(this TypeInfo? typeInfo) extension(TypeInfo typeInfo) { + [RequiresUnreferencedCode("Uses reflection to inspect properties on runtime types.")] public bool TryGetPropertyInfo(string name, [NotNullWhen(true)] out PropertyInfo? pi) { foreach (var t in typeInfo.GetAllTypeInfo()) @@ -185,6 +197,7 @@ private IEnumerable GetAll(Func> accessor) extension(Type type) { + [RequiresUnreferencedCode("Uses reflection to enumerate fields on runtime types.")] public Dictionary GetAllConstantsOfType() where T : unmanaged { var fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.FlattenHierarchy); @@ -192,6 +205,7 @@ private IEnumerable GetAll(Func> accessor) return consts.ToDictionary(z => (T)(z.GetRawConstantValue() ?? throw new NullReferenceException(nameof(z.Name))), z => z.Name); } + [RequiresUnreferencedCode("Uses reflection to enumerate properties on runtime types.")] public Dictionary GetAllPropertiesOfType(object obj) { var props = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly); diff --git a/PKHeX.WinForms/Util/Plugins/PluginLoader.cs b/PKHeX.WinForms/Util/Plugins/PluginLoader.cs index b0c5eb03f..d4a17e3c2 100644 --- a/PKHeX.WinForms/Util/Plugins/PluginLoader.cs +++ b/PKHeX.WinForms/Util/Plugins/PluginLoader.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Reflection; @@ -18,6 +19,8 @@ public static class PluginLoader /// The directory path to search for plugin assemblies. /// The plugin load setting to use. /// A PluginLoadResult containing contexts and assemblies. + [RequiresUnreferencedCode("Plugin loading depends on runtime-discovered assemblies and types.")] + [RequiresAssemblyFiles("Plugin loading reads assemblies from disk.")] public static PluginLoadResult LoadPluginAssemblies(string pluginPath, bool loadMerged) { var result = new PluginLoadResult(); @@ -49,6 +52,8 @@ public static PluginLoadResult LoadPluginAssemblies(string pluginPath, bool load /// Reference to the list to populate with loaded plugins. /// The plugin load setting to use. /// Plugin source information for the loaded plugin instances of type . + [RequiresUnreferencedCode("Plugin loading depends on runtime-discovered assemblies and types.")] + [RequiresAssemblyFiles("Plugin loading reads assemblies from disk.")] public static PluginLoadResult LoadPlugins(string pluginPath, List list, bool loadMerged) where T : class { var result = LoadPluginAssemblies(pluginPath, loadMerged); @@ -63,6 +68,7 @@ public static PluginLoadResult LoadPluginAssemblies(string pluginPath, bool load /// The type of plugin to load. /// The types of plugins to instantiate. /// An enumerable of loaded plugin instances of type . + [RequiresUnreferencedCode("Plugin instantiation depends on runtime-discovered types.")] private static IEnumerable LoadPlugins(IEnumerable pluginTypes) where T : class { foreach (var t in pluginTypes) @@ -86,6 +92,7 @@ public static PluginLoadResult LoadPluginAssemblies(string pluginPath, bool load /// The type of plugin to search for. /// The assemblies to search for plugins. /// An enumerable of plugin types. + [RequiresUnreferencedCode("Plugin discovery depends on runtime-discovered types.")] private static IEnumerable GetPluginsOfType(IEnumerable assemblies) { var pluginType = typeof(T); @@ -98,6 +105,7 @@ private static IEnumerable GetPluginsOfType(IEnumerable assem /// The assembly to search. /// The plugin type to match. /// An enumerable of matching types. + [RequiresUnreferencedCode("Plugin discovery depends on runtime-discovered types and members.")] private static IEnumerable GetPluginTypes(Assembly z, Type plugin) { try diff --git a/PKHeX.WinForms/Util/WinFormsTranslator.cs b/PKHeX.WinForms/Util/WinFormsTranslator.cs index fbaf0d7f7..119135108 100644 --- a/PKHeX.WinForms/Util/WinFormsTranslator.cs +++ b/PKHeX.WinForms/Util/WinFormsTranslator.cs @@ -265,6 +265,7 @@ private static IEnumerable GetToolsStripDropDownItems(ToolStr } #if DEBUG + [RequiresUnreferencedCode("Debug form loading uses reflection to instantiate forms at runtime.")] public static void DumpAll(string baseLang, ReadOnlySpan banlist, string dir) { var context = Context[baseLang]; @@ -295,6 +296,7 @@ private static bool IsBannedStartsWith(ReadOnlySpan line, ReadOnlySpan types, ReadOnlySpan banlist) { foreach (var t in types) @@ -341,6 +343,7 @@ public static void SetUpdateMode(bool status = true) } } + [RequiresUnreferencedCode("Debug settings loading uses reflection to inspect runtime types and attributes.")] public static void LoadSettings(string defaultLanguage, bool add = true) { var context = (Dictionary)Context[defaultLanguage].Lookup; @@ -348,6 +351,7 @@ public static void LoadSettings(string defaultLanguage, bool add = true) LoadSettings(add, t, context); } + [RequiresUnreferencedCode("Debug settings loading uses reflection to inspect runtime types and attributes.")] private static void LoadSettings(bool add, Type type, Dictionary context) { var props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); From 1e6100662dd41d26b637d202f8e9425722c1e65c Mon Sep 17 00:00:00 2001 From: Ka-n00b Date: Fri, 8 May 2026 08:41:38 -0400 Subject: [PATCH 23/81] Update Korean and Spanish translations (#4803) * Update legality_ko.json * Update lang_es-419.txt * Update lang_es.txt * Add files via upload * Update lang_ko.txt * Update lang_es-419.txt * Update lang_es.txt * Update lang_es-419.txt * Update lang_es.txt * Update lang_es.txt * Update lang_es-419.txt * Update lang_es.txt * Update lang_es-419.txt * Update lang_es.txt * Update lang_es-419.txt * Update lang_es-419.txt * Update lang_es.txt * Update lang_es.txt * Update lang_es-419.txt * Update const_e_es.txt * Update const_e_es-419.txt * Update const_rs_es.txt * Update const_rs_es-419.txt * Update const_rs_es-419.txt * Update const_rs_es.txt * Update const_e_es-419.txt * Update const_e_es.txt * Update const_rs_es-419.txt * Update const_rs_es.txt * Update const_e_es-419.txt * Update const_e_es.txt --- .../localize/legality/legality_ko.json | 4 +- .../text/script/gen2/const_gs_ko.txt | 37 +++++++++++++++++++ .../text/script/gen3/const_e_es-419.txt | 4 +- .../Resources/text/script/gen3/const_e_es.txt | 4 +- .../text/script/gen3/const_rs_es-419.txt | 4 +- .../text/script/gen3/const_rs_es.txt | 4 +- PKHeX.WinForms/Resources/text/lang_es-419.txt | 28 +++++++------- PKHeX.WinForms/Resources/text/lang_es.txt | 28 +++++++------- PKHeX.WinForms/Resources/text/lang_ko.txt | 4 +- 9 files changed, 77 insertions(+), 40 deletions(-) create mode 100644 PKHeX.Core/Resources/text/script/gen2/const_gs_ko.txt diff --git a/PKHeX.Core/Resources/localize/legality/legality_ko.json b/PKHeX.Core/Resources/localize/legality/legality_ko.json index 40aef64e4..db742ad4b 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_ko.json +++ b/PKHeX.Core/Resources/localize/legality/legality_ko.json @@ -198,7 +198,7 @@ "MemoryArgSpecies_H": "{0} 추억: 이 버전에서 잡을 수 있는 포켓몬 종류입니다.", "MemoryCleared_H": "추억: 제대로 지워지지 않았습니다.", "MemoryValid_H": "{0} 추억을 사용할 수 있습니다.", - "MemoryFeelInvalid_H": "{0} 추억: Invalid Feeling.", + "MemoryFeelInvalid_H": "{0} 추억: 유효하지 않은 기분.", "MemoryHTFlagInvalid": "교환 경험 없음: 현재 소유자는 소유했던 트레이너가 될 수 없습니다.", "MemoryHTGender_0": "소유했던 트레이너의 성별이 잘못되었습니다: {0}", "MemoryHTLanguage": "소유했던 트레이너의 언어가 없습니다.", @@ -321,7 +321,7 @@ "TransferHTMismatchGender": "최근 어버이의 성별이 예상치와 일치하지 않습니다.", "TransferHTMismatchLanguage": "최근 어버이의 언어가 예상치와 일치하지 않습니다.", "TransferKoreanGen4": "한국어판 4세대 게임은 해외판 4세대 게임과 통신할 수 없습니다.", - "TransferMet": "만난 장소가 잘못되었습니다. 또는 '포케시프터/조로아크 (Crown Beasts)', '포케시프터/세레비 (세레비)'여야 합니다.", + "TransferMet": "만난 장소가 잘못되었습니다. 또는 '포케시프터/조로아크 (크라운 전설의 개)', '포케시프터/세레비 (세레비)'여야 합니다.", "TransferNotPossible": "출신 포맷에서 현재 포맷으로 전송할 수 없습니다.", "TransferMetLocation": "옮겨진 만난 장소가 잘못되었습니다.", "TransferNature": "전송 시 경험치에 따른 성격이 유효하지 않습니다.", diff --git a/PKHeX.Core/Resources/text/script/gen2/const_gs_ko.txt b/PKHeX.Core/Resources/text/script/gen2/const_gs_ko.txt new file mode 100644 index 000000000..2b0c05cde --- /dev/null +++ b/PKHeX.Core/Resources/text/script/gen2/const_gs_ko.txt @@ -0,0 +1,37 @@ +4 s 발전소 0:일반,1:경비원에게 전화가 옴 (스토리 이벤트) +5 s 블루시티체육관 0:일반,1:로켓단 조무래기 등장 (스토리 이벤트) +6 s 25번도로 0:일반,1:이슬의 데이트 (스토리 이벤트) +8 s 리그 접수 게이트 0:성도 배지 8개 미확인,1:성도 배지 8개 확인 완료 +13 s 일목의 방 0:리셋,1:최근 방문함 +14 s 독수의 방 0:리셋,1:최근 방문함 +15 s 시바의 방 0:리셋,1:최근 방문함 +16 s 카렌의 방 0:리셋,1:최근 방문함 +17 s 목호의 방 0:리셋,1:최근 방문함,2:목호에게 승리,3:호두와 오박사 등장 +18 s 전당등록의 방 0:목호가 팀을 등록함,1:최근 방문함 +19 s 27번도로의 남자 0:관동 진입 대사 전,1:관동 진입 대사 완료 +20 s 연두마을 아주머니 0:첫 번째 포켓몬 수령 전 (29번도로 차단),1:첫 번째 포켓몬 수령 후 (29번도로 통과 가능) +21 s 공박사연구소 이벤트 0:게임 시작,1:포켓몬 선택 중 (연구소 이탈 불가),2:일반,3:경찰관 등장 (라이벌 이름 등록),5:조수가 상처약 지급,6:조수가 몬스터볼 5개 지급 +22 s 엄마 0:게임 시작,1:포켓기어 지급 및 설명 완료 +23 s 어떤 선배 (29번도로) 0:일반,1:포켓몬 포획 방법 설명 +24 s 라이벌 (무궁시티) 0:사라짐,1:배틀 발생 +25 s 포켓몬 할아버지의 집 0:미방문,1:방문 완료 (할아버지 및 오박사 만남) +26 s 32번도로 스토리 이벤트 0:길을 막음,1:통행 허가 (조수에게 알 수령),2:맛있는 꼬리 판매원 조우 +29 s 라이벌 (고동마을) 0:사라짐,1:배틀 발생 +30 s 짧은 치마 아스카 0:일반,1:꼭두를 울렸다고 알려줌 +32 s 라이벌 (담청시티) 0:미조우,1:조우 완료 +34 s 방울탑 게이트 중 0:통행 불가,1:통행 허가 (팬텀배지 확인) +35 s 인주시티 포켓몬센터 0:미방문,1:방문 완료 (이수재 만남) +36 s 분노의호두과자 판매원 0:44번도로 차단,1:사라짐 (44번도로 통행 가능) +37 s 43번도로 게이트 0:로켓단 조무래기 등장 (통행료 징수),1:통행료 지불/조무래기 사라짐 +38 s 라이벌 (달맞이산) 0:배틀 발생,1:사라짐 +39 s 라이벌 (모다피의 탑) 0:미조우,1:조우 완료 +40 s 불탄탑 스토리 이벤트 0:미진입/라이벌 배틀 전,1:라이벌에게 승리,2:불놀이꾼정덕에게 승리 +41 * 전설의 개 (불탄탑) 0:잠들어 있음,1:깨어남/도망감 +42 s 라디오타워 5층 스토리 이벤트 0:가짜 국장과 배틀 전,1:변장한 로켓단간부 처치,2:스튜디오의 로켓단 최고 간부 처치 +46 s 황토마을 선물가게 0:일반,1:목호 등장 (스토리 이벤트) +48 s 아지트 지하 2층 스토리 이벤트 0:미진입,1:목호가 파티 치료/로켓단 간부와 배틀 전,2:붐볼과 배틀 (발신기 방 이탈 불가),3:발신기 정지 +49 s 아지트 지하 3층 스토리 이벤트 0:미진입,1:목호가 암호 설명,2:라이벌 조우,3:로켓단 간부 처치 +50 s 라이벌 (지하통로) 0:배틀 발생,1:사라짐 +52 s 라이벌 (챔피언로드) 0:배틀 발생,1:사라짐 +56 s 아쿠아호 이벤트 0:일반,2:신사와 부딪힘 (스토리 이벤트) +57 s 아쿠아호 지하 1층 선원 0:통행 차단,1:통행 허가 diff --git a/PKHeX.Core/Resources/text/script/gen3/const_e_es-419.txt b/PKHeX.Core/Resources/text/script/gen3/const_e_es-419.txt index 5742ae6b8..220564141 100644 --- a/PKHeX.Core/Resources/text/script/gen3/const_e_es-419.txt +++ b/PKHeX.Core/Resources/text/script/gen3/const_e_es-419.txt @@ -25,8 +25,8 @@ 0x404F + Récord de tamaño de Lotad -0068 s Casa Treta 0:En Puzzle 1,1:En Puzzle 2,2:En Puzzle 3,3:En Puzzle 4,4:En Puzzle 5,5:En Puzzle 6,6:En Puzzle 7,7:En Puzzle 8,8:Todos los Puzzles Completados -0167 s Pergamino Casa Treta 0:Normal (Maestro treta Ocultándose),1:Puede Entrar,4:Nota no leída (Maestro Treta se fue),5:Justo termino un Puzzle +0068 s Casa Treta 0:En Puzzle 1,1:En Desafío 2,2:En Desafío 3,3:En Desafío 4,4:En Desafío 5,5:En Desafío 6,6:En Desafío 7,7:En Desafío 8,8:Todos los Desafíos Completados +0167 s Cortina de la Casa Treta 0:Normal (Maestro Treta Ocultándose),1:Puede Entrar,4:Nota no leída (Maestro Treta se fue),5:Justo termino un Desafío 0094 s Evento Rayquaza 0:No Activado,1:Groudon y Kyogre en Arrecípolis,2:Vista escena de Groudon y Kyogre,3:Plubio en el Pilar Celeste,4:Plubio dejó el Pilar Celeste,5:Despierto,6:Galano Derrotado 0202 s Escena Rayquaza 0:No Despertado,1:Aparecido en Arrecípolis,3:Occurrido 0203 s Torre Espejismo 0:Puede Aparecer,2:Colapsada,3:Accesada Ruta 111 despues Colapsada diff --git a/PKHeX.Core/Resources/text/script/gen3/const_e_es.txt b/PKHeX.Core/Resources/text/script/gen3/const_e_es.txt index 045961198..d1c8a6edd 100644 --- a/PKHeX.Core/Resources/text/script/gen3/const_e_es.txt +++ b/PKHeX.Core/Resources/text/script/gen3/const_e_es.txt @@ -25,8 +25,8 @@ 0x404F + Récord de tamaño de Lotad -0068 s Casa Treta 0:En Puzzle 1,1:En Puzzle 2,2:En Puzzle 3,3:En Puzzle 4,4:En Puzzle 5,5:En Puzzle 6,6:En Puzzle 7,7:En Puzzle 8,8:Todos los Puzzles Completados -0167 s Pergamino Casa Treta 0:Normal (Maestro treta Ocultándose),1:Puede Entrar,4:Nota no leída (Maestro Treta se fue),5:Justo termino un Puzzle +0068 s Casa Treta 0:En Puzzle 1,1:En Desafío 2,2:En Desafío 3,3:En Desafío 4,4:En Desafío 5,5:En Desafío 6,6:En Desafío 7,7:En Desafío 8,8:Todos los Desafíos Completados +0167 s Cortina de la Casa Treta 0:Normal (Maestro Treta Ocultándose),1:Puede Entrar,4:Nota no leída (Maestro Treta se fue),5:Justo termino un Desafío 0094 s Evento Rayquaza 0:No Activado,1:Groudon y Kyogre en Arrecípolis,2:Vista escena de Groudon y Kyogre,3:Plubio en el Pilar Celeste,4:Plubio dejó el Pilar Celeste,5:Despierto,6:Galano Derrotado 0202 s Escena Rayquaza 0:No Despertado,1:Aparecido en Arrecípolis,3:Occurrido 0203 s Torre Espejismo 0:Puede Aparecer,2:Colapsada,3:Accesada Ruta 111 despues Colapsada diff --git a/PKHeX.Core/Resources/text/script/gen3/const_rs_es-419.txt b/PKHeX.Core/Resources/text/script/gen3/const_rs_es-419.txt index f0dd54dab..116d70e89 100644 --- a/PKHeX.Core/Resources/text/script/gen3/const_rs_es-419.txt +++ b/PKHeX.Core/Resources/text/script/gen3/const_rs_es-419.txt @@ -21,6 +21,6 @@ 0x404C * Pokelot RND (Bajo) 0x404F + Récord del Tamaño de Barboach -0068 s Casa Treta 0:En Puzzle 1,1:En Puzzle 2,2:En Puzzle 3,3:En Puzzle 4,4:En Puzzle 5,5:En Puzzle 6,6:En Puzzle 7,7:En Puzzle 8,8:Todos los Puzzles Completados -0167 s Pergamino Casa Treta 0:Normal (Maestro treta Ocultándose),1:Puede Entrar,4:Nota no leída (Maestro Treta se fue),5:Justo termino un Puzzle +0068 s Casa Treta 0:En Puzzle 1,1:En Desafío 2,2:En Desafío 3,3:En Desafío 4,4:En Desafío 5,5:En Desafío 6,6:En Desafío 7,7:En Desafío 8,8:Todos los Desafíos Completados +0167 s Cortina de la Casa Treta 0:Normal (Maestro Treta Ocultándose),1:Puede Entrar,4:Nota no leída (Maestro Treta se fue),5:Justo termino un Desafío 0155 r Estado del Groudon/Kyogre 0:Luchable,1:Luchado diff --git a/PKHeX.Core/Resources/text/script/gen3/const_rs_es.txt b/PKHeX.Core/Resources/text/script/gen3/const_rs_es.txt index b0dbd669a..a72ef0947 100644 --- a/PKHeX.Core/Resources/text/script/gen3/const_rs_es.txt +++ b/PKHeX.Core/Resources/text/script/gen3/const_rs_es.txt @@ -21,6 +21,6 @@ 0x404C * Pokelot RND (Bajo) 0x404F + Récord del Tamaño de Barboach -0068 s Casa Treta 0:En Puzzle 1,1:En Puzzle 2,2:En Puzzle 3,3:En Puzzle 4,4:En Puzzle 5,5:En Puzzle 6,6:En Puzzle 7,7:En Puzzle 8,8:Todos los Puzzles Completados -0167 s Pergamino Casa Treta 0:Normal (Maestro treta Ocultándose),1:Puede Entrar,4:Nota no leída (Maestro Treta se fue),5:Justo termino un Puzzle +0068 s Casa Treta 0:En Puzzle 1,1:En Desafío 2,2:En Desafío 3,3:En Desafío 4,4:En Desafío 5,5:En Desafío 6,6:En Desafío 7,7:En Desafío 8,8:Todos los Desafíos Completados +0167 s Cortina de la Casa Treta 0:Normal (Maestro Treta Ocultándose),1:Puede Entrar,4:Nota no leída (Maestro Treta se fue),5:Justo termino un Desafío 0155 r Estado del Groudon/Kyogre 0:Luchable,1:Luchado diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index 7510553ae..037a0d8d1 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -37,7 +37,7 @@ SAV_HallOfFame7=Visor del Salón de la Fama SAV_HoneyTree=Editor de Árbol de Miel SAV_Inventory=Editor de Inventario SAV_Link6=Editor del Nexo Pokémon -SAV_MailBox=Editor de Cartas +SAV_MailBox=Editor de Buzón SAV_Misc2=Editor Misceláneo SAV_Misc3=Editor de Datos del Entrenador SAV_Misc4=Editor de Datos del Entrenador @@ -87,7 +87,7 @@ SAV_Underground8b=Editor de Objetos del Subsuelo SAV_UnityTower=Editor de la Torre Unión SAV_Wondercard=Editor de Tarjetas Misteriosas SAV_ZygardeCell=Editor de Células/Dominsignias -SettingsEditor=Configuración +SettingsEditor=Ajustes SuperTrainingEditor=Editor de Superentrenamiento TechRecordEditor=Editor de aprendizaje de DT TrashEditor=Caracteres especiales @@ -395,7 +395,7 @@ Main.B_DLC=Editor de DLC Main.B_Donuts=Donas Main.B_FestivalPlaza=Festi Plaza Main.B_JPEG=Guardar PGL .JPEG -Main.B_MailBox=Cartas +Main.B_MailBox=Buzón Main.B_MoveShop=Tienda Movs. Main.B_OpenApricorn=Bonguri Main.B_OpenBattlePass=Pases @@ -582,7 +582,7 @@ Main.Menu_PopoutBoxSingle=Caja individual Main.Menu_Redo=Rehacer último cambio Main.Menu_Report=Informe de la caja Main.Menu_Save=Guardar PKM... -Main.Menu_Settings=Opciones +Main.Menu_Settings=Ajustes Main.Menu_Showdown=Showdown Main.Menu_ShowdownExportCurrentBox=Exportar caja actual al portapapeles Main.Menu_ShowdownExportParty=Exportar equipo al portapapeles @@ -1102,11 +1102,11 @@ SAV_Database.Menu_SearchClones=Sólo clones SAV_Database.Menu_SearchDatabase=Buscar entre base de datos SAV_Database.Menu_SearchIllegal=Mostrar ilegales SAV_Database.Menu_SearchLegal=Mostrar legales -SAV_Database.Menu_SearchSettings=Opciones de búsqueda +SAV_Database.Menu_SearchSettings=Ajustes de búsqueda SAV_Database.Menu_Tools=Herramientas SAV_Database.Tab_Advanced=Avanzado SAV_Database.Tab_General=General -SAV_Database.Tab_Settings=Settings +SAV_Database.Tab_Settings=Ajustes SAV_DLC5.B_BattleTestExport=Exportar SAV_DLC5.B_BattleTestImport=Importar SAV_DLC5.B_BattleVideoExport=Exportar @@ -1195,10 +1195,10 @@ SAV_Encounters.Menu_Exit=Cerrar SAV_Encounters.Tab_Advanced=Avanzado SAV_Encounters.Tab_Criteria=Criteria SAV_Encounters.Tab_General=General -SAV_Encounters.Tab_Settings=Settings +SAV_Encounters.Tab_Settings=Ajustes SAV_EventFlags.B_Cancel=Cancelar SAV_EventFlags.B_LoadNew=Cargar nuevo -SAV_EventFlags.B_LoadOld=Cargar antiguo +SAV_EventFlags.B_LoadOld=Cargar ant. SAV_EventFlags.B_Save=Guardar SAV_EventFlags.CHK_CustomFlag=Marca: SAV_EventFlags.GB_Constants=Constantes de evento @@ -1207,14 +1207,14 @@ SAV_EventFlags.GB_FlagStatus=Comprobar estado SAV_EventFlags.GB_Research=Investigar SAV_EventFlags.GB_Researcher=Investigador de marcas SAV_EventFlags.L_EventFlagWarn=Modificar marcas de eventos puede afectar a la historia. Se recomiendan respaldos del archivo de guardado. -SAV_EventFlags.L_IsSet=IsSet:Marcar -SAV_EventFlags.L_Stats=ConstantE:Cte. -SAV_EventFlags.L_UnSet=UnSet:Desmar. +SAV_EventFlags.L_IsSet=Activo: +SAV_EventFlags.L_Stats=Const.: +SAV_EventFlags.L_UnSet=Inactivo: SAV_EventWork.B_ApplyFlag=Aplicar SAV_EventWork.B_ApplyWork=Aplicar SAV_EventWork.B_Cancel=Cancelar SAV_EventWork.B_LoadNew=Cargar nuevo -SAV_EventWork.B_LoadOld=Cargar antiguo +SAV_EventWork.B_LoadOld=Cargar ant. SAV_EventWork.B_Save=Guardar SAV_EventWork.CHK_CustomFlag=Marca: SAV_EventWork.GB_Constants=Constantes de evento @@ -1232,7 +1232,7 @@ SAV_FlagWork8b.B_ApplyFlagSystem=Aplicar SAV_FlagWork8b.B_ApplyWork=Aplicar SAV_FlagWork8b.B_Cancel=Cancelar SAV_FlagWork8b.B_LoadNew=Cargar nuevo -SAV_FlagWork8b.B_LoadOld=Cargar antiguo +SAV_FlagWork8b.B_LoadOld=Cargar ant. SAV_FlagWork8b.B_Save=Guardar SAV_FlagWork8b.CHK_CustomFlag=Marca de evento: SAV_FlagWork8b.CHK_CustomSystem=Marca del sistema: @@ -1697,7 +1697,7 @@ SAV_MysteryGiftDB.Menu_OpenDB=Abrir carpeta de Base de Datos SAV_MysteryGiftDB.Menu_Tools=Herramientas SAV_MysteryGiftDB.Tab_Advanced=Avanzado SAV_MysteryGiftDB.Tab_General=General -SAV_MysteryGiftDB.Tab_Settings=Settings +SAV_MysteryGiftDB.Tab_Settings=Ajustes SAV_OPower.B_Cancel=Cancelar SAV_OPower.B_ClearAll=Limpiar todo SAV_OPower.B_GiveAll=Dar todo diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index a3298b7bd..9ffef4727 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -37,7 +37,7 @@ SAV_HallOfFame7=Visor del Hall de la Fama SAV_HoneyTree=Editor de Árbol de Miel SAV_Inventory=Editor de Inventario SAV_Link6=Editor del Nexo Pokémon -SAV_MailBox=Editor de Cartas +SAV_MailBox=Editor de Buzón SAV_Misc2=Editor de Varios SAV_Misc3=Editor de Datos del Entrenador SAV_Misc4=Editor de Datos del Entrenador @@ -87,7 +87,7 @@ SAV_Underground8b=Editor de Objetos del Subsuelo SAV_UnityTower=Editor de la Torre Unión SAV_Wondercard=Editor de Tarjetas Misteriosas SAV_ZygardeCell=Editor de Células/Dominsignias -SettingsEditor=Configuración +SettingsEditor=Ajustes SuperTrainingEditor=Editor de Superentrenamiento TechRecordEditor=Editor de aprendizaje de DT TrashEditor=Caracteres especiales @@ -395,7 +395,7 @@ Main.B_DLC=Editor de DLC Main.B_Donuts=Dónuts Main.B_FestivalPlaza=Festi Plaza Main.B_JPEG=Guardar PGL .JPEG -Main.B_MailBox=Cartas +Main.B_MailBox=Buzón Main.B_MoveShop=Tienda Movs. Main.B_OpenApricorn=Bonguri Main.B_OpenBattlePass=Pases @@ -582,7 +582,7 @@ Main.Menu_PopoutBoxSingle=Caja individual Main.Menu_Redo=Rehacer último cambio Main.Menu_Report=Informe de la caja Main.Menu_Save=Guardar PKM... -Main.Menu_Settings=Opciones +Main.Menu_Settings=Ajustes Main.Menu_Showdown=Showdown Main.Menu_ShowdownExportCurrentBox=Exportar caja actual al portapapeles Main.Menu_ShowdownExportParty=Exportar equipo al portapapeles @@ -1102,11 +1102,11 @@ SAV_Database.Menu_SearchClones=Sólo clones SAV_Database.Menu_SearchDatabase=Buscar entre base de datos SAV_Database.Menu_SearchIllegal=Mostrar ilegales SAV_Database.Menu_SearchLegal=Mostrar legales -SAV_Database.Menu_SearchSettings=Opciones de búsqueda +SAV_Database.Menu_SearchSettings=Ajustes de búsqueda SAV_Database.Menu_Tools=Herramientas SAV_Database.Tab_Advanced=Avanzado SAV_Database.Tab_General=General -SAV_Database.Tab_Settings=Settings +SAV_Database.Tab_Settings=Ajustes SAV_DLC5.B_BattleTestExport=Exportar SAV_DLC5.B_BattleTestImport=Importar SAV_DLC5.B_BattleVideoExport=Exportar @@ -1195,10 +1195,10 @@ SAV_Encounters.Menu_Exit=Cerrar SAV_Encounters.Tab_Advanced=Avanzado SAV_Encounters.Tab_Criteria=Criteria SAV_Encounters.Tab_General=General -SAV_Encounters.Tab_Settings=Settings +SAV_Encounters.Tab_Settings=Ajustes SAV_EventFlags.B_Cancel=Cancelar SAV_EventFlags.B_LoadNew=Cargar nuevo -SAV_EventFlags.B_LoadOld=Cargar antiguo +SAV_EventFlags.B_LoadOld=Cargar ant. SAV_EventFlags.B_Save=Guardar SAV_EventFlags.CHK_CustomFlag=Marca: SAV_EventFlags.GB_Constants=Constantes de evento @@ -1207,14 +1207,14 @@ SAV_EventFlags.GB_FlagStatus=Comprobar estado SAV_EventFlags.GB_Research=Investigar SAV_EventFlags.GB_Researcher=Investigador de marcas SAV_EventFlags.L_EventFlagWarn=Modificar marcas de eventos puede afectar a la historia. Se recomiendan respaldos del archivo de guardado. -SAV_EventFlags.L_IsSet=IsSet:Marcar -SAV_EventFlags.L_Stats=ConstantE:Cte. -SAV_EventFlags.L_UnSet=UnSet:Desmar. +SAV_EventFlags.L_IsSet=Activo: +SAV_EventFlags.L_Stats=Const.: +SAV_EventFlags.L_UnSet=Inactivo: SAV_EventWork.B_ApplyFlag=Aplicar SAV_EventWork.B_ApplyWork=Aplicar SAV_EventWork.B_Cancel=Cancelar SAV_EventWork.B_LoadNew=Cargar nuevo -SAV_EventWork.B_LoadOld=Cargar antiguo +SAV_EventWork.B_LoadOld=Cargar ant. SAV_EventWork.B_Save=Guardar SAV_EventWork.CHK_CustomFlag=Marca: SAV_EventWork.GB_Constants=Constantes de evento @@ -1232,7 +1232,7 @@ SAV_FlagWork8b.B_ApplyFlagSystem=Aplicar SAV_FlagWork8b.B_ApplyWork=Aplicar SAV_FlagWork8b.B_Cancel=Cancelar SAV_FlagWork8b.B_LoadNew=Cargar nuevo -SAV_FlagWork8b.B_LoadOld=Cargar antiguo +SAV_FlagWork8b.B_LoadOld=Cargar ant. SAV_FlagWork8b.B_Save=Guardar SAV_FlagWork8b.CHK_CustomFlag=Marca de evento: SAV_FlagWork8b.CHK_CustomSystem=Marca del sistema: @@ -1697,7 +1697,7 @@ SAV_MysteryGiftDB.Menu_OpenDB=Abrir carpeta de Base de Datos SAV_MysteryGiftDB.Menu_Tools=Herramientas SAV_MysteryGiftDB.Tab_Advanced=Avanzado SAV_MysteryGiftDB.Tab_General=General -SAV_MysteryGiftDB.Tab_Settings=Settings +SAV_MysteryGiftDB.Tab_Settings=Ajustes SAV_OPower.B_Cancel=Cancelar SAV_OPower.B_ClearAll=Limpiar todo SAV_OPower.B_GiveAll=Dar todo diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index f323e50bb..64f6235b2 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -1207,9 +1207,9 @@ SAV_EventFlags.GB_FlagStatus=상태 확인 SAV_EventFlags.GB_Research=연구 SAV_EventFlags.GB_Researcher=플래그 차이점 확인 도구 SAV_EventFlags.L_EventFlagWarn=이벤트 플래그를 변경하면 스토리 진행에 영향이 있을 수 있습니다. 먼저 세이브 파일을 백업하세요. -SAV_EventFlags.L_IsSet=IsSet: +SAV_EventFlags.L_IsSet=설정됨: SAV_EventFlags.L_Stats=상수: -SAV_EventFlags.L_UnSet=UnSet: +SAV_EventFlags.L_UnSet=해제됨: SAV_EventWork.B_ApplyFlag=적용 SAV_EventWork.B_ApplyWork=적용 SAV_EventWork.B_Cancel=취소 From a384c9f6661f5f0cf6b9ce7ca2317a4316beeeaf Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 9 May 2026 17:54:34 -0500 Subject: [PATCH 24/81] plugin load: slightly more error tolerance if costura load errors, don't abort loading plugins pre-scan for constructors with no-args so createinstance doesn't throw an exception preventing any other plugins from loading --- .../Util/Plugins/PluginLoadResult.cs | 1 - PKHeX.WinForms/Util/Plugins/PluginLoader.cs | 49 +++++++++++++------ 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/PKHeX.WinForms/Util/Plugins/PluginLoadResult.cs b/PKHeX.WinForms/Util/Plugins/PluginLoadResult.cs index 0358f9dfd..94cd4af6d 100644 --- a/PKHeX.WinForms/Util/Plugins/PluginLoadResult.cs +++ b/PKHeX.WinForms/Util/Plugins/PluginLoadResult.cs @@ -28,7 +28,6 @@ public void Load(string pluginFile) public void LoadFromAssembly(Assembly getExecutingAssembly) { - Contexts.Add(new("")); Assemblies.Add(getExecutingAssembly); } diff --git a/PKHeX.WinForms/Util/Plugins/PluginLoader.cs b/PKHeX.WinForms/Util/Plugins/PluginLoader.cs index d4a17e3c2..455bf708c 100644 --- a/PKHeX.WinForms/Util/Plugins/PluginLoader.cs +++ b/PKHeX.WinForms/Util/Plugins/PluginLoader.cs @@ -40,7 +40,7 @@ public static PluginLoadResult LoadPluginAssemblies(string pluginPath, bool load } } if (loadMerged) - result.LoadFromAssembly(Assembly.GetExecutingAssembly()); + result.LoadFromAssembly(typeof(PluginLoader).Assembly); return result; } @@ -108,31 +108,50 @@ private static IEnumerable GetPluginsOfType(IEnumerable assem [RequiresUnreferencedCode("Plugin discovery depends on runtime-discovered types and members.")] private static IEnumerable GetPluginTypes(Assembly z, Type plugin) { + TryAttachMergedAssemblyLoader(z); + + IEnumerable types; try { - // Handle Costura merged plugin dll's; need to Attach for them to correctly retrieve their dependencies. - var assemblyLoaderType = z.GetType("Costura.AssemblyLoader", false); - var attachMethod = assemblyLoaderType?.GetMethod("Attach", BindingFlags.Static | BindingFlags.Public); - attachMethod?.Invoke(null, []); - - var types = z.GetExportedTypes(); - return types.Where(type => IsTypePlugin(type, plugin)); + types = z.GetExportedTypes(); } // User plugins can be out of date, with mismatching API surfaces. - catch (Exception ex) + catch (ReflectionTypeLoadException ex) { Debug.WriteLine($"Unable to load plugin [{plugin.FullName}]: {z.FullName}"); Debug.WriteLine(ex.Message); - if (ex is not ReflectionTypeLoadException rtle) - return []; - - foreach (var le in rtle.LoaderExceptions) + foreach (var le in ex.LoaderExceptions) { if (le is not null) Debug.WriteLine(le.Message); } + + types = ex.Types.OfType(); + } + catch (Exception ex) + { + Debug.WriteLine($"Unable to load plugin [{plugin.FullName}]: {z.FullName}"); + Debug.WriteLine(ex.Message); return []; } + + return types.Where(type => IsTypePlugin(type, plugin)); + } + + private static void TryAttachMergedAssemblyLoader(Assembly assembly) + { + try + { + // Handle Costura merged plugin dll's; need to Attach for them to correctly retrieve their dependencies. + var assemblyLoaderType = assembly.GetType("Costura.AssemblyLoader", false); + var attachMethod = assemblyLoaderType?.GetMethod("Attach", BindingFlags.Static | BindingFlags.Public); + attachMethod?.Invoke(null, []); + } + catch (Exception ex) + { + Debug.WriteLine($"Unable to attach merged assembly loader: {assembly.FullName}"); + Debug.WriteLine(ex.Message); + } } /// @@ -145,6 +164,8 @@ private static bool IsTypePlugin(Type type, Type plugin) { if (type.IsInterface || type.IsAbstract) return false; - return plugin.IsAssignableFrom(type); + if (!plugin.IsAssignableFrom(type)) + return false; + return type.GetConstructor(Type.EmptyTypes) is not null; } } From 5df994dbae9a70f78ecbadbe67dc7683f716af07 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 9 May 2026 17:56:40 -0500 Subject: [PATCH 25/81] database: settings to specify row count Default rows changed from 11 => 9 min,max is now [5,20] to prevent stupid entry ergonomics: 6 min for encdb, 4 min for mgdb, 9 min for pkmdb --- .../Settings/EncounterDatabaseSettings.cs | 12 ++++++ .../Settings/EntityDatabaseSettings.cs | 12 ++++++ .../Settings/MysteryGiftDatabaseSettings.cs | 12 ++++++ PKHeX.WinForms/Controls/Slots/PokeGrid.cs | 21 ++++++++-- PKHeX.WinForms/Subforms/SAV_Database.cs | 41 ++++++++++++------ PKHeX.WinForms/Subforms/SAV_Encounters.cs | 40 ++++++++++++------ PKHeX.WinForms/Subforms/SAV_MysteryGiftDB.cs | 42 +++++++++++++------ 7 files changed, 139 insertions(+), 41 deletions(-) diff --git a/PKHeX.Core/Editing/Program/Settings/EncounterDatabaseSettings.cs b/PKHeX.Core/Editing/Program/Settings/EncounterDatabaseSettings.cs index b1667a257..fd3211c5b 100644 --- a/PKHeX.Core/Editing/Program/Settings/EncounterDatabaseSettings.cs +++ b/PKHeX.Core/Editing/Program/Settings/EncounterDatabaseSettings.cs @@ -1,7 +1,12 @@ +using System; + namespace PKHeX.Core; public sealed class EncounterDatabaseSettings { + private const int ResultsGridRowCountMin = 5; + private const int ResultsGridRowCountMax = 20; + [LocalizedDescription("Skips searching if the user forgot to enter Species / Move(s) into the search criteria.")] public bool ReturnNoneIfEmptySearch { get; set; } = true; @@ -13,4 +18,11 @@ public sealed class EncounterDatabaseSettings [LocalizedDescription("Use properties from the PKM Editor tabs even if the new encounter isn't the same evolution chain.")] public bool UseTabsAsCriteriaAnySpecies { get; set; } = true; + + [LocalizedDescription("Visible row count for the Encounter Database sprite grid. Clamped from 5 to 20.")] + public int ResultsGridRowCount + { + get; + set => field = Math.Clamp(value, ResultsGridRowCountMin, ResultsGridRowCountMax); + } = 11; } diff --git a/PKHeX.Core/Editing/Program/Settings/EntityDatabaseSettings.cs b/PKHeX.Core/Editing/Program/Settings/EntityDatabaseSettings.cs index 86cc09015..2d5aaaf80 100644 --- a/PKHeX.Core/Editing/Program/Settings/EntityDatabaseSettings.cs +++ b/PKHeX.Core/Editing/Program/Settings/EntityDatabaseSettings.cs @@ -1,7 +1,12 @@ +using System; + namespace PKHeX.Core; public sealed class EntityDatabaseSettings { + private const int ResultsGridRowCountMin = 5; + private const int ResultsGridRowCountMax = 20; + [LocalizedDescription("When loading content for the PKM Database, search within backup save files.")] public bool SearchBackups { get; set; } = true; @@ -16,6 +21,13 @@ public sealed class EntityDatabaseSettings [LocalizedDescription("Hides unavailable Species if the currently loaded save file cannot import them.")] public bool FilterUnavailableSpecies { get; set; } = true; + + [LocalizedDescription("Visible row count for the PKM Database sprite grid. Clamped from 5 to 20.")] + public int ResultsGridRowCount + { + get; + set => field = Math.Clamp(value, ResultsGridRowCountMin, ResultsGridRowCountMax); + } = 9; } public enum DatabaseSortMode diff --git a/PKHeX.Core/Editing/Program/Settings/MysteryGiftDatabaseSettings.cs b/PKHeX.Core/Editing/Program/Settings/MysteryGiftDatabaseSettings.cs index 231ab6f76..54de79f88 100644 --- a/PKHeX.Core/Editing/Program/Settings/MysteryGiftDatabaseSettings.cs +++ b/PKHeX.Core/Editing/Program/Settings/MysteryGiftDatabaseSettings.cs @@ -1,7 +1,19 @@ +using System; + namespace PKHeX.Core; public sealed class MysteryGiftDatabaseSettings { + private const int ResultsGridRowCountMin = 5; + private const int ResultsGridRowCountMax = 20; + [LocalizedDescription("Hides gifts if the currently loaded save file cannot (indirectly) receive them.")] public bool FilterUnavailableSpecies { get; set; } = true; + + [LocalizedDescription("Visible row count for the Mystery Gift Database sprite grid. Clamped from 5 to 20.")] + public int ResultsGridRowCount + { + get; + set => field = Math.Clamp(value, ResultsGridRowCountMin, ResultsGridRowCountMax); + } = 9; } diff --git a/PKHeX.WinForms/Controls/Slots/PokeGrid.cs b/PKHeX.WinForms/Controls/Slots/PokeGrid.cs index 973043d72..68df04812 100644 --- a/PKHeX.WinForms/Controls/Slots/PokeGrid.cs +++ b/PKHeX.WinForms/Controls/Slots/PokeGrid.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Drawing; using System.Linq; @@ -39,6 +40,22 @@ public bool InitializeGrid(int width, int height, SpriteBuilder info) private const int padEdge = 1; // edges private const int border = 1; // between + public static Size GetGridSize(int width, int height, int spriteWidth, int spriteHeight) + { + int w = (2 * padEdge) + border + (width * (spriteWidth + border)); + int h = (2 * padEdge) + border + (height * (spriteHeight + border)); + return new Size(w, h); + } + + public static int GetMaxRowCount(int availableHeight, int spriteHeight) + { + var heightOffset = (2 * padEdge) + border; + var rowHeight = spriteHeight + border; + if (rowHeight <= 0) + return 1; + return Math.Max(1, (availableHeight - heightOffset) / rowHeight); + } + private void Generate(int width, int height) { SuspendLayout(); @@ -64,9 +81,7 @@ private void Generate(int width, int height) } } - int w = (2 * padEdge) + border + (width * (colWidth + border)); - int h = (2 * padEdge) + border + (height * (rowHeight + border)); - Size = new Size(w, h); + Size = GetGridSize(width, height, colWidth, rowHeight); Controls.AddRange(Entries.Cast().ToArray()); ResumeLayout(); } diff --git a/PKHeX.WinForms/Subforms/SAV_Database.cs b/PKHeX.WinForms/Subforms/SAV_Database.cs index 173f14eae..6ad103af1 100644 --- a/PKHeX.WinForms/Subforms/SAV_Database.cs +++ b/PKHeX.WinForms/Subforms/SAV_Database.cs @@ -20,13 +20,15 @@ namespace PKHeX.WinForms; public partial class SAV_Database : Form { + private const int GridHeightMin = 5; + private const int GridHeightMax = 20; private readonly SaveFile SAV; private readonly SAVEditor BoxView; private readonly PKMEditor PKME_Tabs; private readonly EntityInstructionBuilder UC_Builder; private const int GridWidth = 6; - private const int GridHeight = 11; + private readonly int GridHeight; private readonly PictureBox[] PKXBOXES; private readonly string DatabasePath = Main.DatabasePath; @@ -35,10 +37,9 @@ public partial class SAV_Database : Form private int slotSelected = -1; // = null; private Image? slotColor; private const int RES_MIN = GridWidth * 1; - private const int RES_MAX = GridWidth * GridHeight; + private int RES_MAX => PKXBOXES.Length; private readonly string Counter; private readonly string Viewed; - private const int MAXFORMAT = Latest.Generation; private readonly SummaryPreviewer ShowSet = new(); private readonly CancellationTokenSource cts = new(); @@ -67,23 +68,16 @@ public SAV_Database(PKMEditor f1, SAVEditor saveditor) SAV = saveditor.SAV; BoxView = saveditor; PKME_Tabs = f1; + GridHeight = GetGridHeight(Main.Settings.EntityDb.ResultsGridRowCount, DatabasePokeGrid); // Preset Filters to only show PKM available for loaded save UC_EntitySearch.InitializeSelections(SAV); var grid = DatabasePokeGrid; - var smallWidth = grid.Width; - var smallHeight = grid.Height; + var originalGridSize = grid.Size; grid.InitializeGrid(GridWidth, GridHeight, SpriteUtil.Spriter); grid.SetBackground(Resources.box_wp_clean); - var newWidth = grid.Width; - var newHeight = grid.Height; - var wdelta = newWidth - smallWidth; - if (wdelta != 0) - Width += wdelta; - var hdelta = newHeight - smallHeight; - if (hdelta != 0) - Height += hdelta; + ResizeForGrid(grid, originalGridSize); PKXBOXES = [.. grid.Entries]; // Enable Scrolling when hovered over @@ -168,6 +162,27 @@ protected override void OnShown(EventArgs e) UC_EntitySearch.ResetComboBoxSelections(); } + private int GetGridHeight(int requestedRows, PokeGrid grid) + { + requestedRows = Math.Clamp(requestedRows, GridHeightMin, GridHeightMax); + var workingAreaHeight = Screen.FromControl(this).WorkingArea.Height; + var otherHeight = Height - grid.Height; + var maxGridHeight = Math.Max(grid.Height, workingAreaHeight - otherHeight); + var maxRows = PokeGrid.GetMaxRowCount(maxGridHeight, SpriteUtil.Spriter.Height); + return Math.Max(1, Math.Min(requestedRows, maxRows)); + } + + private void ResizeForGrid(PokeGrid grid, Size originalGridSize) + { + var widthDelta = grid.Width - originalGridSize.Width; + if (widthDelta != 0) + Width += widthDelta; + + var heightDelta = grid.Height - originalGridSize.Height; + if (heightDelta != 0) + Height += heightDelta; + } + private void ClickView(object sender, EventArgs e) { if (!WinFormsUtil.TryGetUnderlying(sender, out var pb)) diff --git a/PKHeX.WinForms/Subforms/SAV_Encounters.cs b/PKHeX.WinForms/Subforms/SAV_Encounters.cs index ceb2c3be5..2bcd02216 100644 --- a/PKHeX.WinForms/Subforms/SAV_Encounters.cs +++ b/PKHeX.WinForms/Subforms/SAV_Encounters.cs @@ -18,6 +18,8 @@ namespace PKHeX.WinForms; public partial class SAV_Encounters : Form { + private const int GridHeightMin = 5; + private const int GridHeightMax = 20; private readonly PKMEditor PKME_Tabs; private SaveFile SAV => PKME_Tabs.RequestSaveFile; private readonly SummaryPreviewer ShowSet = new(); @@ -26,7 +28,7 @@ public partial class SAV_Encounters : Form private readonly EntityInstructionBuilder UC_Builder; private const int GridWidth = 6; - private const int GridHeight = 11; + private readonly int GridHeight; // Criteria backing value (edited via PropertyGrid) private EncounterCriteria _criteriaValue = EncounterCriteria.Unrestricted; @@ -52,20 +54,13 @@ public SAV_Encounters(PKMEditor f1, TrainerDatabase db) PKME_Tabs = f1; Trainers = db; + GridHeight = GetGridHeight(Main.Settings.EncounterDb.ResultsGridRowCount, EncounterPokeGrid); var grid = EncounterPokeGrid; - var smallWidth = grid.Width; - var smallHeight = grid.Height; + var originalGridSize = grid.Size; grid.InitializeGrid(GridWidth, GridHeight, SpriteUtil.Spriter); grid.SetBackground(Resources.box_wp_clean); - var newWidth = grid.Width; - var newHeight = grid.Height; - var wdelta = newWidth - smallWidth; - if (wdelta != 0) - Width += wdelta; - var hdelta = newHeight - smallHeight; - if (hdelta != 0) - Height += hdelta; + ResizeForGrid(grid, originalGridSize); PKXBOXES = [..grid.Entries]; @@ -192,9 +187,30 @@ private EncounterTypeGroup[] GetTypes() private int slotSelected = -1; // = null; private Image? slotColor; private const int RES_MIN = GridWidth * 1; - private const int RES_MAX = GridWidth * GridHeight; + private int RES_MAX => PKXBOXES.Length; private readonly string Counter; + private int GetGridHeight(int requestedRows, PokeGrid grid) + { + requestedRows = Math.Clamp(requestedRows, GridHeightMin, GridHeightMax); + var workingAreaHeight = Screen.FromControl(this).WorkingArea.Height; + var otherHeight = Height - grid.Height; + var maxGridHeight = Math.Max(grid.Height, workingAreaHeight - otherHeight); + var maxRows = PokeGrid.GetMaxRowCount(maxGridHeight, SpriteUtil.Spriter.Height); + return Math.Max(1, Math.Min(requestedRows, maxRows)); + } + + private void ResizeForGrid(PokeGrid grid, Size originalGridSize) + { + var widthDelta = grid.Width - originalGridSize.Width; + if (widthDelta != 0) + Width += widthDelta; + + var heightDelta = grid.Height - originalGridSize.Height; + if (heightDelta != 0) + Height += heightDelta; + } + private bool GetShiftedIndex(ref int index) { if (index >= RES_MAX) diff --git a/PKHeX.WinForms/Subforms/SAV_MysteryGiftDB.cs b/PKHeX.WinForms/Subforms/SAV_MysteryGiftDB.cs index ae385fe07..aeb35cd79 100644 --- a/PKHeX.WinForms/Subforms/SAV_MysteryGiftDB.cs +++ b/PKHeX.WinForms/Subforms/SAV_MysteryGiftDB.cs @@ -17,6 +17,8 @@ namespace PKHeX.WinForms; public partial class SAV_MysteryGiftDB : Form { + private const int GridHeightMin = 5; + private const int GridHeightMax = 20; private readonly PKMEditor PKME_Tabs; private readonly SaveFile SAV; private readonly SAVEditor BoxView; @@ -24,14 +26,14 @@ public partial class SAV_MysteryGiftDB : Form private readonly EntityInstructionBuilder UC_Builder; private const int GridWidth = 6; - private const int GridHeight = 11; + private readonly int GridHeight; public SAV_MysteryGiftDB(PKMEditor tabs, SAVEditor sav) { InitializeComponent(); var settings = new TabPage { Text = "Settings", Name = "Tab_Settings" }; - settings.Controls.Add(new PropertyGrid { Dock = DockStyle.Fill, SelectedObject = Main.Settings.EncounterDb }); + settings.Controls.Add(new PropertyGrid { Dock = DockStyle.Fill, SelectedObject = Main.Settings.MysteryDb }); TC_SearchSettings.Controls.Add(settings); WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); @@ -50,23 +52,16 @@ public SAV_MysteryGiftDB(PKMEditor tabs, SAVEditor sav) SAV = sav.SAV; BoxView = sav; PKME_Tabs = tabs; + GridHeight = GetGridHeight(Main.Settings.MysteryDb.ResultsGridRowCount, MysteryPokeGrid); // Preset Filters to only show PKM available for loaded save CB_FormatComparator.SelectedIndex = 3; // <= var grid = MysteryPokeGrid; - var smallWidth = grid.Width; - var smallHeight = grid.Height; + var originalGridSize = grid.Size; grid.InitializeGrid(GridWidth, GridHeight, SpriteUtil.Spriter); grid.SetBackground(Resources.box_wp_clean); - var newWidth = grid.Width; - var newHeight = grid.Height; - var wDelta = newWidth - smallWidth; - if (wDelta != 0) - Width += wDelta; - var hDelta = newHeight - smallHeight; - if (hDelta != 0) - Height += hDelta; + ResizeForGrid(grid, originalGridSize); PKXBOXES = [.. grid.Entries]; @@ -130,11 +125,32 @@ protected override void OnShown(EventArgs e) private int slotSelected = -1; // = null; private Image? slotColor; private const int RES_MIN = GridWidth * 1; - private const int RES_MAX = GridWidth * GridHeight; + private int RES_MAX => PKXBOXES.Length; private readonly string Counter; private readonly string Viewed; private const int MAXFORMAT = Latest.Generation; + private int GetGridHeight(int requestedRows, PokeGrid grid) + { + requestedRows = Math.Clamp(requestedRows, GridHeightMin, GridHeightMax); + var workingAreaHeight = Screen.FromControl(this).WorkingArea.Height; + var otherHeight = Height - grid.Height; + var maxGridHeight = Math.Max(grid.Height, workingAreaHeight - otherHeight); + var maxRows = PokeGrid.GetMaxRowCount(maxGridHeight, SpriteUtil.Spriter.Height); + return Math.Max(1, Math.Min(requestedRows, maxRows)); + } + + private void ResizeForGrid(PokeGrid grid, Size originalGridSize) + { + var widthDelta = grid.Width - originalGridSize.Width; + if (widthDelta != 0) + Width += widthDelta; + + var heightDelta = grid.Height - originalGridSize.Height; + if (heightDelta != 0) + Height += heightDelta; + } + private bool GetShiftedIndex(ref int index) { if (index >= RES_MAX) From c66587c79f8585794c10e3ad581ed9a3a0165f22 Mon Sep 17 00:00:00 2001 From: Ka-n00b Date: Sun, 10 May 2026 12:11:36 -0400 Subject: [PATCH 26/81] Small Spanish RSE and ORAS revisions (#4804) * Update const_e_es-419.txt * Update const_e_es.txt * Update const_rs_es.txt * Update const_rs_es-419.txt * Update const_oras_es.txt * Update const_oras_es-419.txt * Update const_oras_es.txt * Update const_oras_es-419.txt * Update const_oras_es-419.txt * Update const_oras_es.txt * Update flags_oras_es-419.txt * Update flags_oras_es.txt * Update const_oras_es-419.txt * Update const_oras_es.txt * Update flags_oras_es.txt * Update flags_oras_es-419.txt * Update flags_xy_es-419.txt * Update flags_xy_es.txt * Update lang_de.txt * Update lang_it.txt * Update lang_es-419.txt * Update lang_es.txt --- .../text/script/gen3/const_e_es-419.txt | 2 +- .../Resources/text/script/gen3/const_e_es.txt | 2 +- .../text/script/gen3/const_rs_es-419.txt | 2 +- .../Resources/text/script/gen3/const_rs_es.txt | 2 +- .../text/script/gen6/const_oras_es-419.txt | 16 ++++++++-------- .../Resources/text/script/gen6/const_oras_es.txt | 16 ++++++++-------- .../text/script/gen6/flags_oras_es-419.txt | 4 ++-- .../Resources/text/script/gen6/flags_oras_es.txt | 4 ++-- .../text/script/gen6/flags_xy_es-419.txt | 2 +- .../Resources/text/script/gen6/flags_xy_es.txt | 2 +- PKHeX.WinForms/Resources/text/lang_de.txt | 2 +- PKHeX.WinForms/Resources/text/lang_es-419.txt | 2 +- PKHeX.WinForms/Resources/text/lang_es.txt | 2 +- PKHeX.WinForms/Resources/text/lang_it.txt | 4 ++-- 14 files changed, 31 insertions(+), 31 deletions(-) diff --git a/PKHeX.Core/Resources/text/script/gen3/const_e_es-419.txt b/PKHeX.Core/Resources/text/script/gen3/const_e_es-419.txt index 220564141..a505b3600 100644 --- a/PKHeX.Core/Resources/text/script/gen3/const_e_es-419.txt +++ b/PKHeX.Core/Resources/text/script/gen3/const_e_es-419.txt @@ -25,7 +25,7 @@ 0x404F + Récord de tamaño de Lotad -0068 s Casa Treta 0:En Puzzle 1,1:En Desafío 2,2:En Desafío 3,3:En Desafío 4,4:En Desafío 5,5:En Desafío 6,6:En Desafío 7,7:En Desafío 8,8:Todos los Desafíos Completados +0068 s Casa Treta 0:En Desafío 1,1:En Desafío 2,2:En Desafío 3,3:En Desafío 4,4:En Desafío 5,5:En Desafío 6,6:En Desafío 7,7:En Desafío 8,8:Todos los Desafíos Completados 0167 s Cortina de la Casa Treta 0:Normal (Maestro Treta Ocultándose),1:Puede Entrar,4:Nota no leída (Maestro Treta se fue),5:Justo termino un Desafío 0094 s Evento Rayquaza 0:No Activado,1:Groudon y Kyogre en Arrecípolis,2:Vista escena de Groudon y Kyogre,3:Plubio en el Pilar Celeste,4:Plubio dejó el Pilar Celeste,5:Despierto,6:Galano Derrotado 0202 s Escena Rayquaza 0:No Despertado,1:Aparecido en Arrecípolis,3:Occurrido diff --git a/PKHeX.Core/Resources/text/script/gen3/const_e_es.txt b/PKHeX.Core/Resources/text/script/gen3/const_e_es.txt index d1c8a6edd..b67349af6 100644 --- a/PKHeX.Core/Resources/text/script/gen3/const_e_es.txt +++ b/PKHeX.Core/Resources/text/script/gen3/const_e_es.txt @@ -25,7 +25,7 @@ 0x404F + Récord de tamaño de Lotad -0068 s Casa Treta 0:En Puzzle 1,1:En Desafío 2,2:En Desafío 3,3:En Desafío 4,4:En Desafío 5,5:En Desafío 6,6:En Desafío 7,7:En Desafío 8,8:Todos los Desafíos Completados +0068 s Casa Treta 0:En Desafío 1,1:En Desafío 2,2:En Desafío 3,3:En Desafío 4,4:En Desafío 5,5:En Desafío 6,6:En Desafío 7,7:En Desafío 8,8:Todos los Desafíos Completados 0167 s Cortina de la Casa Treta 0:Normal (Maestro Treta Ocultándose),1:Puede Entrar,4:Nota no leída (Maestro Treta se fue),5:Justo termino un Desafío 0094 s Evento Rayquaza 0:No Activado,1:Groudon y Kyogre en Arrecípolis,2:Vista escena de Groudon y Kyogre,3:Plubio en el Pilar Celeste,4:Plubio dejó el Pilar Celeste,5:Despierto,6:Galano Derrotado 0202 s Escena Rayquaza 0:No Despertado,1:Aparecido en Arrecípolis,3:Occurrido diff --git a/PKHeX.Core/Resources/text/script/gen3/const_rs_es-419.txt b/PKHeX.Core/Resources/text/script/gen3/const_rs_es-419.txt index 116d70e89..7c9e1d7f9 100644 --- a/PKHeX.Core/Resources/text/script/gen3/const_rs_es-419.txt +++ b/PKHeX.Core/Resources/text/script/gen3/const_rs_es-419.txt @@ -21,6 +21,6 @@ 0x404C * Pokelot RND (Bajo) 0x404F + Récord del Tamaño de Barboach -0068 s Casa Treta 0:En Puzzle 1,1:En Desafío 2,2:En Desafío 3,3:En Desafío 4,4:En Desafío 5,5:En Desafío 6,6:En Desafío 7,7:En Desafío 8,8:Todos los Desafíos Completados +0068 s Casa Treta 0:En Desafío 1,1:En Desafío 2,2:En Desafío 3,3:En Desafío 4,4:En Desafío 5,5:En Desafío 6,6:En Desafío 7,7:En Desafío 8,8:Todos los Desafíos Completados 0167 s Cortina de la Casa Treta 0:Normal (Maestro Treta Ocultándose),1:Puede Entrar,4:Nota no leída (Maestro Treta se fue),5:Justo termino un Desafío 0155 r Estado del Groudon/Kyogre 0:Luchable,1:Luchado diff --git a/PKHeX.Core/Resources/text/script/gen3/const_rs_es.txt b/PKHeX.Core/Resources/text/script/gen3/const_rs_es.txt index a72ef0947..3af2fa743 100644 --- a/PKHeX.Core/Resources/text/script/gen3/const_rs_es.txt +++ b/PKHeX.Core/Resources/text/script/gen3/const_rs_es.txt @@ -21,6 +21,6 @@ 0x404C * Pokelot RND (Bajo) 0x404F + Récord del Tamaño de Barboach -0068 s Casa Treta 0:En Puzzle 1,1:En Desafío 2,2:En Desafío 3,3:En Desafío 4,4:En Desafío 5,5:En Desafío 6,6:En Desafío 7,7:En Desafío 8,8:Todos los Desafíos Completados +0068 s Casa Treta 0:En Desafío 1,1:En Desafío 2,2:En Desafío 3,3:En Desafío 4,4:En Desafío 5,5:En Desafío 6,6:En Desafío 7,7:En Desafío 8,8:Todos los Desafíos Completados 0167 s Cortina de la Casa Treta 0:Normal (Maestro Treta Ocultándose),1:Puede Entrar,4:Nota no leída (Maestro Treta se fue),5:Justo termino un Desafío 0155 r Estado del Groudon/Kyogre 0:Luchable,1:Luchado diff --git a/PKHeX.Core/Resources/text/script/gen6/const_oras_es-419.txt b/PKHeX.Core/Resources/text/script/gen6/const_oras_es-419.txt index de593938e..2fd95d93b 100644 --- a/PKHeX.Core/Resources/text/script/gen6/const_oras_es-419.txt +++ b/PKHeX.Core/Resources/text/script/gen6/const_oras_es-419.txt @@ -14,11 +14,11 @@ 0167 s Evento de la Isla del Sur 0:Sin acceso,1:Isla del Sur accedida,2:Mensaje escuchado,4:Completado 0168 s Lati@s de la Isla del Sur 0:Sin recibir (Batalla contra Matías/Carola pendiente),1:Recibido 0163 s Evento de la Ruta 120 0:Apareció Steven,1:Combate con Kecleon pendiente (Puente),2:Kecleon derrotado,3:Acceso permitido -0196 s Progreso de la Casa Treta 0:Maestro Treta escondido (Prueba 1),1:Prueba 1 Activa,2:Prueba 1 terminada,3:Maestro Treta escondido (Prueba 2),4:Prueba 2 Activa,5:Prueba 2 terminada,6:Maestro Treta escondido (Prueba 3),7:Puzzle 3 Activa,8:Prueba 3 terminada,9:Maestro Treta escondido (Prueba 4),10:Prueba 4 Activa,11:Prueba 4 terminada,12:Maestro Treta escondido (Prueba 5),13:Prueba 5 Activa,14:Prueba 5 terminada,15:Maestro Treta escondido (Prueba 6),16:Prueba 6 Activa,17:Prueba 6 terminada,18:Todas las pruebas completadas -0197 s Recompensas pruebas Casa Treta 0:MT12 pendiente,1:MT12 recibida,2:Piedra Dura pendiente,3:Piedra Dura recibida,4:MT92 pendiente,5:MT92 recibida,6:Bola de Humo pendiente,7:Bola de Humo recibida,8:Imán pendiente,9:Imán recibido,10:Tienda Roja/Azul pendiente,11:Tienda Roja/Azul recibida -0198 s Pergamino Casa Treta Prueba 1 0:No memorizado,1:Memorizado -0199 s Pergamino Casa Treta Prueba 2 0:No memorizado,1:Memorizado -0200 s Pergamino Casa Treta Prueba 3 0:No memorizado,1:Memorizado -0201 s Pergamino Casa Treta Prueba 4 0:No memorizado,1:Memorizado -0202 s Pergamino Casa Treta Prueba 5 0:No memorizado,1:Memorizado -0203 s Pergamino Casa Treta Prueba 6 0:No memorizado,1:Memorizado +0196 s Progreso de la Casa Treta 0:Maestro Treta escondido (Desafío 1),1:Desafío 1 Activo,2:Desafío 1 terminado,3:Maestro Treta escondido (Desafío 2),4:Desafío 2 Activo,5:Desafío 2 terminado,6:Maestro Treta escondido (Desafío 3),7:Puzzle 3 Activo,8:Desafío 3 terminado,9:Maestro Treta escondido (Desafío 4),10:Desafío 4 Activo,11:Desafío 4 terminado,12:Maestro Treta escondido (Desafío 5),13:Desafío 5 Activo,14:Desafío 5 terminado,15:Maestro Treta escondido (Desafío 6),16:Desafío 6 Activo,17:Desafío 6 terminado,18:Todos los Desafíos completados +0197 s Sala de recompensas Casa Treta 0:MT12 pendiente,1:MT12 recibida,2:Piedra Dura pendiente,3:Piedra Dura recibida,4:MT92 pendiente,5:MT92 recibida,6:Bola de Humo pendiente,7:Bola de Humo recibida,8:Imán pendiente,9:Imán recibido,10:Tienda Roja/Azul pendiente,11:Tienda Roja/Azul recibida +0198 s Pergamino Casa Treta Desafío 1 0:No memorizado,1:Memorizado +0199 s Pergamino Casa Treta Desafío 2 0:No memorizado,1:Memorizado +0200 s Pergamino Casa Treta Desafío 3 0:No memorizado,1:Memorizado +0201 s Pergamino Casa Treta Desafío 4 0:No memorizado,1:Memorizado +0202 s Pergamino Casa Treta Desafío 5 0:No memorizado,1:Memorizado +0203 s Pergamino Casa Treta Desafío 6 0:No memorizado,1:Memorizado diff --git a/PKHeX.Core/Resources/text/script/gen6/const_oras_es.txt b/PKHeX.Core/Resources/text/script/gen6/const_oras_es.txt index e72a91aa7..60375b5e5 100644 --- a/PKHeX.Core/Resources/text/script/gen6/const_oras_es.txt +++ b/PKHeX.Core/Resources/text/script/gen6/const_oras_es.txt @@ -14,11 +14,11 @@ 0167 s Evento de la Isla del Sur 0:Sin acceso,1:Isla del Sur accedida,2:Mensaje escuchado,4:Completado 0168 s Lati@s de la Isla del Sur 0:Sin recibir (Batalla contra Matías/Carola pendiente),1:Recibido 0163 s Evento de la Ruta 120 0:Apareció Máximo,1:Combate con Kecleon pendiente (Puente),2:Kecleon derrotado,3:Acceso permitido -0196 s Progreso de la Casa Treta 0:Maestro Treta escondido (Prueba 1),1:Prueba 1 Activa,2:Prueba 1 terminada,3:Maestro Treta escondido (Prueba 2),4:Prueba 2 Activa,5:Prueba 2 terminada,6:Maestro Treta escondido (Prueba 3),7:Puzzle 3 Activa,8:Prueba 3 terminada,9:Maestro Treta escondido (Prueba 4),10:Prueba 4 Activa,11:Prueba 4 terminada,12:Maestro Treta escondido (Prueba 5),13:Prueba 5 Activa,14:Prueba 5 terminada,15:Maestro Treta escondido (Prueba 6),16:Prueba 6 Activa,17:Prueba 6 terminada,18:Todas las pruebas completadas -0197 s Recompensas pruebas Casa Treta 0:MT12 pendiente,1:MT12 recibida,2:Piedra Dura pendiente,3:Piedra Dura recibida,4:MT92 pendiente,5:MT92 recibida,6:Bola de Humo pendiente,7:Bola de Humo recibida,8:Imán pendiente,9:Imán recibido,10:Tienda Roja/Azul pendiente,11:Tienda Roja/Azul recibida -0198 s Pergamino Casa Treta Prueba 1 0:No memorizado,1:Memorizado -0199 s Pergamino Casa Treta Prueba 2 0:No memorizado,1:Memorizado -0200 s Pergamino Casa Treta Prueba 3 0:No memorizado,1:Memorizado -0201 s Pergamino Casa Treta Prueba 4 0:No memorizado,1:Memorizado -0202 s Pergamino Casa Treta Prueba 5 0:No memorizado,1:Memorizado -0203 s Pergamino Casa Treta Prueba 6 0:No memorizado,1:Memorizado +0196 s Progreso de la Casa Treta 0:Maestro Treta escondido (Desafío 1),1:Desafío 1 Activo,2:Desafío 1 terminado,3:Maestro Treta escondido (Desafío 2),4:Desafío 2 Activo,5:Desafío 2 terminado,6:Maestro Treta escondido (Desafío 3),7:Puzzle 3 Activo,8:Desafío 3 terminado,9:Maestro Treta escondido (Desafío 4),10:Desafío 4 Activo,11:Desafío 4 terminado,12:Maestro Treta escondido (Desafío 5),13:Desafío 5 Activo,14:Desafío 5 terminado,15:Maestro Treta escondido (Desafío 6),16:Desafío 6 Activo,17:Desafío 6 terminado,18:Todos los Desafíos completados +0197 s Sala de recompensas Casa Treta 0:MT12 pendiente,1:MT12 recibida,2:Piedra Dura pendiente,3:Piedra Dura recibida,4:MT92 pendiente,5:MT92 recibida,6:Bola de Humo pendiente,7:Bola de Humo recibida,8:Imán pendiente,9:Imán recibido,10:Tienda Roja/Azul pendiente,11:Tienda Roja/Azul recibida +0198 s Pergamino Casa Treta Desafío 1 0:No memorizado,1:Memorizado +0199 s Pergamino Casa Treta Desafío 2 0:No memorizado,1:Memorizado +0200 s Pergamino Casa Treta Desafío 3 0:No memorizado,1:Memorizado +0201 s Pergamino Casa Treta Desafío 4 0:No memorizado,1:Memorizado +0202 s Pergamino Casa Treta Desafío 5 0:No memorizado,1:Memorizado +0203 s Pergamino Casa Treta Desafío 6 0:No memorizado,1:Memorizado diff --git a/PKHeX.Core/Resources/text/script/gen6/flags_oras_es-419.txt b/PKHeX.Core/Resources/text/script/gen6/flags_oras_es-419.txt index 7c35bb5c3..930ef6ced 100644 --- a/PKHeX.Core/Resources/text/script/gen6/flags_oras_es-419.txt +++ b/PKHeX.Core/Resources/text/script/gen6/flags_oras_es-419.txt @@ -72,8 +72,8 @@ 2720 s Entrado al Salón de la Fama 2729 s Episodio Delta completado 0361 s Revancha contra Alto Mando -3023 s Puede dar Orbe rojo y Orbe azul -0148 s Conocida persona mayor de los baños termales +3023 s Puede dar Prisma Rojo y Prisma Azul +0148 s Encuentro con anciana del balneario 0147 g Huevo de Wynaut de regalo recibido (Pueblo Lavacalda) 0187 g Huevo de Togepi de regalo recibido (Pueblo Lavacalda) 0119 g Castform de regalo recibido (Instituto Meteorológico) diff --git a/PKHeX.Core/Resources/text/script/gen6/flags_oras_es.txt b/PKHeX.Core/Resources/text/script/gen6/flags_oras_es.txt index 2f1c69c8c..43130766b 100644 --- a/PKHeX.Core/Resources/text/script/gen6/flags_oras_es.txt +++ b/PKHeX.Core/Resources/text/script/gen6/flags_oras_es.txt @@ -72,8 +72,8 @@ 2720 s Entrado al Hall de la Fama 2729 s Episodio Delta completado 0361 s Revancha contra Alto Mando -3023 s Puede dar Orbe rojo y Orbe azul -0148 s Conocida persona mayor de los baños termales +3023 s Puede dar Prisma Rojo y Prisma Azul +0148 s Encuentro con anciana del balneario 0147 g Huevo de Wynaut de regalo recibido (Pueblo Lavacalda) 0187 g Huevo de Togepi de regalo recibido (Pueblo Lavacalda) 0119 g Castform de regalo recibido (Instituto Meteorológico) diff --git a/PKHeX.Core/Resources/text/script/gen6/flags_xy_es-419.txt b/PKHeX.Core/Resources/text/script/gen6/flags_xy_es-419.txt index 8d1e7918c..782a57d8a 100644 --- a/PKHeX.Core/Resources/text/script/gen6/flags_xy_es-419.txt +++ b/PKHeX.Core/Resources/text/script/gen6/flags_xy_es-419.txt @@ -26,7 +26,7 @@ 0426 g Intercambio por Farfetch'd en Ciudad Novarte 0319 g Inicial de Kanto recibido de Ciprés 0949 g Lucario de regalo recibido -1060 s Mazmorra rara accesible +1060 s Cueva Rara accesible 0299 g Diancie conseguido via Regalo misterioso (Evento del Centro Pokémon completado) 2666 * Desbloqueado el PC de Olivier 2670 + Puede usar la piruleta: marcha en paralelo diff --git a/PKHeX.Core/Resources/text/script/gen6/flags_xy_es.txt b/PKHeX.Core/Resources/text/script/gen6/flags_xy_es.txt index 992527a9f..1203eb65d 100644 --- a/PKHeX.Core/Resources/text/script/gen6/flags_xy_es.txt +++ b/PKHeX.Core/Resources/text/script/gen6/flags_xy_es.txt @@ -26,7 +26,7 @@ 0426 g Intercambio por Farfetch'd en Ciudad Novarte 0319 g Inicial de Kanto recibido de Ciprés 0949 g Lucario de regalo recibido -1060 s Mazmorra rara accesible +1060 s Mazmorra Rara accesible 0299 g Diancie conseguido via Regalo misterioso (Evento del Centro Pokémon completado) 2666 * Desbloqueado el PC de Olivier 2670 + Puede usar la piruleta: marcha en paralelo diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index 18f4261c4..87a1bcb73 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -1293,7 +1293,7 @@ SAV_HallOfFame.GB_OT=Trainer-Informationen SAV_HallOfFame.groupBox1=Eintrag SAV_HallOfFame.L_Level=Level: SAV_HallOfFame.L_PartyNum=Team-Index: -SAV_HallOfFame.L_Shiny=Schillernd: +SAV_HallOfFame.L_Shiny=*: SAV_HallOfFame.L_Victory=Eintrag: SAV_HallOfFame.Label_EncryptionConstant=Verschl.-Konst.: SAV_HallOfFame.Label_Form=Form: diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index 037a0d8d1..7ae7ad5a5 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -1293,7 +1293,7 @@ SAV_HallOfFame.GB_OT=Info. del entrenador SAV_HallOfFame.groupBox1=Entrada SAV_HallOfFame.L_Level=Nivel: SAV_HallOfFame.L_PartyNum=N.º equipo: -SAV_HallOfFame.L_Shiny=Brillante: +SAV_HallOfFame.L_Shiny=*: SAV_HallOfFame.L_Victory=N.º victorias: SAV_HallOfFame.Label_EncryptionConstant=Cte. de encriptación: SAV_HallOfFame.Label_Form=Forma: diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index 9ffef4727..f8609f87c 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -1293,7 +1293,7 @@ SAV_HallOfFame.GB_OT=Info. del entrenador SAV_HallOfFame.groupBox1=Entrada SAV_HallOfFame.L_Level=Nivel: SAV_HallOfFame.L_PartyNum=N.º equipo: -SAV_HallOfFame.L_Shiny=Variocolor: +SAV_HallOfFame.L_Shiny=*: SAV_HallOfFame.L_Victory=N.º victorias: SAV_HallOfFame.Label_EncryptionConstant=Cte. de encriptación: SAV_HallOfFame.Label_Form=Forma: diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index 533d844fe..b7ac4ba8b 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -1293,9 +1293,9 @@ SAV_HallOfFame.GB_OT=Informazioni Allenatore SAV_HallOfFame.groupBox1=Voce SAV_HallOfFame.L_Level=Livello: SAV_HallOfFame.L_PartyNum=Indice Squadra: -SAV_HallOfFame.L_Shiny=Cromatico: +SAV_HallOfFame.L_Shiny=*: SAV_HallOfFame.L_Victory=Numero Vittorie: -SAV_HallOfFame.Label_EncryptionConstant=Costante di crittografia: +SAV_HallOfFame.Label_EncryptionConstant=Costante di critt.: SAV_HallOfFame.Label_Form=Forma: SAV_HallOfFame.Label_HeldItem=Strumento tenuto: SAV_HallOfFame.Label_MetDate=Data: From 4814b5540324bdcf72d0f86929bc8355e0c116d0 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 10 May 2026 15:20:23 -0500 Subject: [PATCH 27/81] Update EncounterDatabaseSettings.cs forgot to save changes, 11 => 9 same as other db's --- .../Editing/Program/Settings/EncounterDatabaseSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PKHeX.Core/Editing/Program/Settings/EncounterDatabaseSettings.cs b/PKHeX.Core/Editing/Program/Settings/EncounterDatabaseSettings.cs index fd3211c5b..afaab23be 100644 --- a/PKHeX.Core/Editing/Program/Settings/EncounterDatabaseSettings.cs +++ b/PKHeX.Core/Editing/Program/Settings/EncounterDatabaseSettings.cs @@ -24,5 +24,5 @@ public int ResultsGridRowCount { get; set => field = Math.Clamp(value, ResultsGridRowCountMin, ResultsGridRowCountMax); - } = 11; + } = 9; } From 90fb3d422cd0beeea78af1cb878058f1ad1ab953 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 10 May 2026 15:35:45 -0500 Subject: [PATCH 28/81] Gen4 Safari: add another branch for no-sync 31IV Rearrange magic numbers for sync lock-out/lock-in for better JIT comparison (sequential range). Previous improvement missed the "what if the lead is NOT synchronize". We already have a branch for YES synchronize. Magnemite test case solves for no-sync Probably would be worthwhile to de-tangle this but meh --- .../Legality/RNG/ClassicEra/Gen4/MethodK.cs | 51 +++++++++++++----- ... Insécateur - BFFD5B0473FE safari badgen.pk7 | Bin 0 -> 260 bytes ...MAGNETI - B2F0B116BC4C safari 4iv fail.pk4 | Bin 0 -> 236 bytes 3 files changed, 37 insertions(+), 14 deletions(-) create mode 100644 Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/0123 ★ - Insécateur - BFFD5B0473FE safari badgen.pk7 create mode 100644 Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4/0081 - MAGNETI - B2F0B116BC4C safari 4iv fail.pk4 diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs index 5422183ee..385ec176e 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/MethodK.cs @@ -41,7 +41,7 @@ public static class MethodK /// /// // ReSharper disable InvalidXmlDocComment - private static LeadSeed GetSeed(TEnc enc, uint seed, byte levelMin, byte levelMax, byte format = Format, int depth = 0, Nature forceSyncLead = UnsetLead) + private static LeadSeed GetSeed(TEnc enc, uint seed, byte levelMin, byte levelMax, byte format = Format, int depth = 0, Nature forceSyncLead = LeadSyncAllowed) // ReSharper restore InvalidXmlDocComment where TEnc : IEncounterSlot4 { @@ -49,7 +49,7 @@ private static LeadSeed GetSeed(TEnc enc, uint seed, byte levelMin, byte l return GetSeedCore(ctx, seed, depth, forceSyncLead); } - private static LeadSeed GetSeedCore(in SearchContext ctx, uint seed, int depth = 0, Nature forceSyncLead = UnsetLead) + private static LeadSeed GetSeedCore(in SearchContext ctx, uint seed, int depth = 0, Nature forceSyncLead = LeadSyncAllowed) where TEnc : IEncounterSlot4 { var pid = ClassicEraRNG.GetSequentialPID(seed); @@ -102,14 +102,14 @@ private static SearchContext GetSearchContext(T enc, uint seed, byte level /// /// Gets the first possible origin seed and lead for the input encounter & constraints. /// - public static LeadSeed GetOriginSeed(T enc, uint seed, byte nature, int reverseCount, byte levelMin, byte levelMax, byte format = Format, int depth = 0, Nature forceSyncLead = UnsetLead) + public static LeadSeed GetOriginSeed(T enc, uint seed, byte nature, int reverseCount, byte levelMin, byte levelMax, byte format = Format, int depth = 0, Nature forceSyncLead = LeadSyncAllowed) where T : IEncounterSlot4 { var ctx = GetSearchContext(enc, seed, levelMin, levelMax, format); return GetOriginSeed(ctx, seed, nature, reverseCount, depth, forceSyncLead); } - private static LeadSeed GetOriginSeed(in SearchContext ctx, uint seed, byte nature, int reverseCount, int depth = 0, Nature forceSyncLead = UnsetLead) + private static LeadSeed GetOriginSeed(in SearchContext ctx, uint seed, byte nature, int reverseCount, int depth = 0, Nature forceSyncLead = LeadSyncAllowed) where T : IEncounterSlot4 { LeadSeed prefer = default; @@ -211,7 +211,7 @@ public static bool TryGetMatchCuteCharm(T enc, ReadOnlySpan seeds, byte } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static bool TryGetMatch(in SearchContext ctx, uint seed, byte nature, out LeadSeed result, int depth = 0, Nature forceSyncLead = UnsetLead) + private static bool TryGetMatch(in SearchContext ctx, uint seed, byte nature, out LeadSeed result, int depth = 0, Nature forceSyncLead = LeadSyncAllowed) where T : IEncounterSlot4 { var p0 = seed >> 16; // 0 @@ -220,7 +220,7 @@ private static bool TryGetMatch(in SearchContext ctx, uint seed, byte natu { var frame = ctx.GetFrameRef(seed); // Ideally, we don't need to check the recursion. Eagerly check the non-recursive paths. - if (forceSyncLead == UnsetLead) + if (forceSyncLead is (LeadSyncAllowed or LeadSyncDisallowed)) { if (TryGetMatchNoSync(frame, out result) && ctx.CanAcceptDirectMatch(depth)) return true; @@ -229,19 +229,25 @@ private static bool TryGetMatch(in SearchContext ctx, uint seed, byte natu { if (TryGetMatchOnlyFailSync(frame, out result) && ctx.CanAcceptDirectMatch(depth)) { - if (forceSyncLead is not FailSyncLead) // If we locked in a specific synchronization nature yet, prefer to indicate the end result. + if (forceSyncLead is not LeadSyncRequiredFailUnspecific) // If we locked in a specific synchronization nature yet, prefer to indicate the end result. result.Lead = Synchronize; // Override back to the end-result synchronize. return true; } } - // If rerolls can reach here from a failed synchronize check (unknown nature), then check that path as well. if (ctx.ShouldRecurse(depth)) { - var prev = frame.Seed1; - if (!IsSyncPass(prev >> 16) && ctx.LevelMin <= ctx.Encounter.LevelMax) // can't boost level if already using Synchronize + // If we haven't locked in to a synchronize lead based on recursion, try earlier frames. + if (forceSyncLead is (LeadSyncAllowed or LeadSyncDisallowed)) { - var lead = forceSyncLead == UnsetLead ? FailSyncLead : forceSyncLead; + if (RecurseReject(ctx, seed, out result, depth + 1, LeadSyncDisallowed)) + return true; + } + var prev = frame.Seed1; + // If rerolls can reach here from a failed synchronize check (unknown nature), then check that path as well. + if (forceSyncLead is not LeadSyncDisallowed && !IsSyncPass(prev >> 16) && ctx.LevelMin <= ctx.Encounter.LevelMax) // can't boost level if already using Synchronize + { + var lead = forceSyncLead == LeadSyncAllowed ? LeadSyncRequiredFailUnspecific : forceSyncLead; if (RecurseReject(ctx, prev, out result, depth + 1, lead)) return true; } @@ -250,8 +256,9 @@ private static bool TryGetMatch(in SearchContext ctx, uint seed, byte natu // Check for a successful sync activation. // If recursion demands us to be a specific synchronization nature, ensure it matches. If not, can't be a sync activation. - if (forceSyncLead is not (UnsetLead or FailSyncLead)) + if (forceSyncLead is not (LeadSyncAllowed or LeadSyncRequiredFailUnspecific)) { + // LeadSyncDisallowed innately passes this check, no need to explicitly check that case. if (forceSyncLead != (Nature)nature) { result = default; @@ -276,8 +283,24 @@ private static bool TryGetMatch(in SearchContext ctx, uint seed, byte natu return false; } - private const Nature UnsetLead = Nature.Random; // lock in if the generation target requires a sync lead - private const Nature FailSyncLead = unchecked((Nature)(-1)); + /// + /// Represents the magic number that that allows any lead to be used, enabling the generation target to require or not require a synchronize lead. + /// + private const Nature LeadSyncAllowed = Nature.Random; + + /// + /// Represents a special value indicating that synchronize is disallowed for the lead. + /// + /// When the generation pattern is traversing upwards under the assumption that it was a regular nature check, this value is used to prevent traversing up synchronize origins. + private const Nature LeadSyncDisallowed = unchecked(LeadSyncAllowed + 1); + + /// + /// Represents a special value indicating that synchronize is required, but no specific nature has been required yet. + /// + /// + /// Any other value [0,24] is a specific nature being required as a synchronize lead. + /// + private const Nature LeadSyncRequiredFailUnspecific = unchecked(LeadSyncAllowed + 2); /// /// Recursive method to check if the input seed could have been generated after 1-4 failed attempts at re-rolling for 31-IVs. diff --git a/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/0123 ★ - Insécateur - BFFD5B0473FE safari badgen.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/0123 ★ - Insécateur - BFFD5B0473FE safari badgen.pk7 new file mode 100644 index 0000000000000000000000000000000000000000..834628b68391625ac10ce4bec84b1ae84f71f620 GIT binary patch literal 260 zcmexY%o5GO@OOVT0|P@~-Ws=}AB+qxj0_C_fa1bHF+#wTA&;S$;Uz;dLn1>7Ln=cl zLlIPqHjw{>;T(gUoQMXhDc@f=nL0D%19j#BNtk-L8ldgSz>R^Cg&8j3&X5VTFO?w& qh*5zXoGZmF17sVPN*FP4_zE+@H5&m%dx5ZtA&H@Y!Ji=lssjKxy&Zo5 literal 0 HcmV?d00001 diff --git a/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4/0081 - MAGNETI - B2F0B116BC4C safari 4iv fail.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4/0081 - MAGNETI - B2F0B116BC4C safari 4iv fail.pk4 new file mode 100644 index 0000000000000000000000000000000000000000..6e5492b531f57d8dd365758a1cb98285d71f41bb GIT binary patch literal 236 zcmea-Bes!&;lrjt1_p*rhl@NI1Q;0Hv>2FyTojCn5rpP`~TQ1)^C% z1j8u?b4G1OLq-cmeMUP*W5)mg!NLp->` Date: Mon, 11 May 2026 22:24:41 -0500 Subject: [PATCH 29/81] skip strange ball giveall PLA, dishes SV --- PKHeX.Core/Items/ItemStorage8LA.cs | 15 +++++++++++++-- PKHeX.Core/Items/ItemStorage9SV.cs | 15 ++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/PKHeX.Core/Items/ItemStorage8LA.cs b/PKHeX.Core/Items/ItemStorage8LA.cs index 8c1acac23..20806b663 100644 --- a/PKHeX.Core/Items/ItemStorage8LA.cs +++ b/PKHeX.Core/Items/ItemStorage8LA.cs @@ -65,11 +65,22 @@ public sealed class ItemStorage8LA : IItemStorage 1828, ]; - public bool IsLegal(InventoryType type, int itemIndex, int itemCount) => GetItems(type).BinarySearch((ushort)itemIndex) >= 0; + // excludes from pouch gifting all, no held items + private static ReadOnlySpan Unreleased => + [ + 1785, // Strange Ball + ]; + + public bool IsLegal(InventoryType type, int itemIndex, int itemCount) + { + if (type is InventoryType.KeyItems) + return true; + + return itemCount != 0 && !Unreleased.Contains((ushort)itemIndex); + } public ReadOnlySpan GetItems(InventoryType type) => type switch { - InventoryType.Items => General, InventoryType.KeyItems => Key, InventoryType.PCItems => General, diff --git a/PKHeX.Core/Items/ItemStorage9SV.cs b/PKHeX.Core/Items/ItemStorage9SV.cs index 560849204..a4cc6e464 100644 --- a/PKHeX.Core/Items/ItemStorage9SV.cs +++ b/PKHeX.Core/Items/ItemStorage9SV.cs @@ -195,6 +195,16 @@ public sealed class ItemStorage9SV : IItemStorage 1785, // Strange Ball ]; + private static ReadOnlySpan UnreleasedIngredients => + [ + 2395, // Blue Dish + //2396, // Green Dish (Mesagoza Treasure Hunt) + 2397, // Orange Dish + 2398, // Red Dish + 2399, // White Dish + 2400, // Yellow Dish + ]; + public int GetMax(InventoryType type) => type switch { InventoryType.Items => 999, @@ -212,7 +222,10 @@ public sealed class ItemStorage9SV : IItemStorage public bool IsLegal(InventoryType type, int itemIndex, int itemCount) { - return itemCount != 0 && Unreleased.BinarySearch((ushort)itemIndex) < 0; + if (itemCount == 0) return false; + if (type is InventoryType.Ingredients) + return !UnreleasedIngredients.Contains((ushort)itemIndex); + return Unreleased.BinarySearch((ushort)itemIndex) < 0; } public ReadOnlySpan GetItems(InventoryType type) => GetLegal(type); From 4250bc8ae259637bcf847dc0956955641a479f9e Mon Sep 17 00:00:00 2001 From: Kurt Date: Wed, 13 May 2026 00:03:09 -0500 Subject: [PATCH 30/81] MysteryGift: Gen5+=>pk* respect criteria IVs Extract a common IV generator method that has considerations for over-specified and under-specified criteria, rather than deadlocking/returning invalid IV spreads. --- .../Editing/BattleTemplate/StatParseResult.cs | 8 +- .../Encounters/Generator/EncounterCriteria.cs | 23 +++++ PKHeX.Core/MysteryGifts/MysteryGift.cs | 75 +++++++++++++++++ PKHeX.Core/MysteryGifts/PGF.cs | 7 +- PKHeX.Core/MysteryGifts/WA8.cs | 27 +----- PKHeX.Core/MysteryGifts/WA9.cs | 25 +----- PKHeX.Core/MysteryGifts/WB7.cs | 25 +----- PKHeX.Core/MysteryGifts/WB8.cs | 25 +----- PKHeX.Core/MysteryGifts/WC6.cs | 25 +----- PKHeX.Core/MysteryGifts/WC7.cs | 25 +----- PKHeX.Core/MysteryGifts/WC8.cs | 25 +----- PKHeX.Core/MysteryGifts/WC9.cs | 25 +----- .../Simulator/MysteryGiftIVTests.cs | 84 +++++++++++++++++++ 13 files changed, 214 insertions(+), 185 deletions(-) create mode 100644 Tests/PKHeX.Core.Tests/Simulator/MysteryGiftIVTests.cs diff --git a/PKHeX.Core/Editing/BattleTemplate/StatParseResult.cs b/PKHeX.Core/Editing/BattleTemplate/StatParseResult.cs index e86aa2ef6..013e51d99 100644 --- a/PKHeX.Core/Editing/BattleTemplate/StatParseResult.cs +++ b/PKHeX.Core/Editing/BattleTemplate/StatParseResult.cs @@ -115,11 +115,11 @@ public void TreatAmpsAsSpeedNotLast() } /// - /// Adjusts stat indexes from visual to stored, and ignoring HP's index. + /// Adjusts stat indexes from visual to amp index, ignoring HP's index. /// - /// Visual index of the stat to get the adjusted value for. - /// Stored index of the stat. - private static sbyte GetSpeedMiddleIndex(sbyte amp) => amp switch + /// Visual index of the stat to get the adjusted value for. + /// Amp index of the stat, ignoring HP's index. + private static sbyte GetSpeedMiddleIndex(sbyte visualStatIndex) => visualStatIndex switch { // 0 => NoStatAmp -- handle via default case 1 => 0, // Atk diff --git a/PKHeX.Core/Legality/Encounters/Generator/EncounterCriteria.cs b/PKHeX.Core/Legality/Encounters/Generator/EncounterCriteria.cs index 6ca6b04a3..2190c59b6 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/EncounterCriteria.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/EncounterCriteria.cs @@ -574,6 +574,29 @@ public bool IsSatisfiedIVs(uint iv32) return true; } + /// + /// Checks whether the IV at the specified index should be generated randomly. + /// + /// Stat index (internal order). + /// Requested fixed IV value, if specified. + /// if the IV should be random; otherwise, . + public bool IsRandomIV(int index, out sbyte value) => (value = GetIVInternal(index)) == RandomIV; + + /// + /// Gets the IV based on the specified index (internal order). + /// + /// Stat index (internal order). + public sbyte GetIVInternal(int index) => index switch + { + 0 => IV_HP, + 1 => IV_ATK, + 2 => IV_DEF, + 3 => IV_SPE, + 4 => IV_SPA, + 5 => IV_SPD, + _ => throw new ArgumentOutOfRangeException(nameof(index), index, null), + }; + /// /// Gets the IV based on the specified index (visual order). /// diff --git a/PKHeX.Core/MysteryGifts/MysteryGift.cs b/PKHeX.Core/MysteryGifts/MysteryGift.cs index 42bc43e0d..7462a6580 100644 --- a/PKHeX.Core/MysteryGifts/MysteryGift.cs +++ b/PKHeX.Core/MysteryGifts/MysteryGift.cs @@ -169,6 +169,81 @@ protected virtual bool IsMatchEggLocation(PKM pk) public uint DisplayTID { get => this.GetDisplayTID(); set => this.SetDisplayTID(value); } public uint DisplaySID { get => this.GetDisplaySID(); set => this.SetDisplaySID(value); } + /// + /// Criteria-conscious application of IV templates to the given IV span, with the option for a fallback value if the criteria doesn't specify a value for a random IV slot. + /// + /// The span of IVs to apply the template to. + /// The user-provided encounter criteria to consider. + /// A random number generator for selecting random IVs. + /// A function to provide fallback values for random IVs. + protected static void ApplyTemplateIVs(Span finalIVs, in EncounterCriteria criteria, Random rnd, Func getFallback) + { + Span random = stackalloc bool[6]; // template, not user request + int flawless = 0; // template flawless count, not necessarily the same as criteria flawless count + int currentFlawless = 0; // how many flawless IVs we've currently assigned, either from the template or criteria. + + // Scan the template IVs and pre-determine any from criteria. + for (int i = 0; i < finalIVs.Length; i++) + { + var value = finalIVs[i]; + if (value <= 31) + { + if (value == 31) + currentFlawless++; + + // IV is required by the template. + continue; + } + + // Support for random IV indicators: 0xFC-0xFE for flawless count, 0xFF for fully random. + // I think this is only used on the HP IV (index 0), but whatever. + random[i] = true; + if (value is >= 0xFC and <= 0xFE) + flawless = value - 0xFB; + + if (criteria.IsRandomIV(i, out var requested)) + continue; // Unspecified random IV. + + // User wants a specific value for this IV, so apply it and remove from random pool. + finalIVs[i] = requested; + if (requested == 31) + currentFlawless++; + } + + // Sanity check: if the template wants more flawless IVs than the criteria wants, we can't fulfill that request. + // Pick random IVs to fill the gap up to the template's flawless count. + if (currentFlawless < flawless) + { + // Gather candidate IV slots that are random and not already 31. + Span candidates = stackalloc int[6]; + int candidateCount = 0; + for (int i = 0; i < finalIVs.Length; i++) + { + if (random[i] && finalIVs[i] != 31) + candidates[candidateCount++] = i; + } + + // Update random IV slots to 31 until we meet the template's flawless count or run out of candidates. + while (currentFlawless < flawless && candidateCount != 0) + { + int pick = rnd.Next(candidateCount); + int index = candidates[pick]; + finalIVs[index] = 31; + currentFlawless++; + candidates[pick] = candidates[--candidateCount]; + } + } + + // Determine final IV values for any remaining random slots, using criteria if specified or falling back to the provided function if not. + for (int i = 0; i < finalIVs.Length; i++) + { + if (!random[i] || finalIVs[i] == 31) + continue; + + finalIVs[i] = criteria.IsRandomIV(i, out var value) ? getFallback(i) : value; + } + } + /// /// Checks if the has the in its current move list. /// diff --git a/PKHeX.Core/MysteryGifts/PGF.cs b/PKHeX.Core/MysteryGifts/PGF.cs index b2d753ec6..43588f0fd 100644 --- a/PKHeX.Core/MysteryGifts/PGF.cs +++ b/PKHeX.Core/MysteryGifts/PGF.cs @@ -330,7 +330,7 @@ private void SetPINGA(PK5 pk, in EncounterCriteria criteria) var av = GetAbilityIndex(criteria); SetPID(pk, av); pk.RefreshAbility(av); - SetIVs(pk); + SetIVs(pk, criteria); } private int GetAbilityIndex(in EncounterCriteria criteria) => AbilityType switch @@ -387,13 +387,12 @@ private void SetPID(PK5 pk, int av) _ => Shiny.Random, // 1 }; - private void SetIVs(PK5 pk) + private void SetIVs(PK5 pk, in EncounterCriteria criteria) { Span finalIVs = stackalloc int[6]; GetIVs(finalIVs); var rnd = Util.Rand; - for (int i = 0; i < finalIVs.Length; i++) - finalIVs[i] = finalIVs[i] == 0xFF ? rnd.Next(32) : finalIVs[i]; + ApplyTemplateIVs(finalIVs, criteria, rnd, static _ => Util.Rand.Next(32)); pk.SetIVs(finalIVs); } diff --git a/PKHeX.Core/MysteryGifts/WA8.cs b/PKHeX.Core/MysteryGifts/WA8.cs index dfd7f73cd..980e331c0 100644 --- a/PKHeX.Core/MysteryGifts/WA8.cs +++ b/PKHeX.Core/MysteryGifts/WA8.cs @@ -554,7 +554,7 @@ private void SetPINGA(PA8 pk, in EncounterCriteria criteria) var av = GetAbilityIndex(criteria); pk.RefreshAbility(av); SetPID(pk); - SetIVs(pk); + SetIVs(pk, criteria); } private int GetAbilityIndex(in EncounterCriteria criteria) => AbilityType switch @@ -606,36 +606,17 @@ private static uint GetAntishiny(ITrainerID32 tr) return pid; } - private void SetPID(PKM pk) + private void SetPID(PA8 pk) { pk.PID = GetPID(pk, PIDType); } - private void SetIVs(PKM pk) + private void SetIVs(PA8 pk, in EncounterCriteria criteria) { Span finalIVs = stackalloc int[6]; GetIVs(finalIVs); - var ivflag = finalIVs.IndexOfAny(0xFC, 0xFD, 0xFE); var rng = Util.Rand; - if (ivflag == -1) // Random IVs - { - for (int i = 0; i < finalIVs.Length; i++) - { - if (finalIVs[i] > 31) - finalIVs[i] = rng.Next(32); - } - } - else // 1/2/3 perfect IVs - { - int IVCount = finalIVs[ivflag] - 0xFB; - do { finalIVs[rng.Next(6)] = 31; } - while (finalIVs.Count(31) < IVCount); - for (int i = 0; i < finalIVs.Length; i++) - { - if (finalIVs[i] != 31) - finalIVs[i] = rng.Next(32); - } - } + ApplyTemplateIVs(finalIVs, criteria, rng, _ => rng.Next(32)); pk.SetIVs(finalIVs); } diff --git a/PKHeX.Core/MysteryGifts/WA9.cs b/PKHeX.Core/MysteryGifts/WA9.cs index d9d5f2a8c..f4181a75e 100644 --- a/PKHeX.Core/MysteryGifts/WA9.cs +++ b/PKHeX.Core/MysteryGifts/WA9.cs @@ -533,7 +533,7 @@ private void SetPINGA(PA9 pk, EncounterCriteria criteria, PersonalInfo9ZA pi) var av = GetAbilityIndex(criteria, AbilityType); pk.RefreshAbility(av); SetPID(pk); - SetIVs(pk); + SetIVs(pk, criteria); } else { @@ -598,31 +598,12 @@ private void SetPID(PA9 pk) pk.PID = GetPID(pk, PIDType); } - private void SetIVs(PA9 pk) + private void SetIVs(PA9 pk, in EncounterCriteria criteria) { Span finalIVs = stackalloc int[6]; GetIVs(finalIVs); - var ivflag = finalIVs.IndexOfAny(0xFC, 0xFD, 0xFE); var rng = Util.Rand; - if (ivflag == -1) // Random IVs - { - for (int i = 0; i < finalIVs.Length; i++) - { - if (finalIVs[i] > 31) - finalIVs[i] = rng.Next(32); - } - } - else // 1/2/3 perfect IVs - { - int IVCount = finalIVs[ivflag] - 0xFB; - do { finalIVs[rng.Next(6)] = 31; } - while (finalIVs.Count(31) < IVCount); - for (int i = 0; i < finalIVs.Length; i++) - { - if (finalIVs[i] != 31) - finalIVs[i] = IsHOMEGift ? HomeBaseIV : rng.Next(32); // HOME ZA-starters gifts have 20 in non-perfect IVs - } - } + ApplyTemplateIVs(finalIVs, criteria, rng, _ => IsHOMEGift ? HomeBaseIV : rng.Next(32)); // HOME ZA-starters gifts have 20 in non-perfect IVs pk.SetIVs(finalIVs); } diff --git a/PKHeX.Core/MysteryGifts/WB7.cs b/PKHeX.Core/MysteryGifts/WB7.cs index 5e86e7f44..b48b3610e 100644 --- a/PKHeX.Core/MysteryGifts/WB7.cs +++ b/PKHeX.Core/MysteryGifts/WB7.cs @@ -519,7 +519,7 @@ private void SetPINGA(PB7 pk, in EncounterCriteria criteria) var av = GetAbilityIndex(criteria); pk.RefreshAbility(av); SetPID(pk); - SetIVs(pk); + SetIVs(pk, criteria); } private int GetAbilityIndex(in EncounterCriteria criteria) => AbilityType switch @@ -559,31 +559,12 @@ private void SetPID(PB7 pk) } } - private void SetIVs(PB7 pk) + private void SetIVs(PB7 pk, in EncounterCriteria criteria) { Span finalIVs = stackalloc int[6]; GetIVs(finalIVs); - var ivflag = finalIVs.IndexOfAny(0xFC, 0xFD, 0xFE); var rng = Util.Rand; - if (ivflag == -1) // Random IVs - { - for (int i = 0; i < finalIVs.Length; i++) - { - if (finalIVs[i] > 31) - finalIVs[i] = rng.Next(32); - } - } - else // 1/2/3 perfect IVs - { - int IVCount = finalIVs[ivflag] - 0xFB; - do { finalIVs[rng.Next(6)] = 31; } - while (finalIVs.Count(31) < IVCount); - for (int i = 0; i < finalIVs.Length; i++) - { - if (finalIVs[i] != 31) - finalIVs[i] = rng.Next(32); - } - } + ApplyTemplateIVs(finalIVs, criteria, rng, _ => rng.Next(32)); pk.SetIVs(finalIVs); } diff --git a/PKHeX.Core/MysteryGifts/WB8.cs b/PKHeX.Core/MysteryGifts/WB8.cs index d12c3ba0c..141b914f8 100644 --- a/PKHeX.Core/MysteryGifts/WB8.cs +++ b/PKHeX.Core/MysteryGifts/WB8.cs @@ -554,7 +554,7 @@ private void SetPINGA(PB8 pk, in EncounterCriteria criteria) var av = GetAbilityIndex(criteria); pk.RefreshAbility(av); SetPID(pk); - SetIVs(pk); + SetIVs(pk, criteria); } private int GetAbilityIndex(in EncounterCriteria criteria) => AbilityType switch @@ -611,31 +611,12 @@ private void SetPID(PB8 pk) pk.PID = GetPID(pk, PIDType); } - private void SetIVs(PB8 pk) + private void SetIVs(PB8 pk, in EncounterCriteria criteria) { Span finalIVs = stackalloc int[6]; GetIVs(finalIVs); - var ivflag = finalIVs.IndexOfAny(0xFC, 0xFD, 0xFE); var rng = Util.Rand; - if (ivflag == -1) // Random IVs - { - for (int i = 0; i < finalIVs.Length; i++) - { - if (finalIVs[i] > 31) - finalIVs[i] = rng.Next(32); - } - } - else // 1/2/3 perfect IVs - { - int IVCount = finalIVs[ivflag] - 0xFB; - do { finalIVs[rng.Next(6)] = 31; } - while (finalIVs.Count(31) < IVCount); - for (int i = 0; i < finalIVs.Length; i++) - { - if (finalIVs[i] != 31) - finalIVs[i] = rng.Next(32); - } - } + ApplyTemplateIVs(finalIVs, criteria, rng, _ => rng.Next(32)); pk.SetIVs(finalIVs); } diff --git a/PKHeX.Core/MysteryGifts/WC6.cs b/PKHeX.Core/MysteryGifts/WC6.cs index 40335eba7..b87130ce6 100644 --- a/PKHeX.Core/MysteryGifts/WC6.cs +++ b/PKHeX.Core/MysteryGifts/WC6.cs @@ -442,7 +442,7 @@ private void SetPINGA(PK6 pk, in EncounterCriteria criteria) var av = GetAbilityIndex(criteria); pk.RefreshAbility(av); SetPID(pk); - SetIVs(pk); + SetIVs(pk, criteria); } private int GetAbilityIndex(in EncounterCriteria criteria) => AbilityType switch @@ -494,31 +494,12 @@ public override void GetIVs(Span value) value[5] = IV_SPD; } - private void SetIVs(PK6 pk) + private void SetIVs(PK6 pk, in EncounterCriteria criteria) { Span finalIVs = stackalloc int[6]; GetIVs(finalIVs); - var ivflag = finalIVs.IndexOfAny(0xFC, 0xFD, 0xFE); var rng = Util.Rand; - if (ivflag == -1) // Random IVs - { - for (int i = 0; i < finalIVs.Length; i++) - { - if (finalIVs[i] > 31) - finalIVs[i] = rng.Next(32); - } - } - else // 1/2/3 perfect IVs - { - int IVCount = finalIVs[ivflag] - 0xFB; - do { finalIVs[rng.Next(6)] = 31; } - while (finalIVs.Count(31) < IVCount); - for (int i = 0; i < finalIVs.Length; i++) - { - if (finalIVs[i] != 31) - finalIVs[i] = rng.Next(32); - } - } + ApplyTemplateIVs(finalIVs, criteria, rng, _ => rng.Next(32)); pk.SetIVs(finalIVs); } diff --git a/PKHeX.Core/MysteryGifts/WC7.cs b/PKHeX.Core/MysteryGifts/WC7.cs index d03092055..b71219200 100644 --- a/PKHeX.Core/MysteryGifts/WC7.cs +++ b/PKHeX.Core/MysteryGifts/WC7.cs @@ -491,7 +491,7 @@ private void SetPINGA(PK7 pk, in EncounterCriteria criteria) var av = GetAbilityIndex(criteria); pk.RefreshAbility(av); SetPID(pk); - SetIVs(pk); + SetIVs(pk, criteria); } private int GetAbilityIndex(in EncounterCriteria criteria) => AbilityType switch @@ -531,31 +531,12 @@ private void SetPID(PK7 pk) } } - private void SetIVs(PK7 pk) + private void SetIVs(PK7 pk, in EncounterCriteria criteria) { Span finalIVs = stackalloc int[6]; GetIVs(finalIVs); - var ivflag = finalIVs.IndexOfAny(0xFC, 0xFD, 0xFE); var rng = Util.Rand; - if (ivflag == -1) // Random IVs - { - for (int i = 0; i < finalIVs.Length; i++) - { - if (finalIVs[i] > 31) - finalIVs[i] = rng.Next(32); - } - } - else // 1/2/3 perfect IVs - { - int IVCount = finalIVs[ivflag] - 0xFB; - do { finalIVs[rng.Next(6)] = 31; } - while (finalIVs.Count(31) < IVCount); - for (int i = 0; i < finalIVs.Length; i++) - { - if (finalIVs[i] != 31) - finalIVs[i] = rng.Next(32); - } - } + ApplyTemplateIVs(finalIVs, criteria, rng, _ => rng.Next(32)); pk.SetIVs(finalIVs); } diff --git a/PKHeX.Core/MysteryGifts/WC8.cs b/PKHeX.Core/MysteryGifts/WC8.cs index 7a21da637..dc8381843 100644 --- a/PKHeX.Core/MysteryGifts/WC8.cs +++ b/PKHeX.Core/MysteryGifts/WC8.cs @@ -573,7 +573,7 @@ private void SetPINGA(PK8 pk, in EncounterCriteria criteria) var av = GetAbilityIndex(criteria); pk.RefreshAbility(av); SetPID(pk); - SetIVs(pk); + SetIVs(pk, criteria); } private int GetAbilityIndex(in EncounterCriteria criteria) => AbilityType switch @@ -630,31 +630,12 @@ private void SetPID(PK8 pk) pk.PID = GetPID(pk, PIDType); } - private void SetIVs(PKM pk) + private void SetIVs(PK8 pk, in EncounterCriteria criteria) { Span finalIVs = stackalloc int[6]; GetIVs(finalIVs); - var ivflag = finalIVs.IndexOfAny(0xFC, 0xFD, 0xFE); var rng = Util.Rand; - if (ivflag == -1) // Random IVs - { - for (int i = 0; i < finalIVs.Length; i++) - { - if (finalIVs[i] > 31) - finalIVs[i] = rng.Next(32); - } - } - else // 1/2/3 perfect IVs - { - int IVCount = finalIVs[ivflag] - 0xFB; - do { finalIVs[rng.Next(6)] = 31; } - while (finalIVs.Count(31) < IVCount); - for (int i = 0; i < finalIVs.Length; i++) - { - if (finalIVs[i] != 31) - finalIVs[i] = rng.Next(32); - } - } + ApplyTemplateIVs(finalIVs, criteria, rng, _ => rng.Next(32)); pk.SetIVs(finalIVs); } diff --git a/PKHeX.Core/MysteryGifts/WC9.cs b/PKHeX.Core/MysteryGifts/WC9.cs index 98d111bb0..3143804ea 100644 --- a/PKHeX.Core/MysteryGifts/WC9.cs +++ b/PKHeX.Core/MysteryGifts/WC9.cs @@ -575,7 +575,7 @@ private void SetPINGA(PK9 pk, in EncounterCriteria criteria) var av = GetAbilityIndex(criteria); pk.RefreshAbility(av); SetPID(pk); - SetIVs(pk); + SetIVs(pk, criteria); } private int GetAbilityIndex(in EncounterCriteria criteria) => GetAbilityIndex(criteria, AbilityType); @@ -630,31 +630,12 @@ private void SetPID(PK9 pk) pk.PID = GetPID(pk, PIDType); } - private void SetIVs(PK9 pk) + private void SetIVs(PK9 pk, in EncounterCriteria criteria) { Span finalIVs = stackalloc int[6]; GetIVs(finalIVs); - var ivflag = finalIVs.IndexOfAny(0xFC, 0xFD, 0xFE); var rng = Util.Rand; - if (ivflag == -1) // Random IVs - { - for (int i = 0; i < finalIVs.Length; i++) - { - if (finalIVs[i] > 31) - finalIVs[i] = rng.Next(32); - } - } - else // 1/2/3 perfect IVs - { - int IVCount = finalIVs[ivflag] - 0xFB; - do { finalIVs[rng.Next(6)] = 31; } - while (finalIVs.Count(31) < IVCount); - for (int i = 0; i < finalIVs.Length; i++) - { - if (finalIVs[i] != 31) - finalIVs[i] = rng.Next(32); - } - } + ApplyTemplateIVs(finalIVs, criteria, rng, _ => rng.Next(32)); pk.SetIVs(finalIVs); } diff --git a/Tests/PKHeX.Core.Tests/Simulator/MysteryGiftIVTests.cs b/Tests/PKHeX.Core.Tests/Simulator/MysteryGiftIVTests.cs new file mode 100644 index 000000000..47e1ef3d2 --- /dev/null +++ b/Tests/PKHeX.Core.Tests/Simulator/MysteryGiftIVTests.cs @@ -0,0 +1,84 @@ +using System; +using FluentAssertions; +using Xunit; +using TR = PKHeX.Core.SimpleTrainerInfo; + +namespace PKHeX.Core.Tests.Simulator; + +public class MysteryGiftIVTests +{ + [Fact] + public void FlawlessMysteryGiftTemplatePrefersTemplateOverConflictingCriteria() + { + var gift = new WA9 + { + IsEntity = true, + Species = (ushort)Species.Bulbasaur, + Level = 5, + MetLevel = 5, + CardID = 9001, + IV_HP = 0xFE, + IV_ATK = 0xFF, + IV_DEF = 0xFF, + IV_SPE = 0xFF, + IV_SPA = 0xFF, + IV_SPD = 0xFF, + }; + + var criteria = EncounterCriteria.Unrestricted with + { + IV_HP = 1, + IV_ATK = 2, + IV_DEF = 3, + IV_SPE = 4, + IV_SPA = 5, + IV_SPD = 6, + }; + + var trainer = new TR(GameVersion.ZA); + var pk = gift.ConvertToPKM(trainer, criteria); + + pk.FlawlessIVCount.Should().BeGreaterThanOrEqualTo(3); + Span ivs = stackalloc int[6]; + pk.GetIVs(ivs); + ivs.ToArray().Should().Contain(31); + } + + [Fact] + public void RandomMysteryGiftTemplateUsesRequestedCriteriaIVs() + { + var gift = new WC9 + { + IsEntity = true, + Species = (ushort)Species.Bulbasaur, + Level = 5, + MetLevel = 5, + IV_HP = 0xFF, + IV_ATK = 0xFF, + IV_DEF = 0xFF, + IV_SPE = 0xFF, + IV_SPA = 0xFF, + IV_SPD = 0xFF, + }; + + var criteria = EncounterCriteria.Unrestricted with + { + IV_HP = 1, + IV_ATK = 2, + IV_DEF = 3, + IV_SPE = 4, + IV_SPA = 5, + IV_SPD = 6, + }; + + var trainer = new TR(GameVersion.SL); + var pk = gift.ConvertToPKM(trainer, criteria); + + pk.IV_HP.Should().Be(1); + pk.IV_ATK.Should().Be(2); + pk.IV_DEF.Should().Be(3); + pk.IV_SPE.Should().Be(4); + pk.IV_SPA.Should().Be(5); + pk.IV_SPD.Should().Be(6); + } +} From cf5cd280a85b77c34f4c2623d1ebe21f51b5586e Mon Sep 17 00:00:00 2001 From: Kurt Date: Wed, 13 May 2026 21:10:30 -0500 Subject: [PATCH 31/81] Autosize event flag checkbox Closes #4805 --- PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags.cs | 2 +- PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags2.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags.cs index 75965d502..de47e2fe2 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags.cs @@ -107,7 +107,7 @@ private void AddFlagList(EventLabelCollection list, bool[] values) var cFlag = new DataGridViewCheckBoxColumn { DisplayIndex = 0, - Width = 20, + AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells, SortMode = DataGridViewColumnSortMode.NotSortable, }; diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags2.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags2.cs index da6506de4..4500c02fc 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags2.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags2.cs @@ -112,7 +112,7 @@ private void AddFlagList(EventLabelCollection list, bool[] values) var cFlag = new DataGridViewCheckBoxColumn { DisplayIndex = 0, - Width = 20, + AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells, SortMode = DataGridViewColumnSortMode.NotSortable, }; From c924cfb4690d9533ca34a0be9d0db8c373d7e600 Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 15 May 2026 09:05:49 -0500 Subject: [PATCH 32/81] Gen1/2=>7 add notes/visibility EXP-nature --- .../Legality/Verifiers/TransferVerifier.cs | 11 +---------- PKHeX.Core/PKM/PK1.cs | 6 +++--- PKHeX.Core/PKM/PK2.cs | 6 +++--- PKHeX.Core/PKM/Util/Experience.cs | 19 +++++++++++++++++++ 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/PKHeX.Core/Legality/Verifiers/TransferVerifier.cs b/PKHeX.Core/Legality/Verifiers/TransferVerifier.cs index f61dead5f..56800f1b0 100644 --- a/PKHeX.Core/Legality/Verifiers/TransferVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/TransferVerifier.cs @@ -47,21 +47,12 @@ private void VerifyVCNatureEXP(LegalityAnalysis data) var pi = data.PersonalInfo; var growth = pi.EXPGrowth; var nature = pk.Nature; - bool valid = VerifyVCNature(growth, nature); + bool valid = Experience.IsValidNatureMetLevel2(growth, nature); if (!valid) data.AddLine(GetInvalid(TransferNature)); } } - private static bool VerifyVCNature(byte growth, Nature nature) => growth switch - { - // exp % 25 with a limited amount of EXP does not allow for every nature - 0 => (0x01FFFF03u & (1u << (byte)nature)) != 0, // MediumFast -- Can't be Brave, Adamant, Naughty, Bold, Docile, or Relaxed - 4 => (0x001FFFC0u & (1u << (byte)nature)) != 0, // Fast -- Can't be Gentle, Sassy, Careful, Quirky, Hardy, Lonely, Brave, Adamant, Naughty, or Bold - 5 => (0x01FFFCFFu & (1u << (byte)nature)) != 0, // Slow -- Can't be Impish or Lax - _ => true, - }; - private static void VerifyVCShinyXorIfShiny(LegalityAnalysis data) { // Star, not square. Requires transferring a shiny and having the initially random PID to already be a Star shiny. diff --git a/PKHeX.Core/PKM/PK1.cs b/PKHeX.Core/PKM/PK1.cs index 6049dcbca..4e8ef22f8 100644 --- a/PKHeX.Core/PKM/PK1.cs +++ b/PKHeX.Core/PKM/PK1.cs @@ -191,16 +191,16 @@ public PK7 ConvertToPK7() version = GameVersion.RD; var pi = PersonalTable.SM[Species]; + var currentLevel = Experience.GetLevel(EXP, pi.EXPGrowth); int ability = TransporterLogic.IsHiddenDisallowedVC1(Species) ? 0 : 2; // Hidden var pk7 = new PK7 { EncryptionConstant = rnd.Rand32(), Species = Species, TID16 = TID16, - CurrentLevel = CurrentLevel, - EXP = EXP, - MetLevel = CurrentLevel, + MetLevel = currentLevel, Nature = Experience.GetNatureVC(EXP), + EXP = Experience.GetEXP(currentLevel, pi.EXPGrowth), // EXP is reset to the minimum amount for the transfer level. PID = rnd.Rand32(), Ball = 4, MetDate = EncounterDate.GetDate3DS(), diff --git a/PKHeX.Core/PKM/PK2.cs b/PKHeX.Core/PKM/PK2.cs index 61fab94fa..19ff7cd89 100644 --- a/PKHeX.Core/PKM/PK2.cs +++ b/PKHeX.Core/PKM/PK2.cs @@ -153,16 +153,16 @@ public PK7 ConvertToPK7() if ((lang == 1) != Japanese) lang = Japanese ? 1 : 2; var pi = PersonalTable.SM[Species]; + var currentLevel = Experience.GetLevel(EXP, pi.EXPGrowth); int ability = TransporterLogic.IsHiddenDisallowedVC2(Species) ? 0 : 2; // Hidden var pk7 = new PK7 { EncryptionConstant = rnd.Rand32(), Species = Species, TID16 = TID16, - CurrentLevel = CurrentLevel, - EXP = EXP, - MetLevel = CurrentLevel, + MetLevel = currentLevel, Nature = Experience.GetNatureVC(EXP), + EXP = Experience.GetEXP(currentLevel, pi.EXPGrowth), // EXP is reset to the minimum amount for the transfer level. PID = rnd.Rand32(), Ball = 4, MetDate = EncounterDate.GetDate3DS(), diff --git a/PKHeX.Core/PKM/Util/Experience.cs b/PKHeX.Core/PKM/Util/Experience.cs index 2584d2a8d..2e695c078 100644 --- a/PKHeX.Core/PKM/Util/Experience.cs +++ b/PKHeX.Core/PKM/Util/Experience.cs @@ -123,6 +123,25 @@ public static bool IsAtLevelThreshold(uint exp, byte growth, out byte currentLev /// Nature ID () public static Nature GetNatureVC(uint experience) => (Nature)(experience % 25); + /// + /// Checks if the given nature is valid for the given growth rate and experience when the met level is 2. + /// + /// + /// Used for Generation 1/2 virtual console transfers to Gen7, where level [2,3) doesn't have enough EXP states to yield all 25 natures. + /// There are no valid level 1 encounters. Refer to . + /// + /// Growth rate + /// Nature to check + /// if the nature is obtainable. + public static bool IsValidNatureMetLevel2(byte growth, Nature nature) => growth switch + { + // bitflags of valid natures, [exp_min,exp_max]%25 for level 2 + 0 => (0x01FFFF03u & (1u << (byte)nature)) != 0, // MediumFast -- Can't be Brave, Adamant, Naughty, Bold, Docile, or Relaxed + 4 => (0x001FFFC0u & (1u << (byte)nature)) != 0, // Fast -- Can't be Gentle, Sassy, Careful, Quirky, Hardy, Lonely, Brave, Adamant, Naughty, or Bold + 5 => (0x01FFFCFFu & (1u << (byte)nature)) != 0, // Slow -- Can't be Impish or Lax + _ => true, + }; + /// /// Gets the amount of EXP to be earned until the next level-up occurs. /// From f4622bacc6efb6d9ab502367e73e86e25f512bb4 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 16 May 2026 13:19:19 -0500 Subject: [PATCH 33/81] Gen1/2: check egg EVs, check sus EVs Also remove EXP match for Odd Egg due to Gen2 daycare EXP reset Add notes re: Gen1/2 EV verification being not worth the *effort*. --- .../Templates/Gen2/EncounterStatic2.cs | 11 ++-- PKHeX.Core/Legality/LegalityAnalysis.cs | 1 + .../Legality/Verifiers/EffortValueVerifier.cs | 51 +++++++++++++++++-- PKHeX.Core/PKM/Util/EffortValues.cs | 5 ++ 4 files changed, 58 insertions(+), 10 deletions(-) diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterStatic2.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterStatic2.cs index cb7ab7315..7085645d7 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterStatic2.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterStatic2.cs @@ -138,12 +138,11 @@ public bool IsMatchExact(PKM pk, EvoCriteria evo) if (!IsOddEggTrainerNameValid(pk)) return false; } - else - { - // Once hatched, EXP can vary. Must be at least the starting value. - if (pk.EXP < OddEggEXP) - return false; - } + //else + //{ + // // Once hatched, EXP can vary. + // // Daycare can reset EXP gained back to 0, below the initial EXP had by the egg. + //} } if (!IsMatchEggLocation(pk)) diff --git a/PKHeX.Core/Legality/LegalityAnalysis.cs b/PKHeX.Core/Legality/LegalityAnalysis.cs index 2fcea81a5..88ff74e78 100644 --- a/PKHeX.Core/Legality/LegalityAnalysis.cs +++ b/PKHeX.Core/Legality/LegalityAnalysis.cs @@ -201,6 +201,7 @@ private void ParsePK1() Trainer.VerifyOTGB(this); MiscValues.VerifyMiscG12(this); MovePP.Verify(this); + EVs.Verify(this); if (Entity.Format == 2) Item.Verify(this); } diff --git a/PKHeX.Core/Legality/Verifiers/EffortValueVerifier.cs b/PKHeX.Core/Legality/Verifiers/EffortValueVerifier.cs index 6409c92ce..673ddd590 100644 --- a/PKHeX.Core/Legality/Verifiers/EffortValueVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/EffortValueVerifier.cs @@ -21,20 +21,21 @@ public override void Verify(LegalityAnalysis data) return; } - // In Generation 1 & 2, when a Pokémon is taken out of the Day Care, its experience will lower to the minimum value for its current level. - // When transferred to Gen7+, EVs are reset to 0, so checks will be relevant then. byte format = pk.Format; - if (format < 3) // Can abuse daycare for EV training without EXP gain + if (format < 3) + { + VerifyEVsGB(data, pk); return; + } int sum = pk.EVTotal; if (sum > EffortValues.Max510) // format >= 3 data.AddLine(GetInvalid(EffortAbove510)); - var enc = data.EncounterMatch; Span evs = stackalloc int[6]; pk.GetEVs(evs); + var enc = data.EncounterMatch; if (format >= 6 && IsAnyAboveHardLimit6(evs)) data.AddLine(GetInvalid(EffortAbove252)); else if (format < 5) // 3/4 @@ -49,6 +50,48 @@ public override void Verify(LegalityAnalysis data) data.AddLine(Get(Severity.Fishy, EffortAllEqual)); } + private void VerifyEVsGB(LegalityAnalysis data, PKM pk) + { + ReadOnlySpan evs = [pk.EV_HP, pk.EV_ATK, pk.EV_DEF, pk.EV_SPA, pk.EV_SPE]; + var hasGainedEVsFromEnemy = IsAnyEVNotVitaminOr0(evs); + if (!hasGainedEVsFromEnemy) + return; + + // Generation 1/2 have special considerations to verify non-zero EVs, but it really isn't worth verifying. + // If an EV stat is not maxed out, then there must be a valid encounter chain (considering teammates diluting the EV gain) that yields the exact EVs (and EXP minimum for Genera1). + // In Generation 2, when a Pokémon is taken out of the Daycare, its experience will lower to the minimum value for its current level. + // When transferred to Gen7+, EVs are reset to 0, so checks will be relevant then. + // For Generation 1 entities that have never visited Generation 2 for the EXP reset: + // * We COULD check the EVs but a heuristic for this would be extra annoying for minimal gain. + // * Encounter matching deferrals would be required so that there is enough gap in MinLevel=>CurrentLevel to obtain the exact EVs with EXP gain. + // * Vitamins in Gen1/2 add 2560 each, to a max of 25600 (10 vitamins used). Would need to subtract off vitamins to check for EVs needed, and species/EXP gain to get them. + // * Gen1 EV gain is split same as EXP for participants against the defeated Pokémon; EV gains are the Base Stats of the defeated Pokémon. + // * Unexplored: A {species, +EV[6], +EXP} permutation budget. Using Wild Encounters AND trainers, no-Switch AI must disallow the final mon from being used repeatedly. + // * Are all EV gains for a specific stat consistent enough to prune to minimum EXP gains for +EV? + // * Gen1 daycare can make up the remaining EXP difference. + // Same for Generation 2, just with different available enemies and the ability to disregard EXP gain via daycare abuse. + + // Simple sanity check instead of nothing: + // Since EV gains absorb base stats of the defeated, you can't have EVs in a stat if any other stat is 0. + // Sometimes people may miss entering in a stat accidentally, so this is a simple check to catch that. + + if (evs.Contains(0)) + data.AddLine(GetInvalid(EffortShouldBeZero)); + } + + private static bool IsAnyEVNotVitaminOr0(ReadOnlySpan evs) + { + foreach (var ev in evs) + { + if (!IsNot0VitaminGB(ev)) + continue; + return true; + } + return false; + + static bool IsNot0VitaminGB(int ev) => ev > EffortValues.MaxVitamins12 || (ev % EffortValues.VitaminBoost12) != 0; + } + private void VerifyGainedEVs34(LegalityAnalysis data, IEncounterTemplate enc, ReadOnlySpan evs, PKM pk) { var isVitaminResult = IsWithinVitaminRange34(evs, EffortValues.MaxVitamins34); diff --git a/PKHeX.Core/PKM/Util/EffortValues.cs b/PKHeX.Core/PKM/Util/EffortValues.cs index 1b3057de9..13127c772 100644 --- a/PKHeX.Core/PKM/Util/EffortValues.cs +++ b/PKHeX.Core/PKM/Util/EffortValues.cs @@ -22,6 +22,11 @@ public static class EffortValues /// Vitamin Max for consideration in Gen3 & Gen4. public const ushort MaxVitamins34 = 100; + /// Single vitamin in Gen1/2 adds 2560 EVs to a stat. + public const ushort VitaminBoost12 = 2560; + /// Maximum EVs from vitamins in Gen1/2. + public const ushort MaxVitamins12 = 2560 * 10; + /// Maximum value for a single stat in Pokémon Champions. public const byte ChampionsMaxStat = 32; // 252/8 /// Maximum value for the sum of all stats in Pokémon Champions. From ac9285b977e65015863eb797cb26f85d212e8791 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 16 May 2026 13:24:04 -0500 Subject: [PATCH 34/81] Misc tweaks Add more reflection usage attributes Remove unnecessary casts --- .../Editing/Bulk/Base/BatchEditingUtil.cs | 2 +- PKHeX.Core/Util/ReflectUtil.cs | 25 +++++++------------ .../Save Editors/Gen8/SAV_FlagWork8b.cs | 6 ++--- .../Subforms/Save Editors/SAV_EventFlags.cs | 4 +-- .../Subforms/Save Editors/SAV_EventFlags2.cs | 4 +-- 5 files changed, 17 insertions(+), 24 deletions(-) diff --git a/PKHeX.Core/Editing/Bulk/Base/BatchEditingUtil.cs b/PKHeX.Core/Editing/Bulk/Base/BatchEditingUtil.cs index fd3eddc9b..f180cd700 100644 --- a/PKHeX.Core/Editing/Bulk/Base/BatchEditingUtil.cs +++ b/PKHeX.Core/Editing/Bulk/Base/BatchEditingUtil.cs @@ -20,7 +20,7 @@ public static class BatchEditingUtil /// Object to check. /// True if matches all filters. [RequiresUnreferencedCode("Uses reflection to evaluate property-based batch filters.")] - public static bool IsFilterMatch(IEnumerable filters, T obj) where T : notnull + public static bool IsFilterMatch(IEnumerable filters, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T obj) where T : notnull { foreach (var cmd in filters) { diff --git a/PKHeX.Core/Util/ReflectUtil.cs b/PKHeX.Core/Util/ReflectUtil.cs index b68f2361e..617944f0f 100644 --- a/PKHeX.Core/Util/ReflectUtil.cs +++ b/PKHeX.Core/Util/ReflectUtil.cs @@ -4,6 +4,7 @@ using System.Globalization; using System.Linq; using System.Reflection; +using static System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes; namespace PKHeX.Core; @@ -19,7 +20,6 @@ public static class ReflectUtil /// Object to fetch property from /// Value to compare to /// Comparison result - [RequiresUnreferencedCode("Uses reflection to inspect property metadata and values.")] public static int CompareTo(this PropertyInfo pi, T obj, object value) { var v = pi.GetValue(obj, null); @@ -31,14 +31,13 @@ public static int CompareTo(this PropertyInfo pi, T obj, object value) return 0; } - [RequiresUnreferencedCode("Uses reflection to set property values by metadata.")] public static void SetValue(PropertyInfo pi, T obj, object value) { var c = ConvertValue(value, pi.PropertyType); pi.SetValue(obj, c, null); } - [RequiresUnreferencedCode("Uses reflection to access properties by name.")] + [RequiresUnreferencedCode("Uses reflection to access properties by name on runtime types.")] public static object? GetValue(T obj, string name) where T : notnull { if (obj.GetType().GetTypeInfo().TryGetPropertyInfo(name, out var pi)) @@ -46,7 +45,7 @@ public static void SetValue(PropertyInfo pi, T obj, object value) return null; } - [RequiresUnreferencedCode("Uses reflection to access properties by name.")] + [RequiresUnreferencedCode("Uses reflection to access properties by name on runtime types.")] public static bool SetValue(T obj, string name, object value) where T : notnull { if (!obj.GetType().GetTypeInfo().TryGetPropertyInfo(name, out var pi)) @@ -57,8 +56,7 @@ public static void SetValue(PropertyInfo pi, T obj, object value) return true; } - [RequiresUnreferencedCode("Uses reflection to enumerate properties on runtime types.")] - public static IEnumerable GetPropertiesStartWithPrefix(Type type, string prefix) + public static IEnumerable GetPropertiesStartWithPrefix([DynamicallyAccessedMembers(PublicProperties | NonPublicProperties)] Type type, string prefix) { return type.GetTypeInfo().GetAllTypeInfo().SelectMany(GetAllProperties) .Where(p => p.Name.StartsWith(prefix, StringComparison.Ordinal)) @@ -67,23 +65,20 @@ public static IEnumerable GetPropertiesStartWithPrefix(Type type, string ; } - [RequiresUnreferencedCode("Uses reflection to enumerate properties on runtime types.")] - public static IEnumerable GetPropertiesCanWritePublic(Type type) + public static IEnumerable GetPropertiesCanWritePublic([DynamicallyAccessedMembers(PublicProperties | NonPublicProperties)] Type type) { return GetAllPropertyInfoCanWritePublic(type).Select(p => p.Name) .Distinct() ; } - [RequiresUnreferencedCode("Uses reflection to enumerate properties on runtime types.")] - public static IEnumerable GetAllPropertyInfoCanWritePublic(Type type) + public static IEnumerable GetAllPropertyInfoCanWritePublic([DynamicallyAccessedMembers(PublicProperties | NonPublicProperties)] Type type) { return type.GetTypeInfo().GetAllTypeInfo().SelectMany(GetAllProperties) .Where(CanWritePublic); } - [RequiresUnreferencedCode("Uses reflection to enumerate properties on runtime types.")] - public static IEnumerable GetAllPropertyInfoPublic(Type type) + public static IEnumerable GetAllPropertyInfoPublic([DynamicallyAccessedMembers(PublicProperties | NonPublicProperties)] Type type) { return type.GetTypeInfo().GetAllTypeInfo().SelectMany(GetAllProperties) .Where(CanReadOrWritePublic); @@ -96,16 +91,14 @@ public static IEnumerable GetAllPropertyInfoPublic(Type type) private bool CanReadOrWritePublic() => p.CanReadPublic() || p.CanWritePublic(); } - [RequiresUnreferencedCode("Uses reflection to enumerate properties on runtime types.")] - public static IEnumerable GetPropertiesPublic(Type type) + public static IEnumerable GetPropertiesPublic([DynamicallyAccessedMembers(PublicProperties | NonPublicProperties)] Type type) { return GetAllPropertyInfoPublic(type).Select(p => p.Name) .Distinct() ; } - [RequiresUnreferencedCode("Uses reflection to enumerate properties on runtime types.")] - public static IEnumerable GetPropertiesCanWritePublicDeclared(Type type) + public static IEnumerable GetPropertiesCanWritePublicDeclared([DynamicallyAccessedMembers(PublicProperties | NonPublicProperties)] Type type) { return type.GetTypeInfo().GetAllProperties() .Where(CanWritePublic) diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_FlagWork8b.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_FlagWork8b.cs index f9c079d2f..91f02c782 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_FlagWork8b.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_FlagWork8b.cs @@ -78,7 +78,7 @@ private void LoadFlags(EventLabelCollectionSystem editor) FlagDict.Clear(); TC_Flags.TabPages.Clear(); var labels = editor.Flag; - foreach (var group in labels.GroupBy(z => z.Type).OrderBy(z => (int)z.Key)) + foreach (var group in labels.GroupBy(z => z.Type).OrderBy(z => z.Key)) { var tab = new TabPage { @@ -123,7 +123,7 @@ private void LoadSystem(EventLabelCollectionSystem editor) SystemDict.Clear(); TC_System.TabPages.Clear(); var labels = editor.System; - foreach (var group in labels.GroupBy(z => z.Type).OrderBy(z => (int)z.Key)) + foreach (var group in labels.GroupBy(z => z.Type).OrderBy(z => z.Key)) { var tab = new TabPage { @@ -168,7 +168,7 @@ private void LoadWork(EventLabelCollectionSystem editor) WorkDict.Clear(); TC_Work.TabPages.Clear(); var labels = editor.Work; - foreach (var group in labels.GroupBy(z => z.Type).OrderBy(z => (int)z.Key)) + foreach (var group in labels.GroupBy(z => z.Type).OrderBy(z => z.Key)) { var tab = new TabPage { diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags.cs index de47e2fe2..d68080f00 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags.cs @@ -90,7 +90,7 @@ private void AddFlagList(EventLabelCollection list, bool[] values) return; } - foreach (var group in labels.GroupBy(z => z.Type).OrderBy(z => (int)z.Key)) + foreach (var group in labels.GroupBy(z => z.Type).OrderBy(z => z.Key)) { var tab = new TabPage { @@ -228,7 +228,7 @@ private void AddConstList(EventLabelCollection list, ushort[] values) return; } - foreach (var group in labels.GroupBy(z => z.Type).OrderBy(z => (int)z.Key)) + foreach (var group in labels.GroupBy(z => z.Type).OrderBy(z => z.Key)) { var tab = new TabPage { diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags2.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags2.cs index 4500c02fc..730e40176 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags2.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags2.cs @@ -95,7 +95,7 @@ private void AddFlagList(EventLabelCollection list, bool[] values) return; } - foreach (var group in labels.GroupBy(z => z.Type).OrderBy(z => (int)z.Key)) + foreach (var group in labels.GroupBy(z => z.Type).OrderBy(z => z.Key)) { var tab = new TabPage { @@ -231,7 +231,7 @@ private void AddConstList(EventLabelCollection list, ReadOnlySpan values) return; } - foreach (var group in labels.GroupBy(z => z.Type).OrderBy(z => (int)z.Key)) + foreach (var group in labels.GroupBy(z => z.Type).OrderBy(z => z.Key)) { var tab = new TabPage { From a703b377f19b8fd0df2977f21ca7c4c52be0ebb0 Mon Sep 17 00:00:00 2001 From: Kurt Date: Mon, 18 May 2026 11:28:51 -0500 Subject: [PATCH 35/81] Update SAV_Misc5.cs Closes #4807 --- .../Subforms/Save Editors/Gen5/SAV_Misc5.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.cs index c1ad6ea9d..0c060b170 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.cs @@ -328,7 +328,16 @@ private void ReadEntralink() LB_FunfestMissions.Items.AddRange(FMTitles); CB_FMLevel.Items.Clear(); - CB_FMLevel.Items.AddRange("Lv.1", "Lv.2 +", "Lv.3 ++", "Lv.3 +++"); + var levels = new ComboItem[] + { + new("Lv.1", 0), + new("Lv.2 +", 1), + new("Lv.3 ++", 2), + new("Lv.3 +++", 3), + new(GameInfo.Strings.specieslist[0], 7), // -1 + }; + CB_FMLevel.InitializeBinding(); + CB_FMLevel.DataSource = new BindingSource(levels, string.Empty); SetNudMax(); SetEntreeExpTooltip(); LB_FunfestMissions.SelectedIndex = 0; @@ -435,7 +444,7 @@ private void LoadFestaMissionRecord() var record = block.GetMissionRecord(mission); CHK_FMNew.Checked = record.IsNew; - CB_FMLevel.SelectedIndex = record.Level; + CB_FMLevel.SelectedValue = record.Level; NUD_FMBestScore.SetValueClamped(record.Score); NUD_FMBestTotal.SetValueClamped(record.Total); } @@ -450,7 +459,7 @@ private void ChangeFestaMissionValue(object sender, EventArgs e) if ((uint)mission > FestaBlock5.MaxMissionIndex) return; - var score = new Funfest5Score((int)NUD_FMBestTotal.Value, (int)NUD_FMBestScore.Value, CB_FMLevel.SelectedIndex & 3, CHK_FMNew.Checked); + var score = new Funfest5Score((int)NUD_FMBestTotal.Value, (int)NUD_FMBestScore.Value, WinFormsUtil.GetIndex(CB_FMLevel), CHK_FMNew.Checked); block.SetMissionRecord(mission, score); } From 78ac3e841f04c33be3d32a8a79d4111e9e588f38 Mon Sep 17 00:00:00 2001 From: Ka-n00b Date: Tue, 19 May 2026 23:59:40 -0400 Subject: [PATCH 36/81] Minor updates (#4806) * Update ProgramLanguage.cs * Update lang_zh-Hant.txt * Update lang_es-419.txt * Update lang_es.txt * Update lang_es.txt * Update lang_de.txt * Update lang_it.txt * Update lang_es-419.txt * Update lang_es.txt * Update lang_fr.txt * Update lang_fr.txt * Update lang_zh-Hant.txt * Update lang_zh-Hant.txt * Update text_Games_it.txt * Update text_Games_de.txt * Update text_Games_ko.txt * Update lang_fr.txt * Update lang_es.txt * Update lang_es-419.txt --- PKHeX.Core/Game/GameStrings/ProgramLanguage.cs | 4 ++-- .../Resources/text/other/de/text_Games_de.txt | 4 ++-- .../Resources/text/other/it/text_Games_it.txt | 4 ++-- .../Resources/text/other/ko/text_Games_ko.txt | 8 ++++---- PKHeX.WinForms/Resources/text/lang_de.txt | 4 ++-- PKHeX.WinForms/Resources/text/lang_es-419.txt | 14 +++++++------- PKHeX.WinForms/Resources/text/lang_es.txt | 14 +++++++------- PKHeX.WinForms/Resources/text/lang_fr.txt | 12 ++++++------ PKHeX.WinForms/Resources/text/lang_it.txt | 2 +- PKHeX.WinForms/Resources/text/lang_zh-Hant.txt | 12 ++++++------ 10 files changed, 39 insertions(+), 39 deletions(-) diff --git a/PKHeX.Core/Game/GameStrings/ProgramLanguage.cs b/PKHeX.Core/Game/GameStrings/ProgramLanguage.cs index 77282c643..e30e7dfa2 100644 --- a/PKHeX.Core/Game/GameStrings/ProgramLanguage.cs +++ b/PKHeX.Core/Game/GameStrings/ProgramLanguage.cs @@ -31,9 +31,9 @@ public enum ProgramLanguage Deutsch, /// - /// Spanish + /// Spanish (España) /// - Español, + Español_España, /// /// Spanish (LATAM) diff --git a/PKHeX.Core/Resources/text/other/de/text_Games_de.txt b/PKHeX.Core/Resources/text/other/de/text_Games_de.txt index 86589bac0..ebab360a6 100644 --- a/PKHeX.Core/Resources/text/other/de/text_Games_de.txt +++ b/PKHeX.Core/Resources/text/other/de/text_Games_de.txt @@ -13,7 +13,7 @@ Perl Platin -Kolosseum/XD +Colosseum/XD Battle Revolution @@ -51,4 +51,4 @@ Leuchtende Perle Karmesin Purpur Legenden: Z-A -Champions \ No newline at end of file +Champions diff --git a/PKHeX.Core/Resources/text/other/it/text_Games_it.txt b/PKHeX.Core/Resources/text/other/it/text_Games_it.txt index 830cfb237..1e9cd421f 100644 --- a/PKHeX.Core/Resources/text/other/it/text_Games_it.txt +++ b/PKHeX.Core/Resources/text/other/it/text_Games_it.txt @@ -13,7 +13,7 @@ Perla Platino -Colosseo/XD +Colosseum/XD Battle Revolution @@ -51,4 +51,4 @@ Perla Splendente Scarlatto Violetto Leggende: Z-A -Champions \ No newline at end of file +Champions diff --git a/PKHeX.Core/Resources/text/other/ko/text_Games_ko.txt b/PKHeX.Core/Resources/text/other/ko/text_Games_ko.txt index 99612e328..c27c66514 100644 --- a/PKHeX.Core/Resources/text/other/ko/text_Games_ko.txt +++ b/PKHeX.Core/Resources/text/other/ko/text_Games_ko.txt @@ -8,9 +8,9 @@ 하트골드 소울실버 -디아루가 -펄기아 -Pt기라티나 +DP 디아루가 +DP 펄기아 +Pt 기라티나 콜로세움/XD @@ -51,4 +51,4 @@ LEGENDS 아르세우스 스칼렛 바이올렛 LEGENDS Z-A -Champions \ No newline at end of file +Champions diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index 87a1bcb73..cfa7050e3 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -577,8 +577,8 @@ Main.Menu_LoadBoxes=Lade Boxen Main.Menu_MGDatabase=Wunderkarten Datenbank Main.Menu_Open=Öffnen... Main.Menu_Options=Optionen -Main.Menu_PopoutBoxAll=All Boxes -Main.Menu_PopoutBoxSingle=Single Box +Main.Menu_PopoutBoxAll=Alle Boxen +Main.Menu_PopoutBoxSingle=Einzelne Box Main.Menu_Redo=Letzte Änderung wiederholen Main.Menu_Report=Box-Datenbericht Main.Menu_Save=Speichere PKM... diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index 7ae7ad5a5..17d279c07 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -467,8 +467,8 @@ Main.GB_CurrentMoves=Movimientos actuales Main.GB_Daycare=Guardería Main.GB_EggConditions=Condiciones del huevo Main.GB_Markings=Marcas -Main.GB_nOT=Último entrenador (no EO) -Main.GB_OT=Info. del entrenador +Main.GB_nOT=Último Entrenador (no EO) +Main.GB_OT=Información del Entrenador Main.GB_RelearnMoves=Recordar movimientos Main.L_AlphaMastered=Alfa dominados: Main.L_ArrivedDateTime=Adquirido por el entrenador actual en... @@ -490,14 +490,14 @@ Main.L_LanguageHT=Idioma: Main.L_MetTimeOfDay=Momento del día: Main.L_Mood7b=Humor: Main.L_NSparkle=Brillo de N -Main.L_ObedienceLevel=Niv. Obediencia: +Main.L_ObedienceLevel=Nivel de Obediencia: Main.L_PokeStarFame=Fama: Main.L_ReadOnlyOther=Esta pestaña es de solo lectura. Main.L_SaveSlot=Ranura de guardado: Main.L_Scale=Escala: Main.L_ShadowID=ID Oscuro: Main.L_Spirit7b=Ánimo: -Main.L_StatNature=Nat. Estad.: +Main.L_StatNature=Naturaleza Estad.: Main.L_TeraTypeOriginal=Teratipo original: Main.L_TeraTypeOverride=Teratipo sobreescrito: Main.L_WalkingMood=Humor de Caminar: @@ -555,7 +555,7 @@ Main.Label_SPC=Especial: Main.Label_SPD=Def. Esp.: Main.Label_SPE=Velocidad: Main.Label_Species=Especie: -Main.Label_Stats=Estadística +Main.Label_Stats=Estadísticas Main.Label_SubRegion=Subregión: Main.Label_TID=ID: Main.Label_Total=Total: @@ -568,7 +568,7 @@ Main.Menu_DumpBox=Exportar Caja Main.Menu_DumpBoxes=Exportar Cajas Main.Menu_EncDatabase=Base de datos de encuentros Main.Menu_Exit=Salir -Main.Menu_ExportBAK=Guardar BAK +Main.Menu_ExportBAK=Exportar BAK Main.Menu_ExportSAV=Guardar SAV... Main.Menu_File=Archivo Main.Menu_Folder=Abrir carpeta @@ -648,7 +648,7 @@ Main.Tab_Box=Caja Main.Tab_Cosmetic=Cosmética Main.Tab_Main=Inicio Main.Tab_Met=Encuentro -Main.Tab_Moves=Movimiento +Main.Tab_Moves=Movimientos Main.Tab_Other=Otro Main.Tab_OTMisc=EO/Misc Main.Tab_PartyBattle=Equipo diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index f8609f87c..798029a83 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -467,8 +467,8 @@ Main.GB_CurrentMoves=Movimientos actuales Main.GB_Daycare=Guardería Main.GB_EggConditions=Condiciones del huevo Main.GB_Markings=Marcas -Main.GB_nOT=Último entrenador (no EO) -Main.GB_OT=Info. del entrenador +Main.GB_nOT=Último Entrenador (no EO) +Main.GB_OT=Información del Entrenador Main.GB_RelearnMoves=Recordar movimientos Main.L_AlphaMastered=Alfa dominados: Main.L_ArrivedDateTime=Adquirido por el entrenador actual en... @@ -490,14 +490,14 @@ Main.L_LanguageHT=Idioma: Main.L_MetTimeOfDay=Momento del día: Main.L_Mood7b=Humor: Main.L_NSparkle=Brillo de N -Main.L_ObedienceLevel=Niv. Obediencia: +Main.L_ObedienceLevel=Nivel de Obediencia: Main.L_PokeStarFame=Fama: Main.L_ReadOnlyOther=Esta pestaña es de solo lectura. Main.L_SaveSlot=Ranura de guardado: Main.L_Scale=Escala: Main.L_ShadowID=ID Oscuro: Main.L_Spirit7b=Ánimo: -Main.L_StatNature=Nat. Estad.: +Main.L_StatNature=Naturaleza Estad.: Main.L_TeraTypeOriginal=Teratipo original: Main.L_TeraTypeOverride=Teratipo sobreescrito: Main.L_WalkingMood=Humor de Caminar: @@ -555,7 +555,7 @@ Main.Label_SPC=Especial: Main.Label_SPD=Def. Esp.: Main.Label_SPE=Velocidad: Main.Label_Species=Especie: -Main.Label_Stats=Estadística +Main.Label_Stats=Estadísticas Main.Label_SubRegion=Subregión: Main.Label_TID=ID: Main.Label_Total=Total: @@ -568,7 +568,7 @@ Main.Menu_DumpBox=Exportar Caja Main.Menu_DumpBoxes=Exportar Cajas Main.Menu_EncDatabase=Base de datos de encuentros Main.Menu_Exit=Salir -Main.Menu_ExportBAK=Guardar BAK +Main.Menu_ExportBAK=Exportar BAK Main.Menu_ExportSAV=Guardar SAV... Main.Menu_File=Archivo Main.Menu_Folder=Abrir carpeta @@ -648,7 +648,7 @@ Main.Tab_Box=Caja Main.Tab_Cosmetic=Cosmética Main.Tab_Main=Inicio Main.Tab_Met=Encuentro -Main.Tab_Moves=Movimiento +Main.Tab_Moves=Movimientos Main.Tab_Other=Otro Main.Tab_OTMisc=EO/Varios Main.Tab_PartyBattle=Equipo diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index d6f02a795..797e55f34 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -467,12 +467,12 @@ Main.GB_CurrentMoves=Capacités actuelles Main.GB_Daycare=Pension Main.GB_EggConditions=Éclosion Main.GB_Markings=Marquages -Main.GB_nOT=Dernier Dresseur connu -Main.GB_OT=Infos Dresseur +Main.GB_nOT=Dernier DO (pas le DO d'origine) +Main.GB_OT=Informations du Dresseur Main.GB_RelearnMoves=Capacités réapprises Main.L_AlphaMastered=Capacité maîtrisée : Main.L_ArrivedDateTime=Obtenu par le dresseur actuel à... -Main.L_BattleVersion=Version comb. : +Main.L_BattleVersion=Version de Combat : Main.L_CatchRate=Taux de capture : Main.L_CP=PC : Main.L_CurrentHandler=Dresseur actuel : @@ -536,11 +536,11 @@ Main.Label_HiddenPowerPrefix=Type Puissance Cachée : Main.Label_HP=PV : Main.Label_IVs=IVs Main.Label_Language=Langue : -Main.Label_MetDate=Rencontré le : +Main.Label_MetDate=Date de rencontre : Main.Label_MetLevel=Niveau : Main.Label_MetLocation=Lieu : Main.Label_Nature=Nature : -Main.Label_OriginGame=Jeu de base : +Main.Label_OriginGame=Jeu d'origine : Main.Label_OT=DO : Main.Label_PID=PID : Main.Label_PKRS=Pokérus : @@ -647,7 +647,7 @@ Main.mnuView=&Voir Main.Tab_Box=Boîtes Main.Tab_Cosmetic=Cosmétique Main.Tab_Main=Général -Main.Tab_Met=Origine +Main.Tab_Met=Rencontre Main.Tab_Moves=Capacités Main.Tab_Other=Autre Main.Tab_OTMisc=DO/Divers diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index b7ac4ba8b..c23245dd3 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -2415,7 +2415,7 @@ SAV_Trainer7.L_Z=Coordinata Z: SAV_Trainer7.Label_SID=SID: SAV_Trainer7.Label_TID=TID: SAV_Trainer7.Tab_BadgeMap=Mappa -SAV_Trainer7.Tab_BattleTree=Albero Lotta +SAV_Trainer7.Tab_BattleTree=Albero della Lotta SAV_Trainer7.Tab_Misc=Varie SAV_Trainer7.Tab_Overview=Panoramica SAV_Trainer7.Tab_Ultra=Ultra diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index 6cbad7ae6..c0b8d46cd 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -114,7 +114,7 @@ BatchEdit.mnu_Set=設置 BatchEditor.B_Add=增加 BatchEditor.B_Go=運行 BatchEditor.RB_Boxes=盒子 -BatchEditor.RB_Party=同行隊伍 +BatchEditor.RB_Party=隊伍 BatchEditor.RB_Path=資料夾... BattleChateauRank6.Baron=男爵/女男爵 BattleChateauRank6.Duke=公爵/女公爵 @@ -651,7 +651,7 @@ Main.Tab_Met=遇見 Main.Tab_Moves=招式 Main.Tab_Other=其它 Main.Tab_OTMisc=初訓家/雜項 -Main.Tab_PartyBattle=同行寶可夢 +Main.Tab_PartyBattle=同行 Main.Tab_SAV=存檔 Main.Tab_Stats=數值 MemoryAmie.B_ClearAll=清空 @@ -1292,7 +1292,7 @@ SAV_HallOfFame.GB_CurrentMoves=現時招式 SAV_HallOfFame.GB_OT=訓練家資訊 SAV_HallOfFame.groupBox1=進入 SAV_HallOfFame.L_Level=等級: -SAV_HallOfFame.L_PartyNum=同行隊伍排序: +SAV_HallOfFame.L_PartyNum=隊伍排序: SAV_HallOfFame.L_Shiny=異色: SAV_HallOfFame.L_Victory=勝利數字: SAV_HallOfFame.Label_EncryptionConstant=加密常量: @@ -1317,7 +1317,7 @@ SAV_HallOfFame1.L_PartyNum=隊伍索引: SAV_HallOfFame1.Label_Species=種類: SAV_HallOfFame3.B_Cancel=取消 SAV_HallOfFame3.B_Clear=清空 -SAV_HallOfFame3.B_ImportParty=從隊伍匯入全部 +SAV_HallOfFame3.B_ImportParty=從隊伍導入全部 SAV_HallOfFame3.B_Save=保存 SAV_HallOfFame3.CHK_Shiny=異色 SAV_HallOfFame3.L_Level=等級: @@ -2459,8 +2459,8 @@ SAV_Trainer7GG.Tab_Complex=GO遊樂區 SAV_Trainer7GG.Tab_Overview=概覽 SAV_Trainer8.B_Cancel=取消 SAV_Trainer8.B_CollectDiglett=收集所有地鼠 -SAV_Trainer8.B_CopyFromPartyToTitleScreen=從同行精靈中複製 -SAV_Trainer8.B_CopyFromPartyToTrainerCard=從同行精靈中複製 +SAV_Trainer8.B_CopyFromPartyToTitleScreen=從同行複製 +SAV_Trainer8.B_CopyFromPartyToTrainerCard=從同行複製 SAV_Trainer8.B_Fashion=獲得所有服裝 SAV_Trainer8.B_MaxCash=+ SAV_Trainer8.B_MaxWatt=+ From 06c742ac789f31831ab01ed0ec3b62f9fd2847fd Mon Sep 17 00:00:00 2001 From: Kurt Date: Thu, 21 May 2026 19:35:29 -0500 Subject: [PATCH 37/81] Slot9a: overqwil defer, ignore hasTracker https://projectpokemon.org/home/forums/topic/57375-pkhex-new-update-legality-errors-contribution-page/page/36/#findComment-300382 ZA origin can't travel to adjacent games to explore those evolution methods, so the formarg evo verification fails. Exert more preference for an exact species-match, don't settle for a Qwilfish just cuz it has a tracker. --- .../Legality/Encounters/Templates/Gen9a/EncounterSlot9a.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen9a/EncounterSlot9a.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen9a/EncounterSlot9a.cs index 49810c238..907f553aa 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen9a/EncounterSlot9a.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen9a/EncounterSlot9a.cs @@ -131,7 +131,8 @@ public EncounterMatchRating GetMatchRating(PKM pk) private bool IsFormArgMismatch(PKM pk) => pk.Species switch { - (int)Core.Species.Overqwil when Species is not (int)Core.Species.Overqwil && pk is IFormArgument { FormArgument: 0 } and IHomeTrack { HasTracker: false } => true, + // Don't check for HOME tracker cross-evolution unlocks. This stays simple so that the iterator tries to find a no-evolve template match if possible. + (int)Core.Species.Overqwil when Species is not (int)Core.Species.Overqwil && pk is IFormArgument { FormArgument: 0 } => true, _ => false, }; From b8478a44886a2b8dc147a06e7a3da297202a872c Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 23 May 2026 10:35:35 -0500 Subject: [PATCH 38/81] Minor tweaks Fix localization dump LocalizedDescription duplicate property names: not per-class, so update the internal label to be more general. --- .../Editing/Program/Settings/EncounterDatabaseSettings.cs | 2 +- PKHeX.Core/Editing/Program/Settings/EntityDatabaseSettings.cs | 2 +- .../Editing/Program/Settings/MysteryGiftDatabaseSettings.cs | 2 +- .../Legality/Encounters/Data/Live/EncounterServerDate.cs | 2 +- PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs | 1 - PKHeX.Core/PKM/Util/EffortValues.cs | 4 ++-- PKHeX.Core/Resources/localize/legality/legality_de.json | 2 +- PKHeX.Core/Resources/localize/legality/legality_en.json | 2 +- PKHeX.Core/Resources/localize/legality/legality_es-419.json | 2 +- PKHeX.Core/Resources/localize/legality/legality_es.json | 2 +- PKHeX.Core/Resources/localize/legality/legality_fr.json | 2 +- PKHeX.Core/Resources/localize/legality/legality_it.json | 2 +- PKHeX.Core/Resources/localize/legality/legality_ja.json | 2 +- PKHeX.Core/Resources/localize/legality/legality_ko.json | 2 +- PKHeX.Core/Resources/localize/legality/legality_zh-hans.json | 2 +- PKHeX.Core/Resources/localize/legality/legality_zh-hant.json | 2 +- 16 files changed, 16 insertions(+), 17 deletions(-) diff --git a/PKHeX.Core/Editing/Program/Settings/EncounterDatabaseSettings.cs b/PKHeX.Core/Editing/Program/Settings/EncounterDatabaseSettings.cs index afaab23be..82daf6857 100644 --- a/PKHeX.Core/Editing/Program/Settings/EncounterDatabaseSettings.cs +++ b/PKHeX.Core/Editing/Program/Settings/EncounterDatabaseSettings.cs @@ -19,7 +19,7 @@ public sealed class EncounterDatabaseSettings [LocalizedDescription("Use properties from the PKM Editor tabs even if the new encounter isn't the same evolution chain.")] public bool UseTabsAsCriteriaAnySpecies { get; set; } = true; - [LocalizedDescription("Visible row count for the Encounter Database sprite grid. Clamped from 5 to 20.")] + [LocalizedDescription("Visible row count for the sprite grid. Clamped from 5 to 20.")] public int ResultsGridRowCount { get; diff --git a/PKHeX.Core/Editing/Program/Settings/EntityDatabaseSettings.cs b/PKHeX.Core/Editing/Program/Settings/EntityDatabaseSettings.cs index 2d5aaaf80..27609893d 100644 --- a/PKHeX.Core/Editing/Program/Settings/EntityDatabaseSettings.cs +++ b/PKHeX.Core/Editing/Program/Settings/EntityDatabaseSettings.cs @@ -22,7 +22,7 @@ public sealed class EntityDatabaseSettings [LocalizedDescription("Hides unavailable Species if the currently loaded save file cannot import them.")] public bool FilterUnavailableSpecies { get; set; } = true; - [LocalizedDescription("Visible row count for the PKM Database sprite grid. Clamped from 5 to 20.")] + [LocalizedDescription("Visible row count for the sprite grid. Clamped from 5 to 20.")] public int ResultsGridRowCount { get; diff --git a/PKHeX.Core/Editing/Program/Settings/MysteryGiftDatabaseSettings.cs b/PKHeX.Core/Editing/Program/Settings/MysteryGiftDatabaseSettings.cs index 54de79f88..4b2df5a0d 100644 --- a/PKHeX.Core/Editing/Program/Settings/MysteryGiftDatabaseSettings.cs +++ b/PKHeX.Core/Editing/Program/Settings/MysteryGiftDatabaseSettings.cs @@ -10,7 +10,7 @@ public sealed class MysteryGiftDatabaseSettings [LocalizedDescription("Hides gifts if the currently loaded save file cannot (indirectly) receive them.")] public bool FilterUnavailableSpecies { get; set; } = true; - [LocalizedDescription("Visible row count for the Mystery Gift Database sprite grid. Clamped from 5 to 20.")] + [LocalizedDescription("Visible row count for the sprite grid. Clamped from 5 to 20.")] public int ResultsGridRowCount { get; diff --git a/PKHeX.Core/Legality/Encounters/Data/Live/EncounterServerDate.cs b/PKHeX.Core/Legality/Encounters/Data/Live/EncounterServerDate.cs index 12976089c..571ea9503 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Live/EncounterServerDate.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Live/EncounterServerDate.cs @@ -255,7 +255,7 @@ public static class EncounterServerDate {0102, new(2025, 10, 23, 2026, 02, 01, +2)}, // Slowpoke PokéCenter Gift {0101, new(2025, 10, 31, 2027, 02, 01)}, // PokéCenter Audino Birthday Gift {1607, new(2025, 12, 09, 2026, 01, 20)}, // Alpha Charizard - + {9031, new(2026, 04, 02)}, // Alpha Chikorita {9032, new(2026, 04, 02)}, // Alpha Tepig {9033, new(2026, 04, 02)}, // Alpha Totodile diff --git a/PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs b/PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs index 15af09a06..bd76ea186 100644 --- a/PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs +++ b/PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs @@ -215,7 +215,6 @@ public sealed class LegalityCheckLocalization public string GanbaruStatTooHigh { get; init; } = "One or more Ganbaru Value is above the natural limit of (10 - IV bonus)."; public string GenderInvalidNone { get; init; } = "Genderless Pokémon should not have a gender."; - public string GeoBadOrder { get; init; } = "GeoLocation Memory: Gap/Blank present."; public string GeoHardwareInvalid { get; init; } = "Geolocation: Country is not in 3DS region."; public string GeoHardwareRange { get; init; } = "Invalid Console Region."; public string GeoHardwareValid { get; init; } = "Geolocation: Country is in 3DS region."; diff --git a/PKHeX.Core/PKM/Util/EffortValues.cs b/PKHeX.Core/PKM/Util/EffortValues.cs index 13127c772..c06399d2a 100644 --- a/PKHeX.Core/PKM/Util/EffortValues.cs +++ b/PKHeX.Core/PKM/Util/EffortValues.cs @@ -161,8 +161,8 @@ public static void ConvertFromChampions(ReadOnlySpan champion, Span ma /// /// Converts mainline EVs (0-252) to Pokémon Champions EVs (0-32) by dividing by 8. /// - /// Champion's EVs (0-32) /// Mainline EVs (0-252) + /// Champion's EVs (0-32) public static void ConvertToChampions(ReadOnlySpan mainline, Span champion) { for (int i = 0; i < champion.Length; i++) @@ -173,7 +173,7 @@ public static void ConvertToChampions(ReadOnlySpan mainline, Span cham /// Converts an EV from Pokémon Champions (0-32) to mainline (0-252) by multiplying by 8 and applying the appropriate clamps. /// public static int ConvertFromChampions(int ev) => Math.Clamp((ev * 8) - 4, 0, Max252); - + /// /// Converts an EV from mainline (0-252) to Pokémon Champions (0-32) by dividing by 8. /// diff --git a/PKHeX.Core/Resources/localize/legality/legality_de.json b/PKHeX.Core/Resources/localize/legality/legality_de.json index 31badb058..b0b44d9ea 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_de.json +++ b/PKHeX.Core/Resources/localize/legality/legality_de.json @@ -159,12 +159,12 @@ "G7BSocialShouldBe100Mood": "Der Laune-Wert sollte bei 100 liegen, wenn sich das Pokémon nicht im Team des Spielers befindet.", "GanbaruStatTooHigh": "Ein oder mehrere Leistungslevel liegen über dem natürlichen Limit von (10 - DV-Bonus).", "GenderInvalidNone": "Geschlechtslose Pokémon sollten kein Geschlecht haben.", - "GeoBadOrder_0": "Standort-Verlauf #{0}: Lücke oder leerer Eintrag vorhanden.", "GeoHardwareInvalid": "Standort: Land liegt nicht in der 3DS-Region.", "GeoHardwareRange": "Ungültige Konsolen-Region.", "GeoHardwareValid": "Standort: Land liegt in der 3DS-Region.", "GeoMemoryMissing": "Standort-Verlauf: Einträge sollten vorhanden sein.", "GeoNoCountryHT": "Standort-Verlauf: Name des HT vorhanden, aber kein vorheriges Land angegeben.", + "GeoBadOrder_0": "Standort-Verlauf #{0}: Lücke oder leerer Eintrag vorhanden.", "GeoNoCountry_0": "Standort-Verlauf #{0}: Region ohne Land angegeben.", "GeoNoRegion_0": "Standort-Verlauf #{0}: Land ohne Region angegeben.", "HyperTrainLevelGEQ_0": "Super-Spezialtraining ist erst ab Level {0} möglich.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_en.json b/PKHeX.Core/Resources/localize/legality/legality_en.json index 649a8c774..a40129e51 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_en.json +++ b/PKHeX.Core/Resources/localize/legality/legality_en.json @@ -159,12 +159,12 @@ "G7BSocialShouldBe100Mood": "Mood should be 100 for Pokémon not in the player's party.", "GanbaruStatTooHigh": "One or more Ganbaru Value is above the natural limit of (10 - IV bonus).", "GenderInvalidNone": "Genderless Pokémon should not have a gender.", - "GeoBadOrder_0": "GeoLocation Memory #{0}: Gap/Blank present.", "GeoHardwareInvalid": "Geolocation: Country is not in 3DS region.", "GeoHardwareRange": "Invalid Console Region.", "GeoHardwareValid": "Geolocation: Country is in 3DS region.", "GeoMemoryMissing": "GeoLocation Memory: Memories should be present.", "GeoNoCountryHT": "GeoLocation Memory: HT Name present but has no previous Country.", + "GeoBadOrder_0": "GeoLocation Memory #{0}: Gap/Blank present.", "GeoNoCountry_0": "GeoLocation Memory #{0}: Region without Country.", "GeoNoRegion_0": "GeoLocation Memory #{0}: Country without Region.", "HyperTrainLevelGEQ_0": "Can't Hyper Train a Pokémon that isn't level {0}.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_es-419.json b/PKHeX.Core/Resources/localize/legality/legality_es-419.json index 699ae61c0..64c9e4be7 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_es-419.json +++ b/PKHeX.Core/Resources/localize/legality/legality_es-419.json @@ -159,12 +159,12 @@ "G7BSocialShouldBe100Mood": "El humor debería ser 100 para Pokémon que no están en el equipo.", "GanbaruStatTooHigh": "Uno o más niveles de esfuerzo están por encima del límite natural de (10 - bonificación de IV).", "GenderInvalidNone": "Pokémon sin género no debería tener género.", - "GeoBadOrder_0": "Recuerdo de Geolocalización #{0}: En blanco/nulo.", "GeoHardwareInvalid": "Geolocalización: El país no se encuentra en la región de la 3DS.", "GeoHardwareRange": "Región de consola inválida.", "GeoHardwareValid": "Geolocalización: El país está en la región de la 3DS.", "GeoMemoryMissing": "Recuerdo de Geolocalización: Los recuerdos deberían estar presentes.", "GeoNoCountryHT": "Recuerdo de Geolocalización: El nombre del entrenador anterior aparece pero no tiene país anterior.", + "GeoBadOrder_0": "Recuerdo de Geolocalización #{0}: En blanco/nulo.", "GeoNoCountry_0": "Recuerdo de Geolocalización #{0}: Región sin país.", "GeoNoRegion_0": "Recuerdo de Geolocalización #{0}: País sin región.", "HyperTrainLevelGEQ_0": "No se puede usar el Entrenamiento Extremo en un Pokémon que no esté al nivel {0}.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_es.json b/PKHeX.Core/Resources/localize/legality/legality_es.json index dd8b7c399..3a6ffbe4d 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_es.json +++ b/PKHeX.Core/Resources/localize/legality/legality_es.json @@ -159,12 +159,12 @@ "G7BSocialShouldBe100Mood": "El humor debería ser 100 para Pokémon que no están en el equipo.", "GanbaruStatTooHigh": "Uno o más niveles de esfuerzo están por encima del límite natural de (10 - bonificación de IV).", "GenderInvalidNone": "Pokémon sin género no debería tener género.", - "GeoBadOrder_0": "Recuerdo de Geolocalización #{0}: En blanco/nulo.", "GeoHardwareInvalid": "Geolocalización: El país no se encuentra en la región de la 3DS.", "GeoHardwareRange": "Región de consola inválida.", "GeoHardwareValid": "Geolocalización: El país está en la región de la 3DS.", "GeoMemoryMissing": "Recuerdo de Geolocalización: Los recuerdos deberían estar presentes.", "GeoNoCountryHT": "Recuerdo de Geolocalización: El nombre del entrenador anterior aparece pero no tiene país anterior.", + "GeoBadOrder_0": "Recuerdo de Geolocalización #{0}: En blanco/nulo.", "GeoNoCountry_0": "Recuerdo de Geolocalización #{0}: Región sin país.", "GeoNoRegion_0": "Recuerdo de Geolocalización #{0}: País sin región.", "HyperTrainLevelGEQ_0": "No se puede usar el Entrenamiento Extremo en un Pokémon que no esté al nivel {0}.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_fr.json b/PKHeX.Core/Resources/localize/legality/legality_fr.json index 1d12cd611..22328b9f6 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_fr.json +++ b/PKHeX.Core/Resources/localize/legality/legality_fr.json @@ -159,12 +159,12 @@ "G7BSocialShouldBe100Mood": "Les Pokémon hors de l'Équipe devraient avoir leur Humeur à 100.", "GanbaruStatTooHigh": "Une ou plusieurs valeurs du niveau d'effort sont supérieures à la limite naturelle de (10 - IV bonus).", "GenderInvalidNone": "Les Pokémon asexués ne peuvent pas être genrés.", - "GeoBadOrder_0": "Mémoire géolocalisations #{0} : Vide présent.", "GeoHardwareInvalid": "Géolocalisations : Le pays n'est pas inclus dans une région 3DS.", "GeoHardwareRange": "Région de Console invalide.", "GeoHardwareValid": "Géolocalisations : Le pays est inclus dans une région 3DS.", "GeoMemoryMissing": "Souvenirs géolocalisations : des Souvenirs devraient être présents.", "GeoNoCountryHT": "Souvenirs géolocalisations : Nom de Dresseur Connu présent mais pays précédent manquant.", + "GeoBadOrder_0": "Mémoire géolocalisations #{0} : Vide présent.", "GeoNoCountry_0": "Mémoire géolocalisations #{0} : Région sans pays.", "GeoNoRegion_0": "Mémoire géolocalisations #{0} : Pays sans région.", "HyperTrainLevelGEQ_0": "Impossible de faire subir l'Entraînement Ultime à un Pokémon au-dessous du niveau {0}.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_it.json b/PKHeX.Core/Resources/localize/legality/legality_it.json index bf2175215..e855dbdb3 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_it.json +++ b/PKHeX.Core/Resources/localize/legality/legality_it.json @@ -159,12 +159,12 @@ "G7BSocialShouldBe100Mood": "L'Umore deve essere 100 per i Pokémon non presenti in squadra.", "GanbaruStatTooHigh": "Uno o più livelli di impegno sono superiori al limite naturale di (10 - bonus IV).", "GenderInvalidNone": "I Pokémon senza sesso non dovrebbero avere un Sesso.", - "GeoBadOrder_0": "Ricordo geolocalizzazione #{0}: presenza di lacune o spazi vuoti.", "GeoHardwareInvalid": "Geolocalizzazione: La nazione non è disponibile nel 3DS.", "GeoHardwareRange": "Regione della console non valida.", "GeoHardwareValid": "Geolocalizzazione: la nazione è disponibile nel 3DS.", "GeoMemoryMissing": "Ricordo geolocalizzazione: le Ricordi dovrebbero essere presenti.", "GeoNoCountryHT": "Ricordo geolocalizzazione: è presente un nome per l'Ultimo Allenatore, ma non ha una nazione.", + "GeoBadOrder_0": "Ricordo geolocalizzazione #{0}: presenza di lacune o spazi vuoti.", "GeoNoCountry_0": "Ricordo geolocalizzazione #{0}: la regione è senza nazione.", "GeoNoRegion_0": "Ricordo geolocalizzazione #{0}: la nazione è senza regione.", "HyperTrainLevelGEQ_0": "Impossibile usare l'Allenamento Pro su un Pokémon che non sia al livello {0}.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_ja.json b/PKHeX.Core/Resources/localize/legality/legality_ja.json index 21d195867..403edfe96 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_ja.json +++ b/PKHeX.Core/Resources/localize/legality/legality_ja.json @@ -159,12 +159,12 @@ "G7BSocialShouldBe100Mood": "Mood should be 100 for Pokémon not in the player's party.", "GanbaruStatTooHigh": "1つ以上のがんばレベルが通常限界値(10-個体値ボーナス)を超えています。", "GenderInvalidNone": "性別不明のポケモンは性別を持ちません。", - "GeoBadOrder_0": "地域(おもいで)#{0}:空白があります。", "GeoHardwareInvalid": "地域設定:この国は3DS地域設定にありません。", "GeoHardwareRange": "不正な地域", "GeoHardwareValid": "地域設定:この国は3DS地域設定にあります。", "GeoMemoryMissing": "地域設定(おもいで): おもいでがありません。", "GeoNoCountryHT": "地域設定(おもいで): トレーナー名が存在しますが、国の設定がされていません。", + "GeoBadOrder_0": "地域(おもいで)#{0}:空白があります。", "GeoNoCountry_0": "地域設定(おもいで)#{0}: 国設定なしに地域設定されています。", "GeoNoRegion_0": "地域設定(おもいで)#{0}: 国設定ありで地域設定がありません。", "HyperTrainLevelGEQ_0": "すごいとっくんをするにはレベル{0}でなければなりません。", diff --git a/PKHeX.Core/Resources/localize/legality/legality_ko.json b/PKHeX.Core/Resources/localize/legality/legality_ko.json index db742ad4b..141f04c01 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_ko.json +++ b/PKHeX.Core/Resources/localize/legality/legality_ko.json @@ -159,12 +159,12 @@ "G7BSocialShouldBe100Mood": "지니고 있는 포켓몬이 아닐 경우 '기분' 수치는 100이어야 합니다.", "GanbaruStatTooHigh": "하나 이상의 노력 레벨이 자연적인 한도(10 - IV 보너스)를 초과했습니다.", "GenderInvalidNone": "무성 포켓몬은 성별을 가질 수 없습니다.", - "GeoBadOrder_0": "지오로케이션 기억 #{0}: 빈 공간이 존재합니다.", "GeoHardwareInvalid": "지오로케이션: 국가가 3DS 지역 내에 있지 않습니다.", "GeoHardwareRange": "사용할 수 없는 3DS 지역입니다.", "GeoHardwareValid": "지오로케이션: 국가가 3DS 지역 내에 있습니다.", "GeoMemoryMissing": "지오로케이션 기억: 기억이 존재해야 합니다.", "GeoNoCountryHT": "지오로케이션 기억: 소유했던 트레이너의 이름이 존재하지만 이전 국가가 설정되어 있지 않습니다.", + "GeoBadOrder_0": "지오로케이션 기억 #{0}: 빈 공간이 존재합니다.", "GeoNoCountry_0": "지오로케이션 기억 #{0}: 국가는 없지만 지역이 설정되어 있습니다.", "GeoNoRegion_0": "지오로케이션 기억 #{0}: 국가는 설정되어 있지만 지역이 설정되어 있지 않습니다.", "HyperTrainLevelGEQ_0": "레벨 {0} 미만인 포켓몬은 대단한 특훈을 받을 수 없습니다.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json b/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json index 8d68536a8..37daf4f93 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json +++ b/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json @@ -159,12 +159,12 @@ "G7BSocialShouldBe100Mood": "不在玩家队伍中的宝可梦,其心情值应为 100。", "GanbaruStatTooHigh": "一项或多项奋斗等级超过上限 (10 - IV个体值提升等级)。", "GenderInvalidNone": "无性别宝可梦不能有性别。", - "GeoBadOrder_0": "地理位置回忆#{0}: 间隔/空白存在。", "GeoHardwareInvalid": "地理位置: 国家不在3DS区域内。", "GeoHardwareRange": "非法主机系统。", "GeoHardwareValid": "地理位置: 国家在3DS区域内。", "GeoMemoryMissing": "地理位置回忆: 回忆应该存在。", "GeoNoCountryHT": "地理位置回忆: 持有人名称存在但没有故居。", + "GeoBadOrder_0": "地理位置回忆#{0}: 间隔/空白存在。", "GeoNoCountry_0": "地理位置回忆#{0}: 地区没有国家。", "GeoNoRegion_0": "地理位置回忆#{0}: 国家没有地区。", "HyperTrainLevelGEQ_0": "不能对未满{0}级的宝可梦极限特训。", diff --git a/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json b/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json index 0e9c110c7..90f56c3c6 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json +++ b/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json @@ -159,12 +159,12 @@ "G7BSocialShouldBe100Mood": "不在玩家隊伍中的寶可夢,其心情值應為 100。", "GanbaruStatTooHigh": "一項或多項奮鬥等級超過上限 (10 減 IV 個體值提升奮鬥等級)。", "GenderInvalidNone": "無性別寶可夢不能有性別。", - "GeoBadOrder_0": "地理位置回憶#{0}: 間隔/空白存在。", "GeoHardwareInvalid": "地理位置: 國家/地區不在3DS區域內。", "GeoHardwareRange": "不合法主機系統。", "GeoHardwareValid": "地理位置: 國家/地區在3DS區域內。", "GeoMemoryMissing": "地理位置回憶: 回憶應該存在。", "GeoNoCountryHT": "地理位置回憶: 持有人名稱存在但沒有故居。", + "GeoBadOrder_0": "地理位置回憶#{0}: 間隔/空白存在。", "GeoNoCountry_0": "地理位置回憶#{0}: 地區沒有國家。", "GeoNoRegion_0": "地理位置回憶#{0}: 國家沒有地區。", "HyperTrainLevelGEQ_0": "不能對未滿{0}級之寶可夢極限特訓。", From 934ec2afe7731a27aa6f8721f2cc373bfaa41480 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 23 May 2026 14:13:38 -0500 Subject: [PATCH 39/81] B2W2: Add Join Avenue & editor Adds i/o to save/import individual visitors/etc --- .../Saves/Access/SaveBlockAccessor5B2W2.cs | 1 + PKHeX.Core/Saves/SAV5B2W2.cs | 1 + .../Gen5/Join Avenue/IJoinAvenueEntity5.cs | 100 ++ .../Gen5/Join Avenue/JoinAvenue5.cs | 55 + .../Gen5/Join Avenue/JoinAvenueAssistant5.cs | 109 ++ .../Join Avenue/JoinAvenueCeilingColor5.cs | 9 + .../Gen5/Join Avenue/JoinAvenueDate5.cs | 45 + .../Gen5/Join Avenue/JoinAvenueFan5.cs | 112 ++ .../Join Avenue/JoinAvenueRecordIndex5.cs | 14 + .../Gen5/Join Avenue/JoinAvenueSettings5.cs | 109 ++ .../Gen5/Join Avenue/JoinAvenueShopType5.cs | 15 + .../Gen5/Join Avenue/JoinAvenueVisitor5.cs | 357 +++++ .../Controls/SAV Editor/SAVEditor.Designer.cs | 46 +- .../Controls/SAV Editor/SAVEditor.cs | 2 + PKHeX.WinForms/Resources/text/lang_de.txt | 84 ++ PKHeX.WinForms/Resources/text/lang_en.txt | 84 ++ PKHeX.WinForms/Resources/text/lang_es-419.txt | 84 ++ PKHeX.WinForms/Resources/text/lang_es.txt | 84 ++ PKHeX.WinForms/Resources/text/lang_fr.txt | 84 ++ PKHeX.WinForms/Resources/text/lang_it.txt | 84 ++ PKHeX.WinForms/Resources/text/lang_ja.txt | 84 ++ PKHeX.WinForms/Resources/text/lang_ko.txt | 84 ++ .../Resources/text/lang_zh-Hans.txt | 84 ++ .../Resources/text/lang_zh-Hant.txt | 84 ++ .../Join Avenue/IJoinAvenueSpecificEditor.cs | 9 + ...nAvenueAssistantSpecificEditor.Designer.cs | 189 +++ .../JoinAvenueAssistantSpecificEditor.cs | 28 + .../JoinAvenueEntityGeneralEditor.Designer.cs | 612 +++++++++ .../JoinAvenueEntityGeneralEditor.cs | 79 ++ .../JoinAvenueFanSpecificEditor.Designer.cs | 326 +++++ .../JoinAvenueFanSpecificEditor.cs | 52 + .../JoinAvenueListEditor.Designer.cs | 148 +++ .../Gen5/Join Avenue/JoinAvenueListEditor.cs | 169 +++ .../JoinAvenueSettingsEditor.Designer.cs | 433 ++++++ .../Join Avenue/JoinAvenueSettingsEditor.cs | 81 ++ ...oinAvenueVisitorSpecificEditor.Designer.cs | 1168 +++++++++++++++++ .../JoinAvenueVisitorSpecificEditor.cs | 233 ++++ .../Join Avenue/SAV_JoinAvenue.Designer.cs | 384 ++++++ .../Gen5/Join Avenue/SAV_JoinAvenue.cs | 83 ++ PKHeX.WinForms/Util/DevUtil.cs | 6 + 40 files changed, 5799 insertions(+), 16 deletions(-) create mode 100644 PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/IJoinAvenueEntity5.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenue5.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueAssistant5.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueCeilingColor5.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueDate5.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueFan5.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueRecordIndex5.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueSettings5.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueShopType5.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueVisitor5.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/IJoinAvenueSpecificEditor.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueAssistantSpecificEditor.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueAssistantSpecificEditor.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueEntityGeneralEditor.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueEntityGeneralEditor.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueFanSpecificEditor.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueFanSpecificEditor.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueListEditor.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueListEditor.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueSettingsEditor.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueSettingsEditor.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueVisitorSpecificEditor.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueVisitorSpecificEditor.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/SAV_JoinAvenue.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/SAV_JoinAvenue.cs diff --git a/PKHeX.Core/Saves/Access/SaveBlockAccessor5B2W2.cs b/PKHeX.Core/Saves/Access/SaveBlockAccessor5B2W2.cs index b882674cd..7066d1766 100644 --- a/PKHeX.Core/Saves/Access/SaveBlockAccessor5B2W2.cs +++ b/PKHeX.Core/Saves/Access/SaveBlockAccessor5B2W2.cs @@ -113,6 +113,7 @@ public sealed class SaveBlockAccessor5B2W2(SAV5B2W2 sav) public BattleSubway5 BattleSubway { get; } = new(sav, Block(sav, 57)); public EntreeForest EntreeForest { get; } = new(sav, Block(sav, 60)); public PWTBlock5 PWT { get; } = new(sav, Block(sav, 63)); + public JoinAvenue5 JoinAvenue { get; } = new(sav, Block(sav, 67)); public MedalList5 Medals { get; } = new(sav, Block(sav, 68)); public KeySystem5 Keys { get; } = new(sav, Block(sav, 69)); public FestaBlock5 Festa { get; } = new(sav, Block(sav, 70)); diff --git a/PKHeX.Core/Saves/SAV5B2W2.cs b/PKHeX.Core/Saves/SAV5B2W2.cs index 1ee635d9a..c27e4ec93 100644 --- a/PKHeX.Core/Saves/SAV5B2W2.cs +++ b/PKHeX.Core/Saves/SAV5B2W2.cs @@ -48,6 +48,7 @@ public sealed class SAV5B2W2 : SAV5, ISaveBlock5B2W2 public FestaBlock5 Festa => Blocks.Festa; public PWTBlock5 PWT => Blocks.PWT; + public JoinAvenue5 JoinAvenue => Blocks.JoinAvenue; public MedalList5 Medals => Blocks.Medals; public KeySystem5 Keys => Blocks.Keys; diff --git a/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/IJoinAvenueEntity5.cs b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/IJoinAvenueEntity5.cs new file mode 100644 index 000000000..253066918 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/IJoinAvenueEntity5.cs @@ -0,0 +1,100 @@ +using System; + +namespace PKHeX.Core; + +/// +/// All Join Avenue entities (Assistants, Fans, Visitors) share some common properties, which are abstracted in this interface. +/// +/// +/// Even if it is nonsensical for some of these properties to be shared across all entity types (e.g. ShopLevel or Greeting/Farewell for Assistants), they are still present in the data structure. +/// +public interface IJoinAvenueEntity5 +{ + string FileExtension { get; } + string Name { get; set; } + string Shout { get; set; } + string Greeting { get; set; } + string Farewell { get; set; } + + /// + /// + /// + byte Country { get; set; } + + /// + /// + /// + byte Subregion { get; set; } + + byte Version { get; set; } + byte Language { get; set; } + byte Unknown22 { get; set; } + byte Gender { get; set; } + byte Unused23 { get; set; } + ushort TID16 { get; set; } + byte Unknown26 { get; set; } + byte Unknown27 { get; set; } + ushort PlayedTime { get; set; } + ushort PlayedHours { get; set; } + byte PlayedMinutes { get; set; } + ushort Sprite { get; set; } + + byte MetYear { get; set; } + byte MetMonth { get; set; } + byte MetDay { get; set; } + bool IsInteractedToday { get; set; } + + uint Seed { get; set; } + ReadOnlySpan Write(); +} + +public static class JoinAvenueEntityConverter +{ + extension(IJoinAvenueEntity5 destination) + { + private void CopyCommonPropertiesFrom(IJoinAvenueEntity5 source) + { + destination.Name = source.Name; + destination.Shout = source.Shout; + destination.Greeting = source.Greeting; + destination.Farewell = source.Farewell; + destination.Country = source.Country; + destination.Subregion = source.Subregion; + destination.Version = source.Version; + destination.Language = source.Language; + destination.Unknown22 = source.Unknown22; + destination.Gender = source.Gender; + destination.Unused23 = source.Unused23; + destination.TID16 = source.TID16; + destination.Unknown26 = source.Unknown26; + destination.Unknown27 = source.Unknown27; + destination.PlayedTime = source.PlayedTime; + destination.PlayedHours = source.PlayedHours; + destination.PlayedMinutes = source.PlayedMinutes; + destination.Sprite = source.Sprite; + destination.MetYear = source.MetYear; + destination.MetMonth = source.MetMonth; + destination.MetDay = source.MetDay; + destination.Seed = source.Seed; + } + + public void CopyFrom(IJoinAvenueEntity5 source) + { + switch (destination, source) + { + case (JoinAvenueVisitor5 current, JoinAvenueVisitor5 s): + current.CopyFrom(s); + break; + case (JoinAvenueFan5 current, JoinAvenueFan5 s): + current.CopyFrom(s); + break; + case (JoinAvenueAssistant5 current, JoinAvenueAssistant5 s): + current.CopyFrom(s); + break; + default: + destination.CopyCommonPropertiesFrom(source); + break; + } + } + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenue5.cs b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenue5.cs new file mode 100644 index 000000000..eee7aa64b --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenue5.cs @@ -0,0 +1,55 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +public sealed class JoinAvenue5(SAV5B2W2 sav, Memory raw) : SaveBlock(sav, raw) +{ + public const int VisitorCount = 8; + public const int FanCount = 12; + public const int OccupantCount = 8; + public const int AssistantCount = 4; + + public uint CountVisitor // always 8 + { + get => ReadUInt32LittleEndian(Data); + set => WriteUInt32LittleEndian(Data, value); + } + + public JoinAvenueVisitor5 GetVisitor(int index) => new(Raw.Slice(GetSubstructureOffset(index, 0x08, VisitorCount, JoinAvenueVisitor5.SIZE), JoinAvenueVisitor5.SIZE)); + + public uint CountFan // always 12 + { + get => ReadUInt32LittleEndian(Data[0x628..]); + set => WriteUInt32LittleEndian(Data[0x628..], value); + } + + public JoinAvenueFan5 GetFan(int index) => new(Raw.Slice(GetSubstructureOffset(index, 0x62C, FanCount, JoinAvenueFan5.SIZE), JoinAvenueFan5.SIZE)); + + public JoinAvenueVisitor5 GetOccupant(int index) => new(Raw.Slice(GetSubstructureOffset(index, 0xAAC, OccupantCount, JoinAvenueVisitor5.SIZE), JoinAvenueVisitor5.SIZE)); + public JoinAvenueAssistant5 GetAssistant(int index) => new(Raw.Slice(GetSubstructureOffset(index, 0x10CC, AssistantCount, JoinAvenueAssistant5.SIZE), JoinAvenueAssistant5.SIZE)); + + /// Won't always have all values filled out. + public JoinAvenueVisitor5 Self => new(Raw.Slice(0x122C, JoinAvenueVisitor5.SIZE)); + + /// + /// Internal flag used when scripting has triggered an update. + /// + public bool ScriptFlag + { + get => (Data[0x12F0] & 1) != 0; + set => Data[0x12F0] = (byte)((Data[0x12F0] & ~1) | (value ? 1 : 0)); + } + // 3 bytes alignment + + public JoinAvenueSettings5 Settings => new(Raw.Slice(0x12F4, JoinAvenueSettings5.SIZE), SAV); + + private static int GetSubstructureOffset(int index, int offset, int count, int size) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(index, count); + return offset + (index * size); + } + + // 0..15 max trivia value + public static ReadOnlySpan TriviaMax => [4, 2, 5, 2, 4, 8, 2, 2, 3, 2, 9, 5, 2, 2, 2, 2]; +} diff --git a/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueAssistant5.cs b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueAssistant5.cs new file mode 100644 index 000000000..ce8bd4d99 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueAssistant5.cs @@ -0,0 +1,109 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; +using static PKHeX.Core.StringConverter5; + +namespace PKHeX.Core; + +public sealed class JoinAvenueAssistant5(Memory data) : IJoinAvenueEntity5 +{ + public const int SIZE = 0x58; + private Span Data => data.Span; + public string FileExtension => "jaa5"; + public ReadOnlySpan Write() => Data; + public void CopyFrom(JoinAvenueAssistant5 other) => other.Data.CopyTo(Data); + + public string Name + { + get => GetString(Data[..0xE]); // no terminator + set => SetString(Data[..0xE], value, 7, Language); + } + + public byte Country { get => Data[0x0E]; set => Data[0x0E] = value; } + public byte Subregion { get => Data[0x0F]; set => Data[0x0F] = value; } + + public string Shout + { + get => GetString(Data[0x10..0x20]); + set => SetString(Data[0x10..0x20], value, 8, Language); + } + + public byte Version { get => Data[0x20]; set => Data[0x20] = value; } + public byte Language { get => Data[0x21]; set => Data[0x21] = value; } + + public byte Unknown22 + { + get => (byte)(Data[0x22] & 0x0F); + set => Data[0x22] = (byte)((Data[0x22] & 0xF0) | (value & 0x0F)); + } + + public byte Gender + { + get => (byte)(Data[0x22] >> 4); + set => Data[0x22] = (byte)((Data[0x22] & 0x0F) | ((value & 0x0F) << 4)); + } + + public byte Unused23 { get => Data[0x23]; set => Data[0x23] = value; } + + public ushort TID16 + { + get => ReadUInt16LittleEndian(Data[0x24..]); + set => WriteUInt16LittleEndian(Data[0x24..], value); + } + + public byte Unknown26 { get => Data[0x26]; set => Data[0x26] = value; } + public byte Unknown27 { get => Data[0x27]; set => Data[0x27] = value; } + + public ushort PlayedTime + { + get => ReadUInt16LittleEndian(Data[0x28..]); + set => WriteUInt16LittleEndian(Data[0x28..], value); + } + + public ushort PlayedHours + { + get => (ushort)(PlayedTime & 0x03FF); + set => PlayedTime = (ushort)((PlayedTime & ~0x03FF) | (value & 0x03FF)); + } + + public byte PlayedMinutes + { + get => (byte)(PlayedTime >> 10); + set => PlayedTime = (ushort)((PlayedTime & 0x03FF) | ((value & 0x3F) << 10)); + } + + /// + /// Overworld Sprite ID + /// + public ushort Sprite + { + get => ReadUInt16LittleEndian(Data[0x2A..]); + set => WriteUInt16LittleEndian(Data[0x2A..], value); + } + + public byte Position0 { get => Data[0x2C]; set => Data[0x2C] = value; } + public byte Position1 { get => Data[0x2D]; set => Data[0x2D] = value; } + public byte Position2 { get => Data[0x2E]; set => Data[0x2E] = value; } + public byte PositionUnused { get => Data[0x2F]; set => Data[0x2F] = value; } + public byte MetYear { get => Data[0x30]; set => Data[0x30] = value; } + public byte MetMonth { get => Data[0x31]; set => Data[0x31] = value; } + public byte MetDay { get => Data[0x32]; set => Data[0x32] = value; } + public bool IsInteractedToday { get => (Data[0x33] & 1) != 0; set => Data[0x33] = (byte)(value ? 1 : 0); } + + public string Greeting + { + get => GetString(Data[0x34..0x44]); + set => SetString(Data[0x34..0x44], value, 8, Language); + } + + public string Farewell + { + get => GetString(Data[0x44..0x54]); + set => SetString(Data[0x44..0x54], value, 8, Language); + } + + public uint Seed + { + get => ReadUInt32LittleEndian(Data[0x54..]); + set => WriteUInt32LittleEndian(Data[0x54..], value); + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueCeilingColor5.cs b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueCeilingColor5.cs new file mode 100644 index 000000000..115c51566 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueCeilingColor5.cs @@ -0,0 +1,9 @@ +namespace PKHeX.Core; + +public enum JoinAvenueCeilingColor5 : ushort +{ + Orange = 0, + Purple = 1, + Blue = 2, + Green = 3, +} diff --git a/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueDate5.cs b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueDate5.cs new file mode 100644 index 000000000..784323eee --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueDate5.cs @@ -0,0 +1,45 @@ +using System; + +namespace PKHeX.Core; + +public record struct JoinAvenueDate5(ushort RawValue) +{ + private const int EpochYear = 2000; + + public int Year + { + readonly get => ((RawValue >> 9) & 0x7F) + EpochYear; + set => RawValue = (ushort)((RawValue & 0x01FF) | (((value - EpochYear) & 0x7F) << 9)); + } + + public int Month + { + readonly get => (RawValue >> 5) & 0x0F; + set => RawValue = (ushort)((RawValue & 0xFE1F) | ((value & 0x0F) << 5)); + } + + public int Day + { + readonly get => RawValue & 0x1F; + set => RawValue = (ushort)((RawValue & ~0x1F) | (value & 0x1F)); + } + + public readonly bool HasValue => RawValue != 0; + + public DateOnly? Date + { + readonly get => HasValue && Month != 0 && Day != 0 && DateUtil.IsValidDate(Year, Month, Day) ? new DateOnly(Year, Month, Day) : null; + set + { + if (value is not { } date) + { + RawValue = 0; + return; + } + + Year = date.Year; + Month = date.Month; + Day = date.Day; + } + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueFan5.cs b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueFan5.cs new file mode 100644 index 000000000..c504782ea --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueFan5.cs @@ -0,0 +1,112 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; +using static PKHeX.Core.StringConverter5; + +namespace PKHeX.Core; + +public sealed class JoinAvenueFan5(Memory data) : IJoinAvenueEntity5 +{ + public const int SIZE = 0x60; + private Span Data => data.Span; + public string FileExtension => "jah5"; + public ReadOnlySpan Write() => Data; + public void CopyFrom(JoinAvenueFan5 other) => other.Data.CopyTo(Data); + + public string Name + { + get => GetString(Data[..0xE]); // no terminator + set => SetString(Data[..0xE], value, 7, Language); + } + + public byte Country { get => Data[0x0E]; set => Data[0x0E] = value; } + public byte Subregion { get => Data[0x0F]; set => Data[0x0F] = value; } + + public string Shout + { + get => GetString(Data[0x10..0x20]); + set => SetString(Data[0x10..0x20], value, 8, Language); + } + + public byte Version { get => Data[0x20]; set => Data[0x20] = value; } + public byte Language { get => Data[0x21]; set => Data[0x21] = value; } + + public byte Unknown22 + { + get => (byte)(Data[0x22] & 0x0F); + set => Data[0x22] = (byte)((Data[0x22] & 0xF0) | (value & 0x0F)); + } + + public byte Gender + { + get => (byte)(Data[0x22] >> 4); + set => Data[0x22] = (byte)((Data[0x22] & 0x0F) | ((value & 0x0F) << 4)); + } + + public byte Unused23 { get => Data[0x23]; set => Data[0x23] = value; } + + public ushort TID16 // strangely not ID32 (no SID16) + { + get => ReadUInt16LittleEndian(Data[0x24..]); + set => WriteUInt16LittleEndian(Data[0x24..], value); + } + + public byte Unknown26 { get => Data[0x26]; set => Data[0x26] = value; } + public byte Unknown27 { get => Data[0x27]; set => Data[0x27] = value; } + + public ushort PlayedTime + { + get => ReadUInt16LittleEndian(Data[0x28..]); + set => WriteUInt16LittleEndian(Data[0x28..], value); + } + + public ushort PlayedHours + { + get => (ushort)(PlayedTime & 0x03FF); + set => PlayedTime = (ushort)((PlayedTime & ~0x03FF) | (value & 0x03FF)); + } + + public byte PlayedMinutes + { + get => (byte)(PlayedTime >> 10); + set => PlayedTime = (ushort)((PlayedTime & 0x03FF) | ((value & 0x3F) << 10)); + } + + /// + /// Overworld Sprite ID + /// + public ushort Sprite + { + get => ReadUInt16LittleEndian(Data[0x2A..]); + set => WriteUInt16LittleEndian(Data[0x2A..], value); + } + + public string Greeting + { + get => GetString(Data[0x2C..0x3C]); + set => SetString(Data[0x2C..0x3C], value, 8, Language); + } + + public string Farewell + { + get => GetString(Data[0x3C..0x4C]); + set => SetString(Data[0x3C..0x4C], value, 8, Language); + } + + public byte Unknown4C { get => Data[0x4C]; set => Data[0x4C] = value; } + public byte Unknown4D { get => Data[0x4D]; set => Data[0x4D] = value; } + public byte Unknown4F { get => Data[0x4E]; set => Data[0x4E] = value; } + public bool IsInteractedToday { get => Data[0x4F] != 0; set => Data[0x4F] = (byte)(value ? 1 : 0); } + + public ushort Species { get => ReadUInt16LittleEndian(Data[0x50..]); set => WriteUInt16LittleEndian(Data[0x50..], value); } + public ushort Unknown52 { get => ReadUInt16LittleEndian(Data[0x52..]); set => WriteUInt16LittleEndian(Data[0x52..], value); } + + public byte Unknown54 { get => Data[0x54]; set => Data[0x54] = value; } + public byte BubbleTarget { get => Data[0x55]; set => Data[0x55] = value; } + public byte Unknown56 { get => Data[0x56]; set => Data[0x56] = value; } + public byte MetYear { get => Data[0x57]; set => Data[0x57] = value; } + public byte MetMonth { get => Data[0x58]; set => Data[0x58] = value; } + public byte MetDay { get => Data[0x59]; set => Data[0x59] = value; } + + public ushort Unknown5A { get => ReadUInt16LittleEndian(Data[0x5A..]); set => WriteUInt16LittleEndian(Data[0x5A..], value); } + public uint Seed { get => ReadUInt32LittleEndian(Data[0x5C..]); set => WriteUInt32LittleEndian(Data[0x5C..], value); } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueRecordIndex5.cs b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueRecordIndex5.cs new file mode 100644 index 000000000..17622870e --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueRecordIndex5.cs @@ -0,0 +1,14 @@ +namespace PKHeX.Core; + +public enum JoinAvenueRecordIndex5 : uint +{ + CountLinkTrade = 0, + CountNicknamed = 1, + CountCustomers = 2, + CountMoneySpent = 3, + CountPasserbyMet = 4, + CountLinkBattles = 5, + CountCaptured = 6, + CountEggHatched = 7, + COUNT_MAX = 8, +} diff --git a/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueSettings5.cs b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueSettings5.cs new file mode 100644 index 000000000..03fa7d960 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueSettings5.cs @@ -0,0 +1,109 @@ +using System; +using System.Runtime.InteropServices; +using static System.Buffers.Binary.BinaryPrimitives; +using static PKHeX.Core.StringConverter5; + +namespace PKHeX.Core; + +public sealed class JoinAvenueSettings5(Memory data, SAV5B2W2 sav) // 12F4 within the block, 24EF4 in SAV +{ + public const int SIZE = 0xEC; + private Span Data => data.Span; + + public string Name // 20 chars + terminator + { + get => GetString(Data[..0x2A]); + set => SetString(Data[..0x2A], value, 20, sav.Language); + } + + public string PlayerTitle // 20 chars + terminator + { + get => GetString(Data[0x2A..0x54]); + set => SetString(Data[0x2A..0x54], value, 20, sav.Language); + } + + // 32 visiting player trainer IDs remembered, reset daily. Store 0xFFFFFFFF for empty. + public const ushort CountVisitingPlayersRemembered = 32; + public const uint VisitingPlayerDefaultNone = uint.MaxValue; + + public Span VisitingPlayerDatabase => MemoryMarshal.Cast(Data.Slice(0x54, CountVisitingPlayersRemembered * sizeof(uint))); + + public uint GetVisitingPlayerTrainerID(int index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(index, CountVisitingPlayersRemembered); + return ReadUInt32LittleEndian(Data[(0x54 + (index * sizeof(uint)))..]); + } + + public void SetVisitingPlayerTrainerID(int index, uint value) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(index, CountVisitingPlayersRemembered); + WriteUInt32LittleEndian(Data[(0x54 + (index * sizeof(uint)))..], value); + } + + public uint Experience { get => ReadUInt32LittleEndian(Data[0xD4..]); set => WriteUInt32LittleEndian(Data[0xD4..], value); } + public ushort Rank { get => ReadUInt16LittleEndian(Data[0xD8..]); set => WriteUInt16LittleEndian(Data[0xD8..], Math.Min(value, MaxAvenueRank)); } + + public const ushort MaxAvenueRank = 9999; + + public JoinAvenueCeilingColor5 CeilingColor + { + get => (JoinAvenueCeilingColor5)ReadUInt16LittleEndian(Data[0xDA..]); + set => WriteUInt16LittleEndian(Data[0xDA..], (ushort)value); + } + + public uint Flags { get => ReadUInt32LittleEndian(Data[0xDC..]); set => WriteUInt32LittleEndian(Data[0xDC..], value); } + // ??? + + /// + /// is a database of trainer IDs that have been connected to the Join Avenue, managed as a circular buffer. + /// + public ushort VisitingPlayerDatabaseCount { get => ReadUInt16LittleEndian(Data[0xE0..]); set => WriteUInt16LittleEndian(Data[0xE0..], Math.Min(value, CountVisitingPlayersRemembered)); } + public ushort VistiingPlayerDatabaseInsertIndex { get => ReadUInt16LittleEndian(Data[0xE2..]); set => WriteUInt16LittleEndian(Data[0xE2..], (ushort)(value % CountVisitingPlayersRemembered)); } + + public uint Seed { get => ReadUInt32LittleEndian(Data[0xE4..]); set => WriteUInt32LittleEndian(Data[0xE4..], value); } + + public ushort PromotionDaysElapsed { get => ReadUInt16LittleEndian(Data[0xE8..]); set => WriteUInt16LittleEndian(Data[0xE8..], value); } + public bool IsPromotionActive { get => ReadUInt16LittleEndian(Data[0xEA..]) == 1; set => WriteUInt16LittleEndian(Data[0xEA..], value ? (ushort)1 : (ushort)0); } + + /// + /// A promotion being active only lasts a full week [0..6], and then expires on the 7th day, which is when the counter resets and the promotion must be activated again. + /// + public const ushort PromotionDaysMax = 7; + + /// + /// Adds the trainer ID to the database of players that have visited today. + /// + /// Player trainer ID to add. + /// Index at which the trainer ID was added. If the database is full, it will overwrite the oldest entry. + public int AddPlayerVisitor(uint id32) + { + int index = VistiingPlayerDatabaseInsertIndex; + SetVisitingPlayerTrainerID(index, id32); + + // setters will auto-clamp the count and wrap the index, so we can just increment and let it handle the rest + VisitingPlayerDatabaseCount = (ushort)(index + 1); + VisitingPlayerDatabaseCount++; + return index; + } + + /// + /// Daily reset to allow a player to visit again. + /// + public void ResetPlayerVisitList() + { + VisitingPlayerDatabase.Fill(VisitingPlayerDefaultNone); + VisitingPlayerDatabaseCount = 0; + VistiingPlayerDatabaseInsertIndex = 0; + } + + /// + /// Checks if the player has visited today. + /// + /// Player trainer ID to check for. + public bool HasPlayerVisitedToday(uint id32) + { + if (!BitConverter.IsLittleEndian) + id32 = ReverseEndianness(id32); + return VisitingPlayerDatabase[..VisitingPlayerDatabaseCount].Contains(id32); + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueShopType5.cs b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueShopType5.cs new file mode 100644 index 000000000..e4faebc20 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueShopType5.cs @@ -0,0 +1,15 @@ +namespace PKHeX.Core; + +public enum JoinAvenueShopType5 : ushort +{ + Raffle = 0, + Salon = 1, + Market = 2, + Florist = 3, + Dojo = 4, + Nurse = 5, + Antique = 6, + Cafe = 7, + + None = 0xFFFF, +} diff --git a/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueVisitor5.cs b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueVisitor5.cs new file mode 100644 index 000000000..dfc352594 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen5/Join Avenue/JoinAvenueVisitor5.cs @@ -0,0 +1,357 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; +using static PKHeX.Core.StringConverter5; + +namespace PKHeX.Core; + +public sealed class JoinAvenueVisitor5(Memory data) : IJoinAvenueEntity5 +{ + public const int SIZE = 0xC4; + private Span Data => data.Span; + public string FileExtension => "jav5"; + public ReadOnlySpan Write() => Data; + + public const int TriviaCount = 0x10; + public const int ActivityCount = 4; + public const byte ShopMaxLevel = 10; + + public void CopyFrom(JoinAvenueVisitor5 other) => other.Data.CopyTo(Data); + + public string Name + { + get => GetString(Data[..0xE]); // no terminator + set => SetString(Data[..0xE], value, 7, Language); + } + + public byte Country { get => Data[0x0E]; set => Data[0x0E] = value; } + public byte Subregion { get => Data[0x0F]; set => Data[0x0F] = value; } + + public string Shout + { + get => GetString(Data[0x10..0x20]); + set => SetString(Data[0x10..0x20], value, 8, Language); + } + + public byte Version { get => Data[0x20]; set => Data[0x20] = value; } + public byte Language { get => Data[0x21]; set => Data[0x21] = value; } + + public byte Unknown22 + { + get => (byte)(Data[0x22] & 0x0F); + set => Data[0x22] = (byte)((Data[0x22] & 0xF0) | (value & 0x0F)); + } + + public byte Gender + { + get => (byte)(Data[0x22] >> 4); + set => Data[0x22] = (byte)((Data[0x22] & 0x0F) | ((value & 0x0F) << 4)); + } + + public byte Unused23 { get => Data[0x23]; set => Data[0x23] = value; } + + public ushort TID16 + { + get => ReadUInt16LittleEndian(Data[0x24..]); + set => WriteUInt16LittleEndian(Data[0x24..], value); + } + + public byte Unknown26 { get => Data[0x26]; set => Data[0x26] = value; } + public byte Unknown27 { get => Data[0x27]; set => Data[0x27] = value; } + + public ushort PlayedTime + { + get => ReadUInt16LittleEndian(Data[0x28..]); + set => WriteUInt16LittleEndian(Data[0x28..], value); + } + + public ushort PlayedHours + { + get => (ushort)(PlayedTime & 0x03FF); + set => PlayedTime = (ushort)((PlayedTime & ~0x03FF) | (value & 0x03FF)); + } + + public byte PlayedMinutes + { + get => (byte)(PlayedTime >> 10); + set => PlayedTime = (ushort)((PlayedTime & 0x03FF) | ((value & 0x3F) << 10)); + } + + /// + /// Overworld Sprite ID + /// + public ushort Sprite + { + get => ReadUInt16LittleEndian(Data[0x2A..]); + set => WriteUInt16LittleEndian(Data[0x2A..], value); + } + + public bool IsFlag2C // nothing sets this flag to true? + { + get => (Data[0x2C] & 1) != 0; + set => Data[0x2C] = (byte)((Data[0x2C] & ~1) | (value ? 1 : 0)); + } + + public byte JoinAvenueLevel + { + get => (byte)(Data[0x2C] >> 1); + set => Data[0x2C] = (byte)((Data[0x2C] & 1) | ((value & 0x7F) << 1)); + } + + public byte Unused2D { get => Data[0x2D]; set => Data[0x2D] = value; } + + public ushort DesiredShopType + { + get => ReadUInt16LittleEndian(Data[0x2E..]); + set => WriteUInt16LittleEndian(Data[0x2E..], value); + } + + private uint ShopCounts + { + get => ReadUInt32LittleEndian(Data[0x30..]); + set => WriteUInt32LittleEndian(Data[0x30..], value); + } + + public byte ShopCountRaffle { get => (byte)(ShopCounts & 0xF); set => ShopCounts = (ShopCounts & ~0xFu) | (value & 0xFu); } + public byte ShopCountSalon { get => (byte)((ShopCounts >> 4) & 0xF); set => ShopCounts = (ShopCounts & ~(0xFu << 4)) | ((uint)(value & 0xF) << 4); } + public byte ShopCountMarket { get => (byte)((ShopCounts >> 8) & 0xF); set => ShopCounts = (ShopCounts & ~(0xFu << 8)) | ((uint)(value & 0xF) << 8); } + public byte ShopCountFlorist { get => (byte)((ShopCounts >> 12) & 0xF); set => ShopCounts = (ShopCounts & ~(0xFu << 12)) | ((uint)(value & 0xF) << 12); } + public byte ShopCountDojo { get => (byte)((ShopCounts >> 16) & 0xF); set => ShopCounts = (ShopCounts & ~(0xFu << 16)) | ((uint)(value & 0xF) << 16); } + public byte ShopCountNurse { get => (byte)((ShopCounts >> 20) & 0xF); set => ShopCounts = (ShopCounts & ~(0xFu << 20)) | ((uint)(value & 0xF) << 20); } + public byte ShopCountAntique { get => (byte)((ShopCounts >> 24) & 0xF); set => ShopCounts = (ShopCounts & ~(0xFu << 24)) | ((uint)(value & 0xF) << 24); } + public byte ShopCountCafe { get => (byte)((ShopCounts >> 28) & 0xF); set => ShopCounts = (ShopCounts & ~(0xFu << 28)) | ((uint)(value & 0xF) << 28); } + + private uint GameProgress + { + get => ReadUInt32LittleEndian(Data[0x34..]); + set => WriteUInt32LittleEndian(Data[0x34..], value); + } + + public ushort DexSeen + { + get => (ushort)(GameProgress & 0x03FF); + set => GameProgress = (GameProgress & ~0x03FFu) | (value & 0x03FFu); + } + + public ushort FavoriteSpecies + { + get => (ushort)((GameProgress >> 10) & 0x03FF); + set => GameProgress = (GameProgress & ~(0x03FFu << 10)) | (((uint)value & 0x03FF) << 10); + } + + public byte MedalRank + { + get => (byte)((GameProgress >> 20) & 0xFF); + set => GameProgress = (GameProgress & ~(0xFFu << 20)) | (((uint)value & 0xFF) << 20); + } + + public byte MedalHint { get => Data[0x38]; set => Data[0x38] = value; } + public byte MedalCount { get => Data[0x39]; set => Data[0x39] = value; } + + public JoinAvenueDate5 Date1 + { + get => new(ReadUInt16LittleEndian(Data[0x3A..])); + set => WriteUInt16LittleEndian(Data[0x3A..], value.RawValue); + } + + public JoinAvenueDate5 DateAdventureStart + { + get => new(ReadUInt16LittleEndian(Data[0x3C..])); + set => WriteUInt16LittleEndian(Data[0x3C..], value.RawValue); + } + + public JoinAvenueDate5 DateHallOfFame + { + get => new(ReadUInt16LittleEndian(Data[0x3E..])); + set => WriteUInt16LittleEndian(Data[0x3E..], value.RawValue); + } + + public uint GetRecord(JoinAvenueRecordIndex5 index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)JoinAvenueRecordIndex5.COUNT_MAX); + return ReadUInt32LittleEndian(Data[(0x40 + ((int)index * sizeof(uint)))..]); + } + + public void SetRecord(JoinAvenueRecordIndex5 index, uint value) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)JoinAvenueRecordIndex5.COUNT_MAX); + WriteUInt32LittleEndian(Data[(0x40 + ((int)index * sizeof(uint)))..], value); + } + + public byte GetTrivia(int index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(index, TriviaCount); + return Data[0x60 + index]; + } + + public void SetTrivia(int index, byte value) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(index, TriviaCount); + Data[0x60 + index] = value; + } + + public byte GetActivity(int index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(index, ActivityCount); + return Data[0x70 + index]; + } + + public void SetActivity(int index, byte value) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(index, ActivityCount); + Data[0x70 + index] = value; + } + + public JoinAvenueDate5 GetActivityDate(int index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(index, ActivityCount); + return new(ReadUInt16LittleEndian(Data[(0x74 + (index * sizeof(ushort)))..])); + } + + public void SetActivityDate(int index, JoinAvenueDate5 value) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(index, ActivityCount); + WriteUInt16LittleEndian(Data[(0x74 + (index * sizeof(ushort)))..], value.RawValue); + } + + public string Greeting + { + get => GetString(Data[0x80..0x90]); + set => SetString(Data[0x80..0x90], value, 8, Language); + } + + public string Farewell + { + get => GetString(Data[0x90..0xA0]); + set => SetString(Data[0x90..0xA0], value, 8, Language); + } + + public ushort Origin // 00 NPC, 01 Human Player + { + get => ReadUInt16LittleEndian(Data[0xA0..]); + set => WriteUInt16LittleEndian(Data[0xA0..], value); + } + + public byte UnusedA2 { get => Data[0xA2]; set => Data[0xA2] = value; } + public byte MetYear { get => Data[0xA3]; set => Data[0xA3] = value; } + public byte MetMonth { get => Data[0xA4]; set => Data[0xA4] = value; } + public byte MetDay { get => Data[0xA5]; set => Data[0xA5] = value; } + public byte MetHour { get => Data[0xA6]; set => Data[0xA6] = value; } + public byte MetMinute { get => Data[0xA7]; set => Data[0xA7] = value; } + public byte UnknownA8 { get => Data[0xA8]; set => Data[0xA8] = value; } + + public bool IsShopChangeAllowed + { + get => FlagUtil.GetFlag(Data, 0xA9, 0); + set => FlagUtil.SetFlag(Data, 0xA9, 0, value); + } + + public bool IsFlagA9_1 + { + get => FlagUtil.GetFlag(Data, 0xA9, 1); + set => FlagUtil.SetFlag(Data, 0xA9, 1, value); + } + + public bool IsFlagA9_2 + { + get => FlagUtil.GetFlag(Data, 0xA9, 2); + set => FlagUtil.SetFlag(Data, 0xA9, 2, value); + } + + // unused flags at 0xA9: 3,4,5,6 + + public bool IsInteractedToday + { + get => FlagUtil.GetFlag(Data, 0xA9, 7); + set => FlagUtil.SetFlag(Data, 0xA9, 7, value); + } + + public bool IsFlagAA + { + get => FlagUtil.GetFlag(Data, 0xAA, 0); + set => FlagUtil.SetFlag(Data, 0xAA, 0, value); + } + + // unused flags at 0xAA: 1,2,3,4,5,6,7 + + public byte JoinAvenueRank { get => Data[0xAB]; set => Data[0xAB] = value; } + public byte UnknownAC { get => Data[0xAC]; set => Data[0xAC] = value; } + public byte ShopLevel { get => Data[0xAD]; set => Data[0xAD] = Math.Min(ShopMaxLevel, value); } + + public ushort ShopExperience + { + get => ReadUInt16LittleEndian(Data[0xAE..]); + set => WriteUInt16LittleEndian(Data[0xAE..], value); + } + + public uint IsInventory // 0/1 + { + get => ReadUInt32LittleEndian(Data[0xB0..]); + set => WriteUInt32LittleEndian(Data[0xB0..], value); + } + + public JoinAvenueShopType5 ShopType + { + get => (JoinAvenueShopType5)ReadUInt16LittleEndian(Data[0xB4..]); + set => WriteUInt16LittleEndian(Data[0xB4..], (ushort)value); + } + + public ushort ShopWork + { + get => ReadUInt16LittleEndian(Data[0xB6..]); + set => WriteUInt16LittleEndian(Data[0xB6..], value); + } + + public uint UnusedB8 + { + get => ReadUInt32LittleEndian(Data[0xB8..]); + set => WriteUInt32LittleEndian(Data[0xB8..], value); + } + + private uint UnknownBits + { + get => ReadUInt32LittleEndian(Data[0xBC..]); + set => WriteUInt32LittleEndian(Data[0xBC..], value); + } + + public ushort UnknownBits0_8 + { + get => (ushort)(UnknownBits & 0x1FF); + set => UnknownBits = (UnknownBits & ~0x1FFu) | ((uint)value & 0x1FF); + } + + public bool IsUnknownBits9 + { + get => ((UnknownBits >> 9) & 1) != 0; + set => UnknownBits = (UnknownBits & ~(1u << 9)) | ((value ? 1u : 0u) << 9); + } + + public byte UnknownBits10 + { + get => (byte)((UnknownBits >> 10) & 0x7); + set => UnknownBits = (UnknownBits & ~(0x7u << 10)) | (((uint)value & 0x7) << 10); + } + + public byte UnknownBits13_20 + { + get => (byte)((UnknownBits >> 13) & 0xFF); + set => UnknownBits = (UnknownBits & ~(0xFFu << 13)) | (((uint)value & 0xFF) << 13); + } + + public byte UnknownBits21_27 + { + get => (byte)((UnknownBits >> 21) & 0x7F); + set => UnknownBits = (UnknownBits & ~(0x7Fu << 21)) | (((uint)value & 0x7F) << 21); + } + + public byte UnknownBits28_31 + { + get => (byte)((UnknownBits >> 28) & 0xF); + set => UnknownBits = (UnknownBits & ~(0xFu << 28)) | (((uint)value & 0xF) << 28); + } + + public uint Seed + { + get => ReadUInt32LittleEndian(Data[0xC0..]); + set => WriteUInt32LittleEndian(Data[0xC0..], value); + } +} diff --git a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs index b462c32f0..b0d985cbf 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs @@ -86,6 +86,7 @@ private void InitializeComponent() B_OpenUGSEditor = new System.Windows.Forms.Button(); B_OpenGeonetEditor = new System.Windows.Forms.Button(); B_OpenUnityTowerEditor = new System.Windows.Forms.Button(); + B_OpenJoinAvenueEditor = new System.Windows.Forms.Button(); B_OpenChatterEditor = new System.Windows.Forms.Button(); B_Roamer = new System.Windows.Forms.Button(); B_FestivalPlaza = new System.Windows.Forms.Button(); @@ -440,6 +441,7 @@ private void InitializeComponent() FLP_SAVtools.Controls.Add(B_OpenUGSEditor); FLP_SAVtools.Controls.Add(B_OpenGeonetEditor); FLP_SAVtools.Controls.Add(B_OpenUnityTowerEditor); + FLP_SAVtools.Controls.Add(B_OpenJoinAvenueEditor); FLP_SAVtools.Controls.Add(B_OpenChatterEditor); FLP_SAVtools.Controls.Add(B_Roamer); FLP_SAVtools.Controls.Add(B_FestivalPlaza); @@ -752,9 +754,20 @@ private void InitializeComponent() B_OpenUnityTowerEditor.UseVisualStyleBackColor = true; B_OpenUnityTowerEditor.Click += B_OpenUnityTowerEditor_Click; // + // B_OpenJoinAvenueEditor + // + B_OpenJoinAvenueEditor.Location = new System.Drawing.Point(212, 244); + B_OpenJoinAvenueEditor.Margin = new System.Windows.Forms.Padding(4); + B_OpenJoinAvenueEditor.Name = "B_OpenJoinAvenueEditor"; + B_OpenJoinAvenueEditor.Size = new System.Drawing.Size(96, 32); + B_OpenJoinAvenueEditor.TabIndex = 1; + B_OpenJoinAvenueEditor.Text = "Join Avenue"; + B_OpenJoinAvenueEditor.UseVisualStyleBackColor = true; + B_OpenJoinAvenueEditor.Click += B_OpenJoinAvenueEditor_Click; + // // B_OpenChatterEditor // - B_OpenChatterEditor.Location = new System.Drawing.Point(212, 244); + B_OpenChatterEditor.Location = new System.Drawing.Point(316, 244); B_OpenChatterEditor.Margin = new System.Windows.Forms.Padding(4); B_OpenChatterEditor.Name = "B_OpenChatterEditor"; B_OpenChatterEditor.Size = new System.Drawing.Size(96, 32); @@ -765,7 +778,7 @@ private void InitializeComponent() // // B_Roamer // - B_Roamer.Location = new System.Drawing.Point(316, 244); + B_Roamer.Location = new System.Drawing.Point(4, 284); B_Roamer.Margin = new System.Windows.Forms.Padding(4); B_Roamer.Name = "B_Roamer"; B_Roamer.Size = new System.Drawing.Size(96, 32); @@ -776,7 +789,7 @@ private void InitializeComponent() // // B_FestivalPlaza // - B_FestivalPlaza.Location = new System.Drawing.Point(4, 284); + B_FestivalPlaza.Location = new System.Drawing.Point(108, 284); B_FestivalPlaza.Margin = new System.Windows.Forms.Padding(4); B_FestivalPlaza.Name = "B_FestivalPlaza"; B_FestivalPlaza.Size = new System.Drawing.Size(96, 32); @@ -787,7 +800,7 @@ private void InitializeComponent() // // B_MailBox // - B_MailBox.Location = new System.Drawing.Point(108, 284); + B_MailBox.Location = new System.Drawing.Point(212, 284); B_MailBox.Margin = new System.Windows.Forms.Padding(4); B_MailBox.Name = "B_MailBox"; B_MailBox.Size = new System.Drawing.Size(96, 32); @@ -798,7 +811,7 @@ private void InitializeComponent() // // B_OpenApricorn // - B_OpenApricorn.Location = new System.Drawing.Point(212, 284); + B_OpenApricorn.Location = new System.Drawing.Point(316, 284); B_OpenApricorn.Margin = new System.Windows.Forms.Padding(4); B_OpenApricorn.Name = "B_OpenApricorn"; B_OpenApricorn.Size = new System.Drawing.Size(96, 32); @@ -809,7 +822,7 @@ private void InitializeComponent() // // B_Raids // - B_Raids.Location = new System.Drawing.Point(316, 284); + B_Raids.Location = new System.Drawing.Point(4, 324); B_Raids.Margin = new System.Windows.Forms.Padding(4); B_Raids.Name = "B_Raids"; B_Raids.Size = new System.Drawing.Size(96, 32); @@ -820,7 +833,7 @@ private void InitializeComponent() // // B_RaidsDLC1 // - B_RaidsDLC1.Location = new System.Drawing.Point(4, 324); + B_RaidsDLC1.Location = new System.Drawing.Point(108, 324); B_RaidsDLC1.Margin = new System.Windows.Forms.Padding(4); B_RaidsDLC1.Name = "B_RaidsDLC1"; B_RaidsDLC1.Size = new System.Drawing.Size(96, 32); @@ -831,7 +844,7 @@ private void InitializeComponent() // // B_RaidsDLC2 // - B_RaidsDLC2.Location = new System.Drawing.Point(108, 324); + B_RaidsDLC2.Location = new System.Drawing.Point(212, 324); B_RaidsDLC2.Margin = new System.Windows.Forms.Padding(4); B_RaidsDLC2.Name = "B_RaidsDLC2"; B_RaidsDLC2.Size = new System.Drawing.Size(96, 32); @@ -842,7 +855,7 @@ private void InitializeComponent() // // B_Blocks // - B_Blocks.Location = new System.Drawing.Point(212, 324); + B_Blocks.Location = new System.Drawing.Point(316, 324); B_Blocks.Margin = new System.Windows.Forms.Padding(4); B_Blocks.Name = "B_Blocks"; B_Blocks.Size = new System.Drawing.Size(96, 32); @@ -853,7 +866,7 @@ private void InitializeComponent() // // B_OtherSlots // - B_OtherSlots.Location = new System.Drawing.Point(316, 324); + B_OtherSlots.Location = new System.Drawing.Point(4, 364); B_OtherSlots.Margin = new System.Windows.Forms.Padding(4); B_OtherSlots.Name = "B_OtherSlots"; B_OtherSlots.Size = new System.Drawing.Size(96, 32); @@ -864,7 +877,7 @@ private void InitializeComponent() // // B_OpenSealStickers // - B_OpenSealStickers.Location = new System.Drawing.Point(4, 364); + B_OpenSealStickers.Location = new System.Drawing.Point(108, 364); B_OpenSealStickers.Margin = new System.Windows.Forms.Padding(4); B_OpenSealStickers.Name = "B_OpenSealStickers"; B_OpenSealStickers.Size = new System.Drawing.Size(96, 32); @@ -875,7 +888,7 @@ private void InitializeComponent() // // B_Poffins // - B_Poffins.Location = new System.Drawing.Point(108, 364); + B_Poffins.Location = new System.Drawing.Point(212, 364); B_Poffins.Margin = new System.Windows.Forms.Padding(4); B_Poffins.Name = "B_Poffins"; B_Poffins.Size = new System.Drawing.Size(96, 32); @@ -886,7 +899,7 @@ private void InitializeComponent() // // B_RaidsSevenStar // - B_RaidsSevenStar.Location = new System.Drawing.Point(212, 364); + B_RaidsSevenStar.Location = new System.Drawing.Point(316, 364); B_RaidsSevenStar.Margin = new System.Windows.Forms.Padding(4); B_RaidsSevenStar.Name = "B_RaidsSevenStar"; B_RaidsSevenStar.Size = new System.Drawing.Size(96, 32); @@ -897,7 +910,7 @@ private void InitializeComponent() // // B_OpenBattlePass // - B_OpenBattlePass.Location = new System.Drawing.Point(316, 364); + B_OpenBattlePass.Location = new System.Drawing.Point(4, 404); B_OpenBattlePass.Margin = new System.Windows.Forms.Padding(4); B_OpenBattlePass.Name = "B_OpenBattlePass"; B_OpenBattlePass.Size = new System.Drawing.Size(96, 32); @@ -908,7 +921,7 @@ private void InitializeComponent() // // B_OpenGear // - B_OpenGear.Location = new System.Drawing.Point(4, 404); + B_OpenGear.Location = new System.Drawing.Point(108, 404); B_OpenGear.Margin = new System.Windows.Forms.Padding(4); B_OpenGear.Name = "B_OpenGear"; B_OpenGear.Size = new System.Drawing.Size(96, 32); @@ -919,7 +932,7 @@ private void InitializeComponent() // // B_OpenFashion // - B_OpenFashion.Location = new System.Drawing.Point(108, 404); + B_OpenFashion.Location = new System.Drawing.Point(212, 404); B_OpenFashion.Margin = new System.Windows.Forms.Padding(4); B_OpenFashion.Name = "B_OpenFashion"; B_OpenFashion.Size = new System.Drawing.Size(96, 32); @@ -1104,6 +1117,7 @@ private void InitializeComponent() private System.Windows.Forms.Button B_OpenUGSEditor; private System.Windows.Forms.Button B_OpenGeonetEditor; private System.Windows.Forms.Button B_OpenUnityTowerEditor; + private System.Windows.Forms.Button B_OpenJoinAvenueEditor; private System.Windows.Forms.Button B_OpenChatterEditor; private System.Windows.Forms.Button B_Roamer; private System.Windows.Forms.Button B_FestivalPlaza; diff --git a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs index eb0bd769e..2410acd2d 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs @@ -645,6 +645,7 @@ private static void OpenDialog(Form f) private void B_OpenHoneyTreeEditor_Click(object sender, EventArgs e) => OpenDialog(new SAV_HoneyTree((SAV4Sinnoh)SAV)); private void B_OpenGeonetEditor_Click(object sender, EventArgs e) => OpenDialog(new SAV_Geonet4((SAV4)SAV)); private void B_OpenUnityTowerEditor_Click(object sender, EventArgs e) => OpenDialog(new SAV_UnityTower((SAV5)SAV)); + private void B_OpenJoinAvenueEditor_Click(object sender, EventArgs e) => OpenDialog(new SAV_JoinAvenue((SAV5B2W2)SAV)); private void B_OpenChatterEditor_Click(object sender, EventArgs e) => OpenDialog(new SAV_Chatter(SAV)); private void B_OpenGear_Click(object sender, EventArgs e) => OpenDialog(new SAV_Gear((SAV4BR)SAV)); private void B_Donuts_Click(object sender, EventArgs e) => OpenDialog(new SAV_Donut9a((SAV9ZA)SAV)); @@ -1310,6 +1311,7 @@ private void ToggleViewSubEditors(SaveFile sav) B_OpenUGSEditor.Visible = sav is SAV4Sinnoh or SAV8BS; B_OpenGeonetEditor.Visible = sav is SAV4; B_OpenUnityTowerEditor.Visible = sav is SAV5; + B_OpenJoinAvenueEditor.Visible = sav is SAV5B2W2; B_OpenChatterEditor.Visible = sav is SAV4 or SAV5; B_OpenBattlePass.Visible = B_OpenGear.Visible = sav is SAV4BR; B_OpenSealStickers.Visible = B_Poffins.Visible = sav is SAV8BS; diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index cfa7050e3..90c98624c 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -36,6 +36,7 @@ SAV_HallOfFame3=Ruhmeshallen-Editor SAV_HallOfFame7=Ruhmeshallen-Ansicht SAV_HoneyTree=Honigbaum-Editor SAV_Inventory=Inventar-Editor +SAV_JoinAvenue=Einklangspassage SAV_Link6=Pokémon-Link-Tool SAV_MailBox=Briefbox-Editor SAV_Misc2=Sonstiges @@ -234,6 +235,10 @@ GearCategory.Hands=Hände GearCategory.Head=Kopf GearCategory.Shoes=Schuhe GearCategory.Top=Oberteil +JoinAvenueCeilingColor5.Blue=Blau +JoinAvenueCeilingColor5.Green=Grün +JoinAvenueCeilingColor5.Orange=Orange +JoinAvenueCeilingColor5.Purple=Lila KChart.DGV_Ability0=Fähigkeit 1 KChart.DGV_Ability1=Fähigkeit 2 KChart.DGV_AbilityH=Versteckte Fähigkeit @@ -339,6 +344,7 @@ LocalizedDescription.PluginPath=Pfad zum Plugin-Ordner. LocalizedDescription.PreviewCursorShift=Zeigt einen Leuchteffekt um das Pokémon an, wenn man mit der Maus darüberfährt. LocalizedDescription.PreviewShowPaste=Zeigt das Pokémon im Showdown-Format in einer speziellen Vorschau an, wenn man mit der Maus darüberfährt. LocalizedDescription.RecentlyLoadedMaxCount=Anzahl der zuletzt geladenen Spielstände, die in der Historie gespeichert werden sollen. +LocalizedDescription.ResultsGridRowCount=Sichtbare Zeilenanzahl für das Sprite-Raster. Auf 5 bis 20 begrenzt. LocalizedDescription.RetainMetDateTransfer45=Behält das Funddatum beim Transfer von Generation 4 zu Generation 5 bei. 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. @@ -410,6 +416,7 @@ Main.B_OpenGeonetEditor=Geonet Main.B_OpenHallofFame=Ruhmeshalle Main.B_OpenHoneyTreeEditor=Honigbaum Main.B_OpenItemPouch=Items +Main.B_OpenJoinAvenueEditor=Einklangspassage Main.B_OpenLinkInfo=Pokémon-Link Main.B_OpenMiscEditor=Sonstiges Main.B_OpenOPowers=O-Kräfte @@ -1364,6 +1371,83 @@ SAV_Inventory.mnuSortIndex=Index SAV_Inventory.mnuSortIndexReverse=Index (rückwärts) SAV_Inventory.mnuSortName=Name SAV_Inventory.mnuSortNameReverse=Name (rückwärts) +SAV_JoinAvenue.B_Cancel=Abbrechen +SAV_JoinAvenue.B_Export=Exportieren +SAV_JoinAvenue.B_Import=Importieren +SAV_JoinAvenue.B_Save=Speichern +SAV_JoinAvenue.CHK_ScriptFlag=Skript-Flag +SAV_JoinAvenue.DGV_Column_Index=# +SAV_JoinAvenue.DGV_Column_SID=SID +SAV_JoinAvenue.DGV_Column_TID=TID +SAV_JoinAvenue.L_Activities=Aktivitäten: +SAV_JoinAvenue.L_ActivityDates=Aktivitätsdaten: +SAV_JoinAvenue.L_AvenueLevel=Passagenlevel: +SAV_JoinAvenue.L_BubbleTarget=Sprechblasen-Ziel: +SAV_JoinAvenue.L_CeilingColor=Deckenfarbe: +SAV_JoinAvenue.L_Country=Land: +SAV_JoinAvenue.L_Date1=Datum 1: +SAV_JoinAvenue.L_DateHall=Ruhmeshalle: +SAV_JoinAvenue.L_DateStart=Abenteuerbeginn: +SAV_JoinAvenue.L_DesiredShopType=Gewünschtes Geschäft: +SAV_JoinAvenue.L_DexSeen=Dex gesehen: +SAV_JoinAvenue.L_Experience=Erfahrung: +SAV_JoinAvenue.L_FanCount=Fan-Anzahl: +SAV_JoinAvenue.L_Farewell=Abschiedsgruß: +SAV_JoinAvenue.L_FavoriteSpecies=Starter: +SAV_JoinAvenue.L_Flags=Merkmale: +SAV_JoinAvenue.L_Greeting=Begrüßung: +SAV_JoinAvenue.L_InteractedToday=Heute interagiert: +SAV_JoinAvenue.L_IsInventory=Ist Inventar: +SAV_JoinAvenue.L_IsPromotionActive=Aktion aktiv: +SAV_JoinAvenue.L_IsShopChangeAllowed=Geschäft änderbar: +SAV_JoinAvenue.L_JoinAvenueRank=Passagenrang: +SAV_JoinAvenue.L_Language=Sprache: +SAV_JoinAvenue.L_MedalCount=Medaillenanzahl: +SAV_JoinAvenue.L_MedalHint=Medaillenhinweis: +SAV_JoinAvenue.L_MedalRank=Medaillenrang: +SAV_JoinAvenue.L_MetDay=Treff-Tag: +SAV_JoinAvenue.L_MetHour=Treff-Stunde: +SAV_JoinAvenue.L_MetMinute=Treff-Minute: +SAV_JoinAvenue.L_MetMonth=Treff-Monat: +SAV_JoinAvenue.L_MetYear=Treff-Jahr: +SAV_JoinAvenue.L_Name=Name: +SAV_JoinAvenue.L_Origin=Herkunft: +SAV_JoinAvenue.L_PlayedHours=Spielstunden: +SAV_JoinAvenue.L_PlayedMinutes=Spielminuten: +SAV_JoinAvenue.L_PlayerIDCount=Spieler-ID-Anzahl: +SAV_JoinAvenue.L_PlayerIDInsert=Spieler-ID-Einfügeindex: +SAV_JoinAvenue.L_Position0=Position 0: +SAV_JoinAvenue.L_Position1=Position 1: +SAV_JoinAvenue.L_Position2=Position 2: +SAV_JoinAvenue.L_PromotionDaysElapsed=Vergangene Aktionstage: +SAV_JoinAvenue.L_Rank=Rang: +SAV_JoinAvenue.L_Records=Rekorde: +SAV_JoinAvenue.L_Seed=Seed: +SAV_JoinAvenue.L_ShopCounts=Geschäftszähler: +SAV_JoinAvenue.L_ShopExperience=Erfahrung: +SAV_JoinAvenue.L_ShopLevel=Geschäftslevel: +SAV_JoinAvenue.L_ShopType=Geschäftstyp: +SAV_JoinAvenue.L_ShopWork=Geschäftsarbeit: +SAV_JoinAvenue.L_Shout=Ausruf: +SAV_JoinAvenue.L_Species=Spezies: +SAV_JoinAvenue.L_Sprite=Sprite: +SAV_JoinAvenue.L_Subregion=Unterregion: +SAV_JoinAvenue.L_TID16=Trainer-ID: +SAV_JoinAvenue.L_Title=Titel: +SAV_JoinAvenue.L_Trivia=Wissenswertes: +SAV_JoinAvenue.L_Version=Edition: +SAV_JoinAvenue.L_VisitingPlayerDatabase=Spieler-IDs: +SAV_JoinAvenue.L_VisitorCount=Besucheranzahl: +SAV_JoinAvenue.Tab_Assistants=Assistenten +SAV_JoinAvenue.Tab_Fans=Fans +SAV_JoinAvenue.Tab_General=Allgemein +SAV_JoinAvenue.Tab_Occupants=Bewohner +SAV_JoinAvenue.Tab_Self=Selbst +SAV_JoinAvenue.Tab_SelfGeneral=Allgemein +SAV_JoinAvenue.Tab_SelfSpecific=Spezifisch +SAV_JoinAvenue.Tab_Settings=Einstellungen +SAV_JoinAvenue.Tab_Specific=Spezifisch +SAV_JoinAvenue.Tab_Visitors=Besucher SAV_Link6.B_Cancel=Abbrechen SAV_Link6.B_Export=Exportieren SAV_Link6.B_Import=Importieren diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index 57ab179af..9eb627f47 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -36,6 +36,7 @@ SAV_HallOfFame3=Hall of Fame Viewer SAV_HallOfFame7=Hall of Fame Viewer SAV_HoneyTree=Honey Tree Editor SAV_Inventory=Inventory Editor +SAV_JoinAvenue=Join Avenue SAV_Link6=Pokémon Link Tool SAV_MailBox=MailBox Editor SAV_Misc2=Misc Editor @@ -234,6 +235,10 @@ GearCategory.Hands=Hands GearCategory.Head=Head GearCategory.Shoes=Shoes GearCategory.Top=Top +JoinAvenueCeilingColor5.Blue=Blue +JoinAvenueCeilingColor5.Green=Green +JoinAvenueCeilingColor5.Orange=Orange +JoinAvenueCeilingColor5.Purple=Purple KChart.DGV_Ability0=Ability 1 KChart.DGV_Ability1=Ability 2 KChart.DGV_AbilityH=Hidden Ability @@ -339,6 +344,7 @@ LocalizedDescription.PluginPath=Path to the plugins folder. LocalizedDescription.PreviewCursorShift=Show a Glow effect around the PKM on Hover LocalizedDescription.PreviewShowPaste=Show Showdown Paste in special Preview on Hover LocalizedDescription.RecentlyLoadedMaxCount=Amount of recently loaded save files to remember. +LocalizedDescription.ResultsGridRowCount=Visible row count for the sprite grid. Clamped from 5 to 20. LocalizedDescription.RetainMetDateTransfer45=Retain the Met Date when transferring from Generation 4 to Generation 5. 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. @@ -410,6 +416,7 @@ Main.B_OpenGeonetEditor=Geonet Main.B_OpenHallofFame=Hall of Fame Main.B_OpenHoneyTreeEditor=Honey Tree Main.B_OpenItemPouch=Items +Main.B_OpenJoinAvenueEditor=Join Avenue Main.B_OpenLinkInfo=Link Data Main.B_OpenMiscEditor=Misc Edits Main.B_OpenOPowers=O-Powers @@ -1364,6 +1371,83 @@ SAV_Inventory.mnuSortIndex=Index SAV_Inventory.mnuSortIndexReverse=Index (Reverse) SAV_Inventory.mnuSortName=Name SAV_Inventory.mnuSortNameReverse=Name (Reverse) +SAV_JoinAvenue.B_Cancel=Cancel +SAV_JoinAvenue.B_Export=Export +SAV_JoinAvenue.B_Import=Import +SAV_JoinAvenue.B_Save=Save +SAV_JoinAvenue.CHK_ScriptFlag=Script Flag +SAV_JoinAvenue.DGV_Column_Index=# +SAV_JoinAvenue.DGV_Column_SID=SID +SAV_JoinAvenue.DGV_Column_TID=TID +SAV_JoinAvenue.L_Activities=Activities: +SAV_JoinAvenue.L_ActivityDates=Activity Dates: +SAV_JoinAvenue.L_AvenueLevel=Avenue Level: +SAV_JoinAvenue.L_BubbleTarget=Text Bubble Target: +SAV_JoinAvenue.L_CeilingColor=Ceiling Color: +SAV_JoinAvenue.L_Country=Country: +SAV_JoinAvenue.L_Date1=Date1: +SAV_JoinAvenue.L_DateHall=Hall of Fame: +SAV_JoinAvenue.L_DateStart=Adventure Start: +SAV_JoinAvenue.L_DesiredShopType=Desired Shop: +SAV_JoinAvenue.L_DexSeen=Dex Seen: +SAV_JoinAvenue.L_Experience=Experience: +SAV_JoinAvenue.L_FanCount=Fan Count: +SAV_JoinAvenue.L_Farewell=Farewell: +SAV_JoinAvenue.L_FavoriteSpecies=Starter: +SAV_JoinAvenue.L_Flags=Flags: +SAV_JoinAvenue.L_Greeting=Greeting: +SAV_JoinAvenue.L_InteractedToday=Interacted Today: +SAV_JoinAvenue.L_IsInventory=Is Inventory: +SAV_JoinAvenue.L_IsPromotionActive=Is Promotion Active: +SAV_JoinAvenue.L_IsShopChangeAllowed=Can Change Shop: +SAV_JoinAvenue.L_JoinAvenueRank=Avenue Rank: +SAV_JoinAvenue.L_Language=Language: +SAV_JoinAvenue.L_MedalCount=Medal Count: +SAV_JoinAvenue.L_MedalHint=Medal Hint: +SAV_JoinAvenue.L_MedalRank=Medal Rank: +SAV_JoinAvenue.L_MetDay=Met Day: +SAV_JoinAvenue.L_MetHour=Met Hour: +SAV_JoinAvenue.L_MetMinute=Met Minute: +SAV_JoinAvenue.L_MetMonth=Met Month: +SAV_JoinAvenue.L_MetYear=Met Year: +SAV_JoinAvenue.L_Name=Name: +SAV_JoinAvenue.L_Origin=Origin: +SAV_JoinAvenue.L_PlayedHours=Played Hours: +SAV_JoinAvenue.L_PlayedMinutes=Played Minutes: +SAV_JoinAvenue.L_PlayerIDCount=Player ID Count: +SAV_JoinAvenue.L_PlayerIDInsert=Player ID Insert: +SAV_JoinAvenue.L_Position0=Position0: +SAV_JoinAvenue.L_Position1=Position1: +SAV_JoinAvenue.L_Position2=Position2: +SAV_JoinAvenue.L_PromotionDaysElapsed=Promotion Days Elapsed: +SAV_JoinAvenue.L_Rank=Rank: +SAV_JoinAvenue.L_Records=Records: +SAV_JoinAvenue.L_Seed=Seed: +SAV_JoinAvenue.L_ShopCounts=Shop Counts: +SAV_JoinAvenue.L_ShopExperience=Experience: +SAV_JoinAvenue.L_ShopLevel=Shop Level: +SAV_JoinAvenue.L_ShopType=Shop Type: +SAV_JoinAvenue.L_ShopWork=Shop Work: +SAV_JoinAvenue.L_Shout=Shout: +SAV_JoinAvenue.L_Species=Species: +SAV_JoinAvenue.L_Sprite=Sprite: +SAV_JoinAvenue.L_Subregion=Subregion: +SAV_JoinAvenue.L_TID16=Trainer ID: +SAV_JoinAvenue.L_Title=Title: +SAV_JoinAvenue.L_Trivia=Trivia: +SAV_JoinAvenue.L_Version=Version: +SAV_JoinAvenue.L_VisitingPlayerDatabase=Player IDs: +SAV_JoinAvenue.L_VisitorCount=Visitor Count: +SAV_JoinAvenue.Tab_Assistants=Assistants +SAV_JoinAvenue.Tab_Fans=Fans +SAV_JoinAvenue.Tab_General=General +SAV_JoinAvenue.Tab_Occupants=Occupants +SAV_JoinAvenue.Tab_Self=Self +SAV_JoinAvenue.Tab_SelfGeneral=General +SAV_JoinAvenue.Tab_SelfSpecific=Specific +SAV_JoinAvenue.Tab_Settings=Settings +SAV_JoinAvenue.Tab_Specific=Specific +SAV_JoinAvenue.Tab_Visitors=Visitors SAV_Link6.B_Cancel=Cancel SAV_Link6.B_Export=Export SAV_Link6.B_Import=Import diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index 17d279c07..f1efa5555 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -36,6 +36,7 @@ SAV_HallOfFame3=Visor del Salón de la Fama SAV_HallOfFame7=Visor del Salón de la Fama SAV_HoneyTree=Editor de Árbol de Miel SAV_Inventory=Editor de Inventario +SAV_JoinAvenue=Pasaje Unión SAV_Link6=Editor del Nexo Pokémon SAV_MailBox=Editor de Buzón SAV_Misc2=Editor Misceláneo @@ -234,6 +235,10 @@ GearCategory.Hands=Manos GearCategory.Head=Gorras GearCategory.Shoes=Calzado GearCategory.Top=Prendas +JoinAvenueCeilingColor5.Blue=Azul +JoinAvenueCeilingColor5.Green=Verde +JoinAvenueCeilingColor5.Orange=Naranja +JoinAvenueCeilingColor5.Purple=Morado KChart.DGV_Ability0=Habilidad 1 KChart.DGV_Ability1=Habilidad 2 KChart.DGV_AbilityH=Habilidad Oculta @@ -339,6 +344,7 @@ LocalizedDescription.PluginPath=Ruta a la carpeta de complementos. LocalizedDescription.PreviewCursorShift=Mostrar efecto brillante alrededor del PKM al pasar el mouse LocalizedDescription.PreviewShowPaste=Mostrar el texto del formato Showdown en la vista previa al pasar el mouse LocalizedDescription.RecentlyLoadedMaxCount=Número de partidas cargadas recientemente a mantener. +LocalizedDescription.ResultsGridRowCount=Cantidad de filas visibles para la cuadrícula de sprites. Se limita entre 5 y 20. LocalizedDescription.RetainMetDateTransfer45=Mantener la Fecha (de encuentro) al transferir de la 4a generación a la 5a generación. 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 comprobación de legalidad, marcar Severidad si se detecta que la lógica de verificación de tramas RNG no encuentra una coincidencia. @@ -410,6 +416,7 @@ Main.B_OpenGeonetEditor=Geonet Main.B_OpenHallofFame=Salón de Fama Main.B_OpenHoneyTreeEditor=Árbol de Miel Main.B_OpenItemPouch=Inventario +Main.B_OpenJoinAvenueEditor=Pasaje Unión Main.B_OpenLinkInfo=Datos Nexo Main.B_OpenMiscEditor=Misceláneo Main.B_OpenOPowers=Poder O @@ -1364,6 +1371,83 @@ SAV_Inventory.mnuSortIndex=Índice SAV_Inventory.mnuSortIndexReverse=Índice (inverso) SAV_Inventory.mnuSortName=Nombre SAV_Inventory.mnuSortNameReverse=Nombre (inverso) +SAV_JoinAvenue.B_Cancel=Cancelar +SAV_JoinAvenue.B_Export=Exportar +SAV_JoinAvenue.B_Import=Importar +SAV_JoinAvenue.B_Save=Guardar +SAV_JoinAvenue.CHK_ScriptFlag=Marca de script +SAV_JoinAvenue.DGV_Column_Index=# +SAV_JoinAvenue.DGV_Column_SID=SID +SAV_JoinAvenue.DGV_Column_TID=TID +SAV_JoinAvenue.L_Activities=Actividades: +SAV_JoinAvenue.L_ActivityDates=Fechas de actividad: +SAV_JoinAvenue.L_AvenueLevel=Nivel del pasaje: +SAV_JoinAvenue.L_BubbleTarget=Objetivo del globo de texto: +SAV_JoinAvenue.L_CeilingColor=Color del cielo raso: +SAV_JoinAvenue.L_Country=País: +SAV_JoinAvenue.L_Date1=Fecha 1: +SAV_JoinAvenue.L_DateHall=Hall de la Fama: +SAV_JoinAvenue.L_DateStart=Inicio de la aventura: +SAV_JoinAvenue.L_DesiredShopType=Tienda deseada: +SAV_JoinAvenue.L_DexSeen=Pokédex vista: +SAV_JoinAvenue.L_Experience=Experiencia: +SAV_JoinAvenue.L_FanCount=Cantidad de fans: +SAV_JoinAvenue.L_Farewell=Despedida: +SAV_JoinAvenue.L_FavoriteSpecies=Inicial: +SAV_JoinAvenue.L_Flags=Marcas: +SAV_JoinAvenue.L_Greeting=Saludo: +SAV_JoinAvenue.L_InteractedToday=Interactuó hoy: +SAV_JoinAvenue.L_IsInventory=Es inventario: +SAV_JoinAvenue.L_IsPromotionActive=Promoción activa: +SAV_JoinAvenue.L_IsShopChangeAllowed=Puede cambiar tienda: +SAV_JoinAvenue.L_JoinAvenueRank=Rango del pasaje: +SAV_JoinAvenue.L_Language=Idioma: +SAV_JoinAvenue.L_MedalCount=Cantidad de medallas: +SAV_JoinAvenue.L_MedalHint=Pista de medalla: +SAV_JoinAvenue.L_MedalRank=Rango de medalla: +SAV_JoinAvenue.L_MetDay=Día de encuentro: +SAV_JoinAvenue.L_MetHour=Hora de encuentro: +SAV_JoinAvenue.L_MetMinute=Minuto de encuentro: +SAV_JoinAvenue.L_MetMonth=Mes de encuentro: +SAV_JoinAvenue.L_MetYear=Año de encuentro: +SAV_JoinAvenue.L_Name=Nombre: +SAV_JoinAvenue.L_Origin=Origen: +SAV_JoinAvenue.L_PlayedHours=Horas jugadas: +SAV_JoinAvenue.L_PlayedMinutes=Minutos jugados: +SAV_JoinAvenue.L_PlayerIDCount=Cantidad de ID de jugadores: +SAV_JoinAvenue.L_PlayerIDInsert=Inserción de ID de jugador: +SAV_JoinAvenue.L_Position0=Posición 0: +SAV_JoinAvenue.L_Position1=Posición 1: +SAV_JoinAvenue.L_Position2=Posición 2: +SAV_JoinAvenue.L_PromotionDaysElapsed=Días de promoción transcurridos: +SAV_JoinAvenue.L_Rank=Rango: +SAV_JoinAvenue.L_Records=Récords: +SAV_JoinAvenue.L_Seed=Semilla: +SAV_JoinAvenue.L_ShopCounts=Conteo de tiendas: +SAV_JoinAvenue.L_ShopExperience=Experiencia: +SAV_JoinAvenue.L_ShopLevel=Nivel de la tienda: +SAV_JoinAvenue.L_ShopType=Tipo de tienda: +SAV_JoinAvenue.L_ShopWork=Trabajo de la tienda: +SAV_JoinAvenue.L_Shout=Exclamación: +SAV_JoinAvenue.L_Species=Especie: +SAV_JoinAvenue.L_Sprite=Imagen: +SAV_JoinAvenue.L_Subregion=Subregión: +SAV_JoinAvenue.L_TID16=ID de Entrenador: +SAV_JoinAvenue.L_Title=Título: +SAV_JoinAvenue.L_Trivia=Curiosidades: +SAV_JoinAvenue.L_Version=Versión: +SAV_JoinAvenue.L_VisitingPlayerDatabase=ID de jugadores: +SAV_JoinAvenue.L_VisitorCount=Cantidad de visitantes: +SAV_JoinAvenue.Tab_Assistants=Asistentes +SAV_JoinAvenue.Tab_Fans=Fans +SAV_JoinAvenue.Tab_General=General +SAV_JoinAvenue.Tab_Occupants=Ocupantes +SAV_JoinAvenue.Tab_Self=Propio +SAV_JoinAvenue.Tab_SelfGeneral=General +SAV_JoinAvenue.Tab_SelfSpecific=Específico +SAV_JoinAvenue.Tab_Settings=Ajustes +SAV_JoinAvenue.Tab_Specific=Específico +SAV_JoinAvenue.Tab_Visitors=Visitantes SAV_Link6.B_Cancel=Cancelar SAV_Link6.B_Export=Exportar SAV_Link6.B_Import=Importar diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index 798029a83..fb7008522 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -36,6 +36,7 @@ SAV_HallOfFame3=Visor del Hall de la Fama SAV_HallOfFame7=Visor del Hall de la Fama SAV_HoneyTree=Editor de Árbol de Miel SAV_Inventory=Editor de Inventario +SAV_JoinAvenue=Galería Unión SAV_Link6=Editor del Nexo Pokémon SAV_MailBox=Editor de Buzón SAV_Misc2=Editor de Varios @@ -234,6 +235,10 @@ GearCategory.Hands=Manos GearCategory.Head=Gorras GearCategory.Shoes=Calzado GearCategory.Top=Prendas +JoinAvenueCeilingColor5.Blue=Azul +JoinAvenueCeilingColor5.Green=Verde +JoinAvenueCeilingColor5.Orange=Naranja +JoinAvenueCeilingColor5.Purple=Morado KChart.DGV_Ability0=Habilidad 1 KChart.DGV_Ability1=Habilidad 2 KChart.DGV_AbilityH=Habilidad Oculta @@ -339,6 +344,7 @@ LocalizedDescription.PluginPath=Ruta a la carpeta de complementos. LocalizedDescription.PreviewCursorShift=Mostrar efecto brillante alrededor del PKM al pasar el ratón LocalizedDescription.PreviewShowPaste=Mostrar el texto del formato Showdown en la vista previa al pasar el ratón LocalizedDescription.RecentlyLoadedMaxCount=Número de partidas cargadas recientemente a mantener. +LocalizedDescription.ResultsGridRowCount=Cantidad de filas visibles para la cuadrícula de sprites. Se limita entre 5 y 20. LocalizedDescription.RetainMetDateTransfer45=Mantener la Fecha (de encuentro) al transferir de la 4a generación a la 5a generación. 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 comprobación de legalidad, marcar Severidad si se detecta que la lógica de verificación de tramas RNG no encuentra una coincidencia. @@ -410,6 +416,7 @@ Main.B_OpenGeonetEditor=Geonet Main.B_OpenHallofFame=Hall de la Fama Main.B_OpenHoneyTreeEditor=Árbol de Miel Main.B_OpenItemPouch=Inventario +Main.B_OpenJoinAvenueEditor=Galería Unión Main.B_OpenLinkInfo=Datos Nexo Main.B_OpenMiscEditor=Varios Main.B_OpenOPowers=Poder O @@ -1364,6 +1371,83 @@ SAV_Inventory.mnuSortIndex=Índice SAV_Inventory.mnuSortIndexReverse=Índice (inverso) SAV_Inventory.mnuSortName=Nombre SAV_Inventory.mnuSortNameReverse=Nombre (inverso) +SAV_JoinAvenue.B_Cancel=Cancelar +SAV_JoinAvenue.B_Export=Exportar +SAV_JoinAvenue.B_Import=Importar +SAV_JoinAvenue.B_Save=Guardar +SAV_JoinAvenue.CHK_ScriptFlag=Marca de script +SAV_JoinAvenue.DGV_Column_Index=# +SAV_JoinAvenue.DGV_Column_SID=SID +SAV_JoinAvenue.DGV_Column_TID=TID +SAV_JoinAvenue.L_Activities=Actividades: +SAV_JoinAvenue.L_ActivityDates=Fechas de actividad: +SAV_JoinAvenue.L_AvenueLevel=Nivel de la galería: +SAV_JoinAvenue.L_BubbleTarget=Objetivo del bocadillo de texto: +SAV_JoinAvenue.L_CeilingColor=Color del cielo raso: +SAV_JoinAvenue.L_Country=País: +SAV_JoinAvenue.L_Date1=Fecha 1: +SAV_JoinAvenue.L_DateHall=Hall de la Fama: +SAV_JoinAvenue.L_DateStart=Inicio de la aventura: +SAV_JoinAvenue.L_DesiredShopType=Tienda deseada: +SAV_JoinAvenue.L_DexSeen=Pokédex vista: +SAV_JoinAvenue.L_Experience=Experiencia: +SAV_JoinAvenue.L_FanCount=Cantidad de fans: +SAV_JoinAvenue.L_Farewell=Despedida: +SAV_JoinAvenue.L_FavoriteSpecies=Inicial: +SAV_JoinAvenue.L_Flags=Marcas: +SAV_JoinAvenue.L_Greeting=Saludo: +SAV_JoinAvenue.L_InteractedToday=Interactuó hoy: +SAV_JoinAvenue.L_IsInventory=Es inventario: +SAV_JoinAvenue.L_IsPromotionActive=Promoción activa: +SAV_JoinAvenue.L_IsShopChangeAllowed=Puede cambiar tienda: +SAV_JoinAvenue.L_JoinAvenueRank=Rango de la galería: +SAV_JoinAvenue.L_Language=Idioma: +SAV_JoinAvenue.L_MedalCount=Cantidad de medallas: +SAV_JoinAvenue.L_MedalHint=Pista de medalla: +SAV_JoinAvenue.L_MedalRank=Rango de medalla: +SAV_JoinAvenue.L_MetDay=Día de encuentro: +SAV_JoinAvenue.L_MetHour=Hora de encuentro: +SAV_JoinAvenue.L_MetMinute=Minuto de encuentro: +SAV_JoinAvenue.L_MetMonth=Mes de encuentro: +SAV_JoinAvenue.L_MetYear=Año de encuentro: +SAV_JoinAvenue.L_Name=Nombre: +SAV_JoinAvenue.L_Origin=Origen: +SAV_JoinAvenue.L_PlayedHours=Horas jugadas: +SAV_JoinAvenue.L_PlayedMinutes=Minutos jugados: +SAV_JoinAvenue.L_PlayerIDCount=Cantidad de ID de jugadores: +SAV_JoinAvenue.L_PlayerIDInsert=Inserción de ID de jugador: +SAV_JoinAvenue.L_Position0=Posición 0: +SAV_JoinAvenue.L_Position1=Posición 1: +SAV_JoinAvenue.L_Position2=Posición 2: +SAV_JoinAvenue.L_PromotionDaysElapsed=Días de promoción transcurridos: +SAV_JoinAvenue.L_Rank=Rango: +SAV_JoinAvenue.L_Records=Récords: +SAV_JoinAvenue.L_Seed=Semilla: +SAV_JoinAvenue.L_ShopCounts=Conteo de tiendas: +SAV_JoinAvenue.L_ShopExperience=Experiencia: +SAV_JoinAvenue.L_ShopLevel=Nivel de la tienda: +SAV_JoinAvenue.L_ShopType=Tipo de tienda: +SAV_JoinAvenue.L_ShopWork=Trabajo de la tienda: +SAV_JoinAvenue.L_Shout=Exclamación: +SAV_JoinAvenue.L_Species=Especie: +SAV_JoinAvenue.L_Sprite=Imagen: +SAV_JoinAvenue.L_Subregion=Subregión: +SAV_JoinAvenue.L_TID16=ID de Entrenador: +SAV_JoinAvenue.L_Title=Título: +SAV_JoinAvenue.L_Trivia=Curiosidades: +SAV_JoinAvenue.L_Version=Versión: +SAV_JoinAvenue.L_VisitingPlayerDatabase=ID de jugadores: +SAV_JoinAvenue.L_VisitorCount=Cantidad de visitantes: +SAV_JoinAvenue.Tab_Assistants=Asistentes +SAV_JoinAvenue.Tab_Fans=Fans +SAV_JoinAvenue.Tab_General=General +SAV_JoinAvenue.Tab_Occupants=Ocupantes +SAV_JoinAvenue.Tab_Self=Propio +SAV_JoinAvenue.Tab_SelfGeneral=General +SAV_JoinAvenue.Tab_SelfSpecific=Específico +SAV_JoinAvenue.Tab_Settings=Ajustes +SAV_JoinAvenue.Tab_Specific=Específico +SAV_JoinAvenue.Tab_Visitors=Visitantes SAV_Link6.B_Cancel=Cancelar SAV_Link6.B_Export=Exportar SAV_Link6.B_Import=Importar diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index 797e55f34..8bf7e715f 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -36,6 +36,7 @@ SAV_HallOfFame3=Visualiseur Panthéon SAV_HallOfFame7=Visualiseur Panthéon SAV_HoneyTree=Éditeur d'arbres à miel SAV_Inventory=Éditeur de l'inventaire +SAV_JoinAvenue=Galerie Concorde SAV_Link6=Outil Poké Lien SAV_MailBox=Éditeur de boîtes aux lettres SAV_Misc2=Éditeur divers @@ -234,6 +235,10 @@ GearCategory.Hands=Mains GearCategory.Head=Tête GearCategory.Shoes=Chaussures GearCategory.Top=Haut +JoinAvenueCeilingColor5.Blue=Bleu +JoinAvenueCeilingColor5.Green=Vert +JoinAvenueCeilingColor5.Orange=Orange +JoinAvenueCeilingColor5.Purple=Violet KChart.DGV_Ability0=Talent 1 KChart.DGV_Ability1=Talent 2 KChart.DGV_AbilityH=Talent Caché @@ -339,6 +344,7 @@ LocalizedDescription.PluginPath=Chemin vers le dossier plugins. LocalizedDescription.PreviewCursorShift=Affiche un effet de surbrillance autour du Pokémon au survol LocalizedDescription.PreviewShowPaste=Montrer le format de copié-collé Showdown dans un aperçu spécial au survol LocalizedDescription.RecentlyLoadedMaxCount=Quantité de fichiers de sauvegarde récents devant être mémorisés. +LocalizedDescription.ResultsGridRowCount=Nombre de lignes visibles pour la grille de sprites. Limité entre 5 et 20. LocalizedDescription.RetainMetDateTransfer45=Conservé la Date de Rencontre lors du transfert de la 4ème génération à la 5ème génération. LocalizedDescription.ReturnNoneIfEmptySearch=Saute la recherche si l'utilisateur a oublié de saisir Espèce / Capacité(s) dans les critères de recherche. LocalizedDescription.RNGFrameNotFound3=Degré de sévérité pour signaler lors d'une Vérification de la Légalité si la logique de vérification des frames RNG ne trouve pas de correspondance pour les rencontres en 3ème génération. @@ -410,6 +416,7 @@ Main.B_OpenGeonetEditor=Géonet Main.B_OpenHallofFame=Panthéon Main.B_OpenHoneyTreeEditor=Arbres à miel Main.B_OpenItemPouch=Objets +Main.B_OpenJoinAvenueEditor=Galerie Concorde Main.B_OpenLinkInfo=Poké Lien Main.B_OpenMiscEditor=Éditeur divers Main.B_OpenOPowers=O-Auras @@ -1364,6 +1371,83 @@ SAV_Inventory.mnuSortIndex=Index SAV_Inventory.mnuSortIndexReverse=Index (inversé) SAV_Inventory.mnuSortName=Nom SAV_Inventory.mnuSortNameReverse=Nom (inversé) +SAV_JoinAvenue.B_Cancel=Annuler +SAV_JoinAvenue.B_Export=Exporter +SAV_JoinAvenue.B_Import=Importer +SAV_JoinAvenue.B_Save=Enregistrer +SAV_JoinAvenue.CHK_ScriptFlag=Drapeau script +SAV_JoinAvenue.DGV_Column_Index=# +SAV_JoinAvenue.DGV_Column_SID=SID +SAV_JoinAvenue.DGV_Column_TID=TID +SAV_JoinAvenue.L_Activities=Activités : +SAV_JoinAvenue.L_ActivityDates=Dates d'activité : +SAV_JoinAvenue.L_AvenueLevel=Niveau de la galerie : +SAV_JoinAvenue.L_BubbleTarget=Cible de bulle de texte : +SAV_JoinAvenue.L_CeilingColor=Couleur du plafond : +SAV_JoinAvenue.L_Country=Pays : +SAV_JoinAvenue.L_Date1=Date 1 : +SAV_JoinAvenue.L_DateHall=Panthéon : +SAV_JoinAvenue.L_DateStart=Début de l'aventure : +SAV_JoinAvenue.L_DesiredShopType=Boutique souhaitée : +SAV_JoinAvenue.L_DexSeen=Pokédex vu : +SAV_JoinAvenue.L_Experience=Expérience : +SAV_JoinAvenue.L_FanCount=Nombre de fans : +SAV_JoinAvenue.L_Farewell=Au revoir : +SAV_JoinAvenue.L_FavoriteSpecies=Starter : +SAV_JoinAvenue.L_Flags=Drapeaux : +SAV_JoinAvenue.L_Greeting=Salutation : +SAV_JoinAvenue.L_InteractedToday=Interaction aujourd'hui : +SAV_JoinAvenue.L_IsInventory=Est inventaire : +SAV_JoinAvenue.L_IsPromotionActive=Promotion active : +SAV_JoinAvenue.L_IsShopChangeAllowed=Peut changer de boutique : +SAV_JoinAvenue.L_JoinAvenueRank=Rang de la galerie : +SAV_JoinAvenue.L_Language=Langue : +SAV_JoinAvenue.L_MedalCount=Nombre de médailles : +SAV_JoinAvenue.L_MedalHint=Indice médaille : +SAV_JoinAvenue.L_MedalRank=Rang de médaille : +SAV_JoinAvenue.L_MetDay=Jour de rencontre : +SAV_JoinAvenue.L_MetHour=Heure de rencontre : +SAV_JoinAvenue.L_MetMinute=Minute de rencontre : +SAV_JoinAvenue.L_MetMonth=Mois de rencontre : +SAV_JoinAvenue.L_MetYear=Année de rencontre : +SAV_JoinAvenue.L_Name=Nom : +SAV_JoinAvenue.L_Origin=Origine : +SAV_JoinAvenue.L_PlayedHours=Heures de jeu : +SAV_JoinAvenue.L_PlayedMinutes=Minutes de jeu : +SAV_JoinAvenue.L_PlayerIDCount=Nombre d'ID joueurs : +SAV_JoinAvenue.L_PlayerIDInsert=Insertion d'ID joueur : +SAV_JoinAvenue.L_Position0=Position 0 : +SAV_JoinAvenue.L_Position1=Position 1 : +SAV_JoinAvenue.L_Position2=Position 2 : +SAV_JoinAvenue.L_PromotionDaysElapsed=Jours de promotion écoulés : +SAV_JoinAvenue.L_Rank=Rang : +SAV_JoinAvenue.L_Records=Records : +SAV_JoinAvenue.L_Seed=Graine : +SAV_JoinAvenue.L_ShopCounts=Compteurs des boutiques : +SAV_JoinAvenue.L_ShopExperience=Expérience : +SAV_JoinAvenue.L_ShopLevel=Niveau de boutique : +SAV_JoinAvenue.L_ShopType=Type de boutique : +SAV_JoinAvenue.L_ShopWork=Activité de boutique : +SAV_JoinAvenue.L_Shout=Cri : +SAV_JoinAvenue.L_Species=Espèce : +SAV_JoinAvenue.L_Sprite=Sprite : +SAV_JoinAvenue.L_Subregion=Sous-région : +SAV_JoinAvenue.L_TID16=ID Dresseur : +SAV_JoinAvenue.L_Title=Titre : +SAV_JoinAvenue.L_Trivia=Anecdotes : +SAV_JoinAvenue.L_Version=Version : +SAV_JoinAvenue.L_VisitingPlayerDatabase=ID joueurs : +SAV_JoinAvenue.L_VisitorCount=Nombre de visiteurs : +SAV_JoinAvenue.Tab_Assistants=Assistants +SAV_JoinAvenue.Tab_Fans=Fans +SAV_JoinAvenue.Tab_General=Général +SAV_JoinAvenue.Tab_Occupants=Occupants +SAV_JoinAvenue.Tab_Self=Moi +SAV_JoinAvenue.Tab_SelfGeneral=Général +SAV_JoinAvenue.Tab_SelfSpecific=Spécifique +SAV_JoinAvenue.Tab_Settings=Paramètres +SAV_JoinAvenue.Tab_Specific=Spécifique +SAV_JoinAvenue.Tab_Visitors=Visiteurs SAV_Link6.B_Cancel=Annuler SAV_Link6.B_Export=Exporter SAV_Link6.B_Import=Importer diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index c23245dd3..d7cb8f981 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -36,6 +36,7 @@ SAV_HallOfFame3=Visualizzatore Sala d'Onore SAV_HallOfFame7=Visualizzatore Sala d'Onore SAV_HoneyTree=Editor Alberi di Miele SAV_Inventory=Editor Inventario +SAV_JoinAvenue=Galleria Solidarietà SAV_Link6=Strumenti Link SAV_MailBox=Editor Messaggi SAV_Misc2=Editor Varie @@ -234,6 +235,10 @@ GearCategory.Hands=Mani GearCategory.Head=Testa GearCategory.Shoes=Scarpe GearCategory.Top=Sopra +JoinAvenueCeilingColor5.Blue=Blu +JoinAvenueCeilingColor5.Green=Verde +JoinAvenueCeilingColor5.Orange=Arancione +JoinAvenueCeilingColor5.Purple=Viola KChart.DGV_Ability0=Abilità 1 KChart.DGV_Ability1=Abilità 2 KChart.DGV_AbilityH=Abilità speciale @@ -339,6 +344,7 @@ LocalizedDescription.PluginPath=Percorso della cartella dei plugin. LocalizedDescription.PreviewCursorShift=Mostra un effetto bagliore attorno al PKM al passaggio del mouse. LocalizedDescription.PreviewShowPaste=Mostra il formato Showdown Paste nell'anteprima speciale al passaggio del mouse. LocalizedDescription.RecentlyLoadedMaxCount=Numero di file di salvataggio caricati recentemente da ricordare. +LocalizedDescription.ResultsGridRowCount=Numero di righe visibili per la griglia degli sprite. Limitato da 5 a 20. LocalizedDescription.RetainMetDateTransfer45=Mantieni la Data di Incontro durante il trasferimento dalla Gen 4 alla Gen 5. 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. @@ -410,6 +416,7 @@ Main.B_OpenGeonetEditor=Geonet Main.B_OpenHallofFame=Sala d'Onore Main.B_OpenHoneyTreeEditor=Alberi di Miele Main.B_OpenItemPouch=Strumenti +Main.B_OpenJoinAvenueEditor=Galleria Solidarietà Main.B_OpenLinkInfo=Dati Link Main.B_OpenMiscEditor=Mod. Varie Main.B_OpenOPowers=Poteri O @@ -1364,6 +1371,83 @@ SAV_Inventory.mnuSortIndex=Indice SAV_Inventory.mnuSortIndexReverse=Indice (Reverse) SAV_Inventory.mnuSortName=Nome SAV_Inventory.mnuSortNameReverse=Nome (Reverse) +SAV_JoinAvenue.B_Cancel=Annulla +SAV_JoinAvenue.B_Export=Esporta +SAV_JoinAvenue.B_Import=Importa +SAV_JoinAvenue.B_Save=Salva +SAV_JoinAvenue.CHK_ScriptFlag=Flag script +SAV_JoinAvenue.DGV_Column_Index=# +SAV_JoinAvenue.DGV_Column_SID=SID +SAV_JoinAvenue.DGV_Column_TID=TID +SAV_JoinAvenue.L_Activities=Attività: +SAV_JoinAvenue.L_ActivityDates=Date attività: +SAV_JoinAvenue.L_AvenueLevel=Livello galleria: +SAV_JoinAvenue.L_BubbleTarget=Bersaglio fumetto: +SAV_JoinAvenue.L_CeilingColor=Colore del soffitto: +SAV_JoinAvenue.L_Country=Paese: +SAV_JoinAvenue.L_Date1=Data 1: +SAV_JoinAvenue.L_DateHall=Sala d'Onore: +SAV_JoinAvenue.L_DateStart=Inizio avventura: +SAV_JoinAvenue.L_DesiredShopType=Negozio desiderato: +SAV_JoinAvenue.L_DexSeen=Pokédex visto: +SAV_JoinAvenue.L_Experience=Esperienza: +SAV_JoinAvenue.L_FanCount=Numero fan: +SAV_JoinAvenue.L_Farewell=Addio: +SAV_JoinAvenue.L_FavoriteSpecies=Iniziale: +SAV_JoinAvenue.L_Flags=Flag: +SAV_JoinAvenue.L_Greeting=Saluto: +SAV_JoinAvenue.L_InteractedToday=Interagito oggi: +SAV_JoinAvenue.L_IsInventory=È inventario: +SAV_JoinAvenue.L_IsPromotionActive=Promozione attiva: +SAV_JoinAvenue.L_IsShopChangeAllowed=Può cambiare negozio: +SAV_JoinAvenue.L_JoinAvenueRank=Rango galleria: +SAV_JoinAvenue.L_Language=Lingua: +SAV_JoinAvenue.L_MedalCount=Numero medaglie: +SAV_JoinAvenue.L_MedalHint=Suggerimento medaglia: +SAV_JoinAvenue.L_MedalRank=Rango medaglia: +SAV_JoinAvenue.L_MetDay=Giorno incontro: +SAV_JoinAvenue.L_MetHour=Ora incontro: +SAV_JoinAvenue.L_MetMinute=Minuto incontro: +SAV_JoinAvenue.L_MetMonth=Mese incontro: +SAV_JoinAvenue.L_MetYear=Anno incontro: +SAV_JoinAvenue.L_Name=Nome: +SAV_JoinAvenue.L_Origin=Origine: +SAV_JoinAvenue.L_PlayedHours=Ore di gioco: +SAV_JoinAvenue.L_PlayedMinutes=Minuti di gioco: +SAV_JoinAvenue.L_PlayerIDCount=Conteggio ID giocatore: +SAV_JoinAvenue.L_PlayerIDInsert=Inserimento ID giocatore: +SAV_JoinAvenue.L_Position0=Posizione 0: +SAV_JoinAvenue.L_Position1=Posizione 1: +SAV_JoinAvenue.L_Position2=Posizione 2: +SAV_JoinAvenue.L_PromotionDaysElapsed=Giorni promozione trascorsi: +SAV_JoinAvenue.L_Rank=Rango: +SAV_JoinAvenue.L_Records=Record: +SAV_JoinAvenue.L_Seed=Seme: +SAV_JoinAvenue.L_ShopCounts=Conteggi negozi: +SAV_JoinAvenue.L_ShopExperience=Esperienza: +SAV_JoinAvenue.L_ShopLevel=Livello negozio: +SAV_JoinAvenue.L_ShopType=Tipo di negozio: +SAV_JoinAvenue.L_ShopWork=Lavoro negozio: +SAV_JoinAvenue.L_Shout=Grido: +SAV_JoinAvenue.L_Species=Specie: +SAV_JoinAvenue.L_Sprite=Immagine: +SAV_JoinAvenue.L_Subregion=Sottoregione: +SAV_JoinAvenue.L_TID16=ID Allenatore: +SAV_JoinAvenue.L_Title=Titolo: +SAV_JoinAvenue.L_Trivia=Curiosità: +SAV_JoinAvenue.L_Version=Versione: +SAV_JoinAvenue.L_VisitingPlayerDatabase=ID giocatori: +SAV_JoinAvenue.L_VisitorCount=Numero visitatori: +SAV_JoinAvenue.Tab_Assistants=Assistenti +SAV_JoinAvenue.Tab_Fans=Fan +SAV_JoinAvenue.Tab_General=Generale +SAV_JoinAvenue.Tab_Occupants=Occupanti +SAV_JoinAvenue.Tab_Self=Io +SAV_JoinAvenue.Tab_SelfGeneral=Generale +SAV_JoinAvenue.Tab_SelfSpecific=Specifico +SAV_JoinAvenue.Tab_Settings=Impostazioni +SAV_JoinAvenue.Tab_Specific=Specifico +SAV_JoinAvenue.Tab_Visitors=Visitatori SAV_Link6.B_Cancel=Annulla SAV_Link6.B_Export=Esporta SAV_Link6.B_Import=Importa diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index 09b07a560..6519e45f4 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -36,6 +36,7 @@ SAV_HallOfFame3=殿堂入りデータビューア SAV_HallOfFame7=殿堂入りデータビューア SAV_HoneyTree=あまいかおりのするき SAV_Inventory=アイテム +SAV_JoinAvenue=ジョインアベニュー SAV_Link6=ポケモンリンク SAV_MailBox=メールボックス SAV_Misc2=その他 @@ -234,6 +235,10 @@ GearCategory.Hands=うで GearCategory.Head=あたま GearCategory.Shoes=くつ GearCategory.Top=トップ +JoinAvenueCeilingColor5.Blue=青 +JoinAvenueCeilingColor5.Green=緑 +JoinAvenueCeilingColor5.Orange=オレンジ +JoinAvenueCeilingColor5.Purple=紫 KChart.DGV_Ability0=特性1 KChart.DGV_Ability1=特性2 KChart.DGV_AbilityH=隠れ特性 @@ -339,6 +344,7 @@ LocalizedDescription.PluginPath=Path to the plugins folder. LocalizedDescription.PreviewCursorShift=Show a Glow effect around the PKM on Hover LocalizedDescription.PreviewShowPaste=Show Showdown Paste in special Preview on Hover LocalizedDescription.RecentlyLoadedMaxCount=最近開いたファイルを記録する数。 +LocalizedDescription.ResultsGridRowCount=スプライトグリッドの表示行数。5から20の範囲に制限されます。 LocalizedDescription.RetainMetDateTransfer45=4世代から5世代に送った時、であった場所を保持する。 LocalizedDescription.ReturnNoneIfEmptySearch=ユーザーがポケモンや技の入力をしなかった場合、検索をスキップする。 LocalizedDescription.RNGFrameNotFound3=第3世代の乱数生成にはない個体が見つかった場合、正規チェックにフラグを立てる。 @@ -410,6 +416,7 @@ Main.B_OpenGeonetEditor=ジオネット Main.B_OpenHallofFame=殿堂入り Main.B_OpenHoneyTreeEditor=ミツの木 Main.B_OpenItemPouch=アイテム +Main.B_OpenJoinAvenueEditor=ジョインアベニュー Main.B_OpenLinkInfo=ポケモンリンク Main.B_OpenMiscEditor=その他 Main.B_OpenOPowers= Oパワー @@ -1364,6 +1371,83 @@ SAV_Inventory.mnuSortIndex=種類順(昇順) SAV_Inventory.mnuSortIndexReverse=種類順(降順) SAV_Inventory.mnuSortName=名前順(昇順) SAV_Inventory.mnuSortNameReverse=名前順(降順) +SAV_JoinAvenue.B_Cancel=キャンセル +SAV_JoinAvenue.B_Export=エクスポート +SAV_JoinAvenue.B_Import=インポート +SAV_JoinAvenue.B_Save=保存 +SAV_JoinAvenue.CHK_ScriptFlag=スクリプトフラグ +SAV_JoinAvenue.DGV_Column_Index=# +SAV_JoinAvenue.DGV_Column_SID=SID +SAV_JoinAvenue.DGV_Column_TID=TID +SAV_JoinAvenue.L_Activities=アクティビティ: +SAV_JoinAvenue.L_ActivityDates=活動日付: +SAV_JoinAvenue.L_AvenueLevel=アベニューLv: +SAV_JoinAvenue.L_BubbleTarget=吹き出し対象: +SAV_JoinAvenue.L_CeilingColor=天井カラー: +SAV_JoinAvenue.L_Country=国: +SAV_JoinAvenue.L_Date1=日付1: +SAV_JoinAvenue.L_DateHall=殿堂入り: +SAV_JoinAvenue.L_DateStart=冒険開始: +SAV_JoinAvenue.L_DesiredShopType=希望のお店: +SAV_JoinAvenue.L_DexSeen=図鑑発見数: +SAV_JoinAvenue.L_Experience=経験値: +SAV_JoinAvenue.L_FanCount=ファン数: +SAV_JoinAvenue.L_Farewell=さよなら: +SAV_JoinAvenue.L_FavoriteSpecies=御三家: +SAV_JoinAvenue.L_Flags=フラグ: +SAV_JoinAvenue.L_Greeting=あいさつ: +SAV_JoinAvenue.L_InteractedToday=本日交流済み: +SAV_JoinAvenue.L_IsInventory=在庫フラグ: +SAV_JoinAvenue.L_IsPromotionActive=セール中: +SAV_JoinAvenue.L_IsShopChangeAllowed=店変更可: +SAV_JoinAvenue.L_JoinAvenueRank=アベニューランク: +SAV_JoinAvenue.L_Language=言語: +SAV_JoinAvenue.L_MedalCount=メダル数: +SAV_JoinAvenue.L_MedalHint=メダルヒント: +SAV_JoinAvenue.L_MedalRank=メダルランク: +SAV_JoinAvenue.L_MetDay=出会った日: +SAV_JoinAvenue.L_MetHour=出会った時: +SAV_JoinAvenue.L_MetMinute=出会った分: +SAV_JoinAvenue.L_MetMonth=出会った月: +SAV_JoinAvenue.L_MetYear=出会った年: +SAV_JoinAvenue.L_Name=名前: +SAV_JoinAvenue.L_Origin=出身: +SAV_JoinAvenue.L_PlayedHours=プレイ時間: +SAV_JoinAvenue.L_PlayedMinutes=プレイ分: +SAV_JoinAvenue.L_PlayerIDCount=プレイヤーID数: +SAV_JoinAvenue.L_PlayerIDInsert=プレイヤーID挿入位置: +SAV_JoinAvenue.L_Position0=位置0: +SAV_JoinAvenue.L_Position1=位置1: +SAV_JoinAvenue.L_Position2=位置2: +SAV_JoinAvenue.L_PromotionDaysElapsed=セール経過日数: +SAV_JoinAvenue.L_Rank=ランク: +SAV_JoinAvenue.L_Records=記録: +SAV_JoinAvenue.L_Seed=シード: +SAV_JoinAvenue.L_ShopCounts=店数: +SAV_JoinAvenue.L_ShopExperience=経験値: +SAV_JoinAvenue.L_ShopLevel=店レベル: +SAV_JoinAvenue.L_ShopType=店タイプ: +SAV_JoinAvenue.L_ShopWork=店作業: +SAV_JoinAvenue.L_Shout=ひとこと: +SAV_JoinAvenue.L_Species=種族: +SAV_JoinAvenue.L_Sprite=スプライト: +SAV_JoinAvenue.L_Subregion=地域: +SAV_JoinAvenue.L_TID16=トレーナーID: +SAV_JoinAvenue.L_Title=称号: +SAV_JoinAvenue.L_Trivia=トリビア: +SAV_JoinAvenue.L_Version=バージョン: +SAV_JoinAvenue.L_VisitingPlayerDatabase=プレイヤーID: +SAV_JoinAvenue.L_VisitorCount=来訪者数: +SAV_JoinAvenue.Tab_Assistants=アシスタント +SAV_JoinAvenue.Tab_Fans=ファン +SAV_JoinAvenue.Tab_General=基本 +SAV_JoinAvenue.Tab_Occupants=入居者 +SAV_JoinAvenue.Tab_Self=自分 +SAV_JoinAvenue.Tab_SelfGeneral=基本 +SAV_JoinAvenue.Tab_SelfSpecific=詳細 +SAV_JoinAvenue.Tab_Settings=設定 +SAV_JoinAvenue.Tab_Specific=詳細 +SAV_JoinAvenue.Tab_Visitors=訪問者 SAV_Link6.B_Cancel=キャンセル SAV_Link6.B_Export=エクスポート SAV_Link6.B_Import=インポート diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index 64f6235b2..7b74c805c 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -36,6 +36,7 @@ SAV_HallOfFame3=전당등록 편집 도구 SAV_HallOfFame7=전당등록 편집 도구 SAV_HoneyTree=꿀바른 나무 편집 도구 SAV_Inventory=인벤토리 편집 도구 +SAV_JoinAvenue=조인애버뉴 SAV_Link6=포켓몬 링크 도구 SAV_MailBox=메일박스 편집 도구 SAV_Misc2=기타 편집 도구 @@ -234,6 +235,10 @@ GearCategory.Hands=Hands GearCategory.Head=Head GearCategory.Shoes=Shoes GearCategory.Top=Top +JoinAvenueCeilingColor5.Blue=파랑 +JoinAvenueCeilingColor5.Green=초록 +JoinAvenueCeilingColor5.Orange=주황 +JoinAvenueCeilingColor5.Purple=보라 KChart.DGV_Ability0=특성 1 KChart.DGV_Ability1=특성 2 KChart.DGV_AbilityH=숨겨진 특성 @@ -339,6 +344,7 @@ LocalizedDescription.PluginPath=플러그인 폴더의 경로입니다. LocalizedDescription.PreviewCursorShift=포켓몬 위에 마우스를 올렸을 때, 해당 포켓몬 주위에 발광 효과를 표시합니다. LocalizedDescription.PreviewShowPaste=포켓몬 위에 마우스를 올렸을 때, 특수 미리보기 창에 Showdown 텍스트를 표시합니다. LocalizedDescription.RecentlyLoadedMaxCount=기억할 최근 불러온 세이브 파일의 개수입니다. +LocalizedDescription.ResultsGridRowCount=스프라이트 그리드에 표시할 행 수입니다. 5에서 20 사이로 제한됩니다. LocalizedDescription.RetainMetDateTransfer45=4세대에서 5세대로 포켓몬을 옮길 때, 만난 날짜를 유지합니다. LocalizedDescription.ReturnNoneIfEmptySearch=검색 조건에 종류이나 기술을 입력하지 않은 경우, 검색을 생략하고 결과를 반환하지 않습니다. LocalizedDescription.RNGFrameNotFound3=3세대 인카운터에 대해 RNG 프레임 확인 로직이 일치하는 항목을 찾지 못할 경우, 합법성 검사 플래그의 심각도입니다. @@ -410,6 +416,7 @@ Main.B_OpenGeonetEditor=지오넷 Main.B_OpenHallofFame=명예의 전당 Main.B_OpenHoneyTreeEditor=꿀바른 나무 Main.B_OpenItemPouch=아이템 +Main.B_OpenJoinAvenueEditor=조인애버뉴 Main.B_OpenLinkInfo=링크 데이터 Main.B_OpenMiscEditor=기타 편집 Main.B_OpenOPowers=O파워 @@ -1364,6 +1371,83 @@ SAV_Inventory.mnuSortIndex=번호 SAV_Inventory.mnuSortIndexReverse=번호 (역순) SAV_Inventory.mnuSortName=이름 SAV_Inventory.mnuSortNameReverse=이름 (역순) +SAV_JoinAvenue.B_Cancel=취소 +SAV_JoinAvenue.B_Export=내보내기 +SAV_JoinAvenue.B_Import=가져오기 +SAV_JoinAvenue.B_Save=저장 +SAV_JoinAvenue.CHK_ScriptFlag=스크립트 플래그 +SAV_JoinAvenue.DGV_Column_Index=# +SAV_JoinAvenue.DGV_Column_SID=SID +SAV_JoinAvenue.DGV_Column_TID=TID +SAV_JoinAvenue.L_Activities=활동: +SAV_JoinAvenue.L_ActivityDates=활동 날짜: +SAV_JoinAvenue.L_AvenueLevel=애버뉴 레벨: +SAV_JoinAvenue.L_BubbleTarget=말풍선 대상: +SAV_JoinAvenue.L_CeilingColor=천장 색상: +SAV_JoinAvenue.L_Country=국가: +SAV_JoinAvenue.L_Date1=날짜1: +SAV_JoinAvenue.L_DateHall=전당등록: +SAV_JoinAvenue.L_DateStart=모험 시작: +SAV_JoinAvenue.L_DesiredShopType=희망 점포: +SAV_JoinAvenue.L_DexSeen=도감 본 수: +SAV_JoinAvenue.L_Experience=경험치: +SAV_JoinAvenue.L_FanCount=팬 수: +SAV_JoinAvenue.L_Farewell=작별인사: +SAV_JoinAvenue.L_FavoriteSpecies=스타팅: +SAV_JoinAvenue.L_Flags=플래그: +SAV_JoinAvenue.L_Greeting=인사: +SAV_JoinAvenue.L_InteractedToday=오늘 상호작용함: +SAV_JoinAvenue.L_IsInventory=재고 여부: +SAV_JoinAvenue.L_IsPromotionActive=프로모션 활성화: +SAV_JoinAvenue.L_IsShopChangeAllowed=점포 변경 가능: +SAV_JoinAvenue.L_JoinAvenueRank=애버뉴 랭크: +SAV_JoinAvenue.L_Language=언어: +SAV_JoinAvenue.L_MedalCount=메달 수: +SAV_JoinAvenue.L_MedalHint=메달 힌트: +SAV_JoinAvenue.L_MedalRank=메달 랭크: +SAV_JoinAvenue.L_MetDay=만난 날: +SAV_JoinAvenue.L_MetHour=만난 시: +SAV_JoinAvenue.L_MetMinute=만난 분: +SAV_JoinAvenue.L_MetMonth=만난 월: +SAV_JoinAvenue.L_MetYear=만난 년: +SAV_JoinAvenue.L_Name=이름: +SAV_JoinAvenue.L_Origin=출신: +SAV_JoinAvenue.L_PlayedHours=플레이 시간: +SAV_JoinAvenue.L_PlayedMinutes=플레이 분: +SAV_JoinAvenue.L_PlayerIDCount=플레이어 ID 수: +SAV_JoinAvenue.L_PlayerIDInsert=플레이어 ID 삽입 위치: +SAV_JoinAvenue.L_Position0=위치 0: +SAV_JoinAvenue.L_Position1=위치 1: +SAV_JoinAvenue.L_Position2=위치 2: +SAV_JoinAvenue.L_PromotionDaysElapsed=프로모션 경과일: +SAV_JoinAvenue.L_Rank=랭크: +SAV_JoinAvenue.L_Records=기록: +SAV_JoinAvenue.L_Seed=시드: +SAV_JoinAvenue.L_ShopCounts=점포 수: +SAV_JoinAvenue.L_ShopExperience=경험치: +SAV_JoinAvenue.L_ShopLevel=점포 레벨: +SAV_JoinAvenue.L_ShopType=점포 종류: +SAV_JoinAvenue.L_ShopWork=점포 작업: +SAV_JoinAvenue.L_Shout=외침: +SAV_JoinAvenue.L_Species=종족: +SAV_JoinAvenue.L_Sprite=스프라이트: +SAV_JoinAvenue.L_Subregion=하위 지역: +SAV_JoinAvenue.L_TID16=트레이너 ID: +SAV_JoinAvenue.L_Title=칭호: +SAV_JoinAvenue.L_Trivia=잡학: +SAV_JoinAvenue.L_Version=버전: +SAV_JoinAvenue.L_VisitingPlayerDatabase=플레이어 ID: +SAV_JoinAvenue.L_VisitorCount=방문자 수: +SAV_JoinAvenue.Tab_Assistants=어시스턴트 +SAV_JoinAvenue.Tab_Fans=팬 +SAV_JoinAvenue.Tab_General=일반 +SAV_JoinAvenue.Tab_Occupants=입주자 +SAV_JoinAvenue.Tab_Self=자신 +SAV_JoinAvenue.Tab_SelfGeneral=일반 +SAV_JoinAvenue.Tab_SelfSpecific=상세 +SAV_JoinAvenue.Tab_Settings=설정 +SAV_JoinAvenue.Tab_Specific=상세 +SAV_JoinAvenue.Tab_Visitors=방문자 SAV_Link6.B_Cancel=취소 SAV_Link6.B_Export=내보내기 SAV_Link6.B_Import=가져오기 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index 5a3a1cba6..eefbca4bf 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -36,6 +36,7 @@ SAV_HallOfFame3=名人堂 SAV_HallOfFame7=名人堂 SAV_HoneyTree=甜甜蜜树编辑 SAV_Inventory=物品栏 +SAV_JoinAvenue=汇合大道 SAV_Link6=宝可梦连接工具 SAV_MailBox=邮箱编辑 SAV_Misc2=杂项编辑 @@ -234,6 +235,10 @@ GearCategory.Hands=手部 GearCategory.Head=头部 GearCategory.Shoes=鞋子 GearCategory.Top=上装 +JoinAvenueCeilingColor5.Blue=蓝色 +JoinAvenueCeilingColor5.Green=绿色 +JoinAvenueCeilingColor5.Orange=橙色 +JoinAvenueCeilingColor5.Purple=紫色 KChart.DGV_Ability0=特性1 KChart.DGV_Ability1=特性2 KChart.DGV_AbilityH=隐藏特性 @@ -339,6 +344,7 @@ LocalizedDescription.PluginPath=插件文件夹路径。 LocalizedDescription.PreviewCursorShift=悬停时在 PKM 周围时显示发光效果。 LocalizedDescription.PreviewShowPaste=在悬停在特殊预览中显示Showdown粘贴。 LocalizedDescription.RecentlyLoadedMaxCount=记住最近加载的存档文件数量。 +LocalizedDescription.ResultsGridRowCount=精灵网格的可见行数。限制在 5 到 20 之间。 LocalizedDescription.RetainMetDateTransfer45=在从第4代转移到第5代时保留相遇日期。 LocalizedDescription.ReturnNoneIfEmptySearch=如果用户忘记在搜索条件中输入种类/招式,则跳过搜索。 LocalizedDescription.RNGFrameNotFound3=如果 RNG 帧检查逻辑未找到第3代遭遇的匹配项,则标记合法性检查的严重性。 @@ -410,6 +416,7 @@ Main.B_OpenGeonetEditor=地理网 Main.B_OpenHallofFame=名人堂 Main.B_OpenHoneyTreeEditor=甜甜蜜树 Main.B_OpenItemPouch=道具 +Main.B_OpenJoinAvenueEditor=汇合大道 Main.B_OpenLinkInfo=宝可梦连接 Main.B_OpenMiscEditor=杂项编辑 Main.B_OpenOPowers=O-力量 @@ -1364,6 +1371,83 @@ SAV_Inventory.mnuSortIndex=序号 SAV_Inventory.mnuSortIndexReverse=序号(反向) SAV_Inventory.mnuSortName=名称 SAV_Inventory.mnuSortNameReverse=名称(反向) +SAV_JoinAvenue.B_Cancel=取消 +SAV_JoinAvenue.B_Export=导出 +SAV_JoinAvenue.B_Import=导入 +SAV_JoinAvenue.B_Save=保存 +SAV_JoinAvenue.CHK_ScriptFlag=脚本标记 +SAV_JoinAvenue.DGV_Column_Index=# +SAV_JoinAvenue.DGV_Column_SID=SID +SAV_JoinAvenue.DGV_Column_TID=TID +SAV_JoinAvenue.L_Activities=活动: +SAV_JoinAvenue.L_ActivityDates=活动日期: +SAV_JoinAvenue.L_AvenueLevel=大道等级: +SAV_JoinAvenue.L_BubbleTarget=对话气泡目标: +SAV_JoinAvenue.L_CeilingColor=天花板颜色: +SAV_JoinAvenue.L_Country=国家: +SAV_JoinAvenue.L_Date1=日期1: +SAV_JoinAvenue.L_DateHall=冠军殿堂: +SAV_JoinAvenue.L_DateStart=冒险开始: +SAV_JoinAvenue.L_DesiredShopType=期望店铺: +SAV_JoinAvenue.L_DexSeen=图鉴已见: +SAV_JoinAvenue.L_Experience=经验: +SAV_JoinAvenue.L_FanCount=粉丝数量: +SAV_JoinAvenue.L_Farewell=告别: +SAV_JoinAvenue.L_FavoriteSpecies=御三家: +SAV_JoinAvenue.L_Flags=标记: +SAV_JoinAvenue.L_Greeting=问候: +SAV_JoinAvenue.L_InteractedToday=今日已互动: +SAV_JoinAvenue.L_IsInventory=是否库存: +SAV_JoinAvenue.L_IsPromotionActive=促销进行中: +SAV_JoinAvenue.L_IsShopChangeAllowed=可更换店铺: +SAV_JoinAvenue.L_JoinAvenueRank=大道排名: +SAV_JoinAvenue.L_Language=语言: +SAV_JoinAvenue.L_MedalCount=勋章数量: +SAV_JoinAvenue.L_MedalHint=勋章提示: +SAV_JoinAvenue.L_MedalRank=勋章等级: +SAV_JoinAvenue.L_MetDay=遇见日: +SAV_JoinAvenue.L_MetHour=遇见时: +SAV_JoinAvenue.L_MetMinute=遇见分: +SAV_JoinAvenue.L_MetMonth=遇见月: +SAV_JoinAvenue.L_MetYear=遇见年: +SAV_JoinAvenue.L_Name=名称: +SAV_JoinAvenue.L_Origin=来源: +SAV_JoinAvenue.L_PlayedHours=游玩小时: +SAV_JoinAvenue.L_PlayedMinutes=游玩分钟: +SAV_JoinAvenue.L_PlayerIDCount=玩家ID数量: +SAV_JoinAvenue.L_PlayerIDInsert=玩家ID插入位置: +SAV_JoinAvenue.L_Position0=位置0: +SAV_JoinAvenue.L_Position1=位置1: +SAV_JoinAvenue.L_Position2=位置2: +SAV_JoinAvenue.L_PromotionDaysElapsed=促销已过天数: +SAV_JoinAvenue.L_Rank=等级: +SAV_JoinAvenue.L_Records=记录: +SAV_JoinAvenue.L_Seed=种子: +SAV_JoinAvenue.L_ShopCounts=店铺计数: +SAV_JoinAvenue.L_ShopExperience=经验: +SAV_JoinAvenue.L_ShopLevel=店铺等级: +SAV_JoinAvenue.L_ShopType=店铺类型: +SAV_JoinAvenue.L_ShopWork=店铺工作: +SAV_JoinAvenue.L_Shout=口号: +SAV_JoinAvenue.L_Species=种族: +SAV_JoinAvenue.L_Sprite=精灵图: +SAV_JoinAvenue.L_Subregion=子地区: +SAV_JoinAvenue.L_TID16=训练家ID: +SAV_JoinAvenue.L_Title=称号: +SAV_JoinAvenue.L_Trivia=趣闻: +SAV_JoinAvenue.L_Version=版本: +SAV_JoinAvenue.L_VisitingPlayerDatabase=玩家ID: +SAV_JoinAvenue.L_VisitorCount=访客数量: +SAV_JoinAvenue.Tab_Assistants=助手 +SAV_JoinAvenue.Tab_Fans=粉丝 +SAV_JoinAvenue.Tab_General=常规 +SAV_JoinAvenue.Tab_Occupants=入驻者 +SAV_JoinAvenue.Tab_Self=自身 +SAV_JoinAvenue.Tab_SelfGeneral=常规 +SAV_JoinAvenue.Tab_SelfSpecific=详细 +SAV_JoinAvenue.Tab_Settings=设置 +SAV_JoinAvenue.Tab_Specific=详细 +SAV_JoinAvenue.Tab_Visitors=访客 SAV_Link6.B_Cancel=取消 SAV_Link6.B_Export=导出 SAV_Link6.B_Import=导入 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index c0b8d46cd..029874bea 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -36,6 +36,7 @@ SAV_HallOfFame3=名人堂 SAV_HallOfFame7=名人堂 SAV_HoneyTree=甜甜蜜樹編輯 SAV_Inventory=物品欄 +SAV_JoinAvenue=匯合大道 SAV_Link6=寶可夢連接工具 SAV_MailBox=郵箱編輯 SAV_Misc2=訓練家資料雜項編輯 @@ -234,6 +235,10 @@ GearCategory.Hands=手部 GearCategory.Head=頭部 GearCategory.Shoes=鞋子 GearCategory.Top=上裝 +JoinAvenueCeilingColor5.Blue=藍色 +JoinAvenueCeilingColor5.Green=綠色 +JoinAvenueCeilingColor5.Orange=橙色 +JoinAvenueCeilingColor5.Purple=紫色 KChart.DGV_Ability0=特性1 KChart.DGV_Ability1=特性2 KChart.DGV_AbilityH=隱藏特性 @@ -339,6 +344,7 @@ LocalizedDescription.PluginPath=插件資料夾路徑。 LocalizedDescription.PreviewCursorShift=滑鼠懸停在 PKM 周圍時顯示發光效果。 LocalizedDescription.PreviewShowPaste=在特殊預覽中懸停時顯示Showdown粘貼。 LocalizedDescription.RecentlyLoadedMaxCount=記住最近加載的存檔文件數量。 +LocalizedDescription.ResultsGridRowCount=精靈網格的可見行數。限制在 5 到 20 之間。 LocalizedDescription.RetainMetDateTransfer45=從第4代轉移到第5代時保留相遇日期。 LocalizedDescription.ReturnNoneIfEmptySearch=如果使用者忘記在搜尋條件中輸入種類/招式,則跳過搜尋。 LocalizedDescription.RNGFrameNotFound3=RNG幀匹配度合法性檢查等級。 @@ -410,6 +416,7 @@ Main.B_OpenGeonetEditor=寰宇網 Main.B_OpenHallofFame=名人堂 Main.B_OpenHoneyTreeEditor=甜甜蜜樹 Main.B_OpenItemPouch=道具 +Main.B_OpenJoinAvenueEditor=匯合大道 Main.B_OpenLinkInfo=寶可夢連接 Main.B_OpenMiscEditor=雜項編輯 Main.B_OpenOPowers=O-力量 @@ -1364,6 +1371,83 @@ SAV_Inventory.mnuSortIndex=序號 SAV_Inventory.mnuSortIndexReverse=序號(反向) SAV_Inventory.mnuSortName=名稱 SAV_Inventory.mnuSortNameReverse=名稱(反向) +SAV_JoinAvenue.B_Cancel=取消 +SAV_JoinAvenue.B_Export=匯出 +SAV_JoinAvenue.B_Import=匯入 +SAV_JoinAvenue.B_Save=儲存 +SAV_JoinAvenue.CHK_ScriptFlag=腳本旗標 +SAV_JoinAvenue.DGV_Column_Index=# +SAV_JoinAvenue.DGV_Column_SID=SID +SAV_JoinAvenue.DGV_Column_TID=TID +SAV_JoinAvenue.L_Activities=活動: +SAV_JoinAvenue.L_ActivityDates=活動日期: +SAV_JoinAvenue.L_AvenueLevel=大道等級: +SAV_JoinAvenue.L_BubbleTarget=對話氣泡目標: +SAV_JoinAvenue.L_CeilingColor=天花板顏色: +SAV_JoinAvenue.L_Country=國家: +SAV_JoinAvenue.L_Date1=日期1: +SAV_JoinAvenue.L_DateHall=冠軍殿堂: +SAV_JoinAvenue.L_DateStart=冒險開始: +SAV_JoinAvenue.L_DesiredShopType=期望店鋪: +SAV_JoinAvenue.L_DexSeen=圖鑑已見: +SAV_JoinAvenue.L_Experience=經驗: +SAV_JoinAvenue.L_FanCount=粉絲數量: +SAV_JoinAvenue.L_Farewell=告別: +SAV_JoinAvenue.L_FavoriteSpecies=御三家: +SAV_JoinAvenue.L_Flags=旗標: +SAV_JoinAvenue.L_Greeting=問候: +SAV_JoinAvenue.L_InteractedToday=今日已互動: +SAV_JoinAvenue.L_IsInventory=是否庫存: +SAV_JoinAvenue.L_IsPromotionActive=促銷進行中: +SAV_JoinAvenue.L_IsShopChangeAllowed=可更換店鋪: +SAV_JoinAvenue.L_JoinAvenueRank=大道排名: +SAV_JoinAvenue.L_Language=語言: +SAV_JoinAvenue.L_MedalCount=勳章數量: +SAV_JoinAvenue.L_MedalHint=勳章提示: +SAV_JoinAvenue.L_MedalRank=勳章等級: +SAV_JoinAvenue.L_MetDay=遇見日: +SAV_JoinAvenue.L_MetHour=遇見時: +SAV_JoinAvenue.L_MetMinute=遇見分: +SAV_JoinAvenue.L_MetMonth=遇見月: +SAV_JoinAvenue.L_MetYear=遇見年: +SAV_JoinAvenue.L_Name=名稱: +SAV_JoinAvenue.L_Origin=來源: +SAV_JoinAvenue.L_PlayedHours=遊玩小時: +SAV_JoinAvenue.L_PlayedMinutes=遊玩分鐘: +SAV_JoinAvenue.L_PlayerIDCount=玩家ID數量: +SAV_JoinAvenue.L_PlayerIDInsert=玩家ID插入位置: +SAV_JoinAvenue.L_Position0=位置0: +SAV_JoinAvenue.L_Position1=位置1: +SAV_JoinAvenue.L_Position2=位置2: +SAV_JoinAvenue.L_PromotionDaysElapsed=促銷已過天數: +SAV_JoinAvenue.L_Rank=等級: +SAV_JoinAvenue.L_Records=記錄: +SAV_JoinAvenue.L_Seed=種子: +SAV_JoinAvenue.L_ShopCounts=店鋪計數: +SAV_JoinAvenue.L_ShopExperience=經驗: +SAV_JoinAvenue.L_ShopLevel=店鋪等級: +SAV_JoinAvenue.L_ShopType=店鋪類型: +SAV_JoinAvenue.L_ShopWork=店鋪工作: +SAV_JoinAvenue.L_Shout=口號: +SAV_JoinAvenue.L_Species=種族: +SAV_JoinAvenue.L_Sprite=精靈圖: +SAV_JoinAvenue.L_Subregion=子地區: +SAV_JoinAvenue.L_TID16=訓練家ID: +SAV_JoinAvenue.L_Title=稱號: +SAV_JoinAvenue.L_Trivia=趣聞: +SAV_JoinAvenue.L_Version=版本: +SAV_JoinAvenue.L_VisitingPlayerDatabase=玩家ID: +SAV_JoinAvenue.L_VisitorCount=訪客數量: +SAV_JoinAvenue.Tab_Assistants=助手 +SAV_JoinAvenue.Tab_Fans=粉絲 +SAV_JoinAvenue.Tab_General=常規 +SAV_JoinAvenue.Tab_Occupants=入駐者 +SAV_JoinAvenue.Tab_Self=自身 +SAV_JoinAvenue.Tab_SelfGeneral=常規 +SAV_JoinAvenue.Tab_SelfSpecific=詳細 +SAV_JoinAvenue.Tab_Settings=設定 +SAV_JoinAvenue.Tab_Specific=詳細 +SAV_JoinAvenue.Tab_Visitors=訪客 SAV_Link6.B_Cancel=取消 SAV_Link6.B_Export=匯出 SAV_Link6.B_Import=導入 diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/IJoinAvenueSpecificEditor.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/IJoinAvenueSpecificEditor.cs new file mode 100644 index 000000000..dab82f4c0 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/IJoinAvenueSpecificEditor.cs @@ -0,0 +1,9 @@ +using PKHeX.Core; + +namespace PKHeX.WinForms; + +internal interface IJoinAvenueSpecificEditor where T : class, IJoinAvenueEntity5 +{ + void LoadObject(T entity); + void SaveObject(T entity); +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueAssistantSpecificEditor.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueAssistantSpecificEditor.Designer.cs new file mode 100644 index 000000000..ba6eeebb0 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueAssistantSpecificEditor.Designer.cs @@ -0,0 +1,189 @@ +using System.Windows.Forms; + +namespace PKHeX.WinForms +{ + partial class JoinAvenueAssistantSpecificEditor + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + components.Dispose(); + base.Dispose(disposing); + } + + #region Component Designer generated code + + private void InitializeComponent() + { + TLP_Main = new TableLayoutPanel(); + L_Position0 = new Label(); + NUD_Position0 = new NumericUpDown(); + L_Position1 = new Label(); + NUD_Position1 = new NumericUpDown(); + L_Position2 = new Label(); + NUD_Position2 = new NumericUpDown(); + L_UnusedPosition = new Label(); + NUD_PositionUnused = new NumericUpDown(); + L_InteractedToday = new Label(); + CHK_InteractedToday = new CheckBox(); + TLP_Main.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Position0).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Position1).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Position2).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_PositionUnused).BeginInit(); + SuspendLayout(); + // + // TLP_Main + // + TLP_Main.AutoScroll = true; + TLP_Main.ColumnCount = 2; + TLP_Main.ColumnStyles.Add(new ColumnStyle()); + TLP_Main.ColumnStyles.Add(new ColumnStyle()); + TLP_Main.Controls.Add(L_Position0, 0, 0); + TLP_Main.Controls.Add(NUD_Position0, 1, 0); + TLP_Main.Controls.Add(L_Position1, 0, 1); + TLP_Main.Controls.Add(NUD_Position1, 1, 1); + TLP_Main.Controls.Add(L_Position2, 0, 2); + TLP_Main.Controls.Add(NUD_Position2, 1, 2); + TLP_Main.Controls.Add(L_UnusedPosition, 0, 3); + TLP_Main.Controls.Add(NUD_PositionUnused, 1, 3); + TLP_Main.Controls.Add(L_InteractedToday, 0, 4); + TLP_Main.Controls.Add(CHK_InteractedToday, 1, 4); + TLP_Main.Dock = DockStyle.Fill; + TLP_Main.Location = new System.Drawing.Point(0, 0); + TLP_Main.Margin = new Padding(0); + TLP_Main.Name = "TLP_Main"; + TLP_Main.RowStyles.Add(new RowStyle()); + TLP_Main.RowStyles.Add(new RowStyle()); + TLP_Main.RowStyles.Add(new RowStyle()); + TLP_Main.RowStyles.Add(new RowStyle()); + TLP_Main.RowStyles.Add(new RowStyle()); + TLP_Main.Size = new System.Drawing.Size(480, 147); + TLP_Main.TabIndex = 0; + // + // L_Position0 + // + L_Position0.Anchor = AnchorStyles.Right; + L_Position0.AutoSize = true; + L_Position0.Location = new System.Drawing.Point(47, 4); + L_Position0.Name = "L_Position0"; + L_Position0.Size = new System.Drawing.Size(64, 17); + L_Position0.TabIndex = 0; + L_Position0.Text = "Position0:"; + // + // NUD_Position0 + // + NUD_Position0.Location = new System.Drawing.Point(114, 0); + NUD_Position0.Margin = new Padding(0, 0, 0, 1); + NUD_Position0.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_Position0.Name = "NUD_Position0"; + NUD_Position0.Size = new System.Drawing.Size(48, 25); + NUD_Position0.TabIndex = 1; + // + // L_Position1 + // + L_Position1.Anchor = AnchorStyles.Right; + L_Position1.AutoSize = true; + L_Position1.Location = new System.Drawing.Point(47, 30); + L_Position1.Name = "L_Position1"; + L_Position1.Size = new System.Drawing.Size(64, 17); + L_Position1.TabIndex = 2; + L_Position1.Text = "Position1:"; + // + // NUD_Position1 + // + NUD_Position1.Location = new System.Drawing.Point(114, 26); + NUD_Position1.Margin = new Padding(0, 0, 0, 1); + NUD_Position1.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_Position1.Name = "NUD_Position1"; + NUD_Position1.Size = new System.Drawing.Size(48, 25); + NUD_Position1.TabIndex = 3; + // + // L_Position2 + // + L_Position2.Anchor = AnchorStyles.Right; + L_Position2.AutoSize = true; + L_Position2.Location = new System.Drawing.Point(47, 56); + L_Position2.Name = "L_Position2"; + L_Position2.Size = new System.Drawing.Size(64, 17); + L_Position2.TabIndex = 4; + L_Position2.Text = "Position2:"; + // + // NUD_Position2 + // + NUD_Position2.Location = new System.Drawing.Point(114, 52); + NUD_Position2.Margin = new Padding(0, 0, 0, 1); + NUD_Position2.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_Position2.Name = "NUD_Position2"; + NUD_Position2.Size = new System.Drawing.Size(48, 25); + NUD_Position2.TabIndex = 5; + // + // L_UnusedPosition + // + L_UnusedPosition.Anchor = AnchorStyles.Right; + L_UnusedPosition.AutoSize = true; + L_UnusedPosition.Location = new System.Drawing.Point(56, 82); + L_UnusedPosition.Name = "L_UnusedPosition"; + L_UnusedPosition.Size = new System.Drawing.Size(55, 17); + L_UnusedPosition.TabIndex = 6; + L_UnusedPosition.Text = "Unused:"; + // + // NUD_PositionUnused + // + NUD_PositionUnused.Location = new System.Drawing.Point(114, 78); + NUD_PositionUnused.Margin = new Padding(0, 0, 0, 1); + NUD_PositionUnused.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_PositionUnused.Name = "NUD_PositionUnused"; + NUD_PositionUnused.Size = new System.Drawing.Size(48, 25); + NUD_PositionUnused.TabIndex = 7; + // + // L_InteractedToday + // + L_InteractedToday.Anchor = AnchorStyles.Top | AnchorStyles.Right; + L_InteractedToday.AutoSize = true; + L_InteractedToday.Location = new System.Drawing.Point(3, 104); + L_InteractedToday.Name = "L_InteractedToday"; + L_InteractedToday.Size = new System.Drawing.Size(108, 17); + L_InteractedToday.TabIndex = 8; + L_InteractedToday.Text = "Interacted Today:"; + // + // CHK_InteractedToday + // + CHK_InteractedToday.AutoSize = true; + CHK_InteractedToday.Location = new System.Drawing.Point(117, 107); + CHK_InteractedToday.Name = "CHK_InteractedToday"; + CHK_InteractedToday.Size = new System.Drawing.Size(15, 14); + CHK_InteractedToday.TabIndex = 9; + // + // JoinAvenueAssistantSpecificEditor + // + AutoScaleMode = AutoScaleMode.Inherit; + Controls.Add(TLP_Main); + Name = "JoinAvenueAssistantSpecificEditor"; + Size = new System.Drawing.Size(480, 147); + TLP_Main.ResumeLayout(false); + TLP_Main.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Position0).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Position1).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Position2).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_PositionUnused).EndInit(); + ResumeLayout(false); + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel TLP_Main; + private System.Windows.Forms.Label L_Position0; + private System.Windows.Forms.NumericUpDown NUD_Position0; + private System.Windows.Forms.Label L_Position1; + private System.Windows.Forms.NumericUpDown NUD_Position1; + private System.Windows.Forms.Label L_Position2; + private System.Windows.Forms.NumericUpDown NUD_Position2; + private System.Windows.Forms.Label L_UnusedPosition; + private System.Windows.Forms.NumericUpDown NUD_PositionUnused; + private System.Windows.Forms.Label L_InteractedToday; + private System.Windows.Forms.CheckBox CHK_InteractedToday; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueAssistantSpecificEditor.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueAssistantSpecificEditor.cs new file mode 100644 index 000000000..9104c2d55 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueAssistantSpecificEditor.cs @@ -0,0 +1,28 @@ +using System; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms; + +public sealed partial class JoinAvenueAssistantSpecificEditor : UserControl, IJoinAvenueSpecificEditor +{ + public JoinAvenueAssistantSpecificEditor() => InitializeComponent(); + + public void LoadObject(JoinAvenueAssistant5 entity) + { + NUD_Position0.Value = Math.Clamp(entity.Position0, (byte)0, (byte)NUD_Position0.Maximum); + NUD_Position1.Value = Math.Clamp(entity.Position1, (byte)0, (byte)NUD_Position1.Maximum); + NUD_Position2.Value = Math.Clamp(entity.Position2, (byte)0, (byte)NUD_Position2.Maximum); + NUD_PositionUnused.Value = Math.Clamp(entity.PositionUnused, (byte)0, (byte)NUD_PositionUnused.Maximum); + CHK_InteractedToday.Checked = entity.IsInteractedToday; + } + + public void SaveObject(JoinAvenueAssistant5 entity) + { + entity.Position0 = (byte)NUD_Position0.Value; + entity.Position1 = (byte)NUD_Position1.Value; + entity.Position2 = (byte)NUD_Position2.Value; + entity.PositionUnused = (byte)NUD_PositionUnused.Value; + entity.IsInteractedToday = CHK_InteractedToday.Checked; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueEntityGeneralEditor.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueEntityGeneralEditor.Designer.cs new file mode 100644 index 000000000..8c994667d --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueEntityGeneralEditor.Designer.cs @@ -0,0 +1,612 @@ +namespace PKHeX.WinForms; + +partial class JoinAvenueEntityGeneralEditor +{ + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + components.Dispose(); + base.Dispose(disposing); + } + + #region Component Designer generated code + + private void InitializeComponent() + { + TLP_Main = new System.Windows.Forms.TableLayoutPanel(); + L_Name = new System.Windows.Forms.Label(); + TB_Name = new System.Windows.Forms.TextBox(); + L_Country = new System.Windows.Forms.Label(); + NUD_Country = new System.Windows.Forms.NumericUpDown(); + L_Subregion = new System.Windows.Forms.Label(); + NUD_Subregion = new System.Windows.Forms.NumericUpDown(); + L_Shout = new System.Windows.Forms.Label(); + TB_Shout = new System.Windows.Forms.TextBox(); + L_Version = new System.Windows.Forms.Label(); + CB_Version = new System.Windows.Forms.ComboBox(); + L_Language = new System.Windows.Forms.Label(); + CB_Language = new System.Windows.Forms.ComboBox(); + L_Unknown22 = new System.Windows.Forms.Label(); + NUD_Unknown22 = new System.Windows.Forms.NumericUpDown(); + UC_Gender = new PKHeX.WinForms.Controls.GenderToggle(); + L_Unused23 = new System.Windows.Forms.Label(); + NUD_Unused23 = new System.Windows.Forms.NumericUpDown(); + L_TID16 = new System.Windows.Forms.Label(); + NUD_TID16 = new System.Windows.Forms.NumericUpDown(); + L_Unknown26 = new System.Windows.Forms.Label(); + NUD_Unknown26 = new System.Windows.Forms.NumericUpDown(); + L_Unknown27 = new System.Windows.Forms.Label(); + NUD_Unknown27 = new System.Windows.Forms.NumericUpDown(); + L_PlayedHours = new System.Windows.Forms.Label(); + NUD_PlayedHours = new System.Windows.Forms.NumericUpDown(); + L_PlayedMinutes = new System.Windows.Forms.Label(); + NUD_PlayedMinutes = new System.Windows.Forms.NumericUpDown(); + L_Sprite = new System.Windows.Forms.Label(); + NUD_Sprite = new System.Windows.Forms.NumericUpDown(); + L_Greeting = new System.Windows.Forms.Label(); + TB_Greeting = new System.Windows.Forms.TextBox(); + L_Farewell = new System.Windows.Forms.Label(); + TB_Farewell = new System.Windows.Forms.TextBox(); + L_MetYear = new System.Windows.Forms.Label(); + NUD_MetYear = new System.Windows.Forms.NumericUpDown(); + L_MetMonth = new System.Windows.Forms.Label(); + NUD_MetMonth = new System.Windows.Forms.NumericUpDown(); + L_MetDay = new System.Windows.Forms.Label(); + NUD_MetDay = new System.Windows.Forms.NumericUpDown(); + L_Seed = new System.Windows.Forms.Label(); + NUD_Seed = new System.Windows.Forms.NumericUpDown(); + TLP_Main.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Country).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Subregion).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown22).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unused23).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_TID16).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown26).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown27).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_PlayedHours).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_PlayedMinutes).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Sprite).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_MetYear).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_MetMonth).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_MetDay).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Seed).BeginInit(); + SuspendLayout(); + // + // TLP_Main + // + TLP_Main.AutoScroll = true; + TLP_Main.ColumnCount = 2; + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.Controls.Add(L_Name, 0, 0); + TLP_Main.Controls.Add(TB_Name, 1, 0); + TLP_Main.Controls.Add(L_Country, 0, 1); + TLP_Main.Controls.Add(NUD_Country, 1, 1); + TLP_Main.Controls.Add(L_Subregion, 0, 2); + TLP_Main.Controls.Add(NUD_Subregion, 1, 2); + TLP_Main.Controls.Add(L_Shout, 0, 3); + TLP_Main.Controls.Add(TB_Shout, 1, 3); + TLP_Main.Controls.Add(L_Version, 0, 4); + TLP_Main.Controls.Add(CB_Version, 1, 4); + TLP_Main.Controls.Add(L_Language, 0, 5); + TLP_Main.Controls.Add(CB_Language, 1, 5); + TLP_Main.Controls.Add(L_Unknown22, 0, 6); + TLP_Main.Controls.Add(NUD_Unknown22, 1, 6); + TLP_Main.Controls.Add(UC_Gender, 1, 7); + TLP_Main.Controls.Add(L_Unused23, 0, 8); + TLP_Main.Controls.Add(NUD_Unused23, 1, 8); + TLP_Main.Controls.Add(L_TID16, 0, 9); + TLP_Main.Controls.Add(NUD_TID16, 1, 9); + TLP_Main.Controls.Add(L_Unknown26, 0, 10); + TLP_Main.Controls.Add(NUD_Unknown26, 1, 10); + TLP_Main.Controls.Add(L_Unknown27, 0, 11); + TLP_Main.Controls.Add(NUD_Unknown27, 1, 11); + TLP_Main.Controls.Add(L_PlayedHours, 0, 12); + TLP_Main.Controls.Add(NUD_PlayedHours, 1, 12); + TLP_Main.Controls.Add(L_PlayedMinutes, 0, 13); + TLP_Main.Controls.Add(NUD_PlayedMinutes, 1, 13); + TLP_Main.Controls.Add(L_Sprite, 0, 14); + TLP_Main.Controls.Add(NUD_Sprite, 1, 14); + TLP_Main.Controls.Add(L_Greeting, 0, 15); + TLP_Main.Controls.Add(TB_Greeting, 1, 15); + TLP_Main.Controls.Add(L_Farewell, 0, 16); + TLP_Main.Controls.Add(TB_Farewell, 1, 16); + TLP_Main.Controls.Add(L_MetYear, 0, 17); + TLP_Main.Controls.Add(NUD_MetYear, 1, 17); + TLP_Main.Controls.Add(L_MetMonth, 0, 18); + TLP_Main.Controls.Add(NUD_MetMonth, 1, 18); + TLP_Main.Controls.Add(L_MetDay, 0, 19); + TLP_Main.Controls.Add(NUD_MetDay, 1, 19); + TLP_Main.Controls.Add(L_Seed, 0, 20); + TLP_Main.Controls.Add(NUD_Seed, 1, 20); + TLP_Main.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Main.Location = new System.Drawing.Point(0, 0); + TLP_Main.Margin = new System.Windows.Forms.Padding(0); + TLP_Main.Name = "TLP_Main"; + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.Size = new System.Drawing.Size(480, 546); + TLP_Main.TabIndex = 0; + // + // L_Name + // + L_Name.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Name.AutoSize = true; + L_Name.Location = new System.Drawing.Point(56, 4); + L_Name.Name = "L_Name"; + L_Name.Size = new System.Drawing.Size(46, 17); + L_Name.TabIndex = 0; + L_Name.Text = "Name:"; + // + // TB_Name + // + TB_Name.Location = new System.Drawing.Point(105, 0); + TB_Name.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + TB_Name.MaxLength = 7; + TB_Name.Name = "TB_Name"; + TB_Name.Size = new System.Drawing.Size(180, 25); + TB_Name.TabIndex = 1; + // + // L_Country + // + L_Country.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Country.AutoSize = true; + L_Country.Location = new System.Drawing.Point(46, 30); + L_Country.Name = "L_Country"; + L_Country.Size = new System.Drawing.Size(56, 17); + L_Country.TabIndex = 2; + L_Country.Text = "Country:"; + // + // NUD_Country + // + NUD_Country.Location = new System.Drawing.Point(105, 26); + NUD_Country.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Country.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_Country.Name = "NUD_Country"; + NUD_Country.Size = new System.Drawing.Size(48, 25); + NUD_Country.TabIndex = 3; + // + // L_Subregion + // + L_Subregion.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Subregion.AutoSize = true; + L_Subregion.Location = new System.Drawing.Point(31, 56); + L_Subregion.Name = "L_Subregion"; + L_Subregion.Size = new System.Drawing.Size(71, 17); + L_Subregion.TabIndex = 4; + L_Subregion.Text = "Subregion:"; + // + // NUD_Subregion + // + NUD_Subregion.Location = new System.Drawing.Point(105, 52); + NUD_Subregion.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Subregion.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_Subregion.Name = "NUD_Subregion"; + NUD_Subregion.Size = new System.Drawing.Size(48, 25); + NUD_Subregion.TabIndex = 5; + // + // L_Shout + // + L_Shout.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Shout.AutoSize = true; + L_Shout.Location = new System.Drawing.Point(58, 82); + L_Shout.Name = "L_Shout"; + L_Shout.Size = new System.Drawing.Size(44, 17); + L_Shout.TabIndex = 6; + L_Shout.Text = "Shout:"; + // + // TB_Shout + // + TB_Shout.Location = new System.Drawing.Point(105, 78); + TB_Shout.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + TB_Shout.MaxLength = 8; + TB_Shout.Name = "TB_Shout"; + TB_Shout.Size = new System.Drawing.Size(180, 25); + TB_Shout.TabIndex = 7; + // + // L_Version + // + L_Version.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Version.AutoSize = true; + L_Version.Location = new System.Drawing.Point(48, 108); + L_Version.Name = "L_Version"; + L_Version.Size = new System.Drawing.Size(54, 17); + L_Version.TabIndex = 8; + L_Version.Text = "Version:"; + // + // CB_Version + // + CB_Version.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_Version.FormattingEnabled = true; + CB_Version.Location = new System.Drawing.Point(105, 104); + CB_Version.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + CB_Version.Name = "CB_Version"; + CB_Version.Size = new System.Drawing.Size(121, 25); + CB_Version.TabIndex = 9; + // + // L_Language + // + L_Language.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Language.AutoSize = true; + L_Language.Location = new System.Drawing.Point(34, 134); + L_Language.Name = "L_Language"; + L_Language.Size = new System.Drawing.Size(68, 17); + L_Language.TabIndex = 10; + L_Language.Text = "Language:"; + // + // CB_Language + // + CB_Language.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_Language.FormattingEnabled = true; + CB_Language.Location = new System.Drawing.Point(105, 130); + CB_Language.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + CB_Language.Name = "CB_Language"; + CB_Language.Size = new System.Drawing.Size(121, 25); + CB_Language.TabIndex = 11; + // + // L_Unknown22 + // + L_Unknown22.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Unknown22.AutoSize = true; + L_Unknown22.Location = new System.Drawing.Point(64, 160); + L_Unknown22.Name = "L_Unknown22"; + L_Unknown22.Size = new System.Drawing.Size(38, 17); + L_Unknown22.TabIndex = 12; + L_Unknown22.Text = "0x22:"; + // + // NUD_Unknown22 + // + NUD_Unknown22.Location = new System.Drawing.Point(105, 156); + NUD_Unknown22.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Unknown22.Maximum = new decimal(new int[] { 15, 0, 0, 0 }); + NUD_Unknown22.Name = "NUD_Unknown22"; + NUD_Unknown22.Size = new System.Drawing.Size(40, 25); + NUD_Unknown22.TabIndex = 13; + // + // UC_Gender + // + UC_Gender.Location = new System.Drawing.Point(105, 182); + UC_Gender.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + UC_Gender.Name = "UC_Gender"; + UC_Gender.Size = new System.Drawing.Size(24, 24); + UC_Gender.TabIndex = 15; + // + // L_Unused23 + // + L_Unused23.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Unused23.AutoSize = true; + L_Unused23.Location = new System.Drawing.Point(64, 212); + L_Unused23.Name = "L_Unused23"; + L_Unused23.Size = new System.Drawing.Size(38, 17); + L_Unused23.TabIndex = 16; + L_Unused23.Text = "0x23:"; + // + // NUD_Unused23 + // + NUD_Unused23.Location = new System.Drawing.Point(105, 208); + NUD_Unused23.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Unused23.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_Unused23.Name = "NUD_Unused23"; + NUD_Unused23.Size = new System.Drawing.Size(48, 25); + NUD_Unused23.TabIndex = 17; + // + // L_TID16 + // + L_TID16.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_TID16.AutoSize = true; + L_TID16.Location = new System.Drawing.Point(35, 238); + L_TID16.Name = "L_TID16"; + L_TID16.Size = new System.Drawing.Size(67, 17); + L_TID16.TabIndex = 18; + L_TID16.Text = "Trainer ID:"; + // + // NUD_TID16 + // + NUD_TID16.Location = new System.Drawing.Point(105, 234); + NUD_TID16.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_TID16.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_TID16.Name = "NUD_TID16"; + NUD_TID16.Size = new System.Drawing.Size(64, 25); + NUD_TID16.TabIndex = 19; + // + // L_Unknown26 + // + L_Unknown26.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Unknown26.AutoSize = true; + L_Unknown26.Location = new System.Drawing.Point(64, 264); + L_Unknown26.Name = "L_Unknown26"; + L_Unknown26.Size = new System.Drawing.Size(38, 17); + L_Unknown26.TabIndex = 20; + L_Unknown26.Text = "0x26:"; + // + // NUD_Unknown26 + // + NUD_Unknown26.Location = new System.Drawing.Point(105, 260); + NUD_Unknown26.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Unknown26.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_Unknown26.Name = "NUD_Unknown26"; + NUD_Unknown26.Size = new System.Drawing.Size(48, 25); + NUD_Unknown26.TabIndex = 21; + // + // L_Unknown27 + // + L_Unknown27.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Unknown27.AutoSize = true; + L_Unknown27.Location = new System.Drawing.Point(64, 290); + L_Unknown27.Name = "L_Unknown27"; + L_Unknown27.Size = new System.Drawing.Size(38, 17); + L_Unknown27.TabIndex = 22; + L_Unknown27.Text = "0x27:"; + // + // NUD_Unknown27 + // + NUD_Unknown27.Location = new System.Drawing.Point(105, 286); + NUD_Unknown27.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Unknown27.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_Unknown27.Name = "NUD_Unknown27"; + NUD_Unknown27.Size = new System.Drawing.Size(48, 25); + NUD_Unknown27.TabIndex = 23; + // + // L_PlayedHours + // + L_PlayedHours.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_PlayedHours.AutoSize = true; + L_PlayedHours.Location = new System.Drawing.Point(14, 316); + L_PlayedHours.Name = "L_PlayedHours"; + L_PlayedHours.Size = new System.Drawing.Size(88, 17); + L_PlayedHours.TabIndex = 24; + L_PlayedHours.Text = "Played Hours:"; + // + // NUD_PlayedHours + // + NUD_PlayedHours.Location = new System.Drawing.Point(105, 312); + NUD_PlayedHours.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_PlayedHours.Maximum = new decimal(new int[] { 1023, 0, 0, 0 }); + NUD_PlayedHours.Name = "NUD_PlayedHours"; + NUD_PlayedHours.Size = new System.Drawing.Size(64, 25); + NUD_PlayedHours.TabIndex = 25; + // + // L_PlayedMinutes + // + L_PlayedMinutes.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_PlayedMinutes.AutoSize = true; + L_PlayedMinutes.Location = new System.Drawing.Point(3, 342); + L_PlayedMinutes.Name = "L_PlayedMinutes"; + L_PlayedMinutes.Size = new System.Drawing.Size(99, 17); + L_PlayedMinutes.TabIndex = 26; + L_PlayedMinutes.Text = "Played Minutes:"; + // + // NUD_PlayedMinutes + // + NUD_PlayedMinutes.Location = new System.Drawing.Point(105, 338); + NUD_PlayedMinutes.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_PlayedMinutes.Maximum = new decimal(new int[] { 63, 0, 0, 0 }); + NUD_PlayedMinutes.Name = "NUD_PlayedMinutes"; + NUD_PlayedMinutes.Size = new System.Drawing.Size(48, 25); + NUD_PlayedMinutes.TabIndex = 27; + // + // L_Sprite + // + L_Sprite.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Sprite.AutoSize = true; + L_Sprite.Location = new System.Drawing.Point(57, 368); + L_Sprite.Name = "L_Sprite"; + L_Sprite.Size = new System.Drawing.Size(45, 17); + L_Sprite.TabIndex = 28; + L_Sprite.Text = "Sprite:"; + // + // NUD_Sprite + // + NUD_Sprite.Location = new System.Drawing.Point(105, 364); + NUD_Sprite.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Sprite.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_Sprite.Name = "NUD_Sprite"; + NUD_Sprite.Size = new System.Drawing.Size(64, 25); + NUD_Sprite.TabIndex = 29; + // + // L_Greeting + // + L_Greeting.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Greeting.AutoSize = true; + L_Greeting.Location = new System.Drawing.Point(41, 394); + L_Greeting.Name = "L_Greeting"; + L_Greeting.Size = new System.Drawing.Size(61, 17); + L_Greeting.TabIndex = 30; + L_Greeting.Text = "Greeting:"; + // + // TB_Greeting + // + TB_Greeting.Location = new System.Drawing.Point(105, 390); + TB_Greeting.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + TB_Greeting.MaxLength = 8; + TB_Greeting.Name = "TB_Greeting"; + TB_Greeting.Size = new System.Drawing.Size(180, 25); + TB_Greeting.TabIndex = 31; + // + // L_Farewell + // + L_Farewell.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Farewell.AutoSize = true; + L_Farewell.Location = new System.Drawing.Point(44, 420); + L_Farewell.Name = "L_Farewell"; + L_Farewell.Size = new System.Drawing.Size(58, 17); + L_Farewell.TabIndex = 32; + L_Farewell.Text = "Farewell:"; + // + // TB_Farewell + // + TB_Farewell.Location = new System.Drawing.Point(105, 416); + TB_Farewell.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + TB_Farewell.MaxLength = 8; + TB_Farewell.Name = "TB_Farewell"; + TB_Farewell.Size = new System.Drawing.Size(180, 25); + TB_Farewell.TabIndex = 33; + // + // L_MetYear + // + L_MetYear.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_MetYear.AutoSize = true; + L_MetYear.Location = new System.Drawing.Point(39, 446); + L_MetYear.Name = "L_MetYear"; + L_MetYear.Size = new System.Drawing.Size(63, 17); + L_MetYear.TabIndex = 34; + L_MetYear.Text = "Met Year:"; + // + // NUD_MetYear + // + NUD_MetYear.Location = new System.Drawing.Point(105, 442); + NUD_MetYear.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_MetYear.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_MetYear.Name = "NUD_MetYear"; + NUD_MetYear.Size = new System.Drawing.Size(48, 25); + NUD_MetYear.TabIndex = 35; + // + // L_MetMonth + // + L_MetMonth.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_MetMonth.AutoSize = true; + L_MetMonth.Location = new System.Drawing.Point(26, 472); + L_MetMonth.Name = "L_MetMonth"; + L_MetMonth.Size = new System.Drawing.Size(76, 17); + L_MetMonth.TabIndex = 36; + L_MetMonth.Text = "Met Month:"; + // + // NUD_MetMonth + // + NUD_MetMonth.Location = new System.Drawing.Point(105, 468); + NUD_MetMonth.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_MetMonth.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_MetMonth.Name = "NUD_MetMonth"; + NUD_MetMonth.Size = new System.Drawing.Size(48, 25); + NUD_MetMonth.TabIndex = 37; + // + // L_MetDay + // + L_MetDay.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_MetDay.AutoSize = true; + L_MetDay.Location = new System.Drawing.Point(42, 498); + L_MetDay.Name = "L_MetDay"; + L_MetDay.Size = new System.Drawing.Size(60, 17); + L_MetDay.TabIndex = 38; + L_MetDay.Text = "Met Day:"; + // + // NUD_MetDay + // + NUD_MetDay.Location = new System.Drawing.Point(105, 494); + NUD_MetDay.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_MetDay.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_MetDay.Name = "NUD_MetDay"; + NUD_MetDay.Size = new System.Drawing.Size(48, 25); + NUD_MetDay.TabIndex = 39; + // + // L_Seed + // + L_Seed.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + L_Seed.AutoSize = true; + L_Seed.Location = new System.Drawing.Point(62, 520); + L_Seed.Name = "L_Seed"; + L_Seed.Size = new System.Drawing.Size(40, 17); + L_Seed.TabIndex = 40; + L_Seed.Text = "Seed:"; + // + // NUD_Seed + // + NUD_Seed.Location = new System.Drawing.Point(105, 520); + NUD_Seed.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Seed.Maximum = new decimal(new int[] { -1, 0, 0, 0 }); + NUD_Seed.Name = "NUD_Seed"; + NUD_Seed.Size = new System.Drawing.Size(120, 25); + NUD_Seed.TabIndex = 41; + // + // JoinAvenueEntityGeneralEditor + // + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + Controls.Add(TLP_Main); + Margin = new System.Windows.Forms.Padding(0); + Name = "JoinAvenueEntityGeneralEditor"; + Size = new System.Drawing.Size(480, 546); + TLP_Main.ResumeLayout(false); + TLP_Main.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Country).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Subregion).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown22).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unused23).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_TID16).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown26).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown27).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_PlayedHours).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_PlayedMinutes).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Sprite).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_MetYear).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_MetMonth).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_MetDay).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Seed).EndInit(); + ResumeLayout(false); + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel TLP_Main; + private System.Windows.Forms.Label L_Name; + private System.Windows.Forms.TextBox TB_Name; + private System.Windows.Forms.Label L_Country; + private System.Windows.Forms.NumericUpDown NUD_Country; + private System.Windows.Forms.Label L_Subregion; + private System.Windows.Forms.NumericUpDown NUD_Subregion; + private System.Windows.Forms.Label L_Shout; + private System.Windows.Forms.TextBox TB_Shout; + private System.Windows.Forms.Label L_Version; + private System.Windows.Forms.ComboBox CB_Version; + private System.Windows.Forms.Label L_Language; + private System.Windows.Forms.ComboBox CB_Language; + private System.Windows.Forms.Label L_Unknown22; + private System.Windows.Forms.NumericUpDown NUD_Unknown22; + private PKHeX.WinForms.Controls.GenderToggle UC_Gender; + private System.Windows.Forms.Label L_Unused23; + private System.Windows.Forms.NumericUpDown NUD_Unused23; + private System.Windows.Forms.Label L_TID16; + private System.Windows.Forms.NumericUpDown NUD_TID16; + private System.Windows.Forms.Label L_Unknown26; + private System.Windows.Forms.NumericUpDown NUD_Unknown26; + private System.Windows.Forms.Label L_Unknown27; + private System.Windows.Forms.NumericUpDown NUD_Unknown27; + private System.Windows.Forms.Label L_PlayedHours; + private System.Windows.Forms.NumericUpDown NUD_PlayedHours; + private System.Windows.Forms.Label L_PlayedMinutes; + private System.Windows.Forms.NumericUpDown NUD_PlayedMinutes; + private System.Windows.Forms.Label L_Sprite; + private System.Windows.Forms.NumericUpDown NUD_Sprite; + private System.Windows.Forms.Label L_Greeting; + private System.Windows.Forms.TextBox TB_Greeting; + private System.Windows.Forms.Label L_Farewell; + private System.Windows.Forms.TextBox TB_Farewell; + private System.Windows.Forms.Label L_MetYear; + private System.Windows.Forms.NumericUpDown NUD_MetYear; + private System.Windows.Forms.Label L_MetMonth; + private System.Windows.Forms.NumericUpDown NUD_MetMonth; + private System.Windows.Forms.Label L_MetDay; + private System.Windows.Forms.NumericUpDown NUD_MetDay; + private System.Windows.Forms.Label L_Seed; + private System.Windows.Forms.NumericUpDown NUD_Seed; +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueEntityGeneralEditor.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueEntityGeneralEditor.cs new file mode 100644 index 000000000..8b91d5dd1 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueEntityGeneralEditor.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms; + +public sealed partial class JoinAvenueEntityGeneralEditor : UserControl +{ + private static readonly IReadOnlyList VersionList = GameInfo.FilteredSources.Games.ToList(); + private static readonly IReadOnlyList LanguageList = GameInfo.LanguageDataSource(5, EntityContext.Gen5); + private static readonly IReadOnlyList GenderList = Main.GenderSymbols.Select((z, i) => new ComboItem(z, i)).ToList(); + + public JoinAvenueEntityGeneralEditor() + { + InitializeComponent(); + InitializeCombo(CB_Version, VersionList); + InitializeCombo(CB_Language, LanguageList); + } + + public void LoadObject(IJoinAvenueEntity5 entity) + { + TB_Name.Text = entity.Name; + NUD_Country.Value = Math.Clamp(entity.Country, (byte)0, (byte)NUD_Country.Maximum); + NUD_Subregion.Value = Math.Clamp(entity.Subregion, (byte)0, (byte)NUD_Subregion.Maximum); + TB_Shout.Text = entity.Shout; + SetComboValue(CB_Version, entity.Version); + SetComboValue(CB_Language, entity.Language); + NUD_Unknown22.Value = Math.Clamp(entity.Unknown22, (byte)0, (byte)NUD_Unknown22.Maximum); + UC_Gender.Gender = entity.Gender; + NUD_Unused23.Value = Math.Clamp(entity.Unused23, (byte)0, (byte)NUD_Unused23.Maximum); + NUD_TID16.Value = Math.Clamp(entity.TID16, (ushort)0, (ushort)NUD_TID16.Maximum); + NUD_Unknown26.Value = Math.Clamp(entity.Unknown26, (byte)0, (byte)NUD_Unknown26.Maximum); + NUD_Unknown27.Value = Math.Clamp(entity.Unknown27, (byte)0, (byte)NUD_Unknown27.Maximum); + NUD_PlayedHours.Value = Math.Clamp(entity.PlayedHours, (ushort)0, (ushort)NUD_PlayedHours.Maximum); + NUD_PlayedMinutes.Value = Math.Clamp(entity.PlayedMinutes, (byte)0, (byte)NUD_PlayedMinutes.Maximum); + NUD_Sprite.Value = Math.Clamp(entity.Sprite, (ushort)0, (ushort)NUD_Sprite.Maximum); + TB_Greeting.Text = entity.Greeting; + TB_Farewell.Text = entity.Farewell; + NUD_MetYear.Value = Math.Clamp(entity.MetYear, (byte)0, (byte)NUD_MetYear.Maximum); + NUD_MetMonth.Value = Math.Clamp(entity.MetMonth, (byte)0, (byte)NUD_MetMonth.Maximum); + NUD_MetDay.Value = Math.Clamp(entity.MetDay, (byte)0, (byte)NUD_MetDay.Maximum); + NUD_Seed.Value = Math.Clamp(entity.Seed, 0, (uint)NUD_Seed.Maximum); + } + + public void SaveObject(IJoinAvenueEntity5 entity) + { + entity.Name = TB_Name.Text; + entity.Country = (byte)NUD_Country.Value; + entity.Subregion = (byte)NUD_Subregion.Value; + entity.Shout = TB_Shout.Text; + entity.Version = (byte)WinFormsUtil.GetIndex(CB_Version); + entity.Language = (byte)WinFormsUtil.GetIndex(CB_Language); + entity.Unknown22 = (byte)NUD_Unknown22.Value; + entity.Gender = UC_Gender.Gender; + entity.Unused23 = (byte)NUD_Unused23.Value; + entity.TID16 = (ushort)NUD_TID16.Value; + entity.Unknown26 = (byte)NUD_Unknown26.Value; + entity.Unknown27 = (byte)NUD_Unknown27.Value; + entity.PlayedHours = (ushort)NUD_PlayedHours.Value; + entity.PlayedMinutes = (byte)NUD_PlayedMinutes.Value; + entity.Sprite = (ushort)NUD_Sprite.Value; + entity.Greeting = TB_Greeting.Text; + entity.Farewell = TB_Farewell.Text; + entity.MetYear = (byte)NUD_MetYear.Value; + entity.MetMonth = (byte)NUD_MetMonth.Value; + entity.MetDay = (byte)NUD_MetDay.Value; + entity.Seed = (uint)NUD_Seed.Value; + } + + private static void InitializeCombo(ComboBox cb, IReadOnlyList source) + { + cb.InitializeBinding(); + cb.DataSource = new BindingSource(source, string.Empty); + } + + private static void SetComboValue(ComboBox cb, int value) => cb.SelectedValue = value; +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueFanSpecificEditor.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueFanSpecificEditor.Designer.cs new file mode 100644 index 000000000..4c55321bb --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueFanSpecificEditor.Designer.cs @@ -0,0 +1,326 @@ +namespace PKHeX.WinForms +{ + partial class JoinAvenueFanSpecificEditor + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + components.Dispose(); + base.Dispose(disposing); + } + + #region Component Designer generated code + + private void InitializeComponent() + { + TLP_Main = new System.Windows.Forms.TableLayoutPanel(); + L_Unknown4C = new System.Windows.Forms.Label(); + NUD_Unknown4C = new System.Windows.Forms.NumericUpDown(); + L_Unknown4D = new System.Windows.Forms.Label(); + NUD_Unknown4D = new System.Windows.Forms.NumericUpDown(); + L_Unknown4E = new System.Windows.Forms.Label(); + NUD_Unknown4E = new System.Windows.Forms.NumericUpDown(); + L_InteractedToday = new System.Windows.Forms.Label(); + CHK_InteractedToday = new System.Windows.Forms.CheckBox(); + L_Species = new System.Windows.Forms.Label(); + CB_Species = new System.Windows.Forms.ComboBox(); + L_Unknown52 = new System.Windows.Forms.Label(); + NUD_Unknown52 = new System.Windows.Forms.NumericUpDown(); + L_Unknown54 = new System.Windows.Forms.Label(); + NUD_Unknown54 = new System.Windows.Forms.NumericUpDown(); + L_BubbleTarget = new System.Windows.Forms.Label(); + NUD_BubbleTarget = new System.Windows.Forms.NumericUpDown(); + L_Unknown56 = new System.Windows.Forms.Label(); + NUD_Unknown56 = new System.Windows.Forms.NumericUpDown(); + L_Unknown5A = new System.Windows.Forms.Label(); + NUD_Unknown5A = new System.Windows.Forms.NumericUpDown(); + TLP_Main.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown4C).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown4D).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown4E).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown52).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown54).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_BubbleTarget).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown56).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown5A).BeginInit(); + SuspendLayout(); + // + // TLP_Main + // + TLP_Main.AutoScroll = true; + TLP_Main.ColumnCount = 2; + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.Controls.Add(L_Unknown4C, 0, 0); + TLP_Main.Controls.Add(NUD_Unknown4C, 1, 0); + TLP_Main.Controls.Add(L_Unknown4D, 0, 1); + TLP_Main.Controls.Add(NUD_Unknown4D, 1, 1); + TLP_Main.Controls.Add(L_Unknown4E, 0, 2); + TLP_Main.Controls.Add(NUD_Unknown4E, 1, 2); + TLP_Main.Controls.Add(L_InteractedToday, 0, 3); + TLP_Main.Controls.Add(CHK_InteractedToday, 1, 3); + TLP_Main.Controls.Add(L_Species, 0, 4); + TLP_Main.Controls.Add(CB_Species, 1, 4); + TLP_Main.Controls.Add(L_Unknown52, 0, 5); + TLP_Main.Controls.Add(NUD_Unknown52, 1, 5); + TLP_Main.Controls.Add(L_Unknown54, 0, 6); + TLP_Main.Controls.Add(NUD_Unknown54, 1, 6); + TLP_Main.Controls.Add(L_BubbleTarget, 0, 7); + TLP_Main.Controls.Add(NUD_BubbleTarget, 1, 7); + TLP_Main.Controls.Add(L_Unknown56, 0, 8); + TLP_Main.Controls.Add(NUD_Unknown56, 1, 8); + TLP_Main.Controls.Add(L_Unknown5A, 0, 9); + TLP_Main.Controls.Add(NUD_Unknown5A, 1, 9); + TLP_Main.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Main.Location = new System.Drawing.Point(0, 0); + TLP_Main.Margin = new System.Windows.Forms.Padding(0); + TLP_Main.Name = "TLP_Main"; + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.Size = new System.Drawing.Size(480, 286); + TLP_Main.TabIndex = 0; + // + // L_Unknown4C + // + L_Unknown4C.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Unknown4C.AutoSize = true; + L_Unknown4C.Location = new System.Drawing.Point(83, 4); + L_Unknown4C.Name = "L_Unknown4C"; + L_Unknown4C.Size = new System.Drawing.Size(39, 17); + L_Unknown4C.TabIndex = 0; + L_Unknown4C.Text = "0x4C:"; + // + // NUD_Unknown4C + // + NUD_Unknown4C.Location = new System.Drawing.Point(125, 0); + NUD_Unknown4C.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Unknown4C.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_Unknown4C.Name = "NUD_Unknown4C"; + NUD_Unknown4C.Size = new System.Drawing.Size(48, 25); + NUD_Unknown4C.TabIndex = 1; + // + // L_Unknown4D + // + L_Unknown4D.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Unknown4D.AutoSize = true; + L_Unknown4D.Location = new System.Drawing.Point(82, 30); + L_Unknown4D.Name = "L_Unknown4D"; + L_Unknown4D.Size = new System.Drawing.Size(40, 17); + L_Unknown4D.TabIndex = 2; + L_Unknown4D.Text = "0x4D:"; + // + // NUD_Unknown4D + // + NUD_Unknown4D.Location = new System.Drawing.Point(125, 26); + NUD_Unknown4D.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Unknown4D.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_Unknown4D.Name = "NUD_Unknown4D"; + NUD_Unknown4D.Size = new System.Drawing.Size(48, 25); + NUD_Unknown4D.TabIndex = 3; + // + // L_Unknown4E + // + L_Unknown4E.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Unknown4E.AutoSize = true; + L_Unknown4E.Location = new System.Drawing.Point(84, 56); + L_Unknown4E.Name = "L_Unknown4E"; + L_Unknown4E.Size = new System.Drawing.Size(38, 17); + L_Unknown4E.TabIndex = 4; + L_Unknown4E.Text = "0x4E:"; + // + // NUD_Unknown4E + // + NUD_Unknown4E.Location = new System.Drawing.Point(125, 52); + NUD_Unknown4E.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Unknown4E.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_Unknown4E.Name = "NUD_Unknown4E"; + NUD_Unknown4E.Size = new System.Drawing.Size(48, 25); + NUD_Unknown4E.TabIndex = 5; + // + // L_InteractedToday + // + L_InteractedToday.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_InteractedToday.AutoSize = true; + L_InteractedToday.Location = new System.Drawing.Point(14, 79); + L_InteractedToday.Name = "L_InteractedToday"; + L_InteractedToday.Size = new System.Drawing.Size(108, 17); + L_InteractedToday.TabIndex = 6; + L_InteractedToday.Text = "Interacted Today:"; + // + // CHK_InteractedToday + // + CHK_InteractedToday.AutoSize = true; + CHK_InteractedToday.Location = new System.Drawing.Point(128, 81); + CHK_InteractedToday.Name = "CHK_InteractedToday"; + CHK_InteractedToday.Size = new System.Drawing.Size(15, 14); + CHK_InteractedToday.TabIndex = 7; + // + // L_Species + // + L_Species.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Species.AutoSize = true; + L_Species.Location = new System.Drawing.Point(67, 102); + L_Species.Name = "L_Species"; + L_Species.Size = new System.Drawing.Size(55, 17); + L_Species.TabIndex = 8; + L_Species.Text = "Species:"; + // + // CB_Species + // + CB_Species.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_Species.FormattingEnabled = true; + CB_Species.Location = new System.Drawing.Point(125, 98); + CB_Species.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + CB_Species.Name = "CB_Species"; + CB_Species.Size = new System.Drawing.Size(121, 25); + CB_Species.TabIndex = 9; + // + // L_Unknown52 + // + L_Unknown52.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Unknown52.AutoSize = true; + L_Unknown52.Location = new System.Drawing.Point(84, 128); + L_Unknown52.Name = "L_Unknown52"; + L_Unknown52.Size = new System.Drawing.Size(38, 17); + L_Unknown52.TabIndex = 10; + L_Unknown52.Text = "0x52:"; + // + // NUD_Unknown52 + // + NUD_Unknown52.Location = new System.Drawing.Point(125, 124); + NUD_Unknown52.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Unknown52.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_Unknown52.Name = "NUD_Unknown52"; + NUD_Unknown52.Size = new System.Drawing.Size(64, 25); + NUD_Unknown52.TabIndex = 11; + // + // L_Unknown54 + // + L_Unknown54.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Unknown54.AutoSize = true; + L_Unknown54.Location = new System.Drawing.Point(84, 154); + L_Unknown54.Name = "L_Unknown54"; + L_Unknown54.Size = new System.Drawing.Size(38, 17); + L_Unknown54.TabIndex = 12; + L_Unknown54.Text = "0x54:"; + // + // NUD_Unknown54 + // + NUD_Unknown54.Location = new System.Drawing.Point(125, 150); + NUD_Unknown54.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Unknown54.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_Unknown54.Name = "NUD_Unknown54"; + NUD_Unknown54.Size = new System.Drawing.Size(48, 25); + NUD_Unknown54.TabIndex = 13; + // + // L_BubbleTarget + // + L_BubbleTarget.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_BubbleTarget.AutoSize = true; + L_BubbleTarget.Location = new System.Drawing.Point(3, 180); + L_BubbleTarget.Name = "L_BubbleTarget"; + L_BubbleTarget.Size = new System.Drawing.Size(119, 17); + L_BubbleTarget.TabIndex = 14; + L_BubbleTarget.Text = "Text Bubble Target:"; + // + // NUD_BubbleTarget + // + NUD_BubbleTarget.Location = new System.Drawing.Point(125, 176); + NUD_BubbleTarget.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_BubbleTarget.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_BubbleTarget.Name = "NUD_BubbleTarget"; + NUD_BubbleTarget.Size = new System.Drawing.Size(48, 25); + NUD_BubbleTarget.TabIndex = 15; + // + // L_Unknown56 + // + L_Unknown56.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Unknown56.AutoSize = true; + L_Unknown56.Location = new System.Drawing.Point(84, 206); + L_Unknown56.Name = "L_Unknown56"; + L_Unknown56.Size = new System.Drawing.Size(38, 17); + L_Unknown56.TabIndex = 16; + L_Unknown56.Text = "0x56:"; + // + // NUD_Unknown56 + // + NUD_Unknown56.Location = new System.Drawing.Point(125, 202); + NUD_Unknown56.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Unknown56.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_Unknown56.Name = "NUD_Unknown56"; + NUD_Unknown56.Size = new System.Drawing.Size(48, 25); + NUD_Unknown56.TabIndex = 17; + // + // L_Unknown5A + // + L_Unknown5A.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + L_Unknown5A.AutoSize = true; + L_Unknown5A.Location = new System.Drawing.Point(83, 228); + L_Unknown5A.Name = "L_Unknown5A"; + L_Unknown5A.Size = new System.Drawing.Size(39, 17); + L_Unknown5A.TabIndex = 18; + L_Unknown5A.Text = "0x5A:"; + // + // NUD_Unknown5A + // + NUD_Unknown5A.Location = new System.Drawing.Point(125, 228); + NUD_Unknown5A.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Unknown5A.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_Unknown5A.Name = "NUD_Unknown5A"; + NUD_Unknown5A.Size = new System.Drawing.Size(64, 25); + NUD_Unknown5A.TabIndex = 19; + // + // JoinAvenueFanSpecificEditor + // + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + Controls.Add(TLP_Main); + Name = "JoinAvenueFanSpecificEditor"; + Size = new System.Drawing.Size(480, 286); + TLP_Main.ResumeLayout(false); + TLP_Main.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown4C).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown4D).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown4E).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown52).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown54).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_BubbleTarget).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown56).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown5A).EndInit(); + ResumeLayout(false); + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel TLP_Main; + private System.Windows.Forms.Label L_Unknown4C; + private System.Windows.Forms.NumericUpDown NUD_Unknown4C; + private System.Windows.Forms.Label L_Unknown4D; + private System.Windows.Forms.NumericUpDown NUD_Unknown4D; + private System.Windows.Forms.Label L_Unknown4E; + private System.Windows.Forms.NumericUpDown NUD_Unknown4E; + private System.Windows.Forms.Label L_InteractedToday; + private System.Windows.Forms.CheckBox CHK_InteractedToday; + private System.Windows.Forms.Label L_Species; + private System.Windows.Forms.ComboBox CB_Species; + private System.Windows.Forms.Label L_Unknown52; + private System.Windows.Forms.NumericUpDown NUD_Unknown52; + private System.Windows.Forms.Label L_Unknown54; + private System.Windows.Forms.NumericUpDown NUD_Unknown54; + private System.Windows.Forms.Label L_BubbleTarget; + private System.Windows.Forms.NumericUpDown NUD_BubbleTarget; + private System.Windows.Forms.Label L_Unknown56; + private System.Windows.Forms.NumericUpDown NUD_Unknown56; + private System.Windows.Forms.Label L_Unknown5A; + private System.Windows.Forms.NumericUpDown NUD_Unknown5A; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueFanSpecificEditor.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueFanSpecificEditor.cs new file mode 100644 index 000000000..735de4478 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueFanSpecificEditor.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms; + +public sealed partial class JoinAvenueFanSpecificEditor : UserControl, IJoinAvenueSpecificEditor +{ + public JoinAvenueFanSpecificEditor() + { + InitializeComponent(); + InitializeCombo(CB_Species, GameInfo.FilteredSources.Species.ToList()); + } + + public void LoadObject(JoinAvenueFan5 entity) + { + NUD_Unknown4C.Value = Math.Clamp(entity.Unknown4C, (byte)0, (byte)NUD_Unknown4C.Maximum); + NUD_Unknown4D.Value = Math.Clamp(entity.Unknown4D, (byte)0, (byte)NUD_Unknown4D.Maximum); + NUD_Unknown4E.Value = Math.Clamp(entity.Unknown4F, (byte)0, (byte)NUD_Unknown4E.Maximum); + CHK_InteractedToday.Checked = entity.IsInteractedToday; + SetComboValue(CB_Species, entity.Species); + NUD_Unknown52.Value = Math.Clamp(entity.Unknown52, (ushort)0, (ushort)NUD_Unknown52.Maximum); + NUD_Unknown54.Value = Math.Clamp(entity.Unknown54, (byte)0, (byte)NUD_Unknown54.Maximum); + NUD_BubbleTarget.Value = Math.Clamp(entity.BubbleTarget, (byte)0, (byte)NUD_BubbleTarget.Maximum); + NUD_Unknown56.Value = Math.Clamp(entity.Unknown56, (byte)0, (byte)NUD_Unknown56.Maximum); + NUD_Unknown5A.Value = Math.Clamp(entity.Unknown5A, (ushort)0, (ushort)NUD_Unknown5A.Maximum); + } + + public void SaveObject(JoinAvenueFan5 entity) + { + entity.Unknown4C = (byte)NUD_Unknown4C.Value; + entity.Unknown4D = (byte)NUD_Unknown4D.Value; + entity.Unknown4F = (byte)NUD_Unknown4E.Value; + entity.IsInteractedToday = CHK_InteractedToday.Checked; + entity.Species = (ushort)WinFormsUtil.GetIndex(CB_Species); + entity.Unknown52 = (ushort)NUD_Unknown52.Value; + entity.Unknown54 = (byte)NUD_Unknown54.Value; + entity.BubbleTarget = (byte)NUD_BubbleTarget.Value; + entity.Unknown56 = (byte)NUD_Unknown56.Value; + entity.Unknown5A = (ushort)NUD_Unknown5A.Value; + } + + private static void InitializeCombo(ComboBox cb, IReadOnlyList source) + { + cb.InitializeBinding(); + cb.DataSource = new BindingSource(source, string.Empty); + } + + private static void SetComboValue(ComboBox cb, int value) => cb.SelectedValue = value; +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueListEditor.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueListEditor.Designer.cs new file mode 100644 index 000000000..e6e0651bd --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueListEditor.Designer.cs @@ -0,0 +1,148 @@ +namespace PKHeX.WinForms; + +partial class JoinAvenueListEditor +{ + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing) + components?.Dispose(); + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + P_List = new System.Windows.Forms.Panel(); + LB_Entries = new System.Windows.Forms.ListBox(); + FLP_ListActions = new System.Windows.Forms.FlowLayoutPanel(); + B_Import = new System.Windows.Forms.Button(); + B_Export = new System.Windows.Forms.Button(); + TC_Editor = new System.Windows.Forms.TabControl(); + Tab_General = new System.Windows.Forms.TabPage(); + Tab_Specific = new System.Windows.Forms.TabPage(); + P_List.SuspendLayout(); + FLP_ListActions.SuspendLayout(); + SuspendLayout(); + // + // P_List + // + P_List.Controls.Add(LB_Entries); + P_List.Controls.Add(FLP_ListActions); + P_List.Dock = System.Windows.Forms.DockStyle.Left; + P_List.Location = new System.Drawing.Point(0, 0); + P_List.Name = "P_List"; + P_List.Size = new System.Drawing.Size(180, 360); + P_List.TabIndex = 0; + // + // LB_Entries + // + LB_Entries.Dock = System.Windows.Forms.DockStyle.Fill; + LB_Entries.FormattingEnabled = true; + LB_Entries.IntegralHeight = false; + LB_Entries.Location = new System.Drawing.Point(0, 0); + LB_Entries.Name = "LB_Entries"; + LB_Entries.Size = new System.Drawing.Size(180, 302); + LB_Entries.TabIndex = 0; + // + // FLP_ListActions + // + FLP_ListActions.Controls.Add(B_Import); + FLP_ListActions.Controls.Add(B_Export); + FLP_ListActions.Dock = System.Windows.Forms.DockStyle.Bottom; + FLP_ListActions.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + FLP_ListActions.Location = new System.Drawing.Point(0, 302); + FLP_ListActions.Margin = new System.Windows.Forms.Padding(0); + FLP_ListActions.Name = "FLP_ListActions"; + FLP_ListActions.Padding = new System.Windows.Forms.Padding(4); + FLP_ListActions.Size = new System.Drawing.Size(180, 58); + FLP_ListActions.TabIndex = 1; + // + // B_Import + // + B_Import.AutoSize = true; + B_Import.Location = new System.Drawing.Point(7, 7); + B_Import.Name = "B_Import"; + B_Import.Size = new System.Drawing.Size(59, 27); + B_Import.TabIndex = 0; + B_Import.Text = "Import"; + B_Import.UseVisualStyleBackColor = true; + // + // B_Export + // + B_Export.AutoSize = true; + B_Export.Location = new System.Drawing.Point(72, 7); + B_Export.Name = "B_Export"; + B_Export.Size = new System.Drawing.Size(58, 27); + B_Export.TabIndex = 1; + B_Export.Text = "Export"; + B_Export.UseVisualStyleBackColor = true; + // + // TC_Editor + // + TC_Editor.Controls.Add(Tab_General); + TC_Editor.Controls.Add(Tab_Specific); + TC_Editor.Dock = System.Windows.Forms.DockStyle.Fill; + TC_Editor.Location = new System.Drawing.Point(180, 0); + TC_Editor.Name = "TC_Editor"; + TC_Editor.SelectedIndex = 0; + TC_Editor.Size = new System.Drawing.Size(420, 360); + TC_Editor.TabIndex = 1; + // + // Tab_General + // + Tab_General.Location = new System.Drawing.Point(4, 26); + Tab_General.Name = "Tab_General"; + Tab_General.Padding = new System.Windows.Forms.Padding(0); + Tab_General.Size = new System.Drawing.Size(412, 330); + Tab_General.TabIndex = 0; + Tab_General.Text = "General"; + Tab_General.UseVisualStyleBackColor = true; + // + // Tab_Specific + // + Tab_Specific.Location = new System.Drawing.Point(4, 26); + Tab_Specific.Name = "Tab_Specific"; + Tab_Specific.Padding = new System.Windows.Forms.Padding(0); + Tab_Specific.Size = new System.Drawing.Size(412, 330); + Tab_Specific.TabIndex = 1; + Tab_Specific.Text = "Specific"; + Tab_Specific.UseVisualStyleBackColor = true; + // + // JoinAvenueListEditor + // + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + Controls.Add(TC_Editor); + Controls.Add(P_List); + Name = "JoinAvenueListEditor"; + Size = new System.Drawing.Size(600, 360); + P_List.ResumeLayout(false); + FLP_ListActions.ResumeLayout(false); + FLP_ListActions.PerformLayout(); + ResumeLayout(false); + } + + #endregion + + protected System.Windows.Forms.Panel P_List; + protected System.Windows.Forms.ListBox LB_Entries; + protected System.Windows.Forms.FlowLayoutPanel FLP_ListActions; + protected System.Windows.Forms.Button B_Import; + protected System.Windows.Forms.Button B_Export; + protected System.Windows.Forms.TabControl TC_Editor; + protected System.Windows.Forms.TabPage Tab_General; + protected System.Windows.Forms.TabPage Tab_Specific; +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueListEditor.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueListEditor.cs new file mode 100644 index 000000000..1216e494c --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueListEditor.cs @@ -0,0 +1,169 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms; + +internal partial class JoinAvenueListEditor : UserControl +{ + protected JoinAvenueListEditor() => InitializeComponent(); +} + +internal sealed class JoinAvenueListEditor : JoinAvenueListEditor + where T : class, IJoinAvenueEntity5 + where TSpecific : UserControl, IJoinAvenueSpecificEditor +{ + private const string ImportFilter = "Join Avenue Entity (*.jav5;*.jaa5;*.jah5)|*.jav5;*.jaa5;*.jah5|All Files|*.*"; + private readonly JoinAvenueEntityGeneralEditor GeneralEditor = new(); + private readonly TSpecific SpecificEditor; + private readonly Func Getter; + private readonly int Count; + private int CurrentIndex = -1; + private bool Loading; + + public JoinAvenueListEditor(int count, Func getter, TSpecific specificEditor) + { + Count = count; + Getter = getter; + SpecificEditor = specificEditor; + + AddDockedControl(Tab_General, GeneralEditor); + AddDockedControl(Tab_Specific, specificEditor); + LB_Entries.SelectedIndexChanged += LB_Entries_SelectedIndexChanged; + B_Import.Click += B_Import_Click; + B_Export.Click += B_Export_Click; + } + + private static void AddDockedControl(Control parent, Control child) + { + child.Dock = DockStyle.Fill; + parent.Controls.Add(child); + } + + public void LoadAll() + { + Loading = true; + LB_Entries.Items.Clear(); + for (int i = 0; i < Count; i++) + LB_Entries.Items.Add(GetLabel(i, Getter(i))); + Loading = false; + if (LB_Entries.Items.Count != 0) + LB_Entries.SelectedIndex = 0; + } + + public void SaveAll() + { + SaveCurrent(); + RefreshLabels(); + } + + private void LB_Entries_SelectedIndexChanged(object? sender, EventArgs e) + { + if (Loading) + return; + + SaveCurrent(); + CurrentIndex = LB_Entries.SelectedIndex; + if (CurrentIndex < 0) + return; + + Loading = true; + var entity = Getter(CurrentIndex); + GeneralEditor.LoadObject(entity); + SpecificEditor.LoadObject(entity); + Loading = false; + } + + private void SaveCurrent() + { + if (Loading || CurrentIndex < 0) + return; + + var entity = Getter(CurrentIndex); + GeneralEditor.SaveObject(entity); + SpecificEditor.SaveObject(entity); + + Loading = true; + LB_Entries.Items[CurrentIndex] = GetLabel(CurrentIndex, entity); + Loading = false; + } + + private void RefreshLabels() + { + for (int i = 0; i < Count; i++) + LB_Entries.Items[i] = GetLabel(i, Getter(i)); + } + + private string GetLabel(int index, T entity) + { + var label = entity.Name.Trim(); + if (string.IsNullOrWhiteSpace(label)) + label = GameInfo.Strings.specieslist[0]; + return $"{index + 1:00} - {label}"; + } + + private void B_Export_Click(object? sender, EventArgs e) + { + SaveCurrent(); + if (CurrentIndex < 0) + return; + + var entity = Getter(CurrentIndex); + using var sfd = new SaveFileDialog(); + sfd.Filter = $"Join Avenue Entity (*.{entity.FileExtension})|*.{entity.FileExtension}|All Files|*.*"; + sfd.DefaultExt = entity.FileExtension; + sfd.FileName = PathUtil.CleanFileName($"{CurrentIndex + 1:00}_{entity.Name}"); + if (sfd.ShowDialog(this) != DialogResult.OK) + return; + + File.WriteAllBytes(sfd.FileName, entity.Write()); + WinFormsUtil.Asterisk(); + } + + private void B_Import_Click(object? sender, EventArgs e) + { + if (CurrentIndex < 0) + return; + + using var ofd = new OpenFileDialog(); + ofd.Filter = ImportFilter; + if (ofd.ShowDialog(this) != DialogResult.OK) + return; + + byte[] data = File.ReadAllBytes(ofd.FileName); + var entity = Getter(CurrentIndex); + if (!TryCreateImportedEntity(data, out var imported)) + { + WinFormsUtil.Error("Unable to import Join Avenue entity."); + return; + } + + entity.CopyFrom(imported); + Loading = true; + GeneralEditor.LoadObject(entity); + SpecificEditor.LoadObject(entity); + LB_Entries.Items[CurrentIndex] = GetLabel(CurrentIndex, entity); + Loading = false; + } + + private static bool TryCreateImportedEntity(Memory data, [NotNullWhen(true)] out IJoinAvenueEntity5? entity) + { + switch (data.Length) + { + case JoinAvenueVisitor5.SIZE: + entity = new JoinAvenueVisitor5(data); + return true; + case JoinAvenueFan5.SIZE: + entity = new JoinAvenueFan5(data); + return true; + case JoinAvenueAssistant5.SIZE: + entity = new JoinAvenueAssistant5(data); + return true; + default: + entity = null; + return false; + } + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueSettingsEditor.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueSettingsEditor.Designer.cs new file mode 100644 index 000000000..bebd0dc22 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueSettingsEditor.Designer.cs @@ -0,0 +1,433 @@ +namespace PKHeX.WinForms +{ + partial class JoinAvenueSettingsEditor + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + components.Dispose(); + base.Dispose(disposing); + } + + #region Component Designer generated code + + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + TLP_Main = new System.Windows.Forms.TableLayoutPanel(); + L_Name = new System.Windows.Forms.Label(); + TB_Name = new System.Windows.Forms.TextBox(); + L_Title = new System.Windows.Forms.Label(); + TB_Title = new System.Windows.Forms.TextBox(); + L_Experience = new System.Windows.Forms.Label(); + NUD_Experience = new System.Windows.Forms.NumericUpDown(); + L_Rank = new System.Windows.Forms.Label(); + NUD_Rank = new System.Windows.Forms.NumericUpDown(); + L_CeilingColor = new System.Windows.Forms.Label(); + CB_CeilingColor = new System.Windows.Forms.ComboBox(); + L_Flags = new System.Windows.Forms.Label(); + NUD_Flags = new System.Windows.Forms.NumericUpDown(); + L_Seed = new System.Windows.Forms.Label(); + NUD_Seed = new System.Windows.Forms.NumericUpDown(); + L_IsPromotionActive = new System.Windows.Forms.Label(); + CHK_IsPromotionActive = new System.Windows.Forms.CheckBox(); + L_PromotionDaysElapsed = new System.Windows.Forms.Label(); + NUD_PromotionDaysElapsed = new System.Windows.Forms.NumericUpDown(); + L_PlayerIDCount = new System.Windows.Forms.Label(); + NUD_PlayerCount = new System.Windows.Forms.NumericUpDown(); + L_PlayerIDInsert = new System.Windows.Forms.Label(); + NUD_PlayerInsert = new System.Windows.Forms.NumericUpDown(); + L_VisitingPlayerDatabase = new System.Windows.Forms.Label(); + DGV_VisitingPlayerDatabase = new System.Windows.Forms.DataGridView(); + Column_Index = new System.Windows.Forms.DataGridViewTextBoxColumn(); + Column_TID = new System.Windows.Forms.DataGridViewTextBoxColumn(); + Column_SID = new System.Windows.Forms.DataGridViewTextBoxColumn(); + TLP_Main.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Experience).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Rank).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Flags).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Seed).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_PromotionDaysElapsed).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_PlayerCount).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_PlayerInsert).BeginInit(); + ((System.ComponentModel.ISupportInitialize)DGV_VisitingPlayerDatabase).BeginInit(); + SuspendLayout(); + // + // TLP_Main + // + TLP_Main.AutoScroll = true; + TLP_Main.ColumnCount = 2; + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.Controls.Add(L_Name, 0, 0); + TLP_Main.Controls.Add(TB_Name, 1, 0); + TLP_Main.Controls.Add(L_Title, 0, 1); + TLP_Main.Controls.Add(TB_Title, 1, 1); + TLP_Main.Controls.Add(L_Experience, 0, 2); + TLP_Main.Controls.Add(NUD_Experience, 1, 2); + TLP_Main.Controls.Add(L_Rank, 0, 3); + TLP_Main.Controls.Add(NUD_Rank, 1, 3); + TLP_Main.Controls.Add(L_CeilingColor, 0, 4); + TLP_Main.Controls.Add(CB_CeilingColor, 1, 4); + TLP_Main.Controls.Add(L_Flags, 0, 5); + TLP_Main.Controls.Add(NUD_Flags, 1, 5); + TLP_Main.Controls.Add(L_Seed, 0, 6); + TLP_Main.Controls.Add(NUD_Seed, 1, 6); + TLP_Main.Controls.Add(L_IsPromotionActive, 0, 7); + TLP_Main.Controls.Add(CHK_IsPromotionActive, 1, 7); + TLP_Main.Controls.Add(L_PromotionDaysElapsed, 0, 8); + TLP_Main.Controls.Add(NUD_PromotionDaysElapsed, 1, 8); + TLP_Main.Controls.Add(L_PlayerIDCount, 0, 9); + TLP_Main.Controls.Add(NUD_PlayerCount, 1, 9); + TLP_Main.Controls.Add(L_PlayerIDInsert, 0, 10); + TLP_Main.Controls.Add(NUD_PlayerInsert, 1, 10); + TLP_Main.Controls.Add(L_VisitingPlayerDatabase, 0, 11); + TLP_Main.Controls.Add(DGV_VisitingPlayerDatabase, 1, 11); + TLP_Main.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Main.Location = new System.Drawing.Point(0, 0); + TLP_Main.Margin = new System.Windows.Forms.Padding(0); + TLP_Main.Name = "TLP_Main"; + TLP_Main.RowCount = 12; + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.Size = new System.Drawing.Size(347, 548); + TLP_Main.TabIndex = 0; + // + // L_Name + // + L_Name.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Name.AutoSize = true; + L_Name.Location = new System.Drawing.Point(108, 4); + L_Name.Margin = new System.Windows.Forms.Padding(0); + L_Name.Name = "L_Name"; + L_Name.Size = new System.Drawing.Size(46, 17); + L_Name.TabIndex = 0; + L_Name.Text = "Name:"; + // + // TB_Name + // + TB_Name.Location = new System.Drawing.Point(154, 0); + TB_Name.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + TB_Name.MaxLength = 20; + TB_Name.Name = "TB_Name"; + TB_Name.Size = new System.Drawing.Size(180, 25); + TB_Name.TabIndex = 1; + // + // L_Title + // + L_Title.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Title.AutoSize = true; + L_Title.Location = new System.Drawing.Point(119, 30); + L_Title.Margin = new System.Windows.Forms.Padding(0); + L_Title.Name = "L_Title"; + L_Title.Size = new System.Drawing.Size(35, 17); + L_Title.TabIndex = 2; + L_Title.Text = "Title:"; + // + // TB_Title + // + TB_Title.Location = new System.Drawing.Point(154, 26); + TB_Title.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + TB_Title.MaxLength = 20; + TB_Title.Name = "TB_Title"; + TB_Title.Size = new System.Drawing.Size(180, 25); + TB_Title.TabIndex = 3; + // + // L_Experience + // + L_Experience.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Experience.AutoSize = true; + L_Experience.Location = new System.Drawing.Point(80, 56); + L_Experience.Margin = new System.Windows.Forms.Padding(0); + L_Experience.Name = "L_Experience"; + L_Experience.Size = new System.Drawing.Size(74, 17); + L_Experience.TabIndex = 4; + L_Experience.Text = "Experience:"; + // + // NUD_Experience + // + NUD_Experience.Location = new System.Drawing.Point(154, 52); + NUD_Experience.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Experience.Maximum = new decimal(new int[] { -1, 0, 0, 0 }); + NUD_Experience.Name = "NUD_Experience"; + NUD_Experience.Size = new System.Drawing.Size(120, 25); + NUD_Experience.TabIndex = 5; + // + // L_Rank + // + L_Rank.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Rank.AutoSize = true; + L_Rank.Location = new System.Drawing.Point(115, 82); + L_Rank.Margin = new System.Windows.Forms.Padding(0); + L_Rank.Name = "L_Rank"; + L_Rank.Size = new System.Drawing.Size(39, 17); + L_Rank.TabIndex = 6; + L_Rank.Text = "Rank:"; + // + // NUD_Rank + // + NUD_Rank.Location = new System.Drawing.Point(154, 78); + NUD_Rank.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Rank.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); + NUD_Rank.Name = "NUD_Rank"; + NUD_Rank.Size = new System.Drawing.Size(64, 25); + NUD_Rank.TabIndex = 7; + // + // L_CeilingColor + // + L_CeilingColor.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_CeilingColor.AutoSize = true; + L_CeilingColor.Location = new System.Drawing.Point(68, 108); + L_CeilingColor.Margin = new System.Windows.Forms.Padding(0); + L_CeilingColor.Name = "L_CeilingColor"; + L_CeilingColor.Size = new System.Drawing.Size(86, 17); + L_CeilingColor.TabIndex = 8; + L_CeilingColor.Text = "Ceiling Color:"; + // + // CB_CeilingColor + // + CB_CeilingColor.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_CeilingColor.FormattingEnabled = true; + CB_CeilingColor.Location = new System.Drawing.Point(154, 104); + CB_CeilingColor.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + CB_CeilingColor.Name = "CB_CeilingColor"; + CB_CeilingColor.Size = new System.Drawing.Size(180, 25); + CB_CeilingColor.TabIndex = 9; + // + // L_Flags + // + L_Flags.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Flags.AutoSize = true; + L_Flags.Location = new System.Drawing.Point(113, 134); + L_Flags.Margin = new System.Windows.Forms.Padding(0); + L_Flags.Name = "L_Flags"; + L_Flags.Size = new System.Drawing.Size(41, 17); + L_Flags.TabIndex = 10; + L_Flags.Text = "Flags:"; + // + // NUD_Flags + // + NUD_Flags.Location = new System.Drawing.Point(154, 130); + NUD_Flags.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Flags.Maximum = new decimal(new int[] { -1, 0, 0, 0 }); + NUD_Flags.Name = "NUD_Flags"; + NUD_Flags.Size = new System.Drawing.Size(120, 25); + NUD_Flags.TabIndex = 11; + // + // L_Seed + // + L_Seed.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Seed.AutoSize = true; + L_Seed.Location = new System.Drawing.Point(114, 160); + L_Seed.Margin = new System.Windows.Forms.Padding(0); + L_Seed.Name = "L_Seed"; + L_Seed.Size = new System.Drawing.Size(40, 17); + L_Seed.TabIndex = 12; + L_Seed.Text = "Seed:"; + // + // NUD_Seed + // + NUD_Seed.Location = new System.Drawing.Point(154, 156); + NUD_Seed.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Seed.Maximum = new decimal(new int[] { -1, 0, 0, 0 }); + NUD_Seed.Name = "NUD_Seed"; + NUD_Seed.Size = new System.Drawing.Size(120, 25); + NUD_Seed.TabIndex = 13; + // + // L_IsPromotionActive + // + L_IsPromotionActive.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_IsPromotionActive.AutoSize = true; + L_IsPromotionActive.Location = new System.Drawing.Point(31, 186); + L_IsPromotionActive.Margin = new System.Windows.Forms.Padding(0); + L_IsPromotionActive.Name = "L_IsPromotionActive"; + L_IsPromotionActive.Size = new System.Drawing.Size(123, 17); + L_IsPromotionActive.TabIndex = 14; + L_IsPromotionActive.Text = "Is Promotion Active:"; + // + // CHK_IsPromotionActive + // + CHK_IsPromotionActive.Location = new System.Drawing.Point(154, 182); + CHK_IsPromotionActive.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + CHK_IsPromotionActive.Name = "CHK_IsPromotionActive"; + CHK_IsPromotionActive.Size = new System.Drawing.Size(120, 25); + CHK_IsPromotionActive.TabIndex = 15; + // + // L_PromotionDaysElapsed + // + L_PromotionDaysElapsed.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_PromotionDaysElapsed.AutoSize = true; + L_PromotionDaysElapsed.Location = new System.Drawing.Point(0, 212); + L_PromotionDaysElapsed.Margin = new System.Windows.Forms.Padding(0); + L_PromotionDaysElapsed.Name = "L_PromotionDaysElapsed"; + L_PromotionDaysElapsed.Size = new System.Drawing.Size(154, 17); + L_PromotionDaysElapsed.TabIndex = 16; + L_PromotionDaysElapsed.Text = "Promotion Days Elapsed:"; + // + // NUD_PromotionDaysElapsed + // + NUD_PromotionDaysElapsed.Location = new System.Drawing.Point(154, 208); + NUD_PromotionDaysElapsed.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_PromotionDaysElapsed.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_PromotionDaysElapsed.Name = "NUD_PromotionDaysElapsed"; + NUD_PromotionDaysElapsed.Size = new System.Drawing.Size(64, 25); + NUD_PromotionDaysElapsed.TabIndex = 17; + // + // L_PlayerIDCount + // + L_PlayerIDCount.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_PlayerIDCount.AutoSize = true; + L_PlayerIDCount.Location = new System.Drawing.Point(54, 238); + L_PlayerIDCount.Margin = new System.Windows.Forms.Padding(0); + L_PlayerIDCount.Name = "L_PlayerIDCount"; + L_PlayerIDCount.Size = new System.Drawing.Size(100, 17); + L_PlayerIDCount.TabIndex = 18; + L_PlayerIDCount.Text = "Player ID Count:"; + // + // NUD_PlayerCount + // + NUD_PlayerCount.Location = new System.Drawing.Point(154, 234); + NUD_PlayerCount.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_PlayerCount.Maximum = new decimal(new int[] { 32, 0, 0, 0 }); + NUD_PlayerCount.Name = "NUD_PlayerCount"; + NUD_PlayerCount.Size = new System.Drawing.Size(64, 25); + NUD_PlayerCount.TabIndex = 19; + // + // L_PlayerIDInsert + // + L_PlayerIDInsert.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_PlayerIDInsert.AutoSize = true; + L_PlayerIDInsert.Location = new System.Drawing.Point(56, 264); + L_PlayerIDInsert.Margin = new System.Windows.Forms.Padding(0); + L_PlayerIDInsert.Name = "L_PlayerIDInsert"; + L_PlayerIDInsert.Size = new System.Drawing.Size(98, 17); + L_PlayerIDInsert.TabIndex = 20; + L_PlayerIDInsert.Text = "Player ID Insert:"; + // + // NUD_PlayerInsert + // + NUD_PlayerInsert.Location = new System.Drawing.Point(154, 260); + NUD_PlayerInsert.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_PlayerInsert.Maximum = new decimal(new int[] { 31, 0, 0, 0 }); + NUD_PlayerInsert.Name = "NUD_PlayerInsert"; + NUD_PlayerInsert.Size = new System.Drawing.Size(64, 25); + NUD_PlayerInsert.TabIndex = 21; + // + // L_VisitingPlayerDatabase + // + L_VisitingPlayerDatabase.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_VisitingPlayerDatabase.AutoSize = true; + L_VisitingPlayerDatabase.Location = new System.Drawing.Point(83, 408); + L_VisitingPlayerDatabase.Name = "L_VisitingPlayerDatabase"; + L_VisitingPlayerDatabase.Size = new System.Drawing.Size(68, 17); + L_VisitingPlayerDatabase.TabIndex = 22; + L_VisitingPlayerDatabase.Text = "Player IDs:"; + // + // DGV_VisitingPlayerDatabase + // + DGV_VisitingPlayerDatabase.AllowUserToAddRows = false; + DGV_VisitingPlayerDatabase.AllowUserToDeleteRows = false; + DGV_VisitingPlayerDatabase.AllowUserToResizeRows = false; + dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.ControlLight; + DGV_VisitingPlayerDatabase.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1; + DGV_VisitingPlayerDatabase.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + DGV_VisitingPlayerDatabase.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { Column_Index, Column_TID, Column_SID }); + DGV_VisitingPlayerDatabase.Dock = System.Windows.Forms.DockStyle.Fill; + DGV_VisitingPlayerDatabase.Location = new System.Drawing.Point(154, 286); + DGV_VisitingPlayerDatabase.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + DGV_VisitingPlayerDatabase.MultiSelect = false; + DGV_VisitingPlayerDatabase.Name = "DGV_VisitingPlayerDatabase"; + DGV_VisitingPlayerDatabase.RowHeadersVisible = false; + DGV_VisitingPlayerDatabase.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + DGV_VisitingPlayerDatabase.Size = new System.Drawing.Size(193, 261); + DGV_VisitingPlayerDatabase.TabIndex = 23; + // + // Column_Index + // + Column_Index.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + Column_Index.HeaderText = "#"; + Column_Index.Name = "Column_Index"; + Column_Index.ReadOnly = true; + Column_Index.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + Column_Index.Width = 22; + // + // Column_TID + // + Column_TID.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + Column_TID.HeaderText = "TID"; + Column_TID.Name = "Column_TID"; + Column_TID.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + Column_TID.Width = 33; + // + // Column_SID + // + Column_SID.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + Column_SID.HeaderText = "SID"; + Column_SID.Name = "Column_SID"; + Column_SID.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + Column_SID.Width = 33; + // + // JoinAvenueSettingsEditor + // + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + Controls.Add(TLP_Main); + Margin = new System.Windows.Forms.Padding(0); + Name = "JoinAvenueSettingsEditor"; + Size = new System.Drawing.Size(347, 548); + TLP_Main.ResumeLayout(false); + TLP_Main.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Experience).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Rank).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Flags).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Seed).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_PromotionDaysElapsed).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_PlayerCount).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_PlayerInsert).EndInit(); + ((System.ComponentModel.ISupportInitialize)DGV_VisitingPlayerDatabase).EndInit(); + ResumeLayout(false); + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel TLP_Main; + private System.Windows.Forms.Label L_Name; + private System.Windows.Forms.TextBox TB_Name; + private System.Windows.Forms.Label L_Title; + private System.Windows.Forms.TextBox TB_Title; + private System.Windows.Forms.Label L_Experience; + private System.Windows.Forms.NumericUpDown NUD_Experience; + private System.Windows.Forms.Label L_Rank; + private System.Windows.Forms.NumericUpDown NUD_Rank; + private System.Windows.Forms.Label L_CeilingColor; + private System.Windows.Forms.ComboBox CB_CeilingColor; + private System.Windows.Forms.Label L_Flags; + private System.Windows.Forms.NumericUpDown NUD_Flags; + private System.Windows.Forms.Label L_PlayerIDCount; + private System.Windows.Forms.NumericUpDown NUD_PlayerCount; + private System.Windows.Forms.Label L_PlayerIDInsert; + private System.Windows.Forms.NumericUpDown NUD_PlayerInsert; + private System.Windows.Forms.Label L_Seed; + private System.Windows.Forms.NumericUpDown NUD_Seed; + private System.Windows.Forms.Label L_IsPromotionActive; + private System.Windows.Forms.CheckBox CHK_IsPromotionActive; + private System.Windows.Forms.Label L_PromotionDaysElapsed; + private System.Windows.Forms.NumericUpDown NUD_PromotionDaysElapsed; + private System.Windows.Forms.Label L_VisitingPlayerDatabase; + private System.Windows.Forms.DataGridView DGV_VisitingPlayerDatabase; + private System.Windows.Forms.DataGridViewTextBoxColumn Column_Index; + private System.Windows.Forms.DataGridViewTextBoxColumn Column_TID; + private System.Windows.Forms.DataGridViewTextBoxColumn Column_SID; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueSettingsEditor.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueSettingsEditor.cs new file mode 100644 index 000000000..bf0ea19af --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueSettingsEditor.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms; + +public partial class JoinAvenueSettingsEditor : UserControl +{ + private const int VisitingPlayerColumnIndex = 0; + private const int VisitingPlayerColumnTID = 1; + private const int VisitingPlayerColumnSID = 2; + + private static readonly List CeilingColorList = WinFormsTranslator.GetEnumTranslation(Main.CurrentLanguage) + .Select((z, i) => new ComboItem(z, i)).ToList(); + + public JoinAvenueSettingsEditor() + { + InitializeComponent(); + CB_CeilingColor.InitializeBinding(); + CB_CeilingColor.DataSource = new BindingSource(CeilingColorList, string.Empty); + DGV_VisitingPlayerDatabase.Rows.Add(JoinAvenueSettings5.CountVisitingPlayersRemembered); + for (int i = 0; i < JoinAvenueSettings5.CountVisitingPlayersRemembered; i++) + DGV_VisitingPlayerDatabase.Rows[i].Cells[VisitingPlayerColumnIndex].Value = i + 1; + } + + public void LoadObject(JoinAvenueSettings5 settings) + { + TB_Name.Text = settings.Name; + TB_Title.Text = settings.PlayerTitle; + NUD_Experience.Value = Math.Clamp(settings.Experience, 0, (uint)NUD_Experience.Maximum); + NUD_Rank.Value = Math.Clamp(settings.Rank, (ushort)0, (ushort)NUD_Rank.Maximum); + CB_CeilingColor.SelectedValue = (int)settings.CeilingColor; + NUD_Flags.Value = Math.Clamp(settings.Flags, 0, (uint)NUD_Flags.Maximum); + NUD_PlayerCount.Value = Math.Clamp(settings.VisitingPlayerDatabaseCount, (ushort)0, (ushort)NUD_PlayerCount.Maximum); + NUD_PlayerInsert.Value = Math.Clamp(settings.VistiingPlayerDatabaseInsertIndex, (ushort)0, (ushort)NUD_PlayerInsert.Maximum); + NUD_Seed.Value = Math.Clamp(settings.Seed, 0, (uint)NUD_Seed.Maximum); + NUD_PromotionDaysElapsed.Value = Math.Clamp(settings.PromotionDaysElapsed, (ushort)0, (ushort)NUD_PromotionDaysElapsed.Maximum); + CHK_IsPromotionActive.Checked = settings.IsPromotionActive; + + for (int i = 0; i < JoinAvenueSettings5.CountVisitingPlayersRemembered; i++) + { + var value = settings.GetVisitingPlayerTrainerID(i); + var row = DGV_VisitingPlayerDatabase.Rows[i]; + row.Cells[VisitingPlayerColumnTID].Value = ((ushort)value).ToString("00000"); + row.Cells[VisitingPlayerColumnSID].Value = ((ushort)(value >> 16)).ToString("00000"); + } + } + + public void SaveObject(JoinAvenueSettings5 settings) + { + settings.Name = TB_Name.Text; + settings.PlayerTitle = TB_Title.Text; + settings.Experience = (uint)NUD_Experience.Value; + settings.Rank = (ushort)NUD_Rank.Value; + settings.CeilingColor = (JoinAvenueCeilingColor5)WinFormsUtil.GetIndex(CB_CeilingColor); + settings.Flags = (uint)NUD_Flags.Value; + settings.VisitingPlayerDatabaseCount = (ushort)NUD_PlayerCount.Value; + settings.VistiingPlayerDatabaseInsertIndex = (ushort)NUD_PlayerInsert.Value; + settings.Seed = (uint)NUD_Seed.Value; + settings.PromotionDaysElapsed = (ushort)NUD_PromotionDaysElapsed.Value; + settings.IsPromotionActive = CHK_IsPromotionActive.Checked; + + for (int i = 0; i < JoinAvenueSettings5.CountVisitingPlayersRemembered; i++) + { + var row = DGV_VisitingPlayerDatabase.Rows[i]; + var tid = ParseUInt16(row.Cells[VisitingPlayerColumnTID].Value); + var sid = ParseUInt16(row.Cells[VisitingPlayerColumnSID].Value); + var value = tid | ((uint)sid << 16); + settings.SetVisitingPlayerTrainerID(i, value); + } + } + + private static ushort ParseUInt16(object? value) + { + if (value is null) + return 0; + return ushort.TryParse(value.ToString(), out var result) ? result : (ushort)0; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueVisitorSpecificEditor.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueVisitorSpecificEditor.Designer.cs new file mode 100644 index 000000000..2cb1baa5c --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueVisitorSpecificEditor.Designer.cs @@ -0,0 +1,1168 @@ +namespace PKHeX.WinForms +{ + partial class JoinAvenueVisitorSpecificEditor + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + components.Dispose(); + base.Dispose(disposing); + } + + #region Component Designer generated code + + private void InitializeComponent() + { + TLP_Main = new System.Windows.Forms.TableLayoutPanel(); + L_IsFlag2C = new System.Windows.Forms.Label(); + CHK_IsFlag2C = new System.Windows.Forms.CheckBox(); + L_AvenueLevel = new System.Windows.Forms.Label(); + NUD_AvenueLevel = new System.Windows.Forms.NumericUpDown(); + L_Unused2D = new System.Windows.Forms.Label(); + NUD_Unused2D = new System.Windows.Forms.NumericUpDown(); + L_DesiredShopType = new System.Windows.Forms.Label(); + CB_DesiredShopType = new System.Windows.Forms.ComboBox(); + L_ShopCounts = new System.Windows.Forms.Label(); + TB_ShopCounts = new System.Windows.Forms.TextBox(); + L_DexSeen = new System.Windows.Forms.Label(); + NUD_DexSeen = new System.Windows.Forms.NumericUpDown(); + L_FavoriteSpecies = new System.Windows.Forms.Label(); + CB_FavoriteSpecies = new System.Windows.Forms.ComboBox(); + L_MedalRank = new System.Windows.Forms.Label(); + NUD_MedalRank = new System.Windows.Forms.NumericUpDown(); + L_MedalHint = new System.Windows.Forms.Label(); + NUD_MedalHint = new System.Windows.Forms.NumericUpDown(); + L_MedalCount = new System.Windows.Forms.Label(); + NUD_MedalCount = new System.Windows.Forms.NumericUpDown(); + L_Date1 = new System.Windows.Forms.Label(); + TB_Date1 = new System.Windows.Forms.TextBox(); + L_DateStart = new System.Windows.Forms.Label(); + TB_DateStart = new System.Windows.Forms.TextBox(); + L_DateHall = new System.Windows.Forms.Label(); + TB_DateHall = new System.Windows.Forms.TextBox(); + L_Records = new System.Windows.Forms.Label(); + TB_Records = new System.Windows.Forms.TextBox(); + L_Trivia = new System.Windows.Forms.Label(); + TB_Trivia = new System.Windows.Forms.TextBox(); + L_Activities = new System.Windows.Forms.Label(); + TB_Activities = new System.Windows.Forms.TextBox(); + L_ActivityDates = new System.Windows.Forms.Label(); + TB_ActivityDates = new System.Windows.Forms.TextBox(); + L_Origin = new System.Windows.Forms.Label(); + CB_Origin = new System.Windows.Forms.ComboBox(); + L_MetHour = new System.Windows.Forms.Label(); + NUD_MetHour = new System.Windows.Forms.NumericUpDown(); + L_MetMinute = new System.Windows.Forms.Label(); + NUD_MetMinute = new System.Windows.Forms.NumericUpDown(); + L_UnknownA8 = new System.Windows.Forms.Label(); + NUD_UnknownA8 = new System.Windows.Forms.NumericUpDown(); + L_IsShopChangeAllowed = new System.Windows.Forms.Label(); + CHK_IsShopChangeAllowed = new System.Windows.Forms.CheckBox(); + L_IsFlagA9_1 = new System.Windows.Forms.Label(); + CHK_IsFlagA9_1 = new System.Windows.Forms.CheckBox(); + L_IsFlagA9_2 = new System.Windows.Forms.Label(); + CHK_IsFlagA9_2 = new System.Windows.Forms.CheckBox(); + L_InteractedToday = new System.Windows.Forms.Label(); + CHK_InteractedToday = new System.Windows.Forms.CheckBox(); + L_IsFlagAA = new System.Windows.Forms.Label(); + CHK_IsFlagAA = new System.Windows.Forms.CheckBox(); + L_JoinAvenueRank = new System.Windows.Forms.Label(); + NUD_JoinAvenueRank = new System.Windows.Forms.NumericUpDown(); + L_UnknownAC = new System.Windows.Forms.Label(); + NUD_UnknownAC = new System.Windows.Forms.NumericUpDown(); + L_ShopLevel = new System.Windows.Forms.Label(); + NUD_ShopLevel = new System.Windows.Forms.NumericUpDown(); + L_ShopExperience = new System.Windows.Forms.Label(); + NUD_ShopExperience = new System.Windows.Forms.NumericUpDown(); + L_IsInventory = new System.Windows.Forms.Label(); + NUD_IsInventory = new System.Windows.Forms.NumericUpDown(); + L_ShopType = new System.Windows.Forms.Label(); + CB_ShopType = new System.Windows.Forms.ComboBox(); + L_ShopWork = new System.Windows.Forms.Label(); + NUD_ShopWork = new System.Windows.Forms.NumericUpDown(); + L_UnusedB8 = new System.Windows.Forms.Label(); + NUD_UnusedB8 = new System.Windows.Forms.NumericUpDown(); + L_UnknownBits0_8 = new System.Windows.Forms.Label(); + NUD_UnknownBits0_8 = new System.Windows.Forms.NumericUpDown(); + L_UnknownBit9 = new System.Windows.Forms.Label(); + CHK_UnknownBit9 = new System.Windows.Forms.CheckBox(); + L_UnknownBits10 = new System.Windows.Forms.Label(); + NUD_UnknownBits10 = new System.Windows.Forms.NumericUpDown(); + L_UnknownBits13_20 = new System.Windows.Forms.Label(); + NUD_UnknownBits13_20 = new System.Windows.Forms.NumericUpDown(); + L_UnknownBits21_27 = new System.Windows.Forms.Label(); + NUD_UnknownBits21_27 = new System.Windows.Forms.NumericUpDown(); + L_UnknownBits28_31 = new System.Windows.Forms.Label(); + NUD_UnknownBits28_31 = new System.Windows.Forms.NumericUpDown(); + TLP_Main.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_AvenueLevel).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unused2D).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_DexSeen).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_MedalRank).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_MedalHint).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_MedalCount).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_MetHour).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_MetMinute).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UnknownA8).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_JoinAvenueRank).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UnknownAC).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_ShopLevel).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_ShopExperience).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_IsInventory).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_ShopWork).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UnusedB8).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UnknownBits0_8).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UnknownBits10).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UnknownBits13_20).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UnknownBits21_27).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UnknownBits28_31).BeginInit(); + SuspendLayout(); + // + // TLP_Main + // + TLP_Main.AutoScroll = true; + TLP_Main.ColumnCount = 2; + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.Controls.Add(L_IsFlag2C, 0, 0); + TLP_Main.Controls.Add(CHK_IsFlag2C, 1, 0); + TLP_Main.Controls.Add(L_AvenueLevel, 0, 1); + TLP_Main.Controls.Add(NUD_AvenueLevel, 1, 1); + TLP_Main.Controls.Add(L_Unused2D, 0, 2); + TLP_Main.Controls.Add(NUD_Unused2D, 1, 2); + TLP_Main.Controls.Add(L_DesiredShopType, 0, 3); + TLP_Main.Controls.Add(CB_DesiredShopType, 1, 3); + TLP_Main.Controls.Add(L_ShopCounts, 0, 4); + TLP_Main.Controls.Add(TB_ShopCounts, 1, 4); + TLP_Main.Controls.Add(L_DexSeen, 0, 5); + TLP_Main.Controls.Add(NUD_DexSeen, 1, 5); + TLP_Main.Controls.Add(L_FavoriteSpecies, 0, 6); + TLP_Main.Controls.Add(CB_FavoriteSpecies, 1, 6); + TLP_Main.Controls.Add(L_MedalRank, 0, 7); + TLP_Main.Controls.Add(NUD_MedalRank, 1, 7); + TLP_Main.Controls.Add(L_MedalHint, 0, 8); + TLP_Main.Controls.Add(NUD_MedalHint, 1, 8); + TLP_Main.Controls.Add(L_MedalCount, 0, 9); + TLP_Main.Controls.Add(NUD_MedalCount, 1, 9); + TLP_Main.Controls.Add(L_Date1, 0, 10); + TLP_Main.Controls.Add(TB_Date1, 1, 10); + TLP_Main.Controls.Add(L_DateStart, 0, 11); + TLP_Main.Controls.Add(TB_DateStart, 1, 11); + TLP_Main.Controls.Add(L_DateHall, 0, 12); + TLP_Main.Controls.Add(TB_DateHall, 1, 12); + TLP_Main.Controls.Add(L_Records, 0, 13); + TLP_Main.Controls.Add(TB_Records, 1, 13); + TLP_Main.Controls.Add(L_Trivia, 0, 14); + TLP_Main.Controls.Add(TB_Trivia, 1, 14); + TLP_Main.Controls.Add(L_Activities, 0, 15); + TLP_Main.Controls.Add(TB_Activities, 1, 15); + TLP_Main.Controls.Add(L_ActivityDates, 0, 16); + TLP_Main.Controls.Add(TB_ActivityDates, 1, 16); + TLP_Main.Controls.Add(L_Origin, 0, 17); + TLP_Main.Controls.Add(CB_Origin, 1, 17); + TLP_Main.Controls.Add(L_MetHour, 0, 18); + TLP_Main.Controls.Add(NUD_MetHour, 1, 18); + TLP_Main.Controls.Add(L_MetMinute, 0, 19); + TLP_Main.Controls.Add(NUD_MetMinute, 1, 19); + TLP_Main.Controls.Add(L_UnknownA8, 0, 20); + TLP_Main.Controls.Add(NUD_UnknownA8, 1, 20); + TLP_Main.Controls.Add(L_IsShopChangeAllowed, 0, 21); + TLP_Main.Controls.Add(CHK_IsShopChangeAllowed, 1, 21); + TLP_Main.Controls.Add(L_IsFlagA9_1, 0, 22); + TLP_Main.Controls.Add(CHK_IsFlagA9_1, 1, 22); + TLP_Main.Controls.Add(L_IsFlagA9_2, 0, 23); + TLP_Main.Controls.Add(CHK_IsFlagA9_2, 1, 23); + TLP_Main.Controls.Add(L_InteractedToday, 0, 24); + TLP_Main.Controls.Add(CHK_InteractedToday, 1, 24); + TLP_Main.Controls.Add(L_IsFlagAA, 0, 25); + TLP_Main.Controls.Add(CHK_IsFlagAA, 1, 25); + TLP_Main.Controls.Add(L_JoinAvenueRank, 0, 26); + TLP_Main.Controls.Add(NUD_JoinAvenueRank, 1, 26); + TLP_Main.Controls.Add(L_UnknownAC, 0, 27); + TLP_Main.Controls.Add(NUD_UnknownAC, 1, 27); + TLP_Main.Controls.Add(L_ShopLevel, 0, 28); + TLP_Main.Controls.Add(NUD_ShopLevel, 1, 28); + TLP_Main.Controls.Add(L_ShopExperience, 0, 29); + TLP_Main.Controls.Add(NUD_ShopExperience, 1, 29); + TLP_Main.Controls.Add(L_IsInventory, 0, 30); + TLP_Main.Controls.Add(NUD_IsInventory, 1, 30); + TLP_Main.Controls.Add(L_ShopType, 0, 31); + TLP_Main.Controls.Add(CB_ShopType, 1, 31); + TLP_Main.Controls.Add(L_ShopWork, 0, 32); + TLP_Main.Controls.Add(NUD_ShopWork, 1, 32); + TLP_Main.Controls.Add(L_UnusedB8, 0, 33); + TLP_Main.Controls.Add(NUD_UnusedB8, 1, 33); + TLP_Main.Controls.Add(L_UnknownBits0_8, 0, 34); + TLP_Main.Controls.Add(NUD_UnknownBits0_8, 1, 34); + TLP_Main.Controls.Add(L_UnknownBit9, 0, 35); + TLP_Main.Controls.Add(CHK_UnknownBit9, 1, 35); + TLP_Main.Controls.Add(L_UnknownBits10, 0, 36); + TLP_Main.Controls.Add(NUD_UnknownBits10, 1, 36); + TLP_Main.Controls.Add(L_UnknownBits13_20, 0, 37); + TLP_Main.Controls.Add(NUD_UnknownBits13_20, 1, 37); + TLP_Main.Controls.Add(L_UnknownBits21_27, 0, 38); + TLP_Main.Controls.Add(NUD_UnknownBits21_27, 1, 38); + TLP_Main.Controls.Add(L_UnknownBits28_31, 0, 39); + TLP_Main.Controls.Add(NUD_UnknownBits28_31, 1, 39); + TLP_Main.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Main.Location = new System.Drawing.Point(0, 0); + TLP_Main.Margin = new System.Windows.Forms.Padding(0); + TLP_Main.Name = "TLP_Main"; + TLP_Main.Padding = new System.Windows.Forms.Padding(8); + TLP_Main.RowCount = 1; + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_Main.Size = new System.Drawing.Size(720, 1010); + TLP_Main.TabIndex = 0; + // + // L_IsFlag2C + // + L_IsFlag2C.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_IsFlag2C.AutoSize = true; + L_IsFlag2C.Location = new System.Drawing.Point(84, 14); + L_IsFlag2C.Margin = new System.Windows.Forms.Padding(0); + L_IsFlag2C.Name = "L_IsFlag2C"; + L_IsFlag2C.Size = new System.Drawing.Size(39, 17); + L_IsFlag2C.TabIndex = 0; + L_IsFlag2C.Text = "0x2C:"; + // + // CHK_IsFlag2C + // + CHK_IsFlag2C.Location = new System.Drawing.Point(126, 11); + CHK_IsFlag2C.Name = "CHK_IsFlag2C"; + CHK_IsFlag2C.Size = new System.Drawing.Size(104, 24); + CHK_IsFlag2C.TabIndex = 1; + // + // L_AvenueLevel + // + L_AvenueLevel.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_AvenueLevel.AutoSize = true; + L_AvenueLevel.Location = new System.Drawing.Point(37, 42); + L_AvenueLevel.Margin = new System.Windows.Forms.Padding(0); + L_AvenueLevel.Name = "L_AvenueLevel"; + L_AvenueLevel.Size = new System.Drawing.Size(86, 17); + L_AvenueLevel.TabIndex = 2; + L_AvenueLevel.Text = "Avenue Level:"; + // + // NUD_AvenueLevel + // + NUD_AvenueLevel.Location = new System.Drawing.Point(123, 38); + NUD_AvenueLevel.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_AvenueLevel.Maximum = new decimal(new int[] { 127, 0, 0, 0 }); + NUD_AvenueLevel.Name = "NUD_AvenueLevel"; + NUD_AvenueLevel.Size = new System.Drawing.Size(48, 25); + NUD_AvenueLevel.TabIndex = 3; + // + // L_Unused2D + // + L_Unused2D.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Unused2D.AutoSize = true; + L_Unused2D.Location = new System.Drawing.Point(83, 68); + L_Unused2D.Margin = new System.Windows.Forms.Padding(0); + L_Unused2D.Name = "L_Unused2D"; + L_Unused2D.Size = new System.Drawing.Size(40, 17); + L_Unused2D.TabIndex = 4; + L_Unused2D.Text = "0x2D:"; + // + // NUD_Unused2D + // + NUD_Unused2D.Location = new System.Drawing.Point(123, 64); + NUD_Unused2D.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Unused2D.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_Unused2D.Name = "NUD_Unused2D"; + NUD_Unused2D.Size = new System.Drawing.Size(48, 25); + NUD_Unused2D.TabIndex = 5; + // + // L_DesiredShopType + // + L_DesiredShopType.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_DesiredShopType.AutoSize = true; + L_DesiredShopType.Location = new System.Drawing.Point(33, 94); + L_DesiredShopType.Margin = new System.Windows.Forms.Padding(0); + L_DesiredShopType.Name = "L_DesiredShopType"; + L_DesiredShopType.Size = new System.Drawing.Size(90, 17); + L_DesiredShopType.TabIndex = 6; + L_DesiredShopType.Text = "Desired Shop:"; + // + // CB_DesiredShopType + // + CB_DesiredShopType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_DesiredShopType.FormattingEnabled = true; + CB_DesiredShopType.Location = new System.Drawing.Point(123, 90); + CB_DesiredShopType.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + CB_DesiredShopType.Name = "CB_DesiredShopType"; + CB_DesiredShopType.Size = new System.Drawing.Size(121, 25); + CB_DesiredShopType.TabIndex = 7; + // + // L_ShopCounts + // + L_ShopCounts.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_ShopCounts.AutoSize = true; + L_ShopCounts.Location = new System.Drawing.Point(38, 120); + L_ShopCounts.Margin = new System.Windows.Forms.Padding(0); + L_ShopCounts.Name = "L_ShopCounts"; + L_ShopCounts.Size = new System.Drawing.Size(85, 17); + L_ShopCounts.TabIndex = 8; + L_ShopCounts.Text = "Shop Counts:"; + // + // TB_ShopCounts + // + TB_ShopCounts.Location = new System.Drawing.Point(123, 116); + TB_ShopCounts.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + TB_ShopCounts.Name = "TB_ShopCounts"; + TB_ShopCounts.Size = new System.Drawing.Size(260, 25); + TB_ShopCounts.TabIndex = 9; + // + // L_DexSeen + // + L_DexSeen.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_DexSeen.AutoSize = true; + L_DexSeen.Location = new System.Drawing.Point(58, 146); + L_DexSeen.Margin = new System.Windows.Forms.Padding(0); + L_DexSeen.Name = "L_DexSeen"; + L_DexSeen.Size = new System.Drawing.Size(65, 17); + L_DexSeen.TabIndex = 10; + L_DexSeen.Text = "Dex Seen:"; + // + // NUD_DexSeen + // + NUD_DexSeen.Location = new System.Drawing.Point(123, 142); + NUD_DexSeen.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_DexSeen.Maximum = new decimal(new int[] { 1023, 0, 0, 0 }); + NUD_DexSeen.Name = "NUD_DexSeen"; + NUD_DexSeen.Size = new System.Drawing.Size(64, 25); + NUD_DexSeen.TabIndex = 11; + // + // L_FavoriteSpecies + // + L_FavoriteSpecies.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_FavoriteSpecies.AutoSize = true; + L_FavoriteSpecies.Location = new System.Drawing.Point(73, 172); + L_FavoriteSpecies.Margin = new System.Windows.Forms.Padding(0); + L_FavoriteSpecies.Name = "L_FavoriteSpecies"; + L_FavoriteSpecies.Size = new System.Drawing.Size(50, 17); + L_FavoriteSpecies.TabIndex = 12; + L_FavoriteSpecies.Text = "Starter:"; + // + // CB_FavoriteSpecies + // + CB_FavoriteSpecies.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_FavoriteSpecies.FormattingEnabled = true; + CB_FavoriteSpecies.Location = new System.Drawing.Point(123, 168); + CB_FavoriteSpecies.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + CB_FavoriteSpecies.Name = "CB_FavoriteSpecies"; + CB_FavoriteSpecies.Size = new System.Drawing.Size(121, 25); + CB_FavoriteSpecies.TabIndex = 13; + // + // L_MedalRank + // + L_MedalRank.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_MedalRank.AutoSize = true; + L_MedalRank.Location = new System.Drawing.Point(43, 198); + L_MedalRank.Margin = new System.Windows.Forms.Padding(0); + L_MedalRank.Name = "L_MedalRank"; + L_MedalRank.Size = new System.Drawing.Size(80, 17); + L_MedalRank.TabIndex = 14; + L_MedalRank.Text = "Medal Rank:"; + // + // NUD_MedalRank + // + NUD_MedalRank.Location = new System.Drawing.Point(123, 194); + NUD_MedalRank.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_MedalRank.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_MedalRank.Name = "NUD_MedalRank"; + NUD_MedalRank.Size = new System.Drawing.Size(48, 25); + NUD_MedalRank.TabIndex = 15; + // + // L_MedalHint + // + L_MedalHint.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_MedalHint.AutoSize = true; + L_MedalHint.Location = new System.Drawing.Point(48, 224); + L_MedalHint.Margin = new System.Windows.Forms.Padding(0); + L_MedalHint.Name = "L_MedalHint"; + L_MedalHint.Size = new System.Drawing.Size(75, 17); + L_MedalHint.TabIndex = 16; + L_MedalHint.Text = "Medal Hint:"; + // + // NUD_MedalHint + // + NUD_MedalHint.Location = new System.Drawing.Point(123, 220); + NUD_MedalHint.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_MedalHint.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_MedalHint.Name = "NUD_MedalHint"; + NUD_MedalHint.Size = new System.Drawing.Size(48, 25); + NUD_MedalHint.TabIndex = 17; + // + // L_MedalCount + // + L_MedalCount.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_MedalCount.AutoSize = true; + L_MedalCount.Location = new System.Drawing.Point(37, 250); + L_MedalCount.Margin = new System.Windows.Forms.Padding(0); + L_MedalCount.Name = "L_MedalCount"; + L_MedalCount.Size = new System.Drawing.Size(86, 17); + L_MedalCount.TabIndex = 18; + L_MedalCount.Text = "Medal Count:"; + // + // NUD_MedalCount + // + NUD_MedalCount.Location = new System.Drawing.Point(123, 246); + NUD_MedalCount.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_MedalCount.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_MedalCount.Name = "NUD_MedalCount"; + NUD_MedalCount.Size = new System.Drawing.Size(48, 25); + NUD_MedalCount.TabIndex = 19; + // + // L_Date1 + // + L_Date1.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Date1.AutoSize = true; + L_Date1.Location = new System.Drawing.Point(78, 276); + L_Date1.Margin = new System.Windows.Forms.Padding(0); + L_Date1.Name = "L_Date1"; + L_Date1.Size = new System.Drawing.Size(45, 17); + L_Date1.TabIndex = 20; + L_Date1.Text = "Date1:"; + // + // TB_Date1 + // + TB_Date1.Location = new System.Drawing.Point(123, 272); + TB_Date1.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + TB_Date1.Name = "TB_Date1"; + TB_Date1.Size = new System.Drawing.Size(120, 25); + TB_Date1.TabIndex = 21; + // + // L_DateStart + // + L_DateStart.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_DateStart.AutoSize = true; + L_DateStart.Location = new System.Drawing.Point(22, 302); + L_DateStart.Margin = new System.Windows.Forms.Padding(0); + L_DateStart.Name = "L_DateStart"; + L_DateStart.Size = new System.Drawing.Size(101, 17); + L_DateStart.TabIndex = 22; + L_DateStart.Text = "Adventure Start:"; + // + // TB_DateStart + // + TB_DateStart.Location = new System.Drawing.Point(123, 298); + TB_DateStart.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + TB_DateStart.Name = "TB_DateStart"; + TB_DateStart.Size = new System.Drawing.Size(120, 25); + TB_DateStart.TabIndex = 23; + // + // L_DateHall + // + L_DateHall.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_DateHall.AutoSize = true; + L_DateHall.Location = new System.Drawing.Point(39, 328); + L_DateHall.Margin = new System.Windows.Forms.Padding(0); + L_DateHall.Name = "L_DateHall"; + L_DateHall.Size = new System.Drawing.Size(84, 17); + L_DateHall.TabIndex = 24; + L_DateHall.Text = "Hall of Fame:"; + // + // TB_DateHall + // + TB_DateHall.Location = new System.Drawing.Point(123, 324); + TB_DateHall.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + TB_DateHall.Name = "TB_DateHall"; + TB_DateHall.Size = new System.Drawing.Size(120, 25); + TB_DateHall.TabIndex = 25; + // + // L_Records + // + L_Records.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Records.AutoSize = true; + L_Records.Location = new System.Drawing.Point(64, 372); + L_Records.Margin = new System.Windows.Forms.Padding(0); + L_Records.Name = "L_Records"; + L_Records.Size = new System.Drawing.Size(59, 17); + L_Records.TabIndex = 26; + L_Records.Text = "Records:"; + // + // TB_Records + // + TB_Records.Location = new System.Drawing.Point(123, 350); + TB_Records.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + TB_Records.Multiline = true; + TB_Records.Name = "TB_Records"; + TB_Records.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + TB_Records.Size = new System.Drawing.Size(360, 60); + TB_Records.TabIndex = 27; + // + // L_Trivia + // + L_Trivia.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Trivia.AutoSize = true; + L_Trivia.Location = new System.Drawing.Point(82, 415); + L_Trivia.Margin = new System.Windows.Forms.Padding(0); + L_Trivia.Name = "L_Trivia"; + L_Trivia.Size = new System.Drawing.Size(41, 17); + L_Trivia.TabIndex = 28; + L_Trivia.Text = "Trivia:"; + // + // TB_Trivia + // + TB_Trivia.Location = new System.Drawing.Point(123, 411); + TB_Trivia.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + TB_Trivia.Name = "TB_Trivia"; + TB_Trivia.Size = new System.Drawing.Size(360, 25); + TB_Trivia.TabIndex = 29; + // + // L_Activities + // + L_Activities.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Activities.AutoSize = true; + L_Activities.Location = new System.Drawing.Point(62, 441); + L_Activities.Margin = new System.Windows.Forms.Padding(0); + L_Activities.Name = "L_Activities"; + L_Activities.Size = new System.Drawing.Size(61, 17); + L_Activities.TabIndex = 30; + L_Activities.Text = "Activities:"; + // + // TB_Activities + // + TB_Activities.Location = new System.Drawing.Point(123, 437); + TB_Activities.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + TB_Activities.Name = "TB_Activities"; + TB_Activities.Size = new System.Drawing.Size(360, 25); + TB_Activities.TabIndex = 31; + // + // L_ActivityDates + // + L_ActivityDates.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_ActivityDates.AutoSize = true; + L_ActivityDates.Location = new System.Drawing.Point(35, 480); + L_ActivityDates.Margin = new System.Windows.Forms.Padding(0); + L_ActivityDates.Name = "L_ActivityDates"; + L_ActivityDates.Size = new System.Drawing.Size(88, 17); + L_ActivityDates.TabIndex = 32; + L_ActivityDates.Text = "Activity Dates:"; + // + // TB_ActivityDates + // + TB_ActivityDates.Location = new System.Drawing.Point(123, 463); + TB_ActivityDates.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + TB_ActivityDates.Multiline = true; + TB_ActivityDates.Name = "TB_ActivityDates"; + TB_ActivityDates.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + TB_ActivityDates.Size = new System.Drawing.Size(360, 50); + TB_ActivityDates.TabIndex = 33; + // + // L_Origin + // + L_Origin.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Origin.AutoSize = true; + L_Origin.Location = new System.Drawing.Point(76, 518); + L_Origin.Margin = new System.Windows.Forms.Padding(0); + L_Origin.Name = "L_Origin"; + L_Origin.Size = new System.Drawing.Size(47, 17); + L_Origin.TabIndex = 34; + L_Origin.Text = "Origin:"; + // + // CB_Origin + // + CB_Origin.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_Origin.FormattingEnabled = true; + CB_Origin.Location = new System.Drawing.Point(123, 514); + CB_Origin.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + CB_Origin.Name = "CB_Origin"; + CB_Origin.Size = new System.Drawing.Size(121, 25); + CB_Origin.TabIndex = 35; + // + // L_MetHour + // + L_MetHour.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_MetHour.AutoSize = true; + L_MetHour.Location = new System.Drawing.Point(56, 544); + L_MetHour.Margin = new System.Windows.Forms.Padding(0); + L_MetHour.Name = "L_MetHour"; + L_MetHour.Size = new System.Drawing.Size(67, 17); + L_MetHour.TabIndex = 36; + L_MetHour.Text = "Met Hour:"; + // + // NUD_MetHour + // + NUD_MetHour.Location = new System.Drawing.Point(123, 540); + NUD_MetHour.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_MetHour.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_MetHour.Name = "NUD_MetHour"; + NUD_MetHour.Size = new System.Drawing.Size(48, 25); + NUD_MetHour.TabIndex = 37; + // + // L_MetMinute + // + L_MetMinute.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_MetMinute.AutoSize = true; + L_MetMinute.Location = new System.Drawing.Point(45, 570); + L_MetMinute.Margin = new System.Windows.Forms.Padding(0); + L_MetMinute.Name = "L_MetMinute"; + L_MetMinute.Size = new System.Drawing.Size(78, 17); + L_MetMinute.TabIndex = 38; + L_MetMinute.Text = "Met Minute:"; + // + // NUD_MetMinute + // + NUD_MetMinute.Location = new System.Drawing.Point(123, 566); + NUD_MetMinute.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_MetMinute.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_MetMinute.Name = "NUD_MetMinute"; + NUD_MetMinute.Size = new System.Drawing.Size(48, 25); + NUD_MetMinute.TabIndex = 39; + // + // L_UnknownA8 + // + L_UnknownA8.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_UnknownA8.AutoSize = true; + L_UnknownA8.Location = new System.Drawing.Point(84, 596); + L_UnknownA8.Margin = new System.Windows.Forms.Padding(0); + L_UnknownA8.Name = "L_UnknownA8"; + L_UnknownA8.Size = new System.Drawing.Size(39, 17); + L_UnknownA8.TabIndex = 40; + L_UnknownA8.Text = "0xA8:"; + // + // NUD_UnknownA8 + // + NUD_UnknownA8.Location = new System.Drawing.Point(123, 592); + NUD_UnknownA8.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_UnknownA8.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_UnknownA8.Name = "NUD_UnknownA8"; + NUD_UnknownA8.Size = new System.Drawing.Size(48, 25); + NUD_UnknownA8.TabIndex = 41; + // + // L_IsShopChangeAllowed + // + L_IsShopChangeAllowed.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_IsShopChangeAllowed.AutoSize = true; + L_IsShopChangeAllowed.Location = new System.Drawing.Point(8, 619); + L_IsShopChangeAllowed.Margin = new System.Windows.Forms.Padding(0); + L_IsShopChangeAllowed.Name = "L_IsShopChangeAllowed"; + L_IsShopChangeAllowed.Size = new System.Drawing.Size(115, 17); + L_IsShopChangeAllowed.TabIndex = 42; + L_IsShopChangeAllowed.Text = "Can Change Shop:"; + // + // CHK_IsShopChangeAllowed + // + CHK_IsShopChangeAllowed.AutoSize = true; + CHK_IsShopChangeAllowed.Location = new System.Drawing.Point(126, 621); + CHK_IsShopChangeAllowed.Name = "CHK_IsShopChangeAllowed"; + CHK_IsShopChangeAllowed.Size = new System.Drawing.Size(15, 14); + CHK_IsShopChangeAllowed.TabIndex = 43; + // + // L_IsFlagA9_1 + // + L_IsFlagA9_1.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_IsFlagA9_1.AutoSize = true; + L_IsFlagA9_1.Location = new System.Drawing.Point(59, 639); + L_IsFlagA9_1.Margin = new System.Windows.Forms.Padding(0); + L_IsFlagA9_1.Name = "L_IsFlagA9_1"; + L_IsFlagA9_1.Size = new System.Drawing.Size(64, 17); + L_IsFlagA9_1.TabIndex = 44; + L_IsFlagA9_1.Text = "0xA9 Bit1:"; + // + // CHK_IsFlagA9_1 + // + CHK_IsFlagA9_1.AutoSize = true; + CHK_IsFlagA9_1.Location = new System.Drawing.Point(126, 641); + CHK_IsFlagA9_1.Name = "CHK_IsFlagA9_1"; + CHK_IsFlagA9_1.Size = new System.Drawing.Size(15, 14); + CHK_IsFlagA9_1.TabIndex = 45; + // + // L_IsFlagA9_2 + // + L_IsFlagA9_2.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_IsFlagA9_2.AutoSize = true; + L_IsFlagA9_2.Location = new System.Drawing.Point(59, 659); + L_IsFlagA9_2.Margin = new System.Windows.Forms.Padding(0); + L_IsFlagA9_2.Name = "L_IsFlagA9_2"; + L_IsFlagA9_2.Size = new System.Drawing.Size(64, 17); + L_IsFlagA9_2.TabIndex = 46; + L_IsFlagA9_2.Text = "0xA9 Bit2:"; + // + // CHK_IsFlagA9_2 + // + CHK_IsFlagA9_2.AutoSize = true; + CHK_IsFlagA9_2.Location = new System.Drawing.Point(126, 661); + CHK_IsFlagA9_2.Name = "CHK_IsFlagA9_2"; + CHK_IsFlagA9_2.Size = new System.Drawing.Size(15, 14); + CHK_IsFlagA9_2.TabIndex = 47; + // + // L_InteractedToday + // + L_InteractedToday.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_InteractedToday.AutoSize = true; + L_InteractedToday.Location = new System.Drawing.Point(15, 679); + L_InteractedToday.Margin = new System.Windows.Forms.Padding(0); + L_InteractedToday.Name = "L_InteractedToday"; + L_InteractedToday.Size = new System.Drawing.Size(108, 17); + L_InteractedToday.TabIndex = 48; + L_InteractedToday.Text = "Interacted Today:"; + // + // CHK_InteractedToday + // + CHK_InteractedToday.AutoSize = true; + CHK_InteractedToday.Location = new System.Drawing.Point(126, 681); + CHK_InteractedToday.Name = "CHK_InteractedToday"; + CHK_InteractedToday.Size = new System.Drawing.Size(15, 14); + CHK_InteractedToday.TabIndex = 49; + // + // L_IsFlagAA + // + L_IsFlagAA.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_IsFlagAA.AutoSize = true; + L_IsFlagAA.Location = new System.Drawing.Point(83, 699); + L_IsFlagAA.Margin = new System.Windows.Forms.Padding(0); + L_IsFlagAA.Name = "L_IsFlagAA"; + L_IsFlagAA.Size = new System.Drawing.Size(40, 17); + L_IsFlagAA.TabIndex = 50; + L_IsFlagAA.Text = "0xAA:"; + // + // CHK_IsFlagAA + // + CHK_IsFlagAA.AutoSize = true; + CHK_IsFlagAA.Location = new System.Drawing.Point(126, 701); + CHK_IsFlagAA.Name = "CHK_IsFlagAA"; + CHK_IsFlagAA.Size = new System.Drawing.Size(15, 14); + CHK_IsFlagAA.TabIndex = 51; + // + // L_JoinAvenueRank + // + L_JoinAvenueRank.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_JoinAvenueRank.AutoSize = true; + L_JoinAvenueRank.Location = new System.Drawing.Point(38, 722); + L_JoinAvenueRank.Margin = new System.Windows.Forms.Padding(0); + L_JoinAvenueRank.Name = "L_JoinAvenueRank"; + L_JoinAvenueRank.Size = new System.Drawing.Size(85, 17); + L_JoinAvenueRank.TabIndex = 52; + L_JoinAvenueRank.Text = "Avenue Rank:"; + // + // NUD_JoinAvenueRank + // + NUD_JoinAvenueRank.Location = new System.Drawing.Point(123, 718); + NUD_JoinAvenueRank.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_JoinAvenueRank.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_JoinAvenueRank.Name = "NUD_JoinAvenueRank"; + NUD_JoinAvenueRank.Size = new System.Drawing.Size(48, 25); + NUD_JoinAvenueRank.TabIndex = 53; + // + // L_UnknownAC + // + L_UnknownAC.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_UnknownAC.AutoSize = true; + L_UnknownAC.Location = new System.Drawing.Point(83, 748); + L_UnknownAC.Margin = new System.Windows.Forms.Padding(0); + L_UnknownAC.Name = "L_UnknownAC"; + L_UnknownAC.Size = new System.Drawing.Size(40, 17); + L_UnknownAC.TabIndex = 54; + L_UnknownAC.Text = "0xAC:"; + // + // NUD_UnknownAC + // + NUD_UnknownAC.Location = new System.Drawing.Point(123, 744); + NUD_UnknownAC.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_UnknownAC.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_UnknownAC.Name = "NUD_UnknownAC"; + NUD_UnknownAC.Size = new System.Drawing.Size(48, 25); + NUD_UnknownAC.TabIndex = 55; + // + // L_ShopLevel + // + L_ShopLevel.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_ShopLevel.AutoSize = true; + L_ShopLevel.Location = new System.Drawing.Point(49, 774); + L_ShopLevel.Margin = new System.Windows.Forms.Padding(0); + L_ShopLevel.Name = "L_ShopLevel"; + L_ShopLevel.Size = new System.Drawing.Size(74, 17); + L_ShopLevel.TabIndex = 56; + L_ShopLevel.Text = "Shop Level:"; + // + // NUD_ShopLevel + // + NUD_ShopLevel.Location = new System.Drawing.Point(123, 770); + NUD_ShopLevel.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_ShopLevel.Maximum = new decimal(new int[] { 10, 0, 0, 0 }); + NUD_ShopLevel.Name = "NUD_ShopLevel"; + NUD_ShopLevel.Size = new System.Drawing.Size(40, 25); + NUD_ShopLevel.TabIndex = 57; + // + // L_ShopExperience + // + L_ShopExperience.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_ShopExperience.AutoSize = true; + L_ShopExperience.Location = new System.Drawing.Point(49, 800); + L_ShopExperience.Margin = new System.Windows.Forms.Padding(0); + L_ShopExperience.Name = "L_ShopExperience"; + L_ShopExperience.Size = new System.Drawing.Size(74, 17); + L_ShopExperience.TabIndex = 58; + L_ShopExperience.Text = "Experience:"; + // + // NUD_ShopExperience + // + NUD_ShopExperience.Location = new System.Drawing.Point(123, 796); + NUD_ShopExperience.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_ShopExperience.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_ShopExperience.Name = "NUD_ShopExperience"; + NUD_ShopExperience.Size = new System.Drawing.Size(64, 25); + NUD_ShopExperience.TabIndex = 59; + // + // L_IsInventory + // + L_IsInventory.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_IsInventory.AutoSize = true; + L_IsInventory.Location = new System.Drawing.Point(46, 826); + L_IsInventory.Margin = new System.Windows.Forms.Padding(0); + L_IsInventory.Name = "L_IsInventory"; + L_IsInventory.Size = new System.Drawing.Size(77, 17); + L_IsInventory.TabIndex = 60; + L_IsInventory.Text = "Is Inventory:"; + // + // NUD_IsInventory + // + NUD_IsInventory.Location = new System.Drawing.Point(123, 822); + NUD_IsInventory.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_IsInventory.Maximum = new decimal(new int[] { -1, 0, 0, 0 }); + NUD_IsInventory.Name = "NUD_IsInventory"; + NUD_IsInventory.Size = new System.Drawing.Size(120, 25); + NUD_IsInventory.TabIndex = 61; + // + // L_ShopType + // + L_ShopType.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_ShopType.AutoSize = true; + L_ShopType.Location = new System.Drawing.Point(51, 852); + L_ShopType.Margin = new System.Windows.Forms.Padding(0); + L_ShopType.Name = "L_ShopType"; + L_ShopType.Size = new System.Drawing.Size(72, 17); + L_ShopType.TabIndex = 62; + L_ShopType.Text = "Shop Type:"; + // + // CB_ShopType + // + CB_ShopType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_ShopType.FormattingEnabled = true; + CB_ShopType.Location = new System.Drawing.Point(123, 848); + CB_ShopType.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + CB_ShopType.Name = "CB_ShopType"; + CB_ShopType.Size = new System.Drawing.Size(121, 25); + CB_ShopType.TabIndex = 63; + // + // L_ShopWork + // + L_ShopWork.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_ShopWork.AutoSize = true; + L_ShopWork.Location = new System.Drawing.Point(48, 878); + L_ShopWork.Margin = new System.Windows.Forms.Padding(0); + L_ShopWork.Name = "L_ShopWork"; + L_ShopWork.Size = new System.Drawing.Size(75, 17); + L_ShopWork.TabIndex = 64; + L_ShopWork.Text = "Shop Work:"; + // + // NUD_ShopWork + // + NUD_ShopWork.Location = new System.Drawing.Point(123, 874); + NUD_ShopWork.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_ShopWork.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_ShopWork.Name = "NUD_ShopWork"; + NUD_ShopWork.Size = new System.Drawing.Size(64, 25); + NUD_ShopWork.TabIndex = 65; + // + // L_UnusedB8 + // + L_UnusedB8.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_UnusedB8.AutoSize = true; + L_UnusedB8.Location = new System.Drawing.Point(88, 904); + L_UnusedB8.Margin = new System.Windows.Forms.Padding(0); + L_UnusedB8.Name = "L_UnusedB8"; + L_UnusedB8.Size = new System.Drawing.Size(35, 17); + L_UnusedB8.TabIndex = 66; + L_UnusedB8.Text = "0xB8"; + // + // NUD_UnusedB8 + // + NUD_UnusedB8.Location = new System.Drawing.Point(123, 900); + NUD_UnusedB8.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_UnusedB8.Maximum = new decimal(new int[] { -1, 0, 0, 0 }); + NUD_UnusedB8.Name = "NUD_UnusedB8"; + NUD_UnusedB8.Size = new System.Drawing.Size(120, 25); + NUD_UnusedB8.TabIndex = 67; + // + // L_UnknownBits0_8 + // + L_UnknownBits0_8.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_UnknownBits0_8.AutoSize = true; + L_UnknownBits0_8.Location = new System.Drawing.Point(81, 930); + L_UnknownBits0_8.Margin = new System.Windows.Forms.Padding(0); + L_UnknownBits0_8.Name = "L_UnknownBits0_8"; + L_UnknownBits0_8.Size = new System.Drawing.Size(42, 17); + L_UnknownBits0_8.TabIndex = 68; + L_UnknownBits0_8.Text = "0xBit0"; + // + // NUD_UnknownBits0_8 + // + NUD_UnknownBits0_8.Location = new System.Drawing.Point(123, 926); + NUD_UnknownBits0_8.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_UnknownBits0_8.Maximum = new decimal(new int[] { 511, 0, 0, 0 }); + NUD_UnknownBits0_8.Name = "NUD_UnknownBits0_8"; + NUD_UnknownBits0_8.Size = new System.Drawing.Size(48, 25); + NUD_UnknownBits0_8.TabIndex = 69; + // + // L_UnknownBit9 + // + L_UnknownBit9.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_UnknownBit9.AutoSize = true; + L_UnknownBit9.Location = new System.Drawing.Point(83, 953); + L_UnknownBit9.Margin = new System.Windows.Forms.Padding(0); + L_UnknownBit9.Name = "L_UnknownBit9"; + L_UnknownBit9.Size = new System.Drawing.Size(40, 17); + L_UnknownBit9.TabIndex = 70; + L_UnknownBit9.Text = "Unk9:"; + // + // CHK_UnknownBit9 + // + CHK_UnknownBit9.AutoSize = true; + CHK_UnknownBit9.Location = new System.Drawing.Point(126, 955); + CHK_UnknownBit9.Name = "CHK_UnknownBit9"; + CHK_UnknownBit9.Size = new System.Drawing.Size(15, 14); + CHK_UnknownBit9.TabIndex = 71; + // + // L_UnknownBits10 + // + L_UnknownBits10.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_UnknownBits10.AutoSize = true; + L_UnknownBits10.Location = new System.Drawing.Point(76, 976); + L_UnknownBits10.Margin = new System.Windows.Forms.Padding(0); + L_UnknownBits10.Name = "L_UnknownBits10"; + L_UnknownBits10.Size = new System.Drawing.Size(47, 17); + L_UnknownBits10.TabIndex = 72; + L_UnknownBits10.Text = "Unk10:"; + // + // NUD_UnknownBits10 + // + NUD_UnknownBits10.Location = new System.Drawing.Point(123, 972); + NUD_UnknownBits10.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_UnknownBits10.Maximum = new decimal(new int[] { 7, 0, 0, 0 }); + NUD_UnknownBits10.Name = "NUD_UnknownBits10"; + NUD_UnknownBits10.Size = new System.Drawing.Size(40, 25); + NUD_UnknownBits10.TabIndex = 73; + // + // L_UnknownBits13_20 + // + L_UnknownBits13_20.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_UnknownBits13_20.AutoSize = true; + L_UnknownBits13_20.Location = new System.Drawing.Point(57, 1002); + L_UnknownBits13_20.Margin = new System.Windows.Forms.Padding(0); + L_UnknownBits13_20.Name = "L_UnknownBits13_20"; + L_UnknownBits13_20.Size = new System.Drawing.Size(66, 17); + L_UnknownBits13_20.TabIndex = 74; + L_UnknownBits13_20.Text = "Unk13_20:"; + // + // NUD_UnknownBits13_20 + // + NUD_UnknownBits13_20.Location = new System.Drawing.Point(123, 998); + NUD_UnknownBits13_20.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_UnknownBits13_20.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_UnknownBits13_20.Name = "NUD_UnknownBits13_20"; + NUD_UnknownBits13_20.Size = new System.Drawing.Size(48, 25); + NUD_UnknownBits13_20.TabIndex = 75; + // + // L_UnknownBits21_27 + // + L_UnknownBits21_27.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_UnknownBits21_27.AutoSize = true; + L_UnknownBits21_27.Location = new System.Drawing.Point(57, 1028); + L_UnknownBits21_27.Margin = new System.Windows.Forms.Padding(0); + L_UnknownBits21_27.Name = "L_UnknownBits21_27"; + L_UnknownBits21_27.Size = new System.Drawing.Size(66, 17); + L_UnknownBits21_27.TabIndex = 76; + L_UnknownBits21_27.Text = "Unk21_27:"; + // + // NUD_UnknownBits21_27 + // + NUD_UnknownBits21_27.Location = new System.Drawing.Point(123, 1024); + NUD_UnknownBits21_27.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_UnknownBits21_27.Maximum = new decimal(new int[] { 127, 0, 0, 0 }); + NUD_UnknownBits21_27.Name = "NUD_UnknownBits21_27"; + NUD_UnknownBits21_27.Size = new System.Drawing.Size(48, 25); + NUD_UnknownBits21_27.TabIndex = 77; + // + // L_UnknownBits28_31 + // + L_UnknownBits28_31.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_UnknownBits28_31.AutoSize = true; + L_UnknownBits28_31.Location = new System.Drawing.Point(57, 1054); + L_UnknownBits28_31.Margin = new System.Windows.Forms.Padding(0); + L_UnknownBits28_31.Name = "L_UnknownBits28_31"; + L_UnknownBits28_31.Size = new System.Drawing.Size(66, 17); + L_UnknownBits28_31.TabIndex = 78; + L_UnknownBits28_31.Text = "Unk28_31:"; + // + // NUD_UnknownBits28_31 + // + NUD_UnknownBits28_31.Location = new System.Drawing.Point(123, 1050); + NUD_UnknownBits28_31.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_UnknownBits28_31.Maximum = new decimal(new int[] { 15, 0, 0, 0 }); + NUD_UnknownBits28_31.Name = "NUD_UnknownBits28_31"; + NUD_UnknownBits28_31.Size = new System.Drawing.Size(40, 25); + NUD_UnknownBits28_31.TabIndex = 79; + // + // JoinAvenueVisitorSpecificEditor + // + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + Controls.Add(TLP_Main); + Margin = new System.Windows.Forms.Padding(0); + Name = "JoinAvenueVisitorSpecificEditor"; + Size = new System.Drawing.Size(720, 1010); + TLP_Main.ResumeLayout(false); + TLP_Main.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_AvenueLevel).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unused2D).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_DexSeen).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_MedalRank).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_MedalHint).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_MedalCount).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_MetHour).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_MetMinute).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UnknownA8).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_JoinAvenueRank).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UnknownAC).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_ShopLevel).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_ShopExperience).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_IsInventory).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_ShopWork).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UnusedB8).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UnknownBits0_8).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UnknownBits10).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UnknownBits13_20).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UnknownBits21_27).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UnknownBits28_31).EndInit(); + ResumeLayout(false); + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel TLP_Main; + private System.Windows.Forms.Label L_IsFlag2C; + private System.Windows.Forms.CheckBox CHK_IsFlag2C; + private System.Windows.Forms.Label L_AvenueLevel; + private System.Windows.Forms.NumericUpDown NUD_AvenueLevel; + private System.Windows.Forms.Label L_Unused2D; + private System.Windows.Forms.NumericUpDown NUD_Unused2D; + private System.Windows.Forms.Label L_DesiredShopType; + private System.Windows.Forms.ComboBox CB_DesiredShopType; + private System.Windows.Forms.Label L_ShopCounts; + private System.Windows.Forms.TextBox TB_ShopCounts; + private System.Windows.Forms.Label L_DexSeen; + private System.Windows.Forms.NumericUpDown NUD_DexSeen; + private System.Windows.Forms.Label L_FavoriteSpecies; + private System.Windows.Forms.ComboBox CB_FavoriteSpecies; + private System.Windows.Forms.Label L_MedalRank; + private System.Windows.Forms.NumericUpDown NUD_MedalRank; + private System.Windows.Forms.Label L_MedalHint; + private System.Windows.Forms.NumericUpDown NUD_MedalHint; + private System.Windows.Forms.Label L_MedalCount; + private System.Windows.Forms.NumericUpDown NUD_MedalCount; + private System.Windows.Forms.Label L_Date1; + private System.Windows.Forms.TextBox TB_Date1; + private System.Windows.Forms.Label L_DateStart; + private System.Windows.Forms.TextBox TB_DateStart; + private System.Windows.Forms.Label L_DateHall; + private System.Windows.Forms.TextBox TB_DateHall; + private System.Windows.Forms.Label L_Records; + private System.Windows.Forms.TextBox TB_Records; + private System.Windows.Forms.Label L_Trivia; + private System.Windows.Forms.TextBox TB_Trivia; + private System.Windows.Forms.Label L_Activities; + private System.Windows.Forms.TextBox TB_Activities; + private System.Windows.Forms.Label L_ActivityDates; + private System.Windows.Forms.TextBox TB_ActivityDates; + private System.Windows.Forms.Label L_Origin; + private System.Windows.Forms.ComboBox CB_Origin; + private System.Windows.Forms.Label L_MetHour; + private System.Windows.Forms.NumericUpDown NUD_MetHour; + private System.Windows.Forms.Label L_MetMinute; + private System.Windows.Forms.NumericUpDown NUD_MetMinute; + private System.Windows.Forms.Label L_UnknownA8; + private System.Windows.Forms.NumericUpDown NUD_UnknownA8; + private System.Windows.Forms.Label L_IsShopChangeAllowed; + private System.Windows.Forms.CheckBox CHK_IsShopChangeAllowed; + private System.Windows.Forms.Label L_IsFlagA9_1; + private System.Windows.Forms.CheckBox CHK_IsFlagA9_1; + private System.Windows.Forms.Label L_IsFlagA9_2; + private System.Windows.Forms.CheckBox CHK_IsFlagA9_2; + private System.Windows.Forms.Label L_InteractedToday; + private System.Windows.Forms.CheckBox CHK_InteractedToday; + private System.Windows.Forms.Label L_IsFlagAA; + private System.Windows.Forms.CheckBox CHK_IsFlagAA; + private System.Windows.Forms.Label L_JoinAvenueRank; + private System.Windows.Forms.NumericUpDown NUD_JoinAvenueRank; + private System.Windows.Forms.Label L_UnknownAC; + private System.Windows.Forms.NumericUpDown NUD_UnknownAC; + private System.Windows.Forms.Label L_ShopLevel; + private System.Windows.Forms.NumericUpDown NUD_ShopLevel; + private System.Windows.Forms.Label L_ShopExperience; + private System.Windows.Forms.NumericUpDown NUD_ShopExperience; + private System.Windows.Forms.Label L_IsInventory; + private System.Windows.Forms.NumericUpDown NUD_IsInventory; + private System.Windows.Forms.Label L_ShopType; + private System.Windows.Forms.ComboBox CB_ShopType; + private System.Windows.Forms.Label L_ShopWork; + private System.Windows.Forms.NumericUpDown NUD_ShopWork; + private System.Windows.Forms.Label L_UnusedB8; + private System.Windows.Forms.NumericUpDown NUD_UnusedB8; + private System.Windows.Forms.Label L_UnknownBits0_8; + private System.Windows.Forms.NumericUpDown NUD_UnknownBits0_8; + private System.Windows.Forms.Label L_UnknownBit9; + private System.Windows.Forms.CheckBox CHK_UnknownBit9; + private System.Windows.Forms.Label L_UnknownBits10; + private System.Windows.Forms.NumericUpDown NUD_UnknownBits10; + private System.Windows.Forms.Label L_UnknownBits13_20; + private System.Windows.Forms.NumericUpDown NUD_UnknownBits13_20; + private System.Windows.Forms.Label L_UnknownBits21_27; + private System.Windows.Forms.NumericUpDown NUD_UnknownBits21_27; + private System.Windows.Forms.Label L_UnknownBits28_31; + private System.Windows.Forms.NumericUpDown NUD_UnknownBits28_31; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueVisitorSpecificEditor.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueVisitorSpecificEditor.cs new file mode 100644 index 000000000..aa54d3962 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/JoinAvenueVisitorSpecificEditor.cs @@ -0,0 +1,233 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms; + +public sealed partial class JoinAvenueVisitorSpecificEditor : UserControl, IJoinAvenueSpecificEditor +{ + private static readonly List ShopTypeList = Enum.GetValues().Select(z => new ComboItem(z.ToString(), (int)z)).ToList(); + private static readonly List OriginList = [new("NPC", 0), new("Human Player", 1)]; + + public JoinAvenueVisitorSpecificEditor() + { + InitializeComponent(); + InitializeCombo(CB_DesiredShopType, ShopTypeList); + InitializeCombo(CB_FavoriteSpecies, GameInfo.FilteredSources.Species.ToList()); + InitializeCombo(CB_Origin, OriginList); + InitializeCombo(CB_ShopType, ShopTypeList); + } + + public void LoadObject(JoinAvenueVisitor5 entity) + { + CHK_IsFlag2C.Checked = entity.IsFlag2C; + NUD_AvenueLevel.Value = Math.Clamp(entity.JoinAvenueLevel, (byte)0, (byte)NUD_AvenueLevel.Maximum); + NUD_Unused2D.Value = Math.Clamp(entity.Unused2D, (byte)0, (byte)NUD_Unused2D.Maximum); + SetComboValue(CB_DesiredShopType, entity.DesiredShopType); + + byte[] counts = + [ + entity.ShopCountRaffle, entity.ShopCountSalon, entity.ShopCountMarket, entity.ShopCountFlorist, + entity.ShopCountDojo, entity.ShopCountNurse, entity.ShopCountAntique, entity.ShopCountCafe, + ]; + TB_ShopCounts.Text = string.Join(", ", counts); + NUD_DexSeen.Value = Math.Clamp(entity.DexSeen, (ushort)0, (ushort)NUD_DexSeen.Maximum); + SetComboValue(CB_FavoriteSpecies, entity.FavoriteSpecies); + NUD_MedalRank.Value = Math.Clamp(entity.MedalRank, (byte)0, (byte)NUD_MedalRank.Maximum); + NUD_MedalHint.Value = Math.Clamp(entity.MedalHint, (byte)0, (byte)NUD_MedalHint.Maximum); + NUD_MedalCount.Value = Math.Clamp(entity.MedalCount, (byte)0, (byte)NUD_MedalCount.Maximum); + TB_Date1.Text = FormatDate(entity.Date1.RawValue); + TB_DateStart.Text = FormatDate(entity.DateAdventureStart.RawValue); + TB_DateHall.Text = FormatDate(entity.DateHallOfFame.RawValue); + + var records = new uint[(int)JoinAvenueRecordIndex5.COUNT_MAX]; + for (int i = 0; i < records.Length; i++) + records[i] = entity.GetRecord((JoinAvenueRecordIndex5)i); + TB_Records.Text = string.Join(", ", records); + + var trivia = new byte[JoinAvenueVisitor5.TriviaCount]; + for (int i = 0; i < trivia.Length; i++) + trivia[i] = entity.GetTrivia(i); + TB_Trivia.Text = string.Join(", ", trivia); + + var activities = new byte[JoinAvenueVisitor5.ActivityCount]; + var dates = new string[JoinAvenueVisitor5.ActivityCount]; + for (int i = 0; i < activities.Length; i++) + { + activities[i] = entity.GetActivity(i); + dates[i] = FormatDate(entity.GetActivityDate(i).RawValue); + } + + TB_Activities.Text = string.Join(", ", activities); + TB_ActivityDates.Text = string.Join(", ", dates); + SetComboValue(CB_Origin, entity.Origin); + NUD_MetHour.Value = Math.Clamp(entity.MetHour, (byte)0, (byte)NUD_MetHour.Maximum); + NUD_MetMinute.Value = Math.Clamp(entity.MetMinute, (byte)0, (byte)NUD_MetMinute.Maximum); + NUD_UnknownA8.Value = Math.Clamp(entity.UnknownA8, (byte)0, (byte)NUD_UnknownA8.Maximum); + CHK_IsShopChangeAllowed.Checked = entity.IsShopChangeAllowed; + CHK_IsFlagA9_1.Checked = entity.IsFlagA9_1; + CHK_IsFlagA9_2.Checked = entity.IsFlagA9_2; + CHK_InteractedToday.Checked = entity.IsInteractedToday; + CHK_IsFlagAA.Checked = entity.IsFlagAA; + NUD_JoinAvenueRank.Value = Math.Clamp(entity.JoinAvenueRank, (byte)0, (byte)NUD_JoinAvenueRank.Maximum); + NUD_UnknownAC.Value = Math.Clamp(entity.UnknownAC, (byte)0, (byte)NUD_UnknownAC.Maximum); + NUD_ShopLevel.Value = Math.Clamp(entity.ShopLevel, (byte)0, (byte)NUD_ShopLevel.Maximum); + NUD_ShopExperience.Value = Math.Clamp(entity.ShopExperience, (ushort)0, (ushort)NUD_ShopExperience.Maximum); + NUD_IsInventory.Value = Math.Clamp(entity.IsInventory, 0, (uint)NUD_IsInventory.Maximum); + SetComboValue(CB_ShopType, (int)entity.ShopType); + NUD_ShopWork.Value = Math.Clamp(entity.ShopWork, (ushort)0, (ushort)NUD_ShopWork.Maximum); + NUD_UnusedB8.Value = Math.Clamp(entity.UnusedB8, 0, (uint)NUD_UnusedB8.Maximum); + NUD_UnknownBits0_8.Value = Math.Clamp(entity.UnknownBits0_8, (ushort)0, (ushort)NUD_UnknownBits0_8.Maximum); + CHK_UnknownBit9.Checked = entity.IsUnknownBits9; + NUD_UnknownBits10.Value = Math.Clamp(entity.UnknownBits10, (byte)0, (byte)NUD_UnknownBits10.Maximum); + NUD_UnknownBits13_20.Value = Math.Clamp(entity.UnknownBits13_20, (byte)0, (byte)NUD_UnknownBits13_20.Maximum); + NUD_UnknownBits21_27.Value = Math.Clamp(entity.UnknownBits21_27, (byte)0, (byte)NUD_UnknownBits21_27.Maximum); + NUD_UnknownBits28_31.Value = Math.Clamp(entity.UnknownBits28_31, (byte)0, (byte)NUD_UnknownBits28_31.Maximum); + } + + public void SaveObject(JoinAvenueVisitor5 entity) + { + entity.IsFlag2C = CHK_IsFlag2C.Checked; + entity.JoinAvenueLevel = (byte)NUD_AvenueLevel.Value; + entity.Unused2D = (byte)NUD_Unused2D.Value; + entity.DesiredShopType = (ushort)WinFormsUtil.GetIndex(CB_DesiredShopType); + + var shopCounts = ParseByteList(TB_ShopCounts.Text, 8, 0x0F); + entity.ShopCountRaffle = shopCounts[0]; + entity.ShopCountSalon = shopCounts[1]; + entity.ShopCountMarket = shopCounts[2]; + entity.ShopCountFlorist = shopCounts[3]; + entity.ShopCountDojo = shopCounts[4]; + entity.ShopCountNurse = shopCounts[5]; + entity.ShopCountAntique = shopCounts[6]; + entity.ShopCountCafe = shopCounts[7]; + + entity.DexSeen = (ushort)NUD_DexSeen.Value; + entity.FavoriteSpecies = (ushort)WinFormsUtil.GetIndex(CB_FavoriteSpecies); + entity.MedalRank = (byte)NUD_MedalRank.Value; + entity.MedalHint = (byte)NUD_MedalHint.Value; + entity.MedalCount = (byte)NUD_MedalCount.Value; + entity.Date1 = new JoinAvenueDate5(ParseDate(TB_Date1.Text)); + entity.DateAdventureStart = new JoinAvenueDate5(ParseDate(TB_DateStart.Text)); + entity.DateHallOfFame = new JoinAvenueDate5(ParseDate(TB_DateHall.Text)); + + var records = ParseUIntList(TB_Records.Text, (int)JoinAvenueRecordIndex5.COUNT_MAX); + for (int i = 0; i < records.Length; i++) + entity.SetRecord((JoinAvenueRecordIndex5)i, records[i]); + + var trivia = ParseByteList(TB_Trivia.Text, JoinAvenueVisitor5.TriviaCount, byte.MaxValue); + for (int i = 0; i < trivia.Length; i++) + entity.SetTrivia(i, trivia[i]); + + var activities = ParseByteList(TB_Activities.Text, JoinAvenueVisitor5.ActivityCount, byte.MaxValue); + var activityDates = ParseDateList(TB_ActivityDates.Text, JoinAvenueVisitor5.ActivityCount); + for (int i = 0; i < activities.Length; i++) + { + entity.SetActivity(i, activities[i]); + entity.SetActivityDate(i, new JoinAvenueDate5(activityDates[i])); + } + + entity.Origin = (ushort)WinFormsUtil.GetIndex(CB_Origin); + entity.MetHour = (byte)NUD_MetHour.Value; + entity.MetMinute = (byte)NUD_MetMinute.Value; + entity.UnknownA8 = (byte)NUD_UnknownA8.Value; + entity.IsShopChangeAllowed = CHK_IsShopChangeAllowed.Checked; + entity.IsFlagA9_1 = CHK_IsFlagA9_1.Checked; + entity.IsFlagA9_2 = CHK_IsFlagA9_2.Checked; + entity.IsInteractedToday = CHK_InteractedToday.Checked; + entity.IsFlagAA = CHK_IsFlagAA.Checked; + entity.JoinAvenueRank = (byte)NUD_JoinAvenueRank.Value; + entity.UnknownAC = (byte)NUD_UnknownAC.Value; + entity.ShopLevel = (byte)NUD_ShopLevel.Value; + entity.ShopExperience = (ushort)NUD_ShopExperience.Value; + entity.IsInventory = (uint)NUD_IsInventory.Value; + entity.ShopType = (JoinAvenueShopType5)WinFormsUtil.GetIndex(CB_ShopType); + entity.ShopWork = (ushort)NUD_ShopWork.Value; + entity.UnusedB8 = (uint)NUD_UnusedB8.Value; + entity.UnknownBits0_8 = (ushort)NUD_UnknownBits0_8.Value; + entity.IsUnknownBits9 = CHK_UnknownBit9.Checked; + entity.UnknownBits10 = (byte)NUD_UnknownBits10.Value; + entity.UnknownBits13_20 = (byte)NUD_UnknownBits13_20.Value; + entity.UnknownBits21_27 = (byte)NUD_UnknownBits21_27.Value; + entity.UnknownBits28_31 = (byte)NUD_UnknownBits28_31.Value; + } + + private static void InitializeCombo(ComboBox cb, IReadOnlyList source) + { + cb.InitializeBinding(); + cb.DataSource = new BindingSource(source, string.Empty); + } + + private static void SetComboValue(ComboBox cb, int value) => cb.SelectedValue = value; + + private static string FormatDate(ushort raw) + { + if (raw == 0) + return string.Empty; + + var date = new JoinAvenueDate5(raw); + return date.Date is { } value ? value.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture) : $"0x{raw:X4}"; + } + + private static ushort ParseDate(string text) + { + text = text.Trim(); + if (string.IsNullOrWhiteSpace(text)) + return 0; + if (TryParseUInt(text, out var raw)) + return (ushort)Math.Min(raw, ushort.MaxValue); + if (DateOnly.TryParse(text, CultureInfo.InvariantCulture, DateTimeStyles.None, out var date)) + { + JoinAvenueDate5 value = default; + value.Date = date; + return value.RawValue; + } + return 0; + } + + private static byte[] ParseByteList(string text, int count, byte max) + { + var result = new byte[count]; + var split = Split(text); + for (int i = 0; i < count && i < split.Length; i++) + { + if (TryParseUInt(split[i], out var value)) + result[i] = (byte)Math.Min(value, max); + } + return result; + } + + private static uint[] ParseUIntList(string text, int count) + { + var result = new uint[count]; + var split = Split(text); + for (int i = 0; i < count && i < split.Length; i++) + { + if (TryParseUInt(split[i], out var value)) + result[i] = value; + } + return result; + } + + private static ushort[] ParseDateList(string text, int count) + { + var result = new ushort[count]; + var split = Split(text); + for (int i = 0; i < count && i < split.Length; i++) + result[i] = ParseDate(split[i]); + return result; + } + + private static string[] Split(string text) => text.Split([',', ';', '|', '\r', '\n'], StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + + private static bool TryParseUInt(string text, out uint value) + { + text = text.Trim(); + if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) + return uint.TryParse(text[2..], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out value); + return uint.TryParse(text, NumberStyles.Integer, CultureInfo.InvariantCulture, out value); + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/SAV_JoinAvenue.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/SAV_JoinAvenue.Designer.cs new file mode 100644 index 000000000..78d8f171c --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/SAV_JoinAvenue.Designer.cs @@ -0,0 +1,384 @@ +namespace PKHeX.WinForms +{ + partial class SAV_JoinAvenue + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + components.Dispose(); + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + private void InitializeComponent() + { + TC_JoinAvenue = new System.Windows.Forms.TabControl(); + Tab_Settings = new System.Windows.Forms.TabPage(); + UC_Settings = new JoinAvenueSettingsEditor(); + TLP_SettingsTop = new System.Windows.Forms.TableLayoutPanel(); + CHK_ScriptFlag = new System.Windows.Forms.CheckBox(); + L_VisitorCount = new System.Windows.Forms.Label(); + NUD_VisitorCount = new System.Windows.Forms.NumericUpDown(); + L_FanCount = new System.Windows.Forms.Label(); + NUD_FanCount = new System.Windows.Forms.NumericUpDown(); + Tab_Visitors = new System.Windows.Forms.TabPage(); + P_Visitors = new System.Windows.Forms.Panel(); + Tab_Fans = new System.Windows.Forms.TabPage(); + P_Fans = new System.Windows.Forms.Panel(); + Tab_Occupants = new System.Windows.Forms.TabPage(); + P_Occupants = new System.Windows.Forms.Panel(); + Tab_Assistants = new System.Windows.Forms.TabPage(); + P_Assistants = new System.Windows.Forms.Panel(); + Tab_Self = new System.Windows.Forms.TabPage(); + TC_Self = new System.Windows.Forms.TabControl(); + Tab_SelfGeneral = new System.Windows.Forms.TabPage(); + UC_SelfGeneral = new JoinAvenueEntityGeneralEditor(); + Tab_SelfSpecific = new System.Windows.Forms.TabPage(); + UC_SelfSpecific = new JoinAvenueVisitorSpecificEditor(); + B_Cancel = new System.Windows.Forms.Button(); + B_Save = new System.Windows.Forms.Button(); + TC_JoinAvenue.SuspendLayout(); + Tab_Settings.SuspendLayout(); + TLP_SettingsTop.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_VisitorCount).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_FanCount).BeginInit(); + Tab_Visitors.SuspendLayout(); + Tab_Fans.SuspendLayout(); + Tab_Occupants.SuspendLayout(); + Tab_Assistants.SuspendLayout(); + Tab_Self.SuspendLayout(); + TC_Self.SuspendLayout(); + Tab_SelfGeneral.SuspendLayout(); + Tab_SelfSpecific.SuspendLayout(); + SuspendLayout(); + // + // TC_JoinAvenue + // + TC_JoinAvenue.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + TC_JoinAvenue.Controls.Add(Tab_Settings); + TC_JoinAvenue.Controls.Add(Tab_Visitors); + TC_JoinAvenue.Controls.Add(Tab_Fans); + TC_JoinAvenue.Controls.Add(Tab_Occupants); + TC_JoinAvenue.Controls.Add(Tab_Assistants); + TC_JoinAvenue.Controls.Add(Tab_Self); + TC_JoinAvenue.Location = new System.Drawing.Point(0, 0); + TC_JoinAvenue.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TC_JoinAvenue.Name = "TC_JoinAvenue"; + TC_JoinAvenue.SelectedIndex = 0; + TC_JoinAvenue.Size = new System.Drawing.Size(964, 687); + TC_JoinAvenue.TabIndex = 0; + // + // Tab_Settings + // + Tab_Settings.Controls.Add(UC_Settings); + Tab_Settings.Controls.Add(TLP_SettingsTop); + Tab_Settings.Location = new System.Drawing.Point(4, 26); + Tab_Settings.Name = "Tab_Settings"; + Tab_Settings.Padding = new System.Windows.Forms.Padding(3); + Tab_Settings.Size = new System.Drawing.Size(956, 657); + Tab_Settings.TabIndex = 0; + Tab_Settings.Text = "Settings"; + Tab_Settings.UseVisualStyleBackColor = true; + // + // UC_Settings + // + UC_Settings.Dock = System.Windows.Forms.DockStyle.Fill; + UC_Settings.Location = new System.Drawing.Point(3, 96); + UC_Settings.Margin = new System.Windows.Forms.Padding(0); + UC_Settings.Name = "UC_Settings"; + UC_Settings.Size = new System.Drawing.Size(950, 558); + UC_Settings.TabIndex = 1; + // + // TLP_SettingsTop + // + TLP_SettingsTop.AutoSize = true; + TLP_SettingsTop.ColumnCount = 2; + TLP_SettingsTop.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_SettingsTop.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_SettingsTop.Controls.Add(CHK_ScriptFlag, 1, 0); + TLP_SettingsTop.Controls.Add(L_VisitorCount, 0, 1); + TLP_SettingsTop.Controls.Add(NUD_VisitorCount, 1, 1); + TLP_SettingsTop.Controls.Add(L_FanCount, 0, 2); + TLP_SettingsTop.Controls.Add(NUD_FanCount, 1, 2); + TLP_SettingsTop.Dock = System.Windows.Forms.DockStyle.Top; + TLP_SettingsTop.Location = new System.Drawing.Point(3, 3); + TLP_SettingsTop.Name = "TLP_SettingsTop"; + TLP_SettingsTop.Padding = new System.Windows.Forms.Padding(8); + TLP_SettingsTop.RowCount = 3; + TLP_SettingsTop.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_SettingsTop.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_SettingsTop.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_SettingsTop.Size = new System.Drawing.Size(950, 93); + TLP_SettingsTop.TabIndex = 0; + // + // CHK_ScriptFlag + // + CHK_ScriptFlag.Anchor = System.Windows.Forms.AnchorStyles.Left; + CHK_ScriptFlag.AutoSize = true; + CHK_ScriptFlag.Location = new System.Drawing.Point(97, 11); + CHK_ScriptFlag.Name = "CHK_ScriptFlag"; + CHK_ScriptFlag.Size = new System.Drawing.Size(74, 21); + CHK_ScriptFlag.TabIndex = 1; + CHK_ScriptFlag.Text = "Script Flag"; + CHK_ScriptFlag.UseVisualStyleBackColor = true; + // + // L_VisitorCount + // + L_VisitorCount.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_VisitorCount.AutoSize = true; + L_VisitorCount.Location = new System.Drawing.Point(8, 39); + L_VisitorCount.Margin = new System.Windows.Forms.Padding(0); + L_VisitorCount.Name = "L_VisitorCount"; + L_VisitorCount.Size = new System.Drawing.Size(86, 17); + L_VisitorCount.TabIndex = 2; + L_VisitorCount.Text = "Visitor Count:"; + // + // NUD_VisitorCount + // + NUD_VisitorCount.Location = new System.Drawing.Point(94, 35); + NUD_VisitorCount.Margin = new System.Windows.Forms.Padding(0); + NUD_VisitorCount.Maximum = new decimal(new int[] { -1, 0, 0, 0 }); + NUD_VisitorCount.Name = "NUD_VisitorCount"; + NUD_VisitorCount.Size = new System.Drawing.Size(120, 25); + NUD_VisitorCount.TabIndex = 3; + // + // L_FanCount + // + L_FanCount.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_FanCount.AutoSize = true; + L_FanCount.Location = new System.Drawing.Point(25, 64); + L_FanCount.Margin = new System.Windows.Forms.Padding(0); + L_FanCount.Name = "L_FanCount"; + L_FanCount.Size = new System.Drawing.Size(69, 17); + L_FanCount.TabIndex = 4; + L_FanCount.Text = "Fan Count:"; + // + // NUD_FanCount + // + NUD_FanCount.Location = new System.Drawing.Point(94, 60); + NUD_FanCount.Margin = new System.Windows.Forms.Padding(0); + NUD_FanCount.Maximum = new decimal(new int[] { -1, 0, 0, 0 }); + NUD_FanCount.Name = "NUD_FanCount"; + NUD_FanCount.Size = new System.Drawing.Size(120, 25); + NUD_FanCount.TabIndex = 5; + // + // Tab_Visitors + // + Tab_Visitors.Controls.Add(P_Visitors); + Tab_Visitors.Location = new System.Drawing.Point(4, 26); + Tab_Visitors.Name = "Tab_Visitors"; + Tab_Visitors.Padding = new System.Windows.Forms.Padding(3); + Tab_Visitors.Size = new System.Drawing.Size(956, 657); + Tab_Visitors.TabIndex = 1; + Tab_Visitors.Text = "Visitors"; + Tab_Visitors.UseVisualStyleBackColor = true; + // + // P_Visitors + // + P_Visitors.Dock = System.Windows.Forms.DockStyle.Fill; + P_Visitors.Location = new System.Drawing.Point(3, 3); + P_Visitors.Name = "P_Visitors"; + P_Visitors.Size = new System.Drawing.Size(950, 651); + P_Visitors.TabIndex = 0; + // + // Tab_Fans + // + Tab_Fans.Controls.Add(P_Fans); + Tab_Fans.Location = new System.Drawing.Point(4, 26); + Tab_Fans.Name = "Tab_Fans"; + Tab_Fans.Padding = new System.Windows.Forms.Padding(3); + Tab_Fans.Size = new System.Drawing.Size(956, 657); + Tab_Fans.TabIndex = 2; + Tab_Fans.Text = "Fans"; + Tab_Fans.UseVisualStyleBackColor = true; + // + // P_Fans + // + P_Fans.Dock = System.Windows.Forms.DockStyle.Fill; + P_Fans.Location = new System.Drawing.Point(3, 3); + P_Fans.Name = "P_Fans"; + P_Fans.Size = new System.Drawing.Size(950, 651); + P_Fans.TabIndex = 0; + // + // Tab_Occupants + // + Tab_Occupants.Controls.Add(P_Occupants); + Tab_Occupants.Location = new System.Drawing.Point(4, 26); + Tab_Occupants.Name = "Tab_Occupants"; + Tab_Occupants.Padding = new System.Windows.Forms.Padding(3); + Tab_Occupants.Size = new System.Drawing.Size(956, 657); + Tab_Occupants.TabIndex = 3; + Tab_Occupants.Text = "Occupants"; + Tab_Occupants.UseVisualStyleBackColor = true; + // + // P_Occupants + // + P_Occupants.Dock = System.Windows.Forms.DockStyle.Fill; + P_Occupants.Location = new System.Drawing.Point(3, 3); + P_Occupants.Name = "P_Occupants"; + P_Occupants.Size = new System.Drawing.Size(950, 651); + P_Occupants.TabIndex = 0; + // + // Tab_Assistants + // + Tab_Assistants.Controls.Add(P_Assistants); + Tab_Assistants.Location = new System.Drawing.Point(4, 26); + Tab_Assistants.Name = "Tab_Assistants"; + Tab_Assistants.Padding = new System.Windows.Forms.Padding(3); + Tab_Assistants.Size = new System.Drawing.Size(956, 657); + Tab_Assistants.TabIndex = 4; + Tab_Assistants.Text = "Assistants"; + Tab_Assistants.UseVisualStyleBackColor = true; + // + // P_Assistants + // + P_Assistants.Dock = System.Windows.Forms.DockStyle.Fill; + P_Assistants.Location = new System.Drawing.Point(3, 3); + P_Assistants.Name = "P_Assistants"; + P_Assistants.Size = new System.Drawing.Size(950, 651); + P_Assistants.TabIndex = 0; + // + // Tab_Self + // + Tab_Self.Controls.Add(TC_Self); + Tab_Self.Location = new System.Drawing.Point(4, 26); + Tab_Self.Name = "Tab_Self"; + Tab_Self.Padding = new System.Windows.Forms.Padding(3); + Tab_Self.Size = new System.Drawing.Size(956, 657); + Tab_Self.TabIndex = 5; + Tab_Self.Text = "Self"; + Tab_Self.UseVisualStyleBackColor = true; + // + // TC_Self + // + TC_Self.Controls.Add(Tab_SelfGeneral); + TC_Self.Controls.Add(Tab_SelfSpecific); + TC_Self.Dock = System.Windows.Forms.DockStyle.Fill; + TC_Self.Location = new System.Drawing.Point(3, 3); + TC_Self.Name = "TC_Self"; + TC_Self.SelectedIndex = 0; + TC_Self.Size = new System.Drawing.Size(950, 651); + TC_Self.TabIndex = 0; + // + // Tab_SelfGeneral + // + Tab_SelfGeneral.Controls.Add(UC_SelfGeneral); + Tab_SelfGeneral.Location = new System.Drawing.Point(4, 26); + Tab_SelfGeneral.Name = "Tab_SelfGeneral"; + Tab_SelfGeneral.Size = new System.Drawing.Size(942, 621); + Tab_SelfGeneral.TabIndex = 0; + Tab_SelfGeneral.Text = "General"; + Tab_SelfGeneral.UseVisualStyleBackColor = true; + // + // UC_SelfGeneral + // + UC_SelfGeneral.Dock = System.Windows.Forms.DockStyle.Fill; + UC_SelfGeneral.Location = new System.Drawing.Point(0, 0); + UC_SelfGeneral.Margin = new System.Windows.Forms.Padding(0); + UC_SelfGeneral.Name = "UC_SelfGeneral"; + UC_SelfGeneral.Size = new System.Drawing.Size(942, 621); + UC_SelfGeneral.TabIndex = 0; + // + // Tab_SelfSpecific + // + Tab_SelfSpecific.Controls.Add(UC_SelfSpecific); + Tab_SelfSpecific.Location = new System.Drawing.Point(4, 26); + Tab_SelfSpecific.Name = "Tab_SelfSpecific"; + Tab_SelfSpecific.Size = new System.Drawing.Size(942, 621); + Tab_SelfSpecific.TabIndex = 1; + Tab_SelfSpecific.Text = "Specific"; + Tab_SelfSpecific.UseVisualStyleBackColor = true; + // + // UC_SelfSpecific + // + UC_SelfSpecific.Dock = System.Windows.Forms.DockStyle.Fill; + UC_SelfSpecific.Location = new System.Drawing.Point(0, 0); + UC_SelfSpecific.Margin = new System.Windows.Forms.Padding(0); + UC_SelfSpecific.Name = "UC_SelfSpecific"; + UC_SelfSpecific.Size = new System.Drawing.Size(942, 621); + UC_SelfSpecific.TabIndex = 0; + // + // B_Cancel + // + B_Cancel.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; + B_Cancel.Location = new System.Drawing.Point(712, 690); + B_Cancel.Name = "B_Cancel"; + B_Cancel.Size = new System.Drawing.Size(120, 27); + B_Cancel.TabIndex = 1; + B_Cancel.Text = "Cancel"; + B_Cancel.UseVisualStyleBackColor = true; + B_Cancel.Click += B_Cancel_Click; + // + // B_Save + // + B_Save.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; + B_Save.Location = new System.Drawing.Point(838, 690); + B_Save.Name = "B_Save"; + B_Save.Size = new System.Drawing.Size(120, 27); + B_Save.TabIndex = 2; + B_Save.Text = "Save"; + B_Save.UseVisualStyleBackColor = true; + B_Save.Click += B_Save_Click; + // + // SAV_JoinAvenue + // + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + ClientSize = new System.Drawing.Size(964, 725); + Controls.Add(B_Save); + Controls.Add(B_Cancel); + Controls.Add(TC_JoinAvenue); + Icon = Properties.Resources.Icon; + MinimumSize = new System.Drawing.Size(980, 764); + Name = "SAV_JoinAvenue"; + StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + Text = "Join Avenue"; + TC_JoinAvenue.ResumeLayout(false); + Tab_Settings.ResumeLayout(false); + Tab_Settings.PerformLayout(); + TLP_SettingsTop.ResumeLayout(false); + TLP_SettingsTop.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_VisitorCount).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_FanCount).EndInit(); + Tab_Visitors.ResumeLayout(false); + Tab_Fans.ResumeLayout(false); + Tab_Occupants.ResumeLayout(false); + Tab_Assistants.ResumeLayout(false); + Tab_Self.ResumeLayout(false); + TC_Self.ResumeLayout(false); + Tab_SelfGeneral.ResumeLayout(false); + Tab_SelfSpecific.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private System.Windows.Forms.TabControl TC_JoinAvenue; + private System.Windows.Forms.TabPage Tab_Settings; + private System.Windows.Forms.TabPage Tab_Visitors; + private System.Windows.Forms.TabPage Tab_Fans; + private System.Windows.Forms.TabPage Tab_Occupants; + private System.Windows.Forms.TabPage Tab_Assistants; + private System.Windows.Forms.TabPage Tab_Self; + private System.Windows.Forms.Button B_Cancel; + private System.Windows.Forms.Button B_Save; + private System.Windows.Forms.TableLayoutPanel TLP_SettingsTop; + private System.Windows.Forms.CheckBox CHK_ScriptFlag; + private System.Windows.Forms.Label L_VisitorCount; + private System.Windows.Forms.NumericUpDown NUD_VisitorCount; + private System.Windows.Forms.Label L_FanCount; + private System.Windows.Forms.NumericUpDown NUD_FanCount; + private JoinAvenueSettingsEditor UC_Settings; + private System.Windows.Forms.Panel P_Visitors; + private System.Windows.Forms.Panel P_Fans; + private System.Windows.Forms.Panel P_Occupants; + private System.Windows.Forms.Panel P_Assistants; + private System.Windows.Forms.TabControl TC_Self; + private System.Windows.Forms.TabPage Tab_SelfGeneral; + private System.Windows.Forms.TabPage Tab_SelfSpecific; + private JoinAvenueEntityGeneralEditor UC_SelfGeneral; + private JoinAvenueVisitorSpecificEditor UC_SelfSpecific; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/SAV_JoinAvenue.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/SAV_JoinAvenue.cs new file mode 100644 index 000000000..6cbb8b5d3 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/SAV_JoinAvenue.cs @@ -0,0 +1,83 @@ +using System; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms; + +public sealed partial class SAV_JoinAvenue : Form +{ + private readonly SAV5B2W2 Origin; + private readonly SAV5B2W2 SAV; + private readonly JoinAvenue5 Avenue; + + private readonly JoinAvenueListEditor VisitorsEditor; + private readonly JoinAvenueListEditor FansEditor; + private readonly JoinAvenueListEditor OccupantsEditor; + private readonly JoinAvenueListEditor AssistantsEditor; + + public SAV_JoinAvenue(SAV5B2W2 sav) + { + InitializeComponent(); + +#if DEBUG // Translation bruteforce passes in null, need it to init the form controls for translation to work. + // ReSharper disable once NullCoalescingConditionIsAlwaysNotNullAccordingToAPIContract + sav ??= new SAV5B2W2(); +#endif + + Origin = sav; + SAV = (SAV5B2W2)sav.Clone(); + Avenue = SAV.JoinAvenue; + + VisitorsEditor = new(JoinAvenue5.VisitorCount, Avenue.GetVisitor, new JoinAvenueVisitorSpecificEditor()); + FansEditor = new(JoinAvenue5.FanCount, Avenue.GetFan, new JoinAvenueFanSpecificEditor()); + OccupantsEditor = new(JoinAvenue5.OccupantCount, Avenue.GetOccupant, new JoinAvenueVisitorSpecificEditor()); + AssistantsEditor = new(JoinAvenue5.AssistantCount, Avenue.GetAssistant, new JoinAvenueAssistantSpecificEditor()); + + AddDockedControl(P_Visitors, VisitorsEditor); + AddDockedControl(P_Fans, FansEditor); + AddDockedControl(P_Occupants, OccupantsEditor); + AddDockedControl(P_Assistants, AssistantsEditor); + + WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); + + LoadData(); + } + + private void LoadData() + { + CHK_ScriptFlag.Checked = Avenue.ScriptFlag; + NUD_VisitorCount.Value = Math.Clamp(Avenue.CountVisitor, 0, (uint)NUD_VisitorCount.Maximum); + NUD_FanCount.Value = Math.Clamp(Avenue.CountFan, 0, (uint)NUD_FanCount.Maximum); + UC_Settings.LoadObject(Avenue.Settings); + VisitorsEditor.LoadAll(); + FansEditor.LoadAll(); + OccupantsEditor.LoadAll(); + AssistantsEditor.LoadAll(); + UC_SelfGeneral.LoadObject(Avenue.Self); + UC_SelfSpecific.LoadObject(Avenue.Self); + } + + private void B_Save_Click(object sender, EventArgs e) + { + Avenue.ScriptFlag = CHK_ScriptFlag.Checked; + Avenue.CountVisitor = (uint)NUD_VisitorCount.Value; + Avenue.CountFan = (uint)NUD_FanCount.Value; + UC_Settings.SaveObject(Avenue.Settings); + VisitorsEditor.SaveAll(); + FansEditor.SaveAll(); + OccupantsEditor.SaveAll(); + AssistantsEditor.SaveAll(); + UC_SelfGeneral.SaveObject(Avenue.Self); + UC_SelfSpecific.SaveObject(Avenue.Self); + Origin.CopyChangesFrom(SAV); + Close(); + } + + private static void AddDockedControl(Control parent, Control child) + { + child.Dock = DockStyle.Fill; + parent.Controls.Add(child); + } + + private void B_Cancel_Click(object sender, EventArgs e) => Close(); +} diff --git a/PKHeX.WinForms/Util/DevUtil.cs b/PKHeX.WinForms/Util/DevUtil.cs index d799c6db7..c9b4dbd18 100644 --- a/PKHeX.WinForms/Util/DevUtil.cs +++ b/PKHeX.WinForms/Util/DevUtil.cs @@ -181,6 +181,7 @@ private static void UpdateTranslations() typeof(PassPower5), typeof(Funfest5Mission), + typeof(JoinAvenueCeilingColor5), typeof(BattleChateauRank6), typeof(OPower6Index), typeof(OPower6FieldType), @@ -244,6 +245,11 @@ private static IEnumerable GetExtraControls() $"{nameof(SAV_Misc3)}.L_Stat", // Dynamic labels $"{nameof(SAV_Donut9a)}.L_Stat", // Dynamic labels + // unknown fields in Join Avenue, not worth translating until we know what they do. + $"{nameof(SAV_JoinAvenue)}.L_Unk", + $"{nameof(SAV_JoinAvenue)}.L_IsFlag", + $"{nameof(SAV_JoinAvenue)}.L_Unused", + SlotList.DynamicLabelPrefix, $"{nameof(StorageSlotType)}.{nameof(StorageSlotType.None)}", $"{nameof(StorageSlotType)}.{nameof(StorageSlotType.Box)}", From 10a141889fb48322b3f421deb90baf2d7587ff83 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 23 May 2026 23:54:54 -0500 Subject: [PATCH 40/81] Inventory: Begin edit on cell select Saves a click. --- .../Subforms/Save Editors/SAV_Inventory.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs index 9a9f26431..91479e8fa 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs @@ -114,6 +114,7 @@ private DoubleBufferedDataGridView GetDGV(InventoryPouch pouch) // Add DataGrid var dgv = GetBaseDataGrid(pouch); dgv.CellValueChanged += Dgv_CellValueChanged; + dgv.EditingControlShowing += Dgv_EditingControlShowing; // Get Columns var item = GetItemColumn(ColumnItem = dgv.Columns.Count); @@ -289,6 +290,17 @@ private void Dgv_CellValueChanged(object? sender, DataGridViewCellEventArgs e) IsCountValidationSuppressed = false; } + private static void Dgv_EditingControlShowing(object? sender, DataGridViewEditingControlShowingEventArgs e) + { + if (sender is not DataGridView dgv || e.Control is not ComboBox cb) + return; + + if (dgv.CurrentCell?.OwningColumn is not DataGridViewComboBoxColumn) + return; + + cb.DroppedDown = true; + } + private void SetBag(DataGridView dgv, InventoryPouch pouch) { int ctr = 0; From 2fb38b368a25ed7ec7caaf5903840b44becebc7b Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 24 May 2026 00:13:08 -0500 Subject: [PATCH 41/81] B2W2: extract medal editor, add habitat list A bit more coherent to see a list of medals rather than one at a time. Add a few more properties, along with the Habitat List. Remove maximize box from Join Avenue editor, consistent with other editors. --- PKHeX.Core/Saves/Substructures/Gen5/Medal5.cs | 34 +- .../Saves/Substructures/Gen5/MedalList5.cs | 229 ++++++- .../Controls/SAV Editor/SAVEditor.Designer.cs | 14 + .../Controls/SAV Editor/SAVEditor.cs | 2 + PKHeX.WinForms/Resources/text/lang_de.txt | 48 +- PKHeX.WinForms/Resources/text/lang_en.txt | 48 +- PKHeX.WinForms/Resources/text/lang_es-419.txt | 48 +- PKHeX.WinForms/Resources/text/lang_es.txt | 48 +- PKHeX.WinForms/Resources/text/lang_fr.txt | 48 +- PKHeX.WinForms/Resources/text/lang_it.txt | 48 +- PKHeX.WinForms/Resources/text/lang_ja.txt | 48 +- PKHeX.WinForms/Resources/text/lang_ko.txt | 48 +- .../Resources/text/lang_zh-Hans.txt | 48 +- .../Resources/text/lang_zh-Hant.txt | 48 +- .../Join Avenue/SAV_JoinAvenue.Designer.cs | 3 +- .../Save Editors/Gen5/SAV_Medals5.Designer.cs | 639 ++++++++++++++++++ .../Subforms/Save Editors/Gen5/SAV_Medals5.cs | 472 +++++++++++++ .../Save Editors/Gen5/SAV_Misc5.Designer.cs | 89 --- .../Subforms/Save Editors/Gen5/SAV_Misc5.cs | 87 --- PKHeX.WinForms/Util/DevUtil.cs | 3 + 20 files changed, 1820 insertions(+), 232 deletions(-) create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Medals5.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Medals5.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen5/Medal5.cs b/PKHeX.Core/Saves/Substructures/Gen5/Medal5.cs index 1e05d51cb..94ba26f02 100644 --- a/PKHeX.Core/Saves/Substructures/Gen5/Medal5.cs +++ b/PKHeX.Core/Saves/Substructures/Gen5/Medal5.cs @@ -3,10 +3,10 @@ namespace PKHeX.Core; -public sealed class Medal5(Memory Data) +public struct Medal5(Memory Data) { public const int SIZE = 4; - private Span Span => Data.Span; + private readonly Span Span => Data.Span; // Structure: // ushort Date:7 @@ -23,53 +23,53 @@ public sealed class Medal5(Memory Data) public ushort RawDate { - get => ReadUInt16LittleEndian(Span); + readonly get => ReadUInt16LittleEndian(Span); set => WriteUInt16LittleEndian(Span, value); } public int Year { - get => (RawDate & 0x007F) + EpochYear; + readonly get => (RawDate & 0x007F) + EpochYear; set => RawDate = (ushort)((RawDate & 0xFF80) | ((value - EpochYear) & 0x007F)); } public int Month { - get => (RawDate & 0x0780) >> 7; + readonly get => (RawDate & 0x0780) >> 7; set => RawDate = (ushort)((RawDate & 0xF87F) | ((value & 0x0F) << 7)); } public int Day { - get => RawDate >> 11; + readonly get => RawDate >> 11; set => RawDate = (ushort)((RawDate & 0x07FF) | ((value & 0x1F) << 11)); } - public Medal5State State + public MedalState5 State { - get => (Medal5State)(Span[2] & 0b0111); + readonly get => (MedalState5)(Span[2] & 0b0111); set => Span[2] = (byte)((Span[2] & 0b1000) | ((int)value & 0b0111)); } public bool IsUnread { - get => FlagUtil.GetFlag(Span, 2, 3); + readonly get => FlagUtil.GetFlag(Span, 2, 3); set => FlagUtil.SetFlag(Span, 2, 3, value); } public bool CanHaveDate => State switch { - Medal5State.HintObtained => true, - Medal5State.Obtained => true, - Medal5State.ObtainReady => HasDate, + MedalState5.HintObtained => true, + MedalState5.Obtained => true, + MedalState5.ObtainReady => HasDate, _ => false, }; - public bool HasDate => RawDate != 0; - public bool IsObtained => State == Medal5State.Obtained; + public readonly bool HasDate => RawDate != 0; + public readonly bool IsObtained => State == MedalState5.Obtained; public void Clear() => Span.Clear(); - public DateOnly Date { get => GetDate(RawDate); set => RawDate = GetDate(value); } + public DateOnly Date { readonly get => GetDate(RawDate); set => RawDate = GetDate(value); } private static ushort GetDate(DateOnly date) { @@ -90,12 +90,12 @@ public static DateOnly GetDate(ushort date) public void Obtain(DateOnly time, bool unread = true) { RawDate = GetDate(time); - State = Medal5State.Obtained; + State = MedalState5.Obtained; IsUnread = unread; } } -public enum Medal5State +public enum MedalState5 { Unobtained = 0, HintReady = 1, diff --git a/PKHeX.Core/Saves/Substructures/Gen5/MedalList5.cs b/PKHeX.Core/Saves/Substructures/Gen5/MedalList5.cs index d1769c800..8dfce612f 100644 --- a/PKHeX.Core/Saves/Substructures/Gen5/MedalList5.cs +++ b/PKHeX.Core/Saves/Substructures/Gen5/MedalList5.cs @@ -1,32 +1,49 @@ using System; +using static System.Buffers.Binary.BinaryPrimitives; namespace PKHeX.Core; public sealed class MedalList5(SAV5B2W2 SAV, Memory raw) : SaveBlock(SAV, raw) { - private const int MAX_MEDALS = 255; + // amount of medals needed to reach a specific rank + public const int RankRookie = 50; + public const int RankElite = 100; + public const int RankMaster = 150; + public const int RankLegend = 200; + private const int MAX_MEDALS = 255; // Top Medalist - public static Medal5[] GetMedals(Memory memory) + public static Medal5[] GetMedals(Memory raw) { - var count = memory.Length / Medal5.SIZE; + var count = Math.Min(MAX_MEDALS, raw.Length / Medal5.SIZE); var result = new Medal5[count]; for (int i = 0; i < result.Length; i++) - result[i] = GetMedal(memory, i); + result[i] = GetMedal(raw, i); return result; } - public static Medal5 GetMedal(Memory memory, int index) + public static Medal5 GetMedal(Memory raw, int index) { ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, MAX_MEDALS); - return new Medal5(memory.Slice(index * Medal5.SIZE, Medal5.SIZE)); + return new Medal5(raw.Slice(index * Medal5.SIZE, Medal5.SIZE)); } public Medal5 this[int index] => GetMedal(Raw, index); - public void ObtainAll(DateOnly date, bool unread = true) + public void ObtainAll(DateOnly date, bool unread = true, bool skipAlreadyObtained = true) { for (int i = 0; i < MAX_MEDALS; i++) - this[i].Obtain(date, unread); + { + var medal = this[i]; + if (skipAlreadyObtained && medal.IsObtained) + continue; + medal.Obtain(date, unread); + } + } + + public void GiveAll(DateOnly date, bool unread = true) + { + ObtainAll(date, unread); + Rank = CalculateRank(MAX_MEDALS); } public static MedalType5 GetMedalType(int index) => (uint)index switch @@ -38,6 +55,166 @@ public void ObtainAll(DateOnly date, bool unread = true) < MAX_MEDALS => MedalType5.Challenge, _ => throw new ArgumentOutOfRangeException(nameof(index)), }; + + public const int LengthAllMedals = MAX_MEDALS * Medal5.SIZE; + public Span AllMedals => Data[..LengthAllMedals]; + + public const byte PinnedMedalNone = MAX_MEDALS; + + public byte PinnedMedal + { + get => Data[0x3FC]; + set => Data[0x3FC] = value; + } + + public MedalRank5 Rank + { + get => (MedalRank5)Data[0x3FD]; + set => Data[0x3FD] = (byte)value; + } + + public bool IsTutorialComplete + { + get => Data[0x3FE] != 0; + set => Data[0x3FE] = (byte)(value ? 1 : 0); + } + // 3FF unused + + public HabitatList5 HabitatList => new(Raw.Slice(0x400, HabitatList5.SIZE)); + // 2 bytes alignment, total length 0x498 + + public static MedalRank5 CalculateRank(int count) => count switch + { + < RankRookie => MedalRank5.None, + < RankElite => MedalRank5.Rookie, + < RankMaster => MedalRank5.Elite, + < RankLegend => MedalRank5.Master, + _ => MedalRank5.Legend, + }; + + public MedalRank5 CalculateRank() + { + var count = GetCountObtained(); + return CalculateRank(count); + } + + public int GetCountObtained() + { + int count = 0; + for (int i = 0; i < MAX_MEDALS; i++) + { + if (this[i].IsObtained) + count++; + } + return count; + } +} + +public sealed class HabitatList5(Memory raw) +{ + public const int SIZE = 0x96; // starts with some unused data + + public const int HabitatCount = 90; + + private Span Data => raw.Span; + + public Span Unused => Data[..0x36]; + + public HabitatStatus5 GetHabitat(int index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(index, HabitatCount); + return new(raw.Slice(0x36 + (index * HabitatStatus5.SIZE), HabitatStatus5.SIZE)); + } + + public ushort Unknown90 + { + get => ReadUInt16LittleEndian(Data[0x90..]); + set => WriteUInt16LittleEndian(Data[0x90..], value); + } + + public byte Unknown92 { get => Data[0x92]; set => Data[0x92] = value; } + + public HabitatEncounterType5 LastEncounterType + { + get => (HabitatEncounterType5)Data[0x93]; + set => Data[0x93] = (byte)value; + } + public bool IsTutorialViewed { get => Data[0x94] != 0; set => Data[0x94] = (byte)(value ? 1 : 0); } + public bool IsTutorialCompleteCapture { get => Data[0x95] != 0; set => Data[0x95] = (byte)(value ? 1 : 0); } + + public void CompleteAll() + { + for (int i = 0; i < HabitatCount; i++) + GetHabitat(i).SetComplete(); + } +} + +public struct HabitatStatus5(Memory data) +{ + // a fun single-byte struct. + // not sure if it's worthwhile figuring out how to make this less heavy... + // feels great storing (byte*,int) to represent a single byte value, maybe as a ref byte, but for now this is fine. + public const int SIZE = 1; + private readonly Span Data => data.Span; + + public byte Value + { + readonly get => Data[0]; + set => Data[0] = value; + } + + public HabitatCompletion5 Grass + { + readonly get => (HabitatCompletion5)(Data[0] & 0b0000_0011); + set => Data[0] = (byte)((Data[0] & ~0b0000_0011) | ((byte)value & 0b11)); + } + + public HabitatCompletion5 Surf + { + readonly get => (HabitatCompletion5)((Data[0] >> 2) & 0b11); + set => Data[0] = (byte)((Data[0] & ~0b0000_1100) | (((byte)value & 0b11) << 2)); + } + + public HabitatCompletion5 Fish + { + readonly get => (HabitatCompletion5)((Data[0] >> 4) & 0b11); + set => Data[0] = (byte)((Data[0] & ~0b0011_0000) | (((byte)value & 0b11) << 4)); + } + + public bool IsComplete + { + readonly get => FlagUtil.GetFlag(Data, 0, 6); + set => FlagUtil.SetFlag(Data, 0, 6, value); + } + + public HabitatCompletion5 GetStatus(HabitatEncounterType5 type) => type switch + { + HabitatEncounterType5.Grass => Grass, + HabitatEncounterType5.Surf => Surf, + HabitatEncounterType5.Fish => Fish, + _ => throw new ArgumentOutOfRangeException(nameof(type)), + }; + + public void SetStatus(HabitatEncounterType5 type, HabitatCompletion5 value) + { + switch (type) + { + case HabitatEncounterType5.Grass: + Grass = value; + break; + case HabitatEncounterType5.Surf: + Surf = value; + break; + case HabitatEncounterType5.Fish: + Fish = value; + break; + default: + throw new ArgumentOutOfRangeException(nameof(type)); + } + } + + public void SetComplete() => Value = 0b_1_11_11_11; // sets all 3 habitats to complete and the IsComplete flag to true + public void Clear() => Value = 0; } public enum MedalType5 @@ -48,3 +225,39 @@ public enum MedalType5 Entertainment, Challenge, } + +public enum MedalRank5 : byte +{ + None = 0, + Rookie = 1, + Elite = 2, + Master = 3, + Legend = 4, + // nothing above 200 +} + +public enum HabitatCompletion5 : byte +{ + None = 0, + Seen = 1, + Caught = 2, + Complete = 3, +} + +public enum HabitatEncounterType5 : byte +{ + /// + /// + /// + Grass = 0, + + /// + /// + /// + Surf = 1, + + /// + /// + /// + Fish = 2, +} diff --git a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs index b0d985cbf..dfba5cc49 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs @@ -87,6 +87,7 @@ private void InitializeComponent() B_OpenGeonetEditor = new System.Windows.Forms.Button(); B_OpenUnityTowerEditor = new System.Windows.Forms.Button(); B_OpenJoinAvenueEditor = new System.Windows.Forms.Button(); + B_OpenMedalsEditor = new System.Windows.Forms.Button(); B_OpenChatterEditor = new System.Windows.Forms.Button(); B_Roamer = new System.Windows.Forms.Button(); B_FestivalPlaza = new System.Windows.Forms.Button(); @@ -442,6 +443,7 @@ private void InitializeComponent() FLP_SAVtools.Controls.Add(B_OpenGeonetEditor); FLP_SAVtools.Controls.Add(B_OpenUnityTowerEditor); FLP_SAVtools.Controls.Add(B_OpenJoinAvenueEditor); + FLP_SAVtools.Controls.Add(B_OpenMedalsEditor); FLP_SAVtools.Controls.Add(B_OpenChatterEditor); FLP_SAVtools.Controls.Add(B_Roamer); FLP_SAVtools.Controls.Add(B_FestivalPlaza); @@ -776,6 +778,17 @@ private void InitializeComponent() B_OpenChatterEditor.UseVisualStyleBackColor = true; B_OpenChatterEditor.Click += B_OpenChatterEditor_Click; // + // B_OpenMedalsEditor + // + B_OpenMedalsEditor.Location = new System.Drawing.Point(316, 364); + B_OpenMedalsEditor.Margin = new System.Windows.Forms.Padding(4); + B_OpenMedalsEditor.Name = "B_OpenMedalsEditor"; + B_OpenMedalsEditor.Size = new System.Drawing.Size(96, 32); + B_OpenMedalsEditor.TabIndex = 1; + B_OpenMedalsEditor.Text = "Medals"; + B_OpenMedalsEditor.UseVisualStyleBackColor = true; + B_OpenMedalsEditor.Click += B_OpenMedalsEditor_Click; + // // B_Roamer // B_Roamer.Location = new System.Drawing.Point(4, 284); @@ -1118,6 +1131,7 @@ private void InitializeComponent() private System.Windows.Forms.Button B_OpenGeonetEditor; private System.Windows.Forms.Button B_OpenUnityTowerEditor; private System.Windows.Forms.Button B_OpenJoinAvenueEditor; + private System.Windows.Forms.Button B_OpenMedalsEditor; private System.Windows.Forms.Button B_OpenChatterEditor; private System.Windows.Forms.Button B_Roamer; private System.Windows.Forms.Button B_FestivalPlaza; diff --git a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs index 2410acd2d..87a7d0c78 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs @@ -646,6 +646,7 @@ private static void OpenDialog(Form f) private void B_OpenGeonetEditor_Click(object sender, EventArgs e) => OpenDialog(new SAV_Geonet4((SAV4)SAV)); private void B_OpenUnityTowerEditor_Click(object sender, EventArgs e) => OpenDialog(new SAV_UnityTower((SAV5)SAV)); private void B_OpenJoinAvenueEditor_Click(object sender, EventArgs e) => OpenDialog(new SAV_JoinAvenue((SAV5B2W2)SAV)); + private void B_OpenMedalsEditor_Click(object sender, EventArgs e) => OpenDialog(new SAV_Medals5((SAV5B2W2)SAV)); private void B_OpenChatterEditor_Click(object sender, EventArgs e) => OpenDialog(new SAV_Chatter(SAV)); private void B_OpenGear_Click(object sender, EventArgs e) => OpenDialog(new SAV_Gear((SAV4BR)SAV)); private void B_Donuts_Click(object sender, EventArgs e) => OpenDialog(new SAV_Donut9a((SAV9ZA)SAV)); @@ -1312,6 +1313,7 @@ private void ToggleViewSubEditors(SaveFile sav) B_OpenGeonetEditor.Visible = sav is SAV4; B_OpenUnityTowerEditor.Visible = sav is SAV5; B_OpenJoinAvenueEditor.Visible = sav is SAV5B2W2; + B_OpenMedalsEditor.Visible = sav is SAV5B2W2; B_OpenChatterEditor.Visible = sav is SAV4 or SAV5; B_OpenBattlePass.Visible = B_OpenGear.Visible = sav is SAV4BR; B_OpenSealStickers.Visible = B_Poffins.Visible = sav is SAV8BS; diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index 90c98624c..3dea3d382 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -39,6 +39,7 @@ SAV_Inventory=Inventar-Editor SAV_JoinAvenue=Einklangspassage SAV_Link6=Pokémon-Link-Tool SAV_MailBox=Briefbox-Editor +SAV_Medals5=Medaillen SAV_Misc2=Sonstiges SAV_Misc3=Sonstiges SAV_Misc4=Sonstiges @@ -235,6 +236,13 @@ GearCategory.Hands=Hände GearCategory.Head=Kopf GearCategory.Shoes=Schuhe GearCategory.Top=Oberteil +HabitatCompletion5.Caught=Gefangen +HabitatCompletion5.Complete=Abgeschlossen +HabitatCompletion5.None=Keine +HabitatCompletion5.Seen=Gesehen +HabitatEncounterType5.Fish=Angeln +HabitatEncounterType5.Grass=Gras +HabitatEncounterType5.Surf=Surfen JoinAvenueCeilingColor5.Blue=Blau JoinAvenueCeilingColor5.Green=Grün JoinAvenueCeilingColor5.Orange=Orange @@ -418,6 +426,7 @@ Main.B_OpenHoneyTreeEditor=Honigbaum Main.B_OpenItemPouch=Items Main.B_OpenJoinAvenueEditor=Einklangspassage Main.B_OpenLinkInfo=Pokémon-Link +Main.B_OpenMedalsEditor=Medaillen Main.B_OpenMiscEditor=Sonstiges Main.B_OpenOPowers=O-Kräfte Main.B_OpenPokeBeans=Pokébohnen @@ -661,6 +670,16 @@ Main.Tab_OTMisc=OT/Sonstiges Main.Tab_PartyBattle=Team Main.Tab_SAV=SAV Main.Tab_Stats=Werte +MedalRank5.Elite=Elite +MedalRank5.Legend=Legende +MedalRank5.Master=Meister +MedalRank5.None=Kein Rang +MedalRank5.Rookie=Anfänger +MedalState5.HintObtained=Hinweis erhalten +MedalState5.HintReady=Hinweis verfügbar +MedalState5.Obtained=Erhalten +MedalState5.ObtainReady=Bereit zum Erhalt +MedalState5.Unobtained=Nicht erhalten MemoryAmie.B_ClearAll=Alle leeren MemoryAmie.BTN_Cancel=Abbrechen MemoryAmie.BTN_Save=Speichern @@ -1500,6 +1519,32 @@ SAV_MailBox.L_PKM3=Bisasam: SAV_MailBox.L_PKM4=Bisasam: SAV_MailBox.L_PKM5=Bisasam: SAV_MailBox.L_PKM6=Bisasam: +SAV_Medals5.B_Cancel=Abbrechen +SAV_Medals5.B_ExportAll=Alles exportieren +SAV_Medals5.B_GiveAll=Alle vergeben +SAV_Medals5.B_HabitatClear=Löschen +SAV_Medals5.B_HabitatSetComplete=Als abgeschlossen markieren +SAV_Medals5.B_ImportAll=Alles importieren +SAV_Medals5.B_Save=Speichern +SAV_Medals5.CHK_HabitatTutorialCompleteCapture=Fang-Tutorial abgeschlossen +SAV_Medals5.CHK_HabitatTutorialViewed=Tutorial gesehen +SAV_Medals5.CHK_TutorialComplete=Tutorial abgeschlossen +SAV_Medals5.DGV_HabitatCompleteColumn=Abgeschlossen +SAV_Medals5.DGV_HabitatFishColumn=Angeln +SAV_Medals5.DGV_HabitatGrassColumn=Gras +SAV_Medals5.DGV_HabitatIndexColumn=Index +SAV_Medals5.DGV_HabitatSurfColumn=Surfen +SAV_Medals5.DGV_MedalDateColumn=Datum +SAV_Medals5.DGV_MedalIndexColumn=Index +SAV_Medals5.DGV_MedalNameColumn=Name +SAV_Medals5.DGV_MedalStateColumn=Status +SAV_Medals5.DGV_MedalTypeColumn=Typ +SAV_Medals5.DGV_MedalUnreadColumn=Ungelesen +SAV_Medals5.L_LastEncounterType=Letzte Begegnungsart: +SAV_Medals5.L_PinnedMedal=Angeheftete Medaille: +SAV_Medals5.L_Rank=Rang: +SAV_Medals5.Tab_Habitat=Habitatsliste +SAV_Medals5.Tab_Medals=Medaillen SAV_Misc2.B_Cancel=Abbrechen SAV_Misc2.B_Save=Speichern SAV_Misc2.B_VirtualConsoleGSBall=GS-Ball-Event aktivieren (Virtual Console) @@ -1653,7 +1698,6 @@ SAV_Misc5.B_Cancel=Abbrechen SAV_Misc5.B_DumpFC=Daten exportieren SAV_Misc5.B_FunfestMissions=Alle freischalten SAV_Misc5.B_ImportFC=Daten importieren -SAV_Misc5.B_ObtainAllMedals=Alle Medaillen erhalten SAV_Misc5.B_RandForest=Alle Areale zufällig SAV_Misc5.B_Save=Speichern SAV_Misc5.B_UnlockAllProps=Alle Accessoires freischalten @@ -1662,7 +1706,6 @@ SAV_Misc5.CHK_DoubleSet=Doppel SAV_Misc5.CHK_FMNew=NEU SAV_Misc5.CHK_Invisible=Unsichtbar SAV_Misc5.CHK_LibertyPass=Aktiviere Gartenpass -SAV_Misc5.CHK_MedalUnread=Ungelesen SAV_Misc5.CHK_MultiFriendsSet=Freunde SAV_Misc5.CHK_MultiNPCSet=NPC SAV_Misc5.CHK_PropObtained=Erhalten @@ -1743,7 +1786,6 @@ SAV_Misc5.TAB_BWCityForest=WeißerWald/SchwarzeStadt SAV_Misc5.TAB_Entralink=Kontaktebene SAV_Misc5.TAB_Forest=Hain SAV_Misc5.TAB_Main=Verschiedenes -SAV_Misc5.TAB_Medals=Medaillen SAV_Misc5.TAB_Muscial=Musical SAV_Misc5.TAB_Subway=Metro SAV_Misc8b.B_Arceus=Arceus Event freischalten diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index 9eb627f47..53356d4ca 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -39,6 +39,7 @@ SAV_Inventory=Inventory Editor SAV_JoinAvenue=Join Avenue SAV_Link6=Pokémon Link Tool SAV_MailBox=MailBox Editor +SAV_Medals5=Medals SAV_Misc2=Misc Editor SAV_Misc3=Misc Editor SAV_Misc4=Misc Editor @@ -235,6 +236,13 @@ GearCategory.Hands=Hands GearCategory.Head=Head GearCategory.Shoes=Shoes GearCategory.Top=Top +HabitatCompletion5.Caught=Caught +HabitatCompletion5.Complete=Complete +HabitatCompletion5.None=None +HabitatCompletion5.Seen=Seen +HabitatEncounterType5.Fish=Fish +HabitatEncounterType5.Grass=Grass +HabitatEncounterType5.Surf=Surf JoinAvenueCeilingColor5.Blue=Blue JoinAvenueCeilingColor5.Green=Green JoinAvenueCeilingColor5.Orange=Orange @@ -418,6 +426,7 @@ Main.B_OpenHoneyTreeEditor=Honey Tree Main.B_OpenItemPouch=Items Main.B_OpenJoinAvenueEditor=Join Avenue Main.B_OpenLinkInfo=Link Data +Main.B_OpenMedalsEditor=Medals Main.B_OpenMiscEditor=Misc Edits Main.B_OpenOPowers=O-Powers Main.B_OpenPokeBeans=Poké Beans @@ -661,6 +670,16 @@ Main.Tab_OTMisc=OT/Misc Main.Tab_PartyBattle=Party Main.Tab_SAV=SAV Main.Tab_Stats=Stats +MedalRank5.Elite=Elite +MedalRank5.Legend=Legend +MedalRank5.Master=Master +MedalRank5.None=None +MedalRank5.Rookie=Rookie +MedalState5.HintObtained=HintObtained +MedalState5.HintReady=HintReady +MedalState5.Obtained=Obtained +MedalState5.ObtainReady=ObtainReady +MedalState5.Unobtained=Unobtained MemoryAmie.B_ClearAll=Clear All MemoryAmie.BTN_Cancel=Cancel MemoryAmie.BTN_Save=Save @@ -1500,6 +1519,32 @@ SAV_MailBox.L_PKM3=Bulbasaur: SAV_MailBox.L_PKM4=Bulbasaur: SAV_MailBox.L_PKM5=Bulbasaur: SAV_MailBox.L_PKM6=Bulbasaur: +SAV_Medals5.B_Cancel=Cancel +SAV_Medals5.B_ExportAll=Export All +SAV_Medals5.B_GiveAll=Give All +SAV_Medals5.B_HabitatClear=Clear +SAV_Medals5.B_HabitatSetComplete=Set Complete +SAV_Medals5.B_ImportAll=Import All +SAV_Medals5.B_Save=Save +SAV_Medals5.CHK_HabitatTutorialCompleteCapture=Tutorial Capture Done +SAV_Medals5.CHK_HabitatTutorialViewed=Tutorial Viewed +SAV_Medals5.CHK_TutorialComplete=Tutorial Complete +SAV_Medals5.DGV_HabitatCompleteColumn=Complete +SAV_Medals5.DGV_HabitatFishColumn=Fish +SAV_Medals5.DGV_HabitatGrassColumn=Grass +SAV_Medals5.DGV_HabitatIndexColumn=Index +SAV_Medals5.DGV_HabitatSurfColumn=Surf +SAV_Medals5.DGV_MedalDateColumn=Date +SAV_Medals5.DGV_MedalIndexColumn=Index +SAV_Medals5.DGV_MedalNameColumn=Name +SAV_Medals5.DGV_MedalStateColumn=State +SAV_Medals5.DGV_MedalTypeColumn=Type +SAV_Medals5.DGV_MedalUnreadColumn=IsUnread +SAV_Medals5.L_LastEncounterType=Last Encounter Type: +SAV_Medals5.L_PinnedMedal=Pinned Medal: +SAV_Medals5.L_Rank=Rank: +SAV_Medals5.Tab_Habitat=Habitat +SAV_Medals5.Tab_Medals=Medals SAV_Misc2.B_Cancel=Cancel SAV_Misc2.B_Save=Save SAV_Misc2.B_VirtualConsoleGSBall=Enable GS Ball Event (Virtual Console) @@ -1653,7 +1698,6 @@ SAV_Misc5.B_Cancel=Cancel SAV_Misc5.B_DumpFC=Dump Data SAV_Misc5.B_FunfestMissions=Unlock All (w/o No.0) SAV_Misc5.B_ImportFC=Import Data -SAV_Misc5.B_ObtainAllMedals=Obtain All Medals SAV_Misc5.B_RandForest=Randomize All Areas SAV_Misc5.B_Save=Save SAV_Misc5.B_UnlockAllProps=Unlock All Props @@ -1662,7 +1706,6 @@ SAV_Misc5.CHK_DoubleSet=Double SAV_Misc5.CHK_FMNew=NEW SAV_Misc5.CHK_Invisible=Invisible SAV_Misc5.CHK_LibertyPass=Activate LibertyPass -SAV_Misc5.CHK_MedalUnread=Unread SAV_Misc5.CHK_MultiFriendsSet=Friends SAV_Misc5.CHK_MultiNPCSet=NPC SAV_Misc5.CHK_PropObtained=Obtained @@ -1743,7 +1786,6 @@ SAV_Misc5.TAB_BWCityForest=WhiteForest/BlackCity SAV_Misc5.TAB_Entralink=Entralink SAV_Misc5.TAB_Forest=Forest SAV_Misc5.TAB_Main=Main -SAV_Misc5.TAB_Medals=Medals SAV_Misc5.TAB_Muscial=Musical SAV_Misc5.TAB_Subway=Subway SAV_Misc8b.B_Arceus=Unlock Arceus Event diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index f1efa5555..68f51f603 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -39,6 +39,7 @@ SAV_Inventory=Editor de Inventario SAV_JoinAvenue=Pasaje Unión SAV_Link6=Editor del Nexo Pokémon SAV_MailBox=Editor de Buzón +SAV_Medals5=Medallas SAV_Misc2=Editor Misceláneo SAV_Misc3=Editor de Datos del Entrenador SAV_Misc4=Editor de Datos del Entrenador @@ -235,6 +236,13 @@ GearCategory.Hands=Manos GearCategory.Head=Gorras GearCategory.Shoes=Calzado GearCategory.Top=Prendas +HabitatCompletion5.Caught=Atrapado +HabitatCompletion5.Complete=Completo +HabitatCompletion5.None=Ninguno +HabitatCompletion5.Seen=Visto +HabitatEncounterType5.Fish=Pesca +HabitatEncounterType5.Grass=Hierba +HabitatEncounterType5.Surf=Surf JoinAvenueCeilingColor5.Blue=Azul JoinAvenueCeilingColor5.Green=Verde JoinAvenueCeilingColor5.Orange=Naranja @@ -418,6 +426,7 @@ Main.B_OpenHoneyTreeEditor=Árbol de Miel Main.B_OpenItemPouch=Inventario Main.B_OpenJoinAvenueEditor=Pasaje Unión Main.B_OpenLinkInfo=Datos Nexo +Main.B_OpenMedalsEditor=Medallas Main.B_OpenMiscEditor=Misceláneo Main.B_OpenOPowers=Poder O Main.B_OpenPokeBeans=Pokéhabas @@ -661,6 +670,16 @@ Main.Tab_OTMisc=EO/Misc Main.Tab_PartyBattle=Equipo Main.Tab_SAV=SAV Main.Tab_Stats=Estadísticas +MedalRank5.Elite=Élite +MedalRank5.Legend=Leyenda +MedalRank5.Master=Maestro +MedalRank5.None=Ninguno +MedalRank5.Rookie=Novato +MedalState5.HintObtained=Pista obtenida +MedalState5.HintReady=Pista disponible +MedalState5.Obtained=Obtenida +MedalState5.ObtainReady=Lista para obtener +MedalState5.Unobtained=No obtenida MemoryAmie.B_ClearAll=Limpiar todo MemoryAmie.BTN_Cancel=Cancelar MemoryAmie.BTN_Save=Guardar @@ -1500,6 +1519,32 @@ SAV_MailBox.L_PKM3=Bulbasaur: SAV_MailBox.L_PKM4=Bulbasaur: SAV_MailBox.L_PKM5=Bulbasaur: SAV_MailBox.L_PKM6=Bulbasaur: +SAV_Medals5.B_Cancel=Cancelar +SAV_Medals5.B_ExportAll=Exportar todo +SAV_Medals5.B_GiveAll=Dar todas +SAV_Medals5.B_HabitatClear=Limpiar +SAV_Medals5.B_HabitatSetComplete=Marcar como completo +SAV_Medals5.B_ImportAll=Importar todo +SAV_Medals5.B_Save=Guardar +SAV_Medals5.CHK_HabitatTutorialCompleteCapture=Tutorial de captura completado +SAV_Medals5.CHK_HabitatTutorialViewed=Tutorial visto +SAV_Medals5.CHK_TutorialComplete=Tutorial completado +SAV_Medals5.DGV_HabitatCompleteColumn=Completo +SAV_Medals5.DGV_HabitatFishColumn=Pesca +SAV_Medals5.DGV_HabitatGrassColumn=Hierba +SAV_Medals5.DGV_HabitatIndexColumn=Índice +SAV_Medals5.DGV_HabitatSurfColumn=Surf +SAV_Medals5.DGV_MedalDateColumn=Fecha +SAV_Medals5.DGV_MedalIndexColumn=Índice +SAV_Medals5.DGV_MedalNameColumn=Nombre +SAV_Medals5.DGV_MedalStateColumn=Estado +SAV_Medals5.DGV_MedalTypeColumn=Tipo +SAV_Medals5.DGV_MedalUnreadColumn=No leída +SAV_Medals5.L_LastEncounterType=Último tipo de encuentro: +SAV_Medals5.L_PinnedMedal=Medalla fijada: +SAV_Medals5.L_Rank=Rango: +SAV_Medals5.Tab_Habitat=Lista de hábitats +SAV_Medals5.Tab_Medals=Medallas SAV_Misc2.B_Cancel=Cancelar SAV_Misc2.B_Save=Guardar SAV_Misc2.B_VirtualConsoleGSBall=Activar Evento GS Ball (Virtual Console) @@ -1653,7 +1698,6 @@ SAV_Misc5.B_Cancel=Cancelar SAV_Misc5.B_DumpFC=Exportar datos SAV_Misc5.B_FunfestMissions=Desbloquear todo (sin n.º0) SAV_Misc5.B_ImportFC=Importar datos -SAV_Misc5.B_ObtainAllMedals=Obtener todas las medallas SAV_Misc5.B_RandForest=Aleatorizar todas las áreas SAV_Misc5.B_Save=Guardar SAV_Misc5.B_UnlockAllProps=Desbloq. complementos @@ -1662,7 +1706,6 @@ SAV_Misc5.CHK_DoubleSet=Doblr SAV_Misc5.CHK_FMNew=NUEVO SAV_Misc5.CHK_Invisible=Invisible SAV_Misc5.CHK_LibertyPass=Activar Ticket Libertad -SAV_Misc5.CHK_MedalUnread=Sin leer SAV_Misc5.CHK_MultiFriendsSet=Amigos SAV_Misc5.CHK_MultiNPCSet=PNJ SAV_Misc5.CHK_PropObtained=Obtenido @@ -1743,7 +1786,6 @@ SAV_Misc5.TAB_BWCityForest=Bosque Blanco/Ciudad Negra SAV_Misc5.TAB_Entralink=Zona Nexo SAV_Misc5.TAB_Forest=Bosque SAV_Misc5.TAB_Main=Inicio -SAV_Misc5.TAB_Medals=Medallas SAV_Misc5.TAB_Muscial=Musical SAV_Misc5.TAB_Subway=Subterráneo SAV_Misc8b.B_Arceus=Desbloquear evento de Arceus diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index fb7008522..7b2c4521a 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -39,6 +39,7 @@ SAV_Inventory=Editor de Inventario SAV_JoinAvenue=Galería Unión SAV_Link6=Editor del Nexo Pokémon SAV_MailBox=Editor de Buzón +SAV_Medals5=Medallas SAV_Misc2=Editor de Varios SAV_Misc3=Editor de Datos del Entrenador SAV_Misc4=Editor de Datos del Entrenador @@ -235,6 +236,13 @@ GearCategory.Hands=Manos GearCategory.Head=Gorras GearCategory.Shoes=Calzado GearCategory.Top=Prendas +HabitatCompletion5.Caught=Atrapado +HabitatCompletion5.Complete=Completo +HabitatCompletion5.None=Ninguno +HabitatCompletion5.Seen=Visto +HabitatEncounterType5.Fish=Pesca +HabitatEncounterType5.Grass=Hierba +HabitatEncounterType5.Surf=Surf JoinAvenueCeilingColor5.Blue=Azul JoinAvenueCeilingColor5.Green=Verde JoinAvenueCeilingColor5.Orange=Naranja @@ -418,6 +426,7 @@ Main.B_OpenHoneyTreeEditor=Árbol de Miel Main.B_OpenItemPouch=Inventario Main.B_OpenJoinAvenueEditor=Galería Unión Main.B_OpenLinkInfo=Datos Nexo +Main.B_OpenMedalsEditor=Medallas Main.B_OpenMiscEditor=Varios Main.B_OpenOPowers=Poder O Main.B_OpenPokeBeans=Pokéhabas @@ -661,6 +670,16 @@ Main.Tab_OTMisc=EO/Varios Main.Tab_PartyBattle=Equipo Main.Tab_SAV=SAV Main.Tab_Stats=Estadísticas +MedalRank5.Elite=Élite +MedalRank5.Legend=Leyenda +MedalRank5.Master=Maestro +MedalRank5.None=Ninguno +MedalRank5.Rookie=Novato +MedalState5.HintObtained=Pista obtenida +MedalState5.HintReady=Pista disponible +MedalState5.Obtained=Obtenida +MedalState5.ObtainReady=Lista para obtener +MedalState5.Unobtained=No obtenida MemoryAmie.B_ClearAll=Limpiar todo MemoryAmie.BTN_Cancel=Cancelar MemoryAmie.BTN_Save=Guardar @@ -1500,6 +1519,32 @@ SAV_MailBox.L_PKM3=Bulbasaur: SAV_MailBox.L_PKM4=Bulbasaur: SAV_MailBox.L_PKM5=Bulbasaur: SAV_MailBox.L_PKM6=Bulbasaur: +SAV_Medals5.B_Cancel=Cancelar +SAV_Medals5.B_ExportAll=Exportar todo +SAV_Medals5.B_GiveAll=Dar todas +SAV_Medals5.B_HabitatClear=Limpiar +SAV_Medals5.B_HabitatSetComplete=Marcar como completo +SAV_Medals5.B_ImportAll=Importar todo +SAV_Medals5.B_Save=Guardar +SAV_Medals5.CHK_HabitatTutorialCompleteCapture=Tutorial de captura completado +SAV_Medals5.CHK_HabitatTutorialViewed=Tutorial visto +SAV_Medals5.CHK_TutorialComplete=Tutorial completado +SAV_Medals5.DGV_HabitatCompleteColumn=Completo +SAV_Medals5.DGV_HabitatFishColumn=Pesca +SAV_Medals5.DGV_HabitatGrassColumn=Hierba +SAV_Medals5.DGV_HabitatIndexColumn=Índice +SAV_Medals5.DGV_HabitatSurfColumn=Surf +SAV_Medals5.DGV_MedalDateColumn=Fecha +SAV_Medals5.DGV_MedalIndexColumn=Índice +SAV_Medals5.DGV_MedalNameColumn=Nombre +SAV_Medals5.DGV_MedalStateColumn=Estado +SAV_Medals5.DGV_MedalTypeColumn=Tipo +SAV_Medals5.DGV_MedalUnreadColumn=No leída +SAV_Medals5.L_LastEncounterType=Último tipo de encuentro: +SAV_Medals5.L_PinnedMedal=Medalla fijada: +SAV_Medals5.L_Rank=Rango: +SAV_Medals5.Tab_Habitat=Lista de hábitats +SAV_Medals5.Tab_Medals=Medallas SAV_Misc2.B_Cancel=Cancelar SAV_Misc2.B_Save=Guardar SAV_Misc2.B_VirtualConsoleGSBall=Activar Evento GS Ball (Virtual Console) @@ -1653,7 +1698,6 @@ SAV_Misc5.B_Cancel=Cancelar SAV_Misc5.B_DumpFC=Exportar datos SAV_Misc5.B_FunfestMissions=Desbloquear todo (sin n.º0) SAV_Misc5.B_ImportFC=Importar datos -SAV_Misc5.B_ObtainAllMedals=Obtener todas las medallas SAV_Misc5.B_RandForest=Aleatorizar todas las áreas SAV_Misc5.B_Save=Guardar SAV_Misc5.B_UnlockAllProps=Desbloq. complementos @@ -1662,7 +1706,6 @@ SAV_Misc5.CHK_DoubleSet=Doblr SAV_Misc5.CHK_FMNew=NUEVO SAV_Misc5.CHK_Invisible=Invisible SAV_Misc5.CHK_LibertyPass=Activar Ticket Libertad -SAV_Misc5.CHK_MedalUnread=Sin leer SAV_Misc5.CHK_MultiFriendsSet=Amigos SAV_Misc5.CHK_MultiNPCSet=PNJ SAV_Misc5.CHK_PropObtained=Obtenido @@ -1743,7 +1786,6 @@ SAV_Misc5.TAB_BWCityForest=Bosque Blanco/Ciudad Negra SAV_Misc5.TAB_Entralink=Zona Nexo SAV_Misc5.TAB_Forest=Bosque SAV_Misc5.TAB_Main=Inicio -SAV_Misc5.TAB_Medals=Medallas SAV_Misc5.TAB_Muscial=Musical SAV_Misc5.TAB_Subway=Metro SAV_Misc8b.B_Arceus=Desbloquear evento de Arceus diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index 8bf7e715f..8f39b0a5f 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -39,6 +39,7 @@ SAV_Inventory=Éditeur de l'inventaire SAV_JoinAvenue=Galerie Concorde SAV_Link6=Outil Poké Lien SAV_MailBox=Éditeur de boîtes aux lettres +SAV_Medals5=Médailles SAV_Misc2=Éditeur divers SAV_Misc3=Éditeur divers SAV_Misc4=Éditeur divers @@ -235,6 +236,13 @@ GearCategory.Hands=Mains GearCategory.Head=Tête GearCategory.Shoes=Chaussures GearCategory.Top=Haut +HabitatCompletion5.Caught=Attrapé +HabitatCompletion5.Complete=Complet +HabitatCompletion5.None=Aucun +HabitatCompletion5.Seen=Vu +HabitatEncounterType5.Fish=Pêche +HabitatEncounterType5.Grass=Herbe +HabitatEncounterType5.Surf=Surf JoinAvenueCeilingColor5.Blue=Bleu JoinAvenueCeilingColor5.Green=Vert JoinAvenueCeilingColor5.Orange=Orange @@ -418,6 +426,7 @@ Main.B_OpenHoneyTreeEditor=Arbres à miel Main.B_OpenItemPouch=Objets Main.B_OpenJoinAvenueEditor=Galerie Concorde Main.B_OpenLinkInfo=Poké Lien +Main.B_OpenMedalsEditor=Médailles Main.B_OpenMiscEditor=Éditeur divers Main.B_OpenOPowers=O-Auras Main.B_OpenPokeBeans=Poké Fèves @@ -661,6 +670,16 @@ Main.Tab_OTMisc=DO/Divers Main.Tab_PartyBattle=Équipe Main.Tab_SAV=SAV Main.Tab_Stats=Stats +MedalRank5.Elite=Élite +MedalRank5.Legend=Légende +MedalRank5.Master=Maître +MedalRank5.None=Aucun +MedalRank5.Rookie=Débutant +MedalState5.HintObtained=Indice obtenu +MedalState5.HintReady=Indice disponible +MedalState5.Obtained=Obtenue +MedalState5.ObtainReady=Prête à obtenir +MedalState5.Unobtained=Non obtenue MemoryAmie.B_ClearAll=Tout vider MemoryAmie.BTN_Cancel=Annuler MemoryAmie.BTN_Save=Sauver @@ -1500,6 +1519,32 @@ SAV_MailBox.L_PKM3=Bulbizarre : SAV_MailBox.L_PKM4=Bulbizarre : SAV_MailBox.L_PKM5=Bulbizarre : SAV_MailBox.L_PKM6=Bulbizarre : +SAV_Medals5.B_Cancel=Annuler +SAV_Medals5.B_ExportAll=Tout exporter +SAV_Medals5.B_GiveAll=Tout attribuer +SAV_Medals5.B_HabitatClear=Effacer +SAV_Medals5.B_HabitatSetComplete=Marquer complet +SAV_Medals5.B_ImportAll=Tout importer +SAV_Medals5.B_Save=Enregistrer +SAV_Medals5.CHK_HabitatTutorialCompleteCapture=Tutoriel de capture terminé +SAV_Medals5.CHK_HabitatTutorialViewed=Tutoriel vu +SAV_Medals5.CHK_TutorialComplete=Tutoriel terminé +SAV_Medals5.DGV_HabitatCompleteColumn=Complet +SAV_Medals5.DGV_HabitatFishColumn=Pêche +SAV_Medals5.DGV_HabitatGrassColumn=Herbe +SAV_Medals5.DGV_HabitatIndexColumn=Index +SAV_Medals5.DGV_HabitatSurfColumn=Surf +SAV_Medals5.DGV_MedalDateColumn=Date +SAV_Medals5.DGV_MedalIndexColumn=Index +SAV_Medals5.DGV_MedalNameColumn=Nom +SAV_Medals5.DGV_MedalStateColumn=État +SAV_Medals5.DGV_MedalTypeColumn=Type +SAV_Medals5.DGV_MedalUnreadColumn=Non lue +SAV_Medals5.L_LastEncounterType=Dernier type de rencontre : +SAV_Medals5.L_PinnedMedal=Médaille épinglée : +SAV_Medals5.L_Rank=Rang : +SAV_Medals5.Tab_Habitat=Liste des habitats +SAV_Medals5.Tab_Medals=Médailles SAV_Misc2.B_Cancel=Annuler SAV_Misc2.B_Save=Sauvegarder SAV_Misc2.B_VirtualConsoleGSBall=Activer évènement GS Ball (Console Virtuelle) @@ -1653,7 +1698,6 @@ SAV_Misc5.B_Cancel=Annuler SAV_Misc5.B_DumpFC=Exporter données SAV_Misc5.B_FunfestMissions=Tout débloquer (sauf no. 0) SAV_Misc5.B_ImportFC=Importer données -SAV_Misc5.B_ObtainAllMedals=Obtenir toutes les médailles SAV_Misc5.B_RandForest=Randomiser toutes les zones SAV_Misc5.B_Save=Sauvegarder SAV_Misc5.B_UnlockAllProps=Tout donner @@ -1662,7 +1706,6 @@ SAV_Misc5.CHK_DoubleSet=Duo SAV_Misc5.CHK_FMNew=NOUV. SAV_Misc5.CHK_Invisible=Invisible SAV_Misc5.CHK_LibertyPass=Activer le Pass Liberté -SAV_Misc5.CHK_MedalUnread=Non vue SAV_Misc5.CHK_MultiFriendsSet=Ami SAV_Misc5.CHK_MultiNPCSet=PNJ SAV_Misc5.CHK_PropObtained=Obtenu @@ -1743,7 +1786,6 @@ SAV_Misc5.TAB_BWCityForest=ForêtB/VilleN SAV_Misc5.TAB_Entralink=Heylink SAV_Misc5.TAB_Forest=Forêt SAV_Misc5.TAB_Main=Principal -SAV_Misc5.TAB_Medals=Médailles SAV_Misc5.TAB_Muscial=Music-Hall SAV_Misc5.TAB_Subway=Métro SAV_Misc8b.B_Arceus=Débloquer l'évènement d'Arceus diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index d7cb8f981..11920a8fe 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -39,6 +39,7 @@ SAV_Inventory=Editor Inventario SAV_JoinAvenue=Galleria Solidarietà SAV_Link6=Strumenti Link SAV_MailBox=Editor Messaggi +SAV_Medals5=Premi SAV_Misc2=Editor Varie SAV_Misc3=Editor Dati Allenatore SAV_Misc4=Editor Varie @@ -235,6 +236,13 @@ GearCategory.Hands=Mani GearCategory.Head=Testa GearCategory.Shoes=Scarpe GearCategory.Top=Sopra +HabitatCompletion5.Caught=Catturato +HabitatCompletion5.Complete=Completo +HabitatCompletion5.None=Nessuno +HabitatCompletion5.Seen=Visto +HabitatEncounterType5.Fish=Pesca +HabitatEncounterType5.Grass=Erba +HabitatEncounterType5.Surf=Surf JoinAvenueCeilingColor5.Blue=Blu JoinAvenueCeilingColor5.Green=Verde JoinAvenueCeilingColor5.Orange=Arancione @@ -418,6 +426,7 @@ Main.B_OpenHoneyTreeEditor=Alberi di Miele Main.B_OpenItemPouch=Strumenti Main.B_OpenJoinAvenueEditor=Galleria Solidarietà Main.B_OpenLinkInfo=Dati Link +Main.B_OpenMedalsEditor=Premi Main.B_OpenMiscEditor=Mod. Varie Main.B_OpenOPowers=Poteri O Main.B_OpenPokeBeans=Pokégioli @@ -661,6 +670,16 @@ Main.Tab_OTMisc=AO/Varie Main.Tab_PartyBattle=Squadra Main.Tab_SAV=SAV Main.Tab_Stats=Statistiche +MedalRank5.Elite=Élite +MedalRank5.Legend=Leggenda +MedalRank5.Master=Maestro +MedalRank5.None=Nessuno +MedalRank5.Rookie=Principiante +MedalState5.HintObtained=Indizio ottenuto +MedalState5.HintReady=Indizio disponibile +MedalState5.Obtained=Ottenuto +MedalState5.ObtainReady=Pronto da ottenere +MedalState5.Unobtained=Non ottenuto MemoryAmie.B_ClearAll=Ripulisci MemoryAmie.BTN_Cancel=Annulla MemoryAmie.BTN_Save=Salva @@ -1500,6 +1519,32 @@ SAV_MailBox.L_PKM3=Bulbasaur: SAV_MailBox.L_PKM4=Bulbasaur: SAV_MailBox.L_PKM5=Bulbasaur: SAV_MailBox.L_PKM6=Bulbasaur: +SAV_Medals5.B_Cancel=Annulla +SAV_Medals5.B_ExportAll=Esporta tutto +SAV_Medals5.B_GiveAll=Assegna tutti +SAV_Medals5.B_HabitatClear=Cancella +SAV_Medals5.B_HabitatSetComplete=Segna completo +SAV_Medals5.B_ImportAll=Importa tutto +SAV_Medals5.B_Save=Salva +SAV_Medals5.CHK_HabitatTutorialCompleteCapture=Tutorial di cattura completato +SAV_Medals5.CHK_HabitatTutorialViewed=Tutorial visto +SAV_Medals5.CHK_TutorialComplete=Tutorial completato +SAV_Medals5.DGV_HabitatCompleteColumn=Completo +SAV_Medals5.DGV_HabitatFishColumn=Pesca +SAV_Medals5.DGV_HabitatGrassColumn=Erba +SAV_Medals5.DGV_HabitatIndexColumn=Indice +SAV_Medals5.DGV_HabitatSurfColumn=Surf +SAV_Medals5.DGV_MedalDateColumn=Data +SAV_Medals5.DGV_MedalIndexColumn=Indice +SAV_Medals5.DGV_MedalNameColumn=Nome +SAV_Medals5.DGV_MedalStateColumn=Stato +SAV_Medals5.DGV_MedalTypeColumn=Tipo +SAV_Medals5.DGV_MedalUnreadColumn=Non letto +SAV_Medals5.L_LastEncounterType=Ultimo tipo d'incontro: +SAV_Medals5.L_PinnedMedal=Premio fissato: +SAV_Medals5.L_Rank=Grado: +SAV_Medals5.Tab_Habitat=Lista zone +SAV_Medals5.Tab_Medals=Premi SAV_Misc2.B_Cancel=Annulla SAV_Misc2.B_Save=Salva SAV_Misc2.B_VirtualConsoleGSBall=Attiva evento Celebi (Virtual Console) @@ -1653,7 +1698,6 @@ SAV_Misc5.B_Cancel=Annulla SAV_Misc5.B_DumpFC=Dump Data SAV_Misc5.B_FunfestMissions=Sblocca Tutto (w/o No.0) SAV_Misc5.B_ImportFC=Import Data -SAV_Misc5.B_ObtainAllMedals=Ottieni tutti i premi SAV_Misc5.B_RandForest=Casualizza Tutti gli Alberi SAV_Misc5.B_Save=Salva SAV_Misc5.B_UnlockAllProps=Sblocca tutti i gadget @@ -1662,7 +1706,6 @@ SAV_Misc5.CHK_DoubleSet=Doppie SAV_Misc5.CHK_FMNew=Nuovo SAV_Misc5.CHK_Invisible=Invisibile SAV_Misc5.CHK_LibertyPass=Attiva LiberTicket -SAV_Misc5.CHK_MedalUnread=Non letti SAV_Misc5.CHK_MultiFriendsSet=Amici SAV_Misc5.CHK_MultiNPCSet=NPC SAV_Misc5.CHK_PropObtained=Ottenuto @@ -1743,7 +1786,6 @@ SAV_Misc5.TAB_BWCityForest=ForestaBianca/CittàNera SAV_Misc5.TAB_Entralink=Intramondo SAV_Misc5.TAB_Forest=Bosco SAV_Misc5.TAB_Main=Principale -SAV_Misc5.TAB_Medals=Premi SAV_Misc5.TAB_Muscial=Musical SAV_Misc5.TAB_Subway=Metrò SAV_Misc8b.B_Arceus=Sblocca l'Evento di Arceus diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index 6519e45f4..a2342716b 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -39,6 +39,7 @@ SAV_Inventory=アイテム SAV_JoinAvenue=ジョインアベニュー SAV_Link6=ポケモンリンク SAV_MailBox=メールボックス +SAV_Medals5=メダル SAV_Misc2=その他 SAV_Misc3=その他 SAV_Misc4=その他 @@ -235,6 +236,13 @@ GearCategory.Hands=うで GearCategory.Head=あたま GearCategory.Shoes=くつ GearCategory.Top=トップ +HabitatCompletion5.Caught=捕まえた +HabitatCompletion5.Complete=コンプリート +HabitatCompletion5.None=なし +HabitatCompletion5.Seen=見つけた +HabitatEncounterType5.Fish=釣り +HabitatEncounterType5.Grass=草むら +HabitatEncounterType5.Surf=なみのり JoinAvenueCeilingColor5.Blue=青 JoinAvenueCeilingColor5.Green=緑 JoinAvenueCeilingColor5.Orange=オレンジ @@ -418,6 +426,7 @@ Main.B_OpenHoneyTreeEditor=ミツの木 Main.B_OpenItemPouch=アイテム Main.B_OpenJoinAvenueEditor=ジョインアベニュー Main.B_OpenLinkInfo=ポケモンリンク +Main.B_OpenMedalsEditor=メダル Main.B_OpenMiscEditor=その他 Main.B_OpenOPowers= Oパワー Main.B_OpenPokeBeans=ポケマメ @@ -661,6 +670,16 @@ Main.Tab_OTMisc=親など Main.Tab_PartyBattle=手持ちポケモン Main.Tab_SAV=セーブ Main.Tab_Stats=ステータス +MedalRank5.Elite=エリートメダリスト +MedalRank5.Legend=レジェンドメダリスト +MedalRank5.Master=マスターメダリスト +MedalRank5.None=なし +MedalRank5.Rookie=ルーキーメダリスト +MedalState5.HintObtained=ヒント取得済み +MedalState5.HintReady=ヒントあり +MedalState5.Obtained=獲得済み +MedalState5.ObtainReady=獲得可能 +MedalState5.Unobtained=未獲得 MemoryAmie.B_ClearAll=全て消去 MemoryAmie.BTN_Cancel=キャンセル MemoryAmie.BTN_Save=保存 @@ -1500,6 +1519,32 @@ SAV_MailBox.L_PKM3=フシギダネ SAV_MailBox.L_PKM4=フシギダネ SAV_MailBox.L_PKM5=フシギダネ SAV_MailBox.L_PKM6=フシギダネ +SAV_Medals5.B_Cancel=キャンセル +SAV_Medals5.B_ExportAll=すべてエクスポート +SAV_Medals5.B_GiveAll=すべて付与 +SAV_Medals5.B_HabitatClear=クリア +SAV_Medals5.B_HabitatSetComplete=コンプリートにする +SAV_Medals5.B_ImportAll=すべてインポート +SAV_Medals5.B_Save=保存 +SAV_Medals5.CHK_HabitatTutorialCompleteCapture=捕獲チュートリアル完了 +SAV_Medals5.CHK_HabitatTutorialViewed=チュートリアル閲覧済み +SAV_Medals5.CHK_TutorialComplete=チュートリアル完了 +SAV_Medals5.DGV_HabitatCompleteColumn=コンプリート +SAV_Medals5.DGV_HabitatFishColumn=釣り +SAV_Medals5.DGV_HabitatGrassColumn=草むら +SAV_Medals5.DGV_HabitatIndexColumn=番号 +SAV_Medals5.DGV_HabitatSurfColumn=なみのり +SAV_Medals5.DGV_MedalDateColumn=日付 +SAV_Medals5.DGV_MedalIndexColumn=番号 +SAV_Medals5.DGV_MedalNameColumn=名前 +SAV_Medals5.DGV_MedalStateColumn=状態 +SAV_Medals5.DGV_MedalTypeColumn=種類 +SAV_Medals5.DGV_MedalUnreadColumn=未読 +SAV_Medals5.L_LastEncounterType=最後の遭遇タイプ: +SAV_Medals5.L_PinnedMedal=ピン留めメダル: +SAV_Medals5.L_Rank=ランク: +SAV_Medals5.Tab_Habitat=生息地リスト +SAV_Medals5.Tab_Medals=メダル SAV_Misc2.B_Cancel=キャンセル SAV_Misc2.B_Save=保存 SAV_Misc2.B_VirtualConsoleGSBall=GSボールイベント有効化(VC) @@ -1653,7 +1698,6 @@ SAV_Misc5.B_Cancel=キャンセル SAV_Misc5.B_DumpFC=データダンプ SAV_Misc5.B_FunfestMissions=全て解除 SAV_Misc5.B_ImportFC=データをインポート -SAV_Misc5.B_ObtainAllMedals=全てのメダル獲得 SAV_Misc5.B_RandForest=ランダム配置 SAV_Misc5.B_Save=保存 SAV_Misc5.B_UnlockAllProps=全てのグッズ解放 @@ -1662,7 +1706,6 @@ SAV_Misc5.CHK_DoubleSet=ダブル SAV_Misc5.CHK_FMNew=NEW SAV_Misc5.CHK_Invisible=不可視 SAV_Misc5.CHK_LibertyPass=リバティチケット 有効化 -SAV_Misc5.CHK_MedalUnread=未読 SAV_Misc5.CHK_MultiFriendsSet=フレンド SAV_Misc5.CHK_MultiNPCSet=NPC SAV_Misc5.CHK_PropObtained=獲得 @@ -1743,7 +1786,6 @@ SAV_Misc5.TAB_BWCityForest=ホワイトフォレスト/ブラックシティ SAV_Misc5.TAB_Entralink=ハイリンク SAV_Misc5.TAB_Forest=森 SAV_Misc5.TAB_Main=全般 -SAV_Misc5.TAB_Medals=メダル SAV_Misc5.TAB_Muscial=ミュージカル SAV_Misc5.TAB_Subway=サブウェイ SAV_Misc8b.B_Arceus=アルセウスイベント解禁 diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index 7b74c805c..d84f80ebd 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -39,6 +39,7 @@ SAV_Inventory=인벤토리 편집 도구 SAV_JoinAvenue=조인애버뉴 SAV_Link6=포켓몬 링크 도구 SAV_MailBox=메일박스 편집 도구 +SAV_Medals5=메달 SAV_Misc2=기타 편집 도구 SAV_Misc3=트레이너 데이터 편집 도구 SAV_Misc4=기타 편집 도구 @@ -235,6 +236,13 @@ GearCategory.Hands=Hands GearCategory.Head=Head GearCategory.Shoes=Shoes GearCategory.Top=Top +HabitatCompletion5.Caught=잡음 +HabitatCompletion5.Complete=완료 +HabitatCompletion5.None=없음 +HabitatCompletion5.Seen=봄 +HabitatEncounterType5.Fish=낚시 +HabitatEncounterType5.Grass=풀숲 +HabitatEncounterType5.Surf=파도타기 JoinAvenueCeilingColor5.Blue=파랑 JoinAvenueCeilingColor5.Green=초록 JoinAvenueCeilingColor5.Orange=주황 @@ -418,6 +426,7 @@ Main.B_OpenHoneyTreeEditor=꿀바른 나무 Main.B_OpenItemPouch=아이템 Main.B_OpenJoinAvenueEditor=조인애버뉴 Main.B_OpenLinkInfo=링크 데이터 +Main.B_OpenMedalsEditor=메달 Main.B_OpenMiscEditor=기타 편집 Main.B_OpenOPowers=O파워 Main.B_OpenPokeBeans=포켓콩 @@ -661,6 +670,16 @@ Main.Tab_OTMisc=어버이/기타 Main.Tab_PartyBattle=파티 Main.Tab_SAV=세이브 Main.Tab_Stats=능력치 +MedalRank5.Elite=엘리트 메달리스트 +MedalRank5.Legend=레전드 메달리스트 +MedalRank5.Master=마스터 메달리스트 +MedalRank5.None=없음 +MedalRank5.Rookie=루키 메달리스트 +MedalState5.HintObtained=힌트 획득 +MedalState5.HintReady=힌트 가능 +MedalState5.Obtained=획득 완료 +MedalState5.ObtainReady=획득 가능 +MedalState5.Unobtained=미획득 MemoryAmie.B_ClearAll=모두 비우기 MemoryAmie.BTN_Cancel=취소 MemoryAmie.BTN_Save=저장 @@ -1500,6 +1519,32 @@ SAV_MailBox.L_PKM3=이상해씨: SAV_MailBox.L_PKM4=이상해씨: SAV_MailBox.L_PKM5=이상해씨: SAV_MailBox.L_PKM6=이상해씨: +SAV_Medals5.B_Cancel=취소 +SAV_Medals5.B_ExportAll=모두 내보내기 +SAV_Medals5.B_GiveAll=모두 지급 +SAV_Medals5.B_HabitatClear=지우기 +SAV_Medals5.B_HabitatSetComplete=완료로 설정 +SAV_Medals5.B_ImportAll=모두 가져오기 +SAV_Medals5.B_Save=저장 +SAV_Medals5.CHK_HabitatTutorialCompleteCapture=포획 튜토리얼 완료 +SAV_Medals5.CHK_HabitatTutorialViewed=튜토리얼 확인 +SAV_Medals5.CHK_TutorialComplete=튜토리얼 완료 +SAV_Medals5.DGV_HabitatCompleteColumn=완료 +SAV_Medals5.DGV_HabitatFishColumn=낚시 +SAV_Medals5.DGV_HabitatGrassColumn=풀숲 +SAV_Medals5.DGV_HabitatIndexColumn=번호 +SAV_Medals5.DGV_HabitatSurfColumn=파도타기 +SAV_Medals5.DGV_MedalDateColumn=날짜 +SAV_Medals5.DGV_MedalIndexColumn=번호 +SAV_Medals5.DGV_MedalNameColumn=이름 +SAV_Medals5.DGV_MedalStateColumn=상태 +SAV_Medals5.DGV_MedalTypeColumn=타입 +SAV_Medals5.DGV_MedalUnreadColumn=읽지 않음 +SAV_Medals5.L_LastEncounterType=마지막 조우 타입: +SAV_Medals5.L_PinnedMedal=고정 메달: +SAV_Medals5.L_Rank=랭크: +SAV_Medals5.Tab_Habitat=서식지 리스트 +SAV_Medals5.Tab_Medals=메달 SAV_Misc2.B_Cancel=취소 SAV_Misc2.B_Save=저장 SAV_Misc2.B_VirtualConsoleGSBall=GS볼 이벤트 활성화 (버추얼 콘솔) @@ -1653,7 +1698,6 @@ SAV_Misc5.B_Cancel=취소 SAV_Misc5.B_DumpFC=데이터 덤프 SAV_Misc5.B_FunfestMissions=모두 해금 (No.0 제외) SAV_Misc5.B_ImportFC=데이터 가져오기 -SAV_Misc5.B_ObtainAllMedals=모든 메달 획득 SAV_Misc5.B_RandForest=모든 구역 랜덤화 SAV_Misc5.B_Save=저장 SAV_Misc5.B_UnlockAllProps=모든 굿즈 해금 @@ -1662,7 +1706,6 @@ SAV_Misc5.CHK_DoubleSet=더블 SAV_Misc5.CHK_FMNew=신규 SAV_Misc5.CHK_Invisible=투명 SAV_Misc5.CHK_LibertyPass=리버티티켓 활성화 -SAV_Misc5.CHK_MedalUnread=미확인 SAV_Misc5.CHK_MultiFriendsSet=친구 SAV_Misc5.CHK_MultiNPCSet=NPC SAV_Misc5.CHK_PropObtained=획득함 @@ -1743,7 +1786,6 @@ SAV_Misc5.TAB_BWCityForest=화이트포리스트/블랙시티 SAV_Misc5.TAB_Entralink=하일링크 SAV_Misc5.TAB_Forest=숲 SAV_Misc5.TAB_Main=메인 -SAV_Misc5.TAB_Medals=메달 SAV_Misc5.TAB_Muscial=뮤지컬 SAV_Misc5.TAB_Subway=서브웨이 SAV_Misc8b.B_Arceus=아르세우스 이벤트 해제 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index eefbca4bf..714bfee3c 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -39,6 +39,7 @@ SAV_Inventory=物品栏 SAV_JoinAvenue=汇合大道 SAV_Link6=宝可梦连接工具 SAV_MailBox=邮箱编辑 +SAV_Medals5=奖牌 SAV_Misc2=杂项编辑 SAV_Misc3=训练家数据编辑 SAV_Misc4=杂项编辑 @@ -235,6 +236,13 @@ GearCategory.Hands=手部 GearCategory.Head=头部 GearCategory.Shoes=鞋子 GearCategory.Top=上装 +HabitatCompletion5.Caught=已捕获 +HabitatCompletion5.Complete=完成 +HabitatCompletion5.None=无 +HabitatCompletion5.Seen=已见 +HabitatEncounterType5.Fish=垂钓 +HabitatEncounterType5.Grass=草丛 +HabitatEncounterType5.Surf=冲浪 JoinAvenueCeilingColor5.Blue=蓝色 JoinAvenueCeilingColor5.Green=绿色 JoinAvenueCeilingColor5.Orange=橙色 @@ -418,6 +426,7 @@ Main.B_OpenHoneyTreeEditor=甜甜蜜树 Main.B_OpenItemPouch=道具 Main.B_OpenJoinAvenueEditor=汇合大道 Main.B_OpenLinkInfo=宝可梦连接 +Main.B_OpenMedalsEditor=奖牌 Main.B_OpenMiscEditor=杂项编辑 Main.B_OpenOPowers=O-力量 Main.B_OpenPokeBeans=宝可豆 @@ -661,6 +670,16 @@ Main.Tab_OTMisc=初训家/杂项 Main.Tab_PartyBattle=同行 Main.Tab_SAV=存档 Main.Tab_Stats=数值 +MedalRank5.Elite=精英 +MedalRank5.Legend=传说 +MedalRank5.Master=大师 +MedalRank5.None=无 +MedalRank5.Rookie=新秀 +MedalState5.HintObtained=已获提示 +MedalState5.HintReady=可获提示 +MedalState5.Obtained=已获得 +MedalState5.ObtainReady=可获得 +MedalState5.Unobtained=未获得 MemoryAmie.B_ClearAll=清空 MemoryAmie.BTN_Cancel=取消 MemoryAmie.BTN_Save=保存 @@ -1500,6 +1519,32 @@ SAV_MailBox.L_PKM3=妙蛙种子: SAV_MailBox.L_PKM4=妙蛙种子: SAV_MailBox.L_PKM5=妙蛙种子: SAV_MailBox.L_PKM6=妙蛙种子: +SAV_Medals5.B_Cancel=取消 +SAV_Medals5.B_ExportAll=全部导出 +SAV_Medals5.B_GiveAll=全部给予 +SAV_Medals5.B_HabitatClear=清除 +SAV_Medals5.B_HabitatSetComplete=设为完成 +SAV_Medals5.B_ImportAll=全部导入 +SAV_Medals5.B_Save=保存 +SAV_Medals5.CHK_HabitatTutorialCompleteCapture=捕获教程完成 +SAV_Medals5.CHK_HabitatTutorialViewed=已查看教程 +SAV_Medals5.CHK_TutorialComplete=教程完成 +SAV_Medals5.DGV_HabitatCompleteColumn=完成 +SAV_Medals5.DGV_HabitatFishColumn=垂钓 +SAV_Medals5.DGV_HabitatGrassColumn=草丛 +SAV_Medals5.DGV_HabitatIndexColumn=编号 +SAV_Medals5.DGV_HabitatSurfColumn=冲浪 +SAV_Medals5.DGV_MedalDateColumn=日期 +SAV_Medals5.DGV_MedalIndexColumn=编号 +SAV_Medals5.DGV_MedalNameColumn=名称 +SAV_Medals5.DGV_MedalStateColumn=状态 +SAV_Medals5.DGV_MedalTypeColumn=类型 +SAV_Medals5.DGV_MedalUnreadColumn=未读 +SAV_Medals5.L_LastEncounterType=上次遭遇类型: +SAV_Medals5.L_PinnedMedal=置顶奖牌: +SAV_Medals5.L_Rank=等级: +SAV_Medals5.Tab_Habitat=栖息地列表 +SAV_Medals5.Tab_Medals=奖牌 SAV_Misc2.B_Cancel=取消 SAV_Misc2.B_Save=保存 SAV_Misc2.B_VirtualConsoleGSBall=启用GS球事件(虚拟主机) @@ -1653,7 +1698,6 @@ SAV_Misc5.B_Cancel=取消 SAV_Misc5.B_DumpFC=导出数据 SAV_Misc5.B_FunfestMissions=解锁所有 (除了 No.0) SAV_Misc5.B_ImportFC=导入数据 -SAV_Misc5.B_ObtainAllMedals=获得所有奖章 SAV_Misc5.B_RandForest=随机所有区域 SAV_Misc5.B_Save=保存 SAV_Misc5.B_UnlockAllProps=解锁所有道具 @@ -1662,7 +1706,6 @@ SAV_Misc5.CHK_DoubleSet=双打 SAV_Misc5.CHK_FMNew=新纪录 SAV_Misc5.CHK_Invisible=隐性 SAV_Misc5.CHK_LibertyPass=激活自由船票 -SAV_Misc5.CHK_MedalUnread=未读 SAV_Misc5.CHK_MultiFriendsSet=朋友 SAV_Misc5.CHK_MultiNPCSet=NPC SAV_Misc5.CHK_PropObtained=获得 @@ -1743,7 +1786,6 @@ SAV_Misc5.TAB_BWCityForest=白森林/黑色市 SAV_Misc5.TAB_Entralink=连入 SAV_Misc5.TAB_Forest=森林 SAV_Misc5.TAB_Main=主界面 -SAV_Misc5.TAB_Medals=奖章 SAV_Misc5.TAB_Muscial=音乐剧 SAV_Misc5.TAB_Subway=地铁 SAV_Misc8b.B_Arceus=解锁阿尔宙斯事件 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index 029874bea..f80d99fe0 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -39,6 +39,7 @@ SAV_Inventory=物品欄 SAV_JoinAvenue=匯合大道 SAV_Link6=寶可夢連接工具 SAV_MailBox=郵箱編輯 +SAV_Medals5=獎牌 SAV_Misc2=訓練家資料雜項編輯 SAV_Misc3=訓練家資料雜項編輯 SAV_Misc4=訓練家資料雜項編輯 @@ -235,6 +236,13 @@ GearCategory.Hands=手部 GearCategory.Head=頭部 GearCategory.Shoes=鞋子 GearCategory.Top=上裝 +HabitatCompletion5.Caught=已捕獲 +HabitatCompletion5.Complete=完成 +HabitatCompletion5.None=無 +HabitatCompletion5.Seen=已見 +HabitatEncounterType5.Fish=垂釣 +HabitatEncounterType5.Grass=草叢 +HabitatEncounterType5.Surf=衝浪 JoinAvenueCeilingColor5.Blue=藍色 JoinAvenueCeilingColor5.Green=綠色 JoinAvenueCeilingColor5.Orange=橙色 @@ -418,6 +426,7 @@ Main.B_OpenHoneyTreeEditor=甜甜蜜樹 Main.B_OpenItemPouch=道具 Main.B_OpenJoinAvenueEditor=匯合大道 Main.B_OpenLinkInfo=寶可夢連接 +Main.B_OpenMedalsEditor=獎牌 Main.B_OpenMiscEditor=雜項編輯 Main.B_OpenOPowers=O-力量 Main.B_OpenPokeBeans=寶可豆 @@ -661,6 +670,16 @@ Main.Tab_OTMisc=初訓家/雜項 Main.Tab_PartyBattle=同行 Main.Tab_SAV=存檔 Main.Tab_Stats=數值 +MedalRank5.Elite=精英 +MedalRank5.Legend=傳說 +MedalRank5.Master=大師 +MedalRank5.None=無 +MedalRank5.Rookie=新秀 +MedalState5.HintObtained=已獲提示 +MedalState5.HintReady=可獲提示 +MedalState5.Obtained=已獲得 +MedalState5.ObtainReady=可獲得 +MedalState5.Unobtained=未獲得 MemoryAmie.B_ClearAll=清空 MemoryAmie.BTN_Cancel=取消 MemoryAmie.BTN_Save=儲存 @@ -1500,6 +1519,32 @@ SAV_MailBox.L_PKM3=妙蛙種子: SAV_MailBox.L_PKM4=妙蛙種子: SAV_MailBox.L_PKM5=妙蛙種子: SAV_MailBox.L_PKM6=妙蛙種子: +SAV_Medals5.B_Cancel=取消 +SAV_Medals5.B_ExportAll=全部匯出 +SAV_Medals5.B_GiveAll=全部給予 +SAV_Medals5.B_HabitatClear=清除 +SAV_Medals5.B_HabitatSetComplete=設為完成 +SAV_Medals5.B_ImportAll=全部匯入 +SAV_Medals5.B_Save=儲存 +SAV_Medals5.CHK_HabitatTutorialCompleteCapture=捕獲教學完成 +SAV_Medals5.CHK_HabitatTutorialViewed=已檢視教學 +SAV_Medals5.CHK_TutorialComplete=教學完成 +SAV_Medals5.DGV_HabitatCompleteColumn=完成 +SAV_Medals5.DGV_HabitatFishColumn=垂釣 +SAV_Medals5.DGV_HabitatGrassColumn=草叢 +SAV_Medals5.DGV_HabitatIndexColumn=編號 +SAV_Medals5.DGV_HabitatSurfColumn=衝浪 +SAV_Medals5.DGV_MedalDateColumn=日期 +SAV_Medals5.DGV_MedalIndexColumn=編號 +SAV_Medals5.DGV_MedalNameColumn=名稱 +SAV_Medals5.DGV_MedalStateColumn=狀態 +SAV_Medals5.DGV_MedalTypeColumn=類型 +SAV_Medals5.DGV_MedalUnreadColumn=未讀 +SAV_Medals5.L_LastEncounterType=上次遭遇類型: +SAV_Medals5.L_PinnedMedal=置頂獎牌: +SAV_Medals5.L_Rank=等級: +SAV_Medals5.Tab_Habitat=棲息地列表 +SAV_Medals5.Tab_Medals=獎牌 SAV_Misc2.B_Cancel=取消 SAV_Misc2.B_Save=保存 SAV_Misc2.B_VirtualConsoleGSBall=啟用GS球事件(虛擬主機) @@ -1653,7 +1698,6 @@ SAV_Misc5.B_Cancel=取消 SAV_Misc5.B_DumpFC=導出資料 SAV_Misc5.B_FunfestMissions=解鎖所有 (除了 No.0) SAV_Misc5.B_ImportFC=導入資料 -SAV_Misc5.B_ObtainAllMedals=獲得所有獎章 SAV_Misc5.B_RandForest=隨機所有區域 SAV_Misc5.B_Save=儲存 SAV_Misc5.B_UnlockAllProps=解鎖全部音樂物品 @@ -1662,7 +1706,6 @@ SAV_Misc5.CHK_DoubleSet=雙打 SAV_Misc5.CHK_FMNew=新紀錄 SAV_Misc5.CHK_Invisible=隱性 SAV_Misc5.CHK_LibertyPass=啟動自由船票 -SAV_Misc5.CHK_MedalUnread=未讀 SAV_Misc5.CHK_MultiFriendsSet=朋友 SAV_Misc5.CHK_MultiNPCSet=NPC SAV_Misc5.CHK_PropObtained=獲得 @@ -1743,7 +1786,6 @@ SAV_Misc5.TAB_BWCityForest=白森林/黑色市 SAV_Misc5.TAB_Entralink=連入 SAV_Misc5.TAB_Forest=森林 SAV_Misc5.TAB_Main=主介面 -SAV_Misc5.TAB_Medals=獎章 SAV_Misc5.TAB_Muscial=音樂劇 SAV_Misc5.TAB_Subway=地鐵 SAV_Misc8b.B_Arceus=解鎖阿爾宙斯事件 diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/SAV_JoinAvenue.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/SAV_JoinAvenue.Designer.cs index 78d8f171c..057905141 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/SAV_JoinAvenue.Designer.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/Join Avenue/SAV_JoinAvenue.Designer.cs @@ -120,7 +120,7 @@ private void InitializeComponent() CHK_ScriptFlag.AutoSize = true; CHK_ScriptFlag.Location = new System.Drawing.Point(97, 11); CHK_ScriptFlag.Name = "CHK_ScriptFlag"; - CHK_ScriptFlag.Size = new System.Drawing.Size(74, 21); + CHK_ScriptFlag.Size = new System.Drawing.Size(88, 21); CHK_ScriptFlag.TabIndex = 1; CHK_ScriptFlag.Text = "Script Flag"; CHK_ScriptFlag.UseVisualStyleBackColor = true; @@ -331,6 +331,7 @@ private void InitializeComponent() Controls.Add(B_Cancel); Controls.Add(TC_JoinAvenue); Icon = Properties.Resources.Icon; + MaximizeBox = false; MinimumSize = new System.Drawing.Size(980, 764); Name = "SAV_JoinAvenue"; StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Medals5.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Medals5.Designer.cs new file mode 100644 index 000000000..9ecc848c1 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Medals5.Designer.cs @@ -0,0 +1,639 @@ +namespace PKHeX.WinForms +{ + partial class SAV_Medals5 + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + components.Dispose(); + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle(); + TC_Main = new System.Windows.Forms.TabControl(); + Tab_Medals = new System.Windows.Forms.TabPage(); + DGV_Medals = new PKHeX.WinForms.Controls.DoubleBufferedDataGridView(); + MedalIndexColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + MedalNameColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + MedalTypeColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + MedalStateColumn = new System.Windows.Forms.DataGridViewComboBoxColumn(); + MedalUnreadColumn = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + MedalDateColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + MedalSettingsPanel = new System.Windows.Forms.TableLayoutPanel(); + L_PinnedMedal = new System.Windows.Forms.Label(); + CB_PinnedMedal = new System.Windows.Forms.ComboBox(); + L_Rank = new System.Windows.Forms.Label(); + CB_Rank = new System.Windows.Forms.ComboBox(); + CHK_TutorialComplete = new System.Windows.Forms.CheckBox(); + MedalButtonPanel = new System.Windows.Forms.FlowLayoutPanel(); + B_ExportAll = new System.Windows.Forms.Button(); + B_ImportAll = new System.Windows.Forms.Button(); + B_GiveAll = new System.Windows.Forms.Button(); + Tab_Habitat = new System.Windows.Forms.TabPage(); + DGV_Habitat = new PKHeX.WinForms.Controls.DoubleBufferedDataGridView(); + HabitatIndexColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + HabitatCompleteColumn = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + HabitatGrassColumn = new System.Windows.Forms.DataGridViewComboBoxColumn(); + HabitatSurfColumn = new System.Windows.Forms.DataGridViewComboBoxColumn(); + HabitatFishColumn = new System.Windows.Forms.DataGridViewComboBoxColumn(); + HabitatBottomPanel = new System.Windows.Forms.TableLayoutPanel(); + FLP_HabitatActions = new System.Windows.Forms.FlowLayoutPanel(); + B_HabitatClear = new System.Windows.Forms.Button(); + B_HabitatSetComplete = new System.Windows.Forms.Button(); + CHK_HabitatTutorialViewed = new System.Windows.Forms.CheckBox(); + CHK_HabitatTutorialCompleteCapture = new System.Windows.Forms.CheckBox(); + L_Unknown90 = new System.Windows.Forms.Label(); + NUD_Unknown90 = new System.Windows.Forms.NumericUpDown(); + L_Unknown92 = new System.Windows.Forms.Label(); + NUD_Unknown92 = new System.Windows.Forms.NumericUpDown(); + L_LastEncounterType = new System.Windows.Forms.Label(); + CB_LastEncounterType = new System.Windows.Forms.ComboBox(); + ButtonPanel = new System.Windows.Forms.FlowLayoutPanel(); + B_Save = new System.Windows.Forms.Button(); + B_Cancel = new System.Windows.Forms.Button(); + TC_Main.SuspendLayout(); + Tab_Medals.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)DGV_Medals).BeginInit(); + MedalSettingsPanel.SuspendLayout(); + MedalButtonPanel.SuspendLayout(); + Tab_Habitat.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)DGV_Habitat).BeginInit(); + HabitatBottomPanel.SuspendLayout(); + FLP_HabitatActions.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown90).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown92).BeginInit(); + ButtonPanel.SuspendLayout(); + SuspendLayout(); + // + // TC_Main + // + TC_Main.Controls.Add(Tab_Medals); + TC_Main.Controls.Add(Tab_Habitat); + TC_Main.Dock = System.Windows.Forms.DockStyle.Fill; + TC_Main.Location = new System.Drawing.Point(0, 0); + TC_Main.Name = "TC_Main"; + TC_Main.SelectedIndex = 0; + TC_Main.Size = new System.Drawing.Size(984, 522); + TC_Main.TabIndex = 0; + // + // Tab_Medals + // + Tab_Medals.Controls.Add(DGV_Medals); + Tab_Medals.Controls.Add(MedalSettingsPanel); + Tab_Medals.Controls.Add(MedalButtonPanel); + Tab_Medals.Location = new System.Drawing.Point(4, 26); + Tab_Medals.Name = "Tab_Medals"; + Tab_Medals.Padding = new System.Windows.Forms.Padding(3); + Tab_Medals.Size = new System.Drawing.Size(976, 492); + Tab_Medals.TabIndex = 0; + Tab_Medals.Text = "Medals"; + Tab_Medals.UseVisualStyleBackColor = true; + // + // DGV_Medals + // + DGV_Medals.AllowUserToAddRows = false; + DGV_Medals.AllowUserToDeleteRows = false; + DGV_Medals.AllowUserToResizeRows = false; + dataGridViewCellStyle5.BackColor = System.Drawing.SystemColors.ControlLight; + DGV_Medals.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle5; + DGV_Medals.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; + DGV_Medals.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + DGV_Medals.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { MedalIndexColumn, MedalNameColumn, MedalTypeColumn, MedalStateColumn, MedalUnreadColumn, MedalDateColumn }); + DGV_Medals.Dock = System.Windows.Forms.DockStyle.Fill; + DGV_Medals.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter; + DGV_Medals.Location = new System.Drawing.Point(3, 3); + DGV_Medals.MultiSelect = false; + DGV_Medals.Name = "DGV_Medals"; + DGV_Medals.RowHeadersVisible = false; + DGV_Medals.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.CellSelect; + DGV_Medals.Size = new System.Drawing.Size(970, 363); + DGV_Medals.TabIndex = 0; + DGV_Medals.CellBeginEdit += DGV_Medals_CellBeginEdit; + DGV_Medals.CellValueChanged += DGV_Medals_CellValueChanged; + DGV_Medals.CellParsing += DGV_Medals_CellParsing; + DGV_Medals.CellValidating += DGV_Medals_CellValidating; + DGV_Medals.CurrentCellDirtyStateChanged += DGV_Medals_CurrentCellDirtyStateChanged; + DGV_Medals.DataError += DGV_Medals_DataError; + DGV_Medals.EditingControlShowing += DGV_Medals_EditingControlShowing; + // + // MedalIndexColumn + // + MedalIndexColumn.FillWeight = 60F; + MedalIndexColumn.HeaderText = "Index"; + MedalIndexColumn.Name = "MedalIndexColumn"; + MedalIndexColumn.ReadOnly = true; + MedalIndexColumn.ValueType = typeof(int); + // + // MedalNameColumn + // + MedalNameColumn.FillWeight = 220F; + MedalNameColumn.HeaderText = "Name"; + MedalNameColumn.Name = "MedalNameColumn"; + MedalNameColumn.ReadOnly = true; + // + // MedalTypeColumn + // + MedalTypeColumn.FillWeight = 120F; + MedalTypeColumn.HeaderText = "Type"; + MedalTypeColumn.Name = "MedalTypeColumn"; + MedalTypeColumn.ReadOnly = true; + // + // MedalStateColumn + // + MedalStateColumn.FillWeight = 170F; + MedalStateColumn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + MedalStateColumn.HeaderText = "State"; + MedalStateColumn.Name = "MedalStateColumn"; + MedalStateColumn.DisplayStyle = System.Windows.Forms.DataGridViewComboBoxDisplayStyle.Nothing; + MedalStateColumn.Resizable = System.Windows.Forms.DataGridViewTriState.True; + MedalStateColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + // + // MedalUnreadColumn + // + MedalUnreadColumn.FillWeight = 90F; + MedalUnreadColumn.HeaderText = "IsUnread"; + MedalUnreadColumn.Name = "MedalUnreadColumn"; + // + // MedalDateColumn + // + MedalDateColumn.FillWeight = 120F; + MedalDateColumn.HeaderText = "Date"; + MedalDateColumn.Name = "MedalDateColumn"; + // + // MedalSettingsPanel + // + MedalSettingsPanel.AutoSize = true; + MedalSettingsPanel.ColumnCount = 4; + MedalSettingsPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + MedalSettingsPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + MedalSettingsPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + MedalSettingsPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + MedalSettingsPanel.Controls.Add(L_PinnedMedal, 0, 0); + MedalSettingsPanel.Controls.Add(CB_PinnedMedal, 1, 0); + MedalSettingsPanel.Controls.Add(L_Rank, 2, 0); + MedalSettingsPanel.Controls.Add(CB_Rank, 3, 0); + MedalSettingsPanel.Controls.Add(CHK_TutorialComplete, 0, 1); + MedalSettingsPanel.Dock = System.Windows.Forms.DockStyle.Bottom; + MedalSettingsPanel.Location = new System.Drawing.Point(3, 366); + MedalSettingsPanel.Name = "MedalSettingsPanel"; + MedalSettingsPanel.Padding = new System.Windows.Forms.Padding(8); + MedalSettingsPanel.RowCount = 2; + MedalSettingsPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + MedalSettingsPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + MedalSettingsPanel.Size = new System.Drawing.Size(970, 74); + MedalSettingsPanel.TabIndex = 2; + // + // L_PinnedMedal + // + L_PinnedMedal.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_PinnedMedal.AutoSize = true; + L_PinnedMedal.Location = new System.Drawing.Point(11, 15); + L_PinnedMedal.Name = "L_PinnedMedal"; + L_PinnedMedal.Size = new System.Drawing.Size(91, 17); + L_PinnedMedal.TabIndex = 0; + L_PinnedMedal.Text = "Pinned Medal:"; + // + // CB_PinnedMedal + // + CB_PinnedMedal.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CB_PinnedMedal.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_PinnedMedal.FormattingEnabled = true; + CB_PinnedMedal.Location = new System.Drawing.Point(108, 11); + CB_PinnedMedal.Name = "CB_PinnedMedal"; + CB_PinnedMedal.Size = new System.Drawing.Size(400, 25); + CB_PinnedMedal.TabIndex = 1; + // + // L_Rank + // + L_Rank.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Rank.AutoSize = true; + L_Rank.Location = new System.Drawing.Point(514, 15); + L_Rank.Name = "L_Rank"; + L_Rank.Size = new System.Drawing.Size(39, 17); + L_Rank.TabIndex = 2; + L_Rank.Text = "Rank:"; + L_Rank.Click += L_Rank_Click; + // + // CB_Rank + // + CB_Rank.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CB_Rank.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_Rank.FormattingEnabled = true; + CB_Rank.Location = new System.Drawing.Point(559, 11); + CB_Rank.Name = "CB_Rank"; + CB_Rank.Size = new System.Drawing.Size(400, 25); + CB_Rank.TabIndex = 3; + // + // CHK_TutorialComplete + // + CHK_TutorialComplete.Anchor = System.Windows.Forms.AnchorStyles.Left; + CHK_TutorialComplete.AutoSize = true; + MedalSettingsPanel.SetColumnSpan(CHK_TutorialComplete, 2); + CHK_TutorialComplete.Location = new System.Drawing.Point(11, 42); + CHK_TutorialComplete.Name = "CHK_TutorialComplete"; + CHK_TutorialComplete.Size = new System.Drawing.Size(131, 21); + CHK_TutorialComplete.TabIndex = 4; + CHK_TutorialComplete.Text = "Tutorial Complete"; + CHK_TutorialComplete.UseVisualStyleBackColor = true; + // + // MedalButtonPanel + // + MedalButtonPanel.AutoSize = true; + MedalButtonPanel.Controls.Add(B_ExportAll); + MedalButtonPanel.Controls.Add(B_ImportAll); + MedalButtonPanel.Controls.Add(B_GiveAll); + MedalButtonPanel.Dock = System.Windows.Forms.DockStyle.Bottom; + MedalButtonPanel.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft; + MedalButtonPanel.Location = new System.Drawing.Point(3, 440); + MedalButtonPanel.Name = "MedalButtonPanel"; + MedalButtonPanel.Padding = new System.Windows.Forms.Padding(8); + MedalButtonPanel.RightToLeft = System.Windows.Forms.RightToLeft.Yes; + MedalButtonPanel.Size = new System.Drawing.Size(970, 49); + MedalButtonPanel.TabIndex = 1; + MedalButtonPanel.WrapContents = false; + // + // B_ExportAll + // + B_ExportAll.AutoSize = true; + B_ExportAll.Location = new System.Drawing.Point(11, 11); + B_ExportAll.Name = "B_ExportAll"; + B_ExportAll.Size = new System.Drawing.Size(77, 27); + B_ExportAll.TabIndex = 0; + B_ExportAll.Text = "Export All"; + B_ExportAll.UseVisualStyleBackColor = true; + B_ExportAll.Click += B_ExportAll_Click; + // + // B_ImportAll + // + B_ImportAll.AutoSize = true; + B_ImportAll.Location = new System.Drawing.Point(94, 11); + B_ImportAll.Name = "B_ImportAll"; + B_ImportAll.Size = new System.Drawing.Size(77, 27); + B_ImportAll.TabIndex = 1; + B_ImportAll.Text = "Import All"; + B_ImportAll.UseVisualStyleBackColor = true; + B_ImportAll.Click += B_ImportAll_Click; + // + // B_GiveAll + // + B_GiveAll.AutoSize = true; + B_GiveAll.Location = new System.Drawing.Point(177, 11); + B_GiveAll.Name = "B_GiveAll"; + B_GiveAll.Size = new System.Drawing.Size(65, 27); + B_GiveAll.TabIndex = 2; + B_GiveAll.Text = "Give All"; + B_GiveAll.UseVisualStyleBackColor = true; + B_GiveAll.Click += B_GiveAll_Click; + // + // Tab_Habitat + // + Tab_Habitat.Controls.Add(DGV_Habitat); + Tab_Habitat.Controls.Add(HabitatBottomPanel); + Tab_Habitat.Location = new System.Drawing.Point(4, 26); + Tab_Habitat.Name = "Tab_Habitat"; + Tab_Habitat.Padding = new System.Windows.Forms.Padding(3); + Tab_Habitat.Size = new System.Drawing.Size(976, 492); + Tab_Habitat.TabIndex = 1; + Tab_Habitat.Text = "Habitat"; + Tab_Habitat.UseVisualStyleBackColor = true; + // + // DGV_Habitat + // + DGV_Habitat.AllowUserToAddRows = false; + DGV_Habitat.AllowUserToDeleteRows = false; + DGV_Habitat.AllowUserToResizeRows = false; + dataGridViewCellStyle6.BackColor = System.Drawing.SystemColors.ControlLight; + DGV_Habitat.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle6; + DGV_Habitat.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; + DGV_Habitat.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + DGV_Habitat.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { HabitatIndexColumn, HabitatCompleteColumn, HabitatGrassColumn, HabitatSurfColumn, HabitatFishColumn }); + DGV_Habitat.Dock = System.Windows.Forms.DockStyle.Fill; + DGV_Habitat.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter; + DGV_Habitat.Location = new System.Drawing.Point(3, 3); + DGV_Habitat.Name = "DGV_Habitat"; + DGV_Habitat.RowHeadersVisible = false; + DGV_Habitat.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + DGV_Habitat.Size = new System.Drawing.Size(970, 381); + DGV_Habitat.TabIndex = 0; + DGV_Habitat.CellValueChanged += DGV_Habitat_CellValueChanged; + DGV_Habitat.CurrentCellDirtyStateChanged += DGV_Habitat_CurrentCellDirtyStateChanged; + DGV_Habitat.DataError += DGV_Habitat_DataError; + DGV_Habitat.EditingControlShowing += DGV_Habitat_EditingControlShowing; + // + // HabitatIndexColumn + // + HabitatIndexColumn.FillWeight = 70F; + HabitatIndexColumn.HeaderText = "Index"; + HabitatIndexColumn.Name = "HabitatIndexColumn"; + HabitatIndexColumn.ReadOnly = true; + HabitatIndexColumn.ValueType = typeof(int); + // + // HabitatCompleteColumn + // + HabitatCompleteColumn.FillWeight = 90F; + HabitatCompleteColumn.HeaderText = "Complete"; + HabitatCompleteColumn.Name = "HabitatCompleteColumn"; + // + // HabitatGrassColumn + // + HabitatGrassColumn.FillWeight = 120F; + HabitatGrassColumn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + HabitatGrassColumn.HeaderText = "Grass"; + HabitatGrassColumn.Name = "HabitatGrassColumn"; + HabitatGrassColumn.DisplayStyle = System.Windows.Forms.DataGridViewComboBoxDisplayStyle.Nothing; + HabitatGrassColumn.Resizable = System.Windows.Forms.DataGridViewTriState.True; + HabitatGrassColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + // + // HabitatSurfColumn + // + HabitatSurfColumn.FillWeight = 120F; + HabitatSurfColumn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + HabitatSurfColumn.HeaderText = "Surf"; + HabitatSurfColumn.Name = "HabitatSurfColumn"; + HabitatSurfColumn.DisplayStyle = System.Windows.Forms.DataGridViewComboBoxDisplayStyle.Nothing; + HabitatSurfColumn.Resizable = System.Windows.Forms.DataGridViewTriState.True; + HabitatSurfColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + // + // HabitatFishColumn + // + HabitatFishColumn.FillWeight = 120F; + HabitatFishColumn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + HabitatFishColumn.HeaderText = "Fish"; + HabitatFishColumn.Name = "HabitatFishColumn"; + HabitatFishColumn.DisplayStyle = System.Windows.Forms.DataGridViewComboBoxDisplayStyle.Nothing; + HabitatFishColumn.Resizable = System.Windows.Forms.DataGridViewTriState.True; + HabitatFishColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + // + // HabitatBottomPanel + // + HabitatBottomPanel.AutoSize = true; + HabitatBottomPanel.ColumnCount = 6; + HabitatBottomPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + HabitatBottomPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + HabitatBottomPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + HabitatBottomPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + HabitatBottomPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + HabitatBottomPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + HabitatBottomPanel.Controls.Add(FLP_HabitatActions, 5, 0); + HabitatBottomPanel.Controls.Add(CHK_HabitatTutorialViewed, 0, 0); + HabitatBottomPanel.Controls.Add(CHK_HabitatTutorialCompleteCapture, 1, 0); + HabitatBottomPanel.Controls.Add(L_Unknown90, 0, 1); + HabitatBottomPanel.Controls.Add(NUD_Unknown90, 1, 1); + HabitatBottomPanel.Controls.Add(L_Unknown92, 2, 1); + HabitatBottomPanel.Controls.Add(NUD_Unknown92, 3, 1); + HabitatBottomPanel.Controls.Add(L_LastEncounterType, 0, 2); + HabitatBottomPanel.Controls.Add(CB_LastEncounterType, 1, 2); + HabitatBottomPanel.Dock = System.Windows.Forms.DockStyle.Bottom; + HabitatBottomPanel.Location = new System.Drawing.Point(3, 384); + HabitatBottomPanel.Name = "HabitatBottomPanel"; + HabitatBottomPanel.Padding = new System.Windows.Forms.Padding(8); + HabitatBottomPanel.RowCount = 3; + HabitatBottomPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + HabitatBottomPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + HabitatBottomPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + HabitatBottomPanel.Size = new System.Drawing.Size(970, 105); + HabitatBottomPanel.TabIndex = 1; + // + // FLP_HabitatActions + // + FLP_HabitatActions.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + FLP_HabitatActions.AutoSize = true; + FLP_HabitatActions.Controls.Add(B_HabitatClear); + FLP_HabitatActions.Controls.Add(B_HabitatSetComplete); + FLP_HabitatActions.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft; + FLP_HabitatActions.Location = new System.Drawing.Point(810, 8); + FLP_HabitatActions.Margin = new System.Windows.Forms.Padding(0); + FLP_HabitatActions.Name = "FLP_HabitatActions"; + HabitatBottomPanel.SetRowSpan(FLP_HabitatActions, 3); + FLP_HabitatActions.Size = new System.Drawing.Size(152, 27); + FLP_HabitatActions.TabIndex = 8; + FLP_HabitatActions.WrapContents = false; + // + // B_HabitatClear + // + B_HabitatClear.AutoSize = true; + B_HabitatClear.Location = new System.Drawing.Point(104, 0); + B_HabitatClear.Margin = new System.Windows.Forms.Padding(0); + B_HabitatClear.Name = "B_HabitatClear"; + B_HabitatClear.Size = new System.Drawing.Size(48, 27); + B_HabitatClear.TabIndex = 0; + B_HabitatClear.Text = "Clear"; + B_HabitatClear.UseVisualStyleBackColor = true; + B_HabitatClear.Click += B_HabitatClear_Click; + // + // B_HabitatSetComplete + // + B_HabitatSetComplete.AutoSize = true; + B_HabitatSetComplete.Location = new System.Drawing.Point(0, 0); + B_HabitatSetComplete.Margin = new System.Windows.Forms.Padding(0, 0, 8, 0); + B_HabitatSetComplete.Name = "B_HabitatSetComplete"; + B_HabitatSetComplete.Size = new System.Drawing.Size(96, 27); + B_HabitatSetComplete.TabIndex = 1; + B_HabitatSetComplete.Text = "Set Complete"; + B_HabitatSetComplete.UseVisualStyleBackColor = true; + B_HabitatSetComplete.Click += B_HabitatSetComplete_Click; + // + // CHK_HabitatTutorialViewed + // + CHK_HabitatTutorialViewed.Anchor = System.Windows.Forms.AnchorStyles.Left; + CHK_HabitatTutorialViewed.AutoSize = true; + CHK_HabitatTutorialViewed.Location = new System.Drawing.Point(11, 11); + CHK_HabitatTutorialViewed.Name = "CHK_HabitatTutorialViewed"; + CHK_HabitatTutorialViewed.Size = new System.Drawing.Size(117, 21); + CHK_HabitatTutorialViewed.TabIndex = 0; + CHK_HabitatTutorialViewed.Text = "Tutorial Viewed"; + CHK_HabitatTutorialViewed.UseVisualStyleBackColor = true; + // + // CHK_HabitatTutorialCompleteCapture + // + CHK_HabitatTutorialCompleteCapture.Anchor = System.Windows.Forms.AnchorStyles.Left; + CHK_HabitatTutorialCompleteCapture.AutoSize = true; + HabitatBottomPanel.SetColumnSpan(CHK_HabitatTutorialCompleteCapture, 2); + CHK_HabitatTutorialCompleteCapture.Location = new System.Drawing.Point(144, 11); + CHK_HabitatTutorialCompleteCapture.Name = "CHK_HabitatTutorialCompleteCapture"; + CHK_HabitatTutorialCompleteCapture.Size = new System.Drawing.Size(156, 21); + CHK_HabitatTutorialCompleteCapture.TabIndex = 1; + CHK_HabitatTutorialCompleteCapture.Text = "Tutorial Capture Done"; + CHK_HabitatTutorialCompleteCapture.UseVisualStyleBackColor = true; + // + // L_Unknown90 + // + L_Unknown90.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Unknown90.AutoSize = true; + L_Unknown90.Location = new System.Drawing.Point(60, 42); + L_Unknown90.Name = "L_Unknown90"; + L_Unknown90.Size = new System.Drawing.Size(78, 17); + L_Unknown90.TabIndex = 2; + L_Unknown90.Text = "Unknown90:"; + // + // NUD_Unknown90 + // + NUD_Unknown90.Location = new System.Drawing.Point(144, 38); + NUD_Unknown90.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_Unknown90.Name = "NUD_Unknown90"; + NUD_Unknown90.Size = new System.Drawing.Size(64, 25); + NUD_Unknown90.TabIndex = 3; + // + // L_Unknown92 + // + L_Unknown92.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Unknown92.AutoSize = true; + L_Unknown92.Location = new System.Drawing.Point(246, 42); + L_Unknown92.Name = "L_Unknown92"; + L_Unknown92.Size = new System.Drawing.Size(78, 17); + L_Unknown92.TabIndex = 4; + L_Unknown92.Text = "Unknown92:"; + // + // NUD_Unknown92 + // + NUD_Unknown92.Location = new System.Drawing.Point(330, 38); + NUD_Unknown92.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_Unknown92.Name = "NUD_Unknown92"; + NUD_Unknown92.Size = new System.Drawing.Size(48, 25); + NUD_Unknown92.TabIndex = 5; + // + // L_LastEncounterType + // + L_LastEncounterType.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_LastEncounterType.AutoSize = true; + L_LastEncounterType.Location = new System.Drawing.Point(11, 73); + L_LastEncounterType.Name = "L_LastEncounterType"; + L_LastEncounterType.Size = new System.Drawing.Size(127, 17); + L_LastEncounterType.TabIndex = 6; + L_LastEncounterType.Text = "Last Encounter Type:"; + // + // CB_LastEncounterType + // + CB_LastEncounterType.Anchor = System.Windows.Forms.AnchorStyles.Left; + HabitatBottomPanel.SetColumnSpan(CB_LastEncounterType, 2); + CB_LastEncounterType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_LastEncounterType.FormattingEnabled = true; + CB_LastEncounterType.Location = new System.Drawing.Point(144, 69); + CB_LastEncounterType.Name = "CB_LastEncounterType"; + CB_LastEncounterType.Size = new System.Drawing.Size(180, 25); + CB_LastEncounterType.TabIndex = 7; + // + // ButtonPanel + // + ButtonPanel.AutoSize = true; + ButtonPanel.Controls.Add(B_Save); + ButtonPanel.Controls.Add(B_Cancel); + ButtonPanel.Dock = System.Windows.Forms.DockStyle.Bottom; + ButtonPanel.Location = new System.Drawing.Point(0, 522); + ButtonPanel.Name = "ButtonPanel"; + ButtonPanel.Padding = new System.Windows.Forms.Padding(8); + ButtonPanel.RightToLeft = System.Windows.Forms.RightToLeft.Yes; + ButtonPanel.Size = new System.Drawing.Size(984, 49); + ButtonPanel.TabIndex = 1; + ButtonPanel.WrapContents = false; + // + // B_Save + // + B_Save.AutoSize = true; + B_Save.Location = new System.Drawing.Point(913, 11); + B_Save.Name = "B_Save"; + B_Save.Size = new System.Drawing.Size(52, 27); + B_Save.TabIndex = 0; + B_Save.Text = "Save"; + B_Save.UseVisualStyleBackColor = true; + B_Save.Click += B_Save_Click; + // + // B_Cancel + // + B_Cancel.AutoSize = true; + B_Cancel.Location = new System.Drawing.Point(844, 11); + B_Cancel.Name = "B_Cancel"; + B_Cancel.Size = new System.Drawing.Size(63, 27); + B_Cancel.TabIndex = 1; + B_Cancel.Text = "Cancel"; + B_Cancel.UseVisualStyleBackColor = true; + B_Cancel.Click += B_Cancel_Click; + // + // SAV_Medals5 + // + AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + ClientSize = new System.Drawing.Size(984, 571); + Controls.Add(TC_Main); + Controls.Add(ButtonPanel); + Icon = Properties.Resources.Icon; + MaximizeBox = false; + MinimumSize = new System.Drawing.Size(760, 420); + Name = "SAV_Medals5"; + StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + Text = "Medals"; + TC_Main.ResumeLayout(false); + Tab_Medals.ResumeLayout(false); + Tab_Medals.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)DGV_Medals).EndInit(); + MedalSettingsPanel.ResumeLayout(false); + MedalSettingsPanel.PerformLayout(); + MedalButtonPanel.ResumeLayout(false); + MedalButtonPanel.PerformLayout(); + Tab_Habitat.ResumeLayout(false); + Tab_Habitat.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)DGV_Habitat).EndInit(); + HabitatBottomPanel.ResumeLayout(false); + HabitatBottomPanel.PerformLayout(); + FLP_HabitatActions.ResumeLayout(false); + FLP_HabitatActions.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown90).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Unknown92).EndInit(); + ButtonPanel.ResumeLayout(false); + ButtonPanel.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private System.Windows.Forms.TabControl TC_Main; + private System.Windows.Forms.TabPage Tab_Medals; + private PKHeX.WinForms.Controls.DoubleBufferedDataGridView DGV_Medals; + private System.Windows.Forms.FlowLayoutPanel MedalButtonPanel; + private System.Windows.Forms.Button B_ExportAll; + private System.Windows.Forms.Button B_ImportAll; + private System.Windows.Forms.Button B_GiveAll; + private System.Windows.Forms.TableLayoutPanel MedalSettingsPanel; + private System.Windows.Forms.Label L_PinnedMedal; + private System.Windows.Forms.ComboBox CB_PinnedMedal; + private System.Windows.Forms.Label L_Rank; + private System.Windows.Forms.ComboBox CB_Rank; + private System.Windows.Forms.CheckBox CHK_TutorialComplete; + private System.Windows.Forms.TabPage Tab_Habitat; + private PKHeX.WinForms.Controls.DoubleBufferedDataGridView DGV_Habitat; + private System.Windows.Forms.TableLayoutPanel HabitatBottomPanel; + private System.Windows.Forms.FlowLayoutPanel FLP_HabitatActions; + private System.Windows.Forms.Button B_HabitatClear; + private System.Windows.Forms.Button B_HabitatSetComplete; + private System.Windows.Forms.CheckBox CHK_HabitatTutorialViewed; + private System.Windows.Forms.CheckBox CHK_HabitatTutorialCompleteCapture; + private System.Windows.Forms.Label L_Unknown90; + private System.Windows.Forms.NumericUpDown NUD_Unknown90; + private System.Windows.Forms.Label L_Unknown92; + private System.Windows.Forms.NumericUpDown NUD_Unknown92; + private System.Windows.Forms.Label L_LastEncounterType; + private System.Windows.Forms.ComboBox CB_LastEncounterType; + private System.Windows.Forms.FlowLayoutPanel ButtonPanel; + private System.Windows.Forms.Button B_Save; + private System.Windows.Forms.Button B_Cancel; + private System.Windows.Forms.DataGridViewTextBoxColumn MedalIndexColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn MedalNameColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn MedalTypeColumn; + private System.Windows.Forms.DataGridViewComboBoxColumn MedalStateColumn; + private System.Windows.Forms.DataGridViewCheckBoxColumn MedalUnreadColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn MedalDateColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn HabitatIndexColumn; + private System.Windows.Forms.DataGridViewCheckBoxColumn HabitatCompleteColumn; + private System.Windows.Forms.DataGridViewComboBoxColumn HabitatGrassColumn; + private System.Windows.Forms.DataGridViewComboBoxColumn HabitatSurfColumn; + private System.Windows.Forms.DataGridViewComboBoxColumn HabitatFishColumn; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Medals5.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Medals5.cs new file mode 100644 index 000000000..62ecd8913 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Medals5.cs @@ -0,0 +1,472 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms; + +public sealed partial class SAV_Medals5 : Form +{ + private const string MedalListFilter = "Medal List 5|*.ml5"; + private const string DateFormat = "yyyy-MM-dd"; + + private readonly SAV5B2W2 Origin; + private readonly SAV5B2W2 SAV; + private readonly MedalList5 Medals; + private readonly HabitatList5 Habitat; + + private readonly string[] MedalNames = Util.GetStringList("medals", Main.CurrentLanguage); + private readonly string[] MedalTypeNames = Util.GetStringList("medal_types", Main.CurrentLanguage); + private readonly string[] MedalStateNames = WinFormsTranslator.GetEnumTranslation(Main.CurrentLanguage); + private readonly string[] MedalRankNames = WinFormsTranslator.GetEnumTranslation(Main.CurrentLanguage); + private readonly string[] HabitatCompletionNames = WinFormsTranslator.GetEnumTranslation(Main.CurrentLanguage); + private readonly string[] HabitatEncounterTypeNames = WinFormsTranslator.GetEnumTranslation(Main.CurrentLanguage); + + private static readonly DateOnly MinimumDate = new(2000, 1, 1); + private static readonly DateOnly MaximumDate = new(2099, 12, 31); + + public SAV_Medals5(SAV5B2W2 sav) + { + InitializeComponent(); + WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); + + Origin = sav; + SAV = (SAV5B2W2)sav.Clone(); + Medals = SAV.Medals; + Habitat = Medals.HabitatList; + + InitializeMedalGrid(); + InitializeHabitatGrid(); + LoadData(); + } + + private void B_Save_Click(object sender, EventArgs e) + { + CommitPendingGridEdits(); + if (!ValidateChildren()) + return; + + Medals.PinnedMedal = (byte)WinFormsUtil.GetIndex(CB_PinnedMedal); + Medals.Rank = (MedalRank5)WinFormsUtil.GetIndex(CB_Rank); + Medals.IsTutorialComplete = CHK_TutorialComplete.Checked; + + SaveHabitatSettings(); + Origin.CopyChangesFrom(SAV); + Close(); + } + + private void B_Cancel_Click(object sender, EventArgs e) => Close(); + + private void B_GiveAll_Click(object sender, EventArgs e) + { + var now = EncounterDate.GetDateNDS(); + Medals.GiveAll(now, unread: true); + LoadMedalData(); + WinFormsUtil.Asterisk(); + } + + private void B_ImportAll_Click(object sender, EventArgs e) + { + using var ofd = new OpenFileDialog(); + ofd.Filter = MedalListFilter; + ofd.FileName = GetDefaultFileName(); + if (ofd.ShowDialog() != DialogResult.OK) + return; + + var fi = new FileInfo(ofd.FileName); + if (fi.Length != MedalList5.LengthAllMedals) + { + WinFormsUtil.Alert(string.Format(MessageStrings.MsgFileSizeIncorrect, fi.Length, MedalList5.LengthAllMedals)); + return; + } + + var data = File.ReadAllBytes(ofd.FileName); + data.AsSpan().CopyTo(Medals.AllMedals); + LoadMedalData(); + WinFormsUtil.Asterisk(); + } + + private void B_ExportAll_Click(object sender, EventArgs e) + { + using var sfd = new SaveFileDialog(); + sfd.Filter = MedalListFilter; + sfd.FileName = GetDefaultFileName(); + if (sfd.ShowDialog() != DialogResult.OK) + return; + + File.WriteAllBytes(sfd.FileName, Medals.AllMedals.ToArray()); + } + + private void B_HabitatSetComplete_Click(object sender, EventArgs e) + { + if (DGV_Habitat.SelectedRows.Count == 0) + { + Habitat.CompleteAll(); + } + else + { + foreach (var row in GetSelectedHabitatRows()) + Habitat.GetHabitat(row.Index).SetComplete(); + } + + LoadHabitatData(); + WinFormsUtil.Asterisk(); + } + + private void B_HabitatClear_Click(object sender, EventArgs e) + { + foreach (var row in GetSelectedHabitatRows()) + Habitat.GetHabitat(row.Index).Clear(); + + LoadHabitatData(); + WinFormsUtil.Asterisk(); + } + + private void L_Rank_Click(object? sender, EventArgs e) + { + CommitPendingGridEdits(); + CB_Rank.SelectedValue = (int)Medals.CalculateRank(); + WinFormsUtil.Asterisk(); + } + + private void DGV_Medals_CellBeginEdit(object? sender, DataGridViewCellCancelEventArgs e) + { + if (e.RowIndex < 0 || e.ColumnIndex != MedalDateColumn.Index) + return; + + if (!CanEditMedalDate(e.RowIndex)) + e.Cancel = true; + } + + private void DGV_Medals_CellParsing(object? sender, DataGridViewCellParsingEventArgs e) + { + if (e.RowIndex < 0 || e.ColumnIndex != MedalDateColumn.Index) + return; + + if (e.Value is not string text) + return; + + if (!TryParseDate(text, out var date)) + return; + + e.Value = date.ToString(DateFormat, CultureInfo.InvariantCulture); + e.ParsingApplied = true; + } + + private void DGV_Medals_CellValidating(object? sender, DataGridViewCellValidatingEventArgs e) + { + if (e.RowIndex < 0) + return; + + if (e.ColumnIndex == MedalDateColumn.Index) + { + if (!CanEditMedalDate(e.RowIndex)) + return; + + if (e.FormattedValue is not string text || !TryParseDate(text, out _)) + { + DGV_Medals.Rows[e.RowIndex].ErrorText = $"Date must be between {MinimumDate:yyyy-MM-dd} and {MaximumDate:yyyy-MM-dd}."; + e.Cancel = true; + } + else + { + DGV_Medals.Rows[e.RowIndex].ErrorText = string.Empty; + } + + return; + } + + DGV_Medals.Rows[e.RowIndex].ErrorText = string.Empty; + } + + private void DGV_Medals_CurrentCellDirtyStateChanged(object? sender, EventArgs e) + { + if (DGV_Medals.IsCurrentCellDirty) + DGV_Medals.CommitEdit(DataGridViewDataErrorContexts.Commit); + } + + private void DGV_Medals_DataError(object? sender, DataGridViewDataErrorEventArgs e) + { + e.Cancel = false; + e.ThrowException = false; + } + + private void DGV_Medals_EditingControlShowing(object? sender, DataGridViewEditingControlShowingEventArgs e) + { + if (e.Control is ComboBox combo && DGV_Medals.CurrentCell?.OwningColumn is DataGridViewComboBoxColumn) + { + DGV_Medals.BeginInvoke((MethodInvoker)(() => combo.DroppedDown = true)); + return; + } + + if (DGV_Medals.CurrentCell?.ColumnIndex != MedalDateColumn.Index) + return; + + if (e.Control is TextBox tb) + tb.SelectAll(); + } + + private void DGV_Habitat_CurrentCellDirtyStateChanged(object? sender, EventArgs e) + { + if (DGV_Habitat.IsCurrentCellDirty) + DGV_Habitat.CommitEdit(DataGridViewDataErrorContexts.Commit); + } + + private void DGV_Habitat_DataError(object? sender, DataGridViewDataErrorEventArgs e) + { + e.Cancel = false; + e.ThrowException = false; + } + + private void DGV_Habitat_EditingControlShowing(object? sender, DataGridViewEditingControlShowingEventArgs e) + { + if (e.Control is ComboBox combo && DGV_Habitat.CurrentCell?.OwningColumn is DataGridViewComboBoxColumn) + DGV_Habitat.BeginInvoke((MethodInvoker)(() => combo.DroppedDown = true)); + } + + private void InitializeMedalGrid() + { + MedalStateColumn.Items.AddRange(MedalStateNames); + + var medalItems = MedalNames.Select((z, i) => new ComboItem(z, i)).ToList(); + medalItems.Insert(0, new ComboItem(GameInfo.Strings.specieslist[0], MedalList5.PinnedMedalNone)); + CB_PinnedMedal.InitializeBinding(); + CB_PinnedMedal.DataSource = new BindingSource(medalItems, string.Empty); + + var rankValues = Enum.GetValues(); + var rankItems = new ComboItem[rankValues.Length]; + for (int i = 0; i < rankItems.Length; i++) + rankItems[i] = new ComboItem(MedalRankNames[i], (int)rankValues[i]); + CB_Rank.InitializeBinding(); + CB_Rank.DataSource = new BindingSource(rankItems, string.Empty); + } + + private void InitializeHabitatGrid() + { + HabitatGrassColumn.Items.AddRange(HabitatCompletionNames); + HabitatSurfColumn.Items.AddRange(HabitatCompletionNames); + HabitatFishColumn.Items.AddRange(HabitatCompletionNames); + + CB_LastEncounterType.Items.AddRange(HabitatEncounterTypeNames); + } + + private void LoadData() + { + LoadMedalData(); + LoadHabitatData(); + LoadHabitatSettings(); + } + + private void LoadMedalData() + { + DGV_Medals.Rows.Clear(); + DGV_Medals.Rows.Add(MedalNames.Length); + for (int i = 0; i < MedalNames.Length; i++) + LoadMedalRow(i); + + CB_PinnedMedal.SelectedValue = (int)Medals.PinnedMedal; + CB_Rank.SelectedValue = (int)Medals.Rank; + CHK_TutorialComplete.Checked = Medals.IsTutorialComplete; + } + + private void LoadMedalRow(int index) + { + var medal = Medals[index]; + var row = DGV_Medals.Rows[index]; + var cells = row.Cells; + cells[MedalIndexColumn.Index].Value = index; + cells[MedalNameColumn.Index].Value = MedalNames[index]; + cells[MedalTypeColumn.Index].Value = MedalTypeNames[(int)MedalList5.GetMedalType(index)]; + cells[MedalStateColumn.Index].Value = MedalStateNames[(int)medal.State]; + cells[MedalUnreadColumn.Index].Value = medal.IsUnread; + cells[MedalDateColumn.Index].Value = GetDisplayedDate(medal); + row.ErrorText = string.Empty; + SetMedalDateCellState(row, medal.CanHaveDate); + } + + private void LoadHabitatData() + { + DGV_Habitat.Rows.Clear(); + DGV_Habitat.Rows.Add(HabitatList5.HabitatCount); + for (int i = 0; i < HabitatList5.HabitatCount; i++) + LoadHabitatRow(i); + } + + private void LoadHabitatRow(int index) + { + var habitat = Habitat.GetHabitat(index); + var row = DGV_Habitat.Rows[index]; + var cells = row.Cells; + cells[HabitatIndexColumn.Index].Value = index; + cells[HabitatCompleteColumn.Index].Value = habitat.IsComplete; + cells[HabitatGrassColumn.Index].Value = HabitatCompletionNames[(int)habitat.GetStatus(HabitatEncounterType5.Grass)]; + cells[HabitatSurfColumn.Index].Value = HabitatCompletionNames[(int)habitat.GetStatus(HabitatEncounterType5.Surf)]; + cells[HabitatFishColumn.Index].Value = HabitatCompletionNames[(int)habitat.GetStatus(HabitatEncounterType5.Fish)]; + row.ErrorText = string.Empty; + } + + private void LoadHabitatSettings() + { + CHK_HabitatTutorialViewed.Checked = Habitat.IsTutorialViewed; + CHK_HabitatTutorialCompleteCapture.Checked = Habitat.IsTutorialCompleteCapture; + NUD_Unknown90.Value = Habitat.Unknown90; + NUD_Unknown92.Value = Habitat.Unknown92; + CB_LastEncounterType.SelectedIndex = (int)Habitat.LastEncounterType; + } + + private void SaveHabitatSettings() + { + Habitat.IsTutorialViewed = CHK_HabitatTutorialViewed.Checked; + Habitat.IsTutorialCompleteCapture = CHK_HabitatTutorialCompleteCapture.Checked; + Habitat.Unknown90 = (ushort)NUD_Unknown90.Value; + Habitat.Unknown92 = (byte)NUD_Unknown92.Value; + if (CB_LastEncounterType.SelectedIndex >= 0) + Habitat.LastEncounterType = (HabitatEncounterType5)CB_LastEncounterType.SelectedIndex; + } + + private void SetMedalDateCellState(DataGridViewRow row, bool enabled) + { + var cell = row.Cells[MedalDateColumn.Index]; + cell.ReadOnly = !enabled; + cell.Style.BackColor = enabled ? DGV_Medals.DefaultCellStyle.BackColor : SystemColors.Control; + cell.Style.ForeColor = enabled ? DGV_Medals.DefaultCellStyle.ForeColor : SystemColors.GrayText; + cell.Style.SelectionBackColor = enabled ? DGV_Medals.DefaultCellStyle.SelectionBackColor : SystemColors.Control; + cell.Style.SelectionForeColor = enabled ? DGV_Medals.DefaultCellStyle.SelectionForeColor : SystemColors.GrayText; + } + + private bool CanEditMedalDate(int rowIndex) + { + var medal = Medals[rowIndex]; + return medal.CanHaveDate; + } + + private static string GetDisplayedDate(Medal5 medal) => medal is { CanHaveDate: true, HasDate: true } + ? medal.Date.ToString(DateFormat, CultureInfo.InvariantCulture) + : string.Empty; + + private static bool TryParseDate(string text, out DateOnly date) + { + text = text.Trim(); + if (string.IsNullOrWhiteSpace(text)) + { + date = default; + return false; + } + + if (!DateOnly.TryParse(text, CultureInfo.CurrentCulture, DateTimeStyles.None, out date) && + !DateOnly.TryParseExact(text, DateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) + { + return false; + } + + return EncounterDate.IsValidDateNDS(date); + } + + private string GetDefaultFileName() => PathUtil.CleanFileName($"{SAV.OT} {SAV.Version}.ml5"); + + private void CommitPendingGridEdits() + { + if (DGV_Medals.IsCurrentCellDirty) + DGV_Medals.CommitEdit(DataGridViewDataErrorContexts.Commit); + if (DGV_Habitat.IsCurrentCellDirty) + DGV_Habitat.CommitEdit(DataGridViewDataErrorContexts.Commit); + DGV_Medals.EndEdit(); + DGV_Habitat.EndEdit(); + } + + private void DGV_Medals_CellValueChanged(object? sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex < 0) + return; + + var medal = Medals[e.RowIndex]; + var row = DGV_Medals.Rows[e.RowIndex]; + if (e.ColumnIndex == MedalStateColumn.Index) + { + if (row.Cells[MedalStateColumn.Index].Value is string state) + { + int index = Array.IndexOf(MedalStateNames, state); + if (index >= 0) + medal.State = (MedalState5)index; + } + + if (medal is { CanHaveDate: true, HasDate: false }) + medal.Date = EncounterDate.GetDateNDS(); + + LoadMedalRow(e.RowIndex); + return; + } + + if (e.ColumnIndex == MedalUnreadColumn.Index) + { + medal.IsUnread = row.Cells[MedalUnreadColumn.Index].Value is true; + return; + } + + if (e.ColumnIndex == MedalDateColumn.Index) + { + var value = row.Cells[MedalDateColumn.Index].Value?.ToString(); + if (value is null || !TryParseDate(value, out var date)) + return; + + medal.Date = date; + row.Cells[MedalDateColumn.Index].Value = date.ToString(DateFormat, CultureInfo.InvariantCulture); + row.ErrorText = string.Empty; + } + } + + private void DGV_Habitat_CellValueChanged(object? sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex < 0) + return; + + var row = DGV_Habitat.Rows[e.RowIndex]; + var habitat = Habitat.GetHabitat(e.RowIndex); + + if (e.ColumnIndex == HabitatCompleteColumn.Index) + { + habitat.IsComplete = row.Cells[HabitatCompleteColumn.Index].Value is true; + return; + } + + if (e.ColumnIndex == HabitatGrassColumn.Index) + { + TrySetHabitatCompletion(row.Cells[HabitatGrassColumn.Index].Value, value => habitat.SetStatus(HabitatEncounterType5.Grass, value)); + return; + } + + if (e.ColumnIndex == HabitatSurfColumn.Index) + { + TrySetHabitatCompletion(row.Cells[HabitatSurfColumn.Index].Value, value => habitat.SetStatus(HabitatEncounterType5.Surf, value)); + return; + } + + if (e.ColumnIndex == HabitatFishColumn.Index) + TrySetHabitatCompletion(row.Cells[HabitatFishColumn.Index].Value, value => habitat.SetStatus(HabitatEncounterType5.Fish, value)); + } + + private void TrySetHabitatCompletion(object? cellValue, Action setter) + { + if (cellValue is not string text) + return; + + int index = Array.IndexOf(HabitatCompletionNames, text); + if (index >= 0) + setter((HabitatCompletion5)index); + } + + private IEnumerable GetSelectedHabitatRows() + { + if (DGV_Habitat.SelectedRows.Count != 0) + return DGV_Habitat.SelectedRows.Cast().OrderBy(z => z.Index); + + return DGV_Habitat.SelectedCells.Cast() + .Select(z => z.OwningRow).OfType() + .Distinct() + .OrderBy(z => z.Index); + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.Designer.cs index af003c21f..c19702e9b 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.Designer.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.Designer.cs @@ -181,13 +181,6 @@ private void InitializeComponent() L_FC = new System.Windows.Forms.Label(); B_ImportFC = new System.Windows.Forms.Button(); B_DumpFC = new System.Windows.Forms.Button(); - TAB_Medals = new System.Windows.Forms.TabPage(); - TB_MedalType = new System.Windows.Forms.TextBox(); - B_ObtainAllMedals = new System.Windows.Forms.Button(); - CAL_MedalDate = new System.Windows.Forms.DateTimePicker(); - CHK_MedalUnread = new System.Windows.Forms.CheckBox(); - CB_MedalState = new System.Windows.Forms.ComboBox(); - CB_CurrentMedal = new System.Windows.Forms.ComboBox(); TAB_Muscial = new System.Windows.Forms.TabPage(); B_UnlockAllProps = new System.Windows.Forms.Button(); CHK_PropObtained = new System.Windows.Forms.CheckBox(); @@ -252,7 +245,6 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)NUD_SingleRecord).BeginInit(); ((System.ComponentModel.ISupportInitialize)NUD_SinglePast).BeginInit(); TAB_BWCityForest.SuspendLayout(); - TAB_Medals.SuspendLayout(); TAB_Muscial.SuspendLayout(); SuspendLayout(); // @@ -288,7 +280,6 @@ private void InitializeComponent() TC_Misc.Controls.Add(TAB_Forest); TC_Misc.Controls.Add(TAB_Subway); TC_Misc.Controls.Add(TAB_BWCityForest); - TC_Misc.Controls.Add(TAB_Medals); TC_Misc.Controls.Add(TAB_Muscial); TC_Misc.Location = new System.Drawing.Point(14, 17); TC_Misc.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); @@ -2061,77 +2052,6 @@ private void InitializeComponent() B_DumpFC.UseVisualStyleBackColor = true; B_DumpFC.Click += B_DumpFC_Click; // - // TAB_Medals - // - TAB_Medals.Controls.Add(TB_MedalType); - TAB_Medals.Controls.Add(B_ObtainAllMedals); - TAB_Medals.Controls.Add(CAL_MedalDate); - TAB_Medals.Controls.Add(CHK_MedalUnread); - TAB_Medals.Controls.Add(CB_MedalState); - TAB_Medals.Controls.Add(CB_CurrentMedal); - TAB_Medals.Location = new System.Drawing.Point(4, 24); - TAB_Medals.Name = "TAB_Medals"; - TAB_Medals.Size = new System.Drawing.Size(390, 338); - TAB_Medals.TabIndex = 5; - TAB_Medals.Text = "Medals"; - TAB_Medals.UseVisualStyleBackColor = true; - // - // TB_MedalType - // - TB_MedalType.Location = new System.Drawing.Point(212, 103); - TB_MedalType.Name = "TB_MedalType"; - TB_MedalType.ReadOnly = true; - TB_MedalType.Size = new System.Drawing.Size(175, 23); - TB_MedalType.TabIndex = 4; - TB_MedalType.TabStop = false; - // - // B_ObtainAllMedals - // - B_ObtainAllMedals.Location = new System.Drawing.Point(3, 264); - B_ObtainAllMedals.Name = "B_ObtainAllMedals"; - B_ObtainAllMedals.Size = new System.Drawing.Size(117, 71); - B_ObtainAllMedals.TabIndex = 5; - B_ObtainAllMedals.Text = "Obtain All Medals"; - B_ObtainAllMedals.UseVisualStyleBackColor = true; - B_ObtainAllMedals.Click += B_ObtainAllMedals_Click; - // - // CAL_MedalDate - // - CAL_MedalDate.Location = new System.Drawing.Point(3, 74); - CAL_MedalDate.Name = "CAL_MedalDate"; - CAL_MedalDate.Size = new System.Drawing.Size(384, 23); - CAL_MedalDate.TabIndex = 2; - CAL_MedalDate.ValueChanged += CAL_MedalDate_ValueChanged; - // - // CHK_MedalUnread - // - CHK_MedalUnread.AutoSize = true; - CHK_MedalUnread.Location = new System.Drawing.Point(3, 103); - CHK_MedalUnread.Name = "CHK_MedalUnread"; - CHK_MedalUnread.Size = new System.Drawing.Size(64, 19); - CHK_MedalUnread.TabIndex = 3; - CHK_MedalUnread.Text = "Unread"; - CHK_MedalUnread.UseVisualStyleBackColor = true; - CHK_MedalUnread.CheckedChanged += CHK_MedalUnread_CheckedChanged; - // - // CB_MedalState - // - CB_MedalState.FormattingEnabled = true; - CB_MedalState.Location = new System.Drawing.Point(3, 45); - CB_MedalState.Name = "CB_MedalState"; - CB_MedalState.Size = new System.Drawing.Size(384, 23); - CB_MedalState.TabIndex = 1; - CB_MedalState.SelectedIndexChanged += CB_MedalState_SelectedIndexChanged; - // - // CB_CurrentMedal - // - CB_CurrentMedal.FormattingEnabled = true; - CB_CurrentMedal.Location = new System.Drawing.Point(3, 16); - CB_CurrentMedal.Name = "CB_CurrentMedal"; - CB_CurrentMedal.Size = new System.Drawing.Size(384, 23); - CB_CurrentMedal.TabIndex = 0; - CB_CurrentMedal.SelectedIndexChanged += CB_CurrentMedal_SelectedIndexChanged; - // // TAB_Muscial // TAB_Muscial.Controls.Add(B_UnlockAllProps); @@ -2251,8 +2171,6 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)NUD_SingleRecord).EndInit(); ((System.ComponentModel.ISupportInitialize)NUD_SinglePast).EndInit(); TAB_BWCityForest.ResumeLayout(false); - TAB_Medals.ResumeLayout(false); - TAB_Medals.PerformLayout(); TAB_Muscial.ResumeLayout(false); TAB_Muscial.PerformLayout(); ResumeLayout(false); @@ -2406,12 +2324,6 @@ private void InitializeComponent() private System.Windows.Forms.Label L_FC; private System.Windows.Forms.Button B_ImportFC; private System.Windows.Forms.Button B_DumpFC; - private System.Windows.Forms.TabPage TAB_Medals; - private System.Windows.Forms.ComboBox CB_CurrentMedal; - private System.Windows.Forms.ComboBox CB_MedalState; - private System.Windows.Forms.DateTimePicker CAL_MedalDate; - private System.Windows.Forms.CheckBox CHK_MedalUnread; - private System.Windows.Forms.Button B_ObtainAllMedals; private System.Windows.Forms.TabPage TAB_Muscial; private System.Windows.Forms.ComboBox CB_Prop; private System.Windows.Forms.CheckBox CHK_PropObtained; @@ -2424,6 +2336,5 @@ private void InitializeComponent() private System.Windows.Forms.NumericUpDown NUD_Record32; private System.Windows.Forms.NumericUpDown NUD_Record16V; private System.Windows.Forms.NumericUpDown NUD_Record16; - private System.Windows.Forms.TextBox TB_MedalType; } } diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.cs index 0c060b170..41230cc6b 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.cs @@ -34,7 +34,6 @@ public SAV_Misc5(SAV5 sav) LoadForest(); ReadSubway(); ReadEntralink(); - ReadMedals(); ReadMusical(); ReadRecord(); } @@ -126,7 +125,6 @@ private void ReadMain() if (SAV is SAV5BW bw) { - TC_Misc.TabPages.Remove(TAB_Medals); GB_KeySystem.Visible = false; // Roamer cbr = [CB_Roamer642, CB_Roamer641]; @@ -850,91 +848,6 @@ private void B_ImportFC_Click(object sender, EventArgs e) bw.SetData(bw.Forest.ForestCity.Span, data); } - private readonly string[] MedalNames = Util.GetStringList("medals", Main.CurrentLanguage); - private readonly string[] MedalTypeNames = Util.GetStringList("medal_types", Main.CurrentLanguage); - - private void ReadMedals() - { - if (SAV is SAV5B2W2) - { - CB_CurrentMedal.Items.AddRange(MedalNames); - CB_MedalState.Items.AddRange("Unobtained", "Can Obtain Hint Medal", "Hint Medal Obtained", "Can Obtain Medal", "Medal Obtained"); - CB_CurrentMedal.SelectedIndex = 0; - } - } - - private void CB_CurrentMedal_SelectedIndexChanged(object sender, EventArgs e) - { - if (SAV is SAV5B2W2 b2w2) - { - var index = CB_CurrentMedal.SelectedIndex; - var medal = b2w2.Medals[index]; - var type = MedalList5.GetMedalType(index); - TB_MedalType.Text = MedalTypeNames[(int)type]; - CB_MedalState.SelectedIndex = (int)medal.State; - if (medal.CanHaveDate) - { - CAL_MedalDate.Value = medal.Date.ToDateTime(new TimeOnly()); - CAL_MedalDate.Enabled = true; - } - else - { - CAL_MedalDate.Enabled = false; - CAL_MedalDate.ValueChanged -= CAL_MedalDate_ValueChanged; - CAL_MedalDate.Value = EncounterDate.GetDateNDS().ToDateTime(new TimeOnly()); - CAL_MedalDate.ValueChanged += CAL_MedalDate_ValueChanged; - } - CHK_MedalUnread.Checked = medal.IsUnread; - } - } - - private void CB_MedalState_SelectedIndexChanged(object sender, EventArgs e) - { - if (SAV is SAV5B2W2 b2w2) - { - var medal = b2w2.Medals[CB_CurrentMedal.SelectedIndex]; - medal.State = (Medal5State)CB_MedalState.SelectedIndex; - if (medal.CanHaveDate) - { - if (!medal.HasDate) - medal.Date = EncounterDate.GetDateNDS(); - CAL_MedalDate.Enabled = true; - } - else - { - CAL_MedalDate.Enabled = false; - } - } - } - - private void CAL_MedalDate_ValueChanged(object? sender, EventArgs e) - { - if (SAV is SAV5B2W2 b2w2) - { - var medal = b2w2.Medals[CB_CurrentMedal.SelectedIndex]; - medal.Date = DateOnly.FromDateTime(CAL_MedalDate.Value); - } - } - - private void CHK_MedalUnread_CheckedChanged(object sender, EventArgs e) - { - if (SAV is SAV5B2W2 b2w2) - { - var medal = b2w2.Medals[CB_CurrentMedal.SelectedIndex]; - medal.IsUnread = CHK_MedalUnread.Checked; - } - } - - private void B_ObtainAllMedals_Click(object sender, EventArgs e) - { - if (SAV is SAV5B2W2 b2w2) - { - var now = EncounterDate.GetDateNDS(); - b2w2.Medals.ObtainAll(now, unread: true); - WinFormsUtil.Asterisk(); - } - } - private readonly string[] PropNames = Util.GetStringList("props", Main.CurrentLanguage); private void ReadMusical() diff --git a/PKHeX.WinForms/Util/DevUtil.cs b/PKHeX.WinForms/Util/DevUtil.cs index c9b4dbd18..7dd7dc337 100644 --- a/PKHeX.WinForms/Util/DevUtil.cs +++ b/PKHeX.WinForms/Util/DevUtil.cs @@ -182,6 +182,8 @@ private static void UpdateTranslations() typeof(PassPower5), typeof(Funfest5Mission), typeof(JoinAvenueCeilingColor5), + typeof(MedalRank5), + typeof(HabitatCompletion5), typeof(BattleChateauRank6), typeof(OPower6Index), typeof(OPower6FieldType), @@ -249,6 +251,7 @@ private static IEnumerable GetExtraControls() $"{nameof(SAV_JoinAvenue)}.L_Unk", $"{nameof(SAV_JoinAvenue)}.L_IsFlag", $"{nameof(SAV_JoinAvenue)}.L_Unused", + $"{nameof(SAV_Medals5)}.L_Unknown", SlotList.DynamicLabelPrefix, $"{nameof(StorageSlotType)}.{nameof(StorageSlotType.None)}", From 62e9e637954f3f00a7aad785357cad8e5cfe988b Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 24 May 2026 00:15:45 -0500 Subject: [PATCH 42/81] pk2: fix test with impossible EVs (tyrogue evo) 25600 is the max from vitamins (was 0 EVs for every other stat) > Prior to Generation III, effort values were based on a system of stat experience and vitamins increased a stat by 2560 EV points, but could only be used until the stat had 25600 EVs. change it from 65535 (raw max) to 25600 (legal max). --- .../Gen2}/107 - HITMONCHAN - 26B0.pk2 | Bin .../Legal/Generation 2/0106 - HITMONLEE - EC97.pk2 | Bin 0 -> 73 bytes .../Generation 2/0107 - HITMONCHAN - C054.pk2 | Bin 0 -> 73 bytes .../Legal/Generation 2/106 - HITMONLEE - 6500.pk2 | Bin 73 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) rename Tests/PKHeX.Core.Tests/Legality/{Legal/Generation 2 => Illegal/Gen2}/107 - HITMONCHAN - 26B0.pk2 (100%) create mode 100644 Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/0106 - HITMONLEE - EC97.pk2 create mode 100644 Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/0107 - HITMONCHAN - C054.pk2 delete mode 100644 Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/106 - HITMONLEE - 6500.pk2 diff --git a/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/107 - HITMONCHAN - 26B0.pk2 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Gen2/107 - HITMONCHAN - 26B0.pk2 similarity index 100% rename from Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/107 - HITMONCHAN - 26B0.pk2 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Gen2/107 - HITMONCHAN - 26B0.pk2 diff --git a/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/0106 - HITMONLEE - EC97.pk2 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/0106 - HITMONLEE - EC97.pk2 new file mode 100644 index 0000000000000000000000000000000000000000..d3cd2701245b894bf5741ba7dd8bc87040490c81 GIT binary patch literal 73 zcmZR~`k%$1$iTqx|38Dg0|P?}kO>0+|Nj7y3|-11K-vNbof#AubQvTW%-j09n*+A2 S2>^ojj>$cJz1=M>0RaH8hZRcz literal 0 HcmV?d00001 diff --git a/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/0107 - HITMONCHAN - C054.pk2 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/0107 - HITMONCHAN - C054.pk2 new file mode 100644 index 0000000000000000000000000000000000000000..7aea7144dd41f2cf7a06f113be2a3e62fac57796 GIT binary patch literal 73 zcmZR~{-4dD$iTqx|38Dg1CVA&0TDp%4-m=Fr7QxZEr8IJ!H7YVL6X6|t*^T|V9S~S RAZYKH+|$?F)ZWk=006Lt6@UN$ literal 0 HcmV?d00001 diff --git a/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/106 - HITMONLEE - 6500.pk2 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/106 - HITMONLEE - 6500.pk2 deleted file mode 100644 index c47e917ddc07afc4ecfe097ecd201f665d7ddf86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73 zcmZR~`k%$1$iTqx|38Dg1DFDGK=cm~$ Date: Sun, 24 May 2026 01:21:01 -0400 Subject: [PATCH 43/81] Update DPPt Event Flags + Translations (#4810) * Update text_Games_ja.txt * Update const_dp_en.txt * Update const_dp_es-419.txt * Update const_dp_fr.txt * Update const_dp_ja.txt * Update const_dp_ko.txt * Update const_dp_zh-Hans.txt * Update const_dp_zh-Hant.txt * Update const_dp_es.txt * Update const_pt_en.txt * Update const_pt_es-419.txt * Update const_pt_es.txt * Update const_pt_fr.txt * Update const_pt_ja.txt * Update const_pt_ko.txt * Update const_pt_zh-Hans.txt * Update const_pt_zh-Hant.txt * Update flags_dp_en.txt * Update flags_dp_es.txt * Update flags_dp_es-419.txt * Update flags_dp_fr.txt * Update flags_dp_ja.txt * Update flags_dp_ko.txt * Update flags_dp_zh-Hans.txt * Update flags_dp_zh-Hant.txt * Update flags_pt_en.txt * Update flags_pt_es.txt * Update flags_pt_es-419.txt * Update flags_pt_fr.txt * Update flags_pt_ja.txt * Update flags_pt_ko.txt * Update flags_pt_zh-Hans.txt * Update flags_pt_zh-Hant.txt * Update lang_de.txt * Update lang_en.txt * Update lang_es-419.txt * Update lang_es.txt * Update lang_fr.txt * Update lang_it.txt * Update lang_ja.txt * Update lang_ko.txt * Update lang_zh-Hans.txt * Update lang_zh-Hant.txt * Update text_Games_zh-Hans.txt * Update text_Games_zh-Hant.txt * Update lang_ja.txt * Update const_dp_en.txt --- .../Resources/text/other/ja/text_Games_ja.txt | 6 +++--- .../text/other/zh-Hans/text_Games_zh-Hans.txt | 10 +++++----- .../text/other/zh-Hant/text_Games_zh-Hant.txt | 10 +++++----- .../Resources/text/script/gen4/const_dp_en.txt | 6 +++++- .../Resources/text/script/gen4/const_dp_es-419.txt | 6 +++++- .../Resources/text/script/gen4/const_dp_es.txt | 6 +++++- .../Resources/text/script/gen4/const_dp_fr.txt | 6 +++++- .../Resources/text/script/gen4/const_dp_ja.txt | 8 ++++++-- .../Resources/text/script/gen4/const_dp_ko.txt | 6 +++++- .../text/script/gen4/const_dp_zh-Hans.txt | 6 +++++- .../text/script/gen4/const_dp_zh-Hant.txt | 6 +++++- .../Resources/text/script/gen4/const_pt_en.txt | 6 +++++- .../Resources/text/script/gen4/const_pt_es-419.txt | 6 +++++- .../Resources/text/script/gen4/const_pt_es.txt | 6 +++++- .../Resources/text/script/gen4/const_pt_fr.txt | 6 +++++- .../Resources/text/script/gen4/const_pt_ja.txt | 14 +++++++++----- .../Resources/text/script/gen4/const_pt_ko.txt | 6 +++++- .../text/script/gen4/const_pt_zh-Hans.txt | 6 +++++- .../text/script/gen4/const_pt_zh-Hant.txt | 6 +++++- .../Resources/text/script/gen4/flags_dp_en.txt | 13 +++++++++++++ .../Resources/text/script/gen4/flags_dp_es-419.txt | 13 +++++++++++++ .../Resources/text/script/gen4/flags_dp_es.txt | 13 +++++++++++++ .../Resources/text/script/gen4/flags_dp_fr.txt | 13 +++++++++++++ .../Resources/text/script/gen4/flags_dp_ja.txt | 13 +++++++++++++ .../Resources/text/script/gen4/flags_dp_ko.txt | 13 +++++++++++++ .../text/script/gen4/flags_dp_zh-Hans.txt | 13 +++++++++++++ .../text/script/gen4/flags_dp_zh-Hant.txt | 13 +++++++++++++ .../Resources/text/script/gen4/flags_pt_en.txt | 13 +++++++++++++ .../Resources/text/script/gen4/flags_pt_es-419.txt | 13 +++++++++++++ .../Resources/text/script/gen4/flags_pt_es.txt | 13 +++++++++++++ .../Resources/text/script/gen4/flags_pt_fr.txt | 13 +++++++++++++ .../Resources/text/script/gen4/flags_pt_ja.txt | 13 +++++++++++++ .../Resources/text/script/gen4/flags_pt_ko.txt | 13 +++++++++++++ .../text/script/gen4/flags_pt_zh-Hans.txt | 13 +++++++++++++ .../text/script/gen4/flags_pt_zh-Hant.txt | 13 +++++++++++++ PKHeX.WinForms/Resources/text/lang_de.txt | 4 ++-- PKHeX.WinForms/Resources/text/lang_en.txt | 2 +- PKHeX.WinForms/Resources/text/lang_es-419.txt | 4 ++-- PKHeX.WinForms/Resources/text/lang_es.txt | 2 +- PKHeX.WinForms/Resources/text/lang_fr.txt | 4 ++-- PKHeX.WinForms/Resources/text/lang_it.txt | 4 ++-- PKHeX.WinForms/Resources/text/lang_ja.txt | 2 +- PKHeX.WinForms/Resources/text/lang_ko.txt | 4 ++-- PKHeX.WinForms/Resources/text/lang_zh-Hans.txt | 2 +- PKHeX.WinForms/Resources/text/lang_zh-Hant.txt | 4 ++-- 45 files changed, 322 insertions(+), 50 deletions(-) diff --git a/PKHeX.Core/Resources/text/other/ja/text_Games_ja.txt b/PKHeX.Core/Resources/text/other/ja/text_Games_ja.txt index c726ab343..42ff04213 100644 --- a/PKHeX.Core/Resources/text/other/ja/text_Games_ja.txt +++ b/PKHeX.Core/Resources/text/other/ja/text_Games_ja.txt @@ -20,8 +20,8 @@ ホワイト ブラック -ホワイト 2 -ブラック 2 +ホワイト2 +ブラック2 X Y アルファサファイア @@ -51,4 +51,4 @@ LEGENDS アルセウス スカーレット バイオレット LEGENDS Z-A -ャンピオンズ \ No newline at end of file +ャンピオンズ diff --git a/PKHeX.Core/Resources/text/other/zh-Hans/text_Games_zh-Hans.txt b/PKHeX.Core/Resources/text/other/zh-Hans/text_Games_zh-Hans.txt index bb8003f0c..d35f27fb8 100644 --- a/PKHeX.Core/Resources/text/other/zh-Hans/text_Games_zh-Hans.txt +++ b/PKHeX.Core/Resources/text/other/zh-Hans/text_Games_zh-Hans.txt @@ -20,10 +20,10 @@ 白 黑 -白 2 -黑 2 -X -Y +白2 +黑2 +X +Y 阿尔法蓝宝石 欧米伽红宝石 @@ -51,4 +51,4 @@ Let's Go!伊布 朱 紫 传说 宝可梦Z-A -Champions \ No newline at end of file +Champions diff --git a/PKHeX.Core/Resources/text/other/zh-Hant/text_Games_zh-Hant.txt b/PKHeX.Core/Resources/text/other/zh-Hant/text_Games_zh-Hant.txt index b6484dc84..8150317ac 100644 --- a/PKHeX.Core/Resources/text/other/zh-Hant/text_Games_zh-Hant.txt +++ b/PKHeX.Core/Resources/text/other/zh-Hant/text_Games_zh-Hant.txt @@ -20,10 +20,10 @@ 白 黑 -白 2 -黑 2 -X -Y +白2 +黑2 +X +Y 阿爾法藍寶石 歐米加紅寶石 @@ -51,4 +51,4 @@ Let's Go!伊布 朱 紫 傳說:寶可夢Z-A -Champions \ No newline at end of file +Champions diff --git a/PKHeX.Core/Resources/text/script/gen4/const_dp_en.txt b/PKHeX.Core/Resources/text/script/gen4/const_dp_en.txt index 260041518..e63a5ef0e 100644 --- a/PKHeX.Core/Resources/text/script/gen4/const_dp_en.txt +++ b/PKHeX.Core/Resources/text/script/gen4/const_dp_en.txt @@ -8,8 +8,12 @@ 0067 e Member Card (Unreleased) 0:Not Activated,4617:Activated 0068 e Oak's Letter (Unreleased) 0:Not Activated,4370:Activated 0069 e Azure Flute (Unreleased) 0:Not Activated,4387:Activated -0062 r Current Players Interacted Underground 32:Spiritomb Appeared +0062 r Current Players Met Underground (Spiritomb) 32:Spiritomb Appeared 0138 e Hallowed Tower 0:Inactive,1:Active 0248 e Harbor Inn Event (Unreleased) 0:Not Completed,2:Darkrai Capture Pending,3:Sailor outside Inn (Darkrai Caught),4:Completed (Caught Darkrai during nightmare) 0280 e Hall of Origin Event (Unreleased) 0:Inactive,1:Active 0224 + Catching Show Best Score (Pal Park) +0070 + Gifts Given Underground (Mr. Goods) +0071 + Fossils Obtained Underground (Mr. Goods) +0072 + Players Trapped Underground (Mr. Goods) +0073 + Players Met Underground (Mr. Goods) diff --git a/PKHeX.Core/Resources/text/script/gen4/const_dp_es-419.txt b/PKHeX.Core/Resources/text/script/gen4/const_dp_es-419.txt index 6faaf8152..f726ae4ed 100644 --- a/PKHeX.Core/Resources/text/script/gen4/const_dp_es-419.txt +++ b/PKHeX.Core/Resources/text/script/gen4/const_dp_es-419.txt @@ -8,8 +8,12 @@ 0067 e Carné Socio (No lanzado) 0:Sin activar,4617:Activado 0068 e Carta Prof. Oak (No lanzado) 0:Sin activar,4370:Activado 0069 e Flauta Azur (No lanzado) 0:Sin activar,4387:Activado -0062 r Jugadores Actuales Interactuados en Subsuelo 32:Spiritomb Aparecido +0062 r Jugadores Actuales Interactuados en Subsuelo (Spiritomb) 32:Spiritomb Aparecido 0138 e Torre Sagrada 0:Desactivado,1:Activo 0248 e Evento de Taberna Bahía (No lanzado) 0:No completado,2:Captura Darkrai pendiente,3:Marinero fuera del Inn (Darkrai capturado),4:Completado (Darkrai capturado durante pesadilla) 0280 e Evento de Sala del Origen (No lanzado) 0:Desactivado,1:Activo 0224 + Mejor puntuación capturas en Parque Compi +0070 + Regalos dados en Subsuelo (Sr. Curiosidades) +0071 + Fósiles obtenidos en Subsuelo (Sr. Curiosidades) +0072 + Jugadores atrapados en Subsuelo (Sr. Curiosidades) +0073 + Jugadores conocidos en Subsuelo (Sr. Curiosidades) diff --git a/PKHeX.Core/Resources/text/script/gen4/const_dp_es.txt b/PKHeX.Core/Resources/text/script/gen4/const_dp_es.txt index 6faaf8152..f726ae4ed 100644 --- a/PKHeX.Core/Resources/text/script/gen4/const_dp_es.txt +++ b/PKHeX.Core/Resources/text/script/gen4/const_dp_es.txt @@ -8,8 +8,12 @@ 0067 e Carné Socio (No lanzado) 0:Sin activar,4617:Activado 0068 e Carta Prof. Oak (No lanzado) 0:Sin activar,4370:Activado 0069 e Flauta Azur (No lanzado) 0:Sin activar,4387:Activado -0062 r Jugadores Actuales Interactuados en Subsuelo 32:Spiritomb Aparecido +0062 r Jugadores Actuales Interactuados en Subsuelo (Spiritomb) 32:Spiritomb Aparecido 0138 e Torre Sagrada 0:Desactivado,1:Activo 0248 e Evento de Taberna Bahía (No lanzado) 0:No completado,2:Captura Darkrai pendiente,3:Marinero fuera del Inn (Darkrai capturado),4:Completado (Darkrai capturado durante pesadilla) 0280 e Evento de Sala del Origen (No lanzado) 0:Desactivado,1:Activo 0224 + Mejor puntuación capturas en Parque Compi +0070 + Regalos dados en Subsuelo (Sr. Curiosidades) +0071 + Fósiles obtenidos en Subsuelo (Sr. Curiosidades) +0072 + Jugadores atrapados en Subsuelo (Sr. Curiosidades) +0073 + Jugadores conocidos en Subsuelo (Sr. Curiosidades) diff --git a/PKHeX.Core/Resources/text/script/gen4/const_dp_fr.txt b/PKHeX.Core/Resources/text/script/gen4/const_dp_fr.txt index ddd1063a3..75510f010 100644 --- a/PKHeX.Core/Resources/text/script/gen4/const_dp_fr.txt +++ b/PKHeX.Core/Resources/text/script/gen4/const_dp_fr.txt @@ -8,8 +8,12 @@ 0067 e Carte Membre (Jamais Sortie) 0:Pas activée,4617:Activée 0068 e Lettre Chen (Jamais Sortie) 0:Pas activée,4370:Activée 0069 e Flûte Azur (Jamais Sortie) 0:Pas activée,4387:Activée -0062 r Joueurs Rencontrés dans le Souterrain 32:Spiritomb est apparu +0062 r Joueurs Rencontrés dans le Souterrain (Spiritomb) 32:Spiritomb est apparu 0138 e Tour Sacrée (Route 209) 0:Inactive,1:Active 0248 e Évènement de l'Auberge du Port (Jamais Sorti) 0:Pas encore complété,2:Capture de Darkrai en attente,3:Marin devant l'auberge (Darkrai capturé),4:Terminé (Darkrai capturé pendant le cauchemar) 0280 e Évènement de la Salle Originelle (Jamais Sorti) 0:Inactif,1:Actif 0224 + Meilleur Score du Show Capture (Parc des Amis) +0070 + Cadeaux donnés en Souterrain (Rico Lexion) +0071 + Fossiles Obtenus en Souterrain (Rico Lexion) +0072 + Joueurs piégés en Souterrain (Rico Lexion) +0073 + Joueurs rencontrés en Souterrain (Rico Lexion) diff --git a/PKHeX.Core/Resources/text/script/gen4/const_dp_ja.txt b/PKHeX.Core/Resources/text/script/gen4/const_dp_ja.txt index b2bd1880e..e41a7b27d 100644 --- a/PKHeX.Core/Resources/text/script/gen4/const_dp_ja.txt +++ b/PKHeX.Core/Resources/text/script/gen4/const_dp_ja.txt @@ -8,8 +8,12 @@ 0067 e メンバーズカード(没) 0:未発生,4617:発生 0068 e オーキドのてがみ(没) 0:未発生,4370:発生 0069 e てんかいのふえ(没) 0:未発生,4387:発生 -0062 r 地下通路で話したプレイヤーの現在の人数 32:ミカルゲ出現 +0062 r 地下通路で話したプレイヤーの現在の人数(ミカルゲ) 32:ミカルゲ出現 0138 e みたまのとう 0:未発生,1:発生 0248 e はとばのやどイベント(没) 0:未完了,,2:戦闘前,3:ダークライ捕獲済み,4:宿へ戻り、イベント終了 0280 e はじまりのまイベント(没) 0:未発生,1:発生 -0224 + ほかくショーベストスコア (パルパーク) +0224 + ほかくショーベストスコア(パルパーク) +0070 + グッズをあげた回数ちかつうろ( ミスター・グッズ) +0071 + カセキを掘ったちかつうろ( ミスター・グッズ) +0072 + トラップにかけた回数ちかつうろ(ミスター・グッズ) +0073 + 出会った人ちかつうろ(ミスター・グッズ) diff --git a/PKHeX.Core/Resources/text/script/gen4/const_dp_ko.txt b/PKHeX.Core/Resources/text/script/gen4/const_dp_ko.txt index bbd3ae434..38dfc9e62 100644 --- a/PKHeX.Core/Resources/text/script/gen4/const_dp_ko.txt +++ b/PKHeX.Core/Resources/text/script/gen4/const_dp_ko.txt @@ -8,8 +8,12 @@ 0067 e 멤버스카드 (미발매) 0:활성화되지 않음,4617:활성화됨 0068 e 오박사의 편지 (미발매) 0:활성화되지 않음,4370:활성화됨 0069 e 천계의 피리 (미발매) 0:활성화되지 않음,4387:활성화됨 -0062 r 현재 플레이어가 상호작용한 지하통로 32:화강돌 나타남 +0062 r 현재 플레이어가 상호작용한 지하통로 (화강돌) 32:화강돌 나타남 0138 e 신령탑 0:비활성,1:활동적인 0248 e 항구 숙소 이벤트 0:미완료,2:다크라이 포획 대기 중,3:선원은 여관 밖에 있다 (다크라이 잡음),4:완성됨 (악몽 중에 다크라이를 잡았다) 0280 e 시작의 방 이벤트 (미발매) 0:비활성,1:활동적인 0224 + 잡기쇼 최고 점수 (팔파크) +0070 + 지하통로 준 상품 수 (미스터 굿즈) +0071 + 지하통로 얻은 화석 (미스터 굿즈) +0072 + 지하통로 타인이 밟은 함정 수 (미스터 굿즈) +0073 + 지하통로 만난사람의수 (미스터 굿즈) diff --git a/PKHeX.Core/Resources/text/script/gen4/const_dp_zh-Hans.txt b/PKHeX.Core/Resources/text/script/gen4/const_dp_zh-Hans.txt index f9cedd96c..48a26a3ab 100644 --- a/PKHeX.Core/Resources/text/script/gen4/const_dp_zh-Hans.txt +++ b/PKHeX.Core/Resources/text/script/gen4/const_dp_zh-Hans.txt @@ -8,8 +8,12 @@ 0067 e 会员卡 (未发行) 0:未解锁,4617:已解锁 0068 e 大木的信 (未发行) 0:未解锁,4370:已解锁 0069 e 天界之笛 (未发行) 0:未解锁,4387:已解锁 -0062 r 当前玩家在地下世界互动 32:花岩怪出现了 +0062 r 当前在地下通道互动的玩家 (花岩怪) 32:花岩怪出现了 0138 e 灵魂之塔 0:未解锁,1:已解锁 0248 e 码头旅馆事件 (未发行) 0:未完成,2:Darkrai Capture Pending,3:Sailor outside Inn (达克莱伊 已捕获),4:完成 (Caught Darkrai during nightmare) 0280 e 起始之殿事件 (未发行) 0:未解锁,1:已解锁 0224 + 伙伴公园最佳成绩 +0070 + 赠予的礼物地下通道 (商品大叔) +0071 + 获得的化石地下通道 (商品大叔) +0072 + 陷阱命中地下通道 (商品大叔) +0073 + 遇见玩家地下通道 (商品大叔) diff --git a/PKHeX.Core/Resources/text/script/gen4/const_dp_zh-Hant.txt b/PKHeX.Core/Resources/text/script/gen4/const_dp_zh-Hant.txt index 7847a4068..fa48595bb 100644 --- a/PKHeX.Core/Resources/text/script/gen4/const_dp_zh-Hant.txt +++ b/PKHeX.Core/Resources/text/script/gen4/const_dp_zh-Hant.txt @@ -8,8 +8,12 @@ 0067 e 會員卡 (未發行) 0:未解鎖,4617:已解鎖 0068 e 大木的信 (未發行) 0:未解鎖,4370:已解鎖 0069 e 天界之笛 (未發行) 0:未解鎖,4387:已解鎖 -0062 r 當前玩家在地下世界互動 32:花岩怪出现了 +0062 r 當前在地下通道互動的玩家 (花岩怪) 32:花岩怪出现了 0138 e 靈魂之塔 0:未解鎖,1:已解鎖 0248 e 碼頭旅館事件 (未發行) 0:Not Completed,2:Darkrai Capture Pending,3:Sailor outside Inn (Darkrai Caught),4:Completed (Caught Darkrai during nightmare) 0280 e 起始之殿事件 (未發行) 0:未解鎖,1:已解鎖 0224 + 夥伴公園最好成績 +0070 + 贈予的禮物地下通道 (商品大叔) +0071 + 獲得的化石地下通道 (商品大叔) +0072 + 陷阱命中地下通道 (商品大叔) +0073 + 遇見玩家地下通道 (商品大叔) diff --git a/PKHeX.Core/Resources/text/script/gen4/const_pt_en.txt b/PKHeX.Core/Resources/text/script/gen4/const_pt_en.txt index e6d123a15..58dba34a0 100644 --- a/PKHeX.Core/Resources/text/script/gen4/const_pt_en.txt +++ b/PKHeX.Core/Resources/text/script/gen4/const_pt_en.txt @@ -20,7 +20,7 @@ 0105 r Iron Ruins Statue (Registeel) 0:Inactive,270:Activated,280:Defeated,290:Caught 0106 r Iceberg Ruins Statue (Regice) 0:Inactive,270:Activated,280:Defeated,290:Caught 0107 r Rock Peak Ruins Statue (Regirock) 0:Inactive,270:Activated,280:Defeated,290:Caught -0062 r Current Players Interacted Underground 32:Spiritomb Appeared +0062 r Current Players Met Underground (Spiritomb) 32:Spiritomb Appeared 0138 r Hallowed Tower 0:Inactive,1:Active 0089 r Mesprit Status 0:Pending,1:Caught,2:Fainted/Can Respawn 0088 r Cresselia Status 0:Pending,1:Caught,2:Fainted/Can Respawn @@ -28,3 +28,7 @@ 0095 r Zapdos Status 0:Pending,1:Caught,2:Fainted/Can Respawn 0094 r Moltres Status 0:Pending,1:Caught,2:Fainted/Can Respawn 0224 + Catching Show Best Score (Pal Park) +0071 + Fossils Obtained Underground (Mr. Goods) +0072 + Players Trapped Underground (Mr. Goods) +0073 + Players Met Underground (Mr. Goods) +0084 + Gifts Given Underground (Mr. Goods) diff --git a/PKHeX.Core/Resources/text/script/gen4/const_pt_es-419.txt b/PKHeX.Core/Resources/text/script/gen4/const_pt_es-419.txt index 4f1433355..654cd2dc5 100644 --- a/PKHeX.Core/Resources/text/script/gen4/const_pt_es-419.txt +++ b/PKHeX.Core/Resources/text/script/gen4/const_pt_es-419.txt @@ -20,7 +20,7 @@ 0105 r Estatua de Ruinas Hierro (Registeel) 0:Inactivo,270:Activado,280:Derrotado,290:Capturado 0106 r Estatua de Ruinas Iceberg (Regice) 0:Inactivo,270:Activado,280:Derrotado,290:Capturado 0107 r Estatua de Ruinas Pico Roca (Regirock) 0:Inactivo,270:Activado,280:Derrotado,290:Capturado -0062 r Jugadores Actuales Interactuados en Subsuelo 32:Spiritomb Aparecido +0062 r Jugadores Actuales Interactuados en Subsuelo (Spiritomb) 32:Spiritomb Aparecido 0138 r Torre Sagrada 0:Desactivado,1:Activo 0089 r Estado Mesprit 0:Pendiente,1:Capturado,2:Derrotado/Puede reaparecer 0088 r Estado Cresselia 0:Pendiente,1:Capturada,2:Derrotada/Puede reaparecer @@ -28,3 +28,7 @@ 0095 r Estado Zapdos 0:Pendiente,1:Capturado,2:Derrotado/Puede reaparecer 0094 r Estado Moltres 0:Pendiente,1:Capturado,2:Derrotado/Puede reaparecer 0224 + Mejor puntuación capturas en Parque Compi +0071 + Fósiles obtenidos en Subsuelo (Sr. Curiosidades) +0072 + Jugadores atrapados en Subsuelo (Sr. Curiosidades) +0073 + Jugadores conocidos en Subsuelo (Sr. Curiosidades) +0084 + Regalos dados en Subsuelo (Sr. Curiosidades) diff --git a/PKHeX.Core/Resources/text/script/gen4/const_pt_es.txt b/PKHeX.Core/Resources/text/script/gen4/const_pt_es.txt index 4f1433355..654cd2dc5 100644 --- a/PKHeX.Core/Resources/text/script/gen4/const_pt_es.txt +++ b/PKHeX.Core/Resources/text/script/gen4/const_pt_es.txt @@ -20,7 +20,7 @@ 0105 r Estatua de Ruinas Hierro (Registeel) 0:Inactivo,270:Activado,280:Derrotado,290:Capturado 0106 r Estatua de Ruinas Iceberg (Regice) 0:Inactivo,270:Activado,280:Derrotado,290:Capturado 0107 r Estatua de Ruinas Pico Roca (Regirock) 0:Inactivo,270:Activado,280:Derrotado,290:Capturado -0062 r Jugadores Actuales Interactuados en Subsuelo 32:Spiritomb Aparecido +0062 r Jugadores Actuales Interactuados en Subsuelo (Spiritomb) 32:Spiritomb Aparecido 0138 r Torre Sagrada 0:Desactivado,1:Activo 0089 r Estado Mesprit 0:Pendiente,1:Capturado,2:Derrotado/Puede reaparecer 0088 r Estado Cresselia 0:Pendiente,1:Capturada,2:Derrotada/Puede reaparecer @@ -28,3 +28,7 @@ 0095 r Estado Zapdos 0:Pendiente,1:Capturado,2:Derrotado/Puede reaparecer 0094 r Estado Moltres 0:Pendiente,1:Capturado,2:Derrotado/Puede reaparecer 0224 + Mejor puntuación capturas en Parque Compi +0071 + Fósiles obtenidos en Subsuelo (Sr. Curiosidades) +0072 + Jugadores atrapados en Subsuelo (Sr. Curiosidades) +0073 + Jugadores conocidos en Subsuelo (Sr. Curiosidades) +0084 + Regalos dados en Subsuelo (Sr. Curiosidades) diff --git a/PKHeX.Core/Resources/text/script/gen4/const_pt_fr.txt b/PKHeX.Core/Resources/text/script/gen4/const_pt_fr.txt index 3033abf82..d476db1af 100644 --- a/PKHeX.Core/Resources/text/script/gen4/const_pt_fr.txt +++ b/PKHeX.Core/Resources/text/script/gen4/const_pt_fr.txt @@ -20,7 +20,7 @@ 0105 r Statue des Ruines de Fer (Registeel) 0:Inactive,270:Activée,280:Vaincu,290:Capturé 0106 r Statue des Ruines Iceberg (Regice) 0:Inactive,270:Activée,280:Vaincu,290:Capturé 0107 r Statue des Ruines Pic Roche (Regirock) 0:Inactive,270:Activée,280:Vaincu,290:Capturé -0062 r Joueurs Rencontrés dans le Souterrain 32:Spiritomb est apparu +0062 r Joueurs Rencontrés dans le Souterrain (Spiritomb) 32:Spiritomb est apparu 0138 r Tour Sacrée (Route 209) 0:Inactive,1:Active 0089 r Statut de Créfollet 0:En attente,1:Capturé,2:K.0./Peut réapparaître 0088 r Statut de Cresselia 0:En attente,1:Capturé,2:K.0./Peut réapparaître @@ -28,3 +28,7 @@ 0095 r Statut d'Électhor 0:En attente,1:Capturé,2:K.0./Peut réapparaître 0094 r Statut de Sulfura 0:En attente,1:Capturé,2:K.0./Peut réapparaître 0224 + Meilleur Score du Show Capture (Parc des Amis) +0071 + Fossiles Obtenus en Souterrain (Rico Lexion) +0072 + Joueurs piégés en Souterrain (Rico Lexion) +0073 + Joueurs rencontrés en Souterrain (Rico Lexion) +0084 + Cadeaux donnés en Souterrain (Rico Lexion) diff --git a/PKHeX.Core/Resources/text/script/gen4/const_pt_ja.txt b/PKHeX.Core/Resources/text/script/gen4/const_pt_ja.txt index 8cb9587c5..a7746cb64 100644 --- a/PKHeX.Core/Resources/text/script/gen4/const_pt_ja.txt +++ b/PKHeX.Core/Resources/text/script/gen4/const_pt_ja.txt @@ -17,14 +17,18 @@ 0086 e やまおとこ(アルセウスイベント) 0:未発生,1:クロガネたんこう,2:オとしょかん2F,3:イベント完了 0087 e マイイベント(224ばんどうろ) 0:未発生,1:発生中,2:発生後 0133 s マイ(224ばんどうろ) 0:未発生,1:発生,2:出現 -0105 r くろがねのいせき (レジスチル) 0:未発生,270:発生,280:戦闘済み,290:捕獲 -0106 r ひょうざんのいせき (レジアイス) 0:未発生,270:発生,280:戦闘済み,290:捕獲 -0107 r いわやまのいせき (レジロック) 0:未発生,270:発生,280:戦闘済み,290:捕獲 -0062 r 地下通路で話したプレイヤーの現在の人数 32:ミカルゲ出現 +0105 r くろがねのいせき(レジスチル) 0:未発生,270:発生,280:戦闘済み,290:捕獲 +0106 r ひょうざんのいせき(レジアイス) 0:未発生,270:発生,280:戦闘済み,290:捕獲 +0107 r いわやまのいせき(レジロック) 0:未発生,270:発生,280:戦闘済み,290:捕獲 +0062 r 地下通路で話したプレイヤーの現在の人数(ミカルゲ) 32:ミカルゲ出現 0138 r みたまのとう 0:未発生,1:発生 0089 r エムリット 0:待機中,1:捕獲,2:倒した/復活待ち 0088 r クレセリア 0:待機中,1:捕獲,2:倒した/復活待ち 0096 r フリーザー 0:待機中,1:捕獲,2:倒した/復活待ち 0095 r サンダー 0:待機中,1:捕獲,2:倒した/復活待ち 0094 r ファイヤー 0:待機中,1:捕獲,2:倒した/復活待ち -0224 + ほかくショーベストスコア (パルパーク) +0224 + ほかくショーベストスコア(パルパーク) +0071 + カセキを掘ったちかつうろ( ミスター・グッズ) +0072 + トラップにかけた回数ちかつうろ(ミスター・グッズ) +0073 + 出会った人ちかつうろ(ミスター・グッズ) +0084 + グッズをあげた回数ちかつうろ( ミスター・グッズ) diff --git a/PKHeX.Core/Resources/text/script/gen4/const_pt_ko.txt b/PKHeX.Core/Resources/text/script/gen4/const_pt_ko.txt index 549751260..dd7e7af68 100644 --- a/PKHeX.Core/Resources/text/script/gen4/const_pt_ko.txt +++ b/PKHeX.Core/Resources/text/script/gen4/const_pt_ko.txt @@ -20,7 +20,7 @@ 0105 r 무쇠의 유적 동상 (레지스틸) 0:비활성,270:활성화됨,280:쓰러뜨림,290:잡혔다 0106 r 빙산의 유적 동상 (레지아이스) 0:비활성,270:활성화됨,280:쓰러뜨림,290:잡혔다 0107 r 바위산의 유적 동상 (레지락) 0:비활성,270:활성화됨,280:쓰러뜨림,290:잡혔다 -0062 r 현재 플레이어가 상호작용한 지하통로 32:화강돌 나타남 +0062 r 현재 플레이어가 상호작용한 지하통로 (화강돌) 32:화강돌 나타남 0138 r 신령탑 0:비활성,1:활동적인 0089 r 엠라이트 상태 0:대기,1:잡혔다,2:기절/리스폰됨 0088 r 크레세리아 상태 0:대기,1:잡혔다,2:기절/리스폰됨 @@ -28,3 +28,7 @@ 0095 r 썬더 상태 0:대기,1:잡혔다,2:기절/리스폰됨 0094 r 파이어 상태 0:대기,1:잡혔다,2:기절/리스폰됨 0224 + 잡기쇼 최고 점수 (팔파크) +0071 + 지하통로 얻은 화석 (미스터 굿즈) +0072 + 지하통로 타인이 밟은 함정 수 (미스터 굿즈) +0073 + 지하통로 만난사람의수 (미스터 굿즈) +0084 + 지하통로 준 상품 수 (미스터 굿즈) diff --git a/PKHeX.Core/Resources/text/script/gen4/const_pt_zh-Hans.txt b/PKHeX.Core/Resources/text/script/gen4/const_pt_zh-Hans.txt index 3e756baa8..31f27c67a 100644 --- a/PKHeX.Core/Resources/text/script/gen4/const_pt_zh-Hans.txt +++ b/PKHeX.Core/Resources/text/script/gen4/const_pt_zh-Hans.txt @@ -20,7 +20,7 @@ 0105 r 黑金遗迹雕像 (雷吉斯奇鲁) 0:未解锁,270:已解锁,280:已打败,290:已捕捉 0106 r 冰山遗迹雕像 (雷吉艾斯) 0:未解锁,270:已解锁,280:已打败,290:已捕捉 0107 r 岩山遗迹雕像 (雷吉洛克) 0:未解锁,270:已解锁,280:已打败,290:已捕捉 -0062 r 当前玩家在地下世界互动 32:花岩怪出现了 +0062 r 当前在地下通道互动的玩家 (花岩怪) 32:花岩怪出现了 0138 r 灵魂之塔 0:未解锁,1:已解锁 0089 r 艾姆利多 0:待定,1:已捕获,2:已打败/可以重生 0088 r 克雷色利亚 0:待定,1:已捕获,2:已打败/可以重生 @@ -28,3 +28,7 @@ 0095 r 闪电鸟 0:待定,1:已捕获,2:已打败/可以重生 0094 r 火焰鸟 0:待定,1:已捕获,2:已打败/可以重生 0224 + 伙伴公园最佳成绩 +0071 + 获得的化石地下通道 (商品大叔) +0072 + 陷阱命中地下通道 (商品大叔) +0073 + 遇见玩家地下通道 (商品大叔) +0084 + 赠予的礼物地下通道 (商品大叔) diff --git a/PKHeX.Core/Resources/text/script/gen4/const_pt_zh-Hant.txt b/PKHeX.Core/Resources/text/script/gen4/const_pt_zh-Hant.txt index d8d2a1444..9a0238b7e 100644 --- a/PKHeX.Core/Resources/text/script/gen4/const_pt_zh-Hant.txt +++ b/PKHeX.Core/Resources/text/script/gen4/const_pt_zh-Hant.txt @@ -20,7 +20,7 @@ 0105 r 黑金遗迹雕像 (雷吉斯奇魯) 0:未解锁,270:已解锁,280:已打败,290:已捕捉 0106 r 冰山遗迹雕像 (雷吉艾斯) 0:未解锁,270:已解锁,280:已打败,290:已捕捉 0107 r 岩山遗迹雕像 (雷吉洛克) 0:未解锁,270:已解锁,280:已打败,290:已捕捉 -0062 r 當前玩家在地下世界互動 32:花岩怪出现了 +0062 r 當前在地下通道互動的玩家 (花岩怪) 32:花岩怪出现了 0138 r 靈魂之塔 0:未解锁,1:已解锁 0089 r 艾姆利多狀態 0:未解锁,1:已捕獲,2:已瀕死/可復活 0088 r 克雷色利亞狀態 0:未解锁,1:已捕獲,2:已瀕死/可復活 @@ -28,3 +28,7 @@ 0095 r 閃電鳥狀態 0:未解锁,1:已捕獲,2:已瀕死/可復活 0094 r 火焰鳥狀態 0:未解锁,1:已捕獲,2:已瀕死/可復活 0224 + 夥伴公園最好成績 +0071 + 獲得的化石地下通道 (商品大叔) +0072 + 陷阱命中地下通道 (商品大叔) +0073 + 遇見玩家地下通道 (商品大叔) +0084 + 贈予的禮物地下通道 (商品大叔) diff --git a/PKHeX.Core/Resources/text/script/gen4/flags_dp_en.txt b/PKHeX.Core/Resources/text/script/gen4/flags_dp_en.txt index 77d8db067..51df9ba82 100644 --- a/PKHeX.Core/Resources/text/script/gen4/flags_dp_en.txt +++ b/PKHeX.Core/Resources/text/script/gen4/flags_dp_en.txt @@ -34,6 +34,7 @@ 2410 a Cute Contest Master 2411 a Smart Contest Master 2412 a Tough Contest Master +2444 a Connected to Nintendo Wi-Fi Connection 0329 r Rotom Captured 0665 s Encountered Ghost Butler in Old Chateau 0666 s Encountered Ghost Girl in Old Chateau @@ -56,6 +57,18 @@ 0134 g Traded in Eterna City 0244 g Traded in Snowpoint City 0245 g Traded on Route 226 +0330 g Received Globe (Mr. Goods) +0331 g Received Gym Statue (Mr. Goods) +0332 g Received Cute Cup (Mr. Goods) +0333 g Received Cool Cup (Mr. Goods) +0334 g Received Beauty Cup (Mr. Goods) +0335 g Received Tough Cup (Mr. Goods) +0336 g Received Clever Cup (Mr. Goods) +0337 g Received Blue Crystal (Mr. Goods) +0338 g Received Pink Crystal (Mr. Goods) +0339 g Received Red Crystal (Mr. Goods) +0340 g Received Yellow Crystal (Mr. Goods) +0347 g Received All Goods (Mr. Goods) 0787 i Found HP Up in dried Lake Valor 2507 s Entered Pal Park Catching Show 1409 t Defeated Jogger Richard (Morning) diff --git a/PKHeX.Core/Resources/text/script/gen4/flags_dp_es-419.txt b/PKHeX.Core/Resources/text/script/gen4/flags_dp_es-419.txt index be151f312..5c2afbee5 100644 --- a/PKHeX.Core/Resources/text/script/gen4/flags_dp_es-419.txt +++ b/PKHeX.Core/Resources/text/script/gen4/flags_dp_es-419.txt @@ -34,6 +34,7 @@ 2410 a Maestro de Concurso de Dulzura 2411 a Maestro de Concurso de Ingenio 2412 a Maestro de Concurso de Dureza +2444 a Conectó a la Conexión Wi-Fi de Nintendo 0329 r Rotom capturado 0665 s Encontrado Mayordomo Fantasma en la Vieja Mansión 0666 s Encontrada Niña Fantasma en la Vieja Mansión @@ -56,6 +57,18 @@ 0134 g Intercambio en Ciudad Vetusta 0244 g Intercambio en Ciudad Puntaneva 0245 g Intercambio en Ruta 226 +0330 g Globo terráqueo recibido (Sr. Curiosidades) +0331 g Estatua Gimnasio recibida (Sr. Curiosidades) +0332 g Copa Dulzura recibida (Sr. Curiosidades) +0333 g Copa Carisma recibida (Sr. Curiosidades) +0334 g Copa Belleza recibida (Sr. Curiosidades) +0335 g Copa Dureza recibida (Sr. Curiosidades) +0336 g Copa Ingenio recibida (Sr. Curiosidades) +0337 g Cristal Azul recibido (Sr. Curiosidades) +0338 g Cristal Rosa recibido (Sr. Curiosidades) +0339 g Cristal Rojo recibido (Sr. Curiosidades) +0340 g Cristal Amarillo recibido (Sr. Curiosidades) +0347 g Todos los objetos recibidos (Sr. Curiosidades) 0787 i Más PP encontrado en Lago Valor seco 2507 s Participado en las capturas del Parque Compi 1409 t Corredor Romén derrotado (Mañana) diff --git a/PKHeX.Core/Resources/text/script/gen4/flags_dp_es.txt b/PKHeX.Core/Resources/text/script/gen4/flags_dp_es.txt index 8d5a20eef..a09eb5e8d 100644 --- a/PKHeX.Core/Resources/text/script/gen4/flags_dp_es.txt +++ b/PKHeX.Core/Resources/text/script/gen4/flags_dp_es.txt @@ -34,6 +34,7 @@ 2410 a Maestro de Concurso de Dulzura 2411 a Maestro de Concurso de Ingenio 2412 a Maestro de Concurso de Dureza +2444 a Conectó a la Conexión Wi-Fi de Nintendo 0329 r Rotom capturado 0665 s Encontrado Mayordomo Fantasma en la Vieja Mansión 0666 s Encontrada Niña Fantasma en la Vieja Mansión @@ -56,6 +57,18 @@ 0134 g Intercambio en Ciudad Vetusta 0244 g Intercambio en Ciudad Puntaneva 0245 g Intercambio en Ruta 226 +0330 g Globo terráqueo recibido (Sr. Curiosidades) +0331 g Estatua Gimnasio recibida (Sr. Curiosidades) +0332 g Copa Dulzura recibida (Sr. Curiosidades) +0333 g Copa Carisma recibida (Sr. Curiosidades) +0334 g Copa Belleza recibida (Sr. Curiosidades) +0335 g Copa Dureza recibida (Sr. Curiosidades) +0336 g Copa Ingenio recibida (Sr. Curiosidades) +0337 g Cristal Azul recibido (Sr. Curiosidades) +0338 g Cristal Rosa recibido (Sr. Curiosidades) +0339 g Cristal Rojo recibido (Sr. Curiosidades) +0340 g Cristal Amarillo recibido (Sr. Curiosidades) +0347 g Todos los objetos recibidos (Sr. Curiosidades) 0787 i Más PP encontrado en Lago Valor seco 2507 s Participado en las capturas del Parque Compi 1409 t Corredor Romén derrotado (Mañana) diff --git a/PKHeX.Core/Resources/text/script/gen4/flags_dp_fr.txt b/PKHeX.Core/Resources/text/script/gen4/flags_dp_fr.txt index d58bd82f9..ededce46b 100644 --- a/PKHeX.Core/Resources/text/script/gen4/flags_dp_fr.txt +++ b/PKHeX.Core/Resources/text/script/gen4/flags_dp_fr.txt @@ -34,6 +34,7 @@ 2410 a Rang Master en Catégorie Grâce 2411 a Rang Master en Catégorie Intelligence 2412 a Rang Master en Catégorie Robustesse +2444 a Connexion à la Connexion Wi-Fi Nintendo réussie 0329 r Motisma Capturé 0665 s Fantôme du Majordome Rencontré au Vieux Château 0666 s Fantôme de la Fillette Rencontré au Vieux Château @@ -56,6 +57,18 @@ 0134 g Échange Interne Mustébouée Contre Pijako (Vestigion) 0244 g Échange Interne Charmina Contre Spectrum (Frimapic) 0245 g Échange Interne Écayon Contre Magicarpe (Route 226) +0330 g Globe Terrestre reçu (Rico Lexion) +0331 g Statue Arène reçue (Rico Lexion) +0332 g Coupe Grâce reçue (Rico Lexion) +0333 g Coupe Sang-froid reçue (Rico Lexion) +0334 g Coupe Beauté reçue (Rico Lexion) +0335 g Coupe Robustesse reçue (Rico Lexion) +0336 g Coupe Intelligence reçue (Rico Lexion) +0337 g Cristal Bleu reçu (Rico Lexion) +0338 g Cristal Rose reçu (Rico Lexion) +0339 g Cristal Rouge reçu (Rico Lexion) +0340 g Cristal Jaune reçu (Rico Lexion) +0347 g Tous les articles reçus (Rico Lexion) 0787 i PV Plus Trouvé au Lac Vérité Séché 2507 s Est Entré au Show Capture du Parc des Amis 1409 t Joggeur Amir Vaincu (Route 209 - Matin) diff --git a/PKHeX.Core/Resources/text/script/gen4/flags_dp_ja.txt b/PKHeX.Core/Resources/text/script/gen4/flags_dp_ja.txt index 4286b9c62..fcc518727 100644 --- a/PKHeX.Core/Resources/text/script/gen4/flags_dp_ja.txt +++ b/PKHeX.Core/Resources/text/script/gen4/flags_dp_ja.txt @@ -34,6 +34,7 @@ 2410 a かわいさコンテスト マスターランク優勝 2411 a かしこさコンテスト マスターランク優勝 2412 a たくましさコンテスト マスターランク優勝 +2444 a ニンテンドーWi-Fiコネクションに接続しました 0329 r ロトム捕獲済み 0665 s もりのようかんで幽霊の執事に遭遇した 0666 s もりのようかんで幽霊の少女に遭遇した @@ -56,6 +57,18 @@ 0134 g ハクタイシティでペラップ交換済み 0244 g キッサキシティでゴースト(かわらずのいし)交換済み 0245 g 226ばんすいどうでコイキング交換済み +0330 g ちきゅうぎ受け取り済み(ミスター・グッズ) +0331 g ジムのせきぞう受け取り済み(ミスター・グッズ) +0332 g かわいいカップ受け取り済み(ミスター・グッズ) +0333 g かっこいいカップ受け取り済み(ミスター・グッズ) +0334 g うつくしいカップ受け取り済み(ミスター・グッズ) +0335 g たくましいカップ受け取り済み(ミスター・グッズ) +0336 g かしこいカップ受け取り済み(ミスター・グッズ) +0337 g あおいすいしょう受け取り済み(ミスター・グッズ) +0338 g ピンクすいしょう受け取り済み(ミスター・グッズ) +0339 g あかいすいしょう受け取り済み(ミスター・グッズ) +0340 g きいろすいしょう受け取り済み(ミスター・グッズ) +0347 g 全グッズ 受け取り済み(ミスター・グッズ) 0787 i リッシこでマックスアップ入手 2507 s ほかくショーに参加した 1409 t ジョギングのフウタに勝利(朝) diff --git a/PKHeX.Core/Resources/text/script/gen4/flags_dp_ko.txt b/PKHeX.Core/Resources/text/script/gen4/flags_dp_ko.txt index 6c890e0ee..5e08e0e60 100644 --- a/PKHeX.Core/Resources/text/script/gen4/flags_dp_ko.txt +++ b/PKHeX.Core/Resources/text/script/gen4/flags_dp_ko.txt @@ -34,6 +34,7 @@ 2410 a 귀여움콘테스트 마스터 2411 a 슬기로움콘테스트 마스터 2412 a 강인함콘테스트 마스터 +2444 a 닌텐도 Wi-Fi 커넥션에 접속함 0329 r 로토무 잡음 0665 s 숲의양옥집에서 유령 집사 만남 0666 s 숲의양옥집에서 유령 소녀 만남 @@ -56,6 +57,18 @@ 0134 g 영원시티에서 교환했다 0244 g 선단시티에서 교환했다 0245 g 226번도로에서 교환했다 +0330 g 지구본 받음 (미스터 굿즈) +0331 g 체육관석상 받음 (미스터 굿즈) +0332 g 귀여운 컵 받음 (미스터 굿즈) +0333 g 근사한 컵 받음 (미스터 굿즈) +0334 g 아름다운 컵 받음 (미스터 굿즈) +0335 g 갖인한 컵 받음 (미스터 굿즈) +0336 g 슬기로운 컵 받음 (미스터 굿즈) +0337 g 파랑수정 받음 (미스터 굿즈) +0338 g 분홍수정 받음 (미스터 굿즈) +0339 g 빨갖수정 받음 (미스터 굿즈) +0340 g 노랑수정 받음 (미스터 굿즈) +0347 g 모두 상품 받음 (미스터 굿즈) 0787 i 마른 입지호수에서 맥스업 찾음 2507 s 팔파크 잡기쇼에 들어갔어 1409 t Defeated Jogger Richard (Morning) diff --git a/PKHeX.Core/Resources/text/script/gen4/flags_dp_zh-Hans.txt b/PKHeX.Core/Resources/text/script/gen4/flags_dp_zh-Hans.txt index 90ac4e8ee..f4c2026cb 100644 --- a/PKHeX.Core/Resources/text/script/gen4/flags_dp_zh-Hans.txt +++ b/PKHeX.Core/Resources/text/script/gen4/flags_dp_zh-Hans.txt @@ -34,6 +34,7 @@ 2410 a 可爱华丽大赛大师 2411 a 聪明华丽大赛大师 2412 a 强壮华丽大赛大师 +2444 a 已连接至任天堂Wi-Fi连接 0329 r 洛托姆已捕捉 0665 s 在森之洋馆遇到管家幽灵 0666 s 在森之洋馆遇到小女孩幽灵 @@ -56,6 +57,18 @@ 0134 g 在百代市交换了聒噪鸟 0244 g 在雪峰市交换了鬼斯通 0245 g 在226号水路交换了鲤鱼王 +0330 g 已获得地球仪(商品大叔) +0331 g 已获得道馆雕塑(商品大叔) +0332 g 已获得可爱奖杯(商品大叔) +0333 g 已获得帅气奖杯(商品大叔) +0334 g 已获得美丽奖杯(商品大叔) +0335 g 已获得强壮奖杯(商品大叔) +0336 g 已获得聪明奖杯(商品大叔) +0337 g 已获得蓝色水晶(商品大叔) +0338 g 已获得粉红色水晶(商品大叔) +0339 g 已获得红色水晶(商品大叔) +0340 g 已获得黄色水晶(商品大叔) +0347 g 已获得全部物品(商品大叔) 0787 i 在干涸的立志湖找到HP增强剂 2507 s 进入伙伴公园捕获活动 1409 t 击败慢跑者 风太 (清晨) diff --git a/PKHeX.Core/Resources/text/script/gen4/flags_dp_zh-Hant.txt b/PKHeX.Core/Resources/text/script/gen4/flags_dp_zh-Hant.txt index f3bb07c11..a69c6df67 100644 --- a/PKHeX.Core/Resources/text/script/gen4/flags_dp_zh-Hant.txt +++ b/PKHeX.Core/Resources/text/script/gen4/flags_dp_zh-Hant.txt @@ -34,6 +34,7 @@ 2410 a 可愛華麗大賽大師 2411 a 聰明華麗大賽大師 2412 a 強壯華麗大賽大師 +2444 a 已連線上网天堂Wi-Fi連接 0329 r 洛托姆已捕捉 0665 s 在森之洋館遇到管家幽靈 0666 s 在森之洋館遇到小女孩幽靈 @@ -56,6 +57,18 @@ 0134 g Traded in Eterna City 0244 g Traded in Snowpoint City 0245 g Traded on Route 226 +0330 g 已获得地球儀(商品大叔) +0331 g 已获得道館雕塑(商品大叔) +0332 g 已获得可愛獎盃(商品大叔) +0333 g 已获得帥氣獎盃(商品大叔) +0334 g 已获得美麗獎盃(商品大叔) +0335 g 已获得強壯獎盃(商品大叔) +0336 g 已获得聰明獎盃(商品大叔) +0337 g 已获得藍色水晶(商品大叔) +0338 g 已获得粉紅色水晶(商品大叔) +0339 g 已获得紅色水晶(商品大叔) +0340 g 已获得黃色水晶(商品大叔) +0347 g 已獲得全部物品(商品大叔) 0787 i Found HP Up in dried Lake Valor 2507 s Entered Pal Park Catching Show 1409 t Defeated Jogger Richard (Morning) diff --git a/PKHeX.Core/Resources/text/script/gen4/flags_pt_en.txt b/PKHeX.Core/Resources/text/script/gen4/flags_pt_en.txt index 8777ab05b..5aaa6786e 100644 --- a/PKHeX.Core/Resources/text/script/gen4/flags_pt_en.txt +++ b/PKHeX.Core/Resources/text/script/gen4/flags_pt_en.txt @@ -43,6 +43,7 @@ 2410 a Cute Contest Master 2411 a Smart Contest Master 2412 a Tough Contest Master +2444 a Connected to Nintendo Wi-Fi Connection 0329 r Rotom Captured 0635 s Encountered Ghost Butler in Old Chateau 0636 s Encountered Ghost Girl in Old Chateau @@ -76,6 +77,18 @@ 0134 g Traded in Eterna City 0244 g Traded in Snowpoint City 0245 g Traded on Route 226 +0330 g Received Globe (Mr. Goods) +0331 g Received Gym Statue (Mr. Goods) +0332 g Received Cute Cup (Mr. Goods) +0333 g Received Cool Cup (Mr. Goods) +0334 g Received Beauty Cup (Mr. Goods) +0335 g Received Tough Cup (Mr. Goods) +0336 g Received Clever Cup (Mr. Goods) +0337 g Received Blue Crystal (Mr. Goods) +0338 g Received Pink Crystal (Mr. Goods) +0339 g Received Red Crystal (Mr. Goods) +0340 g Received Yellow Crystal (Mr. Goods) +0347 g Received All Goods (Mr. Goods) 0787 i Found HP Up in dried Lake Valor 2507 s Entered Pal Park Catching Show 0325 r Dialga/Palkia rifts spawnable diff --git a/PKHeX.Core/Resources/text/script/gen4/flags_pt_es-419.txt b/PKHeX.Core/Resources/text/script/gen4/flags_pt_es-419.txt index 1f807a690..596608339 100644 --- a/PKHeX.Core/Resources/text/script/gen4/flags_pt_es-419.txt +++ b/PKHeX.Core/Resources/text/script/gen4/flags_pt_es-419.txt @@ -43,6 +43,7 @@ 2410 a Maestro de Concurso de Dulzura 2411 a Maestro de Concurso de Ingenio 2412 a Maestro de Concurso de Dureza +2444 a Conectó a la Conexión Wi-Fi de Nintendo 0329 r Rotom capturado 0635 s Encontrado Mayordomo Fantasma en la Vieja Mansión 0636 s Encontrada Niña Fantasma en la Vieja Mansión @@ -76,6 +77,18 @@ 0134 g Intercambio en Ciudad Vetusta 0244 g Intercambio en Ciudad Puntaneva 0245 g Intercambio en Ruta 226 +0330 g Globo terráqueo recibido (Sr. Curiosidades) +0331 g Estatua Gimnasio recibida (Sr. Curiosidades) +0332 g Copa Dulzura recibida (Sr. Curiosidades) +0333 g Copa Carisma recibida (Sr. Curiosidades) +0334 g Copa Belleza recibida (Sr. Curiosidades) +0335 g Copa Dureza recibida (Sr. Curiosidades) +0336 g Copa Ingenio recibida (Sr. Curiosidades) +0337 g Cristal Azul recibido (Sr. Curiosidades) +0338 g Cristal Rosa recibido (Sr. Curiosidades) +0339 g Cristal Rojo recibido (Sr. Curiosidades) +0340 g Cristal Amarillo recibido (Sr. Curiosidades) +0347 g Todos los objetos recibidos (Sr. Curiosidades) 0787 i Más PP encontrado en Lago Valor seco 2507 s Participado en las capturas del Parque Compi 0325 r Grieta de Dialga/Palkia visible diff --git a/PKHeX.Core/Resources/text/script/gen4/flags_pt_es.txt b/PKHeX.Core/Resources/text/script/gen4/flags_pt_es.txt index ed85a569a..8256bbef5 100644 --- a/PKHeX.Core/Resources/text/script/gen4/flags_pt_es.txt +++ b/PKHeX.Core/Resources/text/script/gen4/flags_pt_es.txt @@ -43,6 +43,7 @@ 2410 a Maestro de Concurso de Dulzura 2411 a Maestro de Concurso de Ingenio 2412 a Maestro de Concurso de Dureza +2444 a Conectó a la Conexión Wi-Fi de Nintendo 0329 r Rotom capturado 0635 s Encontrado Mayordomo Fantasma en la Vieja Mansión 0636 s Encontrada Niña Fantasma en la Vieja Mansión @@ -76,6 +77,18 @@ 0134 g Intercambio en Ciudad Vetusta 0244 g Intercambio en Ciudad Puntaneva 0245 g Intercambio en Ruta 226 +0330 g Globo terráqueo recibido (Sr. Curiosidades) +0331 g Estatua Gimnasio recibida (Sr. Curiosidades) +0332 g Copa Dulzura recibida (Sr. Curiosidades) +0333 g Copa Carisma recibida (Sr. Curiosidades) +0334 g Copa Belleza recibida (Sr. Curiosidades) +0335 g Copa Dureza recibida (Sr. Curiosidades) +0336 g Copa Ingenio recibida (Sr. Curiosidades) +0337 g Cristal Azul recibido (Sr. Curiosidades) +0338 g Cristal Rosa recibido (Sr. Curiosidades) +0339 g Cristal Rojo recibido (Sr. Curiosidades) +0340 g Cristal Amarillo recibido (Sr. Curiosidades) +0347 g Todos los objetos recibidos (Sr. Curiosidades) 0787 i Más PP encontrado en Lago Valor seco 2507 s Participado en las capturas del Parque Compi 0325 r Grieta de Dialga/Palkia visible diff --git a/PKHeX.Core/Resources/text/script/gen4/flags_pt_fr.txt b/PKHeX.Core/Resources/text/script/gen4/flags_pt_fr.txt index e708afccf..c4ba976dd 100644 --- a/PKHeX.Core/Resources/text/script/gen4/flags_pt_fr.txt +++ b/PKHeX.Core/Resources/text/script/gen4/flags_pt_fr.txt @@ -43,6 +43,7 @@ 2410 a Rang Master en Catégorie Grâce 2411 a Rang Master en Catégorie Intelligence 2412 a Rang Master en Catégorie Robustesse +2444 a Connexion à la Connexion Wi-Fi Nintendo réussie 0329 r Motisma Capturé 0635 s Fantôme du Majordome Rencontré au Vieux Château 0636 s Fantôme de la Fillette Rencontré au Vieux Château @@ -76,6 +77,18 @@ 0134 g Échange Interne Mustébouée Contre Pijako (Vestigion) 0244 g Échange Interne Charmina Contre Spectrum (Frimapic) 0245 g Échange Interne Écayon Contre Magicarpe (Route 226) +0330 g Globe Terrestre reçu (Rico Lexion) +0331 g Statue Arène reçue (Rico Lexion) +0332 g Coupe Grâce reçue (Rico Lexion) +0333 g Coupe Sang-froid reçue (Rico Lexion) +0334 g Coupe Beauté reçue (Rico Lexion) +0335 g Coupe Robustesse reçue (Rico Lexion) +0336 g Coupe Intelligence reçue (Rico Lexion) +0337 g Cristal Bleu reçu (Rico Lexion) +0338 g Cristal Rose reçu (Rico Lexion) +0339 g Cristal Rouge reçu (Rico Lexion) +0340 g Cristal Jaune reçu (Rico Lexion) +0347 g Tous les articles reçus (Rico Lexion) 0787 i PV Plus Trouvé au Lac Vérité Séché 2507 s Est Entré au Show Capture du Parc des Amis 0325 r Les Failles de Dialga/Palkia Peuvent Apparaître diff --git a/PKHeX.Core/Resources/text/script/gen4/flags_pt_ja.txt b/PKHeX.Core/Resources/text/script/gen4/flags_pt_ja.txt index dd17c7821..9e076c60f 100644 --- a/PKHeX.Core/Resources/text/script/gen4/flags_pt_ja.txt +++ b/PKHeX.Core/Resources/text/script/gen4/flags_pt_ja.txt @@ -43,6 +43,7 @@ 2410 a かわいさコンテスト マスターランク優勝 2411 a かしこさコンテスト マスターランク優勝 2412 a たくましさコンテスト マスターランク優勝 +2444 a ニンテンドーWi-Fiコネクションに接続しました 0329 r ロトム捕獲済み 0635 s もりのようかんで幽霊の執事に遭遇した 0636 s もりのようかんで幽霊の少女に遭遇した @@ -76,6 +77,18 @@ 0134 g ハクタイシティでペラップ交換済み 0244 g キッサキシティでゴースト(かわらずのいし)交換済み 0245 g 226ばんすいどうでコイキング交換済み +0330 g ちきゅうぎ受け取り済み(ミスター・グッズ) +0331 g ジムのせきぞう受け取り済み(ミスター・グッズ) +0332 g かわいいカップ受け取り済み(ミスター・グッズ) +0333 g かっこいいカップ受け取り済み(ミスター・グッズ) +0334 g うつくしいカップ受け取り済み(ミスター・グッズ) +0335 g たくましいカップ受け取り済み(ミスター・グッズ) +0336 g かしこいカップ受け取り済み(ミスター・グッズ) +0337 g あおいすいしょう受け取り済み(ミスター・グッズ) +0338 g ピンクすいしょう受け取り済み(ミスター・グッズ) +0339 g あかいすいしょう受け取り済み(ミスター・グッズ) +0340 g きいろすいしょう受け取り済み(ミスター・グッズ) +0347 g 全グッズ 受け取り済み(ミスター・グッズ) 0787 i リッシこでマックスアップ入手済み 2507 s ほかくショーに参加した 0325 r ディアルガ/パルキアの裂け目が出現する diff --git a/PKHeX.Core/Resources/text/script/gen4/flags_pt_ko.txt b/PKHeX.Core/Resources/text/script/gen4/flags_pt_ko.txt index ad10e239b..4ed70ed96 100644 --- a/PKHeX.Core/Resources/text/script/gen4/flags_pt_ko.txt +++ b/PKHeX.Core/Resources/text/script/gen4/flags_pt_ko.txt @@ -43,6 +43,7 @@ 2410 a 귀여움콘테스트 마스터 2411 a 슬기로움콘테스트 마스터 2412 a 강인함콘테스트 마스터 +2444 a 닌텐도 Wi-Fi 커넥션에 접속함 0329 r 로토무 잡음 0635 s 숲의양옥집에서 유령 집사 만남 0636 s 숲의양옥집에서 유령 소녀 만남 @@ -76,6 +77,18 @@ 0134 g 영원시티에서 교환했다 0244 g 선단시티에서 교환했다 0245 g 226번도로에서 교환했다 +0330 g 지구본 받음 (미스터 굿즈) +0331 g 체육관석상 받음 (미스터 굿즈) +0332 g 귀여운 컵 받음 (미스터 굿즈) +0333 g 근사한 컵 받음 (미스터 굿즈) +0334 g 아름다운 컵 받음 (미스터 굿즈) +0335 g 갖인한 컵 받음 (미스터 굿즈) +0336 g 슬기로운 컵 받음 (미스터 굿즈) +0337 g 파랑수정 받음 (미스터 굿즈) +0338 g 분홍수정 받음 (미스터 굿즈) +0339 g 빨갖수정 받음 (미스터 굿즈) +0340 g 노랑수정 받음 (미스터 굿즈) +0347 g 모두 상품 받음 (미스터 굿즈) 0787 i 마른 입지호수에서 맥스업 찾음 2507 s 팔파크 잡기쇼에 들어갔어 0325 r 디아루가/펄기아 균열 소환 가능 diff --git a/PKHeX.Core/Resources/text/script/gen4/flags_pt_zh-Hans.txt b/PKHeX.Core/Resources/text/script/gen4/flags_pt_zh-Hans.txt index b37b4f7bd..e5bdf4f7b 100644 --- a/PKHeX.Core/Resources/text/script/gen4/flags_pt_zh-Hans.txt +++ b/PKHeX.Core/Resources/text/script/gen4/flags_pt_zh-Hans.txt @@ -43,6 +43,7 @@ 2410 a 可爱华丽大赛大师 2411 a 聪明华丽大赛大师 2412 a 强壮华丽大赛大师 +2444 a 已连接至任天堂Wi-Fi连接 0329 r 获得洛托姆 0635 s 在森之洋馆遇到管家幽灵 0636 s 在森之洋馆遇到小女孩幽灵 @@ -76,6 +77,18 @@ 0134 g 在百代市交换了聒噪鸟 0244 g 在雪峰市交换了鬼斯通 0245 g 在226号水路交换了鲤鱼王 +0330 g 已获得地球仪(商品大叔) +0331 g 已获得道馆雕塑(商品大叔) +0332 g 已获得可爱奖杯(商品大叔) +0333 g 已获得帅气奖杯(商品大叔) +0334 g 已获得美丽奖杯(商品大叔) +0335 g 已获得强壮奖杯(商品大叔) +0336 g 已获得聪明奖杯(商品大叔) +0337 g 已获得蓝色水晶(商品大叔) +0338 g 已获得粉红色水晶(商品大叔) +0339 g 已获得红色水晶(商品大叔) +0340 g 已获得黄色水晶(商品大叔) +0347 g 已获得全部物品(商品大叔) 0787 i 在干涸的立志湖找到HP增强剂 2507 s 进入伙伴公园捕获活动 0325 r 帝牙卢卡/帕路奇亚裂缝已生成 diff --git a/PKHeX.Core/Resources/text/script/gen4/flags_pt_zh-Hant.txt b/PKHeX.Core/Resources/text/script/gen4/flags_pt_zh-Hant.txt index ad5d13d9c..7e4e5f921 100644 --- a/PKHeX.Core/Resources/text/script/gen4/flags_pt_zh-Hant.txt +++ b/PKHeX.Core/Resources/text/script/gen4/flags_pt_zh-Hant.txt @@ -43,6 +43,7 @@ 2410 a 可愛華麗大賽大師 2411 a 聰明華麗大賽大師 2412 a 強壯華麗大賽大師 +2444 a 已連線上网天堂Wi-Fi連接 0329 r 獲得洛托姆 0635 s 在森之洋館遇到管家幽靈 0636 s 在森之洋館遇到小女孩幽靈 @@ -76,6 +77,18 @@ 0134 g 在百代市交換了聒噪鳥 0244 g 在雪峰市交換了鬼斯通 0245 g 在226號水路交換了鯉魚王 +0330 g 已获得地球儀(商品大叔) +0331 g 已获得道館雕塑(商品大叔) +0332 g 已获得可愛獎盃(商品大叔) +0333 g 已获得帥氣獎盃(商品大叔) +0334 g 已获得美麗獎盃(商品大叔) +0335 g 已获得強壯獎盃(商品大叔) +0336 g 已获得聰明獎盃(商品大叔) +0337 g 已获得藍色水晶(商品大叔) +0338 g 已获得粉紅色水晶(商品大叔) +0339 g 已获得紅色水晶(商品大叔) +0340 g 已获得黃色水晶(商品大叔) +0347 g 已獲得全部物品(商品大叔) 0787 i 在乾涸的立志湖找到HP增強劑 2507 s 進入夥伴公園捕獲活動 0325 r 帝牙盧卡/帕路奇亞裂縫已生成 diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index 3dea3d382..17ae2f95e 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -36,7 +36,7 @@ SAV_HallOfFame3=Ruhmeshallen-Editor SAV_HallOfFame7=Ruhmeshallen-Ansicht SAV_HoneyTree=Honigbaum-Editor SAV_Inventory=Inventar-Editor -SAV_JoinAvenue=Einklangspassage +SAV_JoinAvenue=Einklangspassage-Editor SAV_Link6=Pokémon-Link-Tool SAV_MailBox=Briefbox-Editor SAV_Medals5=Medaillen @@ -424,7 +424,7 @@ Main.B_OpenGeonetEditor=Geonet Main.B_OpenHallofFame=Ruhmeshalle Main.B_OpenHoneyTreeEditor=Honigbaum Main.B_OpenItemPouch=Items -Main.B_OpenJoinAvenueEditor=Einklangspassage +Main.B_OpenJoinAvenueEditor=Einklangspass. Main.B_OpenLinkInfo=Pokémon-Link Main.B_OpenMedalsEditor=Medaillen Main.B_OpenMiscEditor=Sonstiges diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index 53356d4ca..18c2b2eca 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -36,7 +36,7 @@ SAV_HallOfFame3=Hall of Fame Viewer SAV_HallOfFame7=Hall of Fame Viewer SAV_HoneyTree=Honey Tree Editor SAV_Inventory=Inventory Editor -SAV_JoinAvenue=Join Avenue +SAV_JoinAvenue=Join Avenue Editor SAV_Link6=Pokémon Link Tool SAV_MailBox=MailBox Editor SAV_Medals5=Medals diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index 68f51f603..0f1649f2a 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -36,7 +36,7 @@ SAV_HallOfFame3=Visor del Salón de la Fama SAV_HallOfFame7=Visor del Salón de la Fama SAV_HoneyTree=Editor de Árbol de Miel SAV_Inventory=Editor de Inventario -SAV_JoinAvenue=Pasaje Unión +SAV_JoinAvenue=Editor de Pasaje Unión SAV_Link6=Editor del Nexo Pokémon SAV_MailBox=Editor de Buzón SAV_Medals5=Medallas @@ -1405,7 +1405,7 @@ SAV_JoinAvenue.L_BubbleTarget=Objetivo del globo de texto: SAV_JoinAvenue.L_CeilingColor=Color del cielo raso: SAV_JoinAvenue.L_Country=País: SAV_JoinAvenue.L_Date1=Fecha 1: -SAV_JoinAvenue.L_DateHall=Hall de la Fama: +SAV_JoinAvenue.L_DateHall=Salón de la Fama: SAV_JoinAvenue.L_DateStart=Inicio de la aventura: SAV_JoinAvenue.L_DesiredShopType=Tienda deseada: SAV_JoinAvenue.L_DexSeen=Pokédex vista: diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index 7b2c4521a..ba2b4ccf6 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -36,7 +36,7 @@ SAV_HallOfFame3=Visor del Hall de la Fama SAV_HallOfFame7=Visor del Hall de la Fama SAV_HoneyTree=Editor de Árbol de Miel SAV_Inventory=Editor de Inventario -SAV_JoinAvenue=Galería Unión +SAV_JoinAvenue=Editor de Galería Unión SAV_Link6=Editor del Nexo Pokémon SAV_MailBox=Editor de Buzón SAV_Medals5=Medallas diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index 8f39b0a5f..2ce4c37c3 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -36,7 +36,7 @@ SAV_HallOfFame3=Visualiseur Panthéon SAV_HallOfFame7=Visualiseur Panthéon SAV_HoneyTree=Éditeur d'arbres à miel SAV_Inventory=Éditeur de l'inventaire -SAV_JoinAvenue=Galerie Concorde +SAV_JoinAvenue=Éditeur de Galerie Concorde SAV_Link6=Outil Poké Lien SAV_MailBox=Éditeur de boîtes aux lettres SAV_Medals5=Médailles @@ -424,7 +424,7 @@ Main.B_OpenGeonetEditor=Géonet Main.B_OpenHallofFame=Panthéon Main.B_OpenHoneyTreeEditor=Arbres à miel Main.B_OpenItemPouch=Objets -Main.B_OpenJoinAvenueEditor=Galerie Concorde +Main.B_OpenJoinAvenueEditor=Gal. Concorde Main.B_OpenLinkInfo=Poké Lien Main.B_OpenMedalsEditor=Médailles Main.B_OpenMiscEditor=Éditeur divers diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index 11920a8fe..93ffdde32 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -36,7 +36,7 @@ SAV_HallOfFame3=Visualizzatore Sala d'Onore SAV_HallOfFame7=Visualizzatore Sala d'Onore SAV_HoneyTree=Editor Alberi di Miele SAV_Inventory=Editor Inventario -SAV_JoinAvenue=Galleria Solidarietà +SAV_JoinAvenue=Editor Galleria Solidarietà SAV_Link6=Strumenti Link SAV_MailBox=Editor Messaggi SAV_Medals5=Premi @@ -424,7 +424,7 @@ Main.B_OpenGeonetEditor=Geonet Main.B_OpenHallofFame=Sala d'Onore Main.B_OpenHoneyTreeEditor=Alberi di Miele Main.B_OpenItemPouch=Strumenti -Main.B_OpenJoinAvenueEditor=Galleria Solidarietà +Main.B_OpenJoinAvenueEditor=Gal. Solidarietà Main.B_OpenLinkInfo=Dati Link Main.B_OpenMedalsEditor=Premi Main.B_OpenMiscEditor=Mod. Varie diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index a2342716b..6e85adef9 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -1448,7 +1448,7 @@ SAV_JoinAvenue.L_ShopLevel=店レベル: SAV_JoinAvenue.L_ShopType=店タイプ: SAV_JoinAvenue.L_ShopWork=店作業: SAV_JoinAvenue.L_Shout=ひとこと: -SAV_JoinAvenue.L_Species=種族: +SAV_JoinAvenue.L_Species=ポケモン: SAV_JoinAvenue.L_Sprite=スプライト: SAV_JoinAvenue.L_Subregion=地域: SAV_JoinAvenue.L_TID16=トレーナーID: diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index d84f80ebd..faf8480db 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -36,7 +36,7 @@ SAV_HallOfFame3=전당등록 편집 도구 SAV_HallOfFame7=전당등록 편집 도구 SAV_HoneyTree=꿀바른 나무 편집 도구 SAV_Inventory=인벤토리 편집 도구 -SAV_JoinAvenue=조인애버뉴 +SAV_JoinAvenue=조인애버뉴 편집 도구 SAV_Link6=포켓몬 링크 도구 SAV_MailBox=메일박스 편집 도구 SAV_Medals5=메달 @@ -1448,7 +1448,7 @@ SAV_JoinAvenue.L_ShopLevel=점포 레벨: SAV_JoinAvenue.L_ShopType=점포 종류: SAV_JoinAvenue.L_ShopWork=점포 작업: SAV_JoinAvenue.L_Shout=외침: -SAV_JoinAvenue.L_Species=종족: +SAV_JoinAvenue.L_Species=종류: SAV_JoinAvenue.L_Sprite=스프라이트: SAV_JoinAvenue.L_Subregion=하위 지역: SAV_JoinAvenue.L_TID16=트레이너 ID: diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index 714bfee3c..25eea434a 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -36,7 +36,7 @@ SAV_HallOfFame3=名人堂 SAV_HallOfFame7=名人堂 SAV_HoneyTree=甜甜蜜树编辑 SAV_Inventory=物品栏 -SAV_JoinAvenue=汇合大道 +SAV_JoinAvenue=汇合大道编辑 SAV_Link6=宝可梦连接工具 SAV_MailBox=邮箱编辑 SAV_Medals5=奖牌 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index f80d99fe0..6ca203538 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -25,7 +25,7 @@ SAV_Encounters=遇見資料庫 SAV_EventFlags=事件旗標編輯 SAV_EventReset1=事件重置 SAV_EventWork=事件標誌編輯器 -SAV_Fashion9=Fashion Editor +SAV_Fashion9=時裝編輯器 SAV_FlagWork8b=事件標誌編輯器 SAV_FolderList=資料夾清單 SAV_Gear=裝扮配件編輯器 @@ -36,7 +36,7 @@ SAV_HallOfFame3=名人堂 SAV_HallOfFame7=名人堂 SAV_HoneyTree=甜甜蜜樹編輯 SAV_Inventory=物品欄 -SAV_JoinAvenue=匯合大道 +SAV_JoinAvenue=匯合大道編輯 SAV_Link6=寶可夢連接工具 SAV_MailBox=郵箱編輯 SAV_Medals5=獎牌 From 3009531289234c02fcb2516404940e971b5f51c8 Mon Sep 17 00:00:00 2001 From: Kurt Date: Mon, 25 May 2026 20:30:20 -0500 Subject: [PATCH 44/81] initial pokeathlon --- PKHeX.Core/Saves/Pokeathlon4.cs | 612 ++++++++++++++++++ PKHeX.Core/Saves/SAV4.cs | 1 - PKHeX.Core/Saves/SAV4DP.cs | 1 - PKHeX.Core/Saves/SAV4HGSS.cs | 6 +- PKHeX.Core/Saves/SAV4Pt.cs | 1 - .../Subforms/Save Editors/Gen4/SAV_Misc4.cs | 4 +- 6 files changed, 616 insertions(+), 9 deletions(-) create mode 100644 PKHeX.Core/Saves/Pokeathlon4.cs diff --git a/PKHeX.Core/Saves/Pokeathlon4.cs b/PKHeX.Core/Saves/Pokeathlon4.cs new file mode 100644 index 000000000..d8236722e --- /dev/null +++ b/PKHeX.Core/Saves/Pokeathlon4.cs @@ -0,0 +1,612 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + + +namespace PKHeX.Core; + +/// +/// Manages the Pokeathlon Data for +/// +public class Pokeathlon4(Memory Raw) // 0xD9D4 within SAV4HGSS +{ + public const int SIZE = 0xB80; + + public Span Data => Raw.Span; + + // 5 courses to store record data + public PokeathlonCourseRecord4 GetCourseRecord(PokeathlonStat4 index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonStat4.MAX_COUNT); + return new(Raw.Slice((int)index * PokeathlonCourseRecord4.SIZE, PokeathlonCourseRecord4.SIZE)); + } + + // 0xDC, 0xDAB0 within SAV + public PokeathlonMedalManager4 Medals => new(Raw.Slice(0xDC, PokeathlonMedalManager4.SIZE)); + // 3 bytes alignment + + // 0x2CC, 0xDCA0 within SAV + public PokeathlonEventData4 GetEventSelf(PokeathlonEvent4 index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.MAX_COUNT); + return new(Raw.Slice(0x2CC + ((int)index * PokeathlonEventData4.SIZE), PokeathlonEventData4.SIZE)); + } + + // 0x484, 0xDE58 within SAV + public PokeathlonConnection4 GetEventConnection(PokeathlonEvent4 index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.MAX_COUNT); + return new(Raw.Slice(0x484 + ((int)index * PokeathlonConnection4.SIZE), PokeathlonConnection4.SIZE)); + } + + // 0xAEC, 0xE4C0 within SAV + + /// + /// Player's highest score for each of the ten individual events (after conversion to Athlete Points) + /// + public ushort GetBestScore(PokeathlonEvent4 index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.MAX_COUNT); + return ReadUInt16LittleEndian(Data[(0xAEC + ((int)index * 2))..]); + } + + public void SetBestScore(PokeathlonEvent4 index, ushort score) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.MAX_COUNT); + WriteUInt16LittleEndian(Data[(0xAEC + ((int)index * 2))..], score); + } + + // 0xB00, 0xE4D4 within SAV global counters + public PokeathlonGlobalCounters4 GlobalCounters => new(Raw.Slice(0xB00, PokeathlonGlobalCounters4.SIZE)); + + // remainder @ 0xE548 + public const uint MaxPoints = 99_999; + + /// + /// Current points count accumulated, used in buying items from shops. + /// + public uint Points { get => ReadUInt32LittleEndian(Data[0xB74..]); set => WriteUInt32LittleEndian(Data[0xB74..], Math.Min(MaxPoints, value)); } + + /// + /// Obtained Data Card indexes [0,26], where each bit represents whether a Data Card has been obtained or not. + /// They can be purchased in exchange for points in the Pokéathlon Dome (sold at the central reception desk). + /// + public uint FlagsDataCard { get => ReadUInt32LittleEndian(Data[0xB78..]); set => WriteUInt32LittleEndian(Data[0xB78..], Math.Min(DataCardAllObtained, value)); } + + // items exist as Key Items, not really advisable to have a one-shot method unlock, end-user implementation beware. + public const uint DataCardAllObtained = 0x07FFFFFFu; // 27 bits, all obtained + + /// + /// Once-daily shop purchase flags for the Athlete Shop. + /// Since shops only have 12 items daily, only 12 bits are used. + /// + public ushort FlagsDailyShop { get => ReadUInt16LittleEndian(Data[0xB7C..]); set => WriteUInt16LittleEndian(Data[0xB7C..], Math.Min(FlagsShopAllObtained, value)); } + public const ushort FlagsShopAllObtained = 0x0FFF; // 12 bits, all obtained + + // last 2 bytes unused, total size 0xB80 + + /// + /// The global Pokéathlon score is calculated as the sum of: + /// - the player's best final score in each of the five courses, + /// - the player's highest score for each of the ten individual events (after conversion to Athlete Points), + /// - the total number of medals displayed in the box in the Trust room (so each Medalist species will add five to this total). + /// + public uint CalculateGlobalScore() + { + uint result = 0; + for (PokeathlonStat4 i = 0; i < PokeathlonStat4.MAX_COUNT; i++) + result += GetCourseRecord(i).ScoreMax; + result += Medals.GetTotalCount(); + for (PokeathlonEvent4 i = 0; i < PokeathlonEvent4.MAX_COUNT; i++) + result += GetBestScore(i); + return result; + } + + public static ReadOnlySpan FriendshipTrophyThresholds => [3000, 3100, 3200, 3300, 3400, 3600, 3800, 4000, 4200, 4500]; + + public static int CalculateFriendshipTrophyCount(uint globalScore) + { + int result = 0; + foreach (var threshold in FriendshipTrophyThresholds) + { + if (globalScore >= threshold) + result++; + else + break; + } + return result; // 10 max + } +} + +public struct PokeathlonCourseRecord4(Memory Raw) +{ + public const int SIZE = 0x2C; + + private Span Data => Raw.Span; + + public ushort Score0 { get => ReadUInt16LittleEndian(Data); set => WriteUInt16LittleEndian(Data, value); } + public ushort Score1 { get => ReadUInt16LittleEndian(Data[2..]); set => WriteUInt16LittleEndian(Data[2..], value); } + public ushort Score2 { get => ReadUInt16LittleEndian(Data[4..]); set => WriteUInt16LittleEndian(Data[4..], value); } + public ushort ScoreMax { get => ReadUInt16LittleEndian(Data[6..]); set => WriteUInt16LittleEndian(Data[6..], value); } + + public const int CountParticipant = 3; + + public PokeathlonParticipant4 GetParticipant(int index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, CountParticipant); + return new(Raw.Slice(8 + (index * PokeathlonParticipant4.SIZE), PokeathlonParticipant4.SIZE)); + } +} + +public struct PokeathlonParticipant4(Memory Raw) : ISpeciesForm, ITrainerID32, IFixedGender, IShiny +{ + public const int SIZE = 0xC; + + private Span Data => Raw.Span; + + private uint Packed { get => ReadUInt32LittleEndian(Data); set => WriteUInt32LittleEndian(Data, value); } + public ushort Species { get => (ushort)(Packed & 0x1FF); set => Packed = (Packed & ~0x1FFu) | ((uint)value & 0x1FF); } + public byte Form { get => (byte)((Packed >> 9) & 0x1F); set => Packed = (Packed & ~(0x1Fu << 9)) | (((uint)value & 0x1F) << 9); } + public byte Gender { get => (byte)((Packed >> 14) & 0x3); set => Packed = (Packed & ~(0x3u << 14)) | (((uint)value & 0x3) << 14); } + public bool IsShiny { get => ((Packed >> 16) & 0x1) != 0; set => Packed = (Packed & ~(0x1u << 16)) | ((value ? 1u : 0u) << 16); } + // remainder of bits unused + + /// + public uint EncryptionConstant { get => ReadUInt32LittleEndian(Data[4..]); set => WriteUInt32LittleEndian(Data[4..], value); } + + /// + public uint ID32 { get => ReadUInt32LittleEndian(Data[8..]); set => WriteUInt32LittleEndian(Data[8..], value); } + public ushort TID16 { get => ReadUInt16LittleEndian(Data[8..]); set => WriteUInt16LittleEndian(Data[8..], value); } + public ushort SID16 { get => ReadUInt16LittleEndian(Data[10..]); set => WriteUInt16LittleEndian(Data[10..], value); } + public TrainerIDFormat TrainerIDDisplayFormat => TrainerIDFormat.SixteenBit; +} + +/// +/// Stores a bitflag medal completion state for all species. +/// +/// +/// for bitflag indexes. +/// +public struct PokeathlonMedalManager4(Memory Raw) +{ + public const int SIZE = 493; // 1-indexed species [Bulbasaur..Arceus] + public const byte MaxMedalBits = 0b11111; // 5 courses, 5 bits per species + + public Span Data => Raw.Span; + + /// + /// Retrieves the medal bits for the given species, where each bit represents whether a medal for a particular course has been obtained or not. + /// + public byte GetMedal(ushort species) + { + species--; + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(species, (ushort)Legal.MaxSpeciesID_4); + return Data[species]; + } + + /// + /// Updates the medal bits for the given species. + /// + public void SetMedal(ushort species, byte medalBits) + { + species--; + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(species, (ushort)Legal.MaxSpeciesID_4); + Data[species] = medalBits; + } + + /// + /// Awards the provided bit(s) to the species. + /// + public void AwardMedal(ushort species, byte medalBit) + { + species--; + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(species, (ushort)Legal.MaxSpeciesID_4); + Data[species] |= medalBit; + } + + /// + /// Awards all medals to all species (complete). + /// + /// Medal value to set to every species entry. + public void SetAllMedals(byte medalBits = MaxMedalBits) => Data[..SIZE].Fill(medalBits); + + /// + /// Removes all medals from all species (resets progress). + /// + public void Clear() => SetAllMedals(0); + + public uint GetTotalCount() + { + uint result = 0; + foreach (var bits in Data[..SIZE]) + result += (uint)System.Numerics.BitOperations.PopCount((uint)bits & MaxMedalBits); + return result; + } +} + +public struct PokeathlonEventData4(Memory Raw) +{ + public const int SIZE = 0x2C; + public const uint MaxAttempts = 9_999_999; + public const uint MaxRecord = 5; + + public Span Data => Raw.Span; + + public PokeathlonEventRecord4 GetRecord(int index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, MaxRecord); + return new(Raw.Slice(index * PokeathlonEventRecord4.SIZE, PokeathlonEventRecord4.SIZE)); + } + + public uint Attempts { get => ReadUInt32LittleEndian(Data[0x28..]); set => WriteUInt32LittleEndian(Data[0x28..], Math.Min(MaxAttempts, value)); } +} + +public struct PokeathlonConnection4(Memory Raw) +{ + public const int SIZE = 0xA4; + + public const uint MaxTrainer = PokeathlonEventData4.MaxRecord; + + public Span Data => Raw.Span; + + public PokeathlonEventData4 Inner => new(Raw.Slice(0 * PokeathlonEventData4.SIZE, PokeathlonEventData4.SIZE)); + + public PokeathlonEventTrainer4 GetTrainer(int index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, MaxTrainer); + return new(Raw.Slice(0x2C + (index * PokeathlonEventTrainer4.SIZE), PokeathlonEventTrainer4.SIZE)); + } +} + +public struct PokeathlonEventTrainer4(Memory Raw) : ITrainerID32 +{ + public const int SIZE = 0x18; + public Span Data => Raw.Span; + public uint ID32 { get => ReadUInt32LittleEndian(Data); set => WriteUInt32LittleEndian(Data, value); } + public ushort TID16 { get => ReadUInt16LittleEndian(Data); set => WriteUInt16LittleEndian(Data, value); } + public ushort SID16 { get => ReadUInt16LittleEndian(Data[2..]); set => WriteUInt16LittleEndian(Data[2..], value); } + public TrainerIDFormat TrainerIDDisplayFormat => TrainerIDFormat.SixteenBit; + + public Span OriginalTrainerTrash => Data.Slice(8, 8 * sizeof(ushort)); + + public byte Language { get => Data[0x14]; set => Data[0x14] = value; } + // remaining 3 bytes unused + + public string OT + { + get => StringConverter4.GetString(OriginalTrainerTrash); + set => StringConverter4.SetString(OriginalTrainerTrash, value, 7, Language); + } +} + +/// +/// Event record storage for a given event type. +/// +/// +/// +/// +/// +public struct PokeathlonEventRecord4(Memory Raw) +{ + public const int SIZE = 8; + + public Span Data => Raw.Span; + + /// + /// Stores the record for the particular event. The meaning of this value depends on the event type. + /// + /// + /// Hurdle Dash: Time in frames (lower is better). + /// + public ushort Record { get => ReadUInt16LittleEndian(Data); set => WriteUInt16LittleEndian(Data, value); } + + // team of three Pokémon responsible for this record, simply (species,form)*3. + public SpeciesForm10 Entry0 { get => ReadUInt16LittleEndian(Data[2..]); set => WriteUInt16LittleEndian(Data[2..], value); } + public SpeciesForm10 Entry1 { get => ReadUInt16LittleEndian(Data[4..]); set => WriteUInt16LittleEndian(Data[4..], value); } + public SpeciesForm10 Entry2 { get => ReadUInt16LittleEndian(Data[6..]); set => WriteUInt16LittleEndian(Data[6..], value); } +} + +public record struct SpeciesForm10(ushort Value) : ISpeciesForm +{ + // 10 bits species + public ushort Species { get => (ushort)(Value & 0x3FF); set => Value = (ushort)((Value & ~0x3FF) | (value & 0x3FF)); } + public byte Form { get => (byte)((Value >> 10) & 0x3F); set => Value = (ushort)((Value & ~(0x3Fu << 10)) | ((((uint)value & 0x3F) << 10))); } + + /// + /// Useful sanity check. + /// + public bool IsValid => Value is 0 || (Species != 0 && PersonalTable.HGSS.IsPresentInGame(Species, Form)); + + public static implicit operator SpeciesForm10(ushort value) => new(value); + public static implicit operator ushort(SpeciesForm10 value) => value.Value; +} + +public struct PokeathlonGlobalCounters4(Memory Raw) +{ + public const int SIZE = 0x74; + public Span Data => Raw.Span; + + public const uint MaxPlay = 59_999; + public const uint MaxStat = 9_999_999; + public const uint MaxFame = ushort.MaxValue; + + /// Time Spent in Pokéathlon, in minutes + public uint TimeSpent { get => ReadUInt32LittleEndian(Data); set => WriteUInt32LittleEndian(Data, Math.Min(MaxPlay, value)); } + + public uint SessionsJoined { get => ReadUInt32LittleEndian(Data[0x04..]); set => WriteUInt32LittleEndian(Data[0x04..], Math.Min(MaxStat, value)); } + public uint PlacedFirst { get => ReadUInt32LittleEndian(Data[0x08..]); set => WriteUInt32LittleEndian(Data[0x08..], Math.Min(MaxStat, value)); } + public uint PlacedLast { get => ReadUInt32LittleEndian(Data[0x0C..]); set => WriteUInt32LittleEndian(Data[0x0C..], Math.Min(MaxStat, value)); } + + /// + /// Bonuses Earned + /// + public uint BonusesEarned { get => ReadUInt32LittleEndian(Data[0x10..]); set => WriteUInt32LittleEndian(Data[0x10..], Math.Min(MaxStat, value)); } + + /// + /// Pokémon Instructions + /// + public uint Instructions { get => ReadUInt32LittleEndian(Data[0x14..]); set => WriteUInt32LittleEndian(Data[0x14..], Math.Min(MaxStat, value)); } + public uint Failed { get => ReadUInt32LittleEndian(Data[0x18..]); set => WriteUInt32LittleEndian(Data[0x18..], Math.Min(MaxStat, value)); } + public uint Jumped { get => ReadUInt32LittleEndian(Data[0x1C..]); set => WriteUInt32LittleEndian(Data[0x1C..], Math.Min(MaxStat, value)); } + public uint Acquired { get => ReadUInt32LittleEndian(Data[0x20..]); set => WriteUInt32LittleEndian(Data[0x20..], Math.Min(MaxStat, value)); } + public uint Tackled { get => ReadUInt32LittleEndian(Data[0x24..]); set => WriteUInt32LittleEndian(Data[0x24..], Math.Min(MaxStat, value)); } + public uint FellDown { get => ReadUInt32LittleEndian(Data[0x28..]); set => WriteUInt32LittleEndian(Data[0x28..], Math.Min(MaxStat, value)); } + public uint Dashed { get => ReadUInt32LittleEndian(Data[0x2C..]); set => WriteUInt32LittleEndian(Data[0x2C..], Math.Min(MaxStat, value)); } + public uint Switched { get => ReadUInt32LittleEndian(Data[0x30..]); set => WriteUInt32LittleEndian(Data[0x30..], Math.Min(MaxStat, value)); } + public uint SelfImpeded { get => ReadUInt32LittleEndian(Data[0x34..]); set => WriteUInt32LittleEndian(Data[0x34..], Math.Min(MaxStat, value)); } + + public uint ConnectionJoined { get => ReadUInt32LittleEndian(Data[0x38..]); set => WriteUInt32LittleEndian(Data[0x38..], Math.Min(MaxStat, value)); } + public uint ConnectionFirst { get => ReadUInt32LittleEndian(Data[0x3C..]); set => WriteUInt32LittleEndian(Data[0x3C..], Math.Min(MaxStat, value)); } + public uint ConnectionLast { get => ReadUInt32LittleEndian(Data[0x40..]); set => WriteUInt32LittleEndian(Data[0x40..], Math.Min(MaxStat, value)); } + + // Per-event 1st-place counters + public uint this[PokeathlonEvent4 index] + { + get + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.MAX_COUNT); + return ReadUInt32LittleEndian(Data[(0x44 + ((int)index * 4))..]); + } + set + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.MAX_COUNT); + WriteUInt32LittleEndian(Data[(0x44 + ((int)index * 4))..], Math.Min(MaxStat, value)); + } + } + + // helper to calculate + public uint TotalEventFirst + { + get + { + uint total = 0; + for (PokeathlonEvent4 i = 0; i < PokeathlonEvent4.MAX_COUNT; i++) + total += this[i]; + return total; + } + } + + // Aggregate event last-place total + public uint TotalEventLast { get => ReadUInt32LittleEndian(Data[0x6C..]); set => WriteUInt32LittleEndian(Data[0x6C..], Math.Min(MaxStat, value)); } + + /// + /// When the player plays the Pokéathlon over wireless play the default drinks will be replaced with the drinks of the opposing player. + /// The price of the drinks are determined on how famous the Trainers selling them are. + /// + /// + /// + /// + public uint Fame { get => ReadUInt32LittleEndian(Data[0x70..]); set => WriteUInt32LittleEndian(Data[0x70..], Math.Min(MaxFame, value)); } + + /// + /// Retrieves the value of a particular statistic for Data Card purposes, based on the provided stat identifier. + /// + public uint GetDataCardStat(DataCard4 stat) => stat switch + { + DataCard4.PlacedFirst => this.PlacedFirst, + DataCard4.PlacedLast => this.PlacedLast, + DataCard4.Dashed => this.Dashed, + DataCard4.Jumped => this.Jumped, + DataCard4.FirstHurdle => this[PokeathlonEvent4.HurdleDash], + DataCard4.FirstRelay => this[PokeathlonEvent4.RelayRun], + DataCard4.FirstPennant => this[PokeathlonEvent4.PennantCapture], + DataCard4.FirstBlockSmash => this[PokeathlonEvent4.BlockSmash], + DataCard4.FirstDiscCatch => this[PokeathlonEvent4.DiscCatch], + DataCard4.FirstSnowThrow => this[PokeathlonEvent4.SnowThrow], + DataCard4.PointsAcquired => this.Acquired, + DataCard4.Failed => this.Failed, + DataCard4.SelfImpeded => this.SelfImpeded, + DataCard4.Tackled => this.Tackled, + DataCard4.FellDown => this.FellDown, + DataCard4.FirstRingDrop => this[PokeathlonEvent4.RingDrop], + DataCard4.FirstLampJump => this[PokeathlonEvent4.LampJump], + DataCard4.FirstCirclePush => this[PokeathlonEvent4.CirclePush], + DataCard4.ConnectionFirst => this.ConnectionFirst, + DataCard4.ConnectionLast => this.ConnectionLast, + DataCard4.EventFirst => this.TotalEventFirst, // aggregate event first-place total is not stored, but can be calculated by summing per-event counters + DataCard4.EventLast => this.TotalEventLast, + DataCard4.Switched => this.Switched, + DataCard4.FirstGoalRoll => this[PokeathlonEvent4.GoalRoll], + DataCard4.BonusesEarned => this.BonusesEarned, + DataCard4.Instructions => this.Instructions, + DataCard4.TimeSpent => this.TimeSpent, + _ => throw new ArgumentOutOfRangeException(nameof(stat), stat, null), + }; + + /// + /// Updates the value of a particular statistic for Data Card purposes, based on the provided stat identifier. + /// + public void SetDataCardStat(DataCard4 stat, uint value) + { + value = Math.Min(MaxStat, value); + switch (stat) + { + case DataCard4.PlacedFirst: this.PlacedFirst = value; break; + case DataCard4.PlacedLast: this.PlacedLast = value; break; + case DataCard4.Dashed: this.Dashed = value; break; + case DataCard4.Jumped: this.Jumped = value; break; + case DataCard4.FirstHurdle: this[PokeathlonEvent4.HurdleDash] = value; break; + case DataCard4.FirstRelay: this[PokeathlonEvent4.RelayRun] = value; break; + case DataCard4.FirstPennant: this[PokeathlonEvent4.PennantCapture] = value; break; + case DataCard4.FirstBlockSmash: this[PokeathlonEvent4.BlockSmash] = value; break; + case DataCard4.FirstDiscCatch: this[PokeathlonEvent4.DiscCatch] = value; break; + case DataCard4.FirstSnowThrow: this[PokeathlonEvent4.SnowThrow] = value; break; + case DataCard4.PointsAcquired: this.Acquired = value; break; + case DataCard4.Failed: this.Failed = value; break; + case DataCard4.SelfImpeded: this.SelfImpeded = value; break; + case DataCard4.Tackled: this.Tackled = value; break; + case DataCard4.FellDown: this.FellDown = value; break; + case DataCard4.FirstRingDrop: this[PokeathlonEvent4.RingDrop] = value; break; + case DataCard4.FirstLampJump: this[PokeathlonEvent4.LampJump] = value; break; + case DataCard4.FirstCirclePush: this[PokeathlonEvent4.CirclePush] = value; break; + case DataCard4.ConnectionFirst: this.ConnectionFirst = value; break; + case DataCard4.ConnectionLast: this.ConnectionLast = value; break; + case DataCard4.EventFirst: + return; // skip, not going to spread the count across all 10 events + case DataCard4.EventLast: this.TotalEventLast = value; break; + case DataCard4.Switched: this.Switched = value; break; + case DataCard4.FirstGoalRoll: this[PokeathlonEvent4.GoalRoll] = value; break; + case DataCard4.BonusesEarned: this.BonusesEarned = value; break; + case DataCard4.Instructions: this.Instructions = value; break; + case DataCard4.TimeSpent: this.TimeSpent = value; break; + default: throw new ArgumentOutOfRangeException(nameof(stat), stat, null); + } + } + + public static ReadOnlySpan FameInclusiveThreshold => [10, 25, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000]; + + /// + /// Used to evaluate the fame level of a given trainer, ratcheting up/down based on how much fame has been aggregated. + /// + /// Player fame value + /// Value [0,12] + public static int GetFameLevel(uint value) + { + int level = 0; + foreach (var threshold in FameInclusiveThreshold) + { + if (value <= threshold) + break; + level++; + } + return level; // 12 max + } + + // disassembly also calculates fame for NPCs by summing all performance stats of their team, then (sum/3)-8, clamped [0,12]. +} +public struct Aprijuice5(Memory Raw) +{ + public Span Data => Raw.Span; + + /// + /// The price of drinks are determined by how famous the Trainers selling them are. + /// + /// + /// + /// + public ushort Fame { get => ReadUInt16LittleEndian(Data); set => WriteUInt16LittleEndian(Data, value); } + + // Every 100 steps taken increases the mildness of an Aprijuice by 1, up to a maximum of 255. + // Any mildness increases are made before the mixing of new Apricorns into the Aprijuice is performed. + public byte Mildness { get => Data[2]; set => Data[2] = value; } + + // Each flavor is capped at a maximum of 63 points and a minimum of 0. + public byte Spicy { get => Data[3]; set => Data[3] = value; } + public byte Sour { get => Data[4]; set => Data[4] = value; } + public byte Dry { get => Data[5]; set => Data[5] = value; } + public byte Bitter { get => Data[6]; set => Data[6] = value; } + public byte Sweet { get => Data[7]; set => Data[7] = value; } + + public const ushort LevelMax = 100; + + public byte CalculateLevel() + { + var level = Spicy + Sour + Dry + Bitter + Sweet; + return (byte)Math.Clamp(level, 0, LevelMax); // never will see 0 unless it's hacked :) + } + + public const ushort PriceMin = 100; + public const ushort PriceMax = 5000; + + public ushort CalculatePrice() + { + var level = CalculateLevel(); + var price = (Fame / 10) + (level / 2); + return (ushort)Math.Clamp(price, PriceMin, PriceMax); + } + + // When a Pokémon is put into a PC box, all effects of an Aprijuice disappear. +} + +/// +/// Performance stats +/// +public enum PokeathlonStat4 : byte +{ + Speed = 0, + Power = 1, + Skill = 2, + Stamina = 3, + Jump = 4, + + MAX_COUNT = 5, +} + +public enum PokeathlonEvent4 : byte +{ + HurdleDash = 0, + PennantCapture = 1, + CirclePush = 2, + BlockSmash = 3, + DiscCatch = 4, + LampJump = 5, + RelayRun = 6, + RingDrop = 7, + SnowThrow = 8, + GoalRoll = 9, + + MAX_COUNT = 10, +} + +/// +/// Data Card indexes and the stats they retrieve in . +/// +public enum DataCard4 : byte +{ + PlacedFirst = 0, // Pokéathlon 1st Place + PlacedLast = 1, // Pokéathlon Last Place + Dashed = 2, // Times Pokémon Dashed + Jumped = 3, // Times Pokémon Jumped + + FirstHurdle = 4, // Hurdle Dash 1st Places + FirstRelay = 5, // Relay Run 1st Places + FirstPennant = 6, // Pennant Capture 1st Places + FirstBlockSmash = 7, // Block Smash 1st Places + FirstDiscCatch = 8, // Disc Catch 1st Places + FirstSnowThrow = 9, // Snow Throw 1st Places + + PointsAcquired = 10, // Pokémon Acquired Points + Failed = 11, // Pokémon Failed + SelfImpeded = 12, // Times Pokémon Self-Impeded + Tackled = 13, // Times Pokémon Tackled + FellDown = 14, // Pokémon Fell Down + + FirstRingDrop = 15, // Ring Drop 1st Places + FirstLampJump = 16, // Lamp Jump 1st Places + FirstCirclePush = 17, // Circle Push 1st Places + + ConnectionFirst = 18, // Connection 1st Places + ConnectionLast = 19, // Connection Last Places + + EventFirst = 20, // Event 1st Places + EventLast = 21, // Event Last Places + + Switched = 22, // Times Pokémon Switched + + FirstGoalRoll = 23, // Goal Roll 1st Places + + BonusesEarned = 24, // Bonuses Earned + Instructions = 25, // Pokémon Instructions + TimeSpent = 26, // Time Spent in Pokéathlon + + MAX_COUNT = 27, +}; diff --git a/PKHeX.Core/Saves/SAV4.cs b/PKHeX.Core/Saves/SAV4.cs index c46087cd1..8619ad110 100644 --- a/PKHeX.Core/Saves/SAV4.cs +++ b/PKHeX.Core/Saves/SAV4.cs @@ -224,7 +224,6 @@ private int GetActiveExtraBlock(BlockInfo4 block) return active == -1 ? null : new Hall4(Buffer.Slice((active == 0 ? 0 : PartitionSize) + block.Offset, Hall4.SIZE_USED)); } - protected int WondercardFlags = int.MinValue; protected int AdventureInfo = int.MinValue; protected int Seal = int.MinValue; public int Geonet { get; protected set; } = int.MinValue; diff --git a/PKHeX.Core/Saves/SAV4DP.cs b/PKHeX.Core/Saves/SAV4DP.cs index be26da299..26c86edaa 100644 --- a/PKHeX.Core/Saves/SAV4DP.cs +++ b/PKHeX.Core/Saves/SAV4DP.cs @@ -61,7 +61,6 @@ private void GetSAVOffsets() OFS_Record = 0x5F08; OFS_Chatter = 0x61CC; Geonet = 0x96D8; - WondercardFlags = 0xA6D0; OFS_HONEY = 0x72E4; OFS_UG_Stats = 0x3A2C; OFS_UG_Items = 0x42B0; diff --git a/PKHeX.Core/Saves/SAV4HGSS.cs b/PKHeX.Core/Saves/SAV4HGSS.cs index d05523d71..c33453ab8 100644 --- a/PKHeX.Core/Saves/SAV4HGSS.cs +++ b/PKHeX.Core/Saves/SAV4HGSS.cs @@ -78,7 +78,6 @@ private void GetSAVOffsets() OFS_Chatter = 0x4E74; OFS_Groups = 0x440C; Geonet = 0x8D44; - WondercardFlags = 0x9D3C; Seal = 0x4E20; Box = 0; @@ -263,6 +262,8 @@ public void PokeGearUnlockAllCallersNoTrainers() PokeGearClearAllCallers(NotTrainers.Length); } + public Pokeathlon4 Pokeathlon => new(GeneralBuffer.Slice(0xD9D4, Pokeathlon4.SIZE)); // 0xB80 + // Apricorn Pouch public int GetApricornCount(int index) => General[0xE558 + index]; public void SetApricornCount(int index, int count) => General[0xE558 + index] = (byte)count; @@ -332,9 +333,6 @@ private Roamer4 GetRoamer(int index) var mem = GeneralBuffer.Slice(ofs, size); return new Roamer4(mem); } - - // Pokeathlon - public uint PokeathlonPoints { get => ReadUInt32LittleEndian(General[0xE548..]); set => WriteUInt32LittleEndian(General[0xE548..], value); } } public enum MapUnlockState4 : byte diff --git a/PKHeX.Core/Saves/SAV4Pt.cs b/PKHeX.Core/Saves/SAV4Pt.cs index 619316045..9b5e5f7c1 100644 --- a/PKHeX.Core/Saves/SAV4Pt.cs +++ b/PKHeX.Core/Saves/SAV4Pt.cs @@ -66,7 +66,6 @@ private void GetSAVOffsets() OFS_Record = 0x61B0; OFS_Chatter = 0x64EC; Geonet = 0xA4C4; - WondercardFlags = 0xB4C0; OFS_HONEY = 0x7F38; diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Misc4.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Misc4.cs index 30c397895..c616f709c 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Misc4.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Misc4.cs @@ -727,12 +727,12 @@ private void B_AllWalkerCourses_Click(object sender, EventArgs e) private void ReadPokeathlon(SAV4HGSS s) { - NUD_PokeathlonPoints.Value = s.PokeathlonPoints; + NUD_PokeathlonPoints.Value = s.Pokeathlon.Points; } private void SavePokeathlon(SAV4HGSS s) { - s.PokeathlonPoints = (uint)NUD_PokeathlonPoints.Value; + s.Pokeathlon.Points = (uint)NUD_PokeathlonPoints.Value; } #region Seals From 5cbc796ad7f5f7aa0c9d0e28cfd0d69b49d77c92 Mon Sep 17 00:00:00 2001 From: Kurt Date: Tue, 26 May 2026 00:26:10 -0500 Subject: [PATCH 45/81] HGSS: Add Pokeathlon editor Closes #4755 --- PKHeX.Core/Saves/Pokeathlon4.cs | 29 +- .../Controls/SAV Editor/SAVEditor.Designer.cs | 36 +- .../Controls/SAV Editor/SAVEditor.cs | 2 + PKHeX.WinForms/Resources/text/lang_de.txt | 91 ++ PKHeX.WinForms/Resources/text/lang_en.txt | 91 ++ PKHeX.WinForms/Resources/text/lang_es-419.txt | 91 ++ PKHeX.WinForms/Resources/text/lang_es.txt | 91 ++ PKHeX.WinForms/Resources/text/lang_fr.txt | 91 ++ PKHeX.WinForms/Resources/text/lang_it.txt | 91 ++ PKHeX.WinForms/Resources/text/lang_ja.txt | 91 ++ PKHeX.WinForms/Resources/text/lang_ko.txt | 91 ++ .../Resources/text/lang_zh-Hans.txt | 91 ++ .../Resources/text/lang_zh-Hant.txt | 91 ++ .../PokeathlonConnection4Editor.Designer.cs | 307 ++++++ .../Pokeathlon/PokeathlonConnection4Editor.cs | 46 + .../PokeathlonEventData4Editor.Designer.cs | 157 +++ .../Pokeathlon/PokeathlonEventData4Editor.cs | 30 + .../PokeathlonEventRecord4Editor.Designer.cs | 122 +++ .../PokeathlonEventRecord4Editor.cs | 29 + .../PokeathlonEventTrainer4Editor.Designer.cs | 160 +++ .../PokeathlonEventTrainer4Editor.cs | 42 + .../PokeathlonParticipant4Editor.Designer.cs | 188 ++++ .../PokeathlonParticipant4Editor.cs | 84 ++ .../PokeathlonSpeciesForm4Editor.Designer.cs | 98 ++ .../PokeathlonSpeciesForm4Editor.cs | 107 ++ .../Gen4/SAV_Pokeathlon4.Designer.cs | 983 ++++++++++++++++++ .../Save Editors/Gen4/SAV_Pokeathlon4.cs | 462 ++++++++ PKHeX.WinForms/Util/DevUtil.cs | 2 + 28 files changed, 3770 insertions(+), 24 deletions(-) create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonConnection4Editor.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonConnection4Editor.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventData4Editor.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventData4Editor.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventRecord4Editor.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventRecord4Editor.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventTrainer4Editor.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventTrainer4Editor.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonParticipant4Editor.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonParticipant4Editor.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonSpeciesForm4Editor.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonSpeciesForm4Editor.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Pokeathlon4.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Pokeathlon4.cs diff --git a/PKHeX.Core/Saves/Pokeathlon4.cs b/PKHeX.Core/Saves/Pokeathlon4.cs index d8236722e..e59ce3114 100644 --- a/PKHeX.Core/Saves/Pokeathlon4.cs +++ b/PKHeX.Core/Saves/Pokeathlon4.cs @@ -16,7 +16,7 @@ public class Pokeathlon4(Memory Raw) // 0xD9D4 within SAV4HGSS // 5 courses to store record data public PokeathlonCourseRecord4 GetCourseRecord(PokeathlonStat4 index) { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonStat4.MAX_COUNT); + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonStat4.Count); return new(Raw.Slice((int)index * PokeathlonCourseRecord4.SIZE, PokeathlonCourseRecord4.SIZE)); } @@ -27,14 +27,14 @@ public PokeathlonCourseRecord4 GetCourseRecord(PokeathlonStat4 index) // 0x2CC, 0xDCA0 within SAV public PokeathlonEventData4 GetEventSelf(PokeathlonEvent4 index) { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.MAX_COUNT); + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); return new(Raw.Slice(0x2CC + ((int)index * PokeathlonEventData4.SIZE), PokeathlonEventData4.SIZE)); } // 0x484, 0xDE58 within SAV public PokeathlonConnection4 GetEventConnection(PokeathlonEvent4 index) { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.MAX_COUNT); + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); return new(Raw.Slice(0x484 + ((int)index * PokeathlonConnection4.SIZE), PokeathlonConnection4.SIZE)); } @@ -45,13 +45,13 @@ public PokeathlonConnection4 GetEventConnection(PokeathlonEvent4 index) /// public ushort GetBestScore(PokeathlonEvent4 index) { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.MAX_COUNT); + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); return ReadUInt16LittleEndian(Data[(0xAEC + ((int)index * 2))..]); } public void SetBestScore(PokeathlonEvent4 index, ushort score) { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.MAX_COUNT); + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); WriteUInt16LittleEndian(Data[(0xAEC + ((int)index * 2))..], score); } @@ -93,10 +93,10 @@ public void SetBestScore(PokeathlonEvent4 index, ushort score) public uint CalculateGlobalScore() { uint result = 0; - for (PokeathlonStat4 i = 0; i < PokeathlonStat4.MAX_COUNT; i++) + for (PokeathlonStat4 i = 0; i < PokeathlonStat4.Count; i++) result += GetCourseRecord(i).ScoreMax; result += Medals.GetTotalCount(); - for (PokeathlonEvent4 i = 0; i < PokeathlonEvent4.MAX_COUNT; i++) + for (PokeathlonEvent4 i = 0; i < PokeathlonEvent4.Count; i++) result += GetBestScore(i); return result; } @@ -250,6 +250,9 @@ public struct PokeathlonConnection4(Memory Raw) public PokeathlonEventData4 Inner => new(Raw.Slice(0 * PokeathlonEventData4.SIZE, PokeathlonEventData4.SIZE)); + /// + /// Correlated to the indexed records. + /// public PokeathlonEventTrainer4 GetTrainer(int index) { ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, MaxTrainer); @@ -363,12 +366,12 @@ public struct PokeathlonGlobalCounters4(Memory Raw) { get { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.MAX_COUNT); + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); return ReadUInt32LittleEndian(Data[(0x44 + ((int)index * 4))..]); } set { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.MAX_COUNT); + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); WriteUInt32LittleEndian(Data[(0x44 + ((int)index * 4))..], Math.Min(MaxStat, value)); } } @@ -379,7 +382,7 @@ public uint TotalEventFirst get { uint total = 0; - for (PokeathlonEvent4 i = 0; i < PokeathlonEvent4.MAX_COUNT; i++) + for (PokeathlonEvent4 i = 0; i < PokeathlonEvent4.Count; i++) total += this[i]; return total; } @@ -548,7 +551,7 @@ public enum PokeathlonStat4 : byte Stamina = 3, Jump = 4, - MAX_COUNT = 5, + Count = 5, } public enum PokeathlonEvent4 : byte @@ -564,7 +567,7 @@ public enum PokeathlonEvent4 : byte SnowThrow = 8, GoalRoll = 9, - MAX_COUNT = 10, + Count = 10, } /// @@ -608,5 +611,5 @@ public enum DataCard4 : byte Instructions = 25, // Pokémon Instructions TimeSpent = 26, // Time Spent in Pokéathlon - MAX_COUNT = 27, + Count = 27, }; diff --git a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs index dfba5cc49..8bde4dae2 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs @@ -93,6 +93,7 @@ private void InitializeComponent() B_FestivalPlaza = new System.Windows.Forms.Button(); B_MailBox = new System.Windows.Forms.Button(); B_OpenApricorn = new System.Windows.Forms.Button(); + B_OpenPokeathlon = new System.Windows.Forms.Button(); B_Raids = new System.Windows.Forms.Button(); B_RaidsDLC1 = new System.Windows.Forms.Button(); B_RaidsDLC2 = new System.Windows.Forms.Button(); @@ -443,6 +444,7 @@ private void InitializeComponent() FLP_SAVtools.Controls.Add(B_OpenGeonetEditor); FLP_SAVtools.Controls.Add(B_OpenUnityTowerEditor); FLP_SAVtools.Controls.Add(B_OpenJoinAvenueEditor); + FLP_SAVtools.Controls.Add(B_OpenPokeathlon); FLP_SAVtools.Controls.Add(B_OpenMedalsEditor); FLP_SAVtools.Controls.Add(B_OpenChatterEditor); FLP_SAVtools.Controls.Add(B_Roamer); @@ -835,7 +837,7 @@ private void InitializeComponent() // // B_Raids // - B_Raids.Location = new System.Drawing.Point(4, 324); + B_Raids.Location = new System.Drawing.Point(108, 324); B_Raids.Margin = new System.Windows.Forms.Padding(4); B_Raids.Name = "B_Raids"; B_Raids.Size = new System.Drawing.Size(96, 32); @@ -844,9 +846,20 @@ private void InitializeComponent() B_Raids.UseVisualStyleBackColor = true; B_Raids.Click += B_OpenRaids_Click; // + // B_OpenPokeathlon + // + B_OpenPokeathlon.Location = new System.Drawing.Point(4, 324); + B_OpenPokeathlon.Margin = new System.Windows.Forms.Padding(4); + B_OpenPokeathlon.Name = "B_OpenPokeathlon"; + B_OpenPokeathlon.Size = new System.Drawing.Size(96, 32); + B_OpenPokeathlon.TabIndex = 1; + B_OpenPokeathlon.Text = "Pokéathlon"; + B_OpenPokeathlon.UseVisualStyleBackColor = true; + B_OpenPokeathlon.Click += B_OpenPokeathlon_Click; + // // B_RaidsDLC1 // - B_RaidsDLC1.Location = new System.Drawing.Point(108, 324); + B_RaidsDLC1.Location = new System.Drawing.Point(212, 324); B_RaidsDLC1.Margin = new System.Windows.Forms.Padding(4); B_RaidsDLC1.Name = "B_RaidsDLC1"; B_RaidsDLC1.Size = new System.Drawing.Size(96, 32); @@ -857,7 +870,7 @@ private void InitializeComponent() // // B_RaidsDLC2 // - B_RaidsDLC2.Location = new System.Drawing.Point(212, 324); + B_RaidsDLC2.Location = new System.Drawing.Point(316, 324); B_RaidsDLC2.Margin = new System.Windows.Forms.Padding(4); B_RaidsDLC2.Name = "B_RaidsDLC2"; B_RaidsDLC2.Size = new System.Drawing.Size(96, 32); @@ -868,7 +881,7 @@ private void InitializeComponent() // // B_Blocks // - B_Blocks.Location = new System.Drawing.Point(316, 324); + B_Blocks.Location = new System.Drawing.Point(4, 364); B_Blocks.Margin = new System.Windows.Forms.Padding(4); B_Blocks.Name = "B_Blocks"; B_Blocks.Size = new System.Drawing.Size(96, 32); @@ -879,7 +892,7 @@ private void InitializeComponent() // // B_OtherSlots // - B_OtherSlots.Location = new System.Drawing.Point(4, 364); + B_OtherSlots.Location = new System.Drawing.Point(108, 364); B_OtherSlots.Margin = new System.Windows.Forms.Padding(4); B_OtherSlots.Name = "B_OtherSlots"; B_OtherSlots.Size = new System.Drawing.Size(96, 32); @@ -890,7 +903,7 @@ private void InitializeComponent() // // B_OpenSealStickers // - B_OpenSealStickers.Location = new System.Drawing.Point(108, 364); + B_OpenSealStickers.Location = new System.Drawing.Point(212, 364); B_OpenSealStickers.Margin = new System.Windows.Forms.Padding(4); B_OpenSealStickers.Name = "B_OpenSealStickers"; B_OpenSealStickers.Size = new System.Drawing.Size(96, 32); @@ -901,7 +914,7 @@ private void InitializeComponent() // // B_Poffins // - B_Poffins.Location = new System.Drawing.Point(212, 364); + B_Poffins.Location = new System.Drawing.Point(316, 364); B_Poffins.Margin = new System.Windows.Forms.Padding(4); B_Poffins.Name = "B_Poffins"; B_Poffins.Size = new System.Drawing.Size(96, 32); @@ -912,7 +925,7 @@ private void InitializeComponent() // // B_RaidsSevenStar // - B_RaidsSevenStar.Location = new System.Drawing.Point(316, 364); + B_RaidsSevenStar.Location = new System.Drawing.Point(4, 404); B_RaidsSevenStar.Margin = new System.Windows.Forms.Padding(4); B_RaidsSevenStar.Name = "B_RaidsSevenStar"; B_RaidsSevenStar.Size = new System.Drawing.Size(96, 32); @@ -923,7 +936,7 @@ private void InitializeComponent() // // B_OpenBattlePass // - B_OpenBattlePass.Location = new System.Drawing.Point(4, 404); + B_OpenBattlePass.Location = new System.Drawing.Point(108, 404); B_OpenBattlePass.Margin = new System.Windows.Forms.Padding(4); B_OpenBattlePass.Name = "B_OpenBattlePass"; B_OpenBattlePass.Size = new System.Drawing.Size(96, 32); @@ -934,7 +947,7 @@ private void InitializeComponent() // // B_OpenGear // - B_OpenGear.Location = new System.Drawing.Point(108, 404); + B_OpenGear.Location = new System.Drawing.Point(212, 404); B_OpenGear.Margin = new System.Windows.Forms.Padding(4); B_OpenGear.Name = "B_OpenGear"; B_OpenGear.Size = new System.Drawing.Size(96, 32); @@ -945,7 +958,7 @@ private void InitializeComponent() // // B_OpenFashion // - B_OpenFashion.Location = new System.Drawing.Point(212, 404); + B_OpenFashion.Location = new System.Drawing.Point(316, 404); B_OpenFashion.Margin = new System.Windows.Forms.Padding(4); B_OpenFashion.Name = "B_OpenFashion"; B_OpenFashion.Size = new System.Drawing.Size(96, 32); @@ -1137,6 +1150,7 @@ private void InitializeComponent() private System.Windows.Forms.Button B_FestivalPlaza; private System.Windows.Forms.Button B_MailBox; private System.Windows.Forms.Button B_OpenApricorn; + private System.Windows.Forms.Button B_OpenPokeathlon; internal SlotList SL_Extra; private PartyEditor SL_Party; private System.Windows.Forms.Button B_Raids; diff --git a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs index 87a7d0c78..7d2346d4b 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs @@ -639,6 +639,7 @@ private static void OpenDialog(Form f) private void B_CellsStickers_Click(object sender, EventArgs e) => OpenDialog(new SAV_ZygardeCell((SAV7)SAV)); private void B_LinkInfo_Click(object sender, EventArgs e) => OpenDialog(new SAV_Link6(SAV)); private void B_OpenApricorn_Click(object sender, EventArgs e) => OpenDialog(new SAV_Apricorn((SAV4HGSS)SAV)); + private void B_OpenPokeathlon_Click(object sender, EventArgs e) => OpenDialog(new SAV_Pokeathlon4((SAV4HGSS)SAV)); private void B_DLC_Click(object sender, EventArgs e) => OpenDialog(new SAV_DLC5((SAV5)SAV)); private void B_OpenTrainerInfo_Click(object sender, EventArgs e) => OpenDialog(GetTrainerEditor(SAV)); private void B_OpenOPowers_Click(object sender, EventArgs e) => OpenDialog(new SAV_OPower((ISaveBlock6Main)SAV)); @@ -1318,6 +1319,7 @@ private void ToggleViewSubEditors(SaveFile sav) B_OpenBattlePass.Visible = B_OpenGear.Visible = sav is SAV4BR; B_OpenSealStickers.Visible = B_Poffins.Visible = sav is SAV8BS; B_OpenApricorn.Visible = sav is SAV4HGSS; + B_OpenPokeathlon.Visible = sav is SAV4HGSS; B_OpenRTCEditor.Visible = (sav.Generation == 2 && sav is not SAV2Stadium) || sav is SAV3 { SmallBlock: ISaveBlock3SmallHoenn }; B_MailBox.Visible = sav is SAV2 or SAV2Stadium or SAV3 or SAV4 or SAV5; diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index 17ae2f95e..a7caa0eb0 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -48,6 +48,7 @@ SAV_Misc8b=Sonstiges SAV_MysteryGiftDB=Datenbank SAV_OPower=O-Kraft-Editor SAV_Poffin8b=Knursp-Editor +SAV_Pokeathlon4=Pokéathlon-Editor SAV_Pokebean=Pokébohnen-Editor SAV_PokeBlockORAS=Pokériegel-Editor SAV_Pokedex4=Pokédex-Editor @@ -429,6 +430,7 @@ Main.B_OpenLinkInfo=Pokémon-Link Main.B_OpenMedalsEditor=Medaillen Main.B_OpenMiscEditor=Sonstiges Main.B_OpenOPowers=O-Kräfte +Main.B_OpenPokeathlon=Pokéathlon Main.B_OpenPokeBeans=Pokébohnen Main.B_OpenPokeblocks=Pokériegel Main.B_OpenPokedex=Pokédex @@ -914,6 +916,21 @@ PlayerSkinColor8.PaleF=Hell (Weiblich) PlayerSkinColor8.PaleM=Hell (Männlich) PlayerSkinColor8.TanF=Gebräunt (Weiblich) PlayerSkinColor8.TanM=Gebräunt (Männlich) +PokeathlonEvent4.BlockSmash=Blöcke brechen +PokeathlonEvent4.CirclePush=Kreisschieben +PokeathlonEvent4.DiscCatch=Scheibenfangen +PokeathlonEvent4.GoalRoll=Zielrollen +PokeathlonEvent4.HurdleDash=Hürdenlauf +PokeathlonEvent4.LampJump=Lampensprung +PokeathlonEvent4.PennantCapture=Fähnchenfang +PokeathlonEvent4.RelayRun=Staffellauf +PokeathlonEvent4.RingDrop=Ringwurf +PokeathlonEvent4.SnowThrow=Schneewurf +PokeathlonStat4.Jump=Sprung +PokeathlonStat4.Power=Kraft +PokeathlonStat4.Skill=Technik +PokeathlonStat4.Speed=Tempo +PokeathlonStat4.Stamina=Ausdauer PokeSize.L=L PokeSize.M=M PokeSize.S=S @@ -1834,6 +1851,80 @@ SAV_Poffin8b.B_All=Alle SAV_Poffin8b.B_Cancel=Abbr. SAV_Poffin8b.B_None=Keine SAV_Poffin8b.B_Save=Speich. +SAV_Pokeathlon4.B_Cancel=Abbrechen +SAV_Pokeathlon4.B_MedalsClearAll=Alle entfernen +SAV_Pokeathlon4.B_MedalsGiveAll=Alle geben +SAV_Pokeathlon4.B_Save=Speichern +SAV_Pokeathlon4.CHK_IsShiny=Schillernd +SAV_Pokeathlon4.DGV_Jump=Sprung +SAV_Pokeathlon4.DGV_Power=Kraft +SAV_Pokeathlon4.DGV_Skill=Technik +SAV_Pokeathlon4.DGV_Species=Spezies +SAV_Pokeathlon4.DGV_Speed=Tempo +SAV_Pokeathlon4.DGV_Sprite=Sprite +SAV_Pokeathlon4.DGV_Stamina=Ausdauer +SAV_Pokeathlon4.L_Acquired=Erhalten: +SAV_Pokeathlon4.L_Attempts=Versuche: +SAV_Pokeathlon4.L_BlockSmashFirst=Blöcke brechen 1. Platz: +SAV_Pokeathlon4.L_BonusesEarned=Boni erhalten: +SAV_Pokeathlon4.L_CirclePushFirst=Kreisschieben 1. Platz: +SAV_Pokeathlon4.L_ConnectionFirst=Verbindung 1. Platz: +SAV_Pokeathlon4.L_ConnectionIndex=Index: +SAV_Pokeathlon4.L_ConnectionJoined=Verbindungen absolviert: +SAV_Pokeathlon4.L_ConnectionLast=Verbindung letzter Platz: +SAV_Pokeathlon4.L_CourseIndex=Index: +SAV_Pokeathlon4.L_CourseParticipant0=Teilnehmer 1: +SAV_Pokeathlon4.L_CourseParticipant1=Teilnehmer 2: +SAV_Pokeathlon4.L_CourseParticipant2=Teilnehmer 3: +SAV_Pokeathlon4.L_CourseScore0=Punktzahl 1: +SAV_Pokeathlon4.L_CourseScore1=Punktzahl 2: +SAV_Pokeathlon4.L_CourseScore2=Punktzahl 3: +SAV_Pokeathlon4.L_CourseScoreMax=Max. Punktzahl: +SAV_Pokeathlon4.L_DailyShopFlags=Tagesladen: +SAV_Pokeathlon4.L_Dashed=Gesprintet: +SAV_Pokeathlon4.L_DataCards=Datenkarten: +SAV_Pokeathlon4.L_DiscCatchFirst=Scheibenfangen 1. Platz: +SAV_Pokeathlon4.L_Failed=Gescheitert: +SAV_Pokeathlon4.L_Fame=Ruhm: +SAV_Pokeathlon4.L_FellDown=Gefallen: +SAV_Pokeathlon4.L_GoalRollFirst=Zielrollen 1. Platz: +SAV_Pokeathlon4.L_HurdleDashFirst=Hürdenlauf 1. Platz: +SAV_Pokeathlon4.L_Instructions=Anleitungen: +SAV_Pokeathlon4.L_Jumped=Gesprungen: +SAV_Pokeathlon4.L_LampJumpFirst=Lampensprung 1. Platz: +SAV_Pokeathlon4.L_Language=Sprache: +SAV_Pokeathlon4.L_OT=OT: +SAV_Pokeathlon4.L_PennantCaptureFirst=Fähnchenfang 1. Platz: +SAV_Pokeathlon4.L_PID=PID: +SAV_Pokeathlon4.L_PlacedFirst=1. Platz: +SAV_Pokeathlon4.L_PlacedLast=Letzter Platz: +SAV_Pokeathlon4.L_Points=Punkte: +SAV_Pokeathlon4.L_Record=Rekord: +SAV_Pokeathlon4.L_RelayRunFirst=Staffellauf 1. Platz: +SAV_Pokeathlon4.L_RingDropFirst=Ringwurf 1. Platz: +SAV_Pokeathlon4.L_SelfEventIndex=Index: +SAV_Pokeathlon4.L_SelfImpeded=Selbst behindert: +SAV_Pokeathlon4.L_SessionsJoined=Sitzungen beigetreten: +SAV_Pokeathlon4.L_SID16=SID: +SAV_Pokeathlon4.L_SnowThrowFirst=Schneewurf 1. Platz: +SAV_Pokeathlon4.L_Switched=Gewechselt: +SAV_Pokeathlon4.L_Tackled=Getackelt: +SAV_Pokeathlon4.L_TID16=TID: +SAV_Pokeathlon4.L_TimeSpent=Zeit verbracht: +SAV_Pokeathlon4.L_TotalEventFirst=Gesamt 1. Platz: +SAV_Pokeathlon4.L_TotalEventLast=Gesamt letzter Platz: +SAV_Pokeathlon4.L_Trainer0=Trainer 1: +SAV_Pokeathlon4.L_Trainer1=Trainer 2: +SAV_Pokeathlon4.L_Trainer2=Trainer 3: +SAV_Pokeathlon4.L_Trainer3=Trainer 4: +SAV_Pokeathlon4.L_Trainer4=Trainer 5: +SAV_Pokeathlon4.Tab_Best=Bestwerte +SAV_Pokeathlon4.Tab_Connection=Verbindung +SAV_Pokeathlon4.Tab_Counters=Zähler +SAV_Pokeathlon4.Tab_Courses=Courses +SAV_Pokeathlon4.Tab_General=Allgemein +SAV_Pokeathlon4.Tab_Medals=Medaillen +SAV_Pokeathlon4.Tab_SelfEvent=Eigenes Event SAV_Pokebean.B_All=Alle SAV_Pokebean.B_Cancel=Abbrechen SAV_Pokebean.B_None=Keine diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index 18c2b2eca..610623e47 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -48,6 +48,7 @@ SAV_Misc8b=Misc Editor SAV_MysteryGiftDB=Database SAV_OPower=O-Power Editor SAV_Poffin8b=Poffin Editor +SAV_Pokeathlon4=Pokéathlon Editor SAV_Pokebean=Poké Beans Editor SAV_PokeBlockORAS=Pokéblock Editor SAV_Pokedex4=Pokédex Editor @@ -429,6 +430,7 @@ Main.B_OpenLinkInfo=Link Data Main.B_OpenMedalsEditor=Medals Main.B_OpenMiscEditor=Misc Edits Main.B_OpenOPowers=O-Powers +Main.B_OpenPokeathlon=Pokéathlon Main.B_OpenPokeBeans=Poké Beans Main.B_OpenPokeblocks=Pokéblocks Main.B_OpenPokedex=Pokédex @@ -914,6 +916,21 @@ PlayerSkinColor8.PaleF=Pale (Female) PlayerSkinColor8.PaleM=Pale (Male) PlayerSkinColor8.TanF=Tan (Female) PlayerSkinColor8.TanM=Tan (Male) +PokeathlonEvent4.BlockSmash=Block Smash +PokeathlonEvent4.CirclePush=Circle Push +PokeathlonEvent4.DiscCatch=Disc Catch +PokeathlonEvent4.GoalRoll=Goal Roll +PokeathlonEvent4.HurdleDash=Hurdle Dash +PokeathlonEvent4.LampJump=Lamp Jump +PokeathlonEvent4.PennantCapture=Pennant Capture +PokeathlonEvent4.RelayRun=Relay Run +PokeathlonEvent4.RingDrop=Ring Drop +PokeathlonEvent4.SnowThrow=Snow Throw +PokeathlonStat4.Jump=Jump +PokeathlonStat4.Power=Power +PokeathlonStat4.Skill=Skill +PokeathlonStat4.Speed=Speed +PokeathlonStat4.Stamina=Stamina PokeSize.L=L PokeSize.M=M PokeSize.S=S @@ -1834,6 +1851,80 @@ SAV_Poffin8b.B_All=All SAV_Poffin8b.B_Cancel=Cancel SAV_Poffin8b.B_None=None SAV_Poffin8b.B_Save=Save +SAV_Pokeathlon4.B_Cancel=Cancel +SAV_Pokeathlon4.B_MedalsClearAll=Clear All +SAV_Pokeathlon4.B_MedalsGiveAll=Give All +SAV_Pokeathlon4.B_Save=Save +SAV_Pokeathlon4.CHK_IsShiny=Shiny +SAV_Pokeathlon4.DGV_Jump=Jump +SAV_Pokeathlon4.DGV_Power=Power +SAV_Pokeathlon4.DGV_Skill=Skill +SAV_Pokeathlon4.DGV_Species=Species +SAV_Pokeathlon4.DGV_Speed=Speed +SAV_Pokeathlon4.DGV_Sprite=Sprite +SAV_Pokeathlon4.DGV_Stamina=Stamina +SAV_Pokeathlon4.L_Acquired=Acquired: +SAV_Pokeathlon4.L_Attempts=Attempts: +SAV_Pokeathlon4.L_BlockSmashFirst=Block Smash 1st: +SAV_Pokeathlon4.L_BonusesEarned=Bonuses Earned: +SAV_Pokeathlon4.L_CirclePushFirst=Circle Push 1st: +SAV_Pokeathlon4.L_ConnectionFirst=Connection 1st: +SAV_Pokeathlon4.L_ConnectionIndex=Index: +SAV_Pokeathlon4.L_ConnectionJoined=Connections Joined: +SAV_Pokeathlon4.L_ConnectionLast=Connection Last: +SAV_Pokeathlon4.L_CourseIndex=Index: +SAV_Pokeathlon4.L_CourseParticipant0=Participant 1: +SAV_Pokeathlon4.L_CourseParticipant1=Participant 2: +SAV_Pokeathlon4.L_CourseParticipant2=Participant 3: +SAV_Pokeathlon4.L_CourseScore0=Score 1: +SAV_Pokeathlon4.L_CourseScore1=Score 2: +SAV_Pokeathlon4.L_CourseScore2=Score 3: +SAV_Pokeathlon4.L_CourseScoreMax=Max Score: +SAV_Pokeathlon4.L_DailyShopFlags=Daily Shop: +SAV_Pokeathlon4.L_Dashed=Dashed: +SAV_Pokeathlon4.L_DataCards=Data Cards: +SAV_Pokeathlon4.L_DiscCatchFirst=Disc Catch 1st: +SAV_Pokeathlon4.L_Failed=Failed: +SAV_Pokeathlon4.L_Fame=Fame: +SAV_Pokeathlon4.L_FellDown=Fell Down: +SAV_Pokeathlon4.L_GoalRollFirst=Goal Roll 1st: +SAV_Pokeathlon4.L_HurdleDashFirst=Hurdle Dash 1st: +SAV_Pokeathlon4.L_Instructions=Instructions: +SAV_Pokeathlon4.L_Jumped=Jumped: +SAV_Pokeathlon4.L_LampJumpFirst=Lamp Jump 1st: +SAV_Pokeathlon4.L_Language=Language: +SAV_Pokeathlon4.L_OT=OT: +SAV_Pokeathlon4.L_PennantCaptureFirst=Pennant Capture 1st: +SAV_Pokeathlon4.L_PID=PID: +SAV_Pokeathlon4.L_PlacedFirst=Placed 1st: +SAV_Pokeathlon4.L_PlacedLast=Placed Last: +SAV_Pokeathlon4.L_Points=Points: +SAV_Pokeathlon4.L_Record=Record: +SAV_Pokeathlon4.L_RelayRunFirst=Relay Run 1st: +SAV_Pokeathlon4.L_RingDropFirst=Ring Drop 1st: +SAV_Pokeathlon4.L_SelfEventIndex=Index: +SAV_Pokeathlon4.L_SelfImpeded=Self-Impeded: +SAV_Pokeathlon4.L_SessionsJoined=Sessions Joined: +SAV_Pokeathlon4.L_SID16=SID: +SAV_Pokeathlon4.L_SnowThrowFirst=Snow Throw 1st: +SAV_Pokeathlon4.L_Switched=Switched: +SAV_Pokeathlon4.L_Tackled=Tackled: +SAV_Pokeathlon4.L_TID16=TID: +SAV_Pokeathlon4.L_TimeSpent=Time Spent: +SAV_Pokeathlon4.L_TotalEventFirst=Total Event 1st: +SAV_Pokeathlon4.L_TotalEventLast=Total Event Last: +SAV_Pokeathlon4.L_Trainer0=Trainer 1: +SAV_Pokeathlon4.L_Trainer1=Trainer 2: +SAV_Pokeathlon4.L_Trainer2=Trainer 3: +SAV_Pokeathlon4.L_Trainer3=Trainer 4: +SAV_Pokeathlon4.L_Trainer4=Trainer 5: +SAV_Pokeathlon4.Tab_Best=Best +SAV_Pokeathlon4.Tab_Connection=Connection +SAV_Pokeathlon4.Tab_Counters=Counters +SAV_Pokeathlon4.Tab_Courses=Courses +SAV_Pokeathlon4.Tab_General=General +SAV_Pokeathlon4.Tab_Medals=Medals +SAV_Pokeathlon4.Tab_SelfEvent=Self Event SAV_Pokebean.B_All=All SAV_Pokebean.B_Cancel=Cancel SAV_Pokebean.B_None=None diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index 0f1649f2a..f04a277fd 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -48,6 +48,7 @@ SAV_Misc8b=Editor Misceláneo SAV_MysteryGiftDB=Base de Datos SAV_OPower=Editor de Poder O SAV_Poffin8b=Editor de Pokochos +SAV_Pokeathlon4=Editor de Pokéathlon SAV_Pokebean=Editor de Pokéhaba SAV_PokeBlockORAS=Editor de Pokécubos SAV_Pokedex4=Editor de Pokédex @@ -429,6 +430,7 @@ Main.B_OpenLinkInfo=Datos Nexo Main.B_OpenMedalsEditor=Medallas Main.B_OpenMiscEditor=Misceláneo Main.B_OpenOPowers=Poder O +Main.B_OpenPokeathlon=Pokéathlon Main.B_OpenPokeBeans=Pokéhabas Main.B_OpenPokeblocks=Pokécubos Main.B_OpenPokedex=Pokédex @@ -914,6 +916,21 @@ PlayerSkinColor8.PaleF=Pálida (Hembra) PlayerSkinColor8.PaleM=Pálido (Macho) PlayerSkinColor8.TanF=Bronceada (Hembra) PlayerSkinColor8.TanM=Bronceado (Macho) +PokeathlonEvent4.BlockSmash=Rompebloques +PokeathlonEvent4.CirclePush=Empuje Circular +PokeathlonEvent4.DiscCatch=Atrapa Discos +PokeathlonEvent4.GoalRoll=Rodada a Meta +PokeathlonEvent4.HurdleDash=Carrera de Vallas +PokeathlonEvent4.LampJump=Salto de Lámparas +PokeathlonEvent4.PennantCapture=Captura de Banderines +PokeathlonEvent4.RelayRun=Carrera de Relevos +PokeathlonEvent4.RingDrop=Caída de Anillos +PokeathlonEvent4.SnowThrow=Lanzamiento de Nieve +PokeathlonStat4.Jump=Salto +PokeathlonStat4.Power=Potencia +PokeathlonStat4.Skill=Técnica +PokeathlonStat4.Speed=Velocidad +PokeathlonStat4.Stamina=Resistencia PokeSize.L=L PokeSize.M=M PokeSize.S=S @@ -1834,6 +1851,80 @@ SAV_Poffin8b.B_All=Todos SAV_Poffin8b.B_Cancel=Cancelar SAV_Poffin8b.B_None=Ninguno SAV_Poffin8b.B_Save=Guardar +SAV_Pokeathlon4.B_Cancel=Cancelar +SAV_Pokeathlon4.B_MedalsClearAll=Quitar todo +SAV_Pokeathlon4.B_MedalsGiveAll=Dar todo +SAV_Pokeathlon4.B_Save=Guardar +SAV_Pokeathlon4.CHK_IsShiny=Variocolor +SAV_Pokeathlon4.DGV_Jump=Salto +SAV_Pokeathlon4.DGV_Power=Potencia +SAV_Pokeathlon4.DGV_Skill=Técnica +SAV_Pokeathlon4.DGV_Species=Especie +SAV_Pokeathlon4.DGV_Speed=Velocidad +SAV_Pokeathlon4.DGV_Sprite=Sprite +SAV_Pokeathlon4.DGV_Stamina=Resistencia +SAV_Pokeathlon4.L_Acquired=Obtenido: +SAV_Pokeathlon4.L_Attempts=Intentos: +SAV_Pokeathlon4.L_BlockSmashFirst=Rompebloques 1.º: +SAV_Pokeathlon4.L_BonusesEarned=Bonos conseguidos: +SAV_Pokeathlon4.L_CirclePushFirst=Empuje Circular 1.º: +SAV_Pokeathlon4.L_ConnectionFirst=Conexión 1.º: +SAV_Pokeathlon4.L_ConnectionIndex=Índice: +SAV_Pokeathlon4.L_ConnectionJoined=Conexiones jugadas: +SAV_Pokeathlon4.L_ConnectionLast=Conexión último: +SAV_Pokeathlon4.L_CourseIndex=Índice: +SAV_Pokeathlon4.L_CourseParticipant0=Participante 1: +SAV_Pokeathlon4.L_CourseParticipant1=Participante 2: +SAV_Pokeathlon4.L_CourseParticipant2=Participante 3: +SAV_Pokeathlon4.L_CourseScore0=Puntuación 1: +SAV_Pokeathlon4.L_CourseScore1=Puntuación 2: +SAV_Pokeathlon4.L_CourseScore2=Puntuación 3: +SAV_Pokeathlon4.L_CourseScoreMax=Puntuación máxima: +SAV_Pokeathlon4.L_DailyShopFlags=Tienda diaria: +SAV_Pokeathlon4.L_Dashed=Carrera: +SAV_Pokeathlon4.L_DataCards=Tarjetas de datos: +SAV_Pokeathlon4.L_DiscCatchFirst=Atrapa Discos 1.º: +SAV_Pokeathlon4.L_Failed=Fallos: +SAV_Pokeathlon4.L_Fame=Fama: +SAV_Pokeathlon4.L_FellDown=Se cayó: +SAV_Pokeathlon4.L_GoalRollFirst=Rodada a Meta 1.º: +SAV_Pokeathlon4.L_HurdleDashFirst=Carrera de Vallas 1.º: +SAV_Pokeathlon4.L_Instructions=Instrucciones: +SAV_Pokeathlon4.L_Jumped=Saltó: +SAV_Pokeathlon4.L_LampJumpFirst=Salto de Lámparas 1.º: +SAV_Pokeathlon4.L_Language=Idioma: +SAV_Pokeathlon4.L_OT=OT: +SAV_Pokeathlon4.L_PennantCaptureFirst=Captura de Banderines 1.º: +SAV_Pokeathlon4.L_PID=PID: +SAV_Pokeathlon4.L_PlacedFirst=Quedó 1.º: +SAV_Pokeathlon4.L_PlacedLast=Quedó último: +SAV_Pokeathlon4.L_Points=Puntos: +SAV_Pokeathlon4.L_Record=Récord: +SAV_Pokeathlon4.L_RelayRunFirst=Carrera de Relevos 1.º: +SAV_Pokeathlon4.L_RingDropFirst=Caída de Anillos 1.º: +SAV_Pokeathlon4.L_SelfEventIndex=Índice: +SAV_Pokeathlon4.L_SelfImpeded=Se estorbó a sí mismo: +SAV_Pokeathlon4.L_SessionsJoined=Sesiones jugadas: +SAV_Pokeathlon4.L_SID16=SID: +SAV_Pokeathlon4.L_SnowThrowFirst=Lanzamiento de Nieve 1.º: +SAV_Pokeathlon4.L_Switched=Cambió: +SAV_Pokeathlon4.L_Tackled=Placó: +SAV_Pokeathlon4.L_TID16=TID: +SAV_Pokeathlon4.L_TimeSpent=Tiempo invertido: +SAV_Pokeathlon4.L_TotalEventFirst=Total 1.º: +SAV_Pokeathlon4.L_TotalEventLast=Total último: +SAV_Pokeathlon4.L_Trainer0=Entrenador 1: +SAV_Pokeathlon4.L_Trainer1=Entrenador 2: +SAV_Pokeathlon4.L_Trainer2=Entrenador 3: +SAV_Pokeathlon4.L_Trainer3=Entrenador 4: +SAV_Pokeathlon4.L_Trainer4=Entrenador 5: +SAV_Pokeathlon4.Tab_Best=Récords +SAV_Pokeathlon4.Tab_Connection=Conexión +SAV_Pokeathlon4.Tab_Counters=Contadores +SAV_Pokeathlon4.Tab_Courses=Cursos +SAV_Pokeathlon4.Tab_General=General +SAV_Pokeathlon4.Tab_Medals=Medallas +SAV_Pokeathlon4.Tab_SelfEvent=Evento propio SAV_Pokebean.B_All=Todos SAV_Pokebean.B_Cancel=Cancelar SAV_Pokebean.B_None=Ninguno diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index ba2b4ccf6..9392d9aed 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -48,6 +48,7 @@ SAV_Misc8b=Editor de Varios SAV_MysteryGiftDB=Base de Datos SAV_OPower=Editor de Poder O SAV_Poffin8b=Editor de Pokochos +SAV_Pokeathlon4=Editor de Pokéathlon SAV_Pokebean=Editor de Pokéhaba SAV_PokeBlockORAS=Editor de Pokécubos SAV_Pokedex4=Editor de Pokédex @@ -429,6 +430,7 @@ Main.B_OpenLinkInfo=Datos Nexo Main.B_OpenMedalsEditor=Medallas Main.B_OpenMiscEditor=Varios Main.B_OpenOPowers=Poder O +Main.B_OpenPokeathlon=Pokéathlon Main.B_OpenPokeBeans=Pokéhabas Main.B_OpenPokeblocks=Pokécubos Main.B_OpenPokedex=Pokédex @@ -914,6 +916,21 @@ PlayerSkinColor8.PaleF=Pálida (Hembra) PlayerSkinColor8.PaleM=Pálido (Macho) PlayerSkinColor8.TanF=Bronceada (Hembra) PlayerSkinColor8.TanM=Bronceado (Macho) +PokeathlonEvent4.BlockSmash=Rompebloques +PokeathlonEvent4.CirclePush=Empuje Circular +PokeathlonEvent4.DiscCatch=Atrapa Discos +PokeathlonEvent4.GoalRoll=Rodada a Meta +PokeathlonEvent4.HurdleDash=Carrera de Vallas +PokeathlonEvent4.LampJump=Salto de Lámparas +PokeathlonEvent4.PennantCapture=Captura de Banderines +PokeathlonEvent4.RelayRun=Carrera de Relevos +PokeathlonEvent4.RingDrop=Caída de Anillos +PokeathlonEvent4.SnowThrow=Lanzamiento de Nieve +PokeathlonStat4.Jump=Salto +PokeathlonStat4.Power=Potencia +PokeathlonStat4.Skill=Técnica +PokeathlonStat4.Speed=Velocidad +PokeathlonStat4.Stamina=Resistencia PokeSize.L=L PokeSize.M=M PokeSize.S=S @@ -1834,6 +1851,80 @@ SAV_Poffin8b.B_All=Todos SAV_Poffin8b.B_Cancel=Cancelar SAV_Poffin8b.B_None=Ninguno SAV_Poffin8b.B_Save=Guardar +SAV_Pokeathlon4.B_Cancel=Cancelar +SAV_Pokeathlon4.B_MedalsClearAll=Quitar todo +SAV_Pokeathlon4.B_MedalsGiveAll=Dar todo +SAV_Pokeathlon4.B_Save=Guardar +SAV_Pokeathlon4.CHK_IsShiny=Variocolor +SAV_Pokeathlon4.DGV_Jump=Salto +SAV_Pokeathlon4.DGV_Power=Potencia +SAV_Pokeathlon4.DGV_Skill=Técnica +SAV_Pokeathlon4.DGV_Species=Especie +SAV_Pokeathlon4.DGV_Speed=Velocidad +SAV_Pokeathlon4.DGV_Sprite=Sprite +SAV_Pokeathlon4.DGV_Stamina=Resistencia +SAV_Pokeathlon4.L_Acquired=Obtenido: +SAV_Pokeathlon4.L_Attempts=Intentos: +SAV_Pokeathlon4.L_BlockSmashFirst=Rompebloques 1.º: +SAV_Pokeathlon4.L_BonusesEarned=Bonos conseguidos: +SAV_Pokeathlon4.L_CirclePushFirst=Empuje Circular 1.º: +SAV_Pokeathlon4.L_ConnectionFirst=Conexión 1.º: +SAV_Pokeathlon4.L_ConnectionIndex=Índice: +SAV_Pokeathlon4.L_ConnectionJoined=Conexiones jugadas: +SAV_Pokeathlon4.L_ConnectionLast=Conexión último: +SAV_Pokeathlon4.L_CourseIndex=Índice: +SAV_Pokeathlon4.L_CourseParticipant0=Participante 1: +SAV_Pokeathlon4.L_CourseParticipant1=Participante 2: +SAV_Pokeathlon4.L_CourseParticipant2=Participante 3: +SAV_Pokeathlon4.L_CourseScore0=Puntuación 1: +SAV_Pokeathlon4.L_CourseScore1=Puntuación 2: +SAV_Pokeathlon4.L_CourseScore2=Puntuación 3: +SAV_Pokeathlon4.L_CourseScoreMax=Puntuación máxima: +SAV_Pokeathlon4.L_DailyShopFlags=Tienda diaria: +SAV_Pokeathlon4.L_Dashed=Carrera: +SAV_Pokeathlon4.L_DataCards=Tarjetas de datos: +SAV_Pokeathlon4.L_DiscCatchFirst=Atrapa Discos 1.º: +SAV_Pokeathlon4.L_Failed=Fallos: +SAV_Pokeathlon4.L_Fame=Fama: +SAV_Pokeathlon4.L_FellDown=Se cayó: +SAV_Pokeathlon4.L_GoalRollFirst=Rodada a Meta 1.º: +SAV_Pokeathlon4.L_HurdleDashFirst=Carrera de Vallas 1.º: +SAV_Pokeathlon4.L_Instructions=Instrucciones: +SAV_Pokeathlon4.L_Jumped=Saltó: +SAV_Pokeathlon4.L_LampJumpFirst=Salto de Lámparas 1.º: +SAV_Pokeathlon4.L_Language=Idioma: +SAV_Pokeathlon4.L_OT=OT: +SAV_Pokeathlon4.L_PennantCaptureFirst=Captura de Banderines 1.º: +SAV_Pokeathlon4.L_PID=PID: +SAV_Pokeathlon4.L_PlacedFirst=Quedó 1.º: +SAV_Pokeathlon4.L_PlacedLast=Quedó último: +SAV_Pokeathlon4.L_Points=Puntos: +SAV_Pokeathlon4.L_Record=Récord: +SAV_Pokeathlon4.L_RelayRunFirst=Carrera de Relevos 1.º: +SAV_Pokeathlon4.L_RingDropFirst=Caída de Anillos 1.º: +SAV_Pokeathlon4.L_SelfEventIndex=Índice: +SAV_Pokeathlon4.L_SelfImpeded=Se estorbó a sí mismo: +SAV_Pokeathlon4.L_SessionsJoined=Sesiones jugadas: +SAV_Pokeathlon4.L_SID16=SID: +SAV_Pokeathlon4.L_SnowThrowFirst=Lanzamiento de Nieve 1.º: +SAV_Pokeathlon4.L_Switched=Cambió: +SAV_Pokeathlon4.L_Tackled=Placó: +SAV_Pokeathlon4.L_TID16=TID: +SAV_Pokeathlon4.L_TimeSpent=Tiempo invertido: +SAV_Pokeathlon4.L_TotalEventFirst=Total 1.º: +SAV_Pokeathlon4.L_TotalEventLast=Total último: +SAV_Pokeathlon4.L_Trainer0=Entrenador 1: +SAV_Pokeathlon4.L_Trainer1=Entrenador 2: +SAV_Pokeathlon4.L_Trainer2=Entrenador 3: +SAV_Pokeathlon4.L_Trainer3=Entrenador 4: +SAV_Pokeathlon4.L_Trainer4=Entrenador 5: +SAV_Pokeathlon4.Tab_Best=Récords +SAV_Pokeathlon4.Tab_Connection=Conexión +SAV_Pokeathlon4.Tab_Counters=Contadores +SAV_Pokeathlon4.Tab_Courses=Cursos +SAV_Pokeathlon4.Tab_General=General +SAV_Pokeathlon4.Tab_Medals=Medallas +SAV_Pokeathlon4.Tab_SelfEvent=Evento propio SAV_Pokebean.B_All=Todos SAV_Pokebean.B_Cancel=Cancelar SAV_Pokebean.B_None=Ninguno diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index 2ce4c37c3..b29df20eb 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -48,6 +48,7 @@ SAV_Misc8b=Éditeur divers SAV_MysteryGiftDB=Base de données SAV_OPower=Éditeur O-Auras SAV_Poffin8b=Éditeur Poffins +SAV_Pokeathlon4=Éditeur Pokéathlon SAV_Pokebean=Éditeur Poké Fèves SAV_PokeBlockORAS=Éditeur Pokéblocs SAV_Pokedex4=Éditeur Pokédex @@ -429,6 +430,7 @@ Main.B_OpenLinkInfo=Poké Lien Main.B_OpenMedalsEditor=Médailles Main.B_OpenMiscEditor=Éditeur divers Main.B_OpenOPowers=O-Auras +Main.B_OpenPokeathlon=Pokéathlon Main.B_OpenPokeBeans=Poké Fèves Main.B_OpenPokeblocks=Pokéblocs Main.B_OpenPokedex=Pokédex @@ -914,6 +916,21 @@ PlayerSkinColor8.PaleF=Pâle (Femelle) PlayerSkinColor8.PaleM=Pâle (Mâle) PlayerSkinColor8.TanF=Bronzé (Femelle) PlayerSkinColor8.TanM=Bronzé (Mâle) +PokeathlonEvent4.BlockSmash=Brise Blocs +PokeathlonEvent4.CirclePush=Poussée Circulaire +PokeathlonEvent4.DiscCatch=Attrape Disques +PokeathlonEvent4.GoalRoll=Roulé au But +PokeathlonEvent4.HurdleDash=Course de Haies +PokeathlonEvent4.LampJump=Saut de Lampes +PokeathlonEvent4.PennantCapture=Capture de Fanions +PokeathlonEvent4.RelayRun=Relais +PokeathlonEvent4.RingDrop=Chute d'Anneaux +PokeathlonEvent4.SnowThrow=Lancer de Neige +PokeathlonStat4.Jump=Saut +PokeathlonStat4.Power=Puissance +PokeathlonStat4.Skill=Technique +PokeathlonStat4.Speed=Vitesse +PokeathlonStat4.Stamina=Endurance PokeSize.L=L PokeSize.M=M PokeSize.S=S @@ -1834,6 +1851,80 @@ SAV_Poffin8b.B_All=Tout SAV_Poffin8b.B_Cancel=Annuler SAV_Poffin8b.B_None=Aucun SAV_Poffin8b.B_Save=Sauvegarder +SAV_Pokeathlon4.B_Cancel=Annuler +SAV_Pokeathlon4.B_MedalsClearAll=Tout effacer +SAV_Pokeathlon4.B_MedalsGiveAll=Tout donner +SAV_Pokeathlon4.B_Save=Sauvegarder +SAV_Pokeathlon4.CHK_IsShiny=Chromatique +SAV_Pokeathlon4.DGV_Jump=Saut +SAV_Pokeathlon4.DGV_Power=Puissance +SAV_Pokeathlon4.DGV_Skill=Technique +SAV_Pokeathlon4.DGV_Species=Espèce +SAV_Pokeathlon4.DGV_Speed=Vitesse +SAV_Pokeathlon4.DGV_Sprite=Sprite +SAV_Pokeathlon4.DGV_Stamina=Endurance +SAV_Pokeathlon4.L_Acquired=Obtenu : +SAV_Pokeathlon4.L_Attempts=Tentatives : +SAV_Pokeathlon4.L_BlockSmashFirst=Brise Blocs 1re place : +SAV_Pokeathlon4.L_BonusesEarned=Bonus gagnés : +SAV_Pokeathlon4.L_CirclePushFirst=Poussée Circulaire 1re place : +SAV_Pokeathlon4.L_ConnectionFirst=Connexion 1re place : +SAV_Pokeathlon4.L_ConnectionIndex=Indice : +SAV_Pokeathlon4.L_ConnectionJoined=Connexions rejointes : +SAV_Pokeathlon4.L_ConnectionLast=Connexion dernière place : +SAV_Pokeathlon4.L_CourseIndex=Indice : +SAV_Pokeathlon4.L_CourseParticipant0=Participant 1 : +SAV_Pokeathlon4.L_CourseParticipant1=Participant 2 : +SAV_Pokeathlon4.L_CourseParticipant2=Participant 3 : +SAV_Pokeathlon4.L_CourseScore0=Score 1 : +SAV_Pokeathlon4.L_CourseScore1=Score 2 : +SAV_Pokeathlon4.L_CourseScore2=Score 3 : +SAV_Pokeathlon4.L_CourseScoreMax=Score max : +SAV_Pokeathlon4.L_DailyShopFlags=Boutique du jour : +SAV_Pokeathlon4.L_Dashed=Sprints : +SAV_Pokeathlon4.L_DataCards=Cartes de données : +SAV_Pokeathlon4.L_DiscCatchFirst=Attrape Disques 1re place : +SAV_Pokeathlon4.L_Failed=Échecs : +SAV_Pokeathlon4.L_Fame=Renommée : +SAV_Pokeathlon4.L_FellDown=Tombé : +SAV_Pokeathlon4.L_GoalRollFirst=Roulé au But 1re place : +SAV_Pokeathlon4.L_HurdleDashFirst=Course de Haies 1re place : +SAV_Pokeathlon4.L_Instructions=Instructions : +SAV_Pokeathlon4.L_Jumped=Sauts : +SAV_Pokeathlon4.L_LampJumpFirst=Saut de Lampes 1re place : +SAV_Pokeathlon4.L_Language=Langue : +SAV_Pokeathlon4.L_OT=DO : +SAV_Pokeathlon4.L_PennantCaptureFirst=Capture de Fanions 1re place : +SAV_Pokeathlon4.L_PID=PID: +SAV_Pokeathlon4.L_PlacedFirst=Placé 1er : +SAV_Pokeathlon4.L_PlacedLast=Placé dernier : +SAV_Pokeathlon4.L_Points=Points : +SAV_Pokeathlon4.L_Record=Record : +SAV_Pokeathlon4.L_RelayRunFirst=Relais 1re place : +SAV_Pokeathlon4.L_RingDropFirst=Chute d'Anneaux 1re place : +SAV_Pokeathlon4.L_SelfEventIndex=Indice : +SAV_Pokeathlon4.L_SelfImpeded=Gêné soi-même : +SAV_Pokeathlon4.L_SessionsJoined=Sessions rejointes : +SAV_Pokeathlon4.L_SID16=SID : +SAV_Pokeathlon4.L_SnowThrowFirst=Lancer de Neige 1re place : +SAV_Pokeathlon4.L_Switched=Changé : +SAV_Pokeathlon4.L_Tackled=Plaqué : +SAV_Pokeathlon4.L_TID16=TID : +SAV_Pokeathlon4.L_TimeSpent=Temps passé : +SAV_Pokeathlon4.L_TotalEventFirst=Total 1re place : +SAV_Pokeathlon4.L_TotalEventLast=Total dernière place : +SAV_Pokeathlon4.L_Trainer0=Dresseur 1 : +SAV_Pokeathlon4.L_Trainer1=Dresseur 2 : +SAV_Pokeathlon4.L_Trainer2=Dresseur 3 : +SAV_Pokeathlon4.L_Trainer3=Dresseur 4 : +SAV_Pokeathlon4.L_Trainer4=Dresseur 5 : +SAV_Pokeathlon4.Tab_Best=Meilleurs +SAV_Pokeathlon4.Tab_Connection=Connexion +SAV_Pokeathlon4.Tab_Counters=Compteurs +SAV_Pokeathlon4.Tab_Courses=Parcours +SAV_Pokeathlon4.Tab_General=Général +SAV_Pokeathlon4.Tab_Medals=Médailles +SAV_Pokeathlon4.Tab_SelfEvent=Épreuve solo SAV_Pokebean.B_All=Tout SAV_Pokebean.B_Cancel=Annuler SAV_Pokebean.B_None=Aucun diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index 93ffdde32..cec883fa7 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -48,6 +48,7 @@ SAV_Misc8b=Editor Varie SAV_MysteryGiftDB=Database SAV_OPower=Editor Poteri-O SAV_Poffin8b=Editor Poffin +SAV_Pokeathlon4=Editor Pokéathlon SAV_Pokebean=Editor Pokégioli SAV_PokeBlockORAS=Editor Pokémelle SAV_Pokedex4=Editor Pokédex @@ -429,6 +430,7 @@ Main.B_OpenLinkInfo=Dati Link Main.B_OpenMedalsEditor=Premi Main.B_OpenMiscEditor=Mod. Varie Main.B_OpenOPowers=Poteri O +Main.B_OpenPokeathlon=Pokéathlon Main.B_OpenPokeBeans=Pokégioli Main.B_OpenPokeblocks=Pokémelle Main.B_OpenPokedex=Pokédex @@ -914,6 +916,21 @@ PlayerSkinColor8.PaleF=Chiara (Femmina) PlayerSkinColor8.PaleM=Chiara (Maschio) PlayerSkinColor8.TanF=Olivastra (Femmina) PlayerSkinColor8.TanM=Olivastra (Maschio) +PokeathlonEvent4.BlockSmash=Spacca Blocchi +PokeathlonEvent4.CirclePush=Spinta Circolare +PokeathlonEvent4.DiscCatch=Acchiappa Dischi +PokeathlonEvent4.GoalRoll=Rotola in Porta +PokeathlonEvent4.HurdleDash=Corsa a Ostacoli +PokeathlonEvent4.LampJump=Salto Lampade +PokeathlonEvent4.PennantCapture=Cattura Gagliardetti +PokeathlonEvent4.RelayRun=Staffetta +PokeathlonEvent4.RingDrop=Caduta Anelli +PokeathlonEvent4.SnowThrow=Lancio di Neve +PokeathlonStat4.Jump=Salto +PokeathlonStat4.Power=Potenza +PokeathlonStat4.Skill=Tecnica +PokeathlonStat4.Speed=Velocità +PokeathlonStat4.Stamina=Resistenza PokeSize.L=L PokeSize.M=M PokeSize.S=S @@ -1834,6 +1851,80 @@ SAV_Poffin8b.B_All=Tutto SAV_Poffin8b.B_Cancel=Annulla SAV_Poffin8b.B_None=Nessuno SAV_Poffin8b.B_Save=Salva +SAV_Pokeathlon4.B_Cancel=Annulla +SAV_Pokeathlon4.B_MedalsClearAll=Rimuovi tutto +SAV_Pokeathlon4.B_MedalsGiveAll=Dai tutto +SAV_Pokeathlon4.B_Save=Salva +SAV_Pokeathlon4.CHK_IsShiny=Cromatico +SAV_Pokeathlon4.DGV_Jump=Salto +SAV_Pokeathlon4.DGV_Power=Potenza +SAV_Pokeathlon4.DGV_Skill=Tecnica +SAV_Pokeathlon4.DGV_Species=Specie +SAV_Pokeathlon4.DGV_Speed=Velocità +SAV_Pokeathlon4.DGV_Sprite=Sprite +SAV_Pokeathlon4.DGV_Stamina=Resistenza +SAV_Pokeathlon4.L_Acquired=Ottenuto: +SAV_Pokeathlon4.L_Attempts=Tentativi: +SAV_Pokeathlon4.L_BlockSmashFirst=Spacca Blocchi 1º: +SAV_Pokeathlon4.L_BonusesEarned=Bonus ottenuti: +SAV_Pokeathlon4.L_CirclePushFirst=Spinta Circolare 1º: +SAV_Pokeathlon4.L_ConnectionFirst=Connessione 1º: +SAV_Pokeathlon4.L_ConnectionIndex=Indice: +SAV_Pokeathlon4.L_ConnectionJoined=Connessioni giocate: +SAV_Pokeathlon4.L_ConnectionLast=Connessione ultimo: +SAV_Pokeathlon4.L_CourseIndex=Indice: +SAV_Pokeathlon4.L_CourseParticipant0=Partecipante 1: +SAV_Pokeathlon4.L_CourseParticipant1=Partecipante 2: +SAV_Pokeathlon4.L_CourseParticipant2=Partecipante 3: +SAV_Pokeathlon4.L_CourseScore0=Punteggio 1: +SAV_Pokeathlon4.L_CourseScore1=Punteggio 2: +SAV_Pokeathlon4.L_CourseScore2=Punteggio 3: +SAV_Pokeathlon4.L_CourseScoreMax=Punteggio max: +SAV_Pokeathlon4.L_DailyShopFlags=Negozio giornaliero: +SAV_Pokeathlon4.L_Dashed=Scatti: +SAV_Pokeathlon4.L_DataCards=Schede dati: +SAV_Pokeathlon4.L_DiscCatchFirst=Acchiappa Dischi 1º: +SAV_Pokeathlon4.L_Failed=Fallimenti: +SAV_Pokeathlon4.L_Fame=Fama: +SAV_Pokeathlon4.L_FellDown=Caduto: +SAV_Pokeathlon4.L_GoalRollFirst=Rotola in Porta 1º: +SAV_Pokeathlon4.L_HurdleDashFirst=Corsa a Ostacoli 1º: +SAV_Pokeathlon4.L_Instructions=Istruzioni: +SAV_Pokeathlon4.L_Jumped=Salti: +SAV_Pokeathlon4.L_LampJumpFirst=Salto Lampade 1º: +SAV_Pokeathlon4.L_Language=Lingua: +SAV_Pokeathlon4.L_OT=OT: +SAV_Pokeathlon4.L_PennantCaptureFirst=Cattura Gagliardetti 1º: +SAV_Pokeathlon4.L_PID=PID: +SAV_Pokeathlon4.L_PlacedFirst=Primo posto: +SAV_Pokeathlon4.L_PlacedLast=Ultimo posto: +SAV_Pokeathlon4.L_Points=Punti: +SAV_Pokeathlon4.L_Record=Record: +SAV_Pokeathlon4.L_RelayRunFirst=Staffetta 1º: +SAV_Pokeathlon4.L_RingDropFirst=Caduta Anelli 1º: +SAV_Pokeathlon4.L_SelfEventIndex=Indice: +SAV_Pokeathlon4.L_SelfImpeded=Si è ostacolato da solo: +SAV_Pokeathlon4.L_SessionsJoined=Sessioni giocate: +SAV_Pokeathlon4.L_SID16=SID: +SAV_Pokeathlon4.L_SnowThrowFirst=Lancio di Neve 1º: +SAV_Pokeathlon4.L_Switched=Cambiato: +SAV_Pokeathlon4.L_Tackled=Placcato: +SAV_Pokeathlon4.L_TID16=TID: +SAV_Pokeathlon4.L_TimeSpent=Tempo trascorso: +SAV_Pokeathlon4.L_TotalEventFirst=Totale 1º: +SAV_Pokeathlon4.L_TotalEventLast=Totale ultimo: +SAV_Pokeathlon4.L_Trainer0=Allenatore 1: +SAV_Pokeathlon4.L_Trainer1=Allenatore 2: +SAV_Pokeathlon4.L_Trainer2=Allenatore 3: +SAV_Pokeathlon4.L_Trainer3=Allenatore 4: +SAV_Pokeathlon4.L_Trainer4=Allenatore 5: +SAV_Pokeathlon4.Tab_Best=Migliori +SAV_Pokeathlon4.Tab_Connection=Connessione +SAV_Pokeathlon4.Tab_Counters=Contatori +SAV_Pokeathlon4.Tab_Courses=Corsi +SAV_Pokeathlon4.Tab_General=Generale +SAV_Pokeathlon4.Tab_Medals=Medaglie +SAV_Pokeathlon4.Tab_SelfEvent=Evento personale SAV_Pokebean.B_All=Tutto SAV_Pokebean.B_Cancel=Annulla SAV_Pokebean.B_None=Nessuno diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index 6e85adef9..3f3d7fb96 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -48,6 +48,7 @@ SAV_Misc8b=その他 SAV_MysteryGiftDB=ふしぎなおくりものデータベース SAV_OPower=Oパワー SAV_Poffin8b=ポフィン +SAV_Pokeathlon4=ポケスロン SAV_Pokebean=ポケマメ SAV_PokeBlockORAS=ポロック SAV_Pokedex4=ポケモン図鑑 @@ -429,6 +430,7 @@ Main.B_OpenLinkInfo=ポケモンリンク Main.B_OpenMedalsEditor=メダル Main.B_OpenMiscEditor=その他 Main.B_OpenOPowers= Oパワー +Main.B_OpenPokeathlon=ポケスロン Main.B_OpenPokeBeans=ポケマメ Main.B_OpenPokeblocks=ポロック Main.B_OpenPokedex=ポケモン図鑑 @@ -914,6 +916,21 @@ PlayerSkinColor8.PaleF=Pale (Female) PlayerSkinColor8.PaleM=Pale (Male) PlayerSkinColor8.TanF=Tan (Female) PlayerSkinColor8.TanM=Tan (Male) +PokeathlonEvent4.BlockSmash=ブロックスマッシュ +PokeathlonEvent4.CirclePush=サークルプッシュ +PokeathlonEvent4.DiscCatch=ディスクキャッチ +PokeathlonEvent4.GoalRoll=ゴールロール +PokeathlonEvent4.HurdleDash=ハードルダッシュ +PokeathlonEvent4.LampJump=ランプジャンプ +PokeathlonEvent4.PennantCapture=ペナントキャプチャ +PokeathlonEvent4.RelayRun=リレーラン +PokeathlonEvent4.RingDrop=リングドロップ +PokeathlonEvent4.SnowThrow=スノースロー +PokeathlonStat4.Jump=ジャンプ +PokeathlonStat4.Power=パワー +PokeathlonStat4.Skill=テクニック +PokeathlonStat4.Speed=スピード +PokeathlonStat4.Stamina=スタミナ PokeSize.L=L PokeSize.M=M PokeSize.S=S @@ -1834,6 +1851,80 @@ SAV_Poffin8b.B_All=全て SAV_Poffin8b.B_Cancel=キャンセル SAV_Poffin8b.B_None=リセット SAV_Poffin8b.B_Save=保存 +SAV_Pokeathlon4.B_Cancel=キャンセル +SAV_Pokeathlon4.B_MedalsClearAll=すべて消去 +SAV_Pokeathlon4.B_MedalsGiveAll=すべて付与 +SAV_Pokeathlon4.B_Save=保存 +SAV_Pokeathlon4.CHK_IsShiny=色違い +SAV_Pokeathlon4.DGV_Jump=ジャンプ +SAV_Pokeathlon4.DGV_Power=パワー +SAV_Pokeathlon4.DGV_Skill=テクニック +SAV_Pokeathlon4.DGV_Species=種族 +SAV_Pokeathlon4.DGV_Speed=スピード +SAV_Pokeathlon4.DGV_Sprite=スプライト +SAV_Pokeathlon4.DGV_Stamina=スタミナ +SAV_Pokeathlon4.L_Acquired=入手済み: +SAV_Pokeathlon4.L_Attempts=挑戦回数: +SAV_Pokeathlon4.L_BlockSmashFirst=ブロックスマッシュ1位: +SAV_Pokeathlon4.L_BonusesEarned=獲得ボーナス: +SAV_Pokeathlon4.L_CirclePushFirst=サークルプッシュ1位: +SAV_Pokeathlon4.L_ConnectionFirst=通信1位: +SAV_Pokeathlon4.L_ConnectionIndex=番号: +SAV_Pokeathlon4.L_ConnectionJoined=通信参加回数: +SAV_Pokeathlon4.L_ConnectionLast=通信最下位: +SAV_Pokeathlon4.L_CourseIndex=番号: +SAV_Pokeathlon4.L_CourseParticipant0=参加者1: +SAV_Pokeathlon4.L_CourseParticipant1=参加者2: +SAV_Pokeathlon4.L_CourseParticipant2=参加者3: +SAV_Pokeathlon4.L_CourseScore0=スコア1: +SAV_Pokeathlon4.L_CourseScore1=スコア2: +SAV_Pokeathlon4.L_CourseScore2=スコア3: +SAV_Pokeathlon4.L_CourseScoreMax=最高スコア: +SAV_Pokeathlon4.L_DailyShopFlags=日替わりショップ: +SAV_Pokeathlon4.L_Dashed=ダッシュ回数: +SAV_Pokeathlon4.L_DataCards=データカード: +SAV_Pokeathlon4.L_DiscCatchFirst=ディスクキャッチ1位: +SAV_Pokeathlon4.L_Failed=失敗: +SAV_Pokeathlon4.L_Fame=名声: +SAV_Pokeathlon4.L_FellDown=転倒: +SAV_Pokeathlon4.L_GoalRollFirst=ゴールロール1位: +SAV_Pokeathlon4.L_HurdleDashFirst=ハードルダッシュ1位: +SAV_Pokeathlon4.L_Instructions=説明: +SAV_Pokeathlon4.L_Jumped=ジャンプ回数: +SAV_Pokeathlon4.L_LampJumpFirst=ランプジャンプ1位: +SAV_Pokeathlon4.L_Language=言語: +SAV_Pokeathlon4.L_OT=親名: +SAV_Pokeathlon4.L_PennantCaptureFirst=ペナントキャプチャ1位: +SAV_Pokeathlon4.L_PID=PID: +SAV_Pokeathlon4.L_PlacedFirst=1位回数: +SAV_Pokeathlon4.L_PlacedLast=最下位回数: +SAV_Pokeathlon4.L_Points=ポイント: +SAV_Pokeathlon4.L_Record=記録: +SAV_Pokeathlon4.L_RelayRunFirst=リレーラン1位: +SAV_Pokeathlon4.L_RingDropFirst=リングドロップ1位: +SAV_Pokeathlon4.L_SelfEventIndex=番号: +SAV_Pokeathlon4.L_SelfImpeded=自分で妨害: +SAV_Pokeathlon4.L_SessionsJoined=参加セッション数: +SAV_Pokeathlon4.L_SID16=SID: +SAV_Pokeathlon4.L_SnowThrowFirst=スノースロー1位: +SAV_Pokeathlon4.L_Switched=交代: +SAV_Pokeathlon4.L_Tackled=タックル: +SAV_Pokeathlon4.L_TID16=TID: +SAV_Pokeathlon4.L_TimeSpent=経過時間: +SAV_Pokeathlon4.L_TotalEventFirst=総合1位: +SAV_Pokeathlon4.L_TotalEventLast=総合最下位: +SAV_Pokeathlon4.L_Trainer0=トレーナー1: +SAV_Pokeathlon4.L_Trainer1=トレーナー2: +SAV_Pokeathlon4.L_Trainer2=トレーナー3: +SAV_Pokeathlon4.L_Trainer3=トレーナー4: +SAV_Pokeathlon4.L_Trainer4=トレーナー5: +SAV_Pokeathlon4.Tab_Best=ベスト +SAV_Pokeathlon4.Tab_Connection=通信 +SAV_Pokeathlon4.Tab_Counters=カウンター +SAV_Pokeathlon4.Tab_Courses=コース +SAV_Pokeathlon4.Tab_General=基本 +SAV_Pokeathlon4.Tab_Medals=メダル +SAV_Pokeathlon4.Tab_SelfEvent=自己競技 SAV_Pokebean.B_All=全て取得 SAV_Pokebean.B_Cancel=キャンセル SAV_Pokebean.B_None=全て消去 diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index faf8480db..451cf4d4a 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -48,6 +48,7 @@ SAV_Misc8b=기타 편집 도구 SAV_MysteryGiftDB=데이터베이스 SAV_OPower=O파워 편집 도구 SAV_Poffin8b=포핀 편집 도구 +SAV_Pokeathlon4=포켓슬론 SAV_Pokebean=포켓콩 편집 도구 SAV_PokeBlockORAS=포켓몬스넥 편집 도구 SAV_Pokedex4=포켓몬 도감 편집 도구 @@ -429,6 +430,7 @@ Main.B_OpenLinkInfo=링크 데이터 Main.B_OpenMedalsEditor=메달 Main.B_OpenMiscEditor=기타 편집 Main.B_OpenOPowers=O파워 +Main.B_OpenPokeathlon=포켓슬론 Main.B_OpenPokeBeans=포켓콩 Main.B_OpenPokeblocks=포켓몬스넥 Main.B_OpenPokedex=포켓몬 도감 @@ -914,6 +916,21 @@ PlayerSkinColor8.PaleF=밝은 피부 (여) PlayerSkinColor8.PaleM=밝은 피부 (남) PlayerSkinColor8.TanF=태닝한 피부 (여) PlayerSkinColor8.TanM=태닝한 피부 (남) +PokeathlonEvent4.BlockSmash=블록 스매시 +PokeathlonEvent4.CirclePush=서클 푸시 +PokeathlonEvent4.DiscCatch=디스크 캐치 +PokeathlonEvent4.GoalRoll=골 롤 +PokeathlonEvent4.HurdleDash=허들 대시 +PokeathlonEvent4.LampJump=램프 점프 +PokeathlonEvent4.PennantCapture=페넌트 캐치 +PokeathlonEvent4.RelayRun=릴레이 런 +PokeathlonEvent4.RingDrop=링 드롭 +PokeathlonEvent4.SnowThrow=스노우 스로 +PokeathlonStat4.Jump=점프 +PokeathlonStat4.Power=파워 +PokeathlonStat4.Skill=스킬 +PokeathlonStat4.Speed=스피드 +PokeathlonStat4.Stamina=스태미나 PokeSize.L=L PokeSize.M=M PokeSize.S=S @@ -1834,6 +1851,80 @@ SAV_Poffin8b.B_All=모두 SAV_Poffin8b.B_Cancel=취소 SAV_Poffin8b.B_None=없음 SAV_Poffin8b.B_Save=저장 +SAV_Pokeathlon4.B_Cancel=취소 +SAV_Pokeathlon4.B_MedalsClearAll=모두 지우기 +SAV_Pokeathlon4.B_MedalsGiveAll=모두 지급 +SAV_Pokeathlon4.B_Save=저장 +SAV_Pokeathlon4.CHK_IsShiny=색이 다른 +SAV_Pokeathlon4.DGV_Jump=점프 +SAV_Pokeathlon4.DGV_Power=파워 +SAV_Pokeathlon4.DGV_Skill=스킬 +SAV_Pokeathlon4.DGV_Species=종족 +SAV_Pokeathlon4.DGV_Speed=스피드 +SAV_Pokeathlon4.DGV_Sprite=스프라이트 +SAV_Pokeathlon4.DGV_Stamina=스태미나 +SAV_Pokeathlon4.L_Acquired=획득: +SAV_Pokeathlon4.L_Attempts=도전 횟수: +SAV_Pokeathlon4.L_BlockSmashFirst=블록 스매시 1위: +SAV_Pokeathlon4.L_BonusesEarned=획득 보너스: +SAV_Pokeathlon4.L_CirclePushFirst=서클 푸시 1위: +SAV_Pokeathlon4.L_ConnectionFirst=통신 1위: +SAV_Pokeathlon4.L_ConnectionIndex=번호: +SAV_Pokeathlon4.L_ConnectionJoined=통신 참가: +SAV_Pokeathlon4.L_ConnectionLast=통신 꼴찌: +SAV_Pokeathlon4.L_CourseIndex=번호: +SAV_Pokeathlon4.L_CourseParticipant0=참가자 1: +SAV_Pokeathlon4.L_CourseParticipant1=참가자 2: +SAV_Pokeathlon4.L_CourseParticipant2=참가자 3: +SAV_Pokeathlon4.L_CourseScore0=점수 1: +SAV_Pokeathlon4.L_CourseScore1=점수 2: +SAV_Pokeathlon4.L_CourseScore2=점수 3: +SAV_Pokeathlon4.L_CourseScoreMax=최고 점수: +SAV_Pokeathlon4.L_DailyShopFlags=일일 상점: +SAV_Pokeathlon4.L_Dashed=질주 횟수: +SAV_Pokeathlon4.L_DataCards=데이터 카드: +SAV_Pokeathlon4.L_DiscCatchFirst=디스크 캐치 1위: +SAV_Pokeathlon4.L_Failed=실패: +SAV_Pokeathlon4.L_Fame=명성: +SAV_Pokeathlon4.L_FellDown=넘어짐: +SAV_Pokeathlon4.L_GoalRollFirst=골 롤 1위: +SAV_Pokeathlon4.L_HurdleDashFirst=허들 대시 1위: +SAV_Pokeathlon4.L_Instructions=설명: +SAV_Pokeathlon4.L_Jumped=점프 횟수: +SAV_Pokeathlon4.L_LampJumpFirst=램프 점프 1위: +SAV_Pokeathlon4.L_Language=언어: +SAV_Pokeathlon4.L_OT=OT: +SAV_Pokeathlon4.L_PennantCaptureFirst=페넌트 캐치 1위: +SAV_Pokeathlon4.L_PID=PID: +SAV_Pokeathlon4.L_PlacedFirst=1위 달성: +SAV_Pokeathlon4.L_PlacedLast=꼴찌 기록: +SAV_Pokeathlon4.L_Points=포인트: +SAV_Pokeathlon4.L_Record=기록: +SAV_Pokeathlon4.L_RelayRunFirst=릴레이 런 1위: +SAV_Pokeathlon4.L_RingDropFirst=링 드롭 1위: +SAV_Pokeathlon4.L_SelfEventIndex=번호: +SAV_Pokeathlon4.L_SelfImpeded=자기 방해: +SAV_Pokeathlon4.L_SessionsJoined=참가 세션: +SAV_Pokeathlon4.L_SID16=SID: +SAV_Pokeathlon4.L_SnowThrowFirst=스노우 스로 1위: +SAV_Pokeathlon4.L_Switched=교체: +SAV_Pokeathlon4.L_Tackled=태클: +SAV_Pokeathlon4.L_TID16=TID: +SAV_Pokeathlon4.L_TimeSpent=플레이 시간: +SAV_Pokeathlon4.L_TotalEventFirst=총합 1위: +SAV_Pokeathlon4.L_TotalEventLast=총합 꼴찌: +SAV_Pokeathlon4.L_Trainer0=트레이너 1: +SAV_Pokeathlon4.L_Trainer1=트레이너 2: +SAV_Pokeathlon4.L_Trainer2=트레이너 3: +SAV_Pokeathlon4.L_Trainer3=트레이너 4: +SAV_Pokeathlon4.L_Trainer4=트레이너 5: +SAV_Pokeathlon4.Tab_Best=베스트 +SAV_Pokeathlon4.Tab_Connection=통신 +SAV_Pokeathlon4.Tab_Counters=카운터 +SAV_Pokeathlon4.Tab_Courses=코스 +SAV_Pokeathlon4.Tab_General=일반 +SAV_Pokeathlon4.Tab_Medals=메달 +SAV_Pokeathlon4.Tab_SelfEvent=개인 이벤트 SAV_Pokebean.B_All=모두 SAV_Pokebean.B_Cancel=취소 SAV_Pokebean.B_None=없음 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index 25eea434a..e205643e9 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -48,6 +48,7 @@ SAV_Misc8b=杂项编辑 SAV_MysteryGiftDB=礼物数据库 SAV_OPower=O-力量 SAV_Poffin8b=宝芬编辑 +SAV_Pokeathlon4=宝可全能竞技 SAV_Pokebean=宝可豆 SAV_PokeBlockORAS=宝可方块 SAV_Pokedex4=图鉴编辑 @@ -429,6 +430,7 @@ Main.B_OpenLinkInfo=宝可梦连接 Main.B_OpenMedalsEditor=奖牌 Main.B_OpenMiscEditor=杂项编辑 Main.B_OpenOPowers=O-力量 +Main.B_OpenPokeathlon=宝可全能竞技 Main.B_OpenPokeBeans=宝可豆 Main.B_OpenPokeblocks=宝可方块 Main.B_OpenPokedex=宝可梦图鉴 @@ -914,6 +916,21 @@ PlayerSkinColor8.PaleF=浅色肤色(女) PlayerSkinColor8.PaleM=浅色肤色(男) PlayerSkinColor8.TanF=棕色肤色(女) PlayerSkinColor8.TanM=棕色肤色(男) +PokeathlonEvent4.BlockSmash=粉碎方块 +PokeathlonEvent4.CirclePush=圆环推进 +PokeathlonEvent4.DiscCatch=飞盘接取 +PokeathlonEvent4.GoalRoll=滚向球门 +PokeathlonEvent4.HurdleDash=跨栏冲刺 +PokeathlonEvent4.LampJump=跳灯赛 +PokeathlonEvent4.PennantCapture=夺旗赛 +PokeathlonEvent4.RelayRun=接力赛跑 +PokeathlonEvent4.RingDrop=投环赛 +PokeathlonEvent4.SnowThrow=雪球投掷 +PokeathlonStat4.Jump=跳跃 +PokeathlonStat4.Power=力量 +PokeathlonStat4.Skill=技巧 +PokeathlonStat4.Speed=速度 +PokeathlonStat4.Stamina=耐力 PokeSize.L=L PokeSize.M=M PokeSize.S=S @@ -1834,6 +1851,80 @@ SAV_Poffin8b.B_All=所有 SAV_Poffin8b.B_Cancel=取消 SAV_Poffin8b.B_None=清空 SAV_Poffin8b.B_Save=保存 +SAV_Pokeathlon4.B_Cancel=取消 +SAV_Pokeathlon4.B_MedalsClearAll=全部清空 +SAV_Pokeathlon4.B_MedalsGiveAll=全部获得 +SAV_Pokeathlon4.B_Save=保存 +SAV_Pokeathlon4.CHK_IsShiny=异色 +SAV_Pokeathlon4.DGV_Jump=跳跃 +SAV_Pokeathlon4.DGV_Power=力量 +SAV_Pokeathlon4.DGV_Skill=技巧 +SAV_Pokeathlon4.DGV_Species=种类 +SAV_Pokeathlon4.DGV_Speed=速度 +SAV_Pokeathlon4.DGV_Sprite=精灵 +SAV_Pokeathlon4.DGV_Stamina=耐力 +SAV_Pokeathlon4.L_Acquired=已获得: +SAV_Pokeathlon4.L_Attempts=尝试次数: +SAV_Pokeathlon4.L_BlockSmashFirst=粉碎方块第一: +SAV_Pokeathlon4.L_BonusesEarned=奖励获得: +SAV_Pokeathlon4.L_CirclePushFirst=圆环推进第一: +SAV_Pokeathlon4.L_ConnectionFirst=连接第一: +SAV_Pokeathlon4.L_ConnectionIndex=编号: +SAV_Pokeathlon4.L_ConnectionJoined=连接参加次数: +SAV_Pokeathlon4.L_ConnectionLast=连接最后: +SAV_Pokeathlon4.L_CourseIndex=编号: +SAV_Pokeathlon4.L_CourseParticipant0=参加者1: +SAV_Pokeathlon4.L_CourseParticipant1=参加者2: +SAV_Pokeathlon4.L_CourseParticipant2=参加者3: +SAV_Pokeathlon4.L_CourseScore0=分数1: +SAV_Pokeathlon4.L_CourseScore1=分数2: +SAV_Pokeathlon4.L_CourseScore2=分数3: +SAV_Pokeathlon4.L_CourseScoreMax=最高分: +SAV_Pokeathlon4.L_DailyShopFlags=每日商店: +SAV_Pokeathlon4.L_Dashed=冲刺次数: +SAV_Pokeathlon4.L_DataCards=数据卡: +SAV_Pokeathlon4.L_DiscCatchFirst=飞盘接取第一: +SAV_Pokeathlon4.L_Failed=失败: +SAV_Pokeathlon4.L_Fame=名望: +SAV_Pokeathlon4.L_FellDown=摔倒: +SAV_Pokeathlon4.L_GoalRollFirst=滚向球门第一: +SAV_Pokeathlon4.L_HurdleDashFirst=跨栏冲刺第一: +SAV_Pokeathlon4.L_Instructions=说明: +SAV_Pokeathlon4.L_Jumped=跳跃次数: +SAV_Pokeathlon4.L_LampJumpFirst=跳灯赛第一: +SAV_Pokeathlon4.L_Language=语言: +SAV_Pokeathlon4.L_OT=OT: +SAV_Pokeathlon4.L_PennantCaptureFirst=夺旗赛第一: +SAV_Pokeathlon4.L_PID=PID: +SAV_Pokeathlon4.L_PlacedFirst=第一名次数: +SAV_Pokeathlon4.L_PlacedLast=最后一名次数: +SAV_Pokeathlon4.L_Points=点数: +SAV_Pokeathlon4.L_Record=记录: +SAV_Pokeathlon4.L_RelayRunFirst=接力赛跑第一: +SAV_Pokeathlon4.L_RingDropFirst=投环赛第一: +SAV_Pokeathlon4.L_SelfEventIndex=编号: +SAV_Pokeathlon4.L_SelfImpeded=自我妨碍: +SAV_Pokeathlon4.L_SessionsJoined=参加会话数: +SAV_Pokeathlon4.L_SID16=SID: +SAV_Pokeathlon4.L_SnowThrowFirst=雪球投掷第一: +SAV_Pokeathlon4.L_Switched=切换次数: +SAV_Pokeathlon4.L_Tackled=擒抱: +SAV_Pokeathlon4.L_TID16=TID: +SAV_Pokeathlon4.L_TimeSpent=花费时间: +SAV_Pokeathlon4.L_TotalEventFirst=总赛事第一: +SAV_Pokeathlon4.L_TotalEventLast=总赛事最后: +SAV_Pokeathlon4.L_Trainer0=训练家1: +SAV_Pokeathlon4.L_Trainer1=训练家2: +SAV_Pokeathlon4.L_Trainer2=训练家3: +SAV_Pokeathlon4.L_Trainer3=训练家4: +SAV_Pokeathlon4.L_Trainer4=训练家5: +SAV_Pokeathlon4.Tab_Best=最佳 +SAV_Pokeathlon4.Tab_Connection=连接 +SAV_Pokeathlon4.Tab_Counters=计数 +SAV_Pokeathlon4.Tab_Courses=赛程 +SAV_Pokeathlon4.Tab_General=一般 +SAV_Pokeathlon4.Tab_Medals=奖牌 +SAV_Pokeathlon4.Tab_SelfEvent=个人赛事 SAV_Pokebean.B_All=全部 SAV_Pokebean.B_Cancel=取消 SAV_Pokebean.B_None=清空 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index 6ca203538..6777456d8 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -48,6 +48,7 @@ SAV_Misc8b=訓練家資料雜項編輯 SAV_MysteryGiftDB=神秘禮物資料庫 SAV_OPower=O-力量編輯器 SAV_Poffin8b=寶芬編輯器 +SAV_Pokeathlon4=寶可全能競技 SAV_Pokebean=寶可豆編輯器 SAV_PokeBlockORAS=寶可方塊編輯器 SAV_Pokedex4=圖鑒編輯器 @@ -429,6 +430,7 @@ Main.B_OpenLinkInfo=寶可夢連接 Main.B_OpenMedalsEditor=獎牌 Main.B_OpenMiscEditor=雜項編輯 Main.B_OpenOPowers=O-力量 +Main.B_OpenPokeathlon=寶可全能競技 Main.B_OpenPokeBeans=寶可豆 Main.B_OpenPokeblocks=寶可方塊 Main.B_OpenPokedex=寶可夢圖鑒 @@ -914,6 +916,21 @@ PlayerSkinColor8.PaleF=淺色膚色(女) PlayerSkinColor8.PaleM=淺色膚色(男) PlayerSkinColor8.TanF=棕色膚色(女) PlayerSkinColor8.TanM=棕色膚色(男) +PokeathlonEvent4.BlockSmash=粉碎方塊 +PokeathlonEvent4.CirclePush=圓環推進 +PokeathlonEvent4.DiscCatch=飛盤接取 +PokeathlonEvent4.GoalRoll=滾向球門 +PokeathlonEvent4.HurdleDash=跨欄衝刺 +PokeathlonEvent4.LampJump=跳燈賽 +PokeathlonEvent4.PennantCapture=奪旗賽 +PokeathlonEvent4.RelayRun=接力賽跑 +PokeathlonEvent4.RingDrop=投環賽 +PokeathlonEvent4.SnowThrow=雪球投擲 +PokeathlonStat4.Jump=跳躍 +PokeathlonStat4.Power=力量 +PokeathlonStat4.Skill=技巧 +PokeathlonStat4.Speed=速度 +PokeathlonStat4.Stamina=耐力 PokeSize.L=L PokeSize.M=M PokeSize.S=S @@ -1834,6 +1851,80 @@ SAV_Poffin8b.B_All=所有 SAV_Poffin8b.B_Cancel=取消 SAV_Poffin8b.B_None=清空 SAV_Poffin8b.B_Save=儲存 +SAV_Pokeathlon4.B_Cancel=取消 +SAV_Pokeathlon4.B_MedalsClearAll=全部清空 +SAV_Pokeathlon4.B_MedalsGiveAll=全部獲得 +SAV_Pokeathlon4.B_Save=儲存 +SAV_Pokeathlon4.CHK_IsShiny=異色 +SAV_Pokeathlon4.DGV_Jump=跳躍 +SAV_Pokeathlon4.DGV_Power=力量 +SAV_Pokeathlon4.DGV_Skill=技巧 +SAV_Pokeathlon4.DGV_Species=種類 +SAV_Pokeathlon4.DGV_Speed=速度 +SAV_Pokeathlon4.DGV_Sprite=精靈 +SAV_Pokeathlon4.DGV_Stamina=耐力 +SAV_Pokeathlon4.L_Acquired=已獲得: +SAV_Pokeathlon4.L_Attempts=嘗試次數: +SAV_Pokeathlon4.L_BlockSmashFirst=粉碎方塊第一: +SAV_Pokeathlon4.L_BonusesEarned=獎勵獲得: +SAV_Pokeathlon4.L_CirclePushFirst=圓環推進第一: +SAV_Pokeathlon4.L_ConnectionFirst=連接第一: +SAV_Pokeathlon4.L_ConnectionIndex=編號: +SAV_Pokeathlon4.L_ConnectionJoined=連接參加次數: +SAV_Pokeathlon4.L_ConnectionLast=連接最後: +SAV_Pokeathlon4.L_CourseIndex=編號: +SAV_Pokeathlon4.L_CourseParticipant0=參加者1: +SAV_Pokeathlon4.L_CourseParticipant1=參加者2: +SAV_Pokeathlon4.L_CourseParticipant2=參加者3: +SAV_Pokeathlon4.L_CourseScore0=分數1: +SAV_Pokeathlon4.L_CourseScore1=分數2: +SAV_Pokeathlon4.L_CourseScore2=分數3: +SAV_Pokeathlon4.L_CourseScoreMax=最高分: +SAV_Pokeathlon4.L_DailyShopFlags=每日商店: +SAV_Pokeathlon4.L_Dashed=衝刺次數: +SAV_Pokeathlon4.L_DataCards=資料卡: +SAV_Pokeathlon4.L_DiscCatchFirst=飛盤接取第一: +SAV_Pokeathlon4.L_Failed=失敗: +SAV_Pokeathlon4.L_Fame=名望: +SAV_Pokeathlon4.L_FellDown=摔倒: +SAV_Pokeathlon4.L_GoalRollFirst=滾向球門第一: +SAV_Pokeathlon4.L_HurdleDashFirst=跨欄衝刺第一: +SAV_Pokeathlon4.L_Instructions=說明: +SAV_Pokeathlon4.L_Jumped=跳躍次數: +SAV_Pokeathlon4.L_LampJumpFirst=跳燈賽第一: +SAV_Pokeathlon4.L_Language=語言: +SAV_Pokeathlon4.L_OT=OT: +SAV_Pokeathlon4.L_PennantCaptureFirst=奪旗賽第一: +SAV_Pokeathlon4.L_PID=PID: +SAV_Pokeathlon4.L_PlacedFirst=第一名次數: +SAV_Pokeathlon4.L_PlacedLast=最後一名次數: +SAV_Pokeathlon4.L_Points=點數: +SAV_Pokeathlon4.L_Record=記錄: +SAV_Pokeathlon4.L_RelayRunFirst=接力賽跑第一: +SAV_Pokeathlon4.L_RingDropFirst=投環賽第一: +SAV_Pokeathlon4.L_SelfEventIndex=編號: +SAV_Pokeathlon4.L_SelfImpeded=自我妨礙: +SAV_Pokeathlon4.L_SessionsJoined=參加會話數: +SAV_Pokeathlon4.L_SID16=SID: +SAV_Pokeathlon4.L_SnowThrowFirst=雪球投擲第一: +SAV_Pokeathlon4.L_Switched=切換次數: +SAV_Pokeathlon4.L_Tackled=擒抱: +SAV_Pokeathlon4.L_TID16=TID: +SAV_Pokeathlon4.L_TimeSpent=花費時間: +SAV_Pokeathlon4.L_TotalEventFirst=總賽事第一: +SAV_Pokeathlon4.L_TotalEventLast=總賽事最後: +SAV_Pokeathlon4.L_Trainer0=訓練家1: +SAV_Pokeathlon4.L_Trainer1=訓練家2: +SAV_Pokeathlon4.L_Trainer2=訓練家3: +SAV_Pokeathlon4.L_Trainer3=訓練家4: +SAV_Pokeathlon4.L_Trainer4=訓練家5: +SAV_Pokeathlon4.Tab_Best=最佳 +SAV_Pokeathlon4.Tab_Connection=連接 +SAV_Pokeathlon4.Tab_Counters=計數 +SAV_Pokeathlon4.Tab_Courses=賽程 +SAV_Pokeathlon4.Tab_General=一般 +SAV_Pokeathlon4.Tab_Medals=獎牌 +SAV_Pokeathlon4.Tab_SelfEvent=個人賽事 SAV_Pokebean.B_All=全部 SAV_Pokebean.B_Cancel=取消 SAV_Pokebean.B_None=清空 diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonConnection4Editor.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonConnection4Editor.Designer.cs new file mode 100644 index 000000000..0fc984b23 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonConnection4Editor.Designer.cs @@ -0,0 +1,307 @@ +namespace PKHeX.WinForms +{ + partial class PokeathlonConnection4Editor + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + components.Dispose(); + base.Dispose(disposing); + } + + #region Component Designer generated code + + private void InitializeComponent() + { + TLP_Main = new System.Windows.Forms.TableLayoutPanel(); + FLP_Attempts = new System.Windows.Forms.FlowLayoutPanel(); + L_Attempts = new System.Windows.Forms.Label(); + NUD_Attempts = new System.Windows.Forms.NumericUpDown(); + UC_Record0 = new PokeathlonEventRecord4Editor(); + L_Trainer0 = new System.Windows.Forms.Label(); + UC_Trainer0 = new PokeathlonEventTrainer4Editor(); + UC_Record1 = new PokeathlonEventRecord4Editor(); + L_Trainer1 = new System.Windows.Forms.Label(); + UC_Trainer1 = new PokeathlonEventTrainer4Editor(); + UC_Record2 = new PokeathlonEventRecord4Editor(); + L_Trainer2 = new System.Windows.Forms.Label(); + UC_Trainer2 = new PokeathlonEventTrainer4Editor(); + UC_Record3 = new PokeathlonEventRecord4Editor(); + L_Trainer3 = new System.Windows.Forms.Label(); + UC_Trainer3 = new PokeathlonEventTrainer4Editor(); + UC_Record4 = new PokeathlonEventRecord4Editor(); + L_Trainer4 = new System.Windows.Forms.Label(); + UC_Trainer4 = new PokeathlonEventTrainer4Editor(); + TLP_Main.SuspendLayout(); + FLP_Attempts.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Attempts).BeginInit(); + SuspendLayout(); + // + // TLP_Main + // + TLP_Main.AutoScroll = true; + TLP_Main.ColumnCount = 3; + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.Controls.Add(FLP_Attempts, 0, 0); + TLP_Main.Controls.Add(UC_Record0, 0, 1); + TLP_Main.Controls.Add(L_Trainer0, 1, 1); + TLP_Main.Controls.Add(UC_Trainer0, 2, 1); + TLP_Main.Controls.Add(UC_Record1, 0, 2); + TLP_Main.Controls.Add(L_Trainer1, 1, 2); + TLP_Main.Controls.Add(UC_Trainer1, 2, 2); + TLP_Main.Controls.Add(UC_Record2, 0, 3); + TLP_Main.Controls.Add(L_Trainer2, 1, 3); + TLP_Main.Controls.Add(UC_Trainer2, 2, 3); + TLP_Main.Controls.Add(UC_Record3, 0, 4); + TLP_Main.Controls.Add(L_Trainer3, 1, 4); + TLP_Main.Controls.Add(UC_Trainer3, 2, 4); + TLP_Main.Controls.Add(UC_Record4, 0, 5); + TLP_Main.Controls.Add(L_Trainer4, 1, 5); + TLP_Main.Controls.Add(UC_Trainer4, 2, 5); + TLP_Main.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Main.Location = new System.Drawing.Point(0, 0); + TLP_Main.Margin = new System.Windows.Forms.Padding(0); + TLP_Main.Name = "TLP_Main"; + TLP_Main.RowCount = 6; + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.Size = new System.Drawing.Size(613, 841); + TLP_Main.TabIndex = 0; + // + // FLP_Attempts + // + FLP_Attempts.AutoSize = true; + FLP_Attempts.Controls.Add(L_Attempts); + FLP_Attempts.Controls.Add(NUD_Attempts); + FLP_Attempts.Location = new System.Drawing.Point(0, 0); + FLP_Attempts.Margin = new System.Windows.Forms.Padding(0); + FLP_Attempts.Name = "FLP_Attempts"; + FLP_Attempts.Size = new System.Drawing.Size(189, 25); + FLP_Attempts.TabIndex = 0; + FLP_Attempts.WrapContents = false; + // + // L_Attempts + // + L_Attempts.Anchor = System.Windows.Forms.AnchorStyles.Left; + L_Attempts.AutoSize = true; + L_Attempts.Location = new System.Drawing.Point(3, 4); + L_Attempts.Name = "L_Attempts"; + L_Attempts.Size = new System.Drawing.Size(63, 17); + L_Attempts.TabIndex = 0; + L_Attempts.Text = "Attempts:"; + // + // NUD_Attempts + // + NUD_Attempts.Location = new System.Drawing.Point(69, 0); + NUD_Attempts.Margin = new System.Windows.Forms.Padding(0); + NUD_Attempts.Maximum = new decimal(new int[] { 9999999, 0, 0, 0 }); + NUD_Attempts.Name = "NUD_Attempts"; + NUD_Attempts.Size = new System.Drawing.Size(120, 25); + NUD_Attempts.TabIndex = 1; + // + // UC_Record0 + // + UC_Record0.AutoSize = true; + UC_Record0.Dock = System.Windows.Forms.DockStyle.Fill; + UC_Record0.Location = new System.Drawing.Point(0, 37); + UC_Record0.Margin = new System.Windows.Forms.Padding(0, 12, 0, 0); + UC_Record0.Name = "UC_Record0"; + UC_Record0.Size = new System.Drawing.Size(249, 148); + UC_Record0.TabIndex = 2; + // + // L_Trainer0 + // + L_Trainer0.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + L_Trainer0.AutoSize = true; + L_Trainer0.Location = new System.Drawing.Point(249, 25); + L_Trainer0.Margin = new System.Windows.Forms.Padding(0); + L_Trainer0.Name = "L_Trainer0"; + L_Trainer0.Padding = new System.Windows.Forms.Padding(0, 16, 0, 0); + L_Trainer0.Size = new System.Drawing.Size(62, 33); + L_Trainer0.TabIndex = 3; + L_Trainer0.Text = "Trainer 1:"; + // + // UC_Trainer0 + // + UC_Trainer0.AutoSize = true; + UC_Trainer0.Location = new System.Drawing.Point(311, 25); + UC_Trainer0.Margin = new System.Windows.Forms.Padding(0); + UC_Trainer0.Name = "UC_Trainer0"; + UC_Trainer0.Padding = new System.Windows.Forms.Padding(0, 12, 0, 0); + UC_Trainer0.Size = new System.Drawing.Size(207, 121); + UC_Trainer0.TabIndex = 4; + // + // UC_Record1 + // + UC_Record1.AutoSize = true; + UC_Record1.Dock = System.Windows.Forms.DockStyle.Fill; + UC_Record1.Location = new System.Drawing.Point(0, 197); + UC_Record1.Margin = new System.Windows.Forms.Padding(0, 12, 0, 0); + UC_Record1.Name = "UC_Record1"; + UC_Record1.Size = new System.Drawing.Size(249, 148); + UC_Record1.TabIndex = 5; + // + // L_Trainer1 + // + L_Trainer1.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + L_Trainer1.AutoSize = true; + L_Trainer1.Location = new System.Drawing.Point(249, 185); + L_Trainer1.Margin = new System.Windows.Forms.Padding(0); + L_Trainer1.Name = "L_Trainer1"; + L_Trainer1.Padding = new System.Windows.Forms.Padding(0, 16, 0, 0); + L_Trainer1.Size = new System.Drawing.Size(62, 33); + L_Trainer1.TabIndex = 6; + L_Trainer1.Text = "Trainer 2:"; + // + // UC_Trainer1 + // + UC_Trainer1.AutoSize = true; + UC_Trainer1.Location = new System.Drawing.Point(311, 185); + UC_Trainer1.Margin = new System.Windows.Forms.Padding(0); + UC_Trainer1.Name = "UC_Trainer1"; + UC_Trainer1.Padding = new System.Windows.Forms.Padding(0, 12, 0, 0); + UC_Trainer1.Size = new System.Drawing.Size(207, 121); + UC_Trainer1.TabIndex = 7; + // + // UC_Record2 + // + UC_Record2.AutoSize = true; + UC_Record2.Dock = System.Windows.Forms.DockStyle.Fill; + UC_Record2.Location = new System.Drawing.Point(0, 357); + UC_Record2.Margin = new System.Windows.Forms.Padding(0, 12, 0, 0); + UC_Record2.Name = "UC_Record2"; + UC_Record2.Size = new System.Drawing.Size(249, 148); + UC_Record2.TabIndex = 8; + // + // L_Trainer2 + // + L_Trainer2.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + L_Trainer2.AutoSize = true; + L_Trainer2.Location = new System.Drawing.Point(249, 345); + L_Trainer2.Margin = new System.Windows.Forms.Padding(0); + L_Trainer2.Name = "L_Trainer2"; + L_Trainer2.Padding = new System.Windows.Forms.Padding(0, 16, 0, 0); + L_Trainer2.Size = new System.Drawing.Size(62, 33); + L_Trainer2.TabIndex = 9; + L_Trainer2.Text = "Trainer 3:"; + // + // UC_Trainer2 + // + UC_Trainer2.AutoSize = true; + UC_Trainer2.Location = new System.Drawing.Point(311, 345); + UC_Trainer2.Margin = new System.Windows.Forms.Padding(0); + UC_Trainer2.Name = "UC_Trainer2"; + UC_Trainer2.Padding = new System.Windows.Forms.Padding(0, 12, 0, 0); + UC_Trainer2.Size = new System.Drawing.Size(207, 121); + UC_Trainer2.TabIndex = 10; + // + // UC_Record3 + // + UC_Record3.AutoSize = true; + UC_Record3.Dock = System.Windows.Forms.DockStyle.Fill; + UC_Record3.Location = new System.Drawing.Point(0, 517); + UC_Record3.Margin = new System.Windows.Forms.Padding(0, 12, 0, 0); + UC_Record3.Name = "UC_Record3"; + UC_Record3.Size = new System.Drawing.Size(249, 148); + UC_Record3.TabIndex = 11; + // + // L_Trainer3 + // + L_Trainer3.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + L_Trainer3.AutoSize = true; + L_Trainer3.Location = new System.Drawing.Point(249, 505); + L_Trainer3.Margin = new System.Windows.Forms.Padding(0); + L_Trainer3.Name = "L_Trainer3"; + L_Trainer3.Padding = new System.Windows.Forms.Padding(0, 16, 0, 0); + L_Trainer3.Size = new System.Drawing.Size(62, 33); + L_Trainer3.TabIndex = 12; + L_Trainer3.Text = "Trainer 4:"; + // + // UC_Trainer3 + // + UC_Trainer3.AutoSize = true; + UC_Trainer3.Location = new System.Drawing.Point(311, 505); + UC_Trainer3.Margin = new System.Windows.Forms.Padding(0); + UC_Trainer3.Name = "UC_Trainer3"; + UC_Trainer3.Padding = new System.Windows.Forms.Padding(0, 12, 0, 0); + UC_Trainer3.Size = new System.Drawing.Size(207, 121); + UC_Trainer3.TabIndex = 13; + // + // UC_Record4 + // + UC_Record4.AutoSize = true; + UC_Record4.Dock = System.Windows.Forms.DockStyle.Top; + UC_Record4.Location = new System.Drawing.Point(0, 677); + UC_Record4.Margin = new System.Windows.Forms.Padding(0, 12, 0, 0); + UC_Record4.Name = "UC_Record4"; + UC_Record4.Size = new System.Drawing.Size(249, 148); + UC_Record4.TabIndex = 14; + // + // L_Trainer4 + // + L_Trainer4.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + L_Trainer4.AutoSize = true; + L_Trainer4.Location = new System.Drawing.Point(249, 665); + L_Trainer4.Margin = new System.Windows.Forms.Padding(0); + L_Trainer4.Name = "L_Trainer4"; + L_Trainer4.Padding = new System.Windows.Forms.Padding(0, 16, 0, 0); + L_Trainer4.Size = new System.Drawing.Size(62, 33); + L_Trainer4.TabIndex = 15; + L_Trainer4.Text = "Trainer 5:"; + // + // UC_Trainer4 + // + UC_Trainer4.AutoSize = true; + UC_Trainer4.Location = new System.Drawing.Point(311, 665); + UC_Trainer4.Margin = new System.Windows.Forms.Padding(0); + UC_Trainer4.Name = "UC_Trainer4"; + UC_Trainer4.Padding = new System.Windows.Forms.Padding(0, 12, 0, 0); + UC_Trainer4.Size = new System.Drawing.Size(207, 121); + UC_Trainer4.TabIndex = 16; + // + // PokeathlonConnection4Editor + // + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + Controls.Add(TLP_Main); + Margin = new System.Windows.Forms.Padding(0); + Name = "PokeathlonConnection4Editor"; + Size = new System.Drawing.Size(613, 841); + TLP_Main.ResumeLayout(false); + TLP_Main.PerformLayout(); + FLP_Attempts.ResumeLayout(false); + FLP_Attempts.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Attempts).EndInit(); + ResumeLayout(false); + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel TLP_Main; + private System.Windows.Forms.FlowLayoutPanel FLP_Attempts; + private System.Windows.Forms.Label L_Attempts; + private System.Windows.Forms.NumericUpDown NUD_Attempts; + private PokeathlonEventRecord4Editor UC_Record0; + private System.Windows.Forms.Label L_Trainer0; + private PokeathlonEventTrainer4Editor UC_Trainer0; + private PokeathlonEventRecord4Editor UC_Record1; + private System.Windows.Forms.Label L_Trainer1; + private PokeathlonEventTrainer4Editor UC_Trainer1; + private PokeathlonEventRecord4Editor UC_Record2; + private System.Windows.Forms.Label L_Trainer2; + private PokeathlonEventTrainer4Editor UC_Trainer2; + private PokeathlonEventRecord4Editor UC_Record3; + private System.Windows.Forms.Label L_Trainer3; + private PokeathlonEventTrainer4Editor UC_Trainer3; + private PokeathlonEventRecord4Editor UC_Record4; + private System.Windows.Forms.Label L_Trainer4; + private PokeathlonEventTrainer4Editor UC_Trainer4; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonConnection4Editor.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonConnection4Editor.cs new file mode 100644 index 000000000..71d1eee2a --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonConnection4Editor.cs @@ -0,0 +1,46 @@ +using System; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms; + +public sealed partial class PokeathlonConnection4Editor : UserControl +{ + public PokeathlonConnection4Editor() + { + InitializeComponent(); + EventRecords = [UC_Record0, UC_Record1, UC_Record2, UC_Record3, UC_Record4]; + Trainers = [UC_Trainer0, UC_Trainer1, UC_Trainer2, UC_Trainer3, UC_Trainer4]; + } + + private PokeathlonEventRecord4Editor[] EventRecords { get; } + private PokeathlonEventTrainer4Editor[] Trainers { get; } + + public void LoadObject(PokeathlonConnection4 entity) + { + SuspendLayout(); + TLP_Main.SuspendLayout(); + + var inner = entity.Inner; + NUD_Attempts.Value = Math.Clamp(inner.Attempts, 0, (uint)NUD_Attempts.Maximum); + for (int i = 0; i < EventRecords.Length; i++) + { + EventRecords[i].LoadObject(inner.GetRecord(i)); + Trainers[i].LoadObject(entity.GetTrainer(i)); + } + + TLP_Main.ResumeLayout(); + ResumeLayout(); + } + + public void SaveObject(PokeathlonConnection4 entity) + { + var inner = entity.Inner; + inner.Attempts = (uint)NUD_Attempts.Value; + for (int i = 0; i < EventRecords.Length; i++) + { + EventRecords[i].SaveObject(inner.GetRecord(i)); + Trainers[i].SaveObject(entity.GetTrainer(i)); + } + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventData4Editor.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventData4Editor.Designer.cs new file mode 100644 index 000000000..0870d20f1 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventData4Editor.Designer.cs @@ -0,0 +1,157 @@ +namespace PKHeX.WinForms +{ + partial class PokeathlonEventData4Editor + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + components.Dispose(); + base.Dispose(disposing); + } + + #region Component Designer generated code + + private void InitializeComponent() + { + TLP_Main = new System.Windows.Forms.TableLayoutPanel(); + L_Attempts = new System.Windows.Forms.Label(); + NUD_Attempts = new System.Windows.Forms.NumericUpDown(); + UC_Record0 = new PokeathlonEventRecord4Editor(); + UC_Record1 = new PokeathlonEventRecord4Editor(); + UC_Record2 = new PokeathlonEventRecord4Editor(); + UC_Record3 = new PokeathlonEventRecord4Editor(); + UC_Record4 = new PokeathlonEventRecord4Editor(); + TLP_Main.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Attempts).BeginInit(); + SuspendLayout(); + // + // TLP_Main + // + TLP_Main.AutoScroll = true; + TLP_Main.AutoSize = true; + TLP_Main.ColumnCount = 2; + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_Main.Controls.Add(L_Attempts, 0, 0); + TLP_Main.Controls.Add(NUD_Attempts, 1, 0); + TLP_Main.Controls.Add(UC_Record0, 0, 1); + TLP_Main.Controls.Add(UC_Record1, 0, 2); + TLP_Main.Controls.Add(UC_Record2, 0, 3); + TLP_Main.Controls.Add(UC_Record3, 0, 4); + TLP_Main.Controls.Add(UC_Record4, 0, 5); + TLP_Main.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Main.Location = new System.Drawing.Point(0, 0); + TLP_Main.Margin = new System.Windows.Forms.Padding(0); + TLP_Main.Name = "TLP_Main"; + TLP_Main.RowCount = 6; + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.Size = new System.Drawing.Size(258, 841); + TLP_Main.TabIndex = 0; + // + // L_Attempts + // + L_Attempts.Anchor = System.Windows.Forms.AnchorStyles.Left; + L_Attempts.AutoSize = true; + L_Attempts.Location = new System.Drawing.Point(3, 4); + L_Attempts.Name = "L_Attempts"; + L_Attempts.Size = new System.Drawing.Size(63, 17); + L_Attempts.TabIndex = 0; + L_Attempts.Text = "Attempts:"; + // + // NUD_Attempts + // + NUD_Attempts.Location = new System.Drawing.Point(69, 0); + NUD_Attempts.Margin = new System.Windows.Forms.Padding(0); + NUD_Attempts.Maximum = new decimal(new int[] { 9999999, 0, 0, 0 }); + NUD_Attempts.Name = "NUD_Attempts"; + NUD_Attempts.Size = new System.Drawing.Size(120, 25); + NUD_Attempts.TabIndex = 1; + // + // UC_Record0 + // + UC_Record0.AutoSize = true; + TLP_Main.SetColumnSpan(UC_Record0, 2); + UC_Record0.Dock = System.Windows.Forms.DockStyle.Fill; + UC_Record0.Location = new System.Drawing.Point(0, 37); + UC_Record0.Margin = new System.Windows.Forms.Padding(0, 12, 0, 0); + UC_Record0.Name = "UC_Record0"; + UC_Record0.Size = new System.Drawing.Size(258, 148); + UC_Record0.TabIndex = 2; + // + // UC_Record1 + // + UC_Record1.AutoSize = true; + TLP_Main.SetColumnSpan(UC_Record1, 2); + UC_Record1.Dock = System.Windows.Forms.DockStyle.Fill; + UC_Record1.Location = new System.Drawing.Point(0, 197); + UC_Record1.Margin = new System.Windows.Forms.Padding(0, 12, 0, 0); + UC_Record1.Name = "UC_Record1"; + UC_Record1.Size = new System.Drawing.Size(258, 148); + UC_Record1.TabIndex = 3; + // + // UC_Record2 + // + UC_Record2.AutoSize = true; + TLP_Main.SetColumnSpan(UC_Record2, 2); + UC_Record2.Dock = System.Windows.Forms.DockStyle.Fill; + UC_Record2.Location = new System.Drawing.Point(0, 357); + UC_Record2.Margin = new System.Windows.Forms.Padding(0, 12, 0, 0); + UC_Record2.Name = "UC_Record2"; + UC_Record2.Size = new System.Drawing.Size(258, 148); + UC_Record2.TabIndex = 4; + // + // UC_Record3 + // + UC_Record3.AutoSize = true; + TLP_Main.SetColumnSpan(UC_Record3, 2); + UC_Record3.Dock = System.Windows.Forms.DockStyle.Fill; + UC_Record3.Location = new System.Drawing.Point(0, 517); + UC_Record3.Margin = new System.Windows.Forms.Padding(0, 12, 0, 0); + UC_Record3.Name = "UC_Record3"; + UC_Record3.Size = new System.Drawing.Size(258, 148); + UC_Record3.TabIndex = 5; + // + // UC_Record4 + // + UC_Record4.AutoSize = true; + TLP_Main.SetColumnSpan(UC_Record4, 2); + UC_Record4.Location = new System.Drawing.Point(0, 677); + UC_Record4.Margin = new System.Windows.Forms.Padding(0, 12, 0, 0); + UC_Record4.Name = "UC_Record4"; + UC_Record4.Size = new System.Drawing.Size(249, 148); + UC_Record4.TabIndex = 6; + // + // PokeathlonEventData4Editor + // + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + AutoSize = true; + Controls.Add(TLP_Main); + Margin = new System.Windows.Forms.Padding(0); + Name = "PokeathlonEventData4Editor"; + Size = new System.Drawing.Size(258, 841); + TLP_Main.ResumeLayout(false); + TLP_Main.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Attempts).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel TLP_Main; + private System.Windows.Forms.Label L_Attempts; + private System.Windows.Forms.NumericUpDown NUD_Attempts; + private PokeathlonEventRecord4Editor UC_Record0; + private PokeathlonEventRecord4Editor UC_Record1; + private PokeathlonEventRecord4Editor UC_Record2; + private PokeathlonEventRecord4Editor UC_Record3; + private PokeathlonEventRecord4Editor UC_Record4; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventData4Editor.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventData4Editor.cs new file mode 100644 index 000000000..e62aad2b6 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventData4Editor.cs @@ -0,0 +1,30 @@ +using System; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms; + +public sealed partial class PokeathlonEventData4Editor : UserControl +{ + public PokeathlonEventData4Editor() + { + InitializeComponent(); + EventRecords = [UC_Record0, UC_Record1, UC_Record2, UC_Record3, UC_Record4]; + } + + private PokeathlonEventRecord4Editor[] EventRecords { get; } + + public void LoadObject(PokeathlonEventData4 entity) + { + NUD_Attempts.Value = Math.Clamp(entity.Attempts, 0, (uint)NUD_Attempts.Maximum); + for (int i = 0; i < EventRecords.Length; i++) + EventRecords[i].LoadObject(entity.GetRecord(i)); + } + + public void SaveObject(PokeathlonEventData4 entity) + { + entity.Attempts = (uint)NUD_Attempts.Value; + for (int i = 0; i < EventRecords.Length; i++) + EventRecords[i].SaveObject(entity.GetRecord(i)); + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventRecord4Editor.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventRecord4Editor.Designer.cs new file mode 100644 index 000000000..783c6af60 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventRecord4Editor.Designer.cs @@ -0,0 +1,122 @@ +namespace PKHeX.WinForms +{ + partial class PokeathlonEventRecord4Editor + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + components.Dispose(); + base.Dispose(disposing); + } + + #region Component Designer generated code + + private void InitializeComponent() + { + TLP_Main = new System.Windows.Forms.TableLayoutPanel(); + L_Record = new System.Windows.Forms.Label(); + NUD_Record = new System.Windows.Forms.NumericUpDown(); + UC_Entry0 = new PokeathlonSpeciesForm4Editor(); + UC_Entry1 = new PokeathlonSpeciesForm4Editor(); + UC_Entry2 = new PokeathlonSpeciesForm4Editor(); + TLP_Main.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Record).BeginInit(); + SuspendLayout(); + // + // TLP_Main + // + TLP_Main.AutoSize = true; + TLP_Main.ColumnCount = 2; + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.Controls.Add(L_Record, 0, 0); + TLP_Main.Controls.Add(NUD_Record, 1, 0); + TLP_Main.Controls.Add(UC_Entry0, 0, 1); + TLP_Main.Controls.Add(UC_Entry1, 0, 2); + TLP_Main.Controls.Add(UC_Entry2, 0, 3); + TLP_Main.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Main.Location = new System.Drawing.Point(0, 0); + TLP_Main.Margin = new System.Windows.Forms.Padding(0); + TLP_Main.Name = "TLP_Main"; + TLP_Main.RowCount = 4; + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.Size = new System.Drawing.Size(512, 145); + TLP_Main.TabIndex = 0; + // + // L_Record + // + L_Record.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Record.AutoSize = true; + L_Record.Location = new System.Drawing.Point(3, 4); + L_Record.Name = "L_Record"; + L_Record.Size = new System.Drawing.Size(48, 17); + L_Record.TabIndex = 0; + L_Record.Text = "Record:"; + // + // NUD_Record + // + NUD_Record.Location = new System.Drawing.Point(57, 0); + NUD_Record.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3); + NUD_Record.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_Record.Name = "NUD_Record"; + NUD_Record.Size = new System.Drawing.Size(120, 25); + NUD_Record.TabIndex = 1; + // + // UC_Entry0 + // + TLP_Main.SetColumnSpan(UC_Entry0, 2); + UC_Entry0.Anchor = System.Windows.Forms.AnchorStyles.Left; + UC_Entry0.Location = new System.Drawing.Point(0, 28); + UC_Entry0.Margin = new System.Windows.Forms.Padding(0); + UC_Entry0.Name = "UC_Entry0"; + UC_Entry0.Size = new System.Drawing.Size(249, 40); + UC_Entry0.TabIndex = 2; + // + // UC_Entry1 + // + TLP_Main.SetColumnSpan(UC_Entry1, 2); + UC_Entry1.Anchor = System.Windows.Forms.AnchorStyles.Left; + UC_Entry1.Location = new System.Drawing.Point(0, 68); + UC_Entry1.Margin = new System.Windows.Forms.Padding(0); + UC_Entry1.Name = "UC_Entry1"; + UC_Entry1.Size = new System.Drawing.Size(249, 40); + UC_Entry1.TabIndex = 3; + // + // UC_Entry2 + // + TLP_Main.SetColumnSpan(UC_Entry2, 2); + UC_Entry2.Anchor = System.Windows.Forms.AnchorStyles.Left; + UC_Entry2.Location = new System.Drawing.Point(0, 108); + UC_Entry2.Margin = new System.Windows.Forms.Padding(0); + UC_Entry2.Name = "UC_Entry2"; + UC_Entry2.Size = new System.Drawing.Size(249, 40); + UC_Entry2.TabIndex = 4; + // + // PokeathlonEventRecord4Editor + // + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + Controls.Add(TLP_Main); + Name = "PokeathlonEventRecord4Editor"; + Size = new System.Drawing.Size(249, 145); + TLP_Main.ResumeLayout(false); + TLP_Main.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Record).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel TLP_Main; + private System.Windows.Forms.Label L_Record; + private System.Windows.Forms.NumericUpDown NUD_Record; + private PokeathlonSpeciesForm4Editor UC_Entry0; + private PokeathlonSpeciesForm4Editor UC_Entry1; + private PokeathlonSpeciesForm4Editor UC_Entry2; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventRecord4Editor.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventRecord4Editor.cs new file mode 100644 index 000000000..ad54d6dba --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventRecord4Editor.cs @@ -0,0 +1,29 @@ +using System; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms; + +public sealed partial class PokeathlonEventRecord4Editor : UserControl +{ + public PokeathlonEventRecord4Editor() + { + InitializeComponent(); + } + + public void LoadObject(PokeathlonEventRecord4 entity) + { + NUD_Record.Value = Math.Clamp(entity.Record, (ushort)0, (ushort)NUD_Record.Maximum); + UC_Entry0.LoadValues(entity.Entry0.Species, entity.Entry0.Form); + UC_Entry1.LoadValues(entity.Entry1.Species, entity.Entry1.Form); + UC_Entry2.LoadValues(entity.Entry2.Species, entity.Entry2.Form); + } + + public void SaveObject(PokeathlonEventRecord4 entity) + { + entity.Record = (ushort)NUD_Record.Value; + entity.Entry0 = new SpeciesForm10 { Species = UC_Entry0.Species, Form = UC_Entry0.Form }; + entity.Entry1 = new SpeciesForm10 { Species = UC_Entry1.Species, Form = UC_Entry1.Form }; + entity.Entry2 = new SpeciesForm10 { Species = UC_Entry2.Species, Form = UC_Entry2.Form }; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventTrainer4Editor.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventTrainer4Editor.Designer.cs new file mode 100644 index 000000000..2441cb9cd --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventTrainer4Editor.Designer.cs @@ -0,0 +1,160 @@ +namespace PKHeX.WinForms +{ + partial class PokeathlonEventTrainer4Editor + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + components.Dispose(); + base.Dispose(disposing); + } + + #region Component Designer generated code + + private void InitializeComponent() + { + TLP_Main = new System.Windows.Forms.TableLayoutPanel(); + L_OT = new System.Windows.Forms.Label(); + TB_OT = new System.Windows.Forms.TextBox(); + L_TID16 = new System.Windows.Forms.Label(); + TB_TID16 = new System.Windows.Forms.TextBox(); + L_SID16 = new System.Windows.Forms.Label(); + TB_SID16 = new System.Windows.Forms.TextBox(); + L_Language = new System.Windows.Forms.Label(); + CB_Language = new System.Windows.Forms.ComboBox(); + TLP_Main.SuspendLayout(); + SuspendLayout(); + // + // TLP_Main + // + TLP_Main.AutoSize = true; + TLP_Main.ColumnCount = 2; + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.Controls.Add(L_OT, 0, 0); + TLP_Main.Controls.Add(TB_OT, 1, 0); + TLP_Main.Controls.Add(L_TID16, 0, 1); + TLP_Main.Controls.Add(TB_TID16, 1, 1); + TLP_Main.Controls.Add(L_SID16, 0, 2); + TLP_Main.Controls.Add(TB_SID16, 1, 2); + TLP_Main.Controls.Add(L_Language, 0, 3); + TLP_Main.Controls.Add(CB_Language, 1, 3); + TLP_Main.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Main.Location = new System.Drawing.Point(0, 0); + TLP_Main.Margin = new System.Windows.Forms.Padding(0); + TLP_Main.Name = "TLP_Main"; + TLP_Main.RowCount = 4; + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.Size = new System.Drawing.Size(225, 118); + TLP_Main.TabIndex = 0; + // + // L_OT + // + L_OT.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_OT.AutoSize = true; + L_OT.Location = new System.Drawing.Point(41, 5); + L_OT.Margin = new System.Windows.Forms.Padding(0); + L_OT.Name = "L_OT"; + L_OT.Size = new System.Drawing.Size(27, 17); + L_OT.TabIndex = 0; + L_OT.Text = "OT:"; + // + // TB_OT + // + TB_OT.Anchor = System.Windows.Forms.AnchorStyles.Left; + TB_OT.Location = new System.Drawing.Point(71, 0); + TB_OT.Margin = new System.Windows.Forms.Padding(3, 0, 0, 3); + TB_OT.Name = "TB_OT"; + TB_OT.Size = new System.Drawing.Size(136, 25); + TB_OT.TabIndex = 1; + // + // L_TID16 + // + L_TID16.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_TID16.AutoSize = true; + L_TID16.Location = new System.Drawing.Point(38, 33); + L_TID16.Margin = new System.Windows.Forms.Padding(0); + L_TID16.Name = "L_TID16"; + L_TID16.Size = new System.Drawing.Size(30, 17); + L_TID16.TabIndex = 2; + L_TID16.Text = "TID:"; + // + // TB_TID16 + // + TB_TID16.Location = new System.Drawing.Point(71, 28); + TB_TID16.Margin = new System.Windows.Forms.Padding(3, 0, 0, 3); + TB_TID16.Name = "TB_TID16"; + TB_TID16.Size = new System.Drawing.Size(90, 25); + TB_TID16.TabIndex = 3; + // + // L_SID16 + // + L_SID16.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_SID16.AutoSize = true; + L_SID16.Location = new System.Drawing.Point(38, 61); + L_SID16.Margin = new System.Windows.Forms.Padding(0); + L_SID16.Name = "L_SID16"; + L_SID16.Size = new System.Drawing.Size(30, 17); + L_SID16.TabIndex = 4; + L_SID16.Text = "SID:"; + // + // TB_SID16 + // + TB_SID16.Location = new System.Drawing.Point(71, 56); + TB_SID16.Margin = new System.Windows.Forms.Padding(3, 0, 0, 3); + TB_SID16.Name = "TB_SID16"; + TB_SID16.Size = new System.Drawing.Size(90, 25); + TB_SID16.TabIndex = 5; + // + // L_Language + // + L_Language.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + L_Language.AutoSize = true; + L_Language.Location = new System.Drawing.Point(0, 88); + L_Language.Margin = new System.Windows.Forms.Padding(0, 4, 0, 0); + L_Language.Name = "L_Language"; + L_Language.Size = new System.Drawing.Size(68, 17); + L_Language.TabIndex = 6; + L_Language.Text = "Language:"; + // + // CB_Language + // + CB_Language.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_Language.FormattingEnabled = true; + CB_Language.Location = new System.Drawing.Point(71, 84); + CB_Language.Margin = new System.Windows.Forms.Padding(3, 0, 0, 0); + CB_Language.Name = "CB_Language"; + CB_Language.Size = new System.Drawing.Size(136, 25); + CB_Language.TabIndex = 7; + // + // PokeathlonEventTrainer4Editor + // + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + AutoSize = true; + Controls.Add(TLP_Main); + Name = "PokeathlonEventTrainer4Editor"; + Size = new System.Drawing.Size(225, 118); + TLP_Main.ResumeLayout(false); + TLP_Main.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel TLP_Main; + private System.Windows.Forms.Label L_OT; + private System.Windows.Forms.TextBox TB_OT; + private System.Windows.Forms.Label L_TID16; + private System.Windows.Forms.TextBox TB_TID16; + private System.Windows.Forms.Label L_SID16; + private System.Windows.Forms.TextBox TB_SID16; + private System.Windows.Forms.Label L_Language; + private System.Windows.Forms.ComboBox CB_Language; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventTrainer4Editor.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventTrainer4Editor.cs new file mode 100644 index 000000000..66eba08d6 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventTrainer4Editor.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms; + +public sealed partial class PokeathlonEventTrainer4Editor : UserControl +{ + public PokeathlonEventTrainer4Editor() + { + InitializeComponent(); + var languages = new List { new(GameInfo.Strings.specieslist[0], 0) }; + languages.AddRange(GameInfo.LanguageDataSource(4, EntityContext.Gen4).Where(z => z.Value is not 0)); + CB_Language.InitializeBinding(); + CB_Language.DataSource = new BindingSource(languages, string.Empty); + } + + public void LoadObject(PokeathlonEventTrainer4 entity) + { + TB_OT.Text = entity.OT; + TB_TID16.Text = entity.TID16.ToString(CultureInfo.InvariantCulture); + TB_SID16.Text = entity.SID16.ToString(CultureInfo.InvariantCulture); + CB_Language.SelectedValue = (int)entity.Language; + } + + public void SaveObject(PokeathlonEventTrainer4 entity) + { + entity.OT = TB_OT.Text; + entity.TID16 = ParseU16(TB_TID16.Text); + entity.SID16 = ParseU16(TB_SID16.Text); + entity.Language = (byte)WinFormsUtil.GetIndex(CB_Language); + } + + private static ushort ParseU16(string text) + { + if (!ushort.TryParse(text, NumberStyles.Integer, CultureInfo.InvariantCulture, out var value)) + return 0; + return value; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonParticipant4Editor.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonParticipant4Editor.Designer.cs new file mode 100644 index 000000000..24a0428c5 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonParticipant4Editor.Designer.cs @@ -0,0 +1,188 @@ +using PKHeX.WinForms.Controls; + +namespace PKHeX.WinForms +{ + partial class PokeathlonParticipant4Editor + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + components.Dispose(); + base.Dispose(disposing); + } + + #region Component Designer generated code + + private void InitializeComponent() + { + TLP_Main = new System.Windows.Forms.TableLayoutPanel(); + UC_SpeciesForm = new PokeathlonSpeciesForm4Editor(); + FLP_Meta = new System.Windows.Forms.FlowLayoutPanel(); + GT_Gender = new GenderToggle(); + CHK_IsShiny = new System.Windows.Forms.CheckBox(); + L_PID = new System.Windows.Forms.Label(); + TB_PID = new System.Windows.Forms.TextBox(); + L_TID16 = new System.Windows.Forms.Label(); + TB_TID16 = new System.Windows.Forms.TextBox(); + L_SID16 = new System.Windows.Forms.Label(); + TB_SID16 = new System.Windows.Forms.TextBox(); + TLP_Main.SuspendLayout(); + FLP_Meta.SuspendLayout(); + SuspendLayout(); + // + // TLP_Main + // + TLP_Main.AutoSize = true; + TLP_Main.ColumnCount = 1; + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_Main.Controls.Add(UC_SpeciesForm, 0, 0); + TLP_Main.Controls.Add(FLP_Meta, 0, 1); + TLP_Main.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Main.Location = new System.Drawing.Point(0, 0); + TLP_Main.Margin = new System.Windows.Forms.Padding(0); + TLP_Main.Name = "TLP_Main"; + TLP_Main.RowCount = 2; + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.Size = new System.Drawing.Size(572, 76); + TLP_Main.TabIndex = 0; + // + // UC_SpeciesForm + // + UC_SpeciesForm.DisplayGender = 0; + UC_SpeciesForm.DisplayShiny = false; + UC_SpeciesForm.Dock = System.Windows.Forms.DockStyle.Fill; + UC_SpeciesForm.Location = new System.Drawing.Point(0, 0); + UC_SpeciesForm.Margin = new System.Windows.Forms.Padding(0); + UC_SpeciesForm.Name = "UC_SpeciesForm"; + UC_SpeciesForm.Size = new System.Drawing.Size(572, 40); + UC_SpeciesForm.TabIndex = 0; + // + // FLP_Meta + // + FLP_Meta.AutoSize = true; + FLP_Meta.Controls.Add(GT_Gender); + FLP_Meta.Controls.Add(CHK_IsShiny); + FLP_Meta.Controls.Add(L_PID); + FLP_Meta.Controls.Add(TB_PID); + FLP_Meta.Controls.Add(L_TID16); + FLP_Meta.Controls.Add(TB_TID16); + FLP_Meta.Controls.Add(L_SID16); + FLP_Meta.Controls.Add(TB_SID16); + FLP_Meta.Dock = System.Windows.Forms.DockStyle.Fill; + FLP_Meta.Location = new System.Drawing.Point(0, 40); + FLP_Meta.Margin = new System.Windows.Forms.Padding(0); + FLP_Meta.Name = "FLP_Meta"; + FLP_Meta.Size = new System.Drawing.Size(572, 36); + FLP_Meta.TabIndex = 1; + FLP_Meta.WrapContents = false; + // + // GT_Gender + // + GT_Gender.AllowClick = true; + GT_Gender.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + GT_Gender.Gender = 255; + GT_Gender.Location = new System.Drawing.Point(0, 4); + GT_Gender.Margin = new System.Windows.Forms.Padding(0, 4, 6, 0); + GT_Gender.Name = "GT_Gender"; + GT_Gender.Size = new System.Drawing.Size(18, 18); + GT_Gender.TabIndex = 0; + // + // CHK_IsShiny + // + CHK_IsShiny.AutoSize = true; + CHK_IsShiny.Location = new System.Drawing.Point(24, 2); + CHK_IsShiny.Margin = new System.Windows.Forms.Padding(0, 2, 12, 0); + CHK_IsShiny.Name = "CHK_IsShiny"; + CHK_IsShiny.Size = new System.Drawing.Size(57, 21); + CHK_IsShiny.TabIndex = 1; + CHK_IsShiny.Text = "Shiny"; + CHK_IsShiny.UseVisualStyleBackColor = true; + // + // L_PID + // + L_PID.Anchor = System.Windows.Forms.AnchorStyles.Left; + L_PID.AutoSize = true; + L_PID.Location = new System.Drawing.Point(96, 4); + L_PID.Name = "L_PID"; + L_PID.Size = new System.Drawing.Size(26, 17); + L_PID.TabIndex = 2; + L_PID.Text = "PID:"; + // + // TB_PID + // + TB_PID.Location = new System.Drawing.Point(128, 0); + TB_PID.Margin = new System.Windows.Forms.Padding(3, 0, 12, 0); + TB_PID.MaxLength = 8; + TB_PID.Name = "TB_PID"; + TB_PID.Size = new System.Drawing.Size(86, 25); + TB_PID.TabIndex = 3; + // + // L_TID16 + // + L_TID16.Anchor = System.Windows.Forms.AnchorStyles.Left; + L_TID16.AutoSize = true; + L_TID16.Location = new System.Drawing.Point(229, 4); + L_TID16.Name = "L_TID16"; + L_TID16.Size = new System.Drawing.Size(30, 17); + L_TID16.TabIndex = 4; + L_TID16.Text = "TID:"; + // + // TB_TID16 + // + TB_TID16.Location = new System.Drawing.Point(265, 0); + TB_TID16.Margin = new System.Windows.Forms.Padding(3, 0, 12, 0); + TB_TID16.Name = "TB_TID16"; + TB_TID16.Size = new System.Drawing.Size(68, 25); + TB_TID16.TabIndex = 5; + // + // L_SID16 + // + L_SID16.Anchor = System.Windows.Forms.AnchorStyles.Left; + L_SID16.AutoSize = true; + L_SID16.Location = new System.Drawing.Point(348, 4); + L_SID16.Name = "L_SID16"; + L_SID16.Size = new System.Drawing.Size(30, 17); + L_SID16.TabIndex = 6; + L_SID16.Text = "SID:"; + // + // TB_SID16 + // + TB_SID16.Location = new System.Drawing.Point(384, 0); + TB_SID16.Margin = new System.Windows.Forms.Padding(3, 0, 0, 0); + TB_SID16.Name = "TB_SID16"; + TB_SID16.Size = new System.Drawing.Size(68, 25); + TB_SID16.TabIndex = 7; + // + // PokeathlonParticipant4Editor + // + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + AutoSize = true; + Controls.Add(TLP_Main); + Name = "PokeathlonParticipant4Editor"; + Size = new System.Drawing.Size(572, 76); + TLP_Main.ResumeLayout(false); + TLP_Main.PerformLayout(); + FLP_Meta.ResumeLayout(false); + FLP_Meta.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel TLP_Main; + private PokeathlonSpeciesForm4Editor UC_SpeciesForm; + private GenderToggle GT_Gender; + private System.Windows.Forms.CheckBox CHK_IsShiny; + private System.Windows.Forms.FlowLayoutPanel FLP_Meta; + private System.Windows.Forms.Label L_PID; + private System.Windows.Forms.TextBox TB_PID; + private System.Windows.Forms.Label L_TID16; + private System.Windows.Forms.TextBox TB_TID16; + private System.Windows.Forms.Label L_SID16; + private System.Windows.Forms.TextBox TB_SID16; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonParticipant4Editor.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonParticipant4Editor.cs new file mode 100644 index 000000000..79ec167a4 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonParticipant4Editor.cs @@ -0,0 +1,84 @@ +using System.Globalization; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms; + +public sealed partial class PokeathlonParticipant4Editor : UserControl +{ + private bool IsLoading; + + public PokeathlonParticipant4Editor() + { + InitializeComponent(); + UC_SpeciesForm.ValueChanged += (_, _) => SpeciesFormChanged(); + GT_Gender.Click += (_, _) => WriteBack(); + CHK_IsShiny.CheckedChanged += (_, _) => ShinyChanged(); + TB_PID.TextChanged += (_, _) => WriteBack(); + TB_TID16.TextChanged += (_, _) => WriteBack(); + TB_SID16.TextChanged += (_, _) => WriteBack(); + } + + public void LoadObject(PokeathlonParticipant4 entity) + { + IsLoading = true; + UC_SpeciesForm.DisplayGender = entity.Gender; + UC_SpeciesForm.DisplayShiny = entity.IsShiny; + UC_SpeciesForm.LoadValues(entity.Species, entity.Form); + GT_Gender.Gender = entity.Gender; + CHK_IsShiny.Checked = entity.IsShiny; + TB_PID.Text = entity.EncryptionConstant.ToString("X8"); + TB_TID16.Text = entity.TID16.ToString("00000"); + TB_SID16.Text = entity.SID16.ToString("00000"); + IsLoading = false; + } + + public void SaveObject(PokeathlonParticipant4 entity) + { + entity.Species = UC_SpeciesForm.Species; + entity.Form = UC_SpeciesForm.Form; + entity.Gender = GT_Gender.Gender; + entity.IsShiny = CHK_IsShiny.Checked; + entity.EncryptionConstant = ParseHex(TB_PID.Text); + entity.TID16 = ParseU16(TB_TID16.Text); + entity.SID16 = ParseU16(TB_SID16.Text); + } + + private void SpeciesFormChanged() + { + if (IsLoading) + return; + WriteBack(); + } + + private void ShinyChanged() + { + if (IsLoading) + return; + UC_SpeciesForm.DisplayShiny = CHK_IsShiny.Checked; + WriteBack(); + } + + private void WriteBack() + { + if (IsLoading) + return; + UC_SpeciesForm.DisplayGender = GT_Gender.Gender; + UC_SpeciesForm.DisplayShiny = CHK_IsShiny.Checked; + } + + private static ushort ParseU16(string text) + { + if (!ushort.TryParse(text, NumberStyles.Integer, CultureInfo.InvariantCulture, out var value)) + return 0; + return value; + } + + private static uint ParseHex(string text) + { + text = Util.GetOnlyHex(text); + if (!uint.TryParse(text, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var value)) + return 0; + return value; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonSpeciesForm4Editor.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonSpeciesForm4Editor.Designer.cs new file mode 100644 index 000000000..fba24070c --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonSpeciesForm4Editor.Designer.cs @@ -0,0 +1,98 @@ +namespace PKHeX.WinForms +{ + partial class PokeathlonSpeciesForm4Editor + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + components.Dispose(); + base.Dispose(disposing); + } + + #region Component Designer generated code + + private void InitializeComponent() + { + TLP_Main = new System.Windows.Forms.TableLayoutPanel(); + PB_Sprite = new System.Windows.Forms.PictureBox(); + CB_Species = new System.Windows.Forms.ComboBox(); + CB_Form = new System.Windows.Forms.ComboBox(); + TLP_Main.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)PB_Sprite).BeginInit(); + SuspendLayout(); + // + // TLP_Main + // + TLP_Main.AutoSize = true; + TLP_Main.ColumnCount = 3; + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.Controls.Add(PB_Sprite, 0, 0); + TLP_Main.Controls.Add(CB_Species, 1, 0); + TLP_Main.Controls.Add(CB_Form, 2, 0); + TLP_Main.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Main.Location = new System.Drawing.Point(0, 0); + TLP_Main.Margin = new System.Windows.Forms.Padding(0); + TLP_Main.Name = "TLP_Main"; + TLP_Main.RowCount = 1; + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_Main.Size = new System.Drawing.Size(420, 40); + TLP_Main.TabIndex = 0; + // + // PB_Sprite + // + PB_Sprite.Dock = System.Windows.Forms.DockStyle.Fill; + PB_Sprite.Location = new System.Drawing.Point(0, 0); + PB_Sprite.Margin = new System.Windows.Forms.Padding(0); + PB_Sprite.Name = "PB_Sprite"; + PB_Sprite.Size = new System.Drawing.Size(40, 40); + PB_Sprite.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + PB_Sprite.TabIndex = 0; + PB_Sprite.TabStop = false; + // + // CB_Species + // + CB_Species.Anchor = System.Windows.Forms.AnchorStyles.Left; + CB_Species.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CB_Species.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CB_Species.FormattingEnabled = true; + CB_Species.Location = new System.Drawing.Point(43, 6); + CB_Species.Margin = new System.Windows.Forms.Padding(3, 6, 3, 6); + CB_Species.Name = "CB_Species"; + CB_Species.Size = new System.Drawing.Size(120, 25); + CB_Species.TabIndex = 1; + // + // CB_Form + // + CB_Form.Anchor = System.Windows.Forms.AnchorStyles.Left; + CB_Form.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_Form.FormattingEnabled = true; + CB_Form.Location = new System.Drawing.Point(169, 6); + CB_Form.Margin = new System.Windows.Forms.Padding(3, 6, 0, 6); + CB_Form.Name = "CB_Form"; + CB_Form.Size = new System.Drawing.Size(80, 25); + CB_Form.TabIndex = 2; + // + // PokeathlonSpeciesForm4Editor + // + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + Controls.Add(TLP_Main); + Name = "PokeathlonSpeciesForm4Editor"; + Size = new System.Drawing.Size(249, 40); + TLP_Main.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)PB_Sprite).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel TLP_Main; + private System.Windows.Forms.PictureBox PB_Sprite; + private System.Windows.Forms.ComboBox CB_Species; + private System.Windows.Forms.ComboBox CB_Form; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonSpeciesForm4Editor.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonSpeciesForm4Editor.cs new file mode 100644 index 000000000..6c1d31196 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonSpeciesForm4Editor.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using PKHeX.Core; +using PKHeX.Drawing.PokeSprite; + +namespace PKHeX.WinForms; + +public sealed partial class PokeathlonSpeciesForm4Editor : UserControl +{ + private bool IsLoading; + private byte SpriteGender; + private bool SpriteShiny; + + public event EventHandler? ValueChanged; + + public ushort Species => (ushort)WinFormsUtil.GetIndex(CB_Species); + public byte Form => (byte)Math.Max(CB_Form.SelectedIndex, 0); + + public byte DisplayGender + { + get => SpriteGender; + set + { + SpriteGender = value > 2 ? (byte)2 : value; + RefreshSprite(); + } + } + + public bool DisplayShiny + { + get => SpriteShiny; + set + { + SpriteShiny = value; + RefreshSprite(); + } + } + + public PokeathlonSpeciesForm4Editor() + { + InitializeComponent(); + InitializeCombo(CB_Species, GameInfo.FilteredSources.Species.ToList()); + CB_Species.SelectedValueChanged += CB_Species_SelectedValueChanged; + CB_Form.SelectedValueChanged += CB_Form_SelectedValueChanged; + LoadValues(0, 0); + } + + public void LoadValues(ushort species, byte form) + { + IsLoading = true; + CB_Species.SelectedValue = (int)species; + LoadForms(form); + RefreshSprite(); + IsLoading = false; + } + + private void CB_Species_SelectedValueChanged(object? sender, EventArgs e) + { + LoadForms(); + OnValueChanged(); + } + + private void CB_Form_SelectedValueChanged(object? sender, EventArgs e) + { + RefreshSprite(); + OnValueChanged(); + } + + private void LoadForms(byte selectedForm = 0) + { + var species = Species; + var forms = FormConverter.GetFormList(species, GameInfo.Strings.types, GameInfo.Strings.forms, Main.GenderSymbols, EntityContext.Gen4); + var source = GetFormSource(forms); + CB_Form.InitializeBinding(); + CB_Form.DataSource = new BindingSource(source, string.Empty); + CB_Form.SelectedValue = Math.Min(selectedForm, source.Count - 1); + RefreshSprite(); + } + + private void RefreshSprite() + { + var image = SpriteUtil.GetSprite(Species, Form, SpriteGender, 0, 0, false, SpriteShiny ? Shiny.Always : Shiny.Never, EntityContext.Gen4); + PB_Sprite.Image = image; + } + + private void OnValueChanged() + { + if (!IsLoading) + ValueChanged?.Invoke(this, EventArgs.Empty); + } + + private static List GetFormSource(IReadOnlyList forms) + { + var result = new List(forms.Count); + for (int i = 0; i < forms.Count; i++) + result.Add(new ComboItem(forms[i], i)); + return result; + } + + private static void InitializeCombo(ComboBox cb, IReadOnlyList source) + { + cb.InitializeBinding(); + cb.DataSource = new BindingSource(source, string.Empty); + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Pokeathlon4.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Pokeathlon4.Designer.cs new file mode 100644 index 000000000..b8578f625 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Pokeathlon4.Designer.cs @@ -0,0 +1,983 @@ +using PKHeX.WinForms.Controls; + +namespace PKHeX.WinForms +{ + partial class SAV_Pokeathlon4 + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + components.Dispose(); + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + TC_Editor = new System.Windows.Forms.TabControl(); + Tab_General = new System.Windows.Forms.TabPage(); + TLP_General = new System.Windows.Forms.TableLayoutPanel(); + L_Points = new System.Windows.Forms.Label(); + NUD_Points = new System.Windows.Forms.NumericUpDown(); + L_DailyShopFlags = new System.Windows.Forms.Label(); + FLP_DailyShopFlags = new System.Windows.Forms.FlowLayoutPanel(); + CHK_DailyShop0 = new System.Windows.Forms.CheckBox(); + CHK_DailyShop1 = new System.Windows.Forms.CheckBox(); + CHK_DailyShop2 = new System.Windows.Forms.CheckBox(); + CHK_DailyShop3 = new System.Windows.Forms.CheckBox(); + CHK_DailyShop4 = new System.Windows.Forms.CheckBox(); + CHK_DailyShop5 = new System.Windows.Forms.CheckBox(); + CHK_DailyShop6 = new System.Windows.Forms.CheckBox(); + CHK_DailyShop7 = new System.Windows.Forms.CheckBox(); + CHK_DailyShop8 = new System.Windows.Forms.CheckBox(); + CHK_DailyShop9 = new System.Windows.Forms.CheckBox(); + CHK_DailyShop10 = new System.Windows.Forms.CheckBox(); + CHK_DailyShop11 = new System.Windows.Forms.CheckBox(); + L_DataCards = new System.Windows.Forms.Label(); + CLB_DataCards = new System.Windows.Forms.CheckedListBox(); + Tab_Medals = new System.Windows.Forms.TabPage(); + FLP_Medals = new System.Windows.Forms.FlowLayoutPanel(); + B_MedalsGiveAll = new System.Windows.Forms.Button(); + B_MedalsClearAll = new System.Windows.Forms.Button(); + DGV_Medals = new DoubleBufferedDataGridView(); + Tab_Counters = new System.Windows.Forms.TabPage(); + TLP_Counters = new System.Windows.Forms.TableLayoutPanel(); + Tab_Best = new System.Windows.Forms.TabPage(); + TLP_Best = new System.Windows.Forms.TableLayoutPanel(); + Tab_Courses = new System.Windows.Forms.TabPage(); + TLP_Courses = new System.Windows.Forms.TableLayoutPanel(); + L_CourseIndex = new System.Windows.Forms.Label(); + CB_CourseIndex = new System.Windows.Forms.ComboBox(); + TLP_CourseScore = new System.Windows.Forms.TableLayoutPanel(); + L_CourseScore0 = new System.Windows.Forms.Label(); + NUD_CourseScore0 = new System.Windows.Forms.NumericUpDown(); + L_CourseScore1 = new System.Windows.Forms.Label(); + NUD_CourseScore1 = new System.Windows.Forms.NumericUpDown(); + L_CourseScore2 = new System.Windows.Forms.Label(); + NUD_CourseScore2 = new System.Windows.Forms.NumericUpDown(); + L_CourseScoreMax = new System.Windows.Forms.Label(); + NUD_CourseScoreMax = new System.Windows.Forms.NumericUpDown(); + L_CourseParticipant0 = new System.Windows.Forms.Label(); + UC_CourseParticipant0 = new PokeathlonParticipant4Editor(); + L_CourseParticipant1 = new System.Windows.Forms.Label(); + UC_CourseParticipant1 = new PokeathlonParticipant4Editor(); + L_CourseParticipant2 = new System.Windows.Forms.Label(); + UC_CourseParticipant2 = new PokeathlonParticipant4Editor(); + Tab_SelfEvent = new System.Windows.Forms.TabPage(); + TLP_SelfEvent = new System.Windows.Forms.TableLayoutPanel(); + L_SelfEventIndex = new System.Windows.Forms.Label(); + CB_SelfEventIndex = new System.Windows.Forms.ComboBox(); + UC_SelfEventData = new PokeathlonEventData4Editor(); + Tab_Connection = new System.Windows.Forms.TabPage(); + TLP_Connection = new System.Windows.Forms.TableLayoutPanel(); + L_ConnectionIndex = new System.Windows.Forms.Label(); + CB_ConnectionIndex = new System.Windows.Forms.ComboBox(); + UC_Connection = new PokeathlonConnection4Editor(); + FLP_Buttons = new System.Windows.Forms.FlowLayoutPanel(); + B_Cancel = new System.Windows.Forms.Button(); + B_Save = new System.Windows.Forms.Button(); + TLP_Medals = new System.Windows.Forms.TableLayoutPanel(); + TC_Editor.SuspendLayout(); + Tab_General.SuspendLayout(); + TLP_General.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Points).BeginInit(); + FLP_DailyShopFlags.SuspendLayout(); + Tab_Medals.SuspendLayout(); + FLP_Medals.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)DGV_Medals).BeginInit(); + Tab_Counters.SuspendLayout(); + Tab_Best.SuspendLayout(); + Tab_Courses.SuspendLayout(); + TLP_Courses.SuspendLayout(); + TLP_CourseScore.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_CourseScore0).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_CourseScore1).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_CourseScore2).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_CourseScoreMax).BeginInit(); + Tab_SelfEvent.SuspendLayout(); + TLP_SelfEvent.SuspendLayout(); + Tab_Connection.SuspendLayout(); + TLP_Connection.SuspendLayout(); + FLP_Buttons.SuspendLayout(); + TLP_Medals.SuspendLayout(); + SuspendLayout(); + // + // TC_Editor + // + TC_Editor.Controls.Add(Tab_General); + TC_Editor.Controls.Add(Tab_Medals); + TC_Editor.Controls.Add(Tab_Counters); + TC_Editor.Controls.Add(Tab_Best); + TC_Editor.Controls.Add(Tab_Courses); + TC_Editor.Controls.Add(Tab_SelfEvent); + TC_Editor.Controls.Add(Tab_Connection); + TC_Editor.Dock = System.Windows.Forms.DockStyle.Fill; + TC_Editor.Location = new System.Drawing.Point(0, 0); + TC_Editor.Margin = new System.Windows.Forms.Padding(0); + TC_Editor.Name = "TC_Editor"; + TC_Editor.SelectedIndex = 0; + TC_Editor.Size = new System.Drawing.Size(612, 924); + TC_Editor.TabIndex = 0; + // + // Tab_General + // + Tab_General.Controls.Add(TLP_General); + Tab_General.Location = new System.Drawing.Point(4, 26); + Tab_General.Name = "Tab_General"; + Tab_General.Padding = new System.Windows.Forms.Padding(3); + Tab_General.Size = new System.Drawing.Size(604, 895); + Tab_General.TabIndex = 0; + Tab_General.Text = "General"; + Tab_General.UseVisualStyleBackColor = true; + // + // TLP_General + // + TLP_General.ColumnCount = 2; + TLP_General.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_General.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_General.Controls.Add(L_Points, 0, 0); + TLP_General.Controls.Add(NUD_Points, 1, 0); + TLP_General.Controls.Add(L_DailyShopFlags, 0, 1); + TLP_General.Controls.Add(FLP_DailyShopFlags, 1, 1); + TLP_General.Controls.Add(L_DataCards, 0, 2); + TLP_General.Controls.Add(CLB_DataCards, 1, 2); + TLP_General.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_General.Location = new System.Drawing.Point(3, 3); + TLP_General.Name = "TLP_General"; + TLP_General.Padding = new System.Windows.Forms.Padding(8); + TLP_General.RowCount = 3; + TLP_General.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_General.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_General.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_General.Size = new System.Drawing.Size(598, 889); + TLP_General.TabIndex = 0; + // + // L_Points + // + L_Points.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Points.AutoSize = true; + L_Points.Location = new System.Drawing.Point(38, 12); + L_Points.Margin = new System.Windows.Forms.Padding(0); + L_Points.Name = "L_Points"; + L_Points.Size = new System.Drawing.Size(46, 17); + L_Points.TabIndex = 0; + L_Points.Text = "Points:"; + // + // NUD_Points + // + NUD_Points.Location = new System.Drawing.Point(84, 8); + NUD_Points.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_Points.Maximum = new decimal(new int[] { 99999, 0, 0, 0 }); + NUD_Points.Name = "NUD_Points"; + NUD_Points.Size = new System.Drawing.Size(120, 25); + NUD_Points.TabIndex = 1; + // + // L_DailyShopFlags + // + L_DailyShopFlags.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_DailyShopFlags.AutoSize = true; + L_DailyShopFlags.Location = new System.Drawing.Point(11, 35); + L_DailyShopFlags.Margin = new System.Windows.Forms.Padding(0); + L_DailyShopFlags.Name = "L_DailyShopFlags"; + L_DailyShopFlags.Size = new System.Drawing.Size(73, 17); + L_DailyShopFlags.TabIndex = 2; + L_DailyShopFlags.Text = "Daily Shop:"; + // + // FLP_DailyShopFlags + // + FLP_DailyShopFlags.AutoSize = true; + FLP_DailyShopFlags.Controls.Add(CHK_DailyShop0); + FLP_DailyShopFlags.Controls.Add(CHK_DailyShop1); + FLP_DailyShopFlags.Controls.Add(CHK_DailyShop2); + FLP_DailyShopFlags.Controls.Add(CHK_DailyShop3); + FLP_DailyShopFlags.Controls.Add(CHK_DailyShop4); + FLP_DailyShopFlags.Controls.Add(CHK_DailyShop5); + FLP_DailyShopFlags.Controls.Add(CHK_DailyShop6); + FLP_DailyShopFlags.Controls.Add(CHK_DailyShop7); + FLP_DailyShopFlags.Controls.Add(CHK_DailyShop8); + FLP_DailyShopFlags.Controls.Add(CHK_DailyShop9); + FLP_DailyShopFlags.Controls.Add(CHK_DailyShop10); + FLP_DailyShopFlags.Controls.Add(CHK_DailyShop11); + FLP_DailyShopFlags.Dock = System.Windows.Forms.DockStyle.Fill; + FLP_DailyShopFlags.Location = new System.Drawing.Point(84, 34); + FLP_DailyShopFlags.Margin = new System.Windows.Forms.Padding(0); + FLP_DailyShopFlags.Name = "FLP_DailyShopFlags"; + FLP_DailyShopFlags.Size = new System.Drawing.Size(506, 20); + FLP_DailyShopFlags.TabIndex = 3; + // + // CHK_DailyShop0 + // + CHK_DailyShop0.AutoSize = true; + CHK_DailyShop0.Location = new System.Drawing.Point(3, 3); + CHK_DailyShop0.Name = "CHK_DailyShop0"; + CHK_DailyShop0.Size = new System.Drawing.Size(15, 14); + CHK_DailyShop0.TabIndex = 0; + CHK_DailyShop0.UseVisualStyleBackColor = true; + // + // CHK_DailyShop1 + // + CHK_DailyShop1.AutoSize = true; + CHK_DailyShop1.Location = new System.Drawing.Point(24, 3); + CHK_DailyShop1.Name = "CHK_DailyShop1"; + CHK_DailyShop1.Size = new System.Drawing.Size(15, 14); + CHK_DailyShop1.TabIndex = 1; + CHK_DailyShop1.UseVisualStyleBackColor = true; + // + // CHK_DailyShop2 + // + CHK_DailyShop2.AutoSize = true; + CHK_DailyShop2.Location = new System.Drawing.Point(45, 3); + CHK_DailyShop2.Name = "CHK_DailyShop2"; + CHK_DailyShop2.Size = new System.Drawing.Size(15, 14); + CHK_DailyShop2.TabIndex = 2; + CHK_DailyShop2.UseVisualStyleBackColor = true; + // + // CHK_DailyShop3 + // + CHK_DailyShop3.AutoSize = true; + CHK_DailyShop3.Location = new System.Drawing.Point(66, 3); + CHK_DailyShop3.Name = "CHK_DailyShop3"; + CHK_DailyShop3.Size = new System.Drawing.Size(15, 14); + CHK_DailyShop3.TabIndex = 3; + CHK_DailyShop3.UseVisualStyleBackColor = true; + // + // CHK_DailyShop4 + // + CHK_DailyShop4.AutoSize = true; + CHK_DailyShop4.Location = new System.Drawing.Point(87, 3); + CHK_DailyShop4.Name = "CHK_DailyShop4"; + CHK_DailyShop4.Size = new System.Drawing.Size(15, 14); + CHK_DailyShop4.TabIndex = 4; + CHK_DailyShop4.UseVisualStyleBackColor = true; + // + // CHK_DailyShop5 + // + CHK_DailyShop5.AutoSize = true; + CHK_DailyShop5.Location = new System.Drawing.Point(108, 3); + CHK_DailyShop5.Name = "CHK_DailyShop5"; + CHK_DailyShop5.Size = new System.Drawing.Size(15, 14); + CHK_DailyShop5.TabIndex = 5; + CHK_DailyShop5.UseVisualStyleBackColor = true; + // + // CHK_DailyShop6 + // + CHK_DailyShop6.AutoSize = true; + CHK_DailyShop6.Location = new System.Drawing.Point(129, 3); + CHK_DailyShop6.Name = "CHK_DailyShop6"; + CHK_DailyShop6.Size = new System.Drawing.Size(15, 14); + CHK_DailyShop6.TabIndex = 6; + CHK_DailyShop6.UseVisualStyleBackColor = true; + // + // CHK_DailyShop7 + // + CHK_DailyShop7.AutoSize = true; + CHK_DailyShop7.Location = new System.Drawing.Point(150, 3); + CHK_DailyShop7.Name = "CHK_DailyShop7"; + CHK_DailyShop7.Size = new System.Drawing.Size(15, 14); + CHK_DailyShop7.TabIndex = 7; + CHK_DailyShop7.UseVisualStyleBackColor = true; + // + // CHK_DailyShop8 + // + CHK_DailyShop8.AutoSize = true; + CHK_DailyShop8.Location = new System.Drawing.Point(171, 3); + CHK_DailyShop8.Name = "CHK_DailyShop8"; + CHK_DailyShop8.Size = new System.Drawing.Size(15, 14); + CHK_DailyShop8.TabIndex = 8; + CHK_DailyShop8.UseVisualStyleBackColor = true; + // + // CHK_DailyShop9 + // + CHK_DailyShop9.AutoSize = true; + CHK_DailyShop9.Location = new System.Drawing.Point(192, 3); + CHK_DailyShop9.Name = "CHK_DailyShop9"; + CHK_DailyShop9.Size = new System.Drawing.Size(15, 14); + CHK_DailyShop9.TabIndex = 9; + CHK_DailyShop9.UseVisualStyleBackColor = true; + // + // CHK_DailyShop10 + // + CHK_DailyShop10.AutoSize = true; + CHK_DailyShop10.Location = new System.Drawing.Point(213, 3); + CHK_DailyShop10.Name = "CHK_DailyShop10"; + CHK_DailyShop10.Size = new System.Drawing.Size(15, 14); + CHK_DailyShop10.TabIndex = 10; + CHK_DailyShop10.UseVisualStyleBackColor = true; + // + // CHK_DailyShop11 + // + CHK_DailyShop11.AutoSize = true; + CHK_DailyShop11.Location = new System.Drawing.Point(234, 3); + CHK_DailyShop11.Name = "CHK_DailyShop11"; + CHK_DailyShop11.Size = new System.Drawing.Size(15, 14); + CHK_DailyShop11.TabIndex = 11; + CHK_DailyShop11.UseVisualStyleBackColor = true; + // + // L_DataCards + // + L_DataCards.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + L_DataCards.AutoSize = true; + L_DataCards.Location = new System.Drawing.Point(8, 56); + L_DataCards.Margin = new System.Windows.Forms.Padding(0, 2, 0, 0); + L_DataCards.Name = "L_DataCards"; + L_DataCards.Size = new System.Drawing.Size(76, 17); + L_DataCards.TabIndex = 4; + L_DataCards.Text = "Data Cards:"; + // + // CLB_DataCards + // + CLB_DataCards.CheckOnClick = true; + CLB_DataCards.Dock = System.Windows.Forms.DockStyle.Fill; + CLB_DataCards.FormattingEnabled = true; + CLB_DataCards.IntegralHeight = false; + CLB_DataCards.Location = new System.Drawing.Point(87, 54); + CLB_DataCards.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + CLB_DataCards.Name = "CLB_DataCards"; + CLB_DataCards.Size = new System.Drawing.Size(500, 827); + CLB_DataCards.TabIndex = 5; + // + // Tab_Medals + // + Tab_Medals.Controls.Add(TLP_Medals); + Tab_Medals.Location = new System.Drawing.Point(4, 26); + Tab_Medals.Name = "Tab_Medals"; + Tab_Medals.Padding = new System.Windows.Forms.Padding(3); + Tab_Medals.Size = new System.Drawing.Size(604, 895); + Tab_Medals.TabIndex = 1; + Tab_Medals.Text = "Medals"; + Tab_Medals.UseVisualStyleBackColor = true; + // + // FLP_Medals + // + FLP_Medals.AutoSize = true; + FLP_Medals.Controls.Add(B_MedalsGiveAll); + FLP_Medals.Controls.Add(B_MedalsClearAll); + FLP_Medals.Dock = System.Windows.Forms.DockStyle.Fill; + FLP_Medals.Location = new System.Drawing.Point(0, 841); + FLP_Medals.Margin = new System.Windows.Forms.Padding(0); + FLP_Medals.Name = "FLP_Medals"; + FLP_Medals.Padding = new System.Windows.Forms.Padding(8); + FLP_Medals.Size = new System.Drawing.Size(598, 48); + FLP_Medals.TabIndex = 1; + FLP_Medals.WrapContents = false; + // + // B_MedalsGiveAll + // + B_MedalsGiveAll.AutoSize = true; + B_MedalsGiveAll.Location = new System.Drawing.Point(11, 11); + B_MedalsGiveAll.Name = "B_MedalsGiveAll"; + B_MedalsGiveAll.Size = new System.Drawing.Size(61, 27); + B_MedalsGiveAll.TabIndex = 0; + B_MedalsGiveAll.Text = "Give All"; + B_MedalsGiveAll.UseVisualStyleBackColor = true; + B_MedalsGiveAll.Click += B_MedalsGiveAll_Click; + // + // B_MedalsClearAll + // + B_MedalsClearAll.AutoSize = true; + B_MedalsClearAll.Location = new System.Drawing.Point(78, 11); + B_MedalsClearAll.Name = "B_MedalsClearAll"; + B_MedalsClearAll.Size = new System.Drawing.Size(66, 27); + B_MedalsClearAll.TabIndex = 1; + B_MedalsClearAll.Text = "Clear All"; + B_MedalsClearAll.UseVisualStyleBackColor = true; + B_MedalsClearAll.Click += B_MedalsClearAll_Click; + // + // DGV_Medals + // + dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.ControlLight; + DGV_Medals.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle2; + DGV_Medals.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + DGV_Medals.Dock = System.Windows.Forms.DockStyle.Fill; + DGV_Medals.Location = new System.Drawing.Point(0, 0); + DGV_Medals.Margin = new System.Windows.Forms.Padding(0); + DGV_Medals.Name = "DGV_Medals"; + DGV_Medals.RowHeadersVisible = false; + DGV_Medals.Size = new System.Drawing.Size(598, 841); + DGV_Medals.TabIndex = 0; + // + // Tab_Counters + // + Tab_Counters.Controls.Add(TLP_Counters); + Tab_Counters.Location = new System.Drawing.Point(4, 26); + Tab_Counters.Name = "Tab_Counters"; + Tab_Counters.Padding = new System.Windows.Forms.Padding(3); + Tab_Counters.Size = new System.Drawing.Size(604, 894); + Tab_Counters.TabIndex = 2; + Tab_Counters.Text = "Counters"; + Tab_Counters.UseVisualStyleBackColor = true; + // + // TLP_Counters + // + TLP_Counters.AutoScroll = true; + TLP_Counters.ColumnCount = 2; + TLP_Counters.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Counters.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Counters.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Counters.Location = new System.Drawing.Point(3, 3); + TLP_Counters.Name = "TLP_Counters"; + TLP_Counters.Padding = new System.Windows.Forms.Padding(8); + TLP_Counters.RowCount = 1; + TLP_Counters.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Counters.Size = new System.Drawing.Size(598, 888); + TLP_Counters.TabIndex = 0; + // + // Tab_Best + // + Tab_Best.Controls.Add(TLP_Best); + Tab_Best.Location = new System.Drawing.Point(4, 26); + Tab_Best.Name = "Tab_Best"; + Tab_Best.Padding = new System.Windows.Forms.Padding(3); + Tab_Best.Size = new System.Drawing.Size(604, 895); + Tab_Best.TabIndex = 3; + Tab_Best.Text = "Best"; + Tab_Best.UseVisualStyleBackColor = true; + // + // TLP_Best + // + TLP_Best.AutoScroll = true; + TLP_Best.ColumnCount = 2; + TLP_Best.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Best.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_Best.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Best.Location = new System.Drawing.Point(3, 3); + TLP_Best.Name = "TLP_Best"; + TLP_Best.Padding = new System.Windows.Forms.Padding(8); + TLP_Best.RowCount = 1; + TLP_Best.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Best.Size = new System.Drawing.Size(598, 889); + TLP_Best.TabIndex = 0; + // + // Tab_Courses + // + Tab_Courses.Controls.Add(TLP_Courses); + Tab_Courses.Location = new System.Drawing.Point(4, 26); + Tab_Courses.Name = "Tab_Courses"; + Tab_Courses.Padding = new System.Windows.Forms.Padding(3); + Tab_Courses.Size = new System.Drawing.Size(604, 895); + Tab_Courses.TabIndex = 4; + Tab_Courses.Text = "Courses"; + Tab_Courses.UseVisualStyleBackColor = true; + // + // TLP_Courses + // + TLP_Courses.AutoScroll = true; + TLP_Courses.AutoSize = true; + TLP_Courses.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + TLP_Courses.ColumnCount = 2; + TLP_Courses.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 120F)); + TLP_Courses.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_Courses.Controls.Add(L_CourseIndex, 0, 0); + TLP_Courses.Controls.Add(CB_CourseIndex, 1, 0); + TLP_Courses.Controls.Add(TLP_CourseScore, 1, 1); + TLP_Courses.Controls.Add(L_CourseParticipant0, 0, 2); + TLP_Courses.Controls.Add(UC_CourseParticipant0, 0, 3); + TLP_Courses.Controls.Add(L_CourseParticipant1, 0, 4); + TLP_Courses.Controls.Add(UC_CourseParticipant1, 0, 5); + TLP_Courses.Controls.Add(L_CourseParticipant2, 0, 6); + TLP_Courses.Controls.Add(UC_CourseParticipant2, 0, 7); + TLP_Courses.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Courses.Location = new System.Drawing.Point(3, 3); + TLP_Courses.Name = "TLP_Courses"; + TLP_Courses.Padding = new System.Windows.Forms.Padding(8); + TLP_Courses.RowCount = 8; + TLP_Courses.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Courses.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Courses.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Courses.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Courses.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Courses.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Courses.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Courses.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Courses.Size = new System.Drawing.Size(598, 889); + TLP_Courses.TabIndex = 0; + // + // L_CourseIndex + // + L_CourseIndex.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_CourseIndex.AutoSize = true; + L_CourseIndex.Location = new System.Drawing.Point(83, 12); + L_CourseIndex.Name = "L_CourseIndex"; + L_CourseIndex.Size = new System.Drawing.Size(42, 17); + L_CourseIndex.TabIndex = 0; + L_CourseIndex.Text = "Index:"; + // + // CB_CourseIndex + // + CB_CourseIndex.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_CourseIndex.FormattingEnabled = true; + CB_CourseIndex.Location = new System.Drawing.Point(128, 8); + CB_CourseIndex.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + CB_CourseIndex.Name = "CB_CourseIndex"; + CB_CourseIndex.Size = new System.Drawing.Size(121, 25); + CB_CourseIndex.TabIndex = 1; + CB_CourseIndex.SelectedIndexChanged += CB_CourseIndex_SelectedIndexChanged; + // + // TLP_CourseScore + // + TLP_CourseScore.AutoSize = true; + TLP_CourseScore.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + TLP_CourseScore.ColumnCount = 4; + TLP_CourseScore.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_CourseScore.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_CourseScore.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_CourseScore.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_CourseScore.Controls.Add(L_CourseScore0, 0, 0); + TLP_CourseScore.Controls.Add(NUD_CourseScore0, 1, 0); + TLP_CourseScore.Controls.Add(L_CourseScore1, 2, 0); + TLP_CourseScore.Controls.Add(NUD_CourseScore1, 3, 0); + TLP_CourseScore.Controls.Add(L_CourseScore2, 0, 1); + TLP_CourseScore.Controls.Add(NUD_CourseScore2, 1, 1); + TLP_CourseScore.Controls.Add(L_CourseScoreMax, 2, 1); + TLP_CourseScore.Controls.Add(NUD_CourseScoreMax, 3, 1); + TLP_CourseScore.Location = new System.Drawing.Point(128, 46); + TLP_CourseScore.Margin = new System.Windows.Forms.Padding(0, 12, 0, 0); + TLP_CourseScore.Name = "TLP_CourseScore"; + TLP_CourseScore.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_CourseScore.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_CourseScore.Size = new System.Drawing.Size(320, 52); + TLP_CourseScore.TabIndex = 2; + // + // L_CourseScore0 + // + L_CourseScore0.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_CourseScore0.AutoSize = true; + L_CourseScore0.Location = new System.Drawing.Point(0, 4); + L_CourseScore0.Margin = new System.Windows.Forms.Padding(0); + L_CourseScore0.Name = "L_CourseScore0"; + L_CourseScore0.Size = new System.Drawing.Size(51, 17); + L_CourseScore0.TabIndex = 0; + L_CourseScore0.Text = "Score0:"; + // + // NUD_CourseScore0 + // + NUD_CourseScore0.Location = new System.Drawing.Point(51, 0); + NUD_CourseScore0.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_CourseScore0.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_CourseScore0.Name = "NUD_CourseScore0"; + NUD_CourseScore0.Size = new System.Drawing.Size(100, 25); + NUD_CourseScore0.TabIndex = 1; + // + // L_CourseScore1 + // + L_CourseScore1.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_CourseScore1.AutoSize = true; + L_CourseScore1.Location = new System.Drawing.Point(169, 4); + L_CourseScore1.Margin = new System.Windows.Forms.Padding(0); + L_CourseScore1.Name = "L_CourseScore1"; + L_CourseScore1.Size = new System.Drawing.Size(51, 17); + L_CourseScore1.TabIndex = 2; + L_CourseScore1.Text = "Score1:"; + // + // NUD_CourseScore1 + // + NUD_CourseScore1.Location = new System.Drawing.Point(220, 0); + NUD_CourseScore1.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_CourseScore1.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_CourseScore1.Name = "NUD_CourseScore1"; + NUD_CourseScore1.Size = new System.Drawing.Size(100, 25); + NUD_CourseScore1.TabIndex = 3; + // + // L_CourseScore2 + // + L_CourseScore2.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_CourseScore2.AutoSize = true; + L_CourseScore2.Location = new System.Drawing.Point(0, 30); + L_CourseScore2.Margin = new System.Windows.Forms.Padding(0); + L_CourseScore2.Name = "L_CourseScore2"; + L_CourseScore2.Size = new System.Drawing.Size(51, 17); + L_CourseScore2.TabIndex = 4; + L_CourseScore2.Text = "Score2:"; + // + // NUD_CourseScore2 + // + NUD_CourseScore2.Location = new System.Drawing.Point(51, 26); + NUD_CourseScore2.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_CourseScore2.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_CourseScore2.Name = "NUD_CourseScore2"; + NUD_CourseScore2.Size = new System.Drawing.Size(100, 25); + NUD_CourseScore2.TabIndex = 5; + // + // L_CourseScoreMax + // + L_CourseScoreMax.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_CourseScoreMax.AutoSize = true; + L_CourseScoreMax.Location = new System.Drawing.Point(151, 30); + L_CourseScoreMax.Margin = new System.Windows.Forms.Padding(0); + L_CourseScoreMax.Name = "L_CourseScoreMax"; + L_CourseScoreMax.Size = new System.Drawing.Size(69, 17); + L_CourseScoreMax.TabIndex = 6; + L_CourseScoreMax.Text = "ScoreMax:"; + // + // NUD_CourseScoreMax + // + NUD_CourseScoreMax.Location = new System.Drawing.Point(220, 26); + NUD_CourseScoreMax.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + NUD_CourseScoreMax.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_CourseScoreMax.Name = "NUD_CourseScoreMax"; + NUD_CourseScoreMax.Size = new System.Drawing.Size(100, 25); + NUD_CourseScoreMax.TabIndex = 7; + // + // L_CourseParticipant0 + // + L_CourseParticipant0.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + L_CourseParticipant0.AutoSize = true; + TLP_Courses.SetColumnSpan(L_CourseParticipant0, 2); + L_CourseParticipant0.Location = new System.Drawing.Point(11, 98); + L_CourseParticipant0.Name = "L_CourseParticipant0"; + L_CourseParticipant0.Size = new System.Drawing.Size(83, 17); + L_CourseParticipant0.TabIndex = 3; + L_CourseParticipant0.Text = "Participant 1:"; + // + // UC_CourseParticipant0 + // + UC_CourseParticipant0.AutoSize = true; + TLP_Courses.SetColumnSpan(UC_CourseParticipant0, 2); + UC_CourseParticipant0.Dock = System.Windows.Forms.DockStyle.Fill; + UC_CourseParticipant0.Location = new System.Drawing.Point(8, 115); + UC_CourseParticipant0.Margin = new System.Windows.Forms.Padding(0, 0, 0, 6); + UC_CourseParticipant0.Name = "UC_CourseParticipant0"; + UC_CourseParticipant0.Size = new System.Drawing.Size(582, 65); + UC_CourseParticipant0.TabIndex = 4; + // + // L_CourseParticipant1 + // + L_CourseParticipant1.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + L_CourseParticipant1.AutoSize = true; + TLP_Courses.SetColumnSpan(L_CourseParticipant1, 2); + L_CourseParticipant1.Location = new System.Drawing.Point(11, 186); + L_CourseParticipant1.Name = "L_CourseParticipant1"; + L_CourseParticipant1.Size = new System.Drawing.Size(83, 17); + L_CourseParticipant1.TabIndex = 5; + L_CourseParticipant1.Text = "Participant 2:"; + // + // UC_CourseParticipant1 + // + UC_CourseParticipant1.AutoSize = true; + TLP_Courses.SetColumnSpan(UC_CourseParticipant1, 2); + UC_CourseParticipant1.Dock = System.Windows.Forms.DockStyle.Fill; + UC_CourseParticipant1.Location = new System.Drawing.Point(8, 203); + UC_CourseParticipant1.Margin = new System.Windows.Forms.Padding(0, 0, 0, 6); + UC_CourseParticipant1.Name = "UC_CourseParticipant1"; + UC_CourseParticipant1.Size = new System.Drawing.Size(582, 65); + UC_CourseParticipant1.TabIndex = 6; + // + // L_CourseParticipant2 + // + L_CourseParticipant2.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + L_CourseParticipant2.AutoSize = true; + TLP_Courses.SetColumnSpan(L_CourseParticipant2, 2); + L_CourseParticipant2.Location = new System.Drawing.Point(11, 274); + L_CourseParticipant2.Name = "L_CourseParticipant2"; + L_CourseParticipant2.Size = new System.Drawing.Size(83, 17); + L_CourseParticipant2.TabIndex = 7; + L_CourseParticipant2.Text = "Participant 3:"; + // + // UC_CourseParticipant2 + // + UC_CourseParticipant2.AutoSize = true; + TLP_Courses.SetColumnSpan(UC_CourseParticipant2, 2); + UC_CourseParticipant2.Dock = System.Windows.Forms.DockStyle.Fill; + UC_CourseParticipant2.Location = new System.Drawing.Point(8, 291); + UC_CourseParticipant2.Margin = new System.Windows.Forms.Padding(0); + UC_CourseParticipant2.Name = "UC_CourseParticipant2"; + UC_CourseParticipant2.Size = new System.Drawing.Size(582, 590); + UC_CourseParticipant2.TabIndex = 8; + // + // Tab_SelfEvent + // + Tab_SelfEvent.Controls.Add(TLP_SelfEvent); + Tab_SelfEvent.Location = new System.Drawing.Point(4, 26); + Tab_SelfEvent.Name = "Tab_SelfEvent"; + Tab_SelfEvent.Padding = new System.Windows.Forms.Padding(3); + Tab_SelfEvent.Size = new System.Drawing.Size(604, 895); + Tab_SelfEvent.TabIndex = 5; + Tab_SelfEvent.Text = "Self Event"; + Tab_SelfEvent.UseVisualStyleBackColor = true; + // + // TLP_SelfEvent + // + TLP_SelfEvent.AutoScroll = true; + TLP_SelfEvent.ColumnCount = 2; + TLP_SelfEvent.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_SelfEvent.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_SelfEvent.Controls.Add(L_SelfEventIndex, 0, 0); + TLP_SelfEvent.Controls.Add(CB_SelfEventIndex, 1, 0); + TLP_SelfEvent.Controls.Add(UC_SelfEventData, 0, 1); + TLP_SelfEvent.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_SelfEvent.Location = new System.Drawing.Point(3, 3); + TLP_SelfEvent.Name = "TLP_SelfEvent"; + TLP_SelfEvent.Padding = new System.Windows.Forms.Padding(8); + TLP_SelfEvent.RowCount = 2; + TLP_SelfEvent.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_SelfEvent.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_SelfEvent.Size = new System.Drawing.Size(598, 889); + TLP_SelfEvent.TabIndex = 0; + // + // L_SelfEventIndex + // + L_SelfEventIndex.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_SelfEventIndex.AutoSize = true; + L_SelfEventIndex.Location = new System.Drawing.Point(8, 12); + L_SelfEventIndex.Margin = new System.Windows.Forms.Padding(0); + L_SelfEventIndex.Name = "L_SelfEventIndex"; + L_SelfEventIndex.Size = new System.Drawing.Size(42, 17); + L_SelfEventIndex.TabIndex = 0; + L_SelfEventIndex.Text = "Index:"; + // + // CB_SelfEventIndex + // + CB_SelfEventIndex.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_SelfEventIndex.FormattingEnabled = true; + CB_SelfEventIndex.Location = new System.Drawing.Point(53, 8); + CB_SelfEventIndex.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + CB_SelfEventIndex.Name = "CB_SelfEventIndex"; + CB_SelfEventIndex.Size = new System.Drawing.Size(121, 25); + CB_SelfEventIndex.TabIndex = 1; + CB_SelfEventIndex.SelectedIndexChanged += CB_SelfEventIndex_SelectedIndexChanged; + // + // UC_SelfEventData + // + UC_SelfEventData.AutoSize = true; + UC_SelfEventData.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + TLP_SelfEvent.SetColumnSpan(UC_SelfEventData, 2); + UC_SelfEventData.Dock = System.Windows.Forms.DockStyle.Fill; + UC_SelfEventData.Location = new System.Drawing.Point(8, 41); + UC_SelfEventData.Margin = new System.Windows.Forms.Padding(0, 8, 0, 0); + UC_SelfEventData.Name = "UC_SelfEventData"; + UC_SelfEventData.Size = new System.Drawing.Size(582, 840); + UC_SelfEventData.TabIndex = 2; + // + // Tab_Connection + // + Tab_Connection.Controls.Add(TLP_Connection); + Tab_Connection.Location = new System.Drawing.Point(4, 26); + Tab_Connection.Name = "Tab_Connection"; + Tab_Connection.Padding = new System.Windows.Forms.Padding(3); + Tab_Connection.Size = new System.Drawing.Size(604, 895); + Tab_Connection.TabIndex = 6; + Tab_Connection.Text = "Connection"; + Tab_Connection.UseVisualStyleBackColor = true; + // + // TLP_Connection + // + TLP_Connection.AutoScroll = true; + TLP_Connection.ColumnCount = 2; + TLP_Connection.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Connection.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_Connection.Controls.Add(L_ConnectionIndex, 0, 0); + TLP_Connection.Controls.Add(CB_ConnectionIndex, 1, 0); + TLP_Connection.Controls.Add(UC_Connection, 0, 1); + TLP_Connection.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Connection.Location = new System.Drawing.Point(3, 3); + TLP_Connection.Name = "TLP_Connection"; + TLP_Connection.Padding = new System.Windows.Forms.Padding(8); + TLP_Connection.RowCount = 2; + TLP_Connection.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Connection.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Connection.Size = new System.Drawing.Size(598, 889); + TLP_Connection.TabIndex = 0; + // + // L_ConnectionIndex + // + L_ConnectionIndex.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_ConnectionIndex.AutoSize = true; + L_ConnectionIndex.Location = new System.Drawing.Point(8, 12); + L_ConnectionIndex.Margin = new System.Windows.Forms.Padding(0); + L_ConnectionIndex.Name = "L_ConnectionIndex"; + L_ConnectionIndex.Size = new System.Drawing.Size(42, 17); + L_ConnectionIndex.TabIndex = 0; + L_ConnectionIndex.Text = "Index:"; + // + // CB_ConnectionIndex + // + CB_ConnectionIndex.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_ConnectionIndex.FormattingEnabled = true; + CB_ConnectionIndex.Location = new System.Drawing.Point(53, 8); + CB_ConnectionIndex.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + CB_ConnectionIndex.Name = "CB_ConnectionIndex"; + CB_ConnectionIndex.Size = new System.Drawing.Size(121, 25); + CB_ConnectionIndex.TabIndex = 1; + CB_ConnectionIndex.SelectedIndexChanged += CB_ConnectionIndex_SelectedIndexChanged; + // + // UC_Connection + // + UC_Connection.AutoSize = true; + TLP_Connection.SetColumnSpan(UC_Connection, 2); + UC_Connection.Dock = System.Windows.Forms.DockStyle.Fill; + UC_Connection.Location = new System.Drawing.Point(8, 41); + UC_Connection.Margin = new System.Windows.Forms.Padding(0, 8, 0, 0); + UC_Connection.Name = "UC_Connection"; + UC_Connection.Size = new System.Drawing.Size(582, 840); + UC_Connection.TabIndex = 2; + // + // FLP_Buttons + // + FLP_Buttons.AutoSize = true; + FLP_Buttons.Controls.Add(B_Save); + FLP_Buttons.Controls.Add(B_Cancel); + FLP_Buttons.Dock = System.Windows.Forms.DockStyle.Bottom; + FLP_Buttons.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft; + FLP_Buttons.Location = new System.Drawing.Point(0, 924); + FLP_Buttons.Name = "FLP_Buttons"; + FLP_Buttons.Padding = new System.Windows.Forms.Padding(8); + FLP_Buttons.Size = new System.Drawing.Size(612, 49); + FLP_Buttons.TabIndex = 1; + // + // B_Cancel + // + B_Cancel.AutoSize = true; + B_Cancel.Location = new System.Drawing.Point(427, 11); + B_Cancel.Name = "B_Cancel"; + B_Cancel.Size = new System.Drawing.Size(80, 27); + B_Cancel.TabIndex = 0; + B_Cancel.Text = "Cancel"; + B_Cancel.UseVisualStyleBackColor = true; + B_Cancel.Click += B_Cancel_Click; + // + // B_Save + // + B_Save.AutoSize = true; + B_Save.Location = new System.Drawing.Point(513, 11); + B_Save.Name = "B_Save"; + B_Save.Size = new System.Drawing.Size(80, 27); + B_Save.TabIndex = 1; + B_Save.Text = "Save"; + B_Save.UseVisualStyleBackColor = true; + B_Save.Click += B_Save_Click; + // + // TLP_Medals + // + TLP_Medals.ColumnCount = 1; + TLP_Medals.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_Medals.Controls.Add(DGV_Medals, 0, 0); + TLP_Medals.Controls.Add(FLP_Medals, 0, 1); + TLP_Medals.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Medals.Location = new System.Drawing.Point(3, 3); + TLP_Medals.Name = "TLP_Medals"; + TLP_Medals.RowCount = 2; + TLP_Medals.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_Medals.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 48F)); + TLP_Medals.Size = new System.Drawing.Size(598, 889); + TLP_Medals.TabIndex = 2; + // + // SAV_Pokeathlon4 + // + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + ClientSize = new System.Drawing.Size(612, 973); + Controls.Add(TC_Editor); + Controls.Add(FLP_Buttons); + Icon = Properties.Resources.Icon; + MaximizeBox = false; + MinimizeBox = false; + Name = "SAV_Pokeathlon4"; + StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + Text = "Pokéathlon"; + TC_Editor.ResumeLayout(false); + Tab_General.ResumeLayout(false); + TLP_General.ResumeLayout(false); + TLP_General.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Points).EndInit(); + FLP_DailyShopFlags.ResumeLayout(false); + FLP_DailyShopFlags.PerformLayout(); + Tab_Medals.ResumeLayout(false); + FLP_Medals.ResumeLayout(false); + FLP_Medals.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)DGV_Medals).EndInit(); + Tab_Counters.ResumeLayout(false); + Tab_Best.ResumeLayout(false); + Tab_Courses.ResumeLayout(false); + Tab_Courses.PerformLayout(); + TLP_Courses.ResumeLayout(false); + TLP_Courses.PerformLayout(); + TLP_CourseScore.ResumeLayout(false); + TLP_CourseScore.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_CourseScore0).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_CourseScore1).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_CourseScore2).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_CourseScoreMax).EndInit(); + Tab_SelfEvent.ResumeLayout(false); + TLP_SelfEvent.ResumeLayout(false); + TLP_SelfEvent.PerformLayout(); + Tab_Connection.ResumeLayout(false); + TLP_Connection.ResumeLayout(false); + TLP_Connection.PerformLayout(); + FLP_Buttons.ResumeLayout(false); + FLP_Buttons.PerformLayout(); + TLP_Medals.ResumeLayout(false); + TLP_Medals.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private System.Windows.Forms.TabControl TC_Editor; + private System.Windows.Forms.TabPage Tab_General; + private System.Windows.Forms.TabPage Tab_Medals; + private System.Windows.Forms.TabPage Tab_Counters; + private System.Windows.Forms.TabPage Tab_Best; + private System.Windows.Forms.TabPage Tab_Courses; + private System.Windows.Forms.TabPage Tab_SelfEvent; + private System.Windows.Forms.TabPage Tab_Connection; + private System.Windows.Forms.FlowLayoutPanel FLP_Buttons; + private System.Windows.Forms.Button B_Cancel; + private System.Windows.Forms.Button B_Save; + private System.Windows.Forms.TableLayoutPanel TLP_General; + private System.Windows.Forms.Label L_Points; + private System.Windows.Forms.NumericUpDown NUD_Points; + private System.Windows.Forms.Label L_DailyShopFlags; + private System.Windows.Forms.FlowLayoutPanel FLP_DailyShopFlags; + private System.Windows.Forms.CheckBox CHK_DailyShop0; + private System.Windows.Forms.CheckBox CHK_DailyShop1; + private System.Windows.Forms.CheckBox CHK_DailyShop2; + private System.Windows.Forms.CheckBox CHK_DailyShop3; + private System.Windows.Forms.CheckBox CHK_DailyShop4; + private System.Windows.Forms.CheckBox CHK_DailyShop5; + private System.Windows.Forms.CheckBox CHK_DailyShop6; + private System.Windows.Forms.CheckBox CHK_DailyShop7; + private System.Windows.Forms.CheckBox CHK_DailyShop8; + private System.Windows.Forms.CheckBox CHK_DailyShop9; + private System.Windows.Forms.CheckBox CHK_DailyShop10; + private System.Windows.Forms.CheckBox CHK_DailyShop11; + private System.Windows.Forms.Label L_DataCards; + private System.Windows.Forms.CheckedListBox CLB_DataCards; + private System.Windows.Forms.FlowLayoutPanel FLP_Medals; + private System.Windows.Forms.Button B_MedalsGiveAll; + private System.Windows.Forms.Button B_MedalsClearAll; + private DoubleBufferedDataGridView DGV_Medals; + private System.Windows.Forms.TableLayoutPanel TLP_Counters; + private System.Windows.Forms.TableLayoutPanel TLP_Best; + private System.Windows.Forms.TableLayoutPanel TLP_Courses; + private System.Windows.Forms.Label L_CourseIndex; + private System.Windows.Forms.ComboBox CB_CourseIndex; + private System.Windows.Forms.TableLayoutPanel TLP_CourseScore; + private System.Windows.Forms.Label L_CourseScore0; + private System.Windows.Forms.NumericUpDown NUD_CourseScore0; + private System.Windows.Forms.Label L_CourseScore1; + private System.Windows.Forms.NumericUpDown NUD_CourseScore1; + private System.Windows.Forms.Label L_CourseScore2; + private System.Windows.Forms.NumericUpDown NUD_CourseScore2; + private System.Windows.Forms.Label L_CourseScoreMax; + private System.Windows.Forms.NumericUpDown NUD_CourseScoreMax; + private System.Windows.Forms.Label L_CourseParticipant0; + private PokeathlonParticipant4Editor UC_CourseParticipant0; + private System.Windows.Forms.Label L_CourseParticipant1; + private PokeathlonParticipant4Editor UC_CourseParticipant1; + private System.Windows.Forms.Label L_CourseParticipant2; + private PokeathlonParticipant4Editor UC_CourseParticipant2; + private System.Windows.Forms.TableLayoutPanel TLP_SelfEvent; + private System.Windows.Forms.Label L_SelfEventIndex; + private System.Windows.Forms.ComboBox CB_SelfEventIndex; + private PokeathlonEventData4Editor UC_SelfEventData; + private System.Windows.Forms.TableLayoutPanel TLP_Connection; + private System.Windows.Forms.Label L_ConnectionIndex; + private System.Windows.Forms.ComboBox CB_ConnectionIndex; + private PokeathlonConnection4Editor UC_Connection; + private System.Windows.Forms.TableLayoutPanel TLP_Medals; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Pokeathlon4.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Pokeathlon4.cs new file mode 100644 index 000000000..1e49dce94 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Pokeathlon4.cs @@ -0,0 +1,462 @@ +using PKHeX.Core; +using PKHeX.Drawing.PokeSprite; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; + +namespace PKHeX.WinForms; + +public sealed partial class SAV_Pokeathlon4 : Form +{ + private const int MaxSpeciesGen4 = 493; + + private readonly SAV4HGSS Origin; + private readonly SAV4HGSS SAV; + private readonly Pokeathlon4 Pokeathlon; + private readonly CheckBox[] DailyShopEditors; + private readonly NumericUpDown[] CourseScoreEditors; + private readonly PokeathlonParticipant4Editor[] CourseParticipantEditors; + private readonly List CounterEditors = []; + private readonly List<(PokeathlonEvent4 Event, NumericUpDown Editor)> BestScoreEditors = []; + private readonly Button B_BestSpacer = new(); + + private bool IsLoading; + private int CurrentCourseIndex = -1; + private int CurrentSelfEventIndex = -1; + private int CurrentConnectionIndex = -1; + + private static string Localize(T value) where T : Enum => WinFormsTranslator.TranslateEnum(value, Main.CurrentLanguage); + private static string GetCourseDisplayName(PokeathlonStat4 stat) => $"{(int)stat + 1} - {Localize(stat)}"; + private static string GetEventDisplayName(PokeathlonEvent4 value) => $"{(int)value + 1} - {Localize(value)}"; + + public SAV_Pokeathlon4(SAV4HGSS sav) + { + InitializeComponent(); + +#if DEBUG // Translation Rip + // ReSharper disable once NullCoalescingConditionIsAlwaysNotNullAccordingToAPIContract + // ReSharper disable once ArrangeObjectCreationWhenTypeNotEvident + sav ??= new(); +#endif + + Origin = sav; + SAV = (SAV4HGSS)sav.Clone(); + Pokeathlon = SAV.Pokeathlon; + + DailyShopEditors = + [ + CHK_DailyShop0, CHK_DailyShop1, CHK_DailyShop2, CHK_DailyShop3, CHK_DailyShop4, CHK_DailyShop5, + CHK_DailyShop6, CHK_DailyShop7, CHK_DailyShop8, CHK_DailyShop9, CHK_DailyShop10, CHK_DailyShop11, + ]; + CourseScoreEditors = [NUD_CourseScore0, NUD_CourseScore1, NUD_CourseScore2, NUD_CourseScoreMax]; + CourseParticipantEditors = [UC_CourseParticipant0, UC_CourseParticipant1, UC_CourseParticipant2]; + + InitializeGeneral(); + InitializeMedals(); + InitializeCounters(); + InitializeBestScores(); + InitializeIndexes(); + + WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); + + LoadData(); + } + + private void B_Save_Click(object sender, EventArgs e) + { + SaveCurrentViews(); + SaveGeneral(); + SaveMedals(); + SaveCounters(); + SaveBestScores(); + Origin.CopyChangesFrom(SAV); + Close(); + } + + private void B_Cancel_Click(object sender, EventArgs e) => Close(); + + private void CB_CourseIndex_SelectedIndexChanged(object sender, EventArgs e) + { + if (IsLoading) + return; + + var index = WinFormsUtil.GetIndex(CB_CourseIndex); + if (CurrentCourseIndex >= 0) + SaveCourse(CurrentCourseIndex); + LoadCourse(index); + } + + private void CB_SelfEventIndex_SelectedIndexChanged(object sender, EventArgs e) + { + if (IsLoading) + return; + + var index = WinFormsUtil.GetIndex(CB_SelfEventIndex); + if (CurrentSelfEventIndex >= 0) + SaveSelfEvent(CurrentSelfEventIndex); + LoadSelfEvent(index); + } + + private void CB_ConnectionIndex_SelectedIndexChanged(object sender, EventArgs e) + { + if (IsLoading) + return; + + var index = WinFormsUtil.GetIndex(CB_ConnectionIndex); + if (CurrentConnectionIndex >= 0) + SaveConnection(index: CurrentConnectionIndex); + LoadConnection(index); + } + + private void InitializeGeneral() + { + var items = GameInfo.Strings.GetItemStrings(EntityContext.Gen4); + CLB_DataCards.Items.Clear(); + for (int i = 0; i < (int)DataCard4.Count; i++) + { + var itemID = 505 + i; // Data Card 01... + var name = items[itemID]; + CLB_DataCards.Items.Add($"[{i}] {name}"); + } + } + + private void InitializeMedals() + { + DGV_Medals.Columns.Clear(); + DGV_Medals.Rows.Clear(); + DGV_Medals.AllowUserToAddRows = false; + DGV_Medals.AllowUserToDeleteRows = false; + DGV_Medals.AllowUserToResizeRows = false; + DGV_Medals.MultiSelect = false; + DGV_Medals.RowHeadersVisible = false; + DGV_Medals.RowTemplate.Height = 40; + + DGV_Medals.Columns.Add(new DataGridViewTextBoxColumn + { + Name = "Species", + HeaderText = "Species", + Width = 80, + ReadOnly = true, + DefaultCellStyle = { Alignment = DataGridViewContentAlignment.MiddleCenter }, + }); + DGV_Medals.Columns.Add(new DataGridViewImageColumn + { + Name = "Sprite", + HeaderText = "Sprite", + Width = 48, + ReadOnly = true, + ImageLayout = DataGridViewImageCellLayout.Zoom, + }); + + foreach (var name in Enum.GetNames().Take((int)PokeathlonStat4.Count)) + { + DGV_Medals.Columns.Add(new DataGridViewCheckBoxColumn + { + Name = name, + HeaderText = name, + Width = 80, + SortMode = DataGridViewColumnSortMode.Automatic, + }); + } + + DGV_Medals.Rows.Add(MaxSpeciesGen4); + for (int species = 1; species <= MaxSpeciesGen4; species++) + { + var row = DGV_Medals.Rows[species - 1]; + row.Cells[0].Value = species; + row.Cells[1].Value = SpriteUtil.GetSprite((ushort)species, 0, 0, 0, 0, false, Shiny.Never, EntityContext.Gen4); + row.Tag = (ushort)species; + row.Cells[0].ToolTipText = GameInfo.Strings.specieslist[species]; + row.Cells[1].ToolTipText = GameInfo.Strings.specieslist[species]; + } + } + + private void InitializeCounters() + { + AddCounterRow("TimeSpent", PokeathlonGlobalCounters4.MaxPlay, () => Pokeathlon.GlobalCounters.TimeSpent, value => { var c = Pokeathlon.GlobalCounters; c.TimeSpent = value; }); + AddCounterRow("SessionsJoined", PokeathlonGlobalCounters4.MaxStat, () => Pokeathlon.GlobalCounters.SessionsJoined, value => { var c = Pokeathlon.GlobalCounters; c.SessionsJoined = value; }); + AddCounterRow("PlacedFirst", PokeathlonGlobalCounters4.MaxStat, () => Pokeathlon.GlobalCounters.PlacedFirst, value => { var c = Pokeathlon.GlobalCounters; c.PlacedFirst = value; }); + AddCounterRow("PlacedLast", PokeathlonGlobalCounters4.MaxStat, () => Pokeathlon.GlobalCounters.PlacedLast, value => { var c = Pokeathlon.GlobalCounters; c.PlacedLast = value; }); + AddCounterRow("BonusesEarned", PokeathlonGlobalCounters4.MaxStat, () => Pokeathlon.GlobalCounters.BonusesEarned, value => { var c = Pokeathlon.GlobalCounters; c.BonusesEarned = value; }); + AddCounterRow("Instructions", PokeathlonGlobalCounters4.MaxStat, () => Pokeathlon.GlobalCounters.Instructions, value => { var c = Pokeathlon.GlobalCounters; c.Instructions = value; }); + AddCounterRow("Failed", PokeathlonGlobalCounters4.MaxStat, () => Pokeathlon.GlobalCounters.Failed, value => { var c = Pokeathlon.GlobalCounters; c.Failed = value; }); + AddCounterRow("Jumped", PokeathlonGlobalCounters4.MaxStat, () => Pokeathlon.GlobalCounters.Jumped, value => { var c = Pokeathlon.GlobalCounters; c.Jumped = value; }); + AddCounterRow("Acquired", PokeathlonGlobalCounters4.MaxStat, () => Pokeathlon.GlobalCounters.Acquired, value => { var c = Pokeathlon.GlobalCounters; c.Acquired = value; }); + AddCounterRow("Tackled", PokeathlonGlobalCounters4.MaxStat, () => Pokeathlon.GlobalCounters.Tackled, value => { var c = Pokeathlon.GlobalCounters; c.Tackled = value; }); + AddCounterRow("FellDown", PokeathlonGlobalCounters4.MaxStat, () => Pokeathlon.GlobalCounters.FellDown, value => { var c = Pokeathlon.GlobalCounters; c.FellDown = value; }); + AddCounterRow("Dashed", PokeathlonGlobalCounters4.MaxStat, () => Pokeathlon.GlobalCounters.Dashed, value => { var c = Pokeathlon.GlobalCounters; c.Dashed = value; }); + AddCounterRow("Switched", PokeathlonGlobalCounters4.MaxStat, () => Pokeathlon.GlobalCounters.Switched, value => { var c = Pokeathlon.GlobalCounters; c.Switched = value; }); + AddCounterRow("SelfImpeded", PokeathlonGlobalCounters4.MaxStat, () => Pokeathlon.GlobalCounters.SelfImpeded, value => { var c = Pokeathlon.GlobalCounters; c.SelfImpeded = value; }); + AddCounterRow("ConnectionJoined", PokeathlonGlobalCounters4.MaxStat, () => Pokeathlon.GlobalCounters.ConnectionJoined, value => { var c = Pokeathlon.GlobalCounters; c.ConnectionJoined = value; }); + AddCounterRow("ConnectionFirst", PokeathlonGlobalCounters4.MaxStat, () => Pokeathlon.GlobalCounters.ConnectionFirst, value => { var c = Pokeathlon.GlobalCounters; c.ConnectionFirst = value; }); + AddCounterRow("ConnectionLast", PokeathlonGlobalCounters4.MaxStat, () => Pokeathlon.GlobalCounters.ConnectionLast, value => { var c = Pokeathlon.GlobalCounters; c.ConnectionLast = value; }); + + for (int i = 0; i < (int)PokeathlonEvent4.Count; i++) + { + var eventIndex = (PokeathlonEvent4)i; + AddCounterRow($"{Localize(eventIndex)}First", PokeathlonGlobalCounters4.MaxStat, + () => { var c = Pokeathlon.GlobalCounters; return c[eventIndex]; }, + value => { var c = Pokeathlon.GlobalCounters; c[eventIndex] = value; }); + } + + AddCounterRow("TotalEventFirst", PokeathlonGlobalCounters4.MaxStat * (decimal)PokeathlonEvent4.Count, + () => { var c = Pokeathlon.GlobalCounters; return c.TotalEventFirst; }, null); + AddCounterRow("TotalEventLast", PokeathlonGlobalCounters4.MaxStat, + () => Pokeathlon.GlobalCounters.TotalEventLast, + value => { var c = Pokeathlon.GlobalCounters; c.TotalEventLast = value; }); + AddCounterRow("Fame", PokeathlonGlobalCounters4.MaxFame, + () => Pokeathlon.GlobalCounters.Fame, + value => { var c = Pokeathlon.GlobalCounters; c.Fame = value; }); + } + + private void InitializeBestScores() + { + for (int i = 0; i < (int)PokeathlonEvent4.Count; i++) + { + var label = new Label + { + Anchor = AnchorStyles.Right, + AutoSize = true, + Text = GetEventDisplayName((PokeathlonEvent4)i) + ':', + }; + var editor = CreateNumericEditor(ushort.MaxValue); + TLP_Best.RowStyles.Add(new RowStyle()); + TLP_Best.Controls.Add(label, 0, i); + TLP_Best.Controls.Add(editor, 1, i); + BestScoreEditors.Add(((PokeathlonEvent4)i, editor)); + } + + int spacerRow = BestScoreEditors.Count; + TLP_Best.RowStyles.Add(new RowStyle()); + B_BestSpacer.Enabled = false; + B_BestSpacer.TabStop = false; + B_BestSpacer.Margin = Padding.Empty; + B_BestSpacer.Size = new Size(120, 1); + TLP_Best.Controls.Add(B_BestSpacer, 1, spacerRow); + } + + private void InitializeIndexes() + { + InitializeCombo(CB_CourseIndex, [.. Enum.GetValues().Take((int)PokeathlonStat4.Count).Select(z => new ComboItem(GetCourseDisplayName(z), (int)z))]); + List events = [.. Enum.GetValues().Take((int)PokeathlonEvent4.Count).Select(z => new ComboItem(GetEventDisplayName(z), (int)z))]; + InitializeCombo(CB_SelfEventIndex, events); + InitializeCombo(CB_ConnectionIndex, events); + } + + private void LoadData() + { + IsLoading = true; + LoadGeneral(); + LoadMedals(); + LoadCounters(); + LoadBestScores(); + CB_CourseIndex.SelectedValue = 0; + CB_SelfEventIndex.SelectedValue = 0; + CB_ConnectionIndex.SelectedValue = 0; + IsLoading = false; + + LoadCourse(0); + LoadSelfEvent(0); + LoadConnection(0); + } + + private void LoadGeneral() + { + NUD_Points.SetValueClamped(Pokeathlon.Points); + + var dailyFlags = Pokeathlon.FlagsDailyShop; + for (int i = 0; i < DailyShopEditors.Length; i++) + DailyShopEditors[i].Checked = ((dailyFlags >> i) & 1) != 0; + + var dataCardFlags = Pokeathlon.FlagsDataCard; + for (int i = 0; i < CLB_DataCards.Items.Count; i++) + CLB_DataCards.SetItemChecked(i, ((dataCardFlags >> i) & 1) != 0); + } + + private void SaveGeneral() + { + Pokeathlon.Points = (uint)NUD_Points.Value; + + ushort dailyFlags = 0; + for (int i = 0; i < DailyShopEditors.Length; i++) + { + if (DailyShopEditors[i].Checked) + dailyFlags |= (ushort)(1 << i); + } + Pokeathlon.FlagsDailyShop = dailyFlags; + + uint dataCardFlags = 0; + for (int i = 0; i < CLB_DataCards.Items.Count; i++) + { + if (CLB_DataCards.GetItemChecked(i)) + dataCardFlags |= 1u << i; + } + Pokeathlon.FlagsDataCard = dataCardFlags; + } + + private void LoadMedals() + { + var medals = Pokeathlon.Medals; + for (int species = 1; species <= MaxSpeciesGen4; species++) + { + var bits = medals.GetMedal((ushort)species); + var row = DGV_Medals.Rows[species - 1]; + for (int i = 0; i < (int)PokeathlonStat4.Count; i++) + row.Cells[2 + i].Value = ((bits >> i) & 1) != 0; + } + } + + private void SaveMedals() + { + var medals = Pokeathlon.Medals; + for (int species = 1; species <= MaxSpeciesGen4; species++) + { + byte bits = 0; + var row = DGV_Medals.Rows[species - 1]; + for (int i = 0; i < (int)PokeathlonStat4.Count; i++) + { + if ((bool?)row.Cells[2 + i].Value == true) + bits |= (byte)(1 << i); + } + medals.SetMedal((ushort)species, bits); + } + } + + private void LoadCounters() + { + foreach (var binding in CounterEditors) + binding.Editor.SetValueClamped(binding.Getter()); + } + + private void SaveCounters() + { + foreach (var binding in CounterEditors) + { + if (binding.Setter is not null) + binding.Setter((uint)binding.Editor.Value); + } + } + + private void LoadBestScores() + { + foreach (var binding in BestScoreEditors) + binding.Editor.SetValueClamped(Pokeathlon.GetBestScore(binding.Event)); + } + + private void SaveBestScores() + { + foreach (var binding in BestScoreEditors) + Pokeathlon.SetBestScore(binding.Event, (ushort)binding.Editor.Value); + } + + private void LoadCourse(int index) + { + IsLoading = true; + var course = Pokeathlon.GetCourseRecord((PokeathlonStat4)index); + CourseScoreEditors[0].SetValueClamped(course.Score0); + CourseScoreEditors[1].SetValueClamped(course.Score1); + CourseScoreEditors[2].SetValueClamped(course.Score2); + CourseScoreEditors[3].SetValueClamped(course.ScoreMax); + for (int i = 0; i < CourseParticipantEditors.Length; i++) + CourseParticipantEditors[i].LoadObject(course.GetParticipant(i)); + CurrentCourseIndex = index; + IsLoading = false; + } + + private void SaveCourse(int index) + { + var course = Pokeathlon.GetCourseRecord((PokeathlonStat4)index); + course.Score0 = (ushort)CourseScoreEditors[0].Value; + course.Score1 = (ushort)CourseScoreEditors[1].Value; + course.Score2 = (ushort)CourseScoreEditors[2].Value; + course.ScoreMax = (ushort)CourseScoreEditors[3].Value; + for (int i = 0; i < CourseParticipantEditors.Length; i++) + CourseParticipantEditors[i].SaveObject(course.GetParticipant(i)); + } + + private void LoadSelfEvent(int index) + { + IsLoading = true; + UC_SelfEventData.LoadObject(Pokeathlon.GetEventSelf((PokeathlonEvent4)index)); + CurrentSelfEventIndex = index; + IsLoading = false; + } + + private void SaveSelfEvent(int index) + { + UC_SelfEventData.SaveObject(Pokeathlon.GetEventSelf((PokeathlonEvent4)index)); + } + + private void LoadConnection(int index) + { + IsLoading = true; + UC_Connection.LoadObject(Pokeathlon.GetEventConnection((PokeathlonEvent4)index)); + CurrentConnectionIndex = index; + IsLoading = false; + } + + private void SaveConnection(int index) + { + UC_Connection.SaveObject(Pokeathlon.GetEventConnection((PokeathlonEvent4)index)); + } + + private void SaveCurrentViews() + { + if (CurrentCourseIndex >= 0) + SaveCourse(CurrentCourseIndex); + if (CurrentSelfEventIndex >= 0) + SaveSelfEvent(CurrentSelfEventIndex); + if (CurrentConnectionIndex >= 0) + SaveConnection(CurrentConnectionIndex); + } + + private void AddCounterRow(string name, decimal maximum, Func getter, Action? setter) + { + int row = CounterEditors.Count; + TLP_Counters.RowStyles.Add(new RowStyle()); + var label = new Label + { + Name = $"L_{name}", + Anchor = AnchorStyles.Right, + AutoSize = true, + Text = name, + }; + var editor = CreateNumericEditor(maximum, setter is not null); + TLP_Counters.Controls.Add(label, 0, row); + TLP_Counters.Controls.Add(editor, 1, row); + CounterEditors.Add(new CounterBinding(name, editor, getter, setter)); + } + + private static NumericUpDown CreateNumericEditor(decimal maximum, bool enabled = true) => new() + { + Maximum = maximum, + Size = new Size(120, 25), + Enabled = enabled, + }; + + private static void InitializeCombo(ComboBox cb, IReadOnlyList source) + { + cb.InitializeBinding(); + cb.DataSource = new BindingSource(source, string.Empty); + } + + private void B_MedalsGiveAll_Click(object? sender, EventArgs e) + { + var medals = Pokeathlon.Medals; + medals.SetAllMedals(); + LoadMedals(); + WinFormsUtil.Asterisk(); + } + + private void B_MedalsClearAll_Click(object? sender, EventArgs e) + { + var medals = Pokeathlon.Medals; + medals.Clear(); + LoadMedals(); + WinFormsUtil.Asterisk(); + } + + private sealed record CounterBinding(string Name, NumericUpDown Editor, Func Getter, Action? Setter); +} diff --git a/PKHeX.WinForms/Util/DevUtil.cs b/PKHeX.WinForms/Util/DevUtil.cs index 7dd7dc337..97a211da0 100644 --- a/PKHeX.WinForms/Util/DevUtil.cs +++ b/PKHeX.WinForms/Util/DevUtil.cs @@ -179,6 +179,8 @@ private static void UpdateTranslations() typeof(PokeSize), typeof(PokeSizeDetailed), + typeof(PokeathlonStat4), + typeof(PokeathlonEvent4), typeof(PassPower5), typeof(Funfest5Mission), typeof(JoinAvenueCeilingColor5), From ee2fd8428a02a0e412c81394cc06851419c9cd41 Mon Sep 17 00:00:00 2001 From: Kurt Date: Tue, 26 May 2026 00:33:34 -0500 Subject: [PATCH 46/81] WA9: check all IVs if all specified Closes #4812 --- PKHeX.Core/MysteryGifts/WA9.cs | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/PKHeX.Core/MysteryGifts/WA9.cs b/PKHeX.Core/MysteryGifts/WA9.cs index f4181a75e..25625d19a 100644 --- a/PKHeX.Core/MysteryGifts/WA9.cs +++ b/PKHeX.Core/MysteryGifts/WA9.cs @@ -684,15 +684,33 @@ public override bool IsMatchExact(PKM pk, EvoCriteria evo) if (pk is IAlphaReadOnly a && a.IsAlpha != IsAlpha) return true; - if (IsHOMEGift && FlawlessIVCount > 0) + if (IsHOMEGift) { - if (pk.FlawlessIVCount != FlawlessIVCount) - return false; // HOME ZA-starters have non-perfect IVs to 20, so IVs at 31 can't exceed the flawless count. - - for (var i = 0; i < 6; i++) + if (FlawlessIVCount > 0) { - var iv = pk.GetIV(i); - if (iv != 31 && iv != HomeBaseIV) + if (pk.FlawlessIVCount != FlawlessIVCount) + return false; // HOME ZA-starters have non-perfect IVs to 20, so IVs at 31 can't exceed the flawless count. + + for (var i = 0; i < 6; i++) + { + var iv = pk.GetIV(i); + if (iv != 31 && iv != HomeBaseIV) + return false; + } + } + else // All Specified + { + if (pk.IV_HP != IV_HP) + return false; + if (pk.IV_ATK != IV_ATK) + return false; + if (pk.IV_DEF != IV_DEF) + return false; + if (pk.IV_SPA != IV_SPA) + return false; + if (pk.IV_SPD != IV_SPD) + return false; + if (pk.IV_SPE != IV_SPE) return false; } } From 8e7e02add5b284e7f755b24fbf103abed26acc90 Mon Sep 17 00:00:00 2001 From: Kurt Date: Tue, 26 May 2026 10:48:12 -0500 Subject: [PATCH 47/81] swsh: another use of exeggutor static https://projectpokemon.org/home/forums/topic/57375-pkhex-new-update-legality-errors-contribution-page/page/36/#findComment-300436 https://bulbapedia.bulbagarden.net/wiki/Workout_Sea#Wanderers --- PKHeX.Core/Legality/Encounters/Data/Gen8/Encounters8.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/PKHeX.Core/Legality/Encounters/Data/Gen8/Encounters8.cs b/PKHeX.Core/Legality/Encounters/Data/Gen8/Encounters8.cs index c12c85e42..b01b60a9d 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Gen8/Encounters8.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Gen8/Encounters8.cs @@ -509,6 +509,7 @@ internal static class Encounters8 new() { Species = 479, Level = 50, Location = 186, Form = 05, Weather = Normal | Stormy | Intense_Sun | Heavy_Fog }, // Rotom-5 in the Workout Sea new() { Species = 132, Level = 50, Location = 186, FlawlessIVCount = 3 }, // Ditto in the Workout Sea //new() { Species = 242, Level = 50, Location = -1 }, // Blissey + new() { Species = 103, Level = 50, Location = 186, Weather = Normal | Intense_Sun }, // Exeggutor in the Workout Sea new() { Species = 103, Level = 50, Location = 190, Weather = Normal | Raining | Intense_Sun }, // Exeggutor in the Insular Sea new() { Species = 571, Level = 50, Location = 190, Weather = Overcast }, // Zoroark in the Insular Sea new() { Species = 462, Level = 50, Location = 190, Weather = Thunderstorm }, // Magnezone in the Insular Sea From 3c6c7d71c20cd9c2dacec2d72440d38002b77b57 Mon Sep 17 00:00:00 2001 From: Kurt Date: Tue, 26 May 2026 23:26:47 -0500 Subject: [PATCH 48/81] Minor casting perf improvement moves the cast to the return, registers are 32-bit and overflow is OK. --- PKHeX.Core/Saves/Util/Checksums.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/PKHeX.Core/Saves/Util/Checksums.cs b/PKHeX.Core/Saves/Util/Checksums.cs index fe991066e..e5dc042e1 100644 --- a/PKHeX.Core/Saves/Util/Checksums.cs +++ b/PKHeX.Core/Saves/Util/Checksums.cs @@ -105,10 +105,10 @@ public static ushort CRC16_CCITT(ReadOnlySpan data) /// Checksum private static ushort CRC16(ReadOnlySpan data, [ConstantExpected] ushort initial) { - ushort chk = initial; + uint chk = initial; foreach (var b in data) - chk = (ushort)(crc16[(byte)(b ^ chk)] ^ (chk >> 8)); - return chk; + chk = crc16[(byte)(b ^ chk)] ^ (chk >> 8); + return (ushort)chk; } private const ushort CRC16Initial = unchecked((ushort)~0); @@ -166,10 +166,10 @@ private static uint CRC32(ReadOnlySpan data, [ConstantExpected] uint initi /// Checksum public static ushort CheckSum16(ReadOnlySpan data, [ConstantExpected] ushort initial = 0) { - ushort acc = initial; + uint acc = initial; foreach (byte b in data) acc += b; - return acc; + return (ushort)acc; } /// Calculates the 32bit checksum over an input byte array. Used in GC R/S BOX. @@ -188,7 +188,7 @@ public static uint CheckSum16BigInvert(ReadOnlySpan data) /// Checksum public static ushort Add16(ReadOnlySpan data) { - ushort chk = 0; + uint chk = 0; foreach (var u16 in MemoryMarshal.Cast(data)) { if (BitConverter.IsLittleEndian) @@ -196,7 +196,7 @@ public static ushort Add16(ReadOnlySpan data) else chk += ReverseEndianness(u16); } - return chk; + return (ushort)chk; } /// @@ -206,7 +206,7 @@ public static ushort Add16(ReadOnlySpan data) /// Checksum public static ushort Add16BigEndian(ReadOnlySpan data) { - ushort chk = 0; + uint chk = 0; foreach (var u16 in MemoryMarshal.Cast(data)) { if (!BitConverter.IsLittleEndian) @@ -214,6 +214,6 @@ public static ushort Add16BigEndian(ReadOnlySpan data) else chk += ReverseEndianness(u16); } - return chk; + return (ushort)chk; } } From dd76abdbb4860513bc4cd1c8849a59422b3ce2f5 Mon Sep 17 00:00:00 2001 From: Kurt Date: Wed, 27 May 2026 11:28:16 -0500 Subject: [PATCH 49/81] Add highdpi text/control setting, detect dark MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Detects for system dark mode on startup since many users don't know about dark mode. Won't override any existing setting, just detects if no cfg exists `new()`. Text/control dpi scaling is opt-in for high dpi users, reduces font blurriness. https://github.com/kwsch/PKHeX/discussions/4458#discussioncomment-12362513 The hover-preview was rewritten in the past year to directly paint instead of updating many controls, so it works fine with `DpiUnawareGdiScaled`. I've not checked extensively to see if anything becomes broken, so user beware 💫 --- PKHeX.WinForms/Program.cs | 2 ++ PKHeX.WinForms/Settings/StartupSettings.cs | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/PKHeX.WinForms/Program.cs b/PKHeX.WinForms/Program.cs index aa97949f1..c91f56e53 100644 --- a/PKHeX.WinForms/Program.cs +++ b/PKHeX.WinForms/Program.cs @@ -39,6 +39,8 @@ static Program() if (Settings.Startup.DarkMode) Application.SetColorMode(SystemColorMode.Dark); + if (Settings.Startup.HighDpiText) + Application.SetHighDpiMode(HighDpiMode.DpiUnawareGdiScaled); } [STAThread] diff --git a/PKHeX.WinForms/Settings/StartupSettings.cs b/PKHeX.WinForms/Settings/StartupSettings.cs index 0d98eb505..a320d513e 100644 --- a/PKHeX.WinForms/Settings/StartupSettings.cs +++ b/PKHeX.WinForms/Settings/StartupSettings.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Windows.Forms; using PKHeX.Core; namespace PKHeX.WinForms; @@ -12,11 +13,14 @@ public sealed class StartupSettings : IStartupSettings public string Version { get; set; } = string.Empty; [LocalizedDescription("Use the Dark color mode for the application on startup.")] - public bool DarkMode { get; set; } + public bool DarkMode { get; set; } = Application.SystemColorMode == SystemColorMode.Dark; // auto-detect for new settings, json load preserves any choice. [LocalizedDescription("Force HaX mode on Program Launch")] public bool ForceHaXOnLaunch { get; set; } + [LocalizedDescription("Toggles a higher Dpi rendering mode for the application on startup.")] + public bool HighDpiText { get; set; } // opt-in + [LocalizedDescription("Skips displaying the splash screen on Program Launch.")] public bool SkipSplashScreen { get; set; } From 95e1247df18f36647d8fedca4a56bce6d23d4bfb Mon Sep 17 00:00:00 2001 From: Ka-n00b Date: Thu, 28 May 2026 23:04:48 -0400 Subject: [PATCH 50/81] Minor Translation Updates (#4813) * Update lang_en.txt * Update lang_de.txt * Update lang_es-419.txt * Update lang_es.txt * Update lang_fr.txt * Update lang_it.txt * Update lang_ja.txt * Update lang_ko.txt * Update lang_zh-Hans.txt * Update lang_zh-Hant.txt * Update lang_es-419.txt * Update lang_es.txt * Update lang_en.txt * Update lang_zh-Hans.txt * Update lang_zh-Hant.txt * Update lang_zh-Hans.txt * Update lang_zh-Hant.txt * Update lang_es-419.txt * Update lang_ko.txt --- PKHeX.WinForms/Resources/text/lang_de.txt | 22 ++++++------- PKHeX.WinForms/Resources/text/lang_en.txt | 24 +++++++------- PKHeX.WinForms/Resources/text/lang_es-419.txt | 24 +++++++------- PKHeX.WinForms/Resources/text/lang_es.txt | 22 ++++++------- PKHeX.WinForms/Resources/text/lang_fr.txt | 4 +-- PKHeX.WinForms/Resources/text/lang_it.txt | 24 +++++++------- PKHeX.WinForms/Resources/text/lang_ja.txt | 26 +++++++-------- PKHeX.WinForms/Resources/text/lang_ko.txt | 32 +++++++++---------- .../Resources/text/lang_zh-Hans.txt | 28 ++++++++-------- .../Resources/text/lang_zh-Hant.txt | 28 ++++++++-------- 10 files changed, 117 insertions(+), 117 deletions(-) diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index a7caa0eb0..304499322 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -186,30 +186,30 @@ Funfest5Mission.BigHarvestofBerries=Die große Beerenernte! Funfest5Mission.CollectBerries=Sammele Beeren! Funfest5Mission.DoaGreatTradeUp=Vom Tauschhändler zum Millionär! Funfest5Mission.EnjoyShopping=Schnäppchenjagd! -Funfest5Mission.ExcitingTradingB=Spaßiger Tauschhandel! (B) -Funfest5Mission.ExhilaratingTradingW=Aufregender Tauschhandel! (W) +Funfest5Mission.ExcitingTradingB=Spaßiger Tauschhandel! (S2) +Funfest5Mission.ExhilaratingTradingW=Aufregender Tauschhandel! (W2) Funfest5Mission.FindAudino=Finde das Audino! Funfest5Mission.FindEmolga=Finde das Emolga! Funfest5Mission.FindLostBoys=Finde die verirrten Kinder! Funfest5Mission.FindLostItems=Suche Fundsachen! -Funfest5Mission.FindMysteriousOresB=Finde mysteriöses Erz! (B) +Funfest5Mission.FindMysteriousOresB=Finde mysteriöses Erz! (S2) Funfest5Mission.FindRustlingGrass=Da ist was im Busch! Funfest5Mission.FindShards=Stück für Stück! -Funfest5Mission.FindShiningOresW=Finde leuchtendes Erz! (W) +Funfest5Mission.FindShiningOresW=Finde leuchtendes Erz! (W2) Funfest5Mission.FindSteelix=Finde das Steelix! Funfest5Mission.FindTreasures=Schatzsuche! Funfest5Mission.FishingCompetition=Angelwettbewerb! -Funfest5Mission.ForgottenLostItemsB=Vergessene Fundsachen! (B) -Funfest5Mission.GetRichQuickB=Im Nu reich! (B) +Funfest5Mission.ForgottenLostItemsB=Vergessene Fundsachen! (S2) +Funfest5Mission.GetRichQuickB=Im Nu reich! (S2) Funfest5Mission.GivemetheItem=Gib mir dieses Item! Funfest5Mission.MemoryTraining=Gedächtnistraining! Funfest5Mission.MulchCollector=Sammele Mulche! Funfest5Mission.MushroomsHideAndSeek=Pilzsuche! Funfest5Mission.NoisyHiddenGrottoesB=Laute Lichtungen! -Funfest5Mission.NotFoundLostItemsW=Unauffindbare Gegenstände! (W) +Funfest5Mission.NotFoundLostItemsW=Unauffindbare Gegenstände! (W2) Funfest5Mission.PathtoanAce=Der Weg nach oben! Funfest5Mission.PushtheLimitofYourMemory=Gedächtnis ohne Grenzen! -Funfest5Mission.QuietHiddenGrottoesW=Leise Lichtungen! (W) +Funfest5Mission.QuietHiddenGrottoesW=Leise Lichtungen! (W2) Funfest5Mission.RingtheBell=Läute die Glocke! Funfest5Mission.RockPaperScissorsCompetition=Schere-Stein-Papier-Turnier! Funfest5Mission.SearchFor3Pokemon=Pokémon-Suche hoch 3! @@ -222,9 +222,9 @@ Funfest5Mission.TheBellthatRings3Times=Wenn die Glocke 3-mal läutet! Funfest5Mission.TheBerryHuntingAdventure=Die große Beerensuche! Funfest5Mission.TheFirstBerrySearch=Die erste Beerensuche! Funfest5Mission.TrainwithMartialArtists=Trainiere mit den Kampfsportlern! -Funfest5Mission.TreasureHuntingW=Schatzsuche! (W) -Funfest5Mission.WhatistheBestPriceB=Was ist es wirklich wert? (B) -Funfest5Mission.WhatistheRealPriceW=Was ist der wahre Preis? (W) +Funfest5Mission.TreasureHuntingW=Schatzsuche! (W2) +Funfest5Mission.WhatistheBestPriceB=Was ist es wirklich wert? (S2) +Funfest5Mission.WhatistheRealPriceW=Was ist der wahre Preis? (W2) Funfest5Mission.WhereareFlutteringHearts=Schicksalhafte Herzen! Funfest5Mission.WingsFallingontheDrawbridge=Federn auf der Zugbrücke! GearCategory.Badges=Anstecker diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index 610623e47..93ca61963 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -186,30 +186,30 @@ Funfest5Mission.BigHarvestofBerries=Big Harvest of Berries! Funfest5Mission.CollectBerries=Collect Berries! Funfest5Mission.DoaGreatTradeUp=Do a Great Trade-Up! Funfest5Mission.EnjoyShopping=Enjoy Shopping! -Funfest5Mission.ExcitingTradingB=Exciting Trading! (B) -Funfest5Mission.ExhilaratingTradingW=Exhilarating Trading! (W) +Funfest5Mission.ExcitingTradingB=Exciting Trading! (B2) +Funfest5Mission.ExhilaratingTradingW=Exhilarating Trading! (W2) Funfest5Mission.FindAudino=Find Audino! Funfest5Mission.FindEmolga=Find Emolga! Funfest5Mission.FindLostBoys=Find Lost Boys! Funfest5Mission.FindLostItems=Find Lost Items! -Funfest5Mission.FindMysteriousOresB=Find Mysterious Ores! (B) +Funfest5Mission.FindMysteriousOresB=Find Mysterious Ores! (B2) Funfest5Mission.FindRustlingGrass=Find Rustling Grass! Funfest5Mission.FindShards=Find Shards! -Funfest5Mission.FindShiningOresW=Find Shining Ores! (W) +Funfest5Mission.FindShiningOresW=Find Shining Ores! (W2) Funfest5Mission.FindSteelix=Find Steelix! Funfest5Mission.FindTreasures=Find Treasures! Funfest5Mission.FishingCompetition=Fishing Competition! -Funfest5Mission.ForgottenLostItemsB=Forgotten Lost Items (B) -Funfest5Mission.GetRichQuickB=Get Rich Quick! (B) +Funfest5Mission.ForgottenLostItemsB=Forgotten Lost Items (B2) +Funfest5Mission.GetRichQuickB=Get Rich Quick! (B2) Funfest5Mission.GivemetheItem=Give Me the Item! Funfest5Mission.MemoryTraining=Memory Training! Funfest5Mission.MulchCollector=Mulch Collector! Funfest5Mission.MushroomsHideAndSeek=Mushrooms' Hide-and-Seek! -Funfest5Mission.NoisyHiddenGrottoesB=Noisy Hidden Grottoes! (B) -Funfest5Mission.NotFoundLostItemsW=Not-Found Lost Items (W) +Funfest5Mission.NoisyHiddenGrottoesB=Noisy Hidden Grottoes! (B2) +Funfest5Mission.NotFoundLostItemsW=Not-Found Lost Items (W2) Funfest5Mission.PathtoanAce=Path to an Ace! Funfest5Mission.PushtheLimitofYourMemory=Push the Limit of Your Memory... -Funfest5Mission.QuietHiddenGrottoesW=Quiet Hidden Grottoes! (W) +Funfest5Mission.QuietHiddenGrottoesW=Quiet Hidden Grottoes! (W2) Funfest5Mission.RingtheBell=Ring the Bell... Funfest5Mission.RockPaperScissorsCompetition=Rock-Paper-Scissors Competition! Funfest5Mission.SearchFor3Pokemon=Search for 3 Pokemon! @@ -222,9 +222,9 @@ Funfest5Mission.TheBellthatRings3Times=The Bell That Rings 3 Times Funfest5Mission.TheBerryHuntingAdventure=The Berry-Hunting Adventure! Funfest5Mission.TheFirstBerrySearch=The First Berry Search! Funfest5Mission.TrainwithMartialArtists=Train with Martial Artists! -Funfest5Mission.TreasureHuntingW=Treasure Hunting! (W) -Funfest5Mission.WhatistheBestPriceB=What Is the Best Price? -Funfest5Mission.WhatistheRealPriceW=What Is the Real Price? (W) +Funfest5Mission.TreasureHuntingW=Treasure Hunting! (W2) +Funfest5Mission.WhatistheBestPriceB=What Is the Best Price? (B2) +Funfest5Mission.WhatistheRealPriceW=What Is the Real Price? (W2) Funfest5Mission.WhereareFlutteringHearts=Where Are Fluttering Hearts? Funfest5Mission.WingsFallingontheDrawbridge=Wings Falling on the Drawbridge GearCategory.Badges=Badges diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index f04a277fd..b9be396c3 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -186,27 +186,27 @@ Funfest5Mission.BigHarvestofBerries=Una cosecha muy... fructífera Funfest5Mission.CollectBerries=Vaya, vaya, ¡aquí sí hay Bayas! Funfest5Mission.DoaGreatTradeUp=¡Intercambiando, que es gerundio! Funfest5Mission.EnjoyShopping=¡Disfruta de las rebajas! -Funfest5Mission.ExcitingTradingB=¡Toma y daca emocionante! (B) -Funfest5Mission.ExhilaratingTradingW=¡Toma y daca alborozado! (W) +Funfest5Mission.ExcitingTradingB=¡Toma y daca emocionante! (N2) +Funfest5Mission.ExhilaratingTradingW=¡Toma y daca alborozado! (B2) Funfest5Mission.FindAudino=¡Busca a los Audino! Funfest5Mission.FindEmolga=¡Busca a los Emolga! Funfest5Mission.FindLostBoys=¡Encuentra a los niños perdidos! Funfest5Mission.FindLostItems=En busca del Objeto Perdido -Funfest5Mission.FindMysteriousOresB=¡Busca los minerales misteriosos! (B) +Funfest5Mission.FindMysteriousOresB=¡Busca los minerales misteriosos! (N2) Funfest5Mission.FindRustlingGrass=¡Alto, hierba alta que se mueve! Funfest5Mission.FindShards=¡Parte en pos de Partes! -Funfest5Mission.FindShiningOresW=¡Busca los minerales brillantes! (W) +Funfest5Mission.FindShiningOresW=¡Busca los minerales brillantes! (B2) Funfest5Mission.FindSteelix=¡Busca a los Steelix! Funfest5Mission.FindTreasures=Tesoros subterráneos Funfest5Mission.FishingCompetition=Campeonato de pesca -Funfest5Mission.ForgottenLostItemsB=Objetos Perdidos... en el olvido (B) -Funfest5Mission.GetRichQuickB=Forrarse de la noche a la mañana (B) +Funfest5Mission.ForgottenLostItemsB=Objetos Perdidos... en el olvido (N2) +Funfest5Mission.GetRichQuickB=Forrarse de la noche a la mañana (N2) Funfest5Mission.GivemetheItem=¡Trae para acá ese objeto! Funfest5Mission.MemoryTraining=¡Pon a prueba tu memoria! Funfest5Mission.MulchCollector=¡Abono en abundancia! Funfest5Mission.MushroomsHideAndSeek=Escondite fúngico -Funfest5Mission.NoisyHiddenGrottoesB=Un Claro Oculto bullicioso (B) -Funfest5Mission.NotFoundLostItemsW=Objetos Perdidos sin encontrar (W) +Funfest5Mission.NoisyHiddenGrottoesB=Un Claro Oculto bullicioso (N2) +Funfest5Mission.NotFoundLostItemsW=Objetos Perdidos sin encontrar (B2) Funfest5Mission.PathtoanAce=El camino a la élite Funfest5Mission.PushtheLimitofYourMemory=Los confines de la memoria Funfest5Mission.QuietHiddenGrottoesW=Un Claro Oculto apacible @@ -222,9 +222,9 @@ Funfest5Mission.TheBellthatRings3Times=Los 3 tañidos de la campana Funfest5Mission.TheBerryHuntingAdventure=Una cosecha muy... fructífera Funfest5Mission.TheFirstBerrySearch=La primera búsqueda de Bayas Funfest5Mission.TrainwithMartialArtists=Entrenamiento marcial -Funfest5Mission.TreasureHuntingW=Objetos Perdidos sin encontrar -Funfest5Mission.WhatistheBestPriceB=Regateo sin concesiones -Funfest5Mission.WhatistheRealPriceW=¡Bueno, bonito y barato! +Funfest5Mission.TreasureHuntingW=Objetos Perdidos sin encontrar (B2) +Funfest5Mission.WhatistheBestPriceB=Regateo sin concesiones (N2) +Funfest5Mission.WhatistheRealPriceW=¡Bueno, bonito y barato! (B2) Funfest5Mission.WhereareFlutteringHearts=¿Dónde estáis, corazones? Funfest5Mission.WingsFallingontheDrawbridge=Un puente levadizo alicaído GearCategory.Badges=Broches @@ -1855,7 +1855,7 @@ SAV_Pokeathlon4.B_Cancel=Cancelar SAV_Pokeathlon4.B_MedalsClearAll=Quitar todo SAV_Pokeathlon4.B_MedalsGiveAll=Dar todo SAV_Pokeathlon4.B_Save=Guardar -SAV_Pokeathlon4.CHK_IsShiny=Variocolor +SAV_Pokeathlon4.CHK_IsShiny=Brillante SAV_Pokeathlon4.DGV_Jump=Salto SAV_Pokeathlon4.DGV_Power=Potencia SAV_Pokeathlon4.DGV_Skill=Técnica diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index 9392d9aed..d6c638546 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -186,27 +186,27 @@ Funfest5Mission.BigHarvestofBerries=Una cosecha muy... fructífera Funfest5Mission.CollectBerries=Vaya, vaya, ¡aquí sí hay Bayas! Funfest5Mission.DoaGreatTradeUp=¡Intercambiando, que es gerundio! Funfest5Mission.EnjoyShopping=¡Disfruta de las rebajas! -Funfest5Mission.ExcitingTradingB=¡Toma y daca emocionante! (B) -Funfest5Mission.ExhilaratingTradingW=¡Toma y daca alborozado! (W) +Funfest5Mission.ExcitingTradingB=¡Toma y daca emocionante! (N2) +Funfest5Mission.ExhilaratingTradingW=¡Toma y daca alborozado! (B2) Funfest5Mission.FindAudino=¡Busca a los Audino! Funfest5Mission.FindEmolga=¡Busca a los Emolga! Funfest5Mission.FindLostBoys=¡Encuentra a los niños perdidos! Funfest5Mission.FindLostItems=En busca del Objeto Perdido -Funfest5Mission.FindMysteriousOresB=¡Busca los minerales misteriosos! (B) +Funfest5Mission.FindMysteriousOresB=¡Busca los minerales misteriosos! (N2) Funfest5Mission.FindRustlingGrass=¡Alto, hierba alta que se mueve! Funfest5Mission.FindShards=¡Parte en pos de Partes! -Funfest5Mission.FindShiningOresW=¡Busca los minerales brillantes! (W) +Funfest5Mission.FindShiningOresW=¡Busca los minerales brillantes! (B2) Funfest5Mission.FindSteelix=¡Busca a los Steelix! Funfest5Mission.FindTreasures=Tesoros subterráneos Funfest5Mission.FishingCompetition=Campeonato de pesca -Funfest5Mission.ForgottenLostItemsB=Objetos Perdidos... en el olvido (B) -Funfest5Mission.GetRichQuickB=Forrarse de la noche a la mañana (B) +Funfest5Mission.ForgottenLostItemsB=Objetos Perdidos... en el olvido (N2) +Funfest5Mission.GetRichQuickB=Forrarse de la noche a la mañana (N2) Funfest5Mission.GivemetheItem=¡Trae para acá ese objeto! Funfest5Mission.MemoryTraining=¡Pon a prueba tu memoria! Funfest5Mission.MulchCollector=¡Abono en abundancia! Funfest5Mission.MushroomsHideAndSeek=Escondite fúngico -Funfest5Mission.NoisyHiddenGrottoesB=Un Claro Oculto bullicioso (B) -Funfest5Mission.NotFoundLostItemsW=Objetos Perdidos sin encontrar (W) +Funfest5Mission.NoisyHiddenGrottoesB=Un Claro Oculto bullicioso (N2) +Funfest5Mission.NotFoundLostItemsW=Objetos Perdidos sin encontrar (B2) Funfest5Mission.PathtoanAce=El camino a la élite Funfest5Mission.PushtheLimitofYourMemory=Los confines de la memoria Funfest5Mission.QuietHiddenGrottoesW=Un Claro Oculto apacible @@ -222,9 +222,9 @@ Funfest5Mission.TheBellthatRings3Times=Los 3 tañidos de la campana Funfest5Mission.TheBerryHuntingAdventure=Una cosecha muy... fructífera Funfest5Mission.TheFirstBerrySearch=La primera búsqueda de Bayas Funfest5Mission.TrainwithMartialArtists=Entrenamiento marcial -Funfest5Mission.TreasureHuntingW=Objetos Perdidos sin encontrar -Funfest5Mission.WhatistheBestPriceB=Regateo sin concesiones -Funfest5Mission.WhatistheRealPriceW=¡Bueno, bonito y barato! +Funfest5Mission.TreasureHuntingW=Objetos Perdidos sin encontrar (B2) +Funfest5Mission.WhatistheBestPriceB=Regateo sin concesiones (N2) +Funfest5Mission.WhatistheRealPriceW=¡Bueno, bonito y barato! (B2) Funfest5Mission.WhereareFlutteringHearts=¿Dónde estáis, corazones? Funfest5Mission.WingsFallingontheDrawbridge=Un puente levadizo alicaído GearCategory.Badges=Broches diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index b29df20eb..6d92502fc 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -586,8 +586,8 @@ Main.Menu_DumpBox=Dumper cette Boîte Main.Menu_DumpBoxes=Dumper Boîtes Main.Menu_EncDatabase=Base de do&nnées de rencontres Main.Menu_Exit=&Quitter -Main.Menu_ExportBAK=Enregistrer BAK -Main.Menu_ExportSAV=&Enregistrer SAV... +Main.Menu_ExportBAK=Exporter BAK +Main.Menu_ExportSAV=&Exporter SAV... Main.Menu_File=&Fichier Main.Menu_Folder=Ouvrir le dossier Main.Menu_Language=&Langue diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index cec883fa7..2ffb4825a 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -186,30 +186,30 @@ Funfest5Mission.BigHarvestofBerries=La grande raccolta di Bacche! Funfest5Mission.CollectBerries=Colleziona le Bacche! Funfest5Mission.DoaGreatTradeUp=Accumula una fortuna! Funfest5Mission.EnjoyShopping=Viva lo shopping! -Funfest5Mission.ExcitingTradingB=Scambi entusiasmanti! (B) -Funfest5Mission.ExhilaratingTradingW=Scambi al cardiopalma! (W) +Funfest5Mission.ExcitingTradingB=Scambi entusiasmanti! (N2) +Funfest5Mission.ExhilaratingTradingW=Scambi al cardiopalma! (B2) Funfest5Mission.FindAudino=Cerca Audino! Funfest5Mission.FindEmolga=Cerca Emolga! Funfest5Mission.FindLostBoys=Cerca i bambini che si sono persi! Funfest5Mission.FindLostItems=Cerca gli strumenti smarriti! -Funfest5Mission.FindMysteriousOresB=Trova i minerali del mistero! (B) +Funfest5Mission.FindMysteriousOresB=Trova i minerali del mistero! (N2) Funfest5Mission.FindRustlingGrass=Cerca l'erba alta che ondeggia! Funfest5Mission.FindShards=Chi cerca trova! -Funfest5Mission.FindShiningOresW=Trova i minerali brillanti! (W) +Funfest5Mission.FindShiningOresW=Trova i minerali brillanti! (B2) Funfest5Mission.FindSteelix=Cerca Steelix! Funfest5Mission.FindTreasures=Dissotterra i tesori! Funfest5Mission.FishingCompetition=Gara di pesca! -Funfest5Mission.ForgottenLostItemsB=Strumenti dimenticati (B) -Funfest5Mission.GetRichQuickB=Riempi il portafogli! (B) +Funfest5Mission.ForgottenLostItemsB=Strumenti dimenticati (N2) +Funfest5Mission.GetRichQuickB=Riempi il portafogli! (N2) Funfest5Mission.GivemetheItem=Dammi quello strumento! Funfest5Mission.MemoryTraining=Allena la tua memoria! Funfest5Mission.MulchCollector=Colleziona fertilizzanti! Funfest5Mission.MushroomsHideAndSeek=A nascondino con i funghi! -Funfest5Mission.NoisyHiddenGrottoesB=Meandri Nascosti rumorosi! (B) -Funfest5Mission.NotFoundLostItemsW=Strumenti introvabili (W) +Funfest5Mission.NoisyHiddenGrottoesB=Meandri Nascosti rumorosi! (N2) +Funfest5Mission.NotFoundLostItemsW=Strumenti introvabili (B2) Funfest5Mission.PathtoanAce=La strada verso la perfezione! Funfest5Mission.PushtheLimitofYourMemory=Verso i limiti della memoria... -Funfest5Mission.QuietHiddenGrottoesW=Meandri Nascosti silenziosi! (W) +Funfest5Mission.QuietHiddenGrottoesW=Meandri Nascosti silenziosi! (B2) Funfest5Mission.RingtheBell=Suona la campana... Funfest5Mission.RockPaperScissorsCompetition=Torneo di Pokémorra cinese! Funfest5Mission.SearchFor3Pokemon=Cerca 3 Pokémon! @@ -222,9 +222,9 @@ Funfest5Mission.TheBellthatRings3Times=La campana che suona 3 volte! Funfest5Mission.TheBerryHuntingAdventure=L'avventurosa caccia alle Bacche! Funfest5Mission.TheFirstBerrySearch=La prima ricerca di Bacche! Funfest5Mission.TrainwithMartialArtists=Allenamento marziale! -Funfest5Mission.TreasureHuntingW=Caccia al tesoro! (W) -Funfest5Mission.WhatistheBestPriceB=Qual è il prezzo giusto? (B) -Funfest5Mission.WhatistheRealPriceW=Qual è il prezzo vero? (W) +Funfest5Mission.TreasureHuntingW=Caccia al tesoro! (B2) +Funfest5Mission.WhatistheBestPriceB=Qual è il prezzo giusto? (N2) +Funfest5Mission.WhatistheRealPriceW=Qual è il prezzo vero? (B2) Funfest5Mission.WhereareFlutteringHearts=Dove sono i cuori palpitanti? Funfest5Mission.WingsFallingontheDrawbridge=Le piume che cadono sul ponte GearCategory.Badges=Spille diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index 3f3d7fb96..fac8e3600 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -186,30 +186,30 @@ Funfest5Mission.BigHarvestofBerries=きのみ だいしゅうかく! Funfest5Mission.CollectBerries=きのみを あつめろ! Funfest5Mission.DoaGreatTradeUp=めざせ わらしべちょうじゃ! Funfest5Mission.EnjoyShopping=エンジョイ ショッピング! -Funfest5Mission.ExcitingTradingB=ドキドキ ぶつぶつこうかん! (B) -Funfest5Mission.ExhilaratingTradingW=ウキウキ ぶつぶつこうかん! (W) +Funfest5Mission.ExcitingTradingB=ドキドキ ぶつぶつこうかん! (B2) +Funfest5Mission.ExhilaratingTradingW=ウキウキ ぶつぶつこうかん! (W2) Funfest5Mission.FindAudino=タブンネを さがせ! Funfest5Mission.FindEmolga=エモンガを さがせ! Funfest5Mission.FindLostBoys=まいごの しょうねんを さがせ Funfest5Mission.FindLostItems=おとしものをさがせ! -Funfest5Mission.FindMysteriousOresB=なぞの こうせきを さがせ! (B) +Funfest5Mission.FindMysteriousOresB=なぞの こうせきを さがせ! (B2) Funfest5Mission.FindRustlingGrass=ゆれる くさむらを さがせ! Funfest5Mission.FindShards=かけらを さがせ! -Funfest5Mission.FindShiningOresW=ひかる こうせきを さがせ! (W) +Funfest5Mission.FindShiningOresW=ひかる こうせきを さがせ! (W2) Funfest5Mission.FindSteelix=ハガネールを さがせ! Funfest5Mission.FindTreasures=おたから はっくつ! Funfest5Mission.FishingCompetition=つり たいかい! -Funfest5Mission.ForgottenLostItemsB=わすれられた おとしもの (B) -Funfest5Mission.GetRichQuickB=いっかく せんきん! (B) +Funfest5Mission.ForgottenLostItemsB=わすれられた おとしもの (B2) +Funfest5Mission.GetRichQuickB=いっかく せんきん! (B2) Funfest5Mission.GivemetheItem=そのどうぐ ちょうだいな! Funfest5Mission.MemoryTraining=きおくりょく トレーニング! Funfest5Mission.MulchCollector=こやし コレクター! Funfest5Mission.MushroomsHideAndSeek=きのこの かくれんぼ! -Funfest5Mission.NoisyHiddenGrottoesB=ざわめきの かくしあな! (B) -Funfest5Mission.NotFoundLostItemsW=みつからない おとしもの (W) +Funfest5Mission.NoisyHiddenGrottoesB=ざわめきの かくしあな! (B2) +Funfest5Mission.NotFoundLostItemsW=みつからない おとしもの (W2) Funfest5Mission.PathtoanAce=エリートへの みちのり! Funfest5Mission.PushtheLimitofYourMemory=きおくの げんかいへ…… -Funfest5Mission.QuietHiddenGrottoesW=しずかなる かくしあな! (W) +Funfest5Mission.QuietHiddenGrottoesW=しずかなる かくしあな! (W2) Funfest5Mission.RingtheBell=かねを ならして…… Funfest5Mission.RockPaperScissorsCompetition=じゃんけん たいかい! Funfest5Mission.SearchFor3Pokemon=ポケモンサーチ3! @@ -222,9 +222,9 @@ Funfest5Mission.TheBellthatRings3Times=3かい なりひびくかね Funfest5Mission.TheBerryHuntingAdventure=きのみさがしで だいぼうけん Funfest5Mission.TheFirstBerrySearch=はじめての きのみ さがし! Funfest5Mission.TrainwithMartialArtists=かくとうかと しゅぎょう! -Funfest5Mission.TreasureHuntingW=トレジャー ハント! (W) -Funfest5Mission.WhatistheBestPriceB=りそうの おねだんは…? (B) -Funfest5Mission.WhatistheRealPriceW=ホントの おねだんは…? (W) +Funfest5Mission.TreasureHuntingW=トレジャー ハント! (W2) +Funfest5Mission.WhatistheBestPriceB=りそうの おねだんは…? (B2) +Funfest5Mission.WhatistheRealPriceW=ホントの おねだんは…? (W2) Funfest5Mission.WhereareFlutteringHearts=ときめく ハートは どこに? Funfest5Mission.WingsFallingontheDrawbridge=はねばしに まいおちるハネ GearCategory.Badges=バッジ @@ -1859,7 +1859,7 @@ SAV_Pokeathlon4.CHK_IsShiny=色違い SAV_Pokeathlon4.DGV_Jump=ジャンプ SAV_Pokeathlon4.DGV_Power=パワー SAV_Pokeathlon4.DGV_Skill=テクニック -SAV_Pokeathlon4.DGV_Species=種族 +SAV_Pokeathlon4.DGV_Species=ポケモン SAV_Pokeathlon4.DGV_Speed=スピード SAV_Pokeathlon4.DGV_Sprite=スプライト SAV_Pokeathlon4.DGV_Stamina=スタミナ diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index 451cf4d4a..70be0dc0a 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -48,7 +48,7 @@ SAV_Misc8b=기타 편집 도구 SAV_MysteryGiftDB=데이터베이스 SAV_OPower=O파워 편집 도구 SAV_Poffin8b=포핀 편집 도구 -SAV_Pokeathlon4=포켓슬론 +SAV_Pokeathlon4=포켓슬론 편집 도구 SAV_Pokebean=포켓콩 편집 도구 SAV_PokeBlockORAS=포켓몬스넥 편집 도구 SAV_Pokedex4=포켓몬 도감 편집 도구 @@ -186,30 +186,30 @@ Funfest5Mission.BigHarvestofBerries=나무열매 대량 수확! Funfest5Mission.CollectBerries=나무열매를 모으자! Funfest5Mission.DoaGreatTradeUp=교환만만세! Funfest5Mission.EnjoyShopping=엔조이 쇼핑! -Funfest5Mission.ExcitingTradingB=두근두근 물물교환! (B) -Funfest5Mission.ExhilaratingTradingW=콩닥콩닥 물물교환! (W) +Funfest5Mission.ExcitingTradingB=두근두근 물물교환! (B2) +Funfest5Mission.ExhilaratingTradingW=콩닥콩닥 물물교환! (W2) Funfest5Mission.FindAudino=다부니 찾아라! Funfest5Mission.FindEmolga=에몽가 찾아라! Funfest5Mission.FindLostBoys=미아가 된 소년을 찾아라 Funfest5Mission.FindLostItems=분실물을 찾아라! -Funfest5Mission.FindMysteriousOresB=수수께끼의 광석을 찾아라! (B) +Funfest5Mission.FindMysteriousOresB=수수께끼의 광석을 찾아라! (B2) Funfest5Mission.FindRustlingGrass=흔들리는 풀숲을 찾아라! Funfest5Mission.FindShards=조각을 찾아라! -Funfest5Mission.FindShiningOresW=빛나는 광석을 찾아라! (W) +Funfest5Mission.FindShiningOresW=빛나는 광석을 찾아라! (W2) Funfest5Mission.FindSteelix=강철톤 찾아라! Funfest5Mission.FindTreasures=보물 발굴! Funfest5Mission.FishingCompetition=낚시 대회! -Funfest5Mission.ForgottenLostItemsB=잊혀진 분실물 (B) -Funfest5Mission.GetRichQuickB=일확천금! (B) +Funfest5Mission.ForgottenLostItemsB=잊혀진 분실물 (B2) +Funfest5Mission.GetRichQuickB=일확천금! (B2) Funfest5Mission.GivemetheItem=그 도구를 줘! Funfest5Mission.MemoryTraining=기억력 트레이닝! Funfest5Mission.MulchCollector=비료 컬렉터! Funfest5Mission.MushroomsHideAndSeek=버섯의 숨바꼭질! Funfest5Mission.NoisyHiddenGrottoesB=술렁이는 은혈! -Funfest5Mission.NotFoundLostItemsW=발견되지 않는 분실물 (W) +Funfest5Mission.NotFoundLostItemsW=발견되지 않는 분실물 (W2) Funfest5Mission.PathtoanAce=엘리트를 향한 길! Funfest5Mission.PushtheLimitofYourMemory=기억의 한계로... -Funfest5Mission.QuietHiddenGrottoesW=조용한 은혈! (W) +Funfest5Mission.QuietHiddenGrottoesW=조용한 은혈! (W2) Funfest5Mission.RingtheBell=종을 울려서... Funfest5Mission.RockPaperScissorsCompetition=가위바위보 대회! Funfest5Mission.SearchFor3Pokemon=포켓몬서치3! @@ -222,9 +222,9 @@ Funfest5Mission.TheBellthatRings3Times=3번 울리는 종 Funfest5Mission.TheBerryHuntingAdventure=나무열매 찾기 대모험! Funfest5Mission.TheFirstBerrySearch=첫 나무열매 찾기 Funfest5Mission.TrainwithMartialArtists=격투가와 수행! -Funfest5Mission.TreasureHuntingW=보물찾기! (W) -Funfest5Mission.WhatistheBestPriceB=이상적인 가격은...? (B) -Funfest5Mission.WhatistheRealPriceW=진짜 가격은...? (W) +Funfest5Mission.TreasureHuntingW=보물찾기! (W2) +Funfest5Mission.WhatistheBestPriceB=이상적인 가격은...? (B2) +Funfest5Mission.WhatistheRealPriceW=진짜 가격은...? (W2) Funfest5Mission.WhereareFlutteringHearts=두근두근 하트는 어디에? Funfest5Mission.WingsFallingontheDrawbridge=도개교에 춤추듯 떨어지는 날개 GearCategory.Badges=Badges @@ -642,7 +642,7 @@ Main.mnu_SortLevelReverse=레벨 (내림차순) Main.mnu_SortMarks=마크 수 Main.mnu_SortName=포켓몬 종류 Main.mnu_SortOwner=어버이 -Main.mnu_SortParty=파티 +Main.mnu_SortParty=지닌 포켓몬 Main.mnu_SortPotential=IV 합계 Main.mnu_SortRandom=무작위 Main.mnu_SortRibbons=리본 수 @@ -669,7 +669,7 @@ Main.Tab_Met=만남 Main.Tab_Moves=기술 Main.Tab_Other=기타 Main.Tab_OTMisc=어버이/기타 -Main.Tab_PartyBattle=파티 +Main.Tab_PartyBattle=지닌 포켓몬 Main.Tab_SAV=세이브 Main.Tab_Stats=능력치 MedalRank5.Elite=엘리트 메달리스트 @@ -1855,11 +1855,11 @@ SAV_Pokeathlon4.B_Cancel=취소 SAV_Pokeathlon4.B_MedalsClearAll=모두 지우기 SAV_Pokeathlon4.B_MedalsGiveAll=모두 지급 SAV_Pokeathlon4.B_Save=저장 -SAV_Pokeathlon4.CHK_IsShiny=색이 다른 +SAV_Pokeathlon4.CHK_IsShiny=이로치 SAV_Pokeathlon4.DGV_Jump=점프 SAV_Pokeathlon4.DGV_Power=파워 SAV_Pokeathlon4.DGV_Skill=스킬 -SAV_Pokeathlon4.DGV_Species=종족 +SAV_Pokeathlon4.DGV_Species=종류 SAV_Pokeathlon4.DGV_Speed=스피드 SAV_Pokeathlon4.DGV_Sprite=스프라이트 SAV_Pokeathlon4.DGV_Stamina=스태미나 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index e205643e9..f2278b246 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -48,7 +48,7 @@ SAV_Misc8b=杂项编辑 SAV_MysteryGiftDB=礼物数据库 SAV_OPower=O-力量 SAV_Poffin8b=宝芬编辑 -SAV_Pokeathlon4=宝可全能竞技 +SAV_Pokeathlon4=宝可全能竞技赛编辑 SAV_Pokebean=宝可豆 SAV_PokeBlockORAS=宝可方块 SAV_Pokedex4=图鉴编辑 @@ -186,30 +186,30 @@ Funfest5Mission.BigHarvestofBerries=树果大丰收! Funfest5Mission.CollectBerries=收集树果! Funfest5Mission.DoaGreatTradeUp=进行一次重大交易 Funfest5Mission.EnjoyShopping=享受购物 -Funfest5Mission.ExcitingTradingB=激动人心的交易(黑) -Funfest5Mission.ExhilaratingTradingW=振奋人心的交易(白) +Funfest5Mission.ExcitingTradingB=激动人心的交易(黑2) +Funfest5Mission.ExhilaratingTradingW=振奋人心的交易(白2) Funfest5Mission.FindAudino=寻找差不多娃娃 Funfest5Mission.FindEmolga=寻找电飞鼠 Funfest5Mission.FindLostBoys=寻找失踪的男孩 Funfest5Mission.FindLostItems=寻找丢失的物品 -Funfest5Mission.FindMysteriousOresB=寻找神秘矿石(黑) +Funfest5Mission.FindMysteriousOresB=寻找神秘矿石(黑2) Funfest5Mission.FindRustlingGrass=寻找沙沙作响的草丛 Funfest5Mission.FindShards=寻找碎片 -Funfest5Mission.FindShiningOresW=寻找闪亮的矿石(白) +Funfest5Mission.FindShiningOresW=寻找闪亮的矿石(白2) Funfest5Mission.FindSteelix=寻找大钢蛇 Funfest5Mission.FindTreasures=寻找宝藏 Funfest5Mission.FishingCompetition=钓鱼比赛 -Funfest5Mission.ForgottenLostItemsB=被遗忘的丢失物品(黑) -Funfest5Mission.GetRichQuickB=快速致富(黑) +Funfest5Mission.ForgottenLostItemsB=被遗忘的丢失物品(黑2) +Funfest5Mission.GetRichQuickB=快速致富(黑2) Funfest5Mission.GivemetheItem=把物品给我 Funfest5Mission.MemoryTraining=记忆训练 Funfest5Mission.MulchCollector=肥料收集者 Funfest5Mission.MushroomsHideAndSeek=蘑菇捉迷藏 -Funfest5Mission.NoisyHiddenGrottoesB=嘈杂的隐藏洞穴(黑) -Funfest5Mission.NotFoundLostItemsW=未找到丢失物品(白) +Funfest5Mission.NoisyHiddenGrottoesB=嘈杂的隐藏洞穴(黑2) +Funfest5Mission.NotFoundLostItemsW=未找到丢失物品(白2) Funfest5Mission.PathtoanAce=成为高手之路 Funfest5Mission.PushtheLimitofYourMemory=挑战你的记忆极限 -Funfest5Mission.QuietHiddenGrottoesW=安静的隐藏洞穴(白) +Funfest5Mission.QuietHiddenGrottoesW=安静的隐藏洞穴(白2) Funfest5Mission.RingtheBell=敲响钟声 Funfest5Mission.RockPaperScissorsCompetition=石头剪刀布比赛 Funfest5Mission.SearchFor3Pokemon=寻找3只宝可梦 @@ -222,9 +222,9 @@ Funfest5Mission.TheBellthatRings3Times=三次敲响的钟 Funfest5Mission.TheBerryHuntingAdventure=浆果狩猎冒险 Funfest5Mission.TheFirstBerrySearch=第一次找浆果 Funfest5Mission.TrainwithMartialArtists=与武术家训练 -Funfest5Mission.TreasureHuntingW=寻宝 (W) -Funfest5Mission.WhatistheBestPriceB=最佳价格是什么 (B) -Funfest5Mission.WhatistheRealPriceW=实际价格是多少 (W) +Funfest5Mission.TreasureHuntingW=寻宝 (白2) +Funfest5Mission.WhatistheBestPriceB=最佳价格是什么 (黑2) +Funfest5Mission.WhatistheRealPriceW=实际价格是多少 (白2) Funfest5Mission.WhereareFlutteringHearts=翩翩飞舞的心在哪里 Funfest5Mission.WingsFallingontheDrawbridge=翼落吊桥 GearCategory.Badges=徽章 @@ -1686,7 +1686,7 @@ SAV_Misc4.L_CastleRank01=回复 / 道具 / 信息 SAV_Misc4.L_Coin=代币: SAV_Misc4.L_CurrentApp=当前App SAV_Misc4.L_CurrentMap=当前地图 -SAV_Misc4.L_PokeathlonPoints=宝可梦马拉松积分: +SAV_Misc4.L_PokeathlonPoints=全能竞技赛点数: SAV_Misc4.L_Record16=记录: SAV_Misc4.L_Record16V=数值: SAV_Misc4.L_Record32=记录: diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index 6777456d8..9a6280d5b 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -48,7 +48,7 @@ SAV_Misc8b=訓練家資料雜項編輯 SAV_MysteryGiftDB=神秘禮物資料庫 SAV_OPower=O-力量編輯器 SAV_Poffin8b=寶芬編輯器 -SAV_Pokeathlon4=寶可全能競技 +SAV_Pokeathlon4=寶可全能競技賽編輯器 SAV_Pokebean=寶可豆編輯器 SAV_PokeBlockORAS=寶可方塊編輯器 SAV_Pokedex4=圖鑒編輯器 @@ -186,30 +186,30 @@ Funfest5Mission.BigHarvestofBerries=樹果大豐收! Funfest5Mission.CollectBerries=收集樹果! Funfest5Mission.DoaGreatTradeUp=進行一次重大交易 Funfest5Mission.EnjoyShopping=享受購物 -Funfest5Mission.ExcitingTradingB=激動人心的交易(黑) -Funfest5Mission.ExhilaratingTradingW=振奮人心的交易(白) +Funfest5Mission.ExcitingTradingB=激動人心的交易(黑2) +Funfest5Mission.ExhilaratingTradingW=振奮人心的交易(白2) Funfest5Mission.FindAudino=尋找差不多娃娃 Funfest5Mission.FindEmolga=尋找電飛鼠 Funfest5Mission.FindLostBoys=尋找失蹤的男孩 Funfest5Mission.FindLostItems=尋找丟失的物品 -Funfest5Mission.FindMysteriousOresB=尋找神秘礦石(黑) +Funfest5Mission.FindMysteriousOresB=尋找神秘礦石(黑2) Funfest5Mission.FindRustlingGrass=尋找沙沙作響的草叢 Funfest5Mission.FindShards=尋找碎片 -Funfest5Mission.FindShiningOresW=尋找閃亮的礦石(白) +Funfest5Mission.FindShiningOresW=尋找閃亮的礦石(白2) Funfest5Mission.FindSteelix=尋找大鋼蛇 Funfest5Mission.FindTreasures=尋找寶藏 Funfest5Mission.FishingCompetition=釣魚比賽 -Funfest5Mission.ForgottenLostItemsB=被遺忘的丟失物品(黑) -Funfest5Mission.GetRichQuickB=快速致富(黑) +Funfest5Mission.ForgottenLostItemsB=被遺忘的丟失物品(黑2) +Funfest5Mission.GetRichQuickB=快速致富(黑2) Funfest5Mission.GivemetheItem=把物品給我 Funfest5Mission.MemoryTraining=記憶訓練 Funfest5Mission.MulchCollector=肥料收集者 Funfest5Mission.MushroomsHideAndSeek=蘑菇捉迷藏 -Funfest5Mission.NoisyHiddenGrottoesB=嘈雜的隱藏洞穴(黑) -Funfest5Mission.NotFoundLostItemsW=未找到丟失物品(白) +Funfest5Mission.NoisyHiddenGrottoesB=嘈雜的隱藏洞穴(黑2) +Funfest5Mission.NotFoundLostItemsW=未找到丟失物品(白2) Funfest5Mission.PathtoanAce=成為高手之路 Funfest5Mission.PushtheLimitofYourMemory=挑戰你的記憶極限 -Funfest5Mission.QuietHiddenGrottoesW=安靜的隱藏洞穴(白) +Funfest5Mission.QuietHiddenGrottoesW=安靜的隱藏洞穴(白2) Funfest5Mission.RingtheBell=敲響鐘聲 Funfest5Mission.RockPaperScissorsCompetition=石頭剪刀布比賽 Funfest5Mission.SearchFor3Pokemon=尋找3隻寶可夢 @@ -222,9 +222,9 @@ Funfest5Mission.TheBellthatRings3Times=三次敲響的鐘 Funfest5Mission.TheBerryHuntingAdventure=漿果狩獵冒險 Funfest5Mission.TheFirstBerrySearch=第一次找漿果 Funfest5Mission.TrainwithMartialArtists=與武術家訓練 -Funfest5Mission.TreasureHuntingW=尋寶(W) -Funfest5Mission.WhatistheBestPriceB=最佳價格是什麼(B) -Funfest5Mission.WhatistheRealPriceW=實際價格是多少(W) +Funfest5Mission.TreasureHuntingW=尋寶(白2) +Funfest5Mission.WhatistheBestPriceB=最佳價格是什麼(黑2) +Funfest5Mission.WhatistheRealPriceW=實際價格是多少(白2) Funfest5Mission.WhereareFlutteringHearts=翩翩飛舞的心在哪裡 Funfest5Mission.WingsFallingontheDrawbridge=翼落吊橋 GearCategory.Badges=徽章 @@ -1686,7 +1686,7 @@ SAV_Misc4.L_CastleRank01=恢復 / 道具 / 信息 SAV_Misc4.L_Coin=代幣: SAV_Misc4.L_CurrentApp=當前App SAV_Misc4.L_CurrentMap=當前地圖 -SAV_Misc4.L_PokeathlonPoints=寶可夢馬拉松積分: +SAV_Misc4.L_PokeathlonPoints=全能競技賽點數: SAV_Misc4.L_Record16=記錄: SAV_Misc4.L_Record16V=數值: SAV_Misc4.L_Record32=記錄: From 3aeba927ab51167b08bc72f205c2133ed8051b79 Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 29 May 2026 09:36:00 -0500 Subject: [PATCH 51/81] Misc tweaks --- .../Verifiers/Ribbons/RibbonStrings.cs | 2 +- PKHeX.Core/Saves/Pokeathlon4.cs | 2 +- PKHeX.Core/Saves/SAV4.cs | 2 +- .../Saves/Substructures/Gen3/Roamer3.cs | 2 +- .../Saves/Substructures/Gen4/Chatter4.cs | 6 +- .../Substructures/Gen4/PBR/BattlePass.cs | 2 +- .../Saves/Substructures/Gen4/Record4.cs | 61 ++++++++++++++++++- .../Saves/Substructures/Gen4/Roamer4.cs | 2 +- .../Saves/Substructures/Gen5/Roamer5.cs | 2 +- .../Gen8/BS/FieldObjectSave8b.cs | 4 +- .../Subforms/Save Editors/Gen3/SAV_Roamer3.cs | 4 +- .../Subforms/Save Editors/SAV_Inventory.cs | 3 +- 12 files changed, 76 insertions(+), 16 deletions(-) diff --git a/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonStrings.cs b/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonStrings.cs index ffb46a0d5..66e156b77 100644 --- a/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonStrings.cs +++ b/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonStrings.cs @@ -7,7 +7,7 @@ namespace PKHeX.Core; /// /// String Translation Utility /// -public class RibbonStrings +public sealed class RibbonStrings { private readonly Dictionary RibbonNames = []; diff --git a/PKHeX.Core/Saves/Pokeathlon4.cs b/PKHeX.Core/Saves/Pokeathlon4.cs index e59ce3114..bd3e347b8 100644 --- a/PKHeX.Core/Saves/Pokeathlon4.cs +++ b/PKHeX.Core/Saves/Pokeathlon4.cs @@ -7,7 +7,7 @@ namespace PKHeX.Core; /// /// Manages the Pokeathlon Data for /// -public class Pokeathlon4(Memory Raw) // 0xD9D4 within SAV4HGSS +public sealed class Pokeathlon4(Memory Raw) // 0xD9D4 within SAV4HGSS { public const int SIZE = 0xB80; diff --git a/PKHeX.Core/Saves/SAV4.cs b/PKHeX.Core/Saves/SAV4.cs index 8619ad110..591efd790 100644 --- a/PKHeX.Core/Saves/SAV4.cs +++ b/PKHeX.Core/Saves/SAV4.cs @@ -237,7 +237,7 @@ private int GetActiveExtraBlock(BlockInfo4 block) private int OFS_Backdrop => FashionCase + 0x28; protected int OFS_Chatter = int.MinValue; - public Chatter4 Chatter => new(this, GeneralBuffer[OFS_Chatter..]); + public Chatter4 Chatter => new(GeneralBuffer.Slice(OFS_Chatter, Chatter4.SIZE)); protected int OFS_Record = int.MinValue; public Record4 Records => new(this, GeneralBuffer.Slice(OFS_Record, Record4.GetSize(this))); diff --git a/PKHeX.Core/Saves/Substructures/Gen3/Roamer3.cs b/PKHeX.Core/Saves/Substructures/Gen3/Roamer3.cs index f9c245390..4d0a43cb6 100644 --- a/PKHeX.Core/Saves/Substructures/Gen3/Roamer3.cs +++ b/PKHeX.Core/Saves/Substructures/Gen3/Roamer3.cs @@ -50,7 +50,7 @@ public byte CurrentLevel public byte ContestSmart { get => Data[0x11]; set => Data[0x11] = value; } public byte ContestTough { get => Data[0x12]; set => Data[0x12] = value; } public byte ContestSheen { get => 0; set { } } - public bool Active { get => Data[0x13] == 1; set => Data[0x13] = value ? (byte)1 : (byte)0; } + public bool IsActive { get => Data[0x13] == 1; set => Data[0x13] = value ? (byte)1 : (byte)0; } // Derived Properties public int IV_HP { get => (int)(IV32 >> 00) & 0x1F; set => IV32 = (IV32 & ~(0x1Fu << 00)) | (uint)((value > 31 ? 31 : value) << 00); } diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Chatter4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Chatter4.cs index b12ff1bd4..444935cc4 100644 --- a/PKHeX.Core/Saves/Substructures/Gen4/Chatter4.cs +++ b/PKHeX.Core/Saves/Substructures/Gen4/Chatter4.cs @@ -6,8 +6,12 @@ namespace PKHeX.Core; /// /// Generation 4 Chatter Recording /// -public sealed class Chatter4(SAV4 SAV, Memory raw) : SaveBlock(SAV, raw), IChatter +public sealed class Chatter4(Memory Raw) : IChatter { + public const int SIZE = sizeof(uint) + IChatter.SIZE_PCM; + + private Span Data => Raw.Span; + public bool Initialized { get => ReadUInt32LittleEndian(Data) == 1u; diff --git a/PKHeX.Core/Saves/Substructures/Gen4/PBR/BattlePass.cs b/PKHeX.Core/Saves/Substructures/Gen4/PBR/BattlePass.cs index ea11bafcc..96abc73c0 100644 --- a/PKHeX.Core/Saves/Substructures/Gen4/PBR/BattlePass.cs +++ b/PKHeX.Core/Saves/Substructures/Gen4/PBR/BattlePass.cs @@ -7,7 +7,7 @@ namespace PKHeX.Core; /// /// Pokémon Battle Revolution Battle Pass Structure /// -public class BattlePass(Memory raw) +public sealed class BattlePass(Memory raw) { public const int Size = 0x6EC; public const int PokeSize = PokeCrypto.SIZE_4STORED + 4; diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Record4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Record4.cs index 9c48627d2..bd75bfc5e 100644 --- a/PKHeX.Core/Saves/Substructures/Gen4/Record4.cs +++ b/PKHeX.Core/Saves/Substructures/Gen4/Record4.cs @@ -240,10 +240,65 @@ public enum Record4PtIndex public enum Record4HGSSIndex { // u32 - ApricornGet = 1, + StepsWalked = 0, + StepsBiked = 1, Score = 2, - BadgeGet = 22, - BattlePoints = 69, + + BerriesPlanted = 5, + + WildEncounters = 8, + TrainerBattles = 9, + Caught = 10, + Fished = 11, + EggsHatched = 12, + PokedexProgress = 13, + + LocalLinkTrades = 20, + LocalLinkBattles = 21, + LocalLinkBattleWins = 22, + LocalLinkBattleLosses = 23, + LocalLinkBattleDraws = 24, // and forfeits + WifiTrades = 25, + WifiBattles = 26, + WifiBattleWins = 27, + WifiBattleLosses = 28, + WifiBattleDraws = 29, // and forfeits + + BattleTowerWins = 30, + + CurrencySpent = 36, + DepositedDaycare = 41, + OpponentsFainted = 42, + + MailWritten = 46, + + PremierBallsEarned = 51, + + FrontierParticipations = 59, + + BattlePointsReceived = 69, + BattlePointsSpent = 70, + + LeagueWins = 74, + SplashUsed = 77, + + SelfDestructUsed = 79, + ExplosionUsed = 80, + + LocalContestEntries = 91, + CommContestEntries = 92, + LocalContestWins = 93, + CommContestWins = 94, + RibbonsEarned = 95, + IneffectiveMovesUsed = 96, + PlayerMonFainted = 97, + AlliesDamaged = 98, + RunFailures = 99, + WildPokemonFled = 100, + FishGotAway = 101, + TrainerCardsSigned = 115, + FossilsRevived = 116, + EggsSpun = 120, // u16 FirstU16 = Record32HGSS, diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Roamer4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Roamer4.cs index 6aa228ffd..1bac05919 100644 --- a/PKHeX.Core/Saves/Substructures/Gen4/Roamer4.cs +++ b/PKHeX.Core/Saves/Substructures/Gen4/Roamer4.cs @@ -23,7 +23,7 @@ public sealed class Roamer4(Memory Raw) public ushort Stat_HPCurrent { get => ReadUInt16LittleEndian(Data[0xE..]); set => WriteUInt16LittleEndian(Data[0xE..], value); } public byte Level { get => Data[0x10]; set => Data[0x10] = value; } public byte Status { get => Data[0x11]; set => Data[0x11] = value; } - public bool Active { get => Data[0x12] != 0; set => Data[0x12] = (byte)(value ? 1 : 0); } + public bool IsActive { get => Data[0x12] != 0; set => Data[0x12] = (byte)(value ? 1 : 0); } // 0x13 alignment, unused // Derived Properties diff --git a/PKHeX.Core/Saves/Substructures/Gen5/Roamer5.cs b/PKHeX.Core/Saves/Substructures/Gen5/Roamer5.cs index 356be0669..dafeff671 100644 --- a/PKHeX.Core/Saves/Substructures/Gen5/Roamer5.cs +++ b/PKHeX.Core/Saves/Substructures/Gen5/Roamer5.cs @@ -23,7 +23,7 @@ public sealed class Roamer5(Memory raw) public ushort Stat_HPCurrent { get => ReadUInt16LittleEndian(Data[0x0E..]); set => WriteUInt16LittleEndian(Data[0x0E..], value); } public byte Level { get => Data[0x10]; set => Data[0x10] = value; } public byte Status { get => Data[0x11]; set => Data[0x11] = value; } - public bool Active { get => Data[0x12] != 0; set => Data[0x12] = (byte)(value ? 1 : 0); } + public bool IsActive { get => Data[0x12] != 0; set => Data[0x12] = (byte)(value ? 1 : 0); } public byte Unk13 { get => Data[0x13]; set => Data[0x13] = value; } // likely just alignment // Derived Properties diff --git a/PKHeX.Core/Saves/Substructures/Gen8/BS/FieldObjectSave8b.cs b/PKHeX.Core/Saves/Substructures/Gen8/BS/FieldObjectSave8b.cs index 8265e62e2..1a2918c8c 100644 --- a/PKHeX.Core/Saves/Substructures/Gen8/BS/FieldObjectSave8b.cs +++ b/PKHeX.Core/Saves/Substructures/Gen8/BS/FieldObjectSave8b.cs @@ -43,7 +43,7 @@ public sealed class FieldObject8b private readonly Memory Raw = new byte[SIZE]; private Span Data => Raw.Span; - public override string ToString() => $"{NameHash:X8} @ ({GridX:000},{GridY:000}) - {(Active ? "✓" : "✕")}"; + public override string ToString() => $"{NameHash:X8} @ ({GridX:000},{GridY:000}) - {(IsActive ? "✓" : "✕")}"; public FieldObject8b(ReadOnlySpan data) => data[..SIZE].CopyTo(Data); @@ -58,7 +58,7 @@ public sealed class FieldObject8b public int GridY { get => ReadInt32LittleEndian(Data[0x0C..]); set => WriteInt32LittleEndian(Data[0x0C..], value); } public int Height { get => ReadInt32LittleEndian(Data[0x10..]); set => WriteInt32LittleEndian(Data[0x10..], value); } public int Angle { get => ReadInt32LittleEndian(Data[0x14..]); set => WriteInt32LittleEndian(Data[0x14..], value); } - public bool Active { get => ReadInt32LittleEndian(Data[0x18..]) == 1; set => WriteUInt32LittleEndian(Data[0x18..], value ? 1u : 0u); } + public bool IsActive{ get => ReadInt32LittleEndian(Data[0x18..]) == 1; set => WriteUInt32LittleEndian(Data[0x18..], value ? 1u : 0u); } public int MoveCode { get => ReadInt32LittleEndian(Data[0x1C..]); set => WriteInt32LittleEndian(Data[0x1C..], value); } public int DirHead { get => ReadInt32LittleEndian(Data[0x20..]); set => WriteInt32LittleEndian(Data[0x20..], value); } public int MvParam0 { get => ReadInt32LittleEndian(Data[0x24..]); set => WriteInt32LittleEndian(Data[0x24..], value); } diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen3/SAV_Roamer3.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen3/SAV_Roamer3.cs index e19dce3cb..7a7b01e2d 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen3/SAV_Roamer3.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen3/SAV_Roamer3.cs @@ -36,7 +36,7 @@ private void LoadData() TB_SPAIV.Text = Reader.IV_SPA.ToString(); TB_SPDIV.Text = Reader.IV_SPD.ToString(); - CHK_Active.Checked = Reader.Active; + CHK_Active.Checked = Reader.IsActive; NUD_Level.Value = Math.Min(Reader.CurrentLevel, NUD_Level.Maximum); NUD_HP.Value = Math.Min(Reader.HP_Current, NUD_HP.Maximum); } @@ -54,7 +54,7 @@ private void SaveData() Util.ToInt32(TB_SPAIV.Text), Util.ToInt32(TB_SPDIV.Text), ]); - Reader.Active = CHK_Active.Checked; + Reader.IsActive = CHK_Active.Checked; Reader.CurrentLevel = (byte)NUD_Level.Value; Reader.HP_Current = (ushort)NUD_HP.Value; } diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs index 91479e8fa..c2482ec9d 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs @@ -298,7 +298,8 @@ private static void Dgv_EditingControlShowing(object? sender, DataGridViewEditin if (dgv.CurrentCell?.OwningColumn is not DataGridViewComboBoxColumn) return; - cb.DroppedDown = true; + // let the row reference update, invoke via DataGrid rather than directly call + dgv.BeginInvoke((MethodInvoker)(() => cb.DroppedDown = true)); } private void SetBag(DataGridView dgv, InventoryPouch pouch) From 0428865d03addacc1a35a9953cfe7ef651346b33 Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 29 May 2026 23:50:04 -0500 Subject: [PATCH 52/81] Gen4: relax Korean<->International legality Closes #4811 Follow-up needed (or never): * OT names: any more? * OT names: dependent on OT Version/Gender? Dependent on uploader Version/Gender? * Trigger: on any char being within the Korean chartable span? * Nicknames: wiped if triggered? * Trash bytes: if nickname wiped, does it clear correctly? 5-char nickname on Muk would leave 1 char as trash. Sad this was never common knowledge back in the day. Add some utility methods to quickly check if sanitization should apply. --- PKHeX.Core/Legality/LegalityAnalysis.cs | 23 +++- .../Localization/LegalityCheckLocalization.cs | 7 +- .../LegalityCheckResultCodeExtensions.cs | 6 +- .../Structures/LegalityCheckResultCode.cs | 8 +- .../Legality/Verifiers/LanguageVerifier.cs | 74 ++++++----- .../Verifiers/Misc/Gen4GlobalTradeRules.cs | 56 +++++++++ .../Legality/Verifiers/NicknameVerifier.cs | 22 +++- .../Legality/Verifiers/TrainerNameVerifier.cs | 2 +- .../PKM/Strings/StringConverter4Util.cs | 56 ++++++++- .../localize/legality/legality_de.json | 6 +- .../localize/legality/legality_en.json | 6 +- .../localize/legality/legality_es-419.json | 6 +- .../localize/legality/legality_es.json | 6 +- .../localize/legality/legality_fr.json | 6 +- .../localize/legality/legality_it.json | 6 +- .../localize/legality/legality_ja.json | 6 +- .../localize/legality/legality_ko.json | 6 +- .../localize/legality/legality_zh-hans.json | 6 +- .../localize/legality/legality_zh-hant.json | 6 +- PKHeX.WinForms/Resources/text/lang_de.txt | 1 + PKHeX.WinForms/Resources/text/lang_en.txt | 1 + PKHeX.WinForms/Resources/text/lang_es-419.txt | 1 + PKHeX.WinForms/Resources/text/lang_es.txt | 1 + PKHeX.WinForms/Resources/text/lang_fr.txt | 1 + PKHeX.WinForms/Resources/text/lang_it.txt | 1 + PKHeX.WinForms/Resources/text/lang_ja.txt | 117 +++++++++--------- PKHeX.WinForms/Resources/text/lang_ko.txt | 1 + .../Resources/text/lang_zh-Hans.txt | 1 + .../Resources/text/lang_zh-Hant.txt | 1 + 29 files changed, 328 insertions(+), 112 deletions(-) create mode 100644 PKHeX.Core/Legality/Verifiers/Misc/Gen4GlobalTradeRules.cs diff --git a/PKHeX.Core/Legality/LegalityAnalysis.cs b/PKHeX.Core/Legality/LegalityAnalysis.cs index 88ff74e78..b7f5ca853 100644 --- a/PKHeX.Core/Legality/LegalityAnalysis.cs +++ b/PKHeX.Core/Legality/LegalityAnalysis.cs @@ -26,6 +26,27 @@ public sealed class LegalityAnalysis /// public IReadOnlyList Results => Parse; + public bool HasResult(LegalityCheckResultCode code) + { + foreach (var result in Parse) + { + if (result.Result == code) + return true; + } + return false; + } + + public int IndexOfResult(LegalityCheckResultCode code) + { + for (var i = 0; i < Parse.Count; i++) + { + var result = Parse[i]; + if (result.Result == code) + return i; + } + return -1; + } + /// /// Matched encounter data for the . /// @@ -294,8 +315,8 @@ private void UpdateVCTransferInfo() private void UpdateChecks() { PIDEC.Verify(this); - Nickname.Verify(this); LanguageIndex.Verify(this); + Nickname.Verify(this); Trainer.Verify(this); TrainerID.Verify(this); IVs.Verify(this); diff --git a/PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs b/PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs index bd76ea186..6e00d2aff 100644 --- a/PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs +++ b/PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs @@ -203,6 +203,12 @@ public sealed class LegalityCheckLocalization public string G4PartnerMoodZero { get; init; } = "Mood stat value should be zero when not in the player's party."; public string G4ShinyLeafBitsInvalid { get; init; } = "Shiny Leaf/Crown bits are not valid."; public string G4ShinyLeafBitsEgg { get; init; } = "Eggs cannot have Shiny Leaf/Crown."; + public string GTSTrainerSanitizedExpected { get; init; } = "Expected a GTS sanitized trainer name."; + public string GTSTrainerSanitized { get; init; } = "Trainer name matches a GTS sanitized trainer name."; + public string GTSTradedKoreanInternational { get; init; } = "Traded between Korean and International games via GTS."; + public string GTSDisallowedClassicRibbon { get; init; } = "Cannot trade Classic Ribbon in the Gen 4 GTS between Korean and International games."; + public string GTSDisallowedTradedEgg { get; init; } = "Cannot trade eggs in the Gen 4 GTS between Korean and International games."; + public string G5IVAll30 { get; init; } = "All IVs of N's Pokémon should be 30."; public string G5PIDShinyGrotto { get; init; } = "Hidden Grotto captures cannot be shiny."; public string G5SparkleInvalid { get; init; } = "Special In-game N's Sparkle flag should not be checked."; @@ -403,7 +409,6 @@ public sealed class LegalityCheckLocalization public string TransferHTMismatchName { get; init; } = "Handling trainer does not match the expected trainer name."; public string TransferHTMismatchGender { get; init; } = "Handling trainer does not match the expected trainer gender."; public string TransferHTMismatchLanguage { get; init; } = "Handling trainer does not match the expected trainer language."; - public string TransferKoreanGen4 { get; init; } = "Korean Generation 4 games cannot interact with International Generation 4 games."; public string TransferMet { get; init; } = "Invalid Met Location, expected Poké Transfer or Crown."; public string TransferNotPossible { get; init; } = "Unable to transfer into current format from origin format."; public string TransferMetLocation { get; init; } = "Invalid Transfer Met Location."; diff --git a/PKHeX.Core/Legality/Localization/LegalityCheckResultCodeExtensions.cs b/PKHeX.Core/Legality/Localization/LegalityCheckResultCodeExtensions.cs index f577c052a..dd7308edc 100644 --- a/PKHeX.Core/Legality/Localization/LegalityCheckResultCodeExtensions.cs +++ b/PKHeX.Core/Legality/Localization/LegalityCheckResultCodeExtensions.cs @@ -255,6 +255,11 @@ public static class LegalityCheckResultCodeExtensions GeoBadOrder_0 => localization.GeoBadOrder_0, GeoNoCountry_0 => localization.GeoNoCountry_0, GeoNoRegion_0 => localization.GeoNoRegion_0, + GTSTrainerSanitized => localization.GTSTrainerSanitized, + GTSTradedKoreanInternational => localization.GTSTradedKoreanInternational, + GTSTrainerSanitizedExpected => localization.GTSTrainerSanitizedExpected, + GTSDisallowedClassicRibbon => localization.GTSDisallowedClassicRibbon, + GTSDisallowedTradedEgg => localization.GTSDisallowedTradedEgg, HintEvolvesToSpecies_0 => localization.HintEvolvesToSpecies_0, HintEvolvesToRareForm_0 => localization.HintEvolvesToRareForm_0, ItemEgg => localization.ItemEgg, @@ -398,7 +403,6 @@ public static class LegalityCheckResultCodeExtensions TransferMetLocation => localization.TransferMetLocation, TransferNature => localization.TransferNature, TransferObedienceLevel => localization.TransferObedienceLevel, - TransferKoreanGen4 => localization.TransferKoreanGen4, TransferEncryptGen6BitFlip => localization.TransferPIDECBitFlip, TransferEncryptGen6Equals => localization.TransferPIDECEquals, TransferEncryptGen6Xor => localization.TransferPIDECXor, diff --git a/PKHeX.Core/Legality/Structures/LegalityCheckResultCode.cs b/PKHeX.Core/Legality/Structures/LegalityCheckResultCode.cs index e9ee76017..0263ed74b 100644 --- a/PKHeX.Core/Legality/Structures/LegalityCheckResultCode.cs +++ b/PKHeX.Core/Legality/Structures/LegalityCheckResultCode.cs @@ -199,6 +199,13 @@ public enum LegalityCheckResultCode : ushort GeoMemoryMissing, GeoNoCountryHT, + // GTS + GTSTrainerSanitized, // valid, tag + GTSTradedKoreanInternational, // valid + GTSTrainerSanitizedExpected, + GTSDisallowedClassicRibbon, + GTSDisallowedTradedEgg, + // Hints // Hyper Training @@ -350,7 +357,6 @@ public enum LegalityCheckResultCode : ushort TransferMetLocation, TransferNature, TransferObedienceLevel, - TransferKoreanGen4, TransferEncryptGen6BitFlip, TransferEncryptGen6Equals, TransferEncryptGen6Xor, diff --git a/PKHeX.Core/Legality/Verifiers/LanguageVerifier.cs b/PKHeX.Core/Legality/Verifiers/LanguageVerifier.cs index b74a69893..61d9d589c 100644 --- a/PKHeX.Core/Legality/Verifiers/LanguageVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/LanguageVerifier.cs @@ -24,14 +24,9 @@ public override void Verify(LegalityAnalysis data) return; } - // Korean Gen4 games can not trade with other Gen4 languages, but can use Pal Park with any Gen3 game/language. - if (pk.Format == 4 && enc.Generation == 4 && !IsValidGen4Korean(currentLanguage) - && enc is not EncounterTrade4PID { IsLanguageSwap: true } // ger magikarp / eng pikachu - ) - { - data.AddLine(GetInvalid(TransferKoreanGen4)); - return; - } + // Check for GTS trade sanitization. + if (pk.Format >= 4) + CheckGTS(data, pk, currentLanguage, originalGeneration); if (originalGeneration <= 2) { @@ -45,6 +40,47 @@ public override void Verify(LegalityAnalysis data) } } + private void CheckGTS(LegalityAnalysis data, PKM pk, LanguageID currentLanguage, byte originalGeneration) + { + bool possiblyRomanizedG4 = false; + if (originalGeneration is 4 && currentLanguage is Korean && !pk.IsEgg) + { + // All OT names are half-width already, so they could have been manually entered. + possiblyRomanizedG4 = Gen4GlobalTradeRules.IsRomanizedKoreanTrainerName(pk); + // If not nicknamed, the sanitization also applies to the nickname text. + // Check that separately, there is some nuance with trade-backs. + if (possiblyRomanizedG4) // apply a tag to indicate to the checker, and also downstream checks. + data.AddLine(GetValid(GTSTrainerSanitized)); // acts as an info tag. + } + + if (pk.Format == 4) + { + // Any Gen4 trainer can send/receive Korean language, but can't otherwise directly trade across the language barrier. + // Check for lockout of Korean GTS trades. + var tr = ParseSettings.ActiveTrainer; + + // Check if it must have been traded across the GTS to its current residence. + if (tr is null || !Gen4GlobalTradeRules.IsRequiredGTS(tr, currentLanguage)) + return; + + // Check if it actually can be traded across the GTS. + var enc = data.EncounterMatch; + if (enc is EncounterTrade4PID { IsLanguageSwap: true }) + return; // Can originate in Korean games and have international Language ID without traversing the GTS. + + // Eggs and Classic Ribbon cannot be traded on GTS. + // If it must have been traded via GTS, it must have been sanitized if Korean. + if (pk.IsEgg) + data.AddLine(GetInvalid(GTSDisallowedTradedEgg)); + else if (enc is IRibbonSetEvent4 { RibbonClassic: true }) + data.AddLine(GetInvalid(GTSDisallowedClassicRibbon)); + else if (currentLanguage == Korean && !possiblyRomanizedG4) + data.AddLine(GetInvalid(GTSTrainerSanitizedExpected)); + else // OK + data.AddLine(GetValid(GTSTradedKoreanInternational)); + } + } + public static bool IsValidLanguageID(LanguageID currentLanguage, LanguageID maxLanguageID, PKM pk, IEncounterTemplate enc) { if (currentLanguage == UNUSED_6) @@ -58,26 +94,4 @@ public static bool IsValidLanguageID(LanguageID currentLanguage, LanguageID maxL return true; // Language is possible } - - /// - /// Check if the can exist in the Generation 4 save file. - /// - /// - /// Korean Gen4 games can not trade with other Gen4 languages, but can use Pal Park with any Gen3 game/language. - /// Anything with Gen4 origin cannot exist in the other language save file. - /// - public static bool IsValidGen4Korean(LanguageID pkmLanguage) - { - if (ParseSettings.ActiveTrainer is not SAV4 tr) - return true; // ignore - return IsValidGen4Korean(pkmLanguage, tr); - } - - /// - public static bool IsValidGen4Korean(LanguageID pkmLanguage, SAV4 tr) - { - bool savKOR = (LanguageID)tr.Language == Korean; - bool pkmKOR = pkmLanguage == Korean; - return savKOR == pkmKOR; - } } diff --git a/PKHeX.Core/Legality/Verifiers/Misc/Gen4GlobalTradeRules.cs b/PKHeX.Core/Legality/Verifiers/Misc/Gen4GlobalTradeRules.cs new file mode 100644 index 000000000..54ea94200 --- /dev/null +++ b/PKHeX.Core/Legality/Verifiers/Misc/Gen4GlobalTradeRules.cs @@ -0,0 +1,56 @@ +using System; + +namespace PKHeX.Core; + +public static class Gen4GlobalTradeRules +{ + /// + /// Checks if the GTS is required to be used for the entity with to reach . + /// + public static bool IsRequiredGTS(ITrainerInfo tr, LanguageID currentLanguage) + { + if (tr.Generation != 4) + return false; // only applies to Gen4 + + // Cannot trade only if the trainer is Korean and the game language is not Korean. + return (LanguageID)tr.Language == LanguageID.Korean && currentLanguage != LanguageID.Korean; + } + + /// + public static bool IsRomanizedKoreanTrainerName(PKM pk) + { + // Check for GTS name sanitization of Korean GTS trades to International games. + Span trainer = stackalloc char[pk.TrashCharCountTrainer]; + int len = pk.LoadString(pk.OriginalTrainerTrash, trainer); + trainer = trainer[..len]; + + return IsRomanizedKoreanTrainerName(trainer); + } + + /// + /// Although Korean and non-Korean versions of the Generation IV games cannot trade with each other directly via the Union Room or Wi-Fi Club, trades could be conducted via the GTS. + /// However, because non-Korean games do not support Korean characters, the data of Pokémon originating from a Korean game are modified. + /// + /// Current (final) trainer name of the entity. + /// if the trainer name is one of the romanized Korean names, otherwise. + public static bool IsRomanizedKoreanTrainerName(ReadOnlySpan trainerName) => trainerName switch + { + // This is very un-documented. If you have any samples, please share! + // Refer to https://github.com/kwsch/PKHeX/issues/4811 + // It's entirely possible that there are only 4 trainer names (determined via OT version & OT gender). + // It's also possible that the game only sanitizes if the name+nickname has a Korean char. + "Ahn" => true, // 안 + "Han" => true, // 한 + "Jeong" => true, // 정 (41076, Male) + "Hwang" => true, // 황 (46364, Female) + _ => false, + }; + + /// + /// Fetches a sanitized trainer name for a Korean GTS trade. + /// + /// + /// Please don't use this; we do not know what determines the sanitized name, and it may be subject to change. It's only here as an API stub of sorts. + /// + public static string GetRomanizedKoreanTrainerName(PK4 pk4) => "Han"; +} diff --git a/PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs b/PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs index 0ed82f6da..53dab8fa2 100644 --- a/PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs @@ -203,7 +203,7 @@ private void VerifyUnNicknamed(LegalityAnalysis data, PKM pk, ReadOnlySpan else { var enc = data.EncounterOriginal; - bool valid = IsNicknameValid(pk, enc, nickname); + bool valid = IsNotNicknameValid(data, pk, enc, nickname); var result = valid ? GetValid(NickMatchLanguage) : GetInvalid(NickMatchLanguageFail); data.AddLine(result); } @@ -240,7 +240,7 @@ private static int GetForeignNicknameLength(PKM pk, IEncounterTemplate match, by return Math.Max(length, future); } - private static bool IsNicknameValid(PKM pk, IEncounterTemplate enc, ReadOnlySpan nickname) + private static bool IsNotNicknameValid(LegalityAnalysis data, PKM pk, IEncounterTemplate enc, ReadOnlySpan nickname) { ushort species = pk.Species; byte format = pk.Format; @@ -261,6 +261,16 @@ private static bool IsNicknameValid(PKM pk, IEncounterTemplate enc, ReadOnlySpan } } + if (format == 4 && data.HasResult(GTSTrainerSanitized)) + { + // Korean GTS => International sanitizes to English. GTS back would revert back to Korean nickname. + if (ParseSettings.ActiveTrainer is not { Generation: 4, Language: (int)Korean }) + { + var english = SpeciesName.GetSpeciesNameGeneration(species, (int)English, format); + return nickname.SequenceEqual(english); + } + } + ReadOnlySpan expect = SpeciesName.GetSpeciesNameGeneration(species, language, format); if (nickname.SequenceEqual(expect)) return true; @@ -473,7 +483,11 @@ private static void VerifyTrainerName(LegalityAnalysis data, IFixedTrainer ft, i int len = pk.LoadString(pk.OriginalTrainerTrash, trainer); trainer = trainer[..len]; - if (!ft.IsTrainerMatch(pk, trainer, language)) - data.AddLine(GetInvalid(CheckIdentifier.Trainer, EncTradeChangedOT)); + if (ft.IsTrainerMatch(pk, trainer, language)) + return; // OK + if (data.HasResult(GTSTrainerSanitized)) + return; // OK + + data.AddLine(GetInvalid(CheckIdentifier.Trainer, EncTradeChangedOT)); } } diff --git a/PKHeX.Core/Legality/Verifiers/TrainerNameVerifier.cs b/PKHeX.Core/Legality/Verifiers/TrainerNameVerifier.cs index ab584c10b..d01180bc0 100644 --- a/PKHeX.Core/Legality/Verifiers/TrainerNameVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/TrainerNameVerifier.cs @@ -48,7 +48,7 @@ public override void Verify(LegalityAnalysis data) } else if (trainer.Length > Legal.GetMaxLengthOT(enc.Generation, (LanguageID)pk.Language)) { - if (!IsEdgeCaseLength(pk, enc, trainer)) + if (!IsEdgeCaseLength(pk, enc, trainer) && !data.HasResult(GTSTrainerSanitized)) data.AddLine(Get(Severity.Invalid, OTLong)); } diff --git a/PKHeX.Core/PKM/Strings/StringConverter4Util.cs b/PKHeX.Core/PKM/Strings/StringConverter4Util.cs index c0bc76a31..328667bb9 100644 --- a/PKHeX.Core/PKM/Strings/StringConverter4Util.cs +++ b/PKHeX.Core/PKM/Strings/StringConverter4Util.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.InteropServices; namespace PKHeX.Core; @@ -14,13 +15,60 @@ public static class StringConverter4Util /// Decoded value (unicode). public static ushort ConvertValue2CharG4(ushort val) { - if (val <= TableINTEnd) + if (val < TableINT.Length) return TableINT[val]; - if (val is <= TableKOREnd and >= TableKORStart) - return TableKOR[val - TableKORStart]; + + // If not International, it is quite likely Korean. + // Fold the check into a single comparison instead of two (min/max). + var index = val - TableKORStart; + if ((uint)index < TableKOR.Length) + return TableKOR[index]; + return NUL; } + /// + /// Checks if an encoded sequence of Generation 4 glyph values contain a valid Korean character outside the International character table. + /// + /// Encoded values. + /// True if a Korean character is found, false otherwise. + public static bool IsKorean(ReadOnlySpan values) + { + foreach (var value in values) + { + if (value is StringConverter4.Terminator) + break; + if (IsKorean(value)) + return true; + } + return false; + } + + /// + public static bool IsKorean(ReadOnlySpan trash) + { + var cast = MemoryMarshal.Cast(trash); + foreach (var value in cast) + { + var tmp = value; + if (tmp is StringConverter4.Terminator) + break; + if (!BitConverter.IsLittleEndian) + tmp = System.Buffers.Binary.BinaryPrimitives.ReverseEndianness(tmp); + if (IsKorean(tmp)) + return true; + } + return false; + } + + /// + /// Checks if a character is a valid Korean char outside the International character table. + /// + /// + /// Ensure the is within the string's rendered span before calling this method. + /// + public static bool IsKorean(ushort val) => val is >= TableKORStart and <= TableKOREnd; + /// /// Converts a Unicode character to Generation 4 value. /// @@ -65,8 +113,6 @@ public static void StripDiacriticsFR4(Span input) #region Conversion Data - private const int TableINTEnd = 0x01EC; - private const int TableKORStart = 0x400; private const int TableKOREnd = 0xD65; diff --git a/PKHeX.Core/Resources/localize/legality/legality_de.json b/PKHeX.Core/Resources/localize/legality/legality_de.json index b0b44d9ea..e8d0af41f 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_de.json +++ b/PKHeX.Core/Resources/localize/legality/legality_de.json @@ -149,6 +149,11 @@ "G4PartnerMoodZero": "Der Wert für die Laune sollte null sein, wenn sich das Pokémon nicht im Team des Spielers befindet.", "G4ShinyLeafBitsInvalid": "Daten-Bits für Glänzendes Blatt/Blattkrone sind ungültig.", "G4ShinyLeafBitsEgg": "Eier können kein Glänzendes Blatt bzw. keine Blattkrone haben.", + "GTSTrainerSanitizedExpected": "Ein GTS-bereinigter Trainername wurde erwartet.", + "GTSTrainerSanitized": "Trainername entspricht einem GTS-bereinigten Trainernamen.", + "GTSTradedKoreanInternational": "Zwischen koreanischen und internationalen Spielen per GTS getauscht.", + "GTSDisallowedClassicRibbon": "Das Klassikband kann in der GTS der 4. Generation nicht zwischen koreanischen und internationalen Spielen getauscht werden.", + "GTSDisallowedTradedEgg": "Eier können in der GTS der 4. Generation nicht zwischen koreanischen und internationalen Spielen getauscht werden.", "G5IVAll30": "Alle DV-Werte von Ns Pokémon müssen 30 sein.", "G5PIDShinyGrotto": "Pokémon aus der Versteckten Lichtung können nicht schillernd sein.", "G5SparkleInvalid": "Die spezielle Markierung für Ns Glanz sollte nicht gesetzt sein.", @@ -320,7 +325,6 @@ "TransferHTMismatchName": "Der Handling Trainer stimmt nicht mit dem erwarteten Trainernamen überein.", "TransferHTMismatchGender": "Das Geschlecht des Handling Trainers stimmt nicht mit dem erwarteten Geschlecht überein.", "TransferHTMismatchLanguage": "Die Sprache des Handling Trainers stimmt nicht mit der erwarteten Sprache überein.", - "TransferKoreanGen4": "Koreanische Spiele der 4. Generation können nicht mit internationalen Spielen der 4. Generation interagieren.", "TransferMet": "Ungültiger Fangort; erwartet wurde Poképorter/Zoroark (Coronia-Raubkatzen) oder Poképorter/Celebi (Celebi).", "TransferNotPossible": "Übertragung vom Ursprungsformat in das aktuelle Format nicht möglich.", "TransferMetLocation": "Ungültiger Transfer-Fundort.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_en.json b/PKHeX.Core/Resources/localize/legality/legality_en.json index a40129e51..93cad188e 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_en.json +++ b/PKHeX.Core/Resources/localize/legality/legality_en.json @@ -149,6 +149,11 @@ "G4PartnerMoodZero": "Mood stat value should be zero when not in the player's party.", "G4ShinyLeafBitsInvalid": "Shiny Leaf/Crown bits are not valid.", "G4ShinyLeafBitsEgg": "Eggs cannot have Shiny Leaf/Crown.", + "GTSTrainerSanitizedExpected": "Expected a GTS sanitized trainer name.", + "GTSTrainerSanitized": "Trainer name matches a GTS sanitized trainer name.", + "GTSTradedKoreanInternational": "Traded between Korean and International games via GTS.", + "GTSDisallowedClassicRibbon": "Cannot trade Classic Ribbon in the Gen 4 GTS between Korean and International games.", + "GTSDisallowedTradedEgg": "Cannot trade eggs in the Gen 4 GTS between Korean and International games.", "G5IVAll30": "All IVs of N's Pokémon should be 30.", "G5PIDShinyGrotto": "Hidden Grotto captures cannot be shiny.", "G5SparkleInvalid": "Special in-game N's Sparkle flag should not be checked.", @@ -320,7 +325,6 @@ "TransferHTMismatchName": "Handling trainer does not match the expected trainer name.", "TransferHTMismatchGender": "Handling trainer does not match the expected trainer gender.", "TransferHTMismatchLanguage": "Handling trainer does not match the expected trainer language.", - "TransferKoreanGen4": "Korean Generation 4 games cannot interact with International Generation 4 games.", "TransferMet": "Invalid Met Location, expected Poké Transfer/Zoroark (Crown Beasts), Poké Transfer/Celebi (Celebi).", "TransferNotPossible": "Unable to transfer into current format from origin format.", "TransferMetLocation": "Invalid Transfer Met Location.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_es-419.json b/PKHeX.Core/Resources/localize/legality/legality_es-419.json index 64c9e4be7..69bb3de80 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_es-419.json +++ b/PKHeX.Core/Resources/localize/legality/legality_es-419.json @@ -149,6 +149,11 @@ "G4PartnerMoodZero": "El Humor de Caminar debe ser cero cuando no está en el equipo", "G4ShinyLeafBitsInvalid": "Los bits de Hoja Dorada/Corona no son válidos.", "G4ShinyLeafBitsEgg": "Los Huevos no pueden tener Hoja/Corona dorada.", + "GTSTrainerSanitizedExpected": "Se esperaba un nombre de Entrenador sanitizado por el GTS.", + "GTSTrainerSanitized": "El nombre del Entrenador coincide con un nombre de Entrenador sanitizado por el GTS.", + "GTSTradedKoreanInternational": "Intercambiado entre juegos coreanos e internacionales mediante el GTS.", + "GTSDisallowedClassicRibbon": "No se puede intercambiar la Cinta Clásica en el GTS de la 4ta generación entre juegos coreanos e internacionales.", + "GTSDisallowedTradedEgg": "No se pueden intercambiar Huevos en el GTS de la 4ta generación entre juegos coreanos e internacionales.", "G5IVAll30": "Todos los IVs de los Pokémon de N deberían ser 30.", "G5PIDShinyGrotto": "Las Capturas en Los Claros Ocultos no pueden ser brillante.", "G5SparkleInvalid": "La marca chispeante especial de los Pokémon de N en el juego no debería marcarse.", @@ -320,7 +325,6 @@ "TransferHTMismatchName": "El nombre del Entrenador actual no corresponde con el nombre esperado.", "TransferHTMismatchGender": "El Último Entrenador no coincide con el género de entrenador esperado.", "TransferHTMismatchLanguage": "El idioma del Entrenador actual no corresponde con el idioma esperado.", - "TransferKoreanGen4": "Los juegos coreanos de la cuarta generación no pueden interactuar con los juegos internacionales de la cuarta generación.", "TransferMet": "Localización inválida. Se esperaba Pokétransfer/Zoroark (Perros Legendarios), Pokétransfer/Celebi (Celebi).", "TransferNotPossible": "Unable to transfer into current format from origin format.", "TransferMetLocation": "Localización mediante transferencia inválido.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_es.json b/PKHeX.Core/Resources/localize/legality/legality_es.json index 3a6ffbe4d..60bd2c727 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_es.json +++ b/PKHeX.Core/Resources/localize/legality/legality_es.json @@ -149,6 +149,11 @@ "G4PartnerMoodZero": "El Humor de Caminar debe ser cero cuando no está en el equipo", "G4ShinyLeafBitsInvalid": "Los bits de Hoja Dorada/Corona no son válidos.", "G4ShinyLeafBitsEgg": "Los Huevos no pueden tener Hoja/Corona dorada.", + "GTSTrainerSanitizedExpected": "Se esperaba un nombre de Entrenador sanitizado por el GTS.", + "GTSTrainerSanitized": "El nombre del Entrenador coincide con un nombre de Entrenador sanitizado por el GTS.", + "GTSTradedKoreanInternational": "Intercambiado entre juegos coreanos e internacionales mediante el GTS.", + "GTSDisallowedClassicRibbon": "No se puede intercambiar la Cinta Clásica en el GTS de la 4ta generación entre juegos coreanos e internacionales.", + "GTSDisallowedTradedEgg": "No se pueden intercambiar Huevos en el GTS de la 4ta generación entre juegos coreanos e internacionales.", "G5IVAll30": "Todos los IVs de los Pokémon de N deberían ser 30.", "G5PIDShinyGrotto": "Las Capturas en Los Claros Ocultos no pueden ser variocolor.", "G5SparkleInvalid": "La marca chispeante especial de los Pokémon de N en el juego no debería marcarse.", @@ -320,7 +325,6 @@ "TransferHTMismatchName": "El nombre del Entrenador actual no corresponde con el nombre esperado.", "TransferHTMismatchGender": "El Último Entrenador no coincide con el género de entrenador esperado.", "TransferHTMismatchLanguage": "El idioma del Entrenador actual no corresponde con el idioma esperado.", - "TransferKoreanGen4": "Los juegos coreanos de la cuarta generación no pueden interactuar con los juegos internacionales de la cuarta generación.", "TransferMet": "Localización inválida. Se esperaba Pokétransfer/Zoroark (Perros Legendarios), Pokétransfer/Celebi (Celebi).", "TransferNotPossible": "Unable to transfer into current format from origin format.", "TransferMetLocation": "Localización mediante transferencia inválido.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_fr.json b/PKHeX.Core/Resources/localize/legality/legality_fr.json index 22328b9f6..5c6937350 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_fr.json +++ b/PKHeX.Core/Resources/localize/legality/legality_fr.json @@ -149,6 +149,11 @@ "G4PartnerMoodZero": "La valeur de la stat d'Humeur devrait être zéro en dehors de l'Équipe.", "G4ShinyLeafBitsInvalid": "Les valeurs des morceaux de Feuilles d'Or/Couronne de Feuilles ne sont pas valides.", "G4ShinyLeafBitsEgg": "Les Œufs ne peuvent pas avoir de Feuilles d'Or/Couronne de Feuilles.", + "GTSTrainerSanitizedExpected": "Nom de Dresseur assaini par le GTS attendu.", + "GTSTrainerSanitized": "Le nom du Dresseur correspond à un nom de Dresseur assaini par le GTS.", + "GTSTradedKoreanInternational": "Échangé entre jeux coréens et internationaux via le GTS.", + "GTSDisallowedClassicRibbon": "Le Ruban Classique ne peut pas être échangé sur le GTS de la 4e génération entre jeux coréens et internationaux.", + "GTSDisallowedTradedEgg": "Les Œufs ne peuvent pas être échangés sur le GTS de la 4e génération entre jeux coréens et internationaux.", "G5IVAll30": "Tous les IVs des Pokémon de N doivent être 30.", "G5PIDShinyGrotto": "Les Pokémon capturés dans les Trouées cachées ne peuvent pas être chromatiques.", "G5SparkleInvalid": "Le drapeau de l'éclat spécial des Pokémon de N ne doit pas être coché.", @@ -320,7 +325,6 @@ "TransferHTMismatchName": "Le Dresseur Actuel ne correspond pas au nom attendu.", "TransferHTMismatchGender": "Le genre du Dresseur Actuel ne correspond pas à la valeur attendue.", "TransferHTMismatchLanguage": "La langue du Dresseur Actuel ne correspond pas à la valeur attendue.", - "TransferKoreanGen4": "Les jeux coréens de 4ème génération ne peuvent pas interagir avec les jeux internationaux de 4ème génération.", "TransferMet": "Lieu de rencontre non valide. Attendu : Poké Transfer/Zoroark (fauves légendaires), Poké Transfer/Celebi (Celebi).", "TransferNotPossible": "Impossible de transférer dans le format actuel à partir du format d'origine.", "TransferMetLocation": "Lieu de Rencontre par transfert invalide.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_it.json b/PKHeX.Core/Resources/localize/legality/legality_it.json index e855dbdb3..323f04443 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_it.json +++ b/PKHeX.Core/Resources/localize/legality/legality_it.json @@ -149,6 +149,11 @@ "G4PartnerMoodZero": "Il valore della statistica Umore deve essere zero quando il Pokémon non è in squadra.", "G4ShinyLeafBitsInvalid": "I bit delle Foglielucenti o della Corona Lucente non sono validi.", "G4ShinyLeafBitsEgg": "Le Uova non possono avere Foglielucenti o la Corona di Foglie.", + "GTSTrainerSanitizedExpected": "Era previsto un nome Allenatore sanificato dal GTS.", + "GTSTrainerSanitized": "Il nome Allenatore corrisponde a un nome Allenatore sanificato dal GTS.", + "GTSTradedKoreanInternational": "Scambiato tra giochi coreani e internazionali tramite GTS.", + "GTSDisallowedClassicRibbon": "Il Fiocco Classico non può essere scambiato nel GTS di quarta generazione tra giochi coreani e internazionali.", + "GTSDisallowedTradedEgg": "Le Uova non possono essere scambiate nel GTS di quarta generazione tra giochi coreani e internazionali.", "G5IVAll30": "Tutti gli IV dei Pokémon di N dovrebbero essere 30.", "G5PIDShinyGrotto": "Gli incontri del Meandro Nascosto non possono essere cromatico.", "G5SparkleInvalid": "Il segnale speciale di luccichio dei Pokémon di N non dovrebbe essere ablitato.", @@ -320,7 +325,6 @@ "TransferHTMismatchName": "Il nome dell'Ultimo Allenatore non corrisponde al valore atteso.", "TransferHTMismatchGender": "L'allenatore attuale non corrisponde al sesso dell'allenatore previsto.", "TransferHTMismatchLanguage": "La lingua dell'Ultimo Allenatore non corrisponde al valore atteso.", - "TransferKoreanGen4": "I giochi di quarta generazione coreani non possono interagire con i giochi di quarta generazione internazionali.", "TransferMet": "Luogo di incontro invalido, previsto Pokétrasporto/Zoroark (Bestie Leggendarie), Pokétrasporto/Celebi (Celebi).", "TransferNotPossible": "Impossibile trasferire il Pokémon dal formato originale al formato attuale.", "TransferMetLocation": "Luogo di trasferimento non valido.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_ja.json b/PKHeX.Core/Resources/localize/legality/legality_ja.json index 403edfe96..e9bf71bf8 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_ja.json +++ b/PKHeX.Core/Resources/localize/legality/legality_ja.json @@ -149,6 +149,11 @@ "G4PartnerMoodZero": "Mood stat value should be zero when not in the player's party.", "G4ShinyLeafBitsInvalid": "Shiny Leaf/Crown bits are not valid.", "G4ShinyLeafBitsEgg": "タマゴに『かがやくはっぱ/冠』を設定することはできません。", + "GTSTrainerSanitizedExpected": "GTSでサニタイズされたトレーナー名である必要があります。", + "GTSTrainerSanitized": "トレーナー名はGTSでサニタイズされたトレーナー名と一致します。", + "GTSTradedKoreanInternational": "韓国版と海外版のゲーム間でGTSを介して交換されました。", + "GTSDisallowedClassicRibbon": "第4世代のGTSでは、韓国版と海外版のゲーム間でクラシックリボン付きポケモンは交換できません。", + "GTSDisallowedTradedEgg": "第4世代のGTSでは、韓国版と海外版のゲーム間でタマゴは交換できません。", "G5IVAll30": "Nのポケモンは個体値が全て30です。", "G5PIDShinyGrotto": "隠し穴産のポケモンは色違いになりません。", "G5SparkleInvalid": "Nのポケモンフラグのチェックを外してください。", @@ -320,7 +325,6 @@ "TransferHTMismatchName": "先のトレーナーと予想されるトレーナー名が一致しません。", "TransferHTMismatchGender": "Handling trainer does not match the expected trainer gender.", "TransferHTMismatchLanguage": "先のトレーナーと予想されるトレーナーの言語が一致しません。", - "TransferKoreanGen4": "Korean Generation 4 games cannot interact with International Generation 4 games.", "TransferMet": "Invalid Met Location, expected Poké Transfer/Zoroark (Crown Beasts), Poké Transfer/Celebi (Celebi).", "TransferNotPossible": "元のフォーマットから現在のフォーマットに転送できません。", "TransferMetLocation": "転送後の出会った場所が不正です。", diff --git a/PKHeX.Core/Resources/localize/legality/legality_ko.json b/PKHeX.Core/Resources/localize/legality/legality_ko.json index 141f04c01..845996fdf 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_ko.json +++ b/PKHeX.Core/Resources/localize/legality/legality_ko.json @@ -149,6 +149,11 @@ "G4PartnerMoodZero": "지니고 있는 포켓몬이 아닐 경우 '기분' 수치는 0이어야 합니다.", "G4ShinyLeafBitsInvalid": "빛나는뭇잎/왕관 비트 수치가 유효하지 않습니다.", "G4ShinyLeafBitsEgg": "알은 빛나는나뭇잎/왕관을 가질 수 없습니다.", + "GTSTrainerSanitizedExpected": "GTS에서 정규화된 트레이너 이름이어야 합니다.", + "GTSTrainerSanitized": "트레이너 이름이 GTS에서 정규화된 트레이너 이름과 일치합니다.", + "GTSTradedKoreanInternational": "한국판과 국제판 게임 간에 GTS를 통해 교환되었습니다.", + "GTSDisallowedClassicRibbon": "4세대 GTS에서는 한국판과 국제판 게임 간에 클래식리본을 교환할 수 없습니다.", + "GTSDisallowedTradedEgg": "4세대 GTS에서는 한국판과 국제판 게임 간에 알을 교환할 수 없습니다.", "G5IVAll30": "N이 소유한 포켓몬의 IV는 30이어야 합니다.", "G5PIDShinyGrotto": "은혈에서 포획한 포켓몬은 색이 다를 수 없습니다.", "G5SparkleInvalid": "게임 내 특수한 N 전용 반짝임 플래그가 켜져 있지 않아야 합니다.", @@ -320,7 +325,6 @@ "TransferHTMismatchName": "최근 어버이의 이름이 예상치와 일치하지 않습니다.", "TransferHTMismatchGender": "최근 어버이의 성별이 예상치와 일치하지 않습니다.", "TransferHTMismatchLanguage": "최근 어버이의 언어가 예상치와 일치하지 않습니다.", - "TransferKoreanGen4": "한국어판 4세대 게임은 해외판 4세대 게임과 통신할 수 없습니다.", "TransferMet": "만난 장소가 잘못되었습니다. 또는 '포케시프터/조로아크 (크라운 전설의 개)', '포케시프터/세레비 (세레비)'여야 합니다.", "TransferNotPossible": "출신 포맷에서 현재 포맷으로 전송할 수 없습니다.", "TransferMetLocation": "옮겨진 만난 장소가 잘못되었습니다.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json b/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json index 37daf4f93..cd705b17d 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json +++ b/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json @@ -149,6 +149,11 @@ "G4PartnerMoodZero": "不在玩家队伍中时,心情值应为0。", "G4ShinyLeafBitsInvalid": "闪耀叶片/花冠标志位无效。", "G4ShinyLeafBitsEgg": "蛋不能有闪耀叶片/花冠。", + "GTSTrainerSanitizedExpected": "应为经过GTS规范化处理的训练家名称。", + "GTSTrainerSanitized": "训练家名称与经过GTS规范化处理的训练家名称一致。", + "GTSTradedKoreanInternational": "已通过GTS在韩文版与国际版游戏之间交换。", + "GTSDisallowedClassicRibbon": "在第4世代GTS中,韩文版与国际版游戏之间不能交换经典丝带。", + "GTSDisallowedTradedEgg": "在第4世代GTS中,韩文版与国际版游戏之间不能交换蛋。", "G5IVAll30": "N的宝可梦所有个体值应为30。", "G5PIDShinyGrotto": "在隐藏洞穴捕获的宝可梦不能为异色。", "G5SparkleInvalid": "特殊游戏内宝可梦N的闪光标记不应勾选。", @@ -320,7 +325,6 @@ "TransferHTMismatchName": "持有训练家与期望训练家名字不匹配。", "TransferHTMismatchGender": "处理训练家的性别与期望的训练家性别不符。", "TransferHTMismatchLanguage": "持有训练家与期望训练家语言不匹配。", - "TransferKoreanGen4": "韩版第四世代游戏无法与国际版第四世代游戏互通。", "TransferMet": "无效的相遇地点,应为宝可梦传送/索罗亚克(异色三兽)或宝可梦传送/时拉比(时拉比)。", "TransferNotPossible": "无法从原始格式转换为当前格式。", "TransferMetLocation": "传送相遇地点非法。", diff --git a/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json b/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json index 90f56c3c6..ddd455bc5 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json +++ b/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json @@ -149,6 +149,11 @@ "G4PartnerMoodZero": "不在玩家隊伍中時,心情值應為0。", "G4ShinyLeafBitsInvalid": "閃耀葉片/花冠標誌位無效。", "G4ShinyLeafBitsEgg": "蛋不能携帶閃耀的葉片/王冠。", + "GTSTrainerSanitizedExpected": "應為經過GTS正規化處理的訓練家名稱。", + "GTSTrainerSanitized": "訓練家名稱與經過GTS正規化處理的訓練家名稱一致。", + "GTSTradedKoreanInternational": "已透過GTS於韓文版與國際版遊戲之間交換。", + "GTSDisallowedClassicRibbon": "在第四世代GTS中,韓文版與國際版遊戲之間不能交換經典緞帶。", + "GTSDisallowedTradedEgg": "在第四世代GTS中,韓文版與國際版遊戲之間不能交換蛋。", "G5IVAll30": "N的寶可夢所有個體值應為30。", "G5PIDShinyGrotto": "於隱藏洞穴捕獲之寶可夢不能為異色。", "G5SparkleInvalid": "特殊遊戲內寶可夢N的異色標記不應勾選。", @@ -320,7 +325,6 @@ "TransferHTMismatchName": "現時持有人與期望名字不匹配。", "TransferHTMismatchGender": "處理訓練家的性別與期望的訓練家性別不符。", "TransferHTMismatchLanguage": "現時持有人與期望語言不匹配。", - "TransferKoreanGen4": "韓版第四世代遊戲無法與國際版第四世代遊戲互通。", "TransferMet": "無效的相遇地點,應為寶可夢傳送/索羅亞克(異色三獸)或寶可夢傳送/時拉比(時拉比)。", "TransferNotPossible": "無法將現時寶可夢檔格式轉換爲源寶可夢檔格式。", "TransferMetLocation": "傳送遇見地點不合法。", diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index 304499322..4e2b4ddc6 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -305,6 +305,7 @@ LocalizedDescription.HiddenProperties=Eigenschaften, die im Berichts-Gitter ausg LocalizedDescription.HideEvent8Contains=Versteckt Event-Variablen, die unten stehende (kommagetrennte) Zeichenfolgen enthalten. Filtert irrelevante Einträge aus der Benutzeroberfläche. LocalizedDescription.HideSAVDetails=Verstecke Spielstand Details in Programmtitel LocalizedDescription.HideSecretDetails=Verstecke persönliche Details im Editor +LocalizedDescription.HighDpiText=Schaltet beim Programmstart einen Modus mit höherer DPI-Darstellung für die Anwendung um. LocalizedDescription.HOMETransferTrackerNotPresent=Kennzeichnet in der Legalitäts Analyse, wenn der HOME Tracker fehlt. LocalizedDescription.Hover=Einstellungen für die Detailanzeige beim Hovern über einen slot. LocalizedDescription.HoverSlotGlowEdges=Zeige Glanz bei Berührung diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index 93ca61963..8cf4804b3 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -305,6 +305,7 @@ LocalizedDescription.HiddenProperties=Properties to hide from the report grid. LocalizedDescription.HideEvent8Contains=Hide event variable names for that contain any of the comma-separated substrings below. Removes event values from the GUI that the user doesn't care to view. LocalizedDescription.HideSAVDetails=Hide Save File Details in Program Title LocalizedDescription.HideSecretDetails=Hide Secret Details in Editors +LocalizedDescription.HighDpiText=Toggles a higher Dpi rendering mode for the application on startup. LocalizedDescription.HOMETransferTrackerNotPresent=Severity to flag a Legality Check if the HOME Tracker is Missing LocalizedDescription.Hover=Settings for showing details when hovering a slot. LocalizedDescription.HoverSlotGlowEdges=Show PKM Glow on Hover diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index b9be396c3..0514064cd 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -305,6 +305,7 @@ LocalizedDescription.HiddenProperties=Propiedades a esconder en la cuadrícula. LocalizedDescription.HideEvent8Contains=Oculta eventos con las siguientes palabras (separadas por comas). Filtra entradas irrelevantes de la interfaz. LocalizedDescription.HideSAVDetails=Ocultar detalles de partidas guardadas en el título del programa LocalizedDescription.HideSecretDetails=Ocultar detalles secretos en los editores +LocalizedDescription.HighDpiText=Activa un modo de renderizado de DPI más alto para la aplicación al iniciar. LocalizedDescription.HOMETransferTrackerNotPresent=En la comprobación de legalidad, marcar Severidad para detectar una comprobación de legalidad si falta el rastreador HOME LocalizedDescription.Hover=Configuración para mostrar detalles al pasar el cursor sobre una ranura. LocalizedDescription.HoverSlotGlowEdges=Mostrar brillo PKM al pasar el mouse diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index d6c638546..7b9c6e8d5 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -305,6 +305,7 @@ LocalizedDescription.HiddenProperties=Propiedades a esconder en la cuadrícula. LocalizedDescription.HideEvent8Contains=Oculta eventos con las siguientes palabras (separadas por comas). Filtra entradas irrelevantes de la interfaz. LocalizedDescription.HideSAVDetails=Ocultar detalles de partidas guardadas en el título del programa LocalizedDescription.HideSecretDetails=Ocultar detalles secretos en los editores +LocalizedDescription.HighDpiText=Activa un modo de renderizado de DPI más alto para la aplicación al iniciar. LocalizedDescription.HOMETransferTrackerNotPresent=En la comprobación de legalidad, marcar Severidad para detectar una comprobación de legalidad si falta el rastreador HOME LocalizedDescription.Hover=Ajustes para mostrar detalles al pasar el cursor sobre una ranura. LocalizedDescription.HoverSlotGlowEdges=Mostrar brillo PKM al pasar el ratón diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index 6d92502fc..417d12435 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -305,6 +305,7 @@ LocalizedDescription.HiddenProperties=Propriétés à cacher de la grille de rap LocalizedDescription.HideEvent8Contains=Cache les noms des variables d'évènements contenant une des valeurs ci-dessous. Retire les valeurs d'évènement de l'interface considérées inintéressantes par l'utilisateur. LocalizedDescription.HideSAVDetails=Cacher les détails de la sauvegarde dans le titre du programme LocalizedDescription.HideSecretDetails=Cacher les détails secrets dans les éditeurs +LocalizedDescription.HighDpiText=Active un mode de rendu à DPI plus élevé pour l'application au démarrage. LocalizedDescription.HOMETransferTrackerNotPresent=Degré de sévérité pour signaler lors d'une Vérification de la Légalité si le Tracker HOME est manquant LocalizedDescription.Hover=Paramètres pour montrer les détails lorsqu'un emplacement est survolé. LocalizedDescription.HoverSlotGlowEdges=Faire briller le Pokémon au survol diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index 2ffb4825a..4149cf961 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -305,6 +305,7 @@ LocalizedDescription.HiddenProperties=Proprietà da nascondere dalla griglia del LocalizedDescription.HideEvent8Contains=Nascondi le variabili evento contenenti le sottostringhe indicate (separate da virgola). Rimuove dall'interfaccia i valori non d'interesse. LocalizedDescription.HideSAVDetails=Nascondi i dettagli del File di Salvataggio dal Titolo del Programma. LocalizedDescription.HideSecretDetails=Nascondi i Dettagli Segreti dagli Editor. +LocalizedDescription.HighDpiText=Attiva all'avvio dell'applicazione una modalità di rendering a DPI più elevato. LocalizedDescription.HOMETransferTrackerNotPresent=Forza una segnalazione di legalità se il codice di Tracciamento di Pokémon Home è assente. LocalizedDescription.Hover=Impostazioni per la visualizzazione dei dettagli al passaggio del mouse su uno slot. LocalizedDescription.HoverSlotGlowEdges=Mostra l'evidenziatura del Pokémon al passaggio del mouse. diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index fac8e3600..7b8cd8a6b 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -265,62 +265,63 @@ KChart.DGV_SpecName=名前 KChart.DGV_Sprite=スプライト KChart.DGV_Type1=タイプ1 KChart.DGV_Type2=タイプ2 -LocalizedDescription.AllowBoxDataDrop=Allow drag and drop of boxdata binary files from the GUI via the Box tab. -LocalizedDescription.AllowGen1Tradeback=GB: Allow Generation 2 tradeback learnsets -LocalizedDescription.AllowGuessRejuvenateHOME=Allow PKM file conversion paths to guess the legal original encounter data that is not stored in the format that it was converted from. -LocalizedDescription.AllowIncompatibleConversion=Allow PKM file conversion paths that are not possible via official methods. Individual properties will be copied sequentially. +LocalizedDescription.AllowBoxDataDrop=ボックスタブから、GUI経由で boxdata バイナリファイルのドラッグ&ドロップを許可します。 +LocalizedDescription.AllowGen1Tradeback=GB: 第2世代からの逆輸入による技構成を許可します。 +LocalizedDescription.AllowGuessRejuvenateHOME=PKMファイル変換時、変換元形式に保存されていない正規な元の出会い情報を推測することを許可します。 +LocalizedDescription.AllowIncompatibleConversion=公式手段では不可能なPKMファイル変換経路を許可します。各プロパティは順番にコピーされます。 LocalizedDescription.ApplyMarkings=インポート時にマーキングを適用する。 LocalizedDescription.ApplyNature=インポート時に、ミントによって変化した性格を元々の性格として適用します。 LocalizedDescription.AutoLoadSaveOnStartup=起動時にセーブファイルを自動的に検出します。 -LocalizedDescription.BackupPath=Path to the backup folder for keeping save file backups. +LocalizedDescription.BackupPath=セーブファイルのバックアップを保存するためのバックアップフォルダーのパス。 LocalizedDescription.BAKEnabled=セーブデータの自動バックアップを有効にします。 LocalizedDescription.BAKPrompt=『バックアップ作成』のプロンプトが実行されたかを確認します。 LocalizedDescription.BoxExport=ボックスのエクスポートに使用する設定。 -LocalizedDescription.CheckActiveHandler=Checks the last loaded player save file data and Current Handler state to determine if the Pokémon's Current Handler does not match the expected value. +LocalizedDescription.CheckActiveHandler=最後に読み込んだプレイヤーのセーブデータと現在の所持者情報を確認し、ポケモンの現在の所持者が想定値と一致しないか判定します。 LocalizedDescription.CheckWordFilter=プレイヤーがつけたニックネームとトレーナー名に不適切な表現がないかをチェックします。チェックには3DS本体のNGリストが使用されます。 -LocalizedDescription.CurrentHandlerMismatch=Severity to flag a Legality Check if Pokémon's Current Handler does not match the expected value. -LocalizedDescription.DarkMode=Use the Dark color mode for the application on startup. -LocalizedDescription.DatabasePath=Path to the PKM Database folder. -LocalizedDescription.DefaultBoxExportNamer=Selected File namer to use for box exports for the GUI, if multiple are available. -LocalizedDescription.DisableScalingDpi=Disables the GUI scaling based on Dpi on program startup, falling back to font scaling. +LocalizedDescription.CurrentHandlerMismatch=ポケモンの現在の所持者が想定値と一致しない場合に、正規チェックで付ける警告レベル。 +LocalizedDescription.DarkMode=起動時にアプリケーションでダークカラーモードを使用します。 +LocalizedDescription.DatabasePath=PKMデータベースフォルダーのパス。 +LocalizedDescription.DefaultBoxExportNamer=GUIでボックスを書き出す際に使用するファイル名形式。複数ある場合はこの設定が使われます。 +LocalizedDescription.DisableScalingDpi=起動時にDPIベースのGUIスケーリングを無効にし、代わりにフォントスケーリングを使用します。 LocalizedDescription.DisableWordFilterPastGen=3DS時代より前のワードチェックを無効にします。 LocalizedDescription.DragStartThreshold=スロットからドラッグ操作を開始するまでに必要なマウスの最小移動距離です。 -LocalizedDescription.EggRandomAnyType3=Allow Generation 3 bred eggs to have any PID/IV type by assuming they were RNG abused to be collisions instead of hacked. -LocalizedDescription.EggRandomAnyType4=Allow Generation 4 bred eggs to have any PID/IV type by assuming they were RNG abused to be collisions instead of hacked. -LocalizedDescription.Export=Settings for showing details when exporting a slot. -LocalizedDescription.ExportLegalityAlwaysVerbose=Always displays the verbose legality report, and inverts the hotkey behavior to instead disable. -LocalizedDescription.ExportLegalityNeverClipboard=Always skips the prompt option asking if you would like to export a legality report to clipboard. -LocalizedDescription.ExportLegalityVerboseProperties=Display all properties of the encounter (auto-generated) when exporting a verbose report. -LocalizedDescription.ExtraProperties=Extra entity properties to try and show in addition to the default properties displayed. -LocalizedDescription.FilterMismatchGrayscale=Grayscale amount to apply to an entity that does not match a filter (0.0 = no grayscale, 1.0 = fully grayscale). -LocalizedDescription.FilterMismatchOpacity=Opacity of an entity that does not match a filter. +LocalizedDescription.EggRandomAnyType3=第3世代の孵化タマゴについて、改造ではなくRNG調整による衝突であるとみなして、任意のPID/IVタイプを許可します。 +LocalizedDescription.EggRandomAnyType4=第4世代の孵化タマゴについて、改造ではなくRNG調整による衝突であるとみなして、任意のPID/IVタイプを許可します。 +LocalizedDescription.Export=スロットを書き出す際に詳細情報を表示するための設定。 +LocalizedDescription.ExportLegalityAlwaysVerbose=常に詳細な正規レポートを表示し、ホットキーの動作を反転して無効化するようにします。 +LocalizedDescription.ExportLegalityNeverClipboard=正規レポートをクリップボードへ出力するか確認するプロンプトを常にスキップします。 +LocalizedDescription.ExportLegalityVerboseProperties=詳細レポートの書き出し時に、出会い情報の全プロパティ(自動生成)を表示します。 +LocalizedDescription.ExtraProperties=標準で表示されるプロパティに加えて、追加で表示を試みる個体プロパティ。 +LocalizedDescription.FilterMismatchGrayscale=フィルターに一致しない個体に適用するグレースケール量(0.0 = グレースケールなし、1.0 = 完全なグレースケール)。 +LocalizedDescription.FilterMismatchOpacity=フィルターに一致しない個体の不透明度。 LocalizedDescription.FilterUnavailableSpecies=読み込まれているセーブファイルにインポートできないポケモンがいた場合、非表示にします。 LocalizedDescription.FlagIllegal=不正ポケモンのアイコンを表示。 -LocalizedDescription.FocusBorderDeflate=Focus border indentation for custom drawn image controls. +LocalizedDescription.FocusBorderDeflate=カスタム描画された画像コントロールのフォーカス枠の内側余白。 LocalizedDescription.ForceHaXOnLaunch=チートモードで起動 -LocalizedDescription.Gen7TransferStarPID=Severity to flag a Legality Check if Pokémon from Gen1/2 has a Star Shiny PID. -LocalizedDescription.Gen8MemoryMissingHT=Severity to flag a Legality Check if a Gen8 Memory is missing for the Handling Trainer. +LocalizedDescription.Gen7TransferStarPID=第1/2世代由来のポケモンが星型色違いPIDを持つ場合に、正規チェックで付ける警告レベル。 +LocalizedDescription.Gen8MemoryMissingHT=第8世代の思い出が現在の所持者に存在しない場合に、正規チェックで付ける警告レベル。 LocalizedDescription.HiddenPowerOnChangeMaxPower=めざパのタイプを変更した場合、自動的に個体値が最大化され、理想個体になります。それ以外の場合、個体値をなるべく正規にしてください。 -LocalizedDescription.HiddenProperties=Properties to hide from the report grid. -LocalizedDescription.HideEvent8Contains=Hide event variable names for that contain any of the comma-separated substrings below. Removes event values from the GUI that the user doesn't care to view. +LocalizedDescription.HiddenProperties=レポートグリッドで非表示にするプロパティ。 +LocalizedDescription.HideEvent8Contains=下のカンマ区切り文字列のいずれかを含むイベント変数名を非表示にします。GUIから不要なイベント値を取り除きます。 LocalizedDescription.HideSAVDetails=プログラム名の部分のセーブファイル情報を隠す。 LocalizedDescription.HideSecretDetails=マスクデータの一部(性格値等)を隠す。 -LocalizedDescription.HOMETransferTrackerNotPresent=Severity to flag a Legality Check if the HOME Tracker is Missing -LocalizedDescription.Hover=Settings for showing details when hovering a slot. +LocalizedDescription.HighDpiText=起動時にアプリケーションの高DPIレンダリングモードを切り替えます。 +LocalizedDescription.HOMETransferTrackerNotPresent=HOMEトラッカーが存在しない場合に、正規チェックで付ける警告レベル。 +LocalizedDescription.Hover=スロットにマウスオーバーしたときに詳細を表示するための設定。 LocalizedDescription.HoverSlotGlowEdges=マウスオーバー時に、対象のポケモンを点滅させる。 LocalizedDescription.HoverSlotPlayCry=マウスオーバー時に、鳴き声を再生。 LocalizedDescription.HoverSlotShowEncounter=マウスオーバー時に表示される情報に出会った場所等を追加。 -LocalizedDescription.HoverSlotShowEncounterVerbose=Show all Encounter Info properties on Hover -LocalizedDescription.HoverSlotShowLegalityHint=Show first Legality Check message if Illegal on Hover +LocalizedDescription.HoverSlotShowEncounterVerbose=マウスオーバー時に出会い情報の全プロパティを表示します。 +LocalizedDescription.HoverSlotShowLegalityHint=マウスオーバー時、不正なら最初の正規チェックメッセージを表示します。 LocalizedDescription.HoverSlotShowPreview=マウスオーバー時に、ポケモン情報を表示。(アイコン付き) LocalizedDescription.HoverSlotShowText=マウスオーバー時に、ポケモン情報をテキストのみで表示。 LocalizedDescription.IgnoreLegalPopup=「正規!」な場合にポップアップを表示しない。 LocalizedDescription.InitialSortMode=PKMデータベースのコンテンツを読み込む際のリストの表示順。 -LocalizedDescription.InvalidSelection=Background color of a ComboBox when the selected item is not valid. -LocalizedDescription.Language=Language to use when exporting a battle template. If not specified in settings, will use current language. +LocalizedDescription.InvalidSelection=選択項目が無効な場合のComboBoxの背景色。 +LocalizedDescription.Language=対戦用テンプレートを書き出す際に使用する言語。設定で未指定の場合は現在の言語を使用します。 LocalizedDescription.MarkBlue=青色のマーキング。 LocalizedDescription.MarkPink=ピンクのマーキング。 -LocalizedDescription.MGDatabasePath=Path to the Mystery Gift Database folder for storing extra mystery gift templates that aren't yet recognized. +LocalizedDescription.MGDatabasePath=まだ認識されていない追加のふしぎなおくりものテンプレートを保存するための、ふしぎなおくりものデータベースフォルダーのパス。 LocalizedDescription.ModifyUnset=未設定の変更を通知する。 LocalizedDescription.Nickname12=第1世代/第2世代のニックネームルール。 LocalizedDescription.Nickname3=第3世代のニックネームルール。 @@ -343,15 +344,15 @@ LocalizedDescription.OverrideGen1=1世代: セーブファイルの言語か LocalizedDescription.OverrideGen2=2世代: セーブファイルの言語かバージョンが分からない場合、代わりにこれらを使用します。 LocalizedDescription.OverrideGen3FRLG=Gen3 FRLG: セーブファイルの言語かバージョンが分からない場合、代わりにこれらを使用します。 LocalizedDescription.OverrideGen3RS=Gen3 RS: セーブファイルの言語かバージョンが分からない場合、代わりにこれらを使用します。 -LocalizedDescription.PathBlockKeyList=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. +LocalizedDescription.PathBlockKeyList=ブロックのハッシュ名ダンプを含むフォルダーのパス。特定のダンプファイルが存在しない場合は、プログラムのコード内で定義された名前のみを読み込みます。 LocalizedDescription.PlaySoundLegalityCheck=正規チェック時に音を鳴らす。 -LocalizedDescription.PlaySoundOther=Play Sound when performing any other action that would be reasonable to sound alert. +LocalizedDescription.PlaySoundOther=通知音が妥当なその他の操作を行った際に音を鳴らします。 LocalizedDescription.PlaySoundSAVLoad=ロード時に音を鳴らす。 -LocalizedDescription.PluginLoadEnable=Loads plugins from the plugins folder, assuming the folder exists. -LocalizedDescription.PluginLoadMerged=Loads any plugins that were merged into the main executable file. -LocalizedDescription.PluginPath=Path to the plugins folder. -LocalizedDescription.PreviewCursorShift=Show a Glow effect around the PKM on Hover -LocalizedDescription.PreviewShowPaste=Show Showdown Paste in special Preview on Hover +LocalizedDescription.PluginLoadEnable=plugins フォルダーが存在する場合、そのフォルダーからプラグインを読み込みます。 +LocalizedDescription.PluginLoadMerged=メイン実行ファイルに統合されたプラグインを読み込みます。 +LocalizedDescription.PluginPath=plugins フォルダーのパス。 +LocalizedDescription.PreviewCursorShift=マウスオーバー時にPKMの周囲へ光るエフェクトを表示します。 +LocalizedDescription.PreviewShowPaste=マウスオーバー時の特別プレビューでShowdown Pasteを表示します。 LocalizedDescription.RecentlyLoadedMaxCount=最近開いたファイルを記録する数。 LocalizedDescription.ResultsGridRowCount=スプライトグリッドの表示行数。5から20の範囲に制限されます。 LocalizedDescription.RetainMetDateTransfer45=4世代から5世代に送った時、であった場所を保持する。 @@ -360,12 +361,12 @@ 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. +LocalizedDescription.SearchBackups=PKMデータベースの内容を読み込む際、バックアップのセーブファイル内も検索します。 +LocalizedDescription.SearchExtraSaves=PKMデータベースの内容を読み込む際、OtherBackupPaths 内も検索します。 +LocalizedDescription.SearchExtraSavesDeep=PKMデータベースの内容を読み込む際、OtherBackupPaths 内のサブフォルダーも検索します。 LocalizedDescription.SetUpdateDex=ポケモン図鑑に反映。 LocalizedDescription.SetUpdatePKM=PKM情報の変更。 -LocalizedDescription.SetUpdateRecords=Automatically increment the Save File's counters for obtained Pokémon (eggs/captures) when injecting a PKM. +LocalizedDescription.SetUpdateRecords=PKMを注入した際、入手したポケモン数(タマゴ/捕獲)のセーブカウンターを自動的に増加させます。 LocalizedDescription.ShinyDefault=Unicodeを使用していない時の色違いのアイコン。 LocalizedDescription.ShinySprites=アイコンに色違いを反映。 LocalizedDescription.ShinyUnicode=Unicodeを使用している時の色違いのアイコン。 @@ -373,9 +374,9 @@ LocalizedDescription.ShowChangelogOnUpdate=新しいバージョンを起動す LocalizedDescription.ShowEggSpriteAsHeldItem=タマゴのスプライトを持ち物と同じように表示します。 LocalizedDescription.ShowEncounterBall=エンカウントテンプレートで捕まえたボールを表示します。 LocalizedDescription.ShowEncounterColor=エカウントテンプレートでタイプを区別するため、背景を表示します。 -LocalizedDescription.ShowEncounterColorPKM=Show a background to differentiate the recognized Encounter Template type for PKM slots -LocalizedDescription.ShowEncounterOpacityBackground=Opacity for the Encounter Type background layer. -LocalizedDescription.ShowEncounterOpacityStripe=Opacity for the Encounter Type stripe layer. +LocalizedDescription.ShowEncounterColorPKM=PKMスロットで認識された出会いテンプレートの種類を区別するため、背景を表示します。 +LocalizedDescription.ShowEncounterOpacityBackground=出会いタイプ背景レイヤーの不透明度。 +LocalizedDescription.ShowEncounterOpacityStripe=出会いタイプのストライプレイヤーの不透明度。 LocalizedDescription.ShowEncounterThicknessStripe=エンカウントタイプのカラーストライプを表示する時のピクセルの太さ。 LocalizedDescription.ShowExperiencePercent=次のレベルに必要な経験値のストライプを表示します。 LocalizedDescription.ShowGenderGen1=1世代のゲームを編集時、2世代の条件でポケモンの性別を表示するかどうか。 @@ -384,21 +385,21 @@ LocalizedDescription.ShowStatusCondition=ポケモンの状態異常(ねむり LocalizedDescription.ShowTeraOpacityBackground=テラスタルタイプの背景レイヤーの不透明度。 LocalizedDescription.ShowTeraOpacityStripe=テラスタルタイプのストライプレイヤーの不透明度。 LocalizedDescription.ShowTeraThicknessStripe=テラスタルタイプを表示するときのピクセルの太さ。 -LocalizedDescription.ShowTeraType=Show a background to differentiate the Tera Type for PKM slots. -LocalizedDescription.SkipSplashScreen=Skips displaying the splash screen on Program Launch. -LocalizedDescription.SlotLegalityAlwaysVisible=Skips the context menu hotkey requirement and instead always presents the option to check legality of a slot. -LocalizedDescription.SoundPath=Path to the sounds folder for sounds to play when hovering over a slot (species cry). +LocalizedDescription.ShowTeraType=PKMスロットでテラスタイプを区別するため、背景を表示します。 +LocalizedDescription.SkipSplashScreen=プログラム起動時のスプラッシュ画面表示をスキップします。 +LocalizedDescription.SlotLegalityAlwaysVisible=コンテキストメニューのホットキー要件を省略し、スロットの正規チェック項目を常に表示します。 +LocalizedDescription.SoundPath=スロットにマウスオーバーした際に再生する音声(種族の鳴き声)用サウンドフォルダーのパス。 LocalizedDescription.SpritePreference=使用するスプライトの構築モードの選択。 -LocalizedDescription.StatsCustom=Custom stat labels and grammar. -LocalizedDescription.TemplatePath=Path to the template folder (with *.pk files) for initializing the PKM editor fields when a save file is loaded. -LocalizedDescription.TokenOrder=Display format to use when exporting a battle template from the program. -LocalizedDescription.TokenOrderCustom=Custom ordering for exporting a set, if chosen via export display style. -LocalizedDescription.TrainerPath=Path to the Trainers folder (with *.pk files) used for generating encounters with known Trainer data. +LocalizedDescription.StatsCustom=カスタムの能力名ラベルと文法。 +LocalizedDescription.TemplatePath=セーブファイル読み込み時にPKMエディターの項目初期化に使う、テンプレートフォルダー(*.pk ファイル入り)のパス。 +LocalizedDescription.TokenOrder=プログラムから対戦用テンプレートを書き出す際に使用する表示形式。 +LocalizedDescription.TokenOrderCustom=書き出し表示形式で選択した場合に使う、セット書き出し用のカスタム順序。 +LocalizedDescription.TrainerPath=既知のトレーナーデータで出会いを生成する際に使用する Trainers フォルダー(*.pk ファイル入り)のパス。 LocalizedDescription.TryDetectRecentSave=新しいファイルを開く時に、最後に保存されたセーブファイルを自動的に見つける。 LocalizedDescription.Unicode=Unicodeを使用するかどうか。 -LocalizedDescription.UseTabsAsCriteria=Use properties from the PKM Editor tabs to specify criteria like Gender and Nature when generating an encounter. -LocalizedDescription.UseTabsAsCriteriaAnySpecies=Use properties from the PKM Editor tabs even if the new encounter isn't the same evolution chain. -LocalizedDescription.Version=Last version that the program was run with. +LocalizedDescription.UseTabsAsCriteria=出会い生成時、性別や性格などの条件指定にPKMエディターの各タブの値を使用します。 +LocalizedDescription.UseTabsAsCriteriaAnySpecies=新しい出会いが同じ進化系統でない場合でも、PKMエディターの各タブの値を使用します。 +LocalizedDescription.Version=このプログラムを最後に実行したバージョン。 LocalizedDescription.VirtualConsoleSourceGen1=第1世代のポケモンを第7世代に送る際に設定するデフォルトのバージョン。 LocalizedDescription.VirtualConsoleSourceGen2=第2世代のポケモンを第7世代に送る際に設定するデフォルトのバージョン。 LocalizedDescription.ZeroHeightWeight=ポケモンの高さと重さがゼロの場合、正規チェックにフラグを立てる。 diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index 70be0dc0a..66ea1e680 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -305,6 +305,7 @@ LocalizedDescription.HiddenProperties=리포트 그리드에서 숨길 속성 LocalizedDescription.HideEvent8Contains=아래에 쉼표로 구분하여 입력한 문자열을 포함하는 이벤트 변수 이름을 숨깁니다. 사용자에게 불필요한 이벤트 값을 GUI에서 제거할 때 사용합니다. LocalizedDescription.HideSAVDetails=프로그램 제목에서 세이브 파일 상세 정보 숨기기 LocalizedDescription.HideSecretDetails=편집 시 비밀 정보 숨기기 +LocalizedDescription.HighDpiText=프로그램 시작 시 애플리케이션에 더 높은 DPI 렌더링 모드를 적용할지 전환합니다. LocalizedDescription.HOMETransferTrackerNotPresent=HOME 트래커가 없을 때 정합성 검사에서 표시할 경고 수준을 설정합니다. LocalizedDescription.Hover=슬롯에 마우스를 올렸을 때(호버) 표시할 상세 정보에 관한 설정입니다. LocalizedDescription.HoverSlotGlowEdges=마우스 오버 시 포켓몬 빛내기 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index f2278b246..abd30312f 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -305,6 +305,7 @@ LocalizedDescription.HiddenProperties=报告网格中要隐藏的属性。 LocalizedDescription.HideEvent8Contains=隐藏不需要展示的活动名称,输入格式以逗号分隔。 LocalizedDescription.HideSAVDetails=隐藏程序标题中的保存文件详细信息。 LocalizedDescription.HideSecretDetails=在编辑器中隐藏秘密细节。 +LocalizedDescription.HighDpiText=在程序启动时切换是否为应用程序启用更高的 DPI 渲染模式。 LocalizedDescription.HOMETransferTrackerNotPresent=如果HOME追踪丢失,则标记合法性检查的严重性。 LocalizedDescription.Hover=悬停至栏位时显示详细信息的相关设置。 LocalizedDescription.HoverSlotGlowEdges=在悬停时显示PKM闪烁。 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index 9a6280d5b..57d09c358 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -305,6 +305,7 @@ LocalizedDescription.HiddenProperties=報告網格中要隱藏的屬性。 LocalizedDescription.HideEvent8Contains=隱藏包含逗號分隔子串之活動名稱,並從GUI中移除不關心之活動名稱值。 LocalizedDescription.HideSAVDetails=隱藏程式標題中的儲存資料檔詳細資訊 LocalizedDescription.HideSecretDetails=在編輯器中隱藏秘密細節 +LocalizedDescription.HighDpiText=在程式啟動時切換是否為應用程式啟用更高的 DPI 渲染模式。 LocalizedDescription.HOMETransferTrackerNotPresent=HOME追蹤碼丟失合法性檢查等級。 LocalizedDescription.Hover=滑鼠懸停至欄位時顯示詳細資訊的相關設定。 LocalizedDescription.HoverSlotGlowEdges=在懸停時顯示PKM Glow From 801928d72c8ee1878457621773ad8c52205d996f Mon Sep 17 00:00:00 2001 From: abcboy101 <16735361+abcboy101@users.noreply.github.com> Date: Sat, 30 May 2026 12:21:47 -0400 Subject: [PATCH 53/81] Handle KOR Gen2 -> Gen1 transfers (#4814) Mirror the Korean detection logic in StringConverter2 in StringConverter1 --- PKHeX.Core/PKM/PK1.cs | 2 +- PKHeX.Core/PKM/Strings/StringConverter1.cs | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/PKHeX.Core/PKM/PK1.cs b/PKHeX.Core/PKM/PK1.cs index 4e8ef22f8..199daeaa6 100644 --- a/PKHeX.Core/PKM/PK1.cs +++ b/PKHeX.Core/PKM/PK1.cs @@ -12,7 +12,7 @@ public sealed class PK1 : GBPKML, IPersonalType public override int SIZE_STORED => Japanese ? PokeCrypto.SIZE_1JLIST : PokeCrypto.SIZE_1ULIST; public override int SIZE_PARTY => SIZE_STORED; - public override bool Korean => false; + public override bool Korean => !Japanese && StringConverter2KOR.IsHangul(OriginalTrainerTrash); public override EntityContext Context => EntityContext.Gen1; diff --git a/PKHeX.Core/PKM/Strings/StringConverter1.cs b/PKHeX.Core/PKM/Strings/StringConverter1.cs index a7ee5a973..d78fc95dc 100644 --- a/PKHeX.Core/PKM/Strings/StringConverter1.cs +++ b/PKHeX.Core/PKM/Strings/StringConverter1.cs @@ -93,6 +93,9 @@ public static bool IsG12German(ReadOnlySpan value) /// Decoded string. public static string GetString(ReadOnlySpan data, bool jp) { + if (!jp && StringConverter2KOR.IsHangul(data)) + return StringConverter2KOR.GetString(data); + Span result = stackalloc char[data.Length]; int length = LoadString(data, result, jp); return new string(result[..length]); @@ -105,6 +108,9 @@ public static string GetString(ReadOnlySpan data, bool jp) /// Character count loaded. public static int LoadString(ReadOnlySpan data, Span result, bool jp) { + if (!jp && StringConverter2KOR.IsHangul(data)) + return StringConverter2KOR.LoadString(data, result); + if (data.Length == 0) return 0; if (data[0] == TradeOTCode) // In-game Trade @@ -138,6 +144,9 @@ public static int LoadString(ReadOnlySpan data, Span result, bool jp public static int SetString(Span destBuffer, ReadOnlySpan value, int maxLength, bool jp, StringConverterOption option = StringConverterOption.Clear50) { + if (!jp && StringConverter2KOR.IsHangul(value)) + return StringConverter2KOR.SetString(destBuffer, value, maxLength, option); + if (option is StringConverterOption.ClearZero) destBuffer.Clear(); else if (option is StringConverterOption.Clear50) From 0b6a1accde0cc45bfc15a78c7a4eebb66826ce82 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 30 May 2026 18:51:39 -0500 Subject: [PATCH 54/81] Minor tweaks No functional change, extracting some APIs and adding more xmldoc Store potential learn source group as flags, might change later. --- PKHeX.Core/Editing/PKM/LegalMoveInfo.cs | 73 ++- .../{Inventory => Items/Bags}/PlayerBag.cs | 0 .../Encounters/Templates/Shared/Moveset.cs | 14 +- .../LearnSource/Group/LearnGroup9a.cs | 10 +- .../Restrictions/{ => Locale}/Locale3DS.cs | 0 .../Restrictions/Locale/LocaleNDS4.cs | 49 ++ .../Restrictions/Locale/LocaleNDS5.cs | 49 ++ .../Restrictions/{ => Locale}/Vivillon3DS.cs | 0 .../PKM/Util/Conversion/EntityConverter.cs | 9 +- PKHeX.Core/PKM/Util/EffortValues.cs | 2 +- PKHeX.Core/PKM/Util/EntityBlank.cs | 7 +- PKHeX.Core/PKM/Util/EntityDetection.cs | 11 +- PKHeX.Core/Saves/Pokeathlon4.cs | 615 ------------------ PKHeX.Core/Saves/SAV3.cs | 2 +- PKHeX.Core/Saves/SAV4BR.cs | 3 + PKHeX.Core/Saves/{Storage => }/SAV4Ranch.cs | 0 .../Saves/Substructures/Gen4/Accessory4.cs | 200 +++--- .../Saves/Substructures/Gen4/Backdrop4.cs | 38 +- .../Saves/Substructures/Gen4/Geonet4.cs | 43 +- .../Substructures/Gen4/PBR/BattlePassType.cs | 14 +- .../Substructures/Gen4/PBR/GearCategory.cs | 20 +- .../Gen4/Pokeathlon/Aprijuice4.cs | 48 ++ .../Gen4/Pokeathlon/DataCard4.cs | 45 ++ .../Gen4/Pokeathlon/Pokeathlon4.cs | 118 ++++ .../Gen4/Pokeathlon/PokeathlonConnection4.cs | 24 + .../Pokeathlon/PokeathlonCourseRecord4.cs | 24 + .../Gen4/Pokeathlon/PokeathlonEvent4.cs | 20 + .../Gen4/Pokeathlon/PokeathlonEventData4.cs | 21 + .../Gen4/Pokeathlon/PokeathlonEventRecord4.cs | 31 + .../Pokeathlon/PokeathlonEventTrainer4.cs | 25 + .../Pokeathlon/PokeathlonGlobalCounters4.cs | 178 +++++ .../Pokeathlon/PokeathlonMedalManager4.cs | 66 ++ .../Gen4/Pokeathlon/PokeathlonParticipant4.cs | 27 + .../Gen4/Pokeathlon/PokeathlonStat4.cs | 15 + .../Gen4/Pokeathlon/SpeciesForm10.cs | 16 + PKHeX.Core/Saves/Substructures/Gen4/Seal4.cs | 162 ++--- .../Saves/Substructures/Gen5/UnityTower5.cs | 40 +- PKHeX.Core/Util/BinaryCodedDecimal.cs | 10 +- PKHeX.Core/Util/ReflectUtil.cs | 6 + .../PokeathlonEventTrainer4Editor.cs | 29 +- .../Subforms/Save Editors/Gen4/SAV_Geonet4.cs | 4 +- .../Save Editors/Gen5/SAV_UnityTower.cs | 6 +- 42 files changed, 1083 insertions(+), 991 deletions(-) rename PKHeX.Core/{Inventory => Items/Bags}/PlayerBag.cs (100%) rename PKHeX.Core/Legality/Restrictions/{ => Locale}/Locale3DS.cs (100%) create mode 100644 PKHeX.Core/Legality/Restrictions/Locale/LocaleNDS4.cs create mode 100644 PKHeX.Core/Legality/Restrictions/Locale/LocaleNDS5.cs rename PKHeX.Core/Legality/Restrictions/{ => Locale}/Vivillon3DS.cs (100%) delete mode 100644 PKHeX.Core/Saves/Pokeathlon4.cs rename PKHeX.Core/Saves/{Storage => }/SAV4Ranch.cs (100%) create mode 100644 PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/Aprijuice4.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/DataCard4.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/Pokeathlon4.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonConnection4.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonCourseRecord4.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEvent4.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEventData4.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEventRecord4.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEventTrainer4.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonGlobalCounters4.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonMedalManager4.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonParticipant4.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonStat4.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/SpeciesForm10.cs diff --git a/PKHeX.Core/Editing/PKM/LegalMoveInfo.cs b/PKHeX.Core/Editing/PKM/LegalMoveInfo.cs index 1c8fe88c5..3994c4dc3 100644 --- a/PKHeX.Core/Editing/PKM/LegalMoveInfo.cs +++ b/PKHeX.Core/Editing/PKM/LegalMoveInfo.cs @@ -18,7 +18,14 @@ public sealed class LegalMoveInfo /// /// Move to check if it can be learned /// True if it can learn the move - public bool CanLearn(ushort move) => AllowedMoves[move] != None; + public bool CanLearn(ushort move) => GetMoveSources(move) != None; + + /// + /// Returns the sources that allow the provided move to be learned, or if it cannot be learned. + /// + /// Move to check the sources for + /// Sources that allow the move to be learned + public IndicatedSourceType GetMoveSources(ushort move) => AllowedMoves[move]; /// /// Reloads the legality sources to permit the provided legal info. @@ -57,58 +64,54 @@ public bool ReloadMoves(LegalityAnalysis la) private static void ComputeEval(Span type, ReadOnlySpan learn, LegalityAnalysis la) { - for (int i = 0; i < type.Length; i++) + // Wipe or set as learnable based on learnability; encounter moves will be added later. + for (int i = 1; i < type.Length; i++) type[i] = learn[i] ? Learn : None; + // If the original moveset is deleted, then encounter moves are not relevant to legality and should not be added. if (!la.Entity.IsOriginalMovesetDeleted()) AddEncounterMoves(type, la.EncounterOriginal); type[0] = None; // Move ID 0 is always None } - private static void AddEncounterMoves(Span type, IEncounterTemplate enc) + private static void AddEncounterMoves(Span result, IEncounterTemplate enc) { - if (enc is IEncounterEgg egg) - { - var moves = egg.Learn.GetEggMoves(enc.Species, enc.Form); - foreach (var move in moves) - type[move] = Egg; - } - else if (enc is IMoveset {Moves: {HasMoves: true} set}) - { - foreach (var move in set.AsSpan()) - { - if (type[move] == None) - type[move] = Encounter; - } - } - else if (enc is ISingleMoveBonus single) - { - var moves = single.GetMoveBonusPossible(); - foreach (var move in moves) - { - if (type[move] == None) - type[move] = EncounterSingle; - } - } + if (enc is IRelearn { Relearn: { HasMoves: true } relearn }) + relearn.FlagMoves(result, Relearn); - if (enc is IRelearn { Relearn: {HasMoves: true} relearn}) + if (enc is IEncounterEgg egg) + FlagMoves(result, Egg, egg.Learn.GetEggMoves(enc.Species, enc.Form)); + else if (enc is IMoveset { Moves: { HasMoves: true } set}) + set.FlagMoves(result, Encounter); + else if (enc is ISingleMoveBonus { IsMoveBonusPossible: true } single) + FlagIfNone(result, EncounterSingle, single.GetMoveBonusPossible()); + + return; + + static void FlagMoves(Span result, IndicatedSourceType flag, ReadOnlySpan moves) { - foreach (var move in relearn.AsSpan()) + foreach (var move in moves) + result[move] |= flag; + } + static void FlagIfNone(Span result, IndicatedSourceType flag, ReadOnlySpan moves) + { + foreach (var move in moves) { - if (type[move] == None) - type[move] = Relearn; + if (result[move] == None) + result[move] |= flag; } } } } +[Flags] public enum IndicatedSourceType : byte { None = 0, - Learn, - Egg, - Encounter, - EncounterSingle, - Relearn, + Learn = 1 << 0, + Egg = 1 << 1, + Encounter = 1 << 2, + EncounterSingle = 1 << 3, + Relearn = 1 << 4, } diff --git a/PKHeX.Core/Inventory/PlayerBag.cs b/PKHeX.Core/Items/Bags/PlayerBag.cs similarity index 100% rename from PKHeX.Core/Inventory/PlayerBag.cs rename to PKHeX.Core/Items/Bags/PlayerBag.cs diff --git a/PKHeX.Core/Legality/Encounters/Templates/Shared/Moveset.cs b/PKHeX.Core/Legality/Encounters/Templates/Shared/Moveset.cs index 5ec390202..fe3a57acb 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Shared/Moveset.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Shared/Moveset.cs @@ -39,12 +39,6 @@ namespace PKHeX.Core; /// True if any move is above the maximum; otherwise, false. public bool AnyAbove(ushort max) => Move1 > max || Move2 > max || Move3 > max || Move4 > max; - /// - /// Returns the moveset as an array of four move IDs. - /// - /// An array containing the four move IDs. - public ushort[] ToArray() => [Move1, Move2, Move3, Move4]; - /// /// Gets a read-only span view of the moveset's four move IDs. /// @@ -176,4 +170,12 @@ public void FlagMoves(Span result) result[Move3] = true; result[Move4] = true; } + + public void FlagMoves(Span result, IndicatedSourceType value) + { + result[Move1] |= value; + result[Move2] |= value; + result[Move3] |= value; + result[Move4] |= value; + } } diff --git a/PKHeX.Core/Legality/LearnSource/Group/LearnGroup9a.cs b/PKHeX.Core/Legality/LearnSource/Group/LearnGroup9a.cs index 576ed1002..141551a3d 100644 --- a/PKHeX.Core/Legality/LearnSource/Group/LearnGroup9a.cs +++ b/PKHeX.Core/Legality/LearnSource/Group/LearnGroup9a.cs @@ -109,14 +109,8 @@ private static void GetAllMovesInternal(Span result, PKM pk, EvoCriteria e private static void FlagEncounterMoves(IEncounterTemplate enc, Span result) { if (enc is IMoveset { Moves: { HasMoves: true } x }) - { - foreach (var move in x.AsSpan()) - result[move] = true; - } + x.FlagMoves(result); if (enc is IRelearn { Relearn: { HasMoves: true } r }) - { - foreach (var move in r.AsSpan()) - result[move] = true; - } + r.FlagMoves(result); } } diff --git a/PKHeX.Core/Legality/Restrictions/Locale3DS.cs b/PKHeX.Core/Legality/Restrictions/Locale/Locale3DS.cs similarity index 100% rename from PKHeX.Core/Legality/Restrictions/Locale3DS.cs rename to PKHeX.Core/Legality/Restrictions/Locale/Locale3DS.cs diff --git a/PKHeX.Core/Legality/Restrictions/Locale/LocaleNDS4.cs b/PKHeX.Core/Legality/Restrictions/Locale/LocaleNDS4.cs new file mode 100644 index 000000000..a2a65b462 --- /dev/null +++ b/PKHeX.Core/Legality/Restrictions/Locale/LocaleNDS4.cs @@ -0,0 +1,49 @@ +using System; + +namespace PKHeX.Core; + +/// +/// Provides information for Geonet/Battle Revolution player location information. +/// +/// These values were specific to the NDS games (Generation 4) +public static class LocaleNDS4 +{ + public const int CountryCount = 233; + public const int Japan = 103; + + public static ReadOnlySpan LegalCountries => + [ + 001, 002, 003, 006, 008, 009, 012, 013, 015, 016, 017, 018, 020, 021, 022, 023, + 025, 027, 028, 029, 031, 033, 034, 035, 036, 040, 042, 043, 045, 048, 049, 050, + 052, 054, 055, 056, 058, 059, 060, 061, 062, 069, 070, 071, 072, 074, 077, 078, + 079, 080, 081, 082, 083, 085, 086, 088, 089, 090, 091, 092, 093, 094, 095, 097, + 098, 100, 101, 102, 103, 104, 107, 111, 115, 117, 118, 121, 122, 126, 129, 131, + 133, 135, 140, 142, 146, 148, 149, 150, 151, 152, 156, 157, 158, 160, 161, 163, + 164, 166, 167, 110, 171, 172, 179, 183, 186, 187, 188, 189, 192, 193, 194, 196, + 198, 199, 200, 202, 205, 207, 211, 212, 216, 218, 219, 204, 221, 220, 222, 224, + 226, 227, + ]; + + public static byte GetSubregionCount(byte country) => country switch + { + 009 => 24, // Argentina + 012 => 7, // Australia + 028 => 27, // Brazil + 036 => 13, // Canada + 043 => 31, // China + 070 => 6, // Finland + 071 => 22, // France + 077 => 16, // Germany + 094 => 35, // India + 101 => 20, // Italy + 103 => 50, // Japan + 156 => 20, // Norway + 166 => 16, // Poland + 172 => 7, // Russian Federation + 193 => 17, // Spain + 199 => 24, // Sweden + 219 => 12, // United Kingdom + 220 => 51, // United States of America + _ => 0, + }; +} diff --git a/PKHeX.Core/Legality/Restrictions/Locale/LocaleNDS5.cs b/PKHeX.Core/Legality/Restrictions/Locale/LocaleNDS5.cs new file mode 100644 index 000000000..266ca2ea2 --- /dev/null +++ b/PKHeX.Core/Legality/Restrictions/Locale/LocaleNDS5.cs @@ -0,0 +1,49 @@ +using System; + +namespace PKHeX.Core; + +/// +/// Provides information for Unity Tower player location information. +/// +/// These values were specific to the NDS games (Generation 5) +public static class LocaleNDS5 +{ + public const int CountryCount = 232; + public const int Japan = 105; + + public static ReadOnlySpan LegalCountries => + [ + 001, 002, 003, 006, 008, 009, 012, 013, 015, 016, 017, 018, 020, 021, 022, 023, + 025, 027, 028, 029, 031, 033, 034, 035, 036, 040, 042, 043, 045, 047, 048, 049, + 051, 053, 054, 058, 060, 061, 062, 063, 064, 071, 072, 073, 074, 076, 079, 080, + 081, 082, 083, 084, 085, 087, 088, 090, 091, 092, 093, 094, 095, 096, 098, 099, + 101, 102, 103, 105, 106, 109, 111, 115, 117, 118, 121, 125, 128, 130, 132, 134, + 138, 139, 141, 145, 147, 148, 149, 150, 151, 155, 156, 157, 160, 161, 163, 164, + 166, 167, 170, 173, 174, 181, 185, 186, 188, 189, 190, 191, 194, 195, 196, 198, + 199, 200, 201, 203, 205, 206, 210, 211, 215, 217, 218, 219, 220, 221, 222, 224, + 226, 227, + ]; + + public static byte GetSubregionCount(byte country) => country switch + { + 009 => 24, // Argentina + 012 => 8, // Australia + 028 => 27, // Brazil + 036 => 13, // Canada + 043 => 33, // China + 072 => 6, // Finland + 073 => 22, // France + 079 => 16, // Germany + 095 => 35, // India + 102 => 20, // Italy + 105 => 50, // Japan + 155 => 22, // Norway + 166 => 16, // Poland + 174 => 8, // Russian Federation + 195 => 17, // Spain + 200 => 22, // Sweden + 218 => 12, // United Kingdom + 220 => 51, // United States of America + _ => 0, + }; +} diff --git a/PKHeX.Core/Legality/Restrictions/Vivillon3DS.cs b/PKHeX.Core/Legality/Restrictions/Locale/Vivillon3DS.cs similarity index 100% rename from PKHeX.Core/Legality/Restrictions/Vivillon3DS.cs rename to PKHeX.Core/Legality/Restrictions/Locale/Vivillon3DS.cs diff --git a/PKHeX.Core/PKM/Util/Conversion/EntityConverter.cs b/PKHeX.Core/PKM/Util/Conversion/EntityConverter.cs index f04f47552..5132f4d1f 100644 --- a/PKHeX.Core/PKM/Util/Conversion/EntityConverter.cs +++ b/PKHeX.Core/PKM/Util/Conversion/EntityConverter.cs @@ -337,14 +337,17 @@ public static bool TryMakePKMCompatible(PKM pk, PKM target, out EntityConverterR /// /// Checks if a is incompatible with the Generation 1/2 destination environment. /// + /// Target type PKM with misc properties accessible for checking. + /// Whether the destination environment is Japanese + /// Whether the source PKM is Japanese public static bool IsCompatibleGB(PKM pk, bool destJapanese, bool srcJapanese) { if (pk.Format > 2) - return true; + return true; // Upwards transfers are unaffected by language, and Gen3+ can represent all languages. if (destJapanese == srcJapanese) - return true; + return true; // Can trade between same language sets. if (pk is SK2 sk2 && sk2.IsPossible(srcJapanese)) - return true; + return true; // Language differentiation return false; } } diff --git a/PKHeX.Core/PKM/Util/EffortValues.cs b/PKHeX.Core/PKM/Util/EffortValues.cs index c06399d2a..5904496c4 100644 --- a/PKHeX.Core/PKM/Util/EffortValues.cs +++ b/PKHeX.Core/PKM/Util/EffortValues.cs @@ -198,7 +198,7 @@ public static bool IsChampions(ReadOnlySpan evs) } /// -/// Assessment of the total EVs, compared to the maximum allowed. +/// Assessment of the total EVs (Gen3+), compared to the maximum allowed. /// public enum EffortValueGrade { diff --git a/PKHeX.Core/PKM/Util/EntityBlank.cs b/PKHeX.Core/PKM/Util/EntityBlank.cs index 4a1e742ee..bc0cc10fd 100644 --- a/PKHeX.Core/PKM/Util/EntityBlank.cs +++ b/PKHeX.Core/PKM/Util/EntityBlank.cs @@ -12,7 +12,10 @@ public static class EntityBlank /// /// Type of instance desired. /// New instance of a blank object. - public static PKM GetBlank(Type type) => type.Name switch + public static PKM GetBlank(Type type) => GetBlank(type.Name); + + /// + public static PKM GetBlank(ReadOnlySpan type) => type switch { nameof(PK1) => new PK1(), nameof(PK2) => new PK2(), @@ -33,7 +36,7 @@ public static class EntityBlank nameof(PK9) => new PK9(), nameof(PA9) => new PA9(), nameof(PKH) => new PKH(), - _ => throw new ArgumentOutOfRangeException(nameof(type), type, null), + _ => throw new ArgumentOutOfRangeException(nameof(type), type.ToString(), null), }; /// diff --git a/PKHeX.Core/PKM/Util/EntityDetection.cs b/PKHeX.Core/PKM/Util/EntityDetection.cs index dfd4ca686..a08dfb195 100644 --- a/PKHeX.Core/PKM/Util/EntityDetection.cs +++ b/PKHeX.Core/PKM/Util/EntityDetection.cs @@ -49,12 +49,17 @@ SIZE_5PARTY or /// public static bool IsPresentSAV4Ranch(ReadOnlySpan data) => IsPresent(data) && ReadUInt32BigEndian(data) != 0x28; // Species non-zero, ignore file end marker + /// + /// Checks the PID and species of the Gen4+ entity to determine if it is present. + /// public static bool IsPresent(ReadOnlySpan data) { if (ReadUInt32LittleEndian(data) != 0) // PID - return true; - ushort species = ReadUInt16LittleEndian(data[8..]); - return species != 0; + return true; // Empty slots are 0x00000000 PID. + + // A PID of 0x00000000 is possible to naturally occur; encryption/shuffle does not impact the first 2 bytes (species). + // The data occupying the species field can be immediately read; non-zero confirms species is present. + return ReadUInt16LittleEndian(data[8..]) != 0; } /// diff --git a/PKHeX.Core/Saves/Pokeathlon4.cs b/PKHeX.Core/Saves/Pokeathlon4.cs deleted file mode 100644 index bd3e347b8..000000000 --- a/PKHeX.Core/Saves/Pokeathlon4.cs +++ /dev/null @@ -1,615 +0,0 @@ -using System; -using static System.Buffers.Binary.BinaryPrimitives; - - -namespace PKHeX.Core; - -/// -/// Manages the Pokeathlon Data for -/// -public sealed class Pokeathlon4(Memory Raw) // 0xD9D4 within SAV4HGSS -{ - public const int SIZE = 0xB80; - - public Span Data => Raw.Span; - - // 5 courses to store record data - public PokeathlonCourseRecord4 GetCourseRecord(PokeathlonStat4 index) - { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonStat4.Count); - return new(Raw.Slice((int)index * PokeathlonCourseRecord4.SIZE, PokeathlonCourseRecord4.SIZE)); - } - - // 0xDC, 0xDAB0 within SAV - public PokeathlonMedalManager4 Medals => new(Raw.Slice(0xDC, PokeathlonMedalManager4.SIZE)); - // 3 bytes alignment - - // 0x2CC, 0xDCA0 within SAV - public PokeathlonEventData4 GetEventSelf(PokeathlonEvent4 index) - { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); - return new(Raw.Slice(0x2CC + ((int)index * PokeathlonEventData4.SIZE), PokeathlonEventData4.SIZE)); - } - - // 0x484, 0xDE58 within SAV - public PokeathlonConnection4 GetEventConnection(PokeathlonEvent4 index) - { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); - return new(Raw.Slice(0x484 + ((int)index * PokeathlonConnection4.SIZE), PokeathlonConnection4.SIZE)); - } - - // 0xAEC, 0xE4C0 within SAV - - /// - /// Player's highest score for each of the ten individual events (after conversion to Athlete Points) - /// - public ushort GetBestScore(PokeathlonEvent4 index) - { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); - return ReadUInt16LittleEndian(Data[(0xAEC + ((int)index * 2))..]); - } - - public void SetBestScore(PokeathlonEvent4 index, ushort score) - { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); - WriteUInt16LittleEndian(Data[(0xAEC + ((int)index * 2))..], score); - } - - // 0xB00, 0xE4D4 within SAV global counters - public PokeathlonGlobalCounters4 GlobalCounters => new(Raw.Slice(0xB00, PokeathlonGlobalCounters4.SIZE)); - - // remainder @ 0xE548 - public const uint MaxPoints = 99_999; - - /// - /// Current points count accumulated, used in buying items from shops. - /// - public uint Points { get => ReadUInt32LittleEndian(Data[0xB74..]); set => WriteUInt32LittleEndian(Data[0xB74..], Math.Min(MaxPoints, value)); } - - /// - /// Obtained Data Card indexes [0,26], where each bit represents whether a Data Card has been obtained or not. - /// They can be purchased in exchange for points in the Pokéathlon Dome (sold at the central reception desk). - /// - public uint FlagsDataCard { get => ReadUInt32LittleEndian(Data[0xB78..]); set => WriteUInt32LittleEndian(Data[0xB78..], Math.Min(DataCardAllObtained, value)); } - - // items exist as Key Items, not really advisable to have a one-shot method unlock, end-user implementation beware. - public const uint DataCardAllObtained = 0x07FFFFFFu; // 27 bits, all obtained - - /// - /// Once-daily shop purchase flags for the Athlete Shop. - /// Since shops only have 12 items daily, only 12 bits are used. - /// - public ushort FlagsDailyShop { get => ReadUInt16LittleEndian(Data[0xB7C..]); set => WriteUInt16LittleEndian(Data[0xB7C..], Math.Min(FlagsShopAllObtained, value)); } - public const ushort FlagsShopAllObtained = 0x0FFF; // 12 bits, all obtained - - // last 2 bytes unused, total size 0xB80 - - /// - /// The global Pokéathlon score is calculated as the sum of: - /// - the player's best final score in each of the five courses, - /// - the player's highest score for each of the ten individual events (after conversion to Athlete Points), - /// - the total number of medals displayed in the box in the Trust room (so each Medalist species will add five to this total). - /// - public uint CalculateGlobalScore() - { - uint result = 0; - for (PokeathlonStat4 i = 0; i < PokeathlonStat4.Count; i++) - result += GetCourseRecord(i).ScoreMax; - result += Medals.GetTotalCount(); - for (PokeathlonEvent4 i = 0; i < PokeathlonEvent4.Count; i++) - result += GetBestScore(i); - return result; - } - - public static ReadOnlySpan FriendshipTrophyThresholds => [3000, 3100, 3200, 3300, 3400, 3600, 3800, 4000, 4200, 4500]; - - public static int CalculateFriendshipTrophyCount(uint globalScore) - { - int result = 0; - foreach (var threshold in FriendshipTrophyThresholds) - { - if (globalScore >= threshold) - result++; - else - break; - } - return result; // 10 max - } -} - -public struct PokeathlonCourseRecord4(Memory Raw) -{ - public const int SIZE = 0x2C; - - private Span Data => Raw.Span; - - public ushort Score0 { get => ReadUInt16LittleEndian(Data); set => WriteUInt16LittleEndian(Data, value); } - public ushort Score1 { get => ReadUInt16LittleEndian(Data[2..]); set => WriteUInt16LittleEndian(Data[2..], value); } - public ushort Score2 { get => ReadUInt16LittleEndian(Data[4..]); set => WriteUInt16LittleEndian(Data[4..], value); } - public ushort ScoreMax { get => ReadUInt16LittleEndian(Data[6..]); set => WriteUInt16LittleEndian(Data[6..], value); } - - public const int CountParticipant = 3; - - public PokeathlonParticipant4 GetParticipant(int index) - { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, CountParticipant); - return new(Raw.Slice(8 + (index * PokeathlonParticipant4.SIZE), PokeathlonParticipant4.SIZE)); - } -} - -public struct PokeathlonParticipant4(Memory Raw) : ISpeciesForm, ITrainerID32, IFixedGender, IShiny -{ - public const int SIZE = 0xC; - - private Span Data => Raw.Span; - - private uint Packed { get => ReadUInt32LittleEndian(Data); set => WriteUInt32LittleEndian(Data, value); } - public ushort Species { get => (ushort)(Packed & 0x1FF); set => Packed = (Packed & ~0x1FFu) | ((uint)value & 0x1FF); } - public byte Form { get => (byte)((Packed >> 9) & 0x1F); set => Packed = (Packed & ~(0x1Fu << 9)) | (((uint)value & 0x1F) << 9); } - public byte Gender { get => (byte)((Packed >> 14) & 0x3); set => Packed = (Packed & ~(0x3u << 14)) | (((uint)value & 0x3) << 14); } - public bool IsShiny { get => ((Packed >> 16) & 0x1) != 0; set => Packed = (Packed & ~(0x1u << 16)) | ((value ? 1u : 0u) << 16); } - // remainder of bits unused - - /// - public uint EncryptionConstant { get => ReadUInt32LittleEndian(Data[4..]); set => WriteUInt32LittleEndian(Data[4..], value); } - - /// - public uint ID32 { get => ReadUInt32LittleEndian(Data[8..]); set => WriteUInt32LittleEndian(Data[8..], value); } - public ushort TID16 { get => ReadUInt16LittleEndian(Data[8..]); set => WriteUInt16LittleEndian(Data[8..], value); } - public ushort SID16 { get => ReadUInt16LittleEndian(Data[10..]); set => WriteUInt16LittleEndian(Data[10..], value); } - public TrainerIDFormat TrainerIDDisplayFormat => TrainerIDFormat.SixteenBit; -} - -/// -/// Stores a bitflag medal completion state for all species. -/// -/// -/// for bitflag indexes. -/// -public struct PokeathlonMedalManager4(Memory Raw) -{ - public const int SIZE = 493; // 1-indexed species [Bulbasaur..Arceus] - public const byte MaxMedalBits = 0b11111; // 5 courses, 5 bits per species - - public Span Data => Raw.Span; - - /// - /// Retrieves the medal bits for the given species, where each bit represents whether a medal for a particular course has been obtained or not. - /// - public byte GetMedal(ushort species) - { - species--; - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(species, (ushort)Legal.MaxSpeciesID_4); - return Data[species]; - } - - /// - /// Updates the medal bits for the given species. - /// - public void SetMedal(ushort species, byte medalBits) - { - species--; - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(species, (ushort)Legal.MaxSpeciesID_4); - Data[species] = medalBits; - } - - /// - /// Awards the provided bit(s) to the species. - /// - public void AwardMedal(ushort species, byte medalBit) - { - species--; - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(species, (ushort)Legal.MaxSpeciesID_4); - Data[species] |= medalBit; - } - - /// - /// Awards all medals to all species (complete). - /// - /// Medal value to set to every species entry. - public void SetAllMedals(byte medalBits = MaxMedalBits) => Data[..SIZE].Fill(medalBits); - - /// - /// Removes all medals from all species (resets progress). - /// - public void Clear() => SetAllMedals(0); - - public uint GetTotalCount() - { - uint result = 0; - foreach (var bits in Data[..SIZE]) - result += (uint)System.Numerics.BitOperations.PopCount((uint)bits & MaxMedalBits); - return result; - } -} - -public struct PokeathlonEventData4(Memory Raw) -{ - public const int SIZE = 0x2C; - public const uint MaxAttempts = 9_999_999; - public const uint MaxRecord = 5; - - public Span Data => Raw.Span; - - public PokeathlonEventRecord4 GetRecord(int index) - { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, MaxRecord); - return new(Raw.Slice(index * PokeathlonEventRecord4.SIZE, PokeathlonEventRecord4.SIZE)); - } - - public uint Attempts { get => ReadUInt32LittleEndian(Data[0x28..]); set => WriteUInt32LittleEndian(Data[0x28..], Math.Min(MaxAttempts, value)); } -} - -public struct PokeathlonConnection4(Memory Raw) -{ - public const int SIZE = 0xA4; - - public const uint MaxTrainer = PokeathlonEventData4.MaxRecord; - - public Span Data => Raw.Span; - - public PokeathlonEventData4 Inner => new(Raw.Slice(0 * PokeathlonEventData4.SIZE, PokeathlonEventData4.SIZE)); - - /// - /// Correlated to the indexed records. - /// - public PokeathlonEventTrainer4 GetTrainer(int index) - { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, MaxTrainer); - return new(Raw.Slice(0x2C + (index * PokeathlonEventTrainer4.SIZE), PokeathlonEventTrainer4.SIZE)); - } -} - -public struct PokeathlonEventTrainer4(Memory Raw) : ITrainerID32 -{ - public const int SIZE = 0x18; - public Span Data => Raw.Span; - public uint ID32 { get => ReadUInt32LittleEndian(Data); set => WriteUInt32LittleEndian(Data, value); } - public ushort TID16 { get => ReadUInt16LittleEndian(Data); set => WriteUInt16LittleEndian(Data, value); } - public ushort SID16 { get => ReadUInt16LittleEndian(Data[2..]); set => WriteUInt16LittleEndian(Data[2..], value); } - public TrainerIDFormat TrainerIDDisplayFormat => TrainerIDFormat.SixteenBit; - - public Span OriginalTrainerTrash => Data.Slice(8, 8 * sizeof(ushort)); - - public byte Language { get => Data[0x14]; set => Data[0x14] = value; } - // remaining 3 bytes unused - - public string OT - { - get => StringConverter4.GetString(OriginalTrainerTrash); - set => StringConverter4.SetString(OriginalTrainerTrash, value, 7, Language); - } -} - -/// -/// Event record storage for a given event type. -/// -/// -/// -/// -/// -public struct PokeathlonEventRecord4(Memory Raw) -{ - public const int SIZE = 8; - - public Span Data => Raw.Span; - - /// - /// Stores the record for the particular event. The meaning of this value depends on the event type. - /// - /// - /// Hurdle Dash: Time in frames (lower is better). - /// - public ushort Record { get => ReadUInt16LittleEndian(Data); set => WriteUInt16LittleEndian(Data, value); } - - // team of three Pokémon responsible for this record, simply (species,form)*3. - public SpeciesForm10 Entry0 { get => ReadUInt16LittleEndian(Data[2..]); set => WriteUInt16LittleEndian(Data[2..], value); } - public SpeciesForm10 Entry1 { get => ReadUInt16LittleEndian(Data[4..]); set => WriteUInt16LittleEndian(Data[4..], value); } - public SpeciesForm10 Entry2 { get => ReadUInt16LittleEndian(Data[6..]); set => WriteUInt16LittleEndian(Data[6..], value); } -} - -public record struct SpeciesForm10(ushort Value) : ISpeciesForm -{ - // 10 bits species - public ushort Species { get => (ushort)(Value & 0x3FF); set => Value = (ushort)((Value & ~0x3FF) | (value & 0x3FF)); } - public byte Form { get => (byte)((Value >> 10) & 0x3F); set => Value = (ushort)((Value & ~(0x3Fu << 10)) | ((((uint)value & 0x3F) << 10))); } - - /// - /// Useful sanity check. - /// - public bool IsValid => Value is 0 || (Species != 0 && PersonalTable.HGSS.IsPresentInGame(Species, Form)); - - public static implicit operator SpeciesForm10(ushort value) => new(value); - public static implicit operator ushort(SpeciesForm10 value) => value.Value; -} - -public struct PokeathlonGlobalCounters4(Memory Raw) -{ - public const int SIZE = 0x74; - public Span Data => Raw.Span; - - public const uint MaxPlay = 59_999; - public const uint MaxStat = 9_999_999; - public const uint MaxFame = ushort.MaxValue; - - /// Time Spent in Pokéathlon, in minutes - public uint TimeSpent { get => ReadUInt32LittleEndian(Data); set => WriteUInt32LittleEndian(Data, Math.Min(MaxPlay, value)); } - - public uint SessionsJoined { get => ReadUInt32LittleEndian(Data[0x04..]); set => WriteUInt32LittleEndian(Data[0x04..], Math.Min(MaxStat, value)); } - public uint PlacedFirst { get => ReadUInt32LittleEndian(Data[0x08..]); set => WriteUInt32LittleEndian(Data[0x08..], Math.Min(MaxStat, value)); } - public uint PlacedLast { get => ReadUInt32LittleEndian(Data[0x0C..]); set => WriteUInt32LittleEndian(Data[0x0C..], Math.Min(MaxStat, value)); } - - /// - /// Bonuses Earned - /// - public uint BonusesEarned { get => ReadUInt32LittleEndian(Data[0x10..]); set => WriteUInt32LittleEndian(Data[0x10..], Math.Min(MaxStat, value)); } - - /// - /// Pokémon Instructions - /// - public uint Instructions { get => ReadUInt32LittleEndian(Data[0x14..]); set => WriteUInt32LittleEndian(Data[0x14..], Math.Min(MaxStat, value)); } - public uint Failed { get => ReadUInt32LittleEndian(Data[0x18..]); set => WriteUInt32LittleEndian(Data[0x18..], Math.Min(MaxStat, value)); } - public uint Jumped { get => ReadUInt32LittleEndian(Data[0x1C..]); set => WriteUInt32LittleEndian(Data[0x1C..], Math.Min(MaxStat, value)); } - public uint Acquired { get => ReadUInt32LittleEndian(Data[0x20..]); set => WriteUInt32LittleEndian(Data[0x20..], Math.Min(MaxStat, value)); } - public uint Tackled { get => ReadUInt32LittleEndian(Data[0x24..]); set => WriteUInt32LittleEndian(Data[0x24..], Math.Min(MaxStat, value)); } - public uint FellDown { get => ReadUInt32LittleEndian(Data[0x28..]); set => WriteUInt32LittleEndian(Data[0x28..], Math.Min(MaxStat, value)); } - public uint Dashed { get => ReadUInt32LittleEndian(Data[0x2C..]); set => WriteUInt32LittleEndian(Data[0x2C..], Math.Min(MaxStat, value)); } - public uint Switched { get => ReadUInt32LittleEndian(Data[0x30..]); set => WriteUInt32LittleEndian(Data[0x30..], Math.Min(MaxStat, value)); } - public uint SelfImpeded { get => ReadUInt32LittleEndian(Data[0x34..]); set => WriteUInt32LittleEndian(Data[0x34..], Math.Min(MaxStat, value)); } - - public uint ConnectionJoined { get => ReadUInt32LittleEndian(Data[0x38..]); set => WriteUInt32LittleEndian(Data[0x38..], Math.Min(MaxStat, value)); } - public uint ConnectionFirst { get => ReadUInt32LittleEndian(Data[0x3C..]); set => WriteUInt32LittleEndian(Data[0x3C..], Math.Min(MaxStat, value)); } - public uint ConnectionLast { get => ReadUInt32LittleEndian(Data[0x40..]); set => WriteUInt32LittleEndian(Data[0x40..], Math.Min(MaxStat, value)); } - - // Per-event 1st-place counters - public uint this[PokeathlonEvent4 index] - { - get - { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); - return ReadUInt32LittleEndian(Data[(0x44 + ((int)index * 4))..]); - } - set - { - ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); - WriteUInt32LittleEndian(Data[(0x44 + ((int)index * 4))..], Math.Min(MaxStat, value)); - } - } - - // helper to calculate - public uint TotalEventFirst - { - get - { - uint total = 0; - for (PokeathlonEvent4 i = 0; i < PokeathlonEvent4.Count; i++) - total += this[i]; - return total; - } - } - - // Aggregate event last-place total - public uint TotalEventLast { get => ReadUInt32LittleEndian(Data[0x6C..]); set => WriteUInt32LittleEndian(Data[0x6C..], Math.Min(MaxStat, value)); } - - /// - /// When the player plays the Pokéathlon over wireless play the default drinks will be replaced with the drinks of the opposing player. - /// The price of the drinks are determined on how famous the Trainers selling them are. - /// - /// - /// - /// - public uint Fame { get => ReadUInt32LittleEndian(Data[0x70..]); set => WriteUInt32LittleEndian(Data[0x70..], Math.Min(MaxFame, value)); } - - /// - /// Retrieves the value of a particular statistic for Data Card purposes, based on the provided stat identifier. - /// - public uint GetDataCardStat(DataCard4 stat) => stat switch - { - DataCard4.PlacedFirst => this.PlacedFirst, - DataCard4.PlacedLast => this.PlacedLast, - DataCard4.Dashed => this.Dashed, - DataCard4.Jumped => this.Jumped, - DataCard4.FirstHurdle => this[PokeathlonEvent4.HurdleDash], - DataCard4.FirstRelay => this[PokeathlonEvent4.RelayRun], - DataCard4.FirstPennant => this[PokeathlonEvent4.PennantCapture], - DataCard4.FirstBlockSmash => this[PokeathlonEvent4.BlockSmash], - DataCard4.FirstDiscCatch => this[PokeathlonEvent4.DiscCatch], - DataCard4.FirstSnowThrow => this[PokeathlonEvent4.SnowThrow], - DataCard4.PointsAcquired => this.Acquired, - DataCard4.Failed => this.Failed, - DataCard4.SelfImpeded => this.SelfImpeded, - DataCard4.Tackled => this.Tackled, - DataCard4.FellDown => this.FellDown, - DataCard4.FirstRingDrop => this[PokeathlonEvent4.RingDrop], - DataCard4.FirstLampJump => this[PokeathlonEvent4.LampJump], - DataCard4.FirstCirclePush => this[PokeathlonEvent4.CirclePush], - DataCard4.ConnectionFirst => this.ConnectionFirst, - DataCard4.ConnectionLast => this.ConnectionLast, - DataCard4.EventFirst => this.TotalEventFirst, // aggregate event first-place total is not stored, but can be calculated by summing per-event counters - DataCard4.EventLast => this.TotalEventLast, - DataCard4.Switched => this.Switched, - DataCard4.FirstGoalRoll => this[PokeathlonEvent4.GoalRoll], - DataCard4.BonusesEarned => this.BonusesEarned, - DataCard4.Instructions => this.Instructions, - DataCard4.TimeSpent => this.TimeSpent, - _ => throw new ArgumentOutOfRangeException(nameof(stat), stat, null), - }; - - /// - /// Updates the value of a particular statistic for Data Card purposes, based on the provided stat identifier. - /// - public void SetDataCardStat(DataCard4 stat, uint value) - { - value = Math.Min(MaxStat, value); - switch (stat) - { - case DataCard4.PlacedFirst: this.PlacedFirst = value; break; - case DataCard4.PlacedLast: this.PlacedLast = value; break; - case DataCard4.Dashed: this.Dashed = value; break; - case DataCard4.Jumped: this.Jumped = value; break; - case DataCard4.FirstHurdle: this[PokeathlonEvent4.HurdleDash] = value; break; - case DataCard4.FirstRelay: this[PokeathlonEvent4.RelayRun] = value; break; - case DataCard4.FirstPennant: this[PokeathlonEvent4.PennantCapture] = value; break; - case DataCard4.FirstBlockSmash: this[PokeathlonEvent4.BlockSmash] = value; break; - case DataCard4.FirstDiscCatch: this[PokeathlonEvent4.DiscCatch] = value; break; - case DataCard4.FirstSnowThrow: this[PokeathlonEvent4.SnowThrow] = value; break; - case DataCard4.PointsAcquired: this.Acquired = value; break; - case DataCard4.Failed: this.Failed = value; break; - case DataCard4.SelfImpeded: this.SelfImpeded = value; break; - case DataCard4.Tackled: this.Tackled = value; break; - case DataCard4.FellDown: this.FellDown = value; break; - case DataCard4.FirstRingDrop: this[PokeathlonEvent4.RingDrop] = value; break; - case DataCard4.FirstLampJump: this[PokeathlonEvent4.LampJump] = value; break; - case DataCard4.FirstCirclePush: this[PokeathlonEvent4.CirclePush] = value; break; - case DataCard4.ConnectionFirst: this.ConnectionFirst = value; break; - case DataCard4.ConnectionLast: this.ConnectionLast = value; break; - case DataCard4.EventFirst: - return; // skip, not going to spread the count across all 10 events - case DataCard4.EventLast: this.TotalEventLast = value; break; - case DataCard4.Switched: this.Switched = value; break; - case DataCard4.FirstGoalRoll: this[PokeathlonEvent4.GoalRoll] = value; break; - case DataCard4.BonusesEarned: this.BonusesEarned = value; break; - case DataCard4.Instructions: this.Instructions = value; break; - case DataCard4.TimeSpent: this.TimeSpent = value; break; - default: throw new ArgumentOutOfRangeException(nameof(stat), stat, null); - } - } - - public static ReadOnlySpan FameInclusiveThreshold => [10, 25, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000]; - - /// - /// Used to evaluate the fame level of a given trainer, ratcheting up/down based on how much fame has been aggregated. - /// - /// Player fame value - /// Value [0,12] - public static int GetFameLevel(uint value) - { - int level = 0; - foreach (var threshold in FameInclusiveThreshold) - { - if (value <= threshold) - break; - level++; - } - return level; // 12 max - } - - // disassembly also calculates fame for NPCs by summing all performance stats of their team, then (sum/3)-8, clamped [0,12]. -} -public struct Aprijuice5(Memory Raw) -{ - public Span Data => Raw.Span; - - /// - /// The price of drinks are determined by how famous the Trainers selling them are. - /// - /// - /// - /// - public ushort Fame { get => ReadUInt16LittleEndian(Data); set => WriteUInt16LittleEndian(Data, value); } - - // Every 100 steps taken increases the mildness of an Aprijuice by 1, up to a maximum of 255. - // Any mildness increases are made before the mixing of new Apricorns into the Aprijuice is performed. - public byte Mildness { get => Data[2]; set => Data[2] = value; } - - // Each flavor is capped at a maximum of 63 points and a minimum of 0. - public byte Spicy { get => Data[3]; set => Data[3] = value; } - public byte Sour { get => Data[4]; set => Data[4] = value; } - public byte Dry { get => Data[5]; set => Data[5] = value; } - public byte Bitter { get => Data[6]; set => Data[6] = value; } - public byte Sweet { get => Data[7]; set => Data[7] = value; } - - public const ushort LevelMax = 100; - - public byte CalculateLevel() - { - var level = Spicy + Sour + Dry + Bitter + Sweet; - return (byte)Math.Clamp(level, 0, LevelMax); // never will see 0 unless it's hacked :) - } - - public const ushort PriceMin = 100; - public const ushort PriceMax = 5000; - - public ushort CalculatePrice() - { - var level = CalculateLevel(); - var price = (Fame / 10) + (level / 2); - return (ushort)Math.Clamp(price, PriceMin, PriceMax); - } - - // When a Pokémon is put into a PC box, all effects of an Aprijuice disappear. -} - -/// -/// Performance stats -/// -public enum PokeathlonStat4 : byte -{ - Speed = 0, - Power = 1, - Skill = 2, - Stamina = 3, - Jump = 4, - - Count = 5, -} - -public enum PokeathlonEvent4 : byte -{ - HurdleDash = 0, - PennantCapture = 1, - CirclePush = 2, - BlockSmash = 3, - DiscCatch = 4, - LampJump = 5, - RelayRun = 6, - RingDrop = 7, - SnowThrow = 8, - GoalRoll = 9, - - Count = 10, -} - -/// -/// Data Card indexes and the stats they retrieve in . -/// -public enum DataCard4 : byte -{ - PlacedFirst = 0, // Pokéathlon 1st Place - PlacedLast = 1, // Pokéathlon Last Place - Dashed = 2, // Times Pokémon Dashed - Jumped = 3, // Times Pokémon Jumped - - FirstHurdle = 4, // Hurdle Dash 1st Places - FirstRelay = 5, // Relay Run 1st Places - FirstPennant = 6, // Pennant Capture 1st Places - FirstBlockSmash = 7, // Block Smash 1st Places - FirstDiscCatch = 8, // Disc Catch 1st Places - FirstSnowThrow = 9, // Snow Throw 1st Places - - PointsAcquired = 10, // Pokémon Acquired Points - Failed = 11, // Pokémon Failed - SelfImpeded = 12, // Times Pokémon Self-Impeded - Tackled = 13, // Times Pokémon Tackled - FellDown = 14, // Pokémon Fell Down - - FirstRingDrop = 15, // Ring Drop 1st Places - FirstLampJump = 16, // Lamp Jump 1st Places - FirstCirclePush = 17, // Circle Push 1st Places - - ConnectionFirst = 18, // Connection 1st Places - ConnectionLast = 19, // Connection Last Places - - EventFirst = 20, // Event 1st Places - EventLast = 21, // Event Last Places - - Switched = 22, // Times Pokémon Switched - - FirstGoalRoll = 23, // Goal Roll 1st Places - - BonusesEarned = 24, // Bonuses Earned - Instructions = 25, // Pokémon Instructions - TimeSpent = 26, // Time Spent in Pokéathlon - - Count = 27, -}; diff --git a/PKHeX.Core/Saves/SAV3.cs b/PKHeX.Core/Saves/SAV3.cs index 5e920480c..e04515336 100644 --- a/PKHeX.Core/Saves/SAV3.cs +++ b/PKHeX.Core/Saves/SAV3.cs @@ -638,7 +638,7 @@ public void SetHallOfFameData(ReadOnlySpan value) /// Only used in Emerald for storing the Battle Video. public Memory GetFinalExternalData() => Buffer.Slice(0x1F000, SIZE_SECTOR_USED); - public bool IsCorruptPokedexFF() => MemoryMarshal.Read(Small[0xAC..]) == ulong.MaxValue; + public bool IsCorruptPokedexFF() => BitConverter.ToUInt64(Small[0xAC..]) == ulong.MaxValue; public sealed override void CopyChangesFrom(SaveFile sav) { diff --git a/PKHeX.Core/Saves/SAV4BR.cs b/PKHeX.Core/Saves/SAV4BR.cs index 8533f9d62..475b9c47c 100644 --- a/PKHeX.Core/Saves/SAV4BR.cs +++ b/PKHeX.Core/Saves/SAV4BR.cs @@ -314,6 +314,9 @@ public string BirthDay set => StringConverter4GC.SetStringUnicodeBR(value, BirthDayTrash); } + /// + /// + /// public int Country { get => ReadUInt16BigEndian(Data[0x3C0..]); set => WriteUInt16BigEndian(Data[0x578..], (ushort)value); } public int Region { get => ReadUInt16BigEndian(Data[0x3C2..]); set => WriteUInt16BigEndian(Data[0x57A..], (ushort)value); } diff --git a/PKHeX.Core/Saves/Storage/SAV4Ranch.cs b/PKHeX.Core/Saves/SAV4Ranch.cs similarity index 100% rename from PKHeX.Core/Saves/Storage/SAV4Ranch.cs rename to PKHeX.Core/Saves/SAV4Ranch.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Accessory4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Accessory4.cs index b9ff4c40e..a00748271 100644 --- a/PKHeX.Core/Saves/Substructures/Gen4/Accessory4.cs +++ b/PKHeX.Core/Saves/Substructures/Gen4/Accessory4.cs @@ -4,110 +4,110 @@ namespace PKHeX.Core; public enum Accessory4 : byte { - WhiteFluff, - YellowFluff, - PinkFluff, - BrownFluff, - BlackFluff, - OrangeFluff, - RoundPebble, - GlitterBoulder, - SnaggyPebble, - JaggedBoulder, - BlackPebble, - MiniPebble, - PinkScale, - BlueScale, - GreenScale, - PurpleScale, - BigScale, - NarrowScale, - BlueFeather, - RedFeather, - YellowFeather, - WhiteFeather, - BlackMoustache, - WhiteMoustache, - BlackBeard, - WhiteBeard, - SmallLeaf, - BigLeaf, - NarrowLeaf, - ShedClaw, - ShedHorn, - ThinMushroom, - ThickMushroom, - Stump, - PrettyDewdrop, - SnowCrystal, - Sparks, - ShimmeringFire, - MysticFire, - Determination, - PeculiarSpoon, - PuffySmoke, - PoisonExtract, - WealthyCoin, - EerieThing, - Spring, - Seashell, - HummingNote, - ShinyPowder, - GlitterPowder, - RedFlower, - PinkFlower, - WhiteFlower, - BlueFlower, - OrangeFlower, - YellowFlower, - GooglySpecs, - BlackSpecs, - GorgeousSpecs, - SweetCandy, - Confetti, + WhiteFluff = 0, + YellowFluff = 1, + PinkFluff = 2, + BrownFluff = 3, + BlackFluff = 4, + OrangeFluff = 5, + RoundPebble = 6, + GlitterBoulder = 7, + SnaggyPebble = 8, + JaggedBoulder = 9, + BlackPebble = 10, + MiniPebble = 11, + PinkScale = 12, + BlueScale = 13, + GreenScale = 14, + PurpleScale = 15, + BigScale = 16, + NarrowScale = 17, + BlueFeather = 18, + RedFeather = 19, + YellowFeather = 20, + WhiteFeather = 21, + BlackMoustache = 22, + WhiteMoustache = 23, + BlackBeard = 24, + WhiteBeard = 25, + SmallLeaf = 26, + BigLeaf = 27, + NarrowLeaf = 28, + ShedClaw = 29, + ShedHorn = 30, + ThinMushroom = 31, + ThickMushroom = 32, + Stump = 33, + PrettyDewdrop = 34, + SnowCrystal = 35, + Sparks = 36, + ShimmeringFire = 37, + MysticFire = 38, + Determination = 39, + PeculiarSpoon = 40, + PuffySmoke = 41, + PoisonExtract = 42, + WealthyCoin = 43, + EerieThing = 44, + Spring = 45, + Seashell = 46, + HummingNote = 47, + ShinyPowder = 48, + GlitterPowder = 49, + RedFlower = 50, + PinkFlower = 51, + WhiteFlower = 52, + BlueFlower = 53, + OrangeFlower = 54, + YellowFlower = 55, + GooglySpecs = 56, + BlackSpecs = 57, + GorgeousSpecs = 58, + SweetCandy = 59, + Confetti = 60, // For accessories below this point, only 1 copy can be owned at once - ColoredParasol, - OldUmbrella, - Spotlight, - Cape, - StandingMike, - Surfboard, - Carpet, - RetroPipe, - FluffyBed, - MirrorBall, - PhotoBoard, - PinkBarrette, - RedBarrette, - BlueBarrette, - YellowBarrette, - GreenBarrette, - PinkBalloon, - RedBalloons, - BlueBalloons, - YellowBalloon, - GreenBalloons, - LaceHeadress, - TopHat, - SilkVeil, - HeroicHeadband, - ProfessorHat, - FlowerStage, - GoldPedestal, - GlassStage, - AwardPodium, - CubeStage, - TURTWIGMask, - CHIMCHARMask, - PIPLUPMask, - BigTree, - Flag, - Crown, - Tiara, + ColoredParasol = 61, + OldUmbrella = 62, + Spotlight = 63, + Cape = 64, + StandingMike = 65, + Surfboard = 66, + Carpet = 67, + RetroPipe = 68, + FluffyBed = 69, + MirrorBall = 70, + PhotoBoard = 71, + PinkBarrette = 72, + RedBarrette = 73, + BlueBarrette = 74, + YellowBarrette = 75, + GreenBarrette = 76, + PinkBalloon = 77, + RedBalloons = 78, + BlueBalloons = 79, + YellowBalloon = 80, + GreenBalloons = 81, + LaceHeadress = 82, + TopHat = 83, + SilkVeil = 84, + HeroicHeadband = 85, + ProfessorHat = 86, + FlowerStage = 87, + GoldPedestal = 88, + GlassStage = 89, + AwardPodium = 90, + CubeStage = 91, + TURTWIGMask = 92, + CHIMCHARMask = 93, + PIPLUPMask = 94, + BigTree = 95, + Flag = 96, + Crown = 97, + Tiara = 98, // Unreleased - Comet, + Comet = 99, } public static class AccessoryInfo diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Backdrop4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Backdrop4.cs index e72d10f54..40730cf51 100644 --- a/PKHeX.Core/Saves/Substructures/Gen4/Backdrop4.cs +++ b/PKHeX.Core/Saves/Substructures/Gen4/Backdrop4.cs @@ -2,28 +2,28 @@ namespace PKHeX.Core; public enum Backdrop4 : byte { - DressUp, - Ranch, - CityatNight, - SnowyTown, - Fiery, - OuterSpace, - Desert, - CumulusCloud, - FlowerPatch, - FutureRoom, - OpenSea, - TotalDarkness, - TatamiRoom, - GingerbreadRoom, - Seafloor, - Underground, - Sky, + DressUp = 0, + Ranch = 1, + CityatNight = 2, + SnowyTown = 3, + Fiery = 4, + OuterSpace = 5, + Desert = 6, + CumulusCloud = 7, + FlowerPatch = 8, + FutureRoom = 9, + OpenSea = 10, + TotalDarkness = 11, + TatamiRoom = 12, + GingerbreadRoom = 13, + Seafloor = 14, + Underground = 15, + Sky = 16, // Unreleased - Theater, + Theater = 17, - Unset, + Unset = 18, } public static class BackdropInfo diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Geonet4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Geonet4.cs index 4245fb927..6c60008a6 100644 --- a/PKHeX.Core/Saves/Substructures/Gen4/Geonet4.cs +++ b/PKHeX.Core/Saves/Substructures/Gen4/Geonet4.cs @@ -1,4 +1,4 @@ -using System; +using static PKHeX.Core.LocaleNDS4; namespace PKHeX.Core; @@ -22,44 +22,7 @@ public void Save() SAV.SetData(SAV.General.Slice(Offset, CountryCount * 16), Data); } - public const int CountryCount = 233; - private const int Japan = 103; - - private static ReadOnlySpan LegalCountries => - [ - 001, 002, 003, 006, 008, 009, 012, 013, 015, 016, 017, 018, 020, 021, 022, 023, - 025, 027, 028, 029, 031, 033, 034, 035, 036, 040, 042, 043, 045, 048, 049, 050, - 052, 054, 055, 056, 058, 059, 060, 061, 062, 069, 070, 071, 072, 074, 077, 078, - 079, 080, 081, 082, 083, 085, 086, 088, 089, 090, 091, 092, 093, 094, 095, 097, - 098, 100, 101, 102, 103, 104, 107, 111, 115, 117, 118, 121, 122, 126, 129, 131, - 133, 135, 140, 142, 146, 148, 149, 150, 151, 152, 156, 157, 158, 160, 161, 163, - 164, 166, 167, 110, 171, 172, 179, 183, 186, 187, 188, 189, 192, 193, 194, 196, - 198, 199, 200, 202, 205, 207, 211, 212, 216, 218, 219, 204, 221, 220, 222, 224, - 226, 227, - ]; - - public static byte GetSubregionCount(byte country) => country switch - { - 009 => 24, // Argentina - 012 => 7, // Australia - 028 => 27, // Brazil - 036 => 13, // Canada - 043 => 31, // China - 070 => 6, // Finland - 071 => 22, // France - 077 => 16, // Germany - 094 => 35, // India - 101 => 20, // Italy - 103 => 50, // Japan - 156 => 20, // Norway - 166 => 16, // Poland - 172 => 7, // Russian Federation - 193 => 17, // Spain - 199 => 24, // Sweden - 219 => 12, // United Kingdom - 220 => 51, // United States of America - _ => 0, - }; + public static byte GetSubregionCount(byte country) => LocaleNDS4.GetSubregionCount(country); public bool GlobalFlag { get => SAV.GeonetGlobalFlag; set => SAV.GeonetGlobalFlag = value; } @@ -79,7 +42,7 @@ public void SetCountrySubregion(byte country, byte subregion, GeonetPoint point) private void SetAllSubregions(byte country, GeonetPoint type) { - var subregionCount = GetSubregionCount(country); + var subregionCount = LocaleNDS4.GetSubregionCount(country); if (subregionCount == 0) { SetCountrySubregion(country, 0, type); diff --git a/PKHeX.Core/Saves/Substructures/Gen4/PBR/BattlePassType.cs b/PKHeX.Core/Saves/Substructures/Gen4/PBR/BattlePassType.cs index 0bcb86a5e..a3f014f51 100644 --- a/PKHeX.Core/Saves/Substructures/Gen4/PBR/BattlePassType.cs +++ b/PKHeX.Core/Saves/Substructures/Gen4/PBR/BattlePassType.cs @@ -2,11 +2,11 @@ namespace PKHeX.Core; public enum BattlePassType { - Custom, - Rental, - Friend, - Download, - Other1, - Other2, - Other3, + Custom = 0, + Rental = 1, + Friend = 2, + Download = 3, + Other1 = 4, + Other2 = 5, + Other3 = 6, } diff --git a/PKHeX.Core/Saves/Substructures/Gen4/PBR/GearCategory.cs b/PKHeX.Core/Saves/Substructures/Gen4/PBR/GearCategory.cs index e84726539..d29944138 100644 --- a/PKHeX.Core/Saves/Substructures/Gen4/PBR/GearCategory.cs +++ b/PKHeX.Core/Saves/Substructures/Gen4/PBR/GearCategory.cs @@ -2,14 +2,14 @@ namespace PKHeX.Core; public enum GearCategory : byte { - Head, - Hair, - Face, - Top, - Bottom, - Shoes, - Hands, - Bags, - Glasses, - Badges, + Head = 0, + Hair = 1, + Face = 2, + Top = 3, + Bottom = 4, + Shoes = 5, + Hands = 6, + Bags = 7, + Glasses = 8, + Badges = 9, } diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/Aprijuice4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/Aprijuice4.cs new file mode 100644 index 000000000..c9e67010e --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/Aprijuice4.cs @@ -0,0 +1,48 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +public struct Aprijuice4(Memory Raw) +{ + public Span Data => Raw.Span; + + /// + /// The price of drinks are determined by how famous the Trainers selling them are. + /// + /// + /// + /// + public ushort Fame { get => ReadUInt16LittleEndian(Data); set => WriteUInt16LittleEndian(Data, value); } + + // Every 100 steps taken increases the mildness of an Aprijuice by 1, up to a maximum of 255. + // Any mildness increases are made before the mixing of new Apricorns into the Aprijuice is performed. + public byte Mildness { get => Data[2]; set => Data[2] = value; } + + // Each flavor is capped at a maximum of 63 points and a minimum of 0. + public byte Spicy { get => Data[3]; set => Data[3] = value; } + public byte Sour { get => Data[4]; set => Data[4] = value; } + public byte Dry { get => Data[5]; set => Data[5] = value; } + public byte Bitter { get => Data[6]; set => Data[6] = value; } + public byte Sweet { get => Data[7]; set => Data[7] = value; } + + public const ushort LevelMax = 100; + + public byte CalculateLevel() + { + var level = Spicy + Sour + Dry + Bitter + Sweet; + return (byte)Math.Clamp(level, 0, LevelMax); // never will see 0 unless it's hacked :) + } + + public const ushort PriceMin = 100; + public const ushort PriceMax = 5000; + + public ushort CalculatePrice() + { + var level = CalculateLevel(); + var price = (Fame / 10) + (level / 2); + return (ushort)Math.Clamp(price, PriceMin, PriceMax); + } + + // When a Pokémon is put into a PC box, all effects of an Aprijuice disappear. +} diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/DataCard4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/DataCard4.cs new file mode 100644 index 000000000..a5bf8cf5f --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/DataCard4.cs @@ -0,0 +1,45 @@ +namespace PKHeX.Core; + +/// +/// Data Card indexes and the stats they retrieve in . +/// +public enum DataCard4 : byte +{ + PlacedFirst = 0, // Pokéathlon 1st Place + PlacedLast = 1, // Pokéathlon Last Place + Dashed = 2, // Times Pokémon Dashed + Jumped = 3, // Times Pokémon Jumped + + FirstHurdle = 4, // Hurdle Dash 1st Places + FirstRelay = 5, // Relay Run 1st Places + FirstPennant = 6, // Pennant Capture 1st Places + FirstBlockSmash = 7, // Block Smash 1st Places + FirstDiscCatch = 8, // Disc Catch 1st Places + FirstSnowThrow = 9, // Snow Throw 1st Places + + PointsAcquired = 10, // Pokémon Acquired Points + Failed = 11, // Pokémon Failed + SelfImpeded = 12, // Times Pokémon Self-Impeded + Tackled = 13, // Times Pokémon Tackled + FellDown = 14, // Pokémon Fell Down + + FirstRingDrop = 15, // Ring Drop 1st Places + FirstLampJump = 16, // Lamp Jump 1st Places + FirstCirclePush = 17, // Circle Push 1st Places + + ConnectionFirst = 18, // Connection 1st Places + ConnectionLast = 19, // Connection Last Places + + EventFirst = 20, // Event 1st Places + EventLast = 21, // Event Last Places + + Switched = 22, // Times Pokémon Switched + + FirstGoalRoll = 23, // Goal Roll 1st Places + + BonusesEarned = 24, // Bonuses Earned + Instructions = 25, // Pokémon Instructions + TimeSpent = 26, // Time Spent in Pokéathlon + + Count = 27, +}; diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/Pokeathlon4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/Pokeathlon4.cs new file mode 100644 index 000000000..ea8844cfa --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/Pokeathlon4.cs @@ -0,0 +1,118 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + + +namespace PKHeX.Core; + +/// +/// Manages the Pokeathlon Data for +/// +public sealed class Pokeathlon4(Memory Raw) // 0xD9D4 within SAV4HGSS +{ + public const int SIZE = 0xB80; + + public Span Data => Raw.Span; + + // 5 courses to store record data + public PokeathlonCourseRecord4 GetCourseRecord(PokeathlonStat4 index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonStat4.Count); + return new(Raw.Slice((int)index * PokeathlonCourseRecord4.SIZE, PokeathlonCourseRecord4.SIZE)); + } + + // 0xDC, 0xDAB0 within SAV + public PokeathlonMedalManager4 Medals => new(Raw.Slice(0xDC, PokeathlonMedalManager4.SIZE)); + // 3 bytes alignment + + // 0x2CC, 0xDCA0 within SAV + public PokeathlonEventData4 GetEventSelf(PokeathlonEvent4 index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); + return new(Raw.Slice(0x2CC + ((int)index * PokeathlonEventData4.SIZE), PokeathlonEventData4.SIZE)); + } + + // 0x484, 0xDE58 within SAV + public PokeathlonConnection4 GetEventConnection(PokeathlonEvent4 index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); + return new(Raw.Slice(0x484 + ((int)index * PokeathlonConnection4.SIZE), PokeathlonConnection4.SIZE)); + } + + // 0xAEC, 0xE4C0 within SAV + + /// + /// Player's highest score for each of the ten individual events (after conversion to Athlete Points) + /// + public ushort GetBestScore(PokeathlonEvent4 index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); + return ReadUInt16LittleEndian(Data[(0xAEC + ((int)index * 2))..]); + } + + public void SetBestScore(PokeathlonEvent4 index, ushort score) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); + WriteUInt16LittleEndian(Data[(0xAEC + ((int)index * 2))..], score); + } + + // 0xB00, 0xE4D4 within SAV global counters + public PokeathlonGlobalCounters4 GlobalCounters => new(Raw.Slice(0xB00, PokeathlonGlobalCounters4.SIZE)); + + // remainder @ 0xE548 + public const uint MaxPoints = 99_999; + + /// + /// Current points count accumulated, used in buying items from shops. + /// + public uint Points { get => ReadUInt32LittleEndian(Data[0xB74..]); set => WriteUInt32LittleEndian(Data[0xB74..], Math.Min(MaxPoints, value)); } + + /// + /// Obtained Data Card indexes [0,26], where each bit represents whether a Data Card has been obtained or not. + /// They can be purchased in exchange for points in the Pokéathlon Dome (sold at the central reception desk). + /// + public uint FlagsDataCard { get => ReadUInt32LittleEndian(Data[0xB78..]); set => WriteUInt32LittleEndian(Data[0xB78..], Math.Min(DataCardAllObtained, value)); } + + // items exist as Key Items, not really advisable to have a one-shot method unlock, end-user implementation beware. + public const uint DataCardAllObtained = 0x07FFFFFFu; // 27 bits, all obtained + + /// + /// Once-daily shop purchase flags for the Athlete Shop. + /// Since shops only have 12 items daily, only 12 bits are used. + /// + public ushort FlagsDailyShop { get => ReadUInt16LittleEndian(Data[0xB7C..]); set => WriteUInt16LittleEndian(Data[0xB7C..], Math.Min(FlagsShopAllObtained, value)); } + public const ushort FlagsShopAllObtained = 0x0FFF; // 12 bits, all obtained + + // last 2 bytes unused, total size 0xB80 + + /// + /// The global Pokéathlon score is calculated as the sum of: + /// - the player's best final score in each of the five courses, + /// - the player's highest score for each of the ten individual events (after conversion to Athlete Points), + /// - the total number of medals displayed in the box in the Trust room (so each Medalist species will add five to this total). + /// + public uint CalculateGlobalScore() + { + uint result = 0; + for (PokeathlonStat4 i = 0; i < PokeathlonStat4.Count; i++) + result += GetCourseRecord(i).ScoreMax; + result += Medals.GetTotalCount(); + for (PokeathlonEvent4 i = 0; i < PokeathlonEvent4.Count; i++) + result += GetBestScore(i); + return result; + } + + public static ReadOnlySpan FriendshipTrophyThresholds => [3000, 3100, 3200, 3300, 3400, 3600, 3800, 4000, 4200, 4500]; + + public static int CalculateFriendshipTrophyCount(uint globalScore) + { + int result = 0; + foreach (var threshold in FriendshipTrophyThresholds) + { + if (globalScore >= threshold) + result++; + else + break; + } + return result; // 10 max + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonConnection4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonConnection4.cs new file mode 100644 index 000000000..368a72855 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonConnection4.cs @@ -0,0 +1,24 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +public struct PokeathlonConnection4(Memory Raw) +{ + public const int SIZE = 0xA4; + + public const uint MaxTrainer = PokeathlonEventData4.MaxRecord; + + public Span Data => Raw.Span; + + public PokeathlonEventData4 Inner => new(Raw.Slice(0 * PokeathlonEventData4.SIZE, PokeathlonEventData4.SIZE)); + + /// + /// Correlated to the indexed records. + /// + public PokeathlonEventTrainer4 GetTrainer(int index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, MaxTrainer); + return new(Raw.Slice(0x2C + (index * PokeathlonEventTrainer4.SIZE), PokeathlonEventTrainer4.SIZE)); + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonCourseRecord4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonCourseRecord4.cs new file mode 100644 index 000000000..2e4cbb482 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonCourseRecord4.cs @@ -0,0 +1,24 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +public struct PokeathlonCourseRecord4(Memory Raw) +{ + public const int SIZE = 0x2C; + + private Span Data => Raw.Span; + + public ushort Score0 { get => ReadUInt16LittleEndian(Data); set => WriteUInt16LittleEndian(Data, value); } + public ushort Score1 { get => ReadUInt16LittleEndian(Data[2..]); set => WriteUInt16LittleEndian(Data[2..], value); } + public ushort Score2 { get => ReadUInt16LittleEndian(Data[4..]); set => WriteUInt16LittleEndian(Data[4..], value); } + public ushort ScoreMax { get => ReadUInt16LittleEndian(Data[6..]); set => WriteUInt16LittleEndian(Data[6..], value); } + + public const int CountParticipant = 3; + + public PokeathlonParticipant4 GetParticipant(int index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, CountParticipant); + return new(Raw.Slice(8 + (index * PokeathlonParticipant4.SIZE), PokeathlonParticipant4.SIZE)); + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEvent4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEvent4.cs new file mode 100644 index 000000000..9b4d1fec1 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEvent4.cs @@ -0,0 +1,20 @@ +namespace PKHeX.Core; + +/// +/// Enumeration of the 10 different Pokeathlon events in Gen 4, used for indexing into the event data structures. +/// +public enum PokeathlonEvent4 : byte +{ + HurdleDash = 0, + PennantCapture = 1, + CirclePush = 2, + BlockSmash = 3, + DiscCatch = 4, + LampJump = 5, + RelayRun = 6, + RingDrop = 7, + SnowThrow = 8, + GoalRoll = 9, + + Count = 10, +} diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEventData4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEventData4.cs new file mode 100644 index 000000000..5542feaf7 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEventData4.cs @@ -0,0 +1,21 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +public struct PokeathlonEventData4(Memory Raw) +{ + public const int SIZE = 0x2C; + public const uint MaxAttempts = 9_999_999; + public const uint MaxRecord = 5; + + public Span Data => Raw.Span; + + public PokeathlonEventRecord4 GetRecord(int index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, MaxRecord); + return new(Raw.Slice(index * PokeathlonEventRecord4.SIZE, PokeathlonEventRecord4.SIZE)); + } + + public uint Attempts { get => ReadUInt32LittleEndian(Data[0x28..]); set => WriteUInt32LittleEndian(Data[0x28..], Math.Min(MaxAttempts, value)); } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEventRecord4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEventRecord4.cs new file mode 100644 index 000000000..0c95b6144 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEventRecord4.cs @@ -0,0 +1,31 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +/// +/// Event record storage for a given event type. +/// +/// +/// +/// +/// +public struct PokeathlonEventRecord4(Memory Raw) +{ + public const int SIZE = 8; + + public Span Data => Raw.Span; + + /// + /// Stores the record for the particular event. The meaning of this value depends on the event type. + /// + /// + /// Hurdle Dash: Time in frames (lower is better). + /// + public ushort Record { get => ReadUInt16LittleEndian(Data); set => WriteUInt16LittleEndian(Data, value); } + + // team of three Pokémon responsible for this record, simply (species,form)*3. + public SpeciesForm10 Entry0 { get => ReadUInt16LittleEndian(Data[2..]); set => WriteUInt16LittleEndian(Data[2..], value); } + public SpeciesForm10 Entry1 { get => ReadUInt16LittleEndian(Data[4..]); set => WriteUInt16LittleEndian(Data[4..], value); } + public SpeciesForm10 Entry2 { get => ReadUInt16LittleEndian(Data[6..]); set => WriteUInt16LittleEndian(Data[6..], value); } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEventTrainer4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEventTrainer4.cs new file mode 100644 index 000000000..dbd29f31d --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEventTrainer4.cs @@ -0,0 +1,25 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +public struct PokeathlonEventTrainer4(Memory Raw) : ITrainerID32 +{ + public const int SIZE = 0x18; + public Span Data => Raw.Span; + public uint ID32 { get => ReadUInt32LittleEndian(Data); set => WriteUInt32LittleEndian(Data, value); } + public ushort TID16 { get => ReadUInt16LittleEndian(Data); set => WriteUInt16LittleEndian(Data, value); } + public ushort SID16 { get => ReadUInt16LittleEndian(Data[2..]); set => WriteUInt16LittleEndian(Data[2..], value); } + public TrainerIDFormat TrainerIDDisplayFormat => TrainerIDFormat.SixteenBit; + + public Span OriginalTrainerTrash => Data.Slice(8, 8 * sizeof(ushort)); + + public byte Language { get => Data[0x14]; set => Data[0x14] = value; } + // remaining 3 bytes unused + + public string OriginalTrainerName + { + get => StringConverter4.GetString(OriginalTrainerTrash); + set => StringConverter4.SetString(OriginalTrainerTrash, value, 7, Language); + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonGlobalCounters4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonGlobalCounters4.cs new file mode 100644 index 000000000..f4f476f0f --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonGlobalCounters4.cs @@ -0,0 +1,178 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +public struct PokeathlonGlobalCounters4(Memory Raw) +{ + public const int SIZE = 0x74; + public Span Data => Raw.Span; + + public const uint MaxPlay = 59_999; + public const uint MaxStat = 9_999_999; + public const uint MaxFame = ushort.MaxValue; + + /// Time Spent in Pokéathlon, in minutes + public uint TimeSpent { get => ReadUInt32LittleEndian(Data); set => WriteUInt32LittleEndian(Data, Math.Min(MaxPlay, value)); } + + public uint SessionsJoined { get => ReadUInt32LittleEndian(Data[0x04..]); set => WriteUInt32LittleEndian(Data[0x04..], Math.Min(MaxStat, value)); } + public uint PlacedFirst { get => ReadUInt32LittleEndian(Data[0x08..]); set => WriteUInt32LittleEndian(Data[0x08..], Math.Min(MaxStat, value)); } + public uint PlacedLast { get => ReadUInt32LittleEndian(Data[0x0C..]); set => WriteUInt32LittleEndian(Data[0x0C..], Math.Min(MaxStat, value)); } + + /// + /// Bonuses Earned + /// + public uint BonusesEarned { get => ReadUInt32LittleEndian(Data[0x10..]); set => WriteUInt32LittleEndian(Data[0x10..], Math.Min(MaxStat, value)); } + + /// + /// Pokémon Instructions + /// + public uint Instructions { get => ReadUInt32LittleEndian(Data[0x14..]); set => WriteUInt32LittleEndian(Data[0x14..], Math.Min(MaxStat, value)); } + public uint Failed { get => ReadUInt32LittleEndian(Data[0x18..]); set => WriteUInt32LittleEndian(Data[0x18..], Math.Min(MaxStat, value)); } + public uint Jumped { get => ReadUInt32LittleEndian(Data[0x1C..]); set => WriteUInt32LittleEndian(Data[0x1C..], Math.Min(MaxStat, value)); } + public uint Acquired { get => ReadUInt32LittleEndian(Data[0x20..]); set => WriteUInt32LittleEndian(Data[0x20..], Math.Min(MaxStat, value)); } + public uint Tackled { get => ReadUInt32LittleEndian(Data[0x24..]); set => WriteUInt32LittleEndian(Data[0x24..], Math.Min(MaxStat, value)); } + public uint FellDown { get => ReadUInt32LittleEndian(Data[0x28..]); set => WriteUInt32LittleEndian(Data[0x28..], Math.Min(MaxStat, value)); } + public uint Dashed { get => ReadUInt32LittleEndian(Data[0x2C..]); set => WriteUInt32LittleEndian(Data[0x2C..], Math.Min(MaxStat, value)); } + public uint Switched { get => ReadUInt32LittleEndian(Data[0x30..]); set => WriteUInt32LittleEndian(Data[0x30..], Math.Min(MaxStat, value)); } + public uint SelfImpeded { get => ReadUInt32LittleEndian(Data[0x34..]); set => WriteUInt32LittleEndian(Data[0x34..], Math.Min(MaxStat, value)); } + + public uint ConnectionJoined { get => ReadUInt32LittleEndian(Data[0x38..]); set => WriteUInt32LittleEndian(Data[0x38..], Math.Min(MaxStat, value)); } + public uint ConnectionFirst { get => ReadUInt32LittleEndian(Data[0x3C..]); set => WriteUInt32LittleEndian(Data[0x3C..], Math.Min(MaxStat, value)); } + public uint ConnectionLast { get => ReadUInt32LittleEndian(Data[0x40..]); set => WriteUInt32LittleEndian(Data[0x40..], Math.Min(MaxStat, value)); } + + // Per-event 1st-place counters + public uint this[PokeathlonEvent4 index] + { + get + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); + return ReadUInt32LittleEndian(Data[(0x44 + ((int)index * 4))..]); + } + set + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, (uint)PokeathlonEvent4.Count); + WriteUInt32LittleEndian(Data[(0x44 + ((int)index * 4))..], Math.Min(MaxStat, value)); + } + } + + // helper to calculate + public uint TotalEventFirst + { + get + { + uint total = 0; + for (PokeathlonEvent4 i = 0; i < PokeathlonEvent4.Count; i++) + total += this[i]; + return total; + } + } + + // Aggregate event last-place total + public uint TotalEventLast { get => ReadUInt32LittleEndian(Data[0x6C..]); set => WriteUInt32LittleEndian(Data[0x6C..], Math.Min(MaxStat, value)); } + + /// + /// When the player plays the Pokéathlon over wireless play the default drinks will be replaced with the drinks of the opposing player. + /// The price of the drinks are determined on how famous the Trainers selling them are. + /// + /// + /// + /// + public uint Fame { get => ReadUInt32LittleEndian(Data[0x70..]); set => WriteUInt32LittleEndian(Data[0x70..], Math.Min(MaxFame, value)); } + + /// + /// Retrieves the value of a particular statistic for Data Card purposes, based on the provided stat identifier. + /// + public uint GetDataCardStat(DataCard4 stat) => stat switch + { + DataCard4.PlacedFirst => this.PlacedFirst, + DataCard4.PlacedLast => this.PlacedLast, + DataCard4.Dashed => this.Dashed, + DataCard4.Jumped => this.Jumped, + DataCard4.FirstHurdle => this[PokeathlonEvent4.HurdleDash], + DataCard4.FirstRelay => this[PokeathlonEvent4.RelayRun], + DataCard4.FirstPennant => this[PokeathlonEvent4.PennantCapture], + DataCard4.FirstBlockSmash => this[PokeathlonEvent4.BlockSmash], + DataCard4.FirstDiscCatch => this[PokeathlonEvent4.DiscCatch], + DataCard4.FirstSnowThrow => this[PokeathlonEvent4.SnowThrow], + DataCard4.PointsAcquired => this.Acquired, + DataCard4.Failed => this.Failed, + DataCard4.SelfImpeded => this.SelfImpeded, + DataCard4.Tackled => this.Tackled, + DataCard4.FellDown => this.FellDown, + DataCard4.FirstRingDrop => this[PokeathlonEvent4.RingDrop], + DataCard4.FirstLampJump => this[PokeathlonEvent4.LampJump], + DataCard4.FirstCirclePush => this[PokeathlonEvent4.CirclePush], + DataCard4.ConnectionFirst => this.ConnectionFirst, + DataCard4.ConnectionLast => this.ConnectionLast, + DataCard4.EventFirst => this.TotalEventFirst, // aggregate event first-place total is not stored, but can be calculated by summing per-event counters + DataCard4.EventLast => this.TotalEventLast, + DataCard4.Switched => this.Switched, + DataCard4.FirstGoalRoll => this[PokeathlonEvent4.GoalRoll], + DataCard4.BonusesEarned => this.BonusesEarned, + DataCard4.Instructions => this.Instructions, + DataCard4.TimeSpent => this.TimeSpent, + _ => throw new ArgumentOutOfRangeException(nameof(stat), stat, null), + }; + + /// + /// Updates the value of a particular statistic for Data Card purposes, based on the provided stat identifier. + /// + public void SetDataCardStat(DataCard4 stat, uint value) + { + value = Math.Min(MaxStat, value); + switch (stat) + { + case DataCard4.PlacedFirst: this.PlacedFirst = value; break; + case DataCard4.PlacedLast: this.PlacedLast = value; break; + case DataCard4.Dashed: this.Dashed = value; break; + case DataCard4.Jumped: this.Jumped = value; break; + case DataCard4.FirstHurdle: this[PokeathlonEvent4.HurdleDash] = value; break; + case DataCard4.FirstRelay: this[PokeathlonEvent4.RelayRun] = value; break; + case DataCard4.FirstPennant: this[PokeathlonEvent4.PennantCapture] = value; break; + case DataCard4.FirstBlockSmash: this[PokeathlonEvent4.BlockSmash] = value; break; + case DataCard4.FirstDiscCatch: this[PokeathlonEvent4.DiscCatch] = value; break; + case DataCard4.FirstSnowThrow: this[PokeathlonEvent4.SnowThrow] = value; break; + case DataCard4.PointsAcquired: this.Acquired = value; break; + case DataCard4.Failed: this.Failed = value; break; + case DataCard4.SelfImpeded: this.SelfImpeded = value; break; + case DataCard4.Tackled: this.Tackled = value; break; + case DataCard4.FellDown: this.FellDown = value; break; + case DataCard4.FirstRingDrop: this[PokeathlonEvent4.RingDrop] = value; break; + case DataCard4.FirstLampJump: this[PokeathlonEvent4.LampJump] = value; break; + case DataCard4.FirstCirclePush: this[PokeathlonEvent4.CirclePush] = value; break; + case DataCard4.ConnectionFirst: this.ConnectionFirst = value; break; + case DataCard4.ConnectionLast: this.ConnectionLast = value; break; + case DataCard4.EventFirst: + return; // skip, not going to spread the count across all 10 events + case DataCard4.EventLast: this.TotalEventLast = value; break; + case DataCard4.Switched: this.Switched = value; break; + case DataCard4.FirstGoalRoll: this[PokeathlonEvent4.GoalRoll] = value; break; + case DataCard4.BonusesEarned: this.BonusesEarned = value; break; + case DataCard4.Instructions: this.Instructions = value; break; + case DataCard4.TimeSpent: this.TimeSpent = value; break; + default: throw new ArgumentOutOfRangeException(nameof(stat), stat, null); + } + } + + public static ReadOnlySpan FameInclusiveThreshold => [10, 25, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000]; + + /// + /// Used to evaluate the fame level of a given trainer, ratcheting up/down based on how much fame has been aggregated. + /// + /// Player fame value + /// Value [0,12] + public static int GetFameLevel(uint value) + { + int level = 0; + foreach (var threshold in FameInclusiveThreshold) + { + if (value <= threshold) + break; + level++; + } + return level; // 12 max + } + + // disassembly also calculates fame for NPCs by summing all performance stats of their team, then (sum/3)-8, clamped [0,12]. +} diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonMedalManager4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonMedalManager4.cs new file mode 100644 index 000000000..2da8d2ce3 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonMedalManager4.cs @@ -0,0 +1,66 @@ +using System; + +namespace PKHeX.Core; + +/// +/// Stores a bitflag medal completion state for all species. +/// +/// +/// for bitflag indexes. +/// +public struct PokeathlonMedalManager4(Memory Raw) +{ + public const int SIZE = 493; // 1-indexed species [Bulbasaur..Arceus] + public const byte MaxMedalBits = 0b11111; // 5 courses, 5 bits per species + + public Span Data => Raw.Span; + + /// + /// Retrieves the medal bits for the given species, where each bit represents whether a medal for a particular course has been obtained or not. + /// + public byte GetMedal(ushort species) + { + species--; + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(species, (ushort)Legal.MaxSpeciesID_4); + return Data[species]; + } + + /// + /// Updates the medal bits for the given species. + /// + public void SetMedal(ushort species, byte medalBits) + { + species--; + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(species, (ushort)Legal.MaxSpeciesID_4); + Data[species] = medalBits; + } + + /// + /// Awards the provided bit(s) to the species. + /// + public void AwardMedal(ushort species, byte medalBit) + { + species--; + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(species, (ushort)Legal.MaxSpeciesID_4); + Data[species] |= medalBit; + } + + /// + /// Awards all medals to all species (complete). + /// + /// Medal value to set to every species entry. + public void SetAllMedals(byte medalBits = MaxMedalBits) => Data[..SIZE].Fill(medalBits); + + /// + /// Removes all medals from all species (resets progress). + /// + public void Clear() => SetAllMedals(0); + + public uint GetTotalCount() + { + uint result = 0; + foreach (var bits in Data[..SIZE]) + result += (uint)System.Numerics.BitOperations.PopCount((uint)bits & MaxMedalBits); + return result; + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonParticipant4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonParticipant4.cs new file mode 100644 index 000000000..0475a159f --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonParticipant4.cs @@ -0,0 +1,27 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +public struct PokeathlonParticipant4(Memory Raw) : ISpeciesForm, ITrainerID32, IFixedGender, IShiny +{ + public const int SIZE = 0xC; + + private Span Data => Raw.Span; + + private uint Packed { get => ReadUInt32LittleEndian(Data); set => WriteUInt32LittleEndian(Data, value); } + public ushort Species { get => (ushort)(Packed & 0x1FF); set => Packed = (Packed & ~0x1FFu) | ((uint)value & 0x1FF); } + public byte Form { get => (byte)((Packed >> 9) & 0x1F); set => Packed = (Packed & ~(0x1Fu << 9)) | (((uint)value & 0x1F) << 9); } + public byte Gender { get => (byte)((Packed >> 14) & 0x3); set => Packed = (Packed & ~(0x3u << 14)) | (((uint)value & 0x3) << 14); } + public bool IsShiny { get => ((Packed >> 16) & 0x1) != 0; set => Packed = (Packed & ~(0x1u << 16)) | ((value ? 1u : 0u) << 16); } + // remainder of bits unused + + /// + public uint EncryptionConstant { get => ReadUInt32LittleEndian(Data[4..]); set => WriteUInt32LittleEndian(Data[4..], value); } + + /// + public uint ID32 { get => ReadUInt32LittleEndian(Data[8..]); set => WriteUInt32LittleEndian(Data[8..], value); } + public ushort TID16 { get => ReadUInt16LittleEndian(Data[8..]); set => WriteUInt16LittleEndian(Data[8..], value); } + public ushort SID16 { get => ReadUInt16LittleEndian(Data[10..]); set => WriteUInt16LittleEndian(Data[10..], value); } + public TrainerIDFormat TrainerIDDisplayFormat => TrainerIDFormat.SixteenBit; +} diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonStat4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonStat4.cs new file mode 100644 index 000000000..a519d5353 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonStat4.cs @@ -0,0 +1,15 @@ +namespace PKHeX.Core; + +/// +/// Performance stats +/// +public enum PokeathlonStat4 : byte +{ + Speed = 0, + Power = 1, + Skill = 2, + Stamina = 3, + Jump = 4, + + Count = 5, +} diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/SpeciesForm10.cs b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/SpeciesForm10.cs new file mode 100644 index 000000000..65b19fe37 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/SpeciesForm10.cs @@ -0,0 +1,16 @@ +namespace PKHeX.Core; + +public record struct SpeciesForm10(ushort Value) : ISpeciesForm +{ + // 10 bits species + public ushort Species { get => (ushort)(Value & 0x3FF); set => Value = (ushort)((Value & ~0x3FF) | (value & 0x3FF)); } + public byte Form { get => (byte)((Value >> 10) & 0x3F); set => Value = (ushort)((Value & ~(0x3Fu << 10)) | ((((uint)value & 0x3F) << 10))); } + + /// + /// Useful sanity check. + /// + public bool IsValid => Value is 0 || (Species != 0 && PersonalTable.HGSS.IsPresentInGame(Species, Form)); + + public static implicit operator SpeciesForm10(ushort value) => new(value); + public static implicit operator ushort(SpeciesForm10 value) => value.Value; +} diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Seal4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Seal4.cs index dfc1518d8..853110340 100644 --- a/PKHeX.Core/Saves/Substructures/Gen4/Seal4.cs +++ b/PKHeX.Core/Saves/Substructures/Gen4/Seal4.cs @@ -6,100 +6,100 @@ namespace PKHeX.Core; /// 80 bytes, one for each seal. public enum Seal4 { - HeartA, - HeartB, - HeartC, - HeartD, - HeartE, - HeartF, + HeartA = 0, + HeartB = 1, + HeartC = 2, + HeartD = 3, + HeartE = 4, + HeartF = 5, - StarA, - StarB, - StarC, - StarD, - StarE, - StarF, + StarA = 6, + StarB = 7, + StarC = 8, + StarD = 9, + StarE = 10, + StarF = 11, - LineA, - LineB, - LineC, - LineD, + LineA = 12, + LineB = 13, + LineC = 14, + LineD = 15, - SmokeA, - SmokeB, - SmokeC, - SmokeD, + SmokeA = 16, + SmokeB = 17, + SmokeC = 18, + SmokeD = 19, - ElectricA, - ElectricB, - ElectricC, - ElectricD, + ElectricA = 20, + ElectricB = 21, + ElectricC = 22, + ElectricD = 23, - FoamyA, - FoamyB, - FoamyC, - FoamyD, + FoamyA = 24, + FoamyB = 25, + FoamyC = 26, + FoamyD = 27, - FireA, - FireB, - FireC, - FireD, + FireA = 28, + FireB = 29, + FireC = 30, + FireD = 31, - PartyA, - PartyB, - PartyC, - PartyD, + PartyA = 32, + PartyB = 33, + PartyC = 34, + PartyD = 35, - FloraA, - FloraB, - FloraC, - FloraD, - FloraE, - FloraF, + FloraA = 36, + FloraB = 37, + FloraC = 38, + FloraD = 39, + FloraE = 40, + FloraF = 41, - SongA, - SongB, - SongC, - SongD, - SongE, - SongF, - SongG, + SongA = 42, + SongB = 43, + SongC = 44, + SongD = 45, + SongE = 46, + SongF = 47, + SongG = 48, - LetterA, - LetterB, - LetterC, - LetterD, - LetterE, - LetterF, - LetterG, - LetterH, - LetterI, - LetterJ, - LetterK, - LetterL, - LetterM, - LetterN, - LetterO, - LetterP, - LetterQ, - LetterR, - LetterS, - LetterT, - LetterU, - LetterV, - LetterW, - LetterX, - LetterY, - LetterZ, + LetterA = 49, + LetterB = 50, + LetterC = 51, + LetterD = 52, + LetterE = 53, + LetterF = 54, + LetterG = 55, + LetterH = 56, + LetterI = 57, + LetterJ = 58, + LetterK = 59, + LetterL = 60, + LetterM = 61, + LetterN = 62, + LetterO = 63, + LetterP = 64, + LetterQ = 65, + LetterR = 66, + LetterS = 67, + LetterT = 68, + LetterU = 69, + LetterV = 70, + LetterW = 71, + LetterX = 72, + LetterY = 73, + LetterZ = 74, - Shock, - Mystery, + Shock = 75, + Mystery = 76, // Unreleased - Liquid, - Burst, - Twinkle, + Liquid = 77, + Burst = 78, + Twinkle = 79, - MAX, + MAX = 80, MAXLEGAL = Liquid, } diff --git a/PKHeX.Core/Saves/Substructures/Gen5/UnityTower5.cs b/PKHeX.Core/Saves/Substructures/Gen5/UnityTower5.cs index c9a42c978..63472272f 100644 --- a/PKHeX.Core/Saves/Substructures/Gen5/UnityTower5.cs +++ b/PKHeX.Core/Saves/Substructures/Gen5/UnityTower5.cs @@ -1,4 +1,5 @@ using System; +using static PKHeX.Core.LocaleNDS5; namespace PKHeX.Core; @@ -9,44 +10,7 @@ public sealed class UnityTower5(SAV5 SAV, Memory raw) : SaveBlock(SA private const int UnityTowerFlagOffset = 0x345; private const int GeonetOffset = 0x348; - public const int CountryCount = 232; - private const int Japan = 105; - - private static ReadOnlySpan LegalCountries => - [ - 001, 002, 003, 006, 008, 009, 012, 013, 015, 016, 017, 018, 020, 021, 022, 023, - 025, 027, 028, 029, 031, 033, 034, 035, 036, 040, 042, 043, 045, 047, 048, 049, - 051, 053, 054, 058, 060, 061, 062, 063, 064, 071, 072, 073, 074, 076, 079, 080, - 081, 082, 083, 084, 085, 087, 088, 090, 091, 092, 093, 094, 095, 096, 098, 099, - 101, 102, 103, 105, 106, 109, 111, 115, 117, 118, 121, 125, 128, 130, 132, 134, - 138, 139, 141, 145, 147, 148, 149, 150, 151, 155, 156, 157, 160, 161, 163, 164, - 166, 167, 170, 173, 174, 181, 185, 186, 188, 189, 190, 191, 194, 195, 196, 198, - 199, 200, 201, 203, 205, 206, 210, 211, 215, 217, 218, 219, 220, 221, 222, 224, - 226, 227, - ]; - - public static byte GetSubregionCount(byte country) => country switch - { - 009 => 24, // Argentina - 012 => 8, // Australia - 028 => 27, // Brazil - 036 => 13, // Canada - 043 => 33, // China - 072 => 6, // Finland - 073 => 22, // France - 079 => 16, // Germany - 095 => 35, // India - 102 => 20, // Italy - 105 => 50, // Japan - 155 => 22, // Norway - 166 => 16, // Poland - 174 => 8, // Russian Federation - 195 => 17, // Spain - 200 => 22, // Sweden - 218 => 12, // United Kingdom - 220 => 51, // United States of America - _ => 0, - }; + public static byte GetSubregionCount(byte country) => LocaleNDS5.GetSubregionCount(country); public bool GlobalFlag { get => Data[GeonetGlobalFlagOffset] != 0; set => Data[GeonetGlobalFlagOffset] = (byte)(value ? 1 : 0); } public bool UnityTowerFlag { get => Data[UnityTowerFlagOffset] != 0; set => Data[UnityTowerFlagOffset] = (byte)(value ? 1 : 0); } diff --git a/PKHeX.Core/Util/BinaryCodedDecimal.cs b/PKHeX.Core/Util/BinaryCodedDecimal.cs index 08e679965..7eb169346 100644 --- a/PKHeX.Core/Util/BinaryCodedDecimal.cs +++ b/PKHeX.Core/Util/BinaryCodedDecimal.cs @@ -20,6 +20,9 @@ private static byte GetLowestTuple(uint value) /// Returns a 32-bit signed integer converted from bytes in a Binary Coded Decimal format byte array. /// /// Input byte array to read from. + /// + /// Correctly defined Span length is required to read the appropriate amount of digits. + /// public static uint ReadUInt32BigEndian(ReadOnlySpan input) { uint result = 0; @@ -31,6 +34,9 @@ public static uint ReadUInt32BigEndian(ReadOnlySpan input) /// /// Writes the to the buffer. /// + /// + /// Correctly defined Span length is required to start writing at the highest digit. + /// public static void WriteUInt32BigEndian(Span data, uint value) { for (int i = data.Length - 1; i >= 0; i--, value /= 100) @@ -46,9 +52,7 @@ public static uint ReadUInt32LittleEndian(ReadOnlySpan input) return result; } - /// - /// Writes the to the buffer. - /// + /// public static void WriteUInt32LittleEndian(Span data, uint value) { for (int i = 0; i < data.Length; i++, value /= 100) diff --git a/PKHeX.Core/Util/ReflectUtil.cs b/PKHeX.Core/Util/ReflectUtil.cs index 617944f0f..42e015a8a 100644 --- a/PKHeX.Core/Util/ReflectUtil.cs +++ b/PKHeX.Core/Util/ReflectUtil.cs @@ -31,6 +31,12 @@ public static int CompareTo(this PropertyInfo pi, T obj, object value) return 0; } + /// + /// Attempts to set the requested property on to after converting it to the correct type. + /// + /// Property to set + /// Object to set property on + /// Value to set property to public static void SetValue(PropertyInfo pi, T obj, object value) { var c = ConvertValue(value, pi.PropertyType); diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventTrainer4Editor.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventTrainer4Editor.cs index 66eba08d6..0262be514 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventTrainer4Editor.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/Pokeathlon/PokeathlonEventTrainer4Editor.cs @@ -1,6 +1,6 @@ +using System; using System.Collections.Generic; using System.Globalization; -using System.Linq; using System.Windows.Forms; using PKHeX.Core; @@ -11,29 +11,30 @@ public sealed partial class PokeathlonEventTrainer4Editor : UserControl public PokeathlonEventTrainer4Editor() { InitializeComponent(); - var languages = new List { new(GameInfo.Strings.specieslist[0], 0) }; - languages.AddRange(GameInfo.LanguageDataSource(4, EntityContext.Gen4).Where(z => z.Value is not 0)); + var available = GameInfo.LanguageDataSource(4, EntityContext.Gen4); + var languages = new List(available.Count + 1) { new(GameInfo.Strings.specieslist[0], 0) }; + languages.AddRange(available); CB_Language.InitializeBinding(); CB_Language.DataSource = new BindingSource(languages, string.Empty); } - public void LoadObject(PokeathlonEventTrainer4 entity) + public void LoadObject(PokeathlonEventTrainer4 trainer) { - TB_OT.Text = entity.OT; - TB_TID16.Text = entity.TID16.ToString(CultureInfo.InvariantCulture); - TB_SID16.Text = entity.SID16.ToString(CultureInfo.InvariantCulture); - CB_Language.SelectedValue = (int)entity.Language; + TB_OT.Text = trainer.OriginalTrainerName; + TB_TID16.Text = trainer.TID16.ToString("00000"); + TB_SID16.Text = trainer.SID16.ToString("00000"); + CB_Language.SelectedValue = (int)trainer.Language; } - public void SaveObject(PokeathlonEventTrainer4 entity) + public void SaveObject(PokeathlonEventTrainer4 trainer) { - entity.OT = TB_OT.Text; - entity.TID16 = ParseU16(TB_TID16.Text); - entity.SID16 = ParseU16(TB_SID16.Text); - entity.Language = (byte)WinFormsUtil.GetIndex(CB_Language); + trainer.OriginalTrainerName = TB_OT.Text; + trainer.TID16 = ParseU16(TB_TID16.Text); + trainer.SID16 = ParseU16(TB_SID16.Text); + trainer.Language = (byte)WinFormsUtil.GetIndex(CB_Language); } - private static ushort ParseU16(string text) + private static ushort ParseU16(ReadOnlySpan text) { if (!ushort.TryParse(text, NumberStyles.Integer, CultureInfo.InvariantCulture, out var value)) return 0; diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Geonet4.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Geonet4.cs index 4623df8c6..0eebe1ff8 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Geonet4.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Geonet4.cs @@ -38,11 +38,11 @@ private void InitializeDGVGeonet() Item_Point.InitializeBinding(); Item_Point.DataSource = pointList; - for (int i = 1; i <= Geonet4.CountryCount; i++) + for (int i = 1; i <= LocaleNDS4.CountryCount; i++) { var country = countryList[i].Value; var countryName = countryList[i].Text; - var subregionCount = Geonet4.GetSubregionCount((byte)country); + var subregionCount = LocaleNDS4.GetSubregionCount((byte)country); var subregionList = (subregionCount == 0) ? subregionListDefault : Util.GetCountryRegionList($"gen4_sr_{country:000}", Main.CurrentLanguage); if (subregionCount == 0) { diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_UnityTower.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_UnityTower.cs index 0882e5e80..049227cfa 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_UnityTower.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_UnityTower.cs @@ -40,7 +40,7 @@ private void InitializeDGVGeonet() Item_Point.InitializeBinding(); Item_Point.DataSource = pointList; - for (int i = 1; i <= UnityTower5.CountryCount; i++) + for (int i = 1; i <= LocaleNDS5.CountryCount; i++) { var country = countryList[i].Value; var countryName = countryList[i].Text; @@ -76,8 +76,8 @@ private void InitializeDGVUnityTower() { DGV_UnityTower.Rows.Clear(); - DGV_UnityTower.Rows.Add(UnityTower5.CountryCount); - for (int i = 0; i < UnityTower5.CountryCount; i++) + DGV_UnityTower.Rows.Add(LocaleNDS5.CountryCount); + for (int i = 0; i < LocaleNDS5.CountryCount; i++) { var row = DGV_UnityTower.Rows[i]; var country = countryList[i + 1].Value; From 93661ea50d1e098d39f940fc7b474e7b49ccba36 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 30 May 2026 23:31:44 -0500 Subject: [PATCH 55/81] Update Gen4GlobalTradeRules.cs Fix comparison to actually indicate Korean GTS exchange required --- PKHeX.Core/Legality/Verifiers/Misc/Gen4GlobalTradeRules.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/PKHeX.Core/Legality/Verifiers/Misc/Gen4GlobalTradeRules.cs b/PKHeX.Core/Legality/Verifiers/Misc/Gen4GlobalTradeRules.cs index 54ea94200..52d853b86 100644 --- a/PKHeX.Core/Legality/Verifiers/Misc/Gen4GlobalTradeRules.cs +++ b/PKHeX.Core/Legality/Verifiers/Misc/Gen4GlobalTradeRules.cs @@ -12,8 +12,10 @@ public static bool IsRequiredGTS(ITrainerInfo tr, LanguageID currentLanguage) if (tr.Generation != 4) return false; // only applies to Gen4 - // Cannot trade only if the trainer is Korean and the game language is not Korean. - return (LanguageID)tr.Language == LanguageID.Korean && currentLanguage != LanguageID.Korean; + // Korean and International can only exchange Pokémon via GTS. + var isKoreanTrainer = (LanguageID)tr.Language == LanguageID.Korean; + var isKoreanEntity = currentLanguage == LanguageID.Korean; + return isKoreanTrainer != isKoreanEntity; } /// From 57162fa739981473e51f5de279cf769d802e1731 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 31 May 2026 09:51:07 -0500 Subject: [PATCH 56/81] Update SpeciesName.cs --- PKHeX.Core/PKM/Util/SpeciesName.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PKHeX.Core/PKM/Util/SpeciesName.cs b/PKHeX.Core/PKM/Util/SpeciesName.cs index 60a8ba2c8..4782dd897 100644 --- a/PKHeX.Core/PKM/Util/SpeciesName.cs +++ b/PKHeX.Core/PKM/Util/SpeciesName.cs @@ -336,7 +336,7 @@ private static int GetSpeciesNameLanguage(ushort species, ReadOnlySpan nic /// True if the species was found, False if not public static bool TryGetSpecies(ReadOnlySpan speciesName, int language, out ushort species) { - if (SpeciesDict.Length < language) + if (language < SpeciesDict.Length) return SpeciesDict[language].TryGetValue(speciesName, out species); species = 0; return false; From ff0ad621e3a98ba9c355d82502f84af634d493d2 Mon Sep 17 00:00:00 2001 From: Kurt Date: Mon, 1 Jun 2026 22:20:46 -0500 Subject: [PATCH 57/81] HGSS: fix pokeathlon trainer name get/set off by 4 lol --- .../Substructures/Gen4/Pokeathlon/PokeathlonConnection4.cs | 1 - .../Substructures/Gen4/Pokeathlon/PokeathlonEventTrainer4.cs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonConnection4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonConnection4.cs index 368a72855..183ea41e7 100644 --- a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonConnection4.cs +++ b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonConnection4.cs @@ -1,5 +1,4 @@ using System; -using static System.Buffers.Binary.BinaryPrimitives; namespace PKHeX.Core; diff --git a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEventTrainer4.cs b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEventTrainer4.cs index dbd29f31d..b3627d0e4 100644 --- a/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEventTrainer4.cs +++ b/PKHeX.Core/Saves/Substructures/Gen4/Pokeathlon/PokeathlonEventTrainer4.cs @@ -12,7 +12,7 @@ public struct PokeathlonEventTrainer4(Memory Raw) : ITrainerID32 public ushort SID16 { get => ReadUInt16LittleEndian(Data[2..]); set => WriteUInt16LittleEndian(Data[2..], value); } public TrainerIDFormat TrainerIDDisplayFormat => TrainerIDFormat.SixteenBit; - public Span OriginalTrainerTrash => Data.Slice(8, 8 * sizeof(ushort)); + public Span OriginalTrainerTrash => Data.Slice(4, 8 * sizeof(ushort)); public byte Language { get => Data[0x14]; set => Data[0x14] = value; } // remaining 3 bytes unused From a0328c8330816b5ebff6160697aaa6b1ec3bada4 Mon Sep 17 00:00:00 2001 From: Kurt Date: Mon, 1 Jun 2026 22:25:34 -0500 Subject: [PATCH 58/81] Misc tweaks Minor internal api safety to avoid potential memory leaks --- PKHeX.Core/Saves/SAV4HGSS.cs | 13 ++++-------- PKHeX.Drawing/ImageUtil.cs | 39 +++++++++++++++++------------------- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/PKHeX.Core/Saves/SAV4HGSS.cs b/PKHeX.Core/Saves/SAV4HGSS.cs index c33453ab8..0a47a8764 100644 --- a/PKHeX.Core/Saves/SAV4HGSS.cs +++ b/PKHeX.Core/Saves/SAV4HGSS.cs @@ -208,27 +208,22 @@ public int Badges16 } private const int OFS_GearRolodex = 0xC0EC; - private const byte GearMaxCallers = (byte)(PokegearNumber.Ernest + 1); + private const byte GearCallerCount = (byte)(PokegearNumber.Ernest + 1); public PokegearNumber GetCallerAtIndex(int index) => (PokegearNumber)General[OFS_GearRolodex + index]; public void SetCallerAtIndex(int index, PokegearNumber caller) => General[OFS_GearRolodex + index] = (byte)caller; public Span GetPokeGearRoloDex() { - var arr = General.Slice(OFS_GearRolodex, GearMaxCallers); + var arr = General.Slice(OFS_GearRolodex, GearCallerCount); return MemoryMarshal.Cast(arr); } - public void SetPokeGearRoloDex(ReadOnlySpan value) - { - if (value.Length > GearMaxCallers) - throw new ArgumentOutOfRangeException(nameof(value)); - MemoryMarshal.AsBytes(value).CopyTo(General.Slice(OFS_GearRolodex, GearMaxCallers)); - } + public void SetPokeGearRoloDex(ReadOnlySpan value) => value.CopyTo(GetPokeGearRoloDex()); public void PokeGearUnlockAllCallers() { - for (int i = 0; i < GearMaxCallers; i++) + for (int i = 0; i < GearCallerCount; i++) SetCallerAtIndex(i, (PokegearNumber)i); } diff --git a/PKHeX.Drawing/ImageUtil.cs b/PKHeX.Drawing/ImageUtil.cs index 0bd3ca755..f8fed2c9e 100644 --- a/PKHeX.Drawing/ImageUtil.cs +++ b/PKHeX.Drawing/ImageUtil.cs @@ -32,8 +32,7 @@ public static class ImageUtil public Span GetBitmapData(out BitmapData bmpData, PixelFormat format = PixelFormat.Format32bppArgb) { bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, format); - var bpp = Image.GetPixelFormatSize(format) / 8; - return GetSpan(bmpData.Scan0, bmp.Width * bmp.Height * bpp); + return GetSpan(bmpData.Scan0, Math.Abs(bmpData.Stride) * bmpData.Height); } public void GetBitmapData(Span data, PixelFormat format = PixelFormat.Format32bppArgb) @@ -69,10 +68,9 @@ public void SetBitmapData(Span data) public byte[] GetBitmapData() { var format = bmp.PixelFormat; - var bpp = Image.GetPixelFormatSize(format) / 8; - var result = new byte[bmp.Width * bmp.Height * bpp]; - bmp.GetBitmapData(result, format); - return result; + var span = bmp.GetBitmapData(out var bmpData, format); + try { return [..span]; } + finally { bmp.UnlockBits(bmpData); } } public void ToGrayscale(float intensity) @@ -81,8 +79,8 @@ public void ToGrayscale(float intensity) return; // don't care var data = bmp.GetBitmapData(out var bmpData); - SetAllColorToGrayScale(data, intensity); - bmp.UnlockBits(bmpData); + try { SetAllColorToGrayScale(data, intensity); } + finally { bmp.UnlockBits(bmpData); } } public void ChangeOpacity(double trans) @@ -91,8 +89,8 @@ public void ChangeOpacity(double trans) return; // don't care var data = bmp.GetBitmapData(out var bmpData); - SetAllTransparencyTo(data, trans); - bmp.UnlockBits(bmpData); + try { SetAllTransparencyTo(data, trans); } + finally { bmp.UnlockBits(bmpData); } } public void BlendTransparentTo(Color c, byte trans, int start = 0, int end = -1) @@ -100,15 +98,15 @@ public void BlendTransparentTo(Color c, byte trans, int start = 0, int end = -1) var data = bmp.GetBitmapData(out var bmpData); if (end == -1) end = data.Length; - BlendAllTransparencyTo(data[start..end], c, trans); - bmp.UnlockBits(bmpData); + try { BlendAllTransparencyTo(data[start..end], c, trans); } + finally { bmp.UnlockBits(bmpData); } } public void ChangeAllColorTo(Color c) { var data = bmp.GetBitmapData(out var bmpData); - ChangeAllColorTo(data, c); - bmp.UnlockBits(bmpData); + try { ChangeAllColorTo(data, c); } + finally { bmp.UnlockBits(bmpData); } } public void ChangeTransparentTo(Color c, byte trans, int start = 0, int end = -1) @@ -116,23 +114,22 @@ public void ChangeTransparentTo(Color c, byte trans, int start = 0, int end = -1 var data = bmp.GetBitmapData(out var bmpData); if (end == -1) end = data.Length; - SetAllTransparencyTo(data[start..end], c, trans); - bmp.UnlockBits(bmpData); + try { SetAllTransparencyTo(data[start..end], c, trans); } + finally { bmp.UnlockBits(bmpData); } } public void WritePixels(Color c, int start, int end) { var data = bmp.GetBitmapData(out var bmpData); - ChangeAllTo(data, c, start, end); - bmp.UnlockBits(bmpData); + try { ChangeAllTo(data, c, start, end); } + finally { bmp.UnlockBits(bmpData); } } public int GetAverageColor() { var data = bmp.GetBitmapData(out var bmpData); - var avg = GetAverageColor(data); - bmp.UnlockBits(bmpData); - return avg; + try { return GetAverageColor(data); } + finally { bmp.UnlockBits(bmpData); } } } From 7603943e25fcb280f8cdf78a40149449566f59a2 Mon Sep 17 00:00:00 2001 From: Kurt Date: Tue, 2 Jun 2026 00:32:35 -0500 Subject: [PATCH 59/81] Add save file force loader (CTRL-ALT-L) Accessible on release builds too; now joined by the hex-clipboard &Import and the list-pl&Ugins maybe I'll add these as a visible toolstrip. for now, feature is available to those in-the-know, and who should know-better. does this allow loading of previous unsupported romhack savefiles? yeah. should it be used to do that? no. --- PKHeX.WinForms/MainWindow/Main.cs | 5 +- .../SaveHandlerTroubleshooter.Designer.cs | 259 ++++++++++++++++++ .../Subforms/SaveHandlerTroubleshooter.cs | 190 +++++++++++++ PKHeX.WinForms/Util/DevUtil.cs | 29 +- PKHeX.WinForms/Util/Troubleshooting.cs | 114 ++++++++ 5 files changed, 567 insertions(+), 30 deletions(-) create mode 100644 PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.cs create mode 100644 PKHeX.WinForms/Util/Troubleshooting.cs diff --git a/PKHeX.WinForms/MainWindow/Main.cs b/PKHeX.WinForms/MainWindow/Main.cs index 64af758cd..356b578f3 100644 --- a/PKHeX.WinForms/MainWindow/Main.cs +++ b/PKHeX.WinForms/MainWindow/Main.cs @@ -170,6 +170,7 @@ private void FormInitializeSecond() PB_Legal.Visible = !HaX; C_SAV.HaX = PKME_Tabs.HaX = HaX; + Troubleshooting.AddTroubleshootingControls(Menu_Tools, Plugins); #if DEBUG DevUtil.AddDeveloperControls(Menu_Tools, Plugins); #endif @@ -724,7 +725,7 @@ private static void StoreLegalSaveGameData(SaveFile sav) EReaderBerrySettings.LoadFrom(sav3); } - private bool OpenSAV(SaveFile sav, string path) + internal bool OpenSAV(SaveFile sav, string path, bool forceOpen = false) { if (ModifierKeys == Keys.Alt) { @@ -732,7 +733,7 @@ private bool OpenSAV(SaveFile sav, string path) if (SaveUtil.TryOverride(sav, other, out var replace)) sav = replace; } - if (!sav.IsVersionValid()) + if (!sav.IsVersionValid() && !forceOpen) { WinFormsUtil.Error(MsgFileLoadSaveLoadFail, path); return true; diff --git a/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.Designer.cs b/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.Designer.cs new file mode 100644 index 000000000..1560efad0 --- /dev/null +++ b/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.Designer.cs @@ -0,0 +1,259 @@ +namespace PKHeX.WinForms +{ + sealed partial class SaveHandlerTroubleshooter + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + L_Path = new System.Windows.Forms.Label(); + TB_Path = new System.Windows.Forms.TextBox(); + B_Browse = new System.Windows.Forms.Button(); + L_Type = new System.Windows.Forms.Label(); + CB_Type = new System.Windows.Forms.ComboBox(); + L_SubVersion = new System.Windows.Forms.Label(); + CB_SubVersion = new System.Windows.Forms.ComboBox(); + L_Language = new System.Windows.Forms.Label(); + CB_Language = new System.Windows.Forms.ComboBox(); + L_Handler = new System.Windows.Forms.Label(); + CB_Handler = new System.Windows.Forms.ComboBox(); + B_Continue = new System.Windows.Forms.Button(); + TLP_Main = new System.Windows.Forms.TableLayoutPanel(); + TLP_Main.SuspendLayout(); + SuspendLayout(); + // + // L_Path + // + L_Path.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Path.AutoSize = true; + L_Path.Location = new System.Drawing.Point(55, 16); + L_Path.Margin = new System.Windows.Forms.Padding(3, 6, 3, 0); + L_Path.Name = "L_Path"; + L_Path.Size = new System.Drawing.Size(36, 17); + L_Path.TabIndex = 0; + L_Path.Text = "Path:"; + // + // TB_Path + // + TB_Path.AccessibleDescription = "Path to the save file to load with the selected handler."; + TB_Path.AccessibleName = "Save Path"; + TB_Path.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + TB_Path.Location = new System.Drawing.Point(97, 3); + TB_Path.Margin = new System.Windows.Forms.Padding(3, 3, 3, 16); + TB_Path.Name = "TB_Path"; + TB_Path.ReadOnly = true; + TB_Path.Size = new System.Drawing.Size(409, 25); + TB_Path.TabIndex = 1; + // + // B_Browse + // + B_Browse.AccessibleDescription = "Selects the save file to load."; + B_Browse.AccessibleName = "Browse Save File"; + B_Browse.AutoSize = true; + B_Browse.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + B_Browse.Location = new System.Drawing.Point(512, 3); + B_Browse.Name = "B_Browse"; + B_Browse.Size = new System.Drawing.Size(69, 27); + B_Browse.TabIndex = 2; + B_Browse.Text = "Browse..."; + B_Browse.UseVisualStyleBackColor = true; + B_Browse.Click += B_Browse_Click; + // + // L_Type + // + L_Type.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Type.AutoSize = true; + L_Type.Location = new System.Drawing.Point(3, 53); + L_Type.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0); + L_Type.Name = "L_Type"; + L_Type.Size = new System.Drawing.Size(88, 17); + L_Type.TabIndex = 0; + L_Type.Text = "Save file type:"; + // + // CB_Type + // + CB_Type.AccessibleDescription = "Selects the target save file type."; + CB_Type.AccessibleName = "Save File Type"; + CB_Type.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CB_Type.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_Type.FormattingEnabled = true; + CB_Type.Location = new System.Drawing.Point(97, 47); + CB_Type.Name = "CB_Type"; + CB_Type.Size = new System.Drawing.Size(409, 25); + CB_Type.TabIndex = 1; + // + // L_SubVersion + // + L_SubVersion.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_SubVersion.AutoSize = true; + L_SubVersion.Location = new System.Drawing.Point(12, 84); + L_SubVersion.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0); + L_SubVersion.Name = "L_SubVersion"; + L_SubVersion.Size = new System.Drawing.Size(79, 17); + L_SubVersion.TabIndex = 0; + L_SubVersion.Text = "Sub version:"; + // + // CB_SubVersion + // + CB_SubVersion.AccessibleDescription = "Selects the specific game version within the save file type."; + CB_SubVersion.AccessibleName = "Save Sub Version"; + CB_SubVersion.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CB_SubVersion.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_SubVersion.FormattingEnabled = true; + CB_SubVersion.Location = new System.Drawing.Point(97, 78); + CB_SubVersion.Name = "CB_SubVersion"; + CB_SubVersion.Size = new System.Drawing.Size(409, 25); + CB_SubVersion.TabIndex = 1; + // + // L_Language + // + L_Language.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Language.AutoSize = true; + L_Language.Location = new System.Drawing.Point(23, 115); + L_Language.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0); + L_Language.Name = "L_Language"; + L_Language.Size = new System.Drawing.Size(68, 17); + L_Language.TabIndex = 0; + L_Language.Text = "Language:"; + // + // CB_Language + // + CB_Language.AccessibleDescription = "Selects the save language passed to save loading."; + CB_Language.AccessibleName = "Save Language"; + CB_Language.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CB_Language.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_Language.FormattingEnabled = true; + CB_Language.Location = new System.Drawing.Point(97, 109); + CB_Language.Name = "CB_Language"; + CB_Language.Size = new System.Drawing.Size(409, 25); + CB_Language.TabIndex = 1; + // + // L_Handler + // + L_Handler.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Handler.AutoSize = true; + L_Handler.Location = new System.Drawing.Point(34, 146); + L_Handler.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0); + L_Handler.Name = "L_Handler"; + L_Handler.Size = new System.Drawing.Size(57, 17); + L_Handler.TabIndex = 0; + L_Handler.Text = "Handler:"; + // + // CB_Handler + // + CB_Handler.AccessibleDescription = "Selects the preprocessing save handler."; + CB_Handler.AccessibleName = "Save Handler"; + CB_Handler.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CB_Handler.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_Handler.FormattingEnabled = true; + CB_Handler.Location = new System.Drawing.Point(97, 140); + CB_Handler.Name = "CB_Handler"; + CB_Handler.Size = new System.Drawing.Size(409, 25); + CB_Handler.TabIndex = 1; + // + // B_Continue + // + B_Continue.AccessibleDescription = "Attempts to load the selected file with the chosen save handler settings."; + B_Continue.AccessibleName = "Continue Load"; + B_Continue.AutoSize = true; + B_Continue.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + B_Continue.Location = new System.Drawing.Point(512, 171); + B_Continue.Name = "B_Continue"; + B_Continue.Size = new System.Drawing.Size(69, 27); + B_Continue.TabIndex = 0; + B_Continue.Text = "Continue"; + B_Continue.UseVisualStyleBackColor = true; + B_Continue.Click += B_Continue_Click; + // + // TLP_Main + // + TLP_Main.ColumnCount = 3; + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.Controls.Add(B_Continue, 2, 5); + TLP_Main.Controls.Add(CB_Handler, 1, 4); + TLP_Main.Controls.Add(L_Handler, 0, 4); + TLP_Main.Controls.Add(CB_Language, 1, 3); + TLP_Main.Controls.Add(L_Language, 0, 3); + TLP_Main.Controls.Add(CB_SubVersion, 1, 2); + TLP_Main.Controls.Add(L_SubVersion, 0, 2); + TLP_Main.Controls.Add(L_Type, 0, 1); + TLP_Main.Controls.Add(B_Browse, 2, 0); + TLP_Main.Controls.Add(CB_Type, 1, 1); + TLP_Main.Controls.Add(TB_Path, 1, 0); + TLP_Main.Controls.Add(L_Path, 0, 0); + TLP_Main.AllowDrop = true; + TLP_Main.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Main.Location = new System.Drawing.Point(0, 0); + TLP_Main.Name = "TLP_Main"; + TLP_Main.RowCount = 6; + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_Main.Size = new System.Drawing.Size(584, 201); + TLP_Main.TabIndex = 6; + TLP_Main.DragDrop += SaveHandlerTroubleshooter_DragDrop; + TLP_Main.DragEnter += SaveHandlerTroubleshooter_DragEnter; + // + // SaveHandlerTroubleshooter + // + AllowDrop = true; + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + ClientSize = new System.Drawing.Size(584, 201); + Controls.Add(TLP_Main); + DragDrop += SaveHandlerTroubleshooter_DragDrop; + DragEnter += SaveHandlerTroubleshooter_DragEnter; + FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + Icon = Properties.Resources.Icon; + MaximizeBox = false; + MinimizeBox = false; + Name = "SaveHandlerTroubleshooter"; + StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + Text = "Save Handler Troubleshooter"; + TLP_Main.ResumeLayout(false); + TLP_Main.PerformLayout(); + ResumeLayout(false); + } + + #endregion + private System.Windows.Forms.Label L_Path; + private System.Windows.Forms.TextBox TB_Path; + private System.Windows.Forms.Button B_Browse; + private System.Windows.Forms.Label L_Type; + private System.Windows.Forms.ComboBox CB_Type; + private System.Windows.Forms.Label L_SubVersion; + private System.Windows.Forms.ComboBox CB_SubVersion; + private System.Windows.Forms.Label L_Language; + private System.Windows.Forms.ComboBox CB_Language; + private System.Windows.Forms.Label L_Handler; + private System.Windows.Forms.ComboBox CB_Handler; + private System.Windows.Forms.Button B_Continue; + private System.Windows.Forms.TableLayoutPanel TLP_Main; + } +} diff --git a/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.cs b/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.cs new file mode 100644 index 000000000..5e06e5b6b --- /dev/null +++ b/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Windows.Forms; +using PKHeX.Core; +using static PKHeX.Core.MessageStrings; + +namespace PKHeX.WinForms; + +internal sealed partial class SaveHandlerTroubleshooter : Form +{ + private readonly Main _main; + + internal SaveHandlerTroubleshooter(Main main) + { + ArgumentNullException.ThrowIfNull(main); + _main = main; + + InitializeComponent(); + InitializeBindings(); + CB_Type.SelectedIndexChanged += CB_Type_SelectedIndexChanged; + WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); + CenterToParent(); + } + + private void InitializeBindings() + { + CB_Type.DataSource = Enum.GetValues() + .Where(z => z is not SaveFileType.None) + .Select(z => new SelectionItem(z.ToString(), z)) + .ToList(); + + CB_Language.DataSource = Enum.GetValues() + .Select(z => new SelectionItem(z.ToString(), z)) + .ToList(); + + var handlers = SaveUtil.Handlers.ToList(); + handlers.Insert(0, new SaveHandlerDefault()); + CB_Handler.DataSource = handlers + .Select(z => new HandlerItem(GetHandlerDisplayName(z), z)) + .ToList(); + + UpdateSubVersionChoices(); + } + + private void CB_Type_SelectedIndexChanged(object? sender, EventArgs e) => UpdateSubVersionChoices(); + + private void UpdateSubVersionChoices() + { + var type = GetSelectedValue(CB_Type, SaveFileType.None); + List> versions = + [ + ..GameUtil.GameVersions + .Where(z => z.SaveFileType == type) + .Distinct() + .Select(z => new SelectionItem(GetGameVersionDisplayName(z), z)) + ]; + + CB_SubVersion.DataSource = versions; + CB_SubVersion.SelectedIndex = 0; + } + + private void B_Browse_Click(object? sender, EventArgs e) + { + using OpenFileDialog ofd = new(); + ofd.Filter = "All Files|*.*"; + ofd.Title = MsgFileLoadSelectFileSave; + + if (!string.IsNullOrWhiteSpace(TB_Path.Text)) + ofd.FileName = TB_Path.Text; + + if (ofd.ShowDialog(this) == DialogResult.OK) + TB_Path.Text = ofd.FileName; + } + + private void B_Continue_Click(object? sender, EventArgs e) + { + var path = TB_Path.Text.Trim(); + if (string.IsNullOrWhiteSpace(path)) + { + WinFormsUtil.Error(MsgFileLoadSelectFileSave); + return; + } + + if (!File.Exists(path)) + { + WinFormsUtil.Error(MsgFileLoadFail, path); + return; + } + + byte[] data; + try + { + data = File.ReadAllBytes(path); + } + catch (Exception ex) + { + WinFormsUtil.Error($"{MsgFileInUse}{Environment.NewLine}{path}", ex); + return; + } + + if (CB_Handler.SelectedItem is not HandlerItem handler) + { + WinFormsUtil.Error(MsgFileLoadFail); + return; + } + + var typeInfo = new SaveTypeInfo( + GetSelectedValue(CB_Type, SaveFileType.None), + GetSelectedValue(CB_SubVersion, GameVersion.Any), + GetSelectedValue(CB_Language, LanguageID.None)); + + SaveFile? sav; + try + { + if (!SaveUtil.TryGetSaveFileHandler(data, out sav, path, handler.Handler, typeInfo)) + { + WinFormsUtil.Error(MsgFileLoadSaveFail, path); + return; + } + } + catch (Exception ex) + { + WinFormsUtil.Error(MsgFileLoadSaveLoadFail, ex); + return; + } + + try + { + _main.OpenSAV(sav, path, forceOpen: true); + Close(); + } + catch (Exception ex) + { + WinFormsUtil.Error(MsgFileLoadSaveLoadFail, ex); + } + } + + private static void SaveHandlerTroubleshooter_DragEnter(object? sender, DragEventArgs e) + { + e.Effect = e.Data?.GetDataPresent(DataFormats.FileDrop) == true + ? DragDropEffects.Copy + : DragDropEffects.None; + } + + private void SaveHandlerTroubleshooter_DragDrop(object? sender, DragEventArgs e) + { + if (e.Data?.GetData(DataFormats.FileDrop) is not string[] files || files.Length == 0) + return; + + TB_Path.Text = files[0]; + } + + private static T GetSelectedValue(ComboBox comboBox, T fallback) where T : struct + => comboBox.SelectedItem is SelectionItem item ? item.Value : fallback; + + private static string GetGameVersionDisplayName(GameVersion version) + { + var text = GameInfo.GetVersionName(version); + return string.IsNullOrWhiteSpace(text) ? version.ToString() : text; + } + + private static string GetHandlerDisplayName(ISaveHandler handler) + { + const string Prefix = "SaveHandler"; + var name = handler.GetType().Name; + return name.StartsWith(Prefix, StringComparison.Ordinal) ? name[Prefix.Length..] : name; + } + + private sealed record SelectionItem(string Text, T Value) + { + public override string ToString() => Text; + } + + private sealed record HandlerItem(string Text, ISaveHandler Handler) + { + public override string ToString() => Text; + } + + private sealed class SaveHandlerDefault : ISaveHandler + { + public bool IsRecognized(long size) => true; + + public SaveHandlerSplitResult TrySplit(Memory input) + => new(input, default, default, this); + + public void Finalize(Span input) { } + } +} diff --git a/PKHeX.WinForms/Util/DevUtil.cs b/PKHeX.WinForms/Util/DevUtil.cs index 97a211da0..8b69728b2 100644 --- a/PKHeX.WinForms/Util/DevUtil.cs +++ b/PKHeX.WinForms/Util/DevUtil.cs @@ -17,8 +17,7 @@ public static void AddDeveloperControls(ToolStripDropDownItem t, List p { t.DropDownItems.Add(GetTranslationUpdater(Keys.D)); t.DropDownItems.Add(GetPogoPickleReload(Keys.P)); - t.DropDownItems.Add(GetHexImporter(Keys.I)); - t.DropDownItems.Add(GetPluginInfo(Keys.L, plugins)); + t.DropDownItems.Add(GetPluginInfo(Keys.U, plugins)); } private static string DefaultLanguage => Main.CurrentLanguage; @@ -39,13 +38,6 @@ private static void UpdateAll() IsUpdatingTranslations = false; } - private static ToolStripMenuItem GetHexImporter(Keys key) - { - var ti = GetHiddenMenu(key); - ti.Click += (_, _) => OpenFileFromClipboardHex(); - return ti; - } - private static ToolStripMenuItem GetTranslationUpdater(Keys key) { var ti = GetHiddenMenu(key); @@ -73,25 +65,6 @@ private static ToolStripMenuItem GetHiddenMenu(Keys key) => new() Visible = false, }; - private static void OpenFileFromClipboardHex() - { - var hex = Clipboard.GetText().Trim(); - if (string.IsNullOrEmpty(hex)) - { - WinFormsUtil.Alert("Clipboard is empty."); - return; - } - try - { - var data = Convert.FromHexString(hex.Replace(" ", "")); - Application.OpenForms.OfType
().First().OpenFile(data, "", ""); - } - catch (FormatException) - { - WinFormsUtil.Alert("Clipboard does not contain valid hex data."); - } - } - private static void DisplayPluginList(List plugins) { var text = new StringBuilder(); diff --git a/PKHeX.WinForms/Util/Troubleshooting.cs b/PKHeX.WinForms/Util/Troubleshooting.cs new file mode 100644 index 000000000..d28326f45 --- /dev/null +++ b/PKHeX.WinForms/Util/Troubleshooting.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms; + +public static class Troubleshooting +{ + public static void AddTroubleshootingControls(ToolStripDropDownItem item, List plugins) + { + item.DropDownItems.Add(GetSaveHandlerTroubleshooter(Keys.L)); + item.DropDownItems.Add(GetHexImporter(Keys.I)); + item.DropDownItems.Add(GetPluginInfo(Keys.U, plugins)); + } + + private static ToolStripMenuItem GetSaveHandlerTroubleshooter(Keys key) + { + var item = GetHiddenMenu(key); + item.Click += (_, _) => OpenSaveHandlerTroubleshooter(); + return item; + } + + private static ToolStripMenuItem GetHexImporter(Keys key) + { + var item = GetHiddenMenu(key); + item.Click += (_, _) => OpenFileFromClipboardHex(); + return item; + } + + private static ToolStripMenuItem GetPluginInfo(Keys key, List plugins) + { + var item = GetHiddenMenu(key); + item.Click += (_, _) => DisplayPluginList(plugins); + return item; + } + + private static ToolStripMenuItem GetHiddenMenu(Keys key) => new() + { + ShortcutKeys = Keys.Control | Keys.Alt | key, + Visible = false, + }; + + private static void OpenSaveHandlerTroubleshooter() + { + var main = Application.OpenForms.OfType
().FirstOrDefault(); + if (main is null) + return; + + using var form = new SaveHandlerTroubleshooter(main); + form.ShowDialog(main); + } + + private static void OpenFileFromClipboardHex() + { + var hex = Clipboard.GetText().Trim(); + if (string.IsNullOrEmpty(hex)) + { + WinFormsUtil.Alert("Clipboard is empty."); + return; + } + + try + { + var data = Convert.FromHexString(hex.Replace(" ", "")); + Application.OpenForms.OfType
().First().OpenFile(data, string.Empty, string.Empty); + } + catch (FormatException) + { + WinFormsUtil.Alert("Clipboard does not contain valid hex data."); + } + } + + private static void DisplayPluginList(List plugins) + { + var text = new StringBuilder(); + + text.AppendLine($"Loaded {plugins.Count} plugins:"); + if (plugins.Count == 0) + { + text.AppendLine("None."); + WinFormsUtil.Alert(text.ToString()); + return; + } + + List<(IPlugin Plugin, string Group)> loaded = []; + foreach (var plugin in plugins) + { + var assembly = plugin.GetType().Assembly; + var fullName = assembly.FullName; + if (fullName != null) + { + var culture = fullName.IndexOf("Culture", StringComparison.Ordinal); + if (culture != -1) + fullName = fullName[..(culture - 2)]; + if (fullName.EndsWith(".0", StringComparison.Ordinal)) + fullName = fullName[..^2]; + } + + loaded.Add(new(plugin, fullName ?? "Unknown")); + } + + foreach (var group in loaded.GroupBy(z => z.Group).OrderBy(z => z.Key)) + { + text.AppendLine(group.Key); + foreach (var plugin in group.OrderBy(z => z.Plugin.Name)) + text.AppendLine($"- {plugin.Plugin.Name}"); + } + + WinFormsUtil.Alert(text.ToString()); + } +} From 2897b957239ac1dd02fd8635f3fe90ff9e5d8162 Mon Sep 17 00:00:00 2001 From: Kurt Date: Tue, 2 Jun 2026 22:31:20 -0500 Subject: [PATCH 60/81] Reduce padding in OT/Misc tab, gen6/7 was too tall --- .../Controls/PKM Editor/PKMEditor.Designer.cs | 84 +++++++++---------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.Designer.cs b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.Designer.cs index 0c8cc1eb3..57377819c 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.Designer.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.Designer.cs @@ -2561,7 +2561,7 @@ private void InitializeComponent() TLP_OTMisc.Location = new System.Drawing.Point(0, 0); TLP_OTMisc.Margin = new System.Windows.Forms.Padding(0); TLP_OTMisc.Name = "TLP_OTMisc"; - TLP_OTMisc.Padding = new System.Windows.Forms.Padding(0, 16, 0, 0); + TLP_OTMisc.Padding = new System.Windows.Forms.Padding(0, 12, 0, 0); TLP_OTMisc.RowCount = 20; TLP_OTMisc.RowStyles.Add(new System.Windows.Forms.RowStyle()); TLP_OTMisc.RowStyles.Add(new System.Windows.Forms.RowStyle()); @@ -2591,7 +2591,7 @@ private void InitializeComponent() TB_FriendshipHT.AccessibleDescription = "Handling Trainer Friendship"; TB_FriendshipHT.AccessibleName = "Handling Trainer Friendship"; TB_FriendshipHT.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - TB_FriendshipHT.Location = new System.Drawing.Point(136, 323); + TB_FriendshipHT.Location = new System.Drawing.Point(136, 311); TB_FriendshipHT.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); TB_FriendshipHT.Mask = "000"; TB_FriendshipHT.Name = "TB_FriendshipHT"; @@ -2606,7 +2606,7 @@ private void InitializeComponent() TLP_OTMisc.SetColumnSpan(CAL_ReceivedDateTime, 2); CAL_ReceivedDateTime.CustomFormat = "yyyy-MM-dd HH:mm:ss tt"; CAL_ReceivedDateTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom; - CAL_ReceivedDateTime.Location = new System.Drawing.Point(24, 477); + CAL_ReceivedDateTime.Location = new System.Drawing.Point(24, 457); CAL_ReceivedDateTime.Margin = new System.Windows.Forms.Padding(24, 0, 0, 0); CAL_ReceivedDateTime.MinDate = new System.DateTime(2000, 1, 1, 0, 0, 0, 0); CAL_ReceivedDateTime.Name = "CAL_ReceivedDateTime"; @@ -2618,7 +2618,7 @@ private void InitializeComponent() L_ArrivedDateTime.Anchor = System.Windows.Forms.AnchorStyles.Left; L_ArrivedDateTime.AutoSize = true; TLP_OTMisc.SetColumnSpan(L_ArrivedDateTime, 2); - L_ArrivedDateTime.Location = new System.Drawing.Point(24, 444); + L_ArrivedDateTime.Location = new System.Drawing.Point(24, 424); L_ArrivedDateTime.Margin = new System.Windows.Forms.Padding(24, 0, 0, 0); L_ArrivedDateTime.Name = "L_ArrivedDateTime"; L_ArrivedDateTime.Padding = new System.Windows.Forms.Padding(0, 16, 0, 0); @@ -2631,7 +2631,7 @@ private void InitializeComponent() // Label_EncryptionConstant.Anchor = System.Windows.Forms.AnchorStyles.Right; Label_EncryptionConstant.AutoSize = true; - Label_EncryptionConstant.Location = new System.Drawing.Point(9, 422); + Label_EncryptionConstant.Location = new System.Drawing.Point(9, 402); Label_EncryptionConstant.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); Label_EncryptionConstant.Name = "Label_EncryptionConstant"; Label_EncryptionConstant.Size = new System.Drawing.Size(127, 17); @@ -2643,7 +2643,7 @@ private void InitializeComponent() // TB_HomeTracker.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; TB_HomeTracker.Font = new System.Drawing.Font("Courier New", 8.25F); - TB_HomeTracker.Location = new System.Drawing.Point(136, 400); + TB_HomeTracker.Location = new System.Drawing.Point(136, 380); TB_HomeTracker.Margin = new System.Windows.Forms.Padding(0, 2, 0, 0); TB_HomeTracker.MaxLength = 16; TB_HomeTracker.Name = "TB_HomeTracker"; @@ -2656,7 +2656,7 @@ private void InitializeComponent() // L_HomeTracker.Anchor = System.Windows.Forms.AnchorStyles.Right; L_HomeTracker.AutoSize = true; - L_HomeTracker.Location = new System.Drawing.Point(41, 399); + L_HomeTracker.Location = new System.Drawing.Point(41, 379); L_HomeTracker.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); L_HomeTracker.Name = "L_HomeTracker"; L_HomeTracker.Size = new System.Drawing.Size(95, 17); @@ -2668,11 +2668,11 @@ private void InitializeComponent() // L_ExtraBytes.Anchor = System.Windows.Forms.AnchorStyles.Right; L_ExtraBytes.AutoSize = true; - L_ExtraBytes.Location = new System.Drawing.Point(62, 353); + L_ExtraBytes.Location = new System.Drawing.Point(62, 341); L_ExtraBytes.Margin = new System.Windows.Forms.Padding(0); L_ExtraBytes.Name = "L_ExtraBytes"; - L_ExtraBytes.Padding = new System.Windows.Forms.Padding(0, 20, 0, 4); - L_ExtraBytes.Size = new System.Drawing.Size(74, 41); + L_ExtraBytes.Padding = new System.Windows.Forms.Padding(0, 12, 0, 4); + L_ExtraBytes.Size = new System.Drawing.Size(74, 33); L_ExtraBytes.TabIndex = 20; L_ExtraBytes.Text = "Extra Bytes:"; L_ExtraBytes.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -2684,7 +2684,7 @@ private void InitializeComponent() FLP_EncryptionConstant.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; FLP_EncryptionConstant.Controls.Add(TB_EC); FLP_EncryptionConstant.Controls.Add(BTN_RerollEC); - FLP_EncryptionConstant.Location = new System.Drawing.Point(136, 420); + FLP_EncryptionConstant.Location = new System.Drawing.Point(136, 400); FLP_EncryptionConstant.Margin = new System.Windows.Forms.Padding(0); FLP_EncryptionConstant.Name = "FLP_EncryptionConstant"; FLP_EncryptionConstant.Size = new System.Drawing.Size(195, 24); @@ -2720,7 +2720,7 @@ private void InitializeComponent() // Label_PrevOT.Anchor = System.Windows.Forms.AnchorStyles.Right; Label_PrevOT.AutoSize = true; - Label_PrevOT.Location = new System.Drawing.Point(109, 274); + Label_PrevOT.Location = new System.Drawing.Point(109, 262); Label_PrevOT.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); Label_PrevOT.Name = "Label_PrevOT"; Label_PrevOT.Size = new System.Drawing.Size(27, 17); @@ -2734,7 +2734,7 @@ private void InitializeComponent() TB_Friendship.AccessibleDescription = "Friendship and Hatch Counter"; TB_Friendship.AccessibleName = "Friendship and Hatch Counter"; TB_Friendship.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - TB_Friendship.Location = new System.Drawing.Point(136, 89); + TB_Friendship.Location = new System.Drawing.Point(136, 85); TB_Friendship.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); TB_Friendship.Mask = "000"; TB_Friendship.Name = "TB_Friendship"; @@ -2749,7 +2749,7 @@ private void InitializeComponent() FLP_FriendshipLeft.Controls.Add(Label_HatchCounter); FLP_FriendshipLeft.Dock = System.Windows.Forms.DockStyle.Fill; FLP_FriendshipLeft.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft; - FLP_FriendshipLeft.Location = new System.Drawing.Point(0, 89); + FLP_FriendshipLeft.Location = new System.Drawing.Point(0, 85); FLP_FriendshipLeft.Margin = new System.Windows.Forms.Padding(0); FLP_FriendshipLeft.Name = "FLP_FriendshipLeft"; FLP_FriendshipLeft.Size = new System.Drawing.Size(136, 26); @@ -2787,7 +2787,7 @@ private void InitializeComponent() FLP_HT.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; FLP_HT.Controls.Add(TB_HT); FLP_HT.Controls.Add(UC_HTGender); - FLP_HT.Location = new System.Drawing.Point(136, 271); + FLP_HT.Location = new System.Drawing.Point(136, 259); FLP_HT.Margin = new System.Windows.Forms.Padding(0); FLP_HT.Name = "FLP_HT"; FLP_HT.Size = new System.Drawing.Size(118, 26); @@ -2822,7 +2822,7 @@ private void InitializeComponent() // CB_3DSReg.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; CB_3DSReg.FormattingEnabled = true; - CB_3DSReg.Location = new System.Drawing.Point(136, 167); + CB_3DSReg.Location = new System.Drawing.Point(136, 163); CB_3DSReg.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); CB_3DSReg.Name = "CB_3DSReg"; CB_3DSReg.Size = new System.Drawing.Size(126, 25); @@ -2832,7 +2832,7 @@ private void InitializeComponent() // Label_3DSRegion.Anchor = System.Windows.Forms.AnchorStyles.Right; Label_3DSRegion.AutoSize = true; - Label_3DSRegion.Location = new System.Drawing.Point(57, 170); + Label_3DSRegion.Location = new System.Drawing.Point(57, 166); Label_3DSRegion.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); Label_3DSRegion.Name = "Label_3DSRegion"; Label_3DSRegion.Size = new System.Drawing.Size(79, 17); @@ -2846,7 +2846,7 @@ private void InitializeComponent() CB_SubRegion.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; CB_SubRegion.DropDownWidth = 180; CB_SubRegion.FormattingEnabled = true; - CB_SubRegion.Location = new System.Drawing.Point(136, 141); + CB_SubRegion.Location = new System.Drawing.Point(136, 137); CB_SubRegion.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); CB_SubRegion.Name = "CB_SubRegion"; CB_SubRegion.Size = new System.Drawing.Size(126, 25); @@ -2857,7 +2857,7 @@ private void InitializeComponent() // Label_SubRegion.Anchor = System.Windows.Forms.AnchorStyles.Right; Label_SubRegion.AutoSize = true; - Label_SubRegion.Location = new System.Drawing.Point(58, 144); + Label_SubRegion.Location = new System.Drawing.Point(58, 140); Label_SubRegion.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); Label_SubRegion.Name = "Label_SubRegion"; Label_SubRegion.Size = new System.Drawing.Size(78, 17); @@ -2871,7 +2871,7 @@ private void InitializeComponent() CB_Country.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; CB_Country.DropDownWidth = 180; CB_Country.FormattingEnabled = true; - CB_Country.Location = new System.Drawing.Point(136, 115); + CB_Country.Location = new System.Drawing.Point(136, 111); CB_Country.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); CB_Country.Name = "CB_Country"; CB_Country.Size = new System.Drawing.Size(126, 25); @@ -2883,7 +2883,7 @@ private void InitializeComponent() // Label_Country.Anchor = System.Windows.Forms.AnchorStyles.Right; Label_Country.AutoSize = true; - Label_Country.Location = new System.Drawing.Point(80, 118); + Label_Country.Location = new System.Drawing.Point(80, 114); Label_Country.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); Label_Country.Name = "Label_Country"; Label_Country.Size = new System.Drawing.Size(56, 17); @@ -2899,7 +2899,7 @@ private void InitializeComponent() FLP_OT.Controls.Add(UC_OTGender); FLP_OT.Controls.Add(BTN_OTNameWarn); FLP_OT.Dock = System.Windows.Forms.DockStyle.Fill; - FLP_OT.Location = new System.Drawing.Point(136, 63); + FLP_OT.Location = new System.Drawing.Point(136, 59); FLP_OT.Margin = new System.Windows.Forms.Padding(0, 1, 0, 0); FLP_OT.Name = "FLP_OT"; FLP_OT.Size = new System.Drawing.Size(195, 26); @@ -2947,7 +2947,7 @@ private void InitializeComponent() // Label_OT.Anchor = System.Windows.Forms.AnchorStyles.Right; Label_OT.AutoSize = true; - Label_OT.Location = new System.Drawing.Point(109, 66); + Label_OT.Location = new System.Drawing.Point(109, 62); Label_OT.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); Label_OT.Name = "Label_OT"; Label_OT.Size = new System.Drawing.Size(27, 17); @@ -2961,7 +2961,7 @@ private void InitializeComponent() GB_OT.AutoSize = true; TLP_OTMisc.SetColumnSpan(GB_OT, 2); GB_OT.Dock = System.Windows.Forms.DockStyle.Fill; - GB_OT.Location = new System.Drawing.Point(56, 16); + GB_OT.Location = new System.Drawing.Point(56, 12); GB_OT.Margin = new System.Windows.Forms.Padding(56, 0, 0, 0); GB_OT.Name = "GB_OT"; GB_OT.Padding = new System.Windows.Forms.Padding(0, 0, 0, 4); @@ -2977,7 +2977,7 @@ private void InitializeComponent() TID_Trainer.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; TLP_OTMisc.SetColumnSpan(TID_Trainer, 2); TID_Trainer.Dock = System.Windows.Forms.DockStyle.Fill; - TID_Trainer.Location = new System.Drawing.Point(64, 37); + TID_Trainer.Location = new System.Drawing.Point(64, 33); TID_Trainer.Margin = new System.Windows.Forms.Padding(64, 0, 0, 0); TID_Trainer.MinimumSize = new System.Drawing.Size(208, 24); TID_Trainer.Name = "TID_Trainer"; @@ -2991,19 +2991,19 @@ private void InitializeComponent() FLP_ExtraBytes.Controls.Add(CB_ExtraBytes); FLP_ExtraBytes.Controls.Add(TB_ExtraByte); FLP_ExtraBytes.Dock = System.Windows.Forms.DockStyle.Fill; - FLP_ExtraBytes.Location = new System.Drawing.Point(136, 349); + FLP_ExtraBytes.Location = new System.Drawing.Point(136, 337); FLP_ExtraBytes.Margin = new System.Windows.Forms.Padding(0); FLP_ExtraBytes.Name = "FLP_ExtraBytes"; FLP_ExtraBytes.Padding = new System.Windows.Forms.Padding(0, 0, 0, 4); - FLP_ExtraBytes.Size = new System.Drawing.Size(195, 49); + FLP_ExtraBytes.Size = new System.Drawing.Size(195, 41); FLP_ExtraBytes.TabIndex = 21; // // CB_ExtraBytes // CB_ExtraBytes.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; CB_ExtraBytes.FormattingEnabled = true; - CB_ExtraBytes.Location = new System.Drawing.Point(0, 20); - CB_ExtraBytes.Margin = new System.Windows.Forms.Padding(0, 20, 0, 0); + CB_ExtraBytes.Location = new System.Drawing.Point(0, 12); + CB_ExtraBytes.Margin = new System.Windows.Forms.Padding(0, 12, 0, 0); CB_ExtraBytes.Name = "CB_ExtraBytes"; CB_ExtraBytes.Size = new System.Drawing.Size(64, 25); CB_ExtraBytes.TabIndex = 0; @@ -3011,8 +3011,8 @@ private void InitializeComponent() // // TB_ExtraByte // - TB_ExtraByte.Location = new System.Drawing.Point(68, 20); - TB_ExtraByte.Margin = new System.Windows.Forms.Padding(4, 20, 0, 0); + TB_ExtraByte.Location = new System.Drawing.Point(68, 12); + TB_ExtraByte.Margin = new System.Windows.Forms.Padding(4, 12, 0, 0); TB_ExtraByte.Mask = "000"; TB_ExtraByte.Name = "TB_ExtraByte"; TB_ExtraByte.Size = new System.Drawing.Size(32, 25); @@ -3025,11 +3025,11 @@ private void InitializeComponent() GB_nOT.AutoSize = true; TLP_OTMisc.SetColumnSpan(GB_nOT, 2); GB_nOT.Dock = System.Windows.Forms.DockStyle.Fill; - GB_nOT.Location = new System.Drawing.Point(56, 234); + GB_nOT.Location = new System.Drawing.Point(56, 226); GB_nOT.Margin = new System.Windows.Forms.Padding(56, 0, 0, 0); GB_nOT.Name = "GB_nOT"; - GB_nOT.Padding = new System.Windows.Forms.Padding(0, 16, 0, 4); - GB_nOT.Size = new System.Drawing.Size(275, 37); + GB_nOT.Padding = new System.Windows.Forms.Padding(0, 12, 0, 4); + GB_nOT.Size = new System.Drawing.Size(275, 33); GB_nOT.TabIndex = 13; GB_nOT.Text = "Latest (not OT) Handler"; GB_nOT.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; @@ -3043,18 +3043,18 @@ private void InitializeComponent() FLP_Handler.Controls.Add(L_CurrentHandler); FLP_Handler.Controls.Add(CB_Handler); FLP_Handler.Dock = System.Windows.Forms.DockStyle.Fill; - FLP_Handler.Location = new System.Drawing.Point(0, 193); + FLP_Handler.Location = new System.Drawing.Point(0, 189); FLP_Handler.Margin = new System.Windows.Forms.Padding(0); FLP_Handler.Name = "FLP_Handler"; - FLP_Handler.Padding = new System.Windows.Forms.Padding(0, 16, 0, 0); - FLP_Handler.Size = new System.Drawing.Size(331, 41); + FLP_Handler.Padding = new System.Windows.Forms.Padding(0, 12, 0, 0); + FLP_Handler.Size = new System.Drawing.Size(331, 37); FLP_Handler.TabIndex = 12; // // L_CurrentHandler // L_CurrentHandler.Anchor = System.Windows.Forms.AnchorStyles.Right; L_CurrentHandler.AutoSize = true; - L_CurrentHandler.Location = new System.Drawing.Point(0, 20); + L_CurrentHandler.Location = new System.Drawing.Point(0, 16); L_CurrentHandler.Margin = new System.Windows.Forms.Padding(0); L_CurrentHandler.Name = "L_CurrentHandler"; L_CurrentHandler.Padding = new System.Windows.Forms.Padding(56, 0, 0, 0); @@ -3068,7 +3068,7 @@ private void InitializeComponent() CB_Handler.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; CB_Handler.FormattingEnabled = true; CB_Handler.Items.AddRange(new object[] { "OT", "HT" }); - CB_Handler.Location = new System.Drawing.Point(160, 16); + CB_Handler.Location = new System.Drawing.Point(160, 12); CB_Handler.Margin = new System.Windows.Forms.Padding(0); CB_Handler.Name = "CB_Handler"; CB_Handler.Size = new System.Drawing.Size(48, 25); @@ -3079,7 +3079,7 @@ private void InitializeComponent() // CB_HTLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; CB_HTLanguage.FormattingEnabled = true; - CB_HTLanguage.Location = new System.Drawing.Point(136, 297); + CB_HTLanguage.Location = new System.Drawing.Point(136, 285); CB_HTLanguage.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); CB_HTLanguage.Name = "CB_HTLanguage"; CB_HTLanguage.Size = new System.Drawing.Size(126, 25); @@ -3089,7 +3089,7 @@ private void InitializeComponent() // L_FriendshipHT.Anchor = System.Windows.Forms.AnchorStyles.Right; L_FriendshipHT.AutoSize = true; - L_FriendshipHT.Location = new System.Drawing.Point(65, 326); + L_FriendshipHT.Location = new System.Drawing.Point(65, 314); L_FriendshipHT.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); L_FriendshipHT.Name = "L_FriendshipHT"; L_FriendshipHT.Size = new System.Drawing.Size(71, 17); @@ -3101,7 +3101,7 @@ private void InitializeComponent() // L_LanguageHT.Anchor = System.Windows.Forms.AnchorStyles.Right; L_LanguageHT.AutoSize = true; - L_LanguageHT.Location = new System.Drawing.Point(68, 300); + L_LanguageHT.Location = new System.Drawing.Point(68, 288); L_LanguageHT.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); L_LanguageHT.Name = "L_LanguageHT"; L_LanguageHT.Size = new System.Drawing.Size(68, 17); From d860af34d2f171226590af26580a0785a64fc81d Mon Sep 17 00:00:00 2001 From: Kurt Date: Wed, 3 Jun 2026 23:50:53 -0500 Subject: [PATCH 61/81] Gen4 korean gts: nickname fallthru case https: //github.com/kwsch/PKHeX/issues/4811#issuecomment-4612279177 Co-Authored-By: abcboy101 <16735361+abcboy101@users.noreply.github.com> --- PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs b/PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs index 53dab8fa2..2457969d7 100644 --- a/PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs @@ -267,7 +267,11 @@ private static bool IsNotNicknameValid(LegalityAnalysis data, PKM pk, IEncounter if (ParseSettings.ActiveTrainer is not { Generation: 4, Language: (int)Korean }) { var english = SpeciesName.GetSpeciesNameGeneration(species, (int)English, format); - return nickname.SequenceEqual(english); + if (nickname.SequenceEqual(english)) + return true; // matches, un-evolved. + // could mismatch via un-evolved, fall through. further refinements pending. + if (data.Info.EvoChainsAllGens.Gen4.Length == 1) + return false; } } From 5767ab85cf930e77a52139d761a2c82c4f1fc903 Mon Sep 17 00:00:00 2001 From: Kurt Date: Thu, 4 Jun 2026 00:01:53 -0500 Subject: [PATCH 62/81] Update SAV3RSBox.cs Closes #4815 ty @MrPerson0 --- PKHeX.Core/Saves/SAV3RSBox.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/PKHeX.Core/Saves/SAV3RSBox.cs b/PKHeX.Core/Saves/SAV3RSBox.cs index 63673cbea..de3ba2a44 100644 --- a/PKHeX.Core/Saves/SAV3RSBox.cs +++ b/PKHeX.Core/Saves/SAV3RSBox.cs @@ -125,7 +125,8 @@ public override void CopyChangesFrom(SaveFile sav) s.BoxBuffer.CopyTo(BoxBuffer); } - public override int SIZE_STORED => PokeCrypto.SIZE_3STORED + 4; // tid-sid of depositor + public override int SIZE_STORED => PokeCrypto.SIZE_3STORED; + public override int SIZE_BOXSLOT => PokeCrypto.SIZE_3STORED + 4; // tid-sid of depositor public override int SIZE_PARTY => PokeCrypto.SIZE_3PARTY; // unused public override PK3 BlankPKM => new(); public override Type PKMType => typeof(PK3); @@ -158,7 +159,7 @@ public override void CopyChangesFrom(SaveFile sav) // Storage public override int GetPartyOffset(int slot) => -1; - public override int GetBoxOffset(int box) => 8 + (SIZE_STORED * box * 30); + public override int GetBoxOffset(int box) => 8 + (SIZE_BOXSLOT * box * 30); public override int GetBoxSlotOffset(int box, int slot) { // Boxes are a 12x5 grid instead of the usual 6x5 @@ -169,7 +170,7 @@ public override int GetBoxSlotOffset(int box, int slot) if (box % 2 == 1) // right side col += 6; int boxSlot = (row * 12) + col; - return GetBoxOffset(box &~1) + (boxSlot * SIZE_STORED); + return GetBoxOffset(box &~1) + (boxSlot * SIZE_BOXSLOT); } public override int CurrentBox From 04eb8cbe8b38c6b695993576ebed04de39491ff7 Mon Sep 17 00:00:00 2001 From: Ka-n00b Date: Sun, 7 Jun 2026 16:05:02 -0400 Subject: [PATCH 63/81] Translation updates (#4816) * Update legality_de.json * Update lang_ja.txt * Update lang_en.txt * Update lang_es-419.txt * Update lang_es.txt * Update lang_fr.txt * Update lang_it.txt * Update lang_de.txt * Update lang_ko.txt * Update lang_zh-Hans.txt * Update lang_zh-Hant.txt * Update lang_zh-Hans.txt * Update lang_zh-Hant.txt * Update lang_de.txt * Update lang_it.txt --- .../localize/legality/legality_de.json | 24 ++++++------ PKHeX.WinForms/Resources/text/lang_de.txt | 22 +++++------ PKHeX.WinForms/Resources/text/lang_en.txt | 20 +++++----- PKHeX.WinForms/Resources/text/lang_es-419.txt | 28 +++++++------- PKHeX.WinForms/Resources/text/lang_es.txt | 26 ++++++------- PKHeX.WinForms/Resources/text/lang_fr.txt | 18 ++++----- PKHeX.WinForms/Resources/text/lang_it.txt | 26 ++++++------- PKHeX.WinForms/Resources/text/lang_ja.txt | 4 +- PKHeX.WinForms/Resources/text/lang_ko.txt | 38 +++++++++---------- .../Resources/text/lang_zh-Hans.txt | 20 +++++----- .../Resources/text/lang_zh-Hant.txt | 34 ++++++++--------- 11 files changed, 130 insertions(+), 130 deletions(-) diff --git a/PKHeX.Core/Resources/localize/legality/legality_de.json b/PKHeX.Core/Resources/localize/legality/legality_de.json index e8d0af41f..ce627c4d7 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_de.json +++ b/PKHeX.Core/Resources/localize/legality/legality_de.json @@ -17,7 +17,7 @@ "AbilityMismatch": "Fähigkeit passt nicht zur Begegnung.", "AbilityMismatch3": "Fähigkeit entspricht nicht der Spezies-Fähigkeit aus Generation 3.", "AbilityMismatchFlag": "Fähigkeit entspricht nicht der Fähigkeits-Nummer.", - "AbilityMismatchGift": "Fähigkeit entspricht nicht dem Geheimgeschehen-Geschenk.", + "AbilityMismatchGift": "Fähigkeit stimmt nicht mit dem Geheimgeschenk überein.", "AbilityMismatchPID": "Fähigkeit entspricht nicht der PID.", "AbilityUnexpected": "Fähigkeit ist für diese Spezies/Form nicht gültig.", "AwakenedCap": "Einzelner AV kann nicht größer als {0} sein.", @@ -65,12 +65,12 @@ "EncConditionBadSpecies": "Spezies existiert nicht im Herkunftsspiel.", "EncGift": "Geschenk-Ei-Begegnung konnte keinem Herkunftsspiel zugeordnet werden.", "EncGiftEggEvent": "Event-Ei-Begegnung konnte keinem Herkunftsspiel zugeordnet werden.", - "EncGiftIVMismatch": "DV-Werte entsprechen nicht den Geheimgeschehen-Daten.", + "EncGiftIVMismatch": "DV-Werte entsprechen nicht den Geheimgeschenk-Daten.", "EncGiftNicknamed": "Event-Geschenk hat einen Spitznamen erhalten.", - "EncGiftNotFound": "Konnte keinem Geheimgeschehen in der Datenbank zugeordnet werden.", - "EncGiftPIDMismatch": "Abweichung der festgelegten PID des Geheimgeschehens.", - "EncGiftShinyMismatch": "Schillernd-Status entspricht nicht dem Geheimgeschehen.", - "EncGiftVersionNotDistributed": "Geheimgeschehen kann in dieser Edition nicht empfangen werden.", + "EncGiftNotFound": "Konnte keinem Geheimgeschenk in der Datenbank zugeordnet werden.", + "EncGiftPIDMismatch": "Feste PID des Geheimgeschenks stimmt nicht überein.", + "EncGiftShinyMismatch": "Schillernd-Status entspricht nicht dem Geheimgeschenk.", + "EncGiftVersionNotDistributed": "Geheimgeschenk kann in dieser Edition nicht empfangen werden.", "EncInvalid": "Begegnung konnte keinem Herkunftsspiel zugeordnet werden.", "EncMasteryInitial": "Markierungen für die Attacken-Meisterung entsprechen nicht dem erwarteten Zustand der Begegnung.", "EncTradeChangedNickname": "Spitzname des In-Game-Tauschs wurde verändert.", @@ -98,11 +98,11 @@ "EvoInvalid": "Entwicklung nicht gültig (oder Bedingungen für Level/Tausch nicht erfüllt)", "EvoTradeReqOutsider": "Externes {0} hätte sich zu {1} entwickeln müssen.", "EvoTradeRequired": "Versionsspezifische Entwicklung erfordert einen Tausch in die Gegen-Edition. Ein Handling Trainer wird benötigt.", - "FatefulGiftMissing": "Schicksalhafte Begegnung ohne passende Begegnungsdaten. Wurden die Geheimgeschehen-Daten bereits eingereicht?", + "FatefulGiftMissing": "Schicksalhafte Begegnung ohne passende Begegnungsdaten. Wurden die Geheimgeschenk-Daten bereits eingereicht?", "FatefulInvalid": "Schicksalhafte Begegnung sollte nicht markiert sein.", "FatefulMissing": "Spezielle schicksalhafte Begegnung im Spiel nicht markiert.", - "FatefulMystery": "Schicksalhafte Begegnung durch Geheimgeschehen", - "FatefulMysteryMissing": "Markierung für schicksalhafte Begegnung durch Geheimgeschehen fehlt.", + "FatefulMystery": "Schicksalhafte Begegnung durch Geheimgeschenk", + "FatefulMysteryMissing": "Markierung für schicksalhafte Begegnung durch Geheimgeschenk fehlt.", "FavoriteMarkingUnavailable": "Favoriten-Markierung ist nicht verfügbar.", "FormArgumentLEQ_0": "Form-Argument ist zu hoch für die aktuelle Form.", "FormArgumentGEQ_0": "Form-Argument ist zu niedrig für die aktuelle Form.", @@ -185,8 +185,8 @@ "LevelEXPThreshold": "Aktuelle Erfahrungspunkte entsprechen der Level-Grenze.", "LevelEXPTooHigh": "Aktuelle Erfahrungspunkte übersteigen das Maximum für Level 100.", "LevelMetBelow": "Aktuelles Level liegt unter dem Fundlevel.", - "LevelMetGift": "Fundlevel entspricht nicht dem Geheimgeschehen-Level.", - "LevelMetGiftFail": "Aktuelles Level liegt unter dem Geheimgeschehen-Level.", + "LevelMetGift": "Fundlevel entspricht nicht dem Geheimgeschenk-Level.", + "LevelMetGiftFail": "Aktuelles Level liegt unter dem Geheimgeschenk-Level.", "LevelMetSane": "Aktuelles Level liegt nicht unter dem Fundlevel.", "MarkValueOutOfRange_0": "Einzelne Markierung an Index {0} liegt außerhalb des erlaubten Bereichs.", "MarkValueShouldBeZero": "Markierungen dürfen nicht gesetzt sein.", @@ -366,7 +366,7 @@ "BulkSharingPIDGenerationDifferent": "Mehrfache Verwendung der PID über Generationen hinweg erkannt.", "BulkSharingPIDGenerationSame": "Mehrfache Verwendung der PID erkannt.", "BulkSharingPIDRNGType": "Mehrfache Verwendung der PID bei unterschiedlichen RNG-Begegnungstypen erkannt.", - "BulkDuplicateMysteryGiftEggReceived": "Mehrfache Einlösung desselben nicht wiederholbaren Geheimgeschehen-Eis erkannt.", + "BulkDuplicateMysteryGiftEggReceived": "Mehrfache Einlösung desselben nicht wiederholbaren Geheimgeschenk-Eis erkannt.", "BulkSharingTrainerID": "Mehrfache Verwendung der Trainer-ID bei unterschiedlichen Trainernamen erkannt", "BulkSharingTrainerVersion": "Mehrfache Verwendung der Trainer-ID über verschiedene Editionen hinweg erkannt.", "BulkDuplicateFusionSlot": "Mehrfache Fusionen derselben im Slot gespeicherten Fusions-Spezies erkannt.", diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index 4e2b4ddc6..7e8fa511a 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -18,7 +18,7 @@ SAV_BoxList=PC-Ansicht SAV_Capture7GG=Fangstatistik-Editor SAV_Chatter=Geschwätz-Editor SAV_Database=Datenbank -SAV_DLC5=Generation 5 DLC I/O +SAV_DLC5=Generation 5 DLC-E/A SAV_Donut9a=Donut-Editor SAV_DonutGenerator9a=Zufälliger-Donut-Generator SAV_Encounters=Begegnungen @@ -39,7 +39,7 @@ SAV_Inventory=Inventar-Editor SAV_JoinAvenue=Einklangspassage-Editor SAV_Link6=Pokémon-Link-Tool SAV_MailBox=Briefbox-Editor -SAV_Medals5=Medaillen +SAV_Medals5=Medaillen-Editor SAV_Misc2=Sonstiges SAV_Misc3=Sonstiges SAV_Misc4=Sonstiges @@ -57,13 +57,13 @@ SAV_Pokedex9a=Pokédex-Editor SAV_PokedexBDSP=Pokédex-Editor SAV_PokedexGG=Pokédex-Editor SAV_PokedexLA=Pokédex-Editor -SAV_PokedexORAS=Pokédex-Editor (ORAS) -SAV_PokedexResearchEditorLA=Pokédex-Research-Editor +SAV_PokedexORAS=Pokédex-Editor +SAV_PokedexResearchEditorLA=Pokédex-Aufgaben-Editor SAV_PokedexSM=Pokédex-Editor SAV_PokedexSV=Pokédex-Editor SAV_PokedexSVKitakami=Pokédex-Editor SAV_PokedexSWSH=Pokédex-Editor -SAV_PokedexXY=Pokédex-Editor (XY) +SAV_PokedexXY=Pokédex-Editor SAV_Pokepuff=Pofflé-Editor SAV_Raid8=Raid Parameter-Editor SAV_Raid9=Raid Parameter-Editor @@ -87,8 +87,8 @@ SAV_Trainer9=Trainerdaten-Editor SAV_Trainer9a=Trainerdaten-Editor SAV_Underground=Untergrund-Editor SAV_Underground8b=Untergrund-Item-Editor -SAV_UnityTower=Turm-der-Einheit-Editor -SAV_Wondercard=Geheimgeschenk-Editor +SAV_UnityTower=Turm der Einheit-Editor +SAV_Wondercard=Geheimgeschenk-E/A SAV_ZygardeCell=Zellen/Sticker-Editor SettingsEditor=Einstellungen SuperTrainingEditor=Medaillen-Editor @@ -321,7 +321,7 @@ LocalizedDescription.InvalidSelection=Hintergrundfarbe einer ComboBox, wenn das LocalizedDescription.Language=Sprache, die beim Exportieren einer Kampfvorlage verwendet werden soll. Falls nicht festgelegt, wird die aktuelle Sprache genutzt. LocalizedDescription.MarkBlue=Blaue Markierung. LocalizedDescription.MarkPink=Rosa Markierung. -LocalizedDescription.MGDatabasePath=Pfad zum Ordner der Wunderkarten-Datenbank zum Speichern zusätzlicher Geheimgeschehen-Vorlagen, die noch nicht erkannt werden. +LocalizedDescription.MGDatabasePath=Pfad zum Ordner der Wunderkarten-Datenbank zum Speichern zusätzlicher Geheimgeschenk-Vorlagen, die noch nicht erkannt werden. LocalizedDescription.ModifyUnset=Benachrichtigung über nicht gesetzte Änderungen. LocalizedDescription.Nickname12=Spitznamen-Regeln für Generation 1 und 2. LocalizedDescription.Nickname3=Spitznamen-Regeln für Generation 3. @@ -442,7 +442,7 @@ Main.B_OpenSecretBase=Geheimbasis Main.B_OpenSuperTraining=Supertraining Main.B_OpenTrainerInfo=Trainerinfo Main.B_OpenUGSEditor=Untergrund -Main.B_OpenUnityTowerEditor=Turm-Einheit +Main.B_OpenUnityTowerEditor=Turm Einheit Main.B_OpenWondercards=Wunderkarten Main.B_OtherSlots=Andere Felder Main.B_OUTPasserby=Passanten @@ -2093,7 +2093,7 @@ SAV_PokedexGG.L_RHeightMin=Min SAV_PokedexGG.L_RWeight=Gewicht SAV_PokedexGG.L_RWeightMax=Max SAV_PokedexGG.L_RWeightMin=Min -SAV_PokedexLA.B_AdvancedResearch=Alle ändern... +SAV_PokedexLA.B_AdvancedResearch=Alle Aufgaben... SAV_PokedexLA.B_Cancel=Abbrechen SAV_PokedexLA.B_Report=Berichtdaten SAV_PokedexLA.B_Save=Speichern @@ -2133,7 +2133,7 @@ SAV_PokedexLA.GB_CaughtInWild=Gefangen (wild) SAV_PokedexLA.GB_Displayed=Angezeigt SAV_PokedexLA.GB_Height=Höhe SAV_PokedexLA.GB_Obtained=Erhalten -SAV_PokedexLA.GB_ResearchTasks=Forschungs Aufgaben +SAV_PokedexLA.GB_ResearchTasks=Aufgaben SAV_PokedexLA.GB_SeenInWild=Gesehen (wild) SAV_PokedexLA.GB_Statistics=Statistik SAV_PokedexLA.GB_Weight=Gewicht diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index 8cf4804b3..faa209649 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -38,8 +38,8 @@ SAV_HoneyTree=Honey Tree Editor SAV_Inventory=Inventory Editor SAV_JoinAvenue=Join Avenue Editor SAV_Link6=Pokémon Link Tool -SAV_MailBox=MailBox Editor -SAV_Medals5=Medals +SAV_MailBox=Mailbox Editor +SAV_Medals5=Medal Editor SAV_Misc2=Misc Editor SAV_Misc3=Misc Editor SAV_Misc4=Misc Editor @@ -57,13 +57,13 @@ SAV_Pokedex9a=Pokédex Editor SAV_PokedexBDSP=Pokédex Editor SAV_PokedexGG=Pokédex Editor SAV_PokedexLA=Pokédex Editor -SAV_PokedexORAS=Pokédex Editor (ORAS) -SAV_PokedexResearchEditorLA=Pokédex Research Editor +SAV_PokedexORAS=Pokédex Editor +SAV_PokedexResearchEditorLA=Pokédex Research Tasks Editor SAV_PokedexSM=Pokédex Editor SAV_PokedexSV=Pokédex Editor SAV_PokedexSVKitakami=Pokédex Editor SAV_PokedexSWSH=Pokédex Editor -SAV_PokedexXY=Pokédex Editor (XY) +SAV_PokedexXY=Pokédex Editor SAV_Pokepuff=Poké Puffs Editor SAV_Raid8=Raid Parameter Editor SAV_Raid9=Raid Parameter Editor @@ -411,7 +411,7 @@ Main.B_DLC=DLC Editor Main.B_Donuts=Donuts Main.B_FestivalPlaza=Festival Plaza Main.B_JPEG=Save PGL .JPEG -Main.B_MailBox=Mail Box +Main.B_MailBox=Mailbox Main.B_MoveShop=Move Shop Main.B_OpenApricorn=Apricorns Main.B_OpenBattlePass=Battle Passes @@ -443,7 +443,7 @@ Main.B_OpenSuperTraining=Super Train Main.B_OpenTrainerInfo=Trainer Info Main.B_OpenUGSEditor=Underground Main.B_OpenUnityTowerEditor=Unity Tower -Main.B_OpenWondercards=Mystery Gift +Main.B_OpenWondercards=Wonder Cards Main.B_OtherSlots=Other Slots Main.B_OUTPasserby=Passerby Main.B_PlusRecord=Plus Flags @@ -1520,7 +1520,7 @@ SAV_MailBox.GB_MessageNUD=Message SAV_MailBox.GB_MessageTB=Message SAV_MailBox.GB_PKM=Held MailID SAV_MailBox.L_AppearPKM=Appear PKM: -SAV_MailBox.L_BoxSize=MailBox (PC) Served: +SAV_MailBox.L_BoxSize=Mailbox (PC) Served: SAV_MailBox.L_HeldItem1=(Mail) SAV_MailBox.L_HeldItem2=(Mail) SAV_MailBox.L_HeldItem3=(Mail) @@ -1529,8 +1529,8 @@ SAV_MailBox.L_HeldItem5=(Mail) SAV_MailBox.L_HeldItem6=(Mail) SAV_MailBox.L_MailType=Mail Type: SAV_MailBox.L_MiscValue=Misc: -SAV_MailBox.L_PartyHeld=MailBox (Party) -SAV_MailBox.L_PCBOX=MailBox (PC) +SAV_MailBox.L_PartyHeld=Mailbox (Party) +SAV_MailBox.L_PCBOX=Mailbox (PC) SAV_MailBox.L_PKM1=Bulbasaur: SAV_MailBox.L_PKM2=Bulbasaur: SAV_MailBox.L_PKM3=Bulbasaur: diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index 0514064cd..712fdb425 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -39,7 +39,7 @@ SAV_Inventory=Editor de Inventario SAV_JoinAvenue=Editor de Pasaje Unión SAV_Link6=Editor del Nexo Pokémon SAV_MailBox=Editor de Buzón -SAV_Medals5=Medallas +SAV_Medals5=Editor de Insignias SAV_Misc2=Editor Misceláneo SAV_Misc3=Editor de Datos del Entrenador SAV_Misc4=Editor de Datos del Entrenador @@ -58,7 +58,7 @@ SAV_PokedexBDSP=Editor de Pokédex SAV_PokedexGG=Editor de Pokédex SAV_PokedexLA=Editor de Pokédex SAV_PokedexORAS=Editor de Pokédex -SAV_PokedexResearchEditorLA=Editor de Tareas del Pokédex +SAV_PokedexResearchEditorLA=Editor de Tareas de la Pokédex SAV_PokedexSM=Editor de Pokédex SAV_PokedexSV=Editor de Pokédex SAV_PokedexSVKitakami=Editor de Pokédex @@ -88,7 +88,7 @@ SAV_Trainer9a=Editor de datos del Entrenador SAV_Underground=Editor del Subsuelo SAV_Underground8b=Editor de Objetos del Subsuelo SAV_UnityTower=Editor de la Torre Unión -SAV_Wondercard=Editor de Tarjetas Misteriosas +SAV_Wondercard=E/S de Regalo Misterioso SAV_ZygardeCell=Editor de Células/Dominsignias SettingsEditor=Ajustes SuperTrainingEditor=Editor de Superentrenamiento @@ -428,7 +428,7 @@ Main.B_OpenHoneyTreeEditor=Árbol de Miel Main.B_OpenItemPouch=Inventario Main.B_OpenJoinAvenueEditor=Pasaje Unión Main.B_OpenLinkInfo=Datos Nexo -Main.B_OpenMedalsEditor=Medallas +Main.B_OpenMedalsEditor=Insignias Main.B_OpenMiscEditor=Misceláneo Main.B_OpenOPowers=Poder O Main.B_OpenPokeathlon=Pokéathlon @@ -443,7 +443,7 @@ Main.B_OpenSuperTraining=Superentren. Main.B_OpenTrainerInfo=Entrenador Main.B_OpenUGSEditor=Subsuelo Main.B_OpenUnityTowerEditor=Torre Unión -Main.B_OpenWondercards=Tarj. Mist. +Main.B_OpenWondercards=Tarjetas Mist. Main.B_OtherSlots=Otras ranuras Main.B_OUTPasserby=Transeúntes Main.B_PlusRecord=Marcas + @@ -508,7 +508,7 @@ Main.L_HomeTracker=Rastreador HOME: Main.L_LanguageHT=Idioma: Main.L_MetTimeOfDay=Momento del día: Main.L_Mood7b=Humor: -Main.L_NSparkle=Brillo de N +Main.L_NSparkle=Brillo de N: Main.L_ObedienceLevel=Nivel de Obediencia: Main.L_PokeStarFame=Fama: Main.L_ReadOnlyOther=Esta pestaña es de solo lectura. @@ -1439,9 +1439,9 @@ SAV_JoinAvenue.L_IsPromotionActive=Promoción activa: SAV_JoinAvenue.L_IsShopChangeAllowed=Puede cambiar tienda: SAV_JoinAvenue.L_JoinAvenueRank=Rango del pasaje: SAV_JoinAvenue.L_Language=Idioma: -SAV_JoinAvenue.L_MedalCount=Cantidad de medallas: -SAV_JoinAvenue.L_MedalHint=Pista de medalla: -SAV_JoinAvenue.L_MedalRank=Rango de medalla: +SAV_JoinAvenue.L_MedalCount=Cantidad de insignias: +SAV_JoinAvenue.L_MedalHint=Pista de insignia: +SAV_JoinAvenue.L_MedalRank=Rango de insignia: SAV_JoinAvenue.L_MetDay=Día de encuentro: SAV_JoinAvenue.L_MetHour=Hora de encuentro: SAV_JoinAvenue.L_MetMinute=Minuto de encuentro: @@ -1559,10 +1559,10 @@ SAV_Medals5.DGV_MedalStateColumn=Estado SAV_Medals5.DGV_MedalTypeColumn=Tipo SAV_Medals5.DGV_MedalUnreadColumn=No leída SAV_Medals5.L_LastEncounterType=Último tipo de encuentro: -SAV_Medals5.L_PinnedMedal=Medalla fijada: +SAV_Medals5.L_PinnedMedal=Insignia fijada: SAV_Medals5.L_Rank=Rango: SAV_Medals5.Tab_Habitat=Lista de hábitats -SAV_Medals5.Tab_Medals=Medallas +SAV_Medals5.Tab_Medals=Insignias SAV_Misc2.B_Cancel=Cancelar SAV_Misc2.B_Save=Guardar SAV_Misc2.B_VirtualConsoleGSBall=Activar Evento GS Ball (Virtual Console) @@ -1849,7 +1849,7 @@ SAV_OPower.B_Save=Guardar SAV_OPower.GB_Battle=Batalla SAV_OPower.GB_Field=Campo SAV_Poffin8b.B_All=Todos -SAV_Poffin8b.B_Cancel=Cancelar +SAV_Poffin8b.B_Cancel=Canc. SAV_Poffin8b.B_None=Ninguno SAV_Poffin8b.B_Save=Guardar SAV_Pokeathlon4.B_Cancel=Cancelar @@ -2375,7 +2375,7 @@ SAV_RTC3.L_IHour=Horas SAV_RTC3.L_IMinute=Minutos SAV_RTC3.L_ISecond=Segundos SAV_SealStickers8b.B_All=Todos -SAV_SealStickers8b.B_Cancel=Cancelar +SAV_SealStickers8b.B_Cancel=Canc. SAV_SealStickers8b.B_None=Ninguno SAV_SealStickers8b.B_Save=Guardar SAV_SecretBase.B_Cancel=Cancelar @@ -2885,7 +2885,7 @@ SAV_Underground.TB_UGSpheres=Esferas SAV_Underground.TB_UGTraps=Trampas SAV_Underground.TB_UGTreasures=Tesoros SAV_Underground8b.B_All=Todos -SAV_Underground8b.B_Cancel=Cancelar +SAV_Underground8b.B_Cancel=Canc. SAV_Underground8b.B_None=Ninguno SAV_Underground8b.B_Save=Guardar SAV_UnityTower.B_Cancel=Cancelar diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index 7b9c6e8d5..c5fe03d5e 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -39,7 +39,7 @@ SAV_Inventory=Editor de Inventario SAV_JoinAvenue=Editor de Galería Unión SAV_Link6=Editor del Nexo Pokémon SAV_MailBox=Editor de Buzón -SAV_Medals5=Medallas +SAV_Medals5=Editor de Insignias SAV_Misc2=Editor de Varios SAV_Misc3=Editor de Datos del Entrenador SAV_Misc4=Editor de Datos del Entrenador @@ -88,7 +88,7 @@ SAV_Trainer9a=Editor de datos del Entrenador SAV_Underground=Editor del Subsuelo SAV_Underground8b=Editor de Objetos del Subsuelo SAV_UnityTower=Editor de la Torre Unión -SAV_Wondercard=Editor de Tarjetas Misteriosas +SAV_Wondercard=E/S de Regalo Misterioso SAV_ZygardeCell=Editor de Células/Dominsignias SettingsEditor=Ajustes SuperTrainingEditor=Editor de Superentrenamiento @@ -428,7 +428,7 @@ Main.B_OpenHoneyTreeEditor=Árbol de Miel Main.B_OpenItemPouch=Inventario Main.B_OpenJoinAvenueEditor=Galería Unión Main.B_OpenLinkInfo=Datos Nexo -Main.B_OpenMedalsEditor=Medallas +Main.B_OpenMedalsEditor=Insignias Main.B_OpenMiscEditor=Varios Main.B_OpenOPowers=Poder O Main.B_OpenPokeathlon=Pokéathlon @@ -443,7 +443,7 @@ Main.B_OpenSuperTraining=Superentren. Main.B_OpenTrainerInfo=Entrenador Main.B_OpenUGSEditor=Subsuelo Main.B_OpenUnityTowerEditor=Torre Unión -Main.B_OpenWondercards=Tarj. Mist. +Main.B_OpenWondercards=Tarjetas Mist. Main.B_OtherSlots=Otras ranuras Main.B_OUTPasserby=Transeúntes Main.B_PlusRecord=Marcas + @@ -508,7 +508,7 @@ Main.L_HomeTracker=Rastreador HOME: Main.L_LanguageHT=Idioma: Main.L_MetTimeOfDay=Momento del día: Main.L_Mood7b=Humor: -Main.L_NSparkle=Brillo de N +Main.L_NSparkle=Brillo de N: Main.L_ObedienceLevel=Nivel de Obediencia: Main.L_PokeStarFame=Fama: Main.L_ReadOnlyOther=Esta pestaña es de solo lectura. @@ -1439,9 +1439,9 @@ SAV_JoinAvenue.L_IsPromotionActive=Promoción activa: SAV_JoinAvenue.L_IsShopChangeAllowed=Puede cambiar tienda: SAV_JoinAvenue.L_JoinAvenueRank=Rango de la galería: SAV_JoinAvenue.L_Language=Idioma: -SAV_JoinAvenue.L_MedalCount=Cantidad de medallas: -SAV_JoinAvenue.L_MedalHint=Pista de medalla: -SAV_JoinAvenue.L_MedalRank=Rango de medalla: +SAV_JoinAvenue.L_MedalCount=Cantidad de insignias: +SAV_JoinAvenue.L_MedalHint=Pista de insignia: +SAV_JoinAvenue.L_MedalRank=Rango de insignia: SAV_JoinAvenue.L_MetDay=Día de encuentro: SAV_JoinAvenue.L_MetHour=Hora de encuentro: SAV_JoinAvenue.L_MetMinute=Minuto de encuentro: @@ -1559,10 +1559,10 @@ SAV_Medals5.DGV_MedalStateColumn=Estado SAV_Medals5.DGV_MedalTypeColumn=Tipo SAV_Medals5.DGV_MedalUnreadColumn=No leída SAV_Medals5.L_LastEncounterType=Último tipo de encuentro: -SAV_Medals5.L_PinnedMedal=Medalla fijada: +SAV_Medals5.L_PinnedMedal=Insignia fijada: SAV_Medals5.L_Rank=Rango: SAV_Medals5.Tab_Habitat=Lista de hábitats -SAV_Medals5.Tab_Medals=Medallas +SAV_Medals5.Tab_Medals=Insignias SAV_Misc2.B_Cancel=Cancelar SAV_Misc2.B_Save=Guardar SAV_Misc2.B_VirtualConsoleGSBall=Activar Evento GS Ball (Virtual Console) @@ -1849,7 +1849,7 @@ SAV_OPower.B_Save=Guardar SAV_OPower.GB_Battle=Batalla SAV_OPower.GB_Field=Campo SAV_Poffin8b.B_All=Todos -SAV_Poffin8b.B_Cancel=Cancelar +SAV_Poffin8b.B_Cancel=Canc. SAV_Poffin8b.B_None=Ninguno SAV_Poffin8b.B_Save=Guardar SAV_Pokeathlon4.B_Cancel=Cancelar @@ -2375,7 +2375,7 @@ SAV_RTC3.L_IHour=Horas SAV_RTC3.L_IMinute=Minutos SAV_RTC3.L_ISecond=Segundos SAV_SealStickers8b.B_All=Todos -SAV_SealStickers8b.B_Cancel=Cancelar +SAV_SealStickers8b.B_Cancel=Canc. SAV_SealStickers8b.B_None=Ninguno SAV_SealStickers8b.B_Save=Guardar SAV_SecretBase.B_Cancel=Cancelar @@ -2885,7 +2885,7 @@ SAV_Underground.TB_UGSpheres=Gemas SAV_Underground.TB_UGTraps=Trampas SAV_Underground.TB_UGTreasures=Tesoros SAV_Underground8b.B_All=Todos -SAV_Underground8b.B_Cancel=Cancelar +SAV_Underground8b.B_Cancel=Canc. SAV_Underground8b.B_None=Ninguno SAV_Underground8b.B_Save=Guardar SAV_UnityTower.B_Cancel=Cancelar diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index 417d12435..04b2bcefd 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -39,7 +39,7 @@ SAV_Inventory=Éditeur de l'inventaire SAV_JoinAvenue=Éditeur de Galerie Concorde SAV_Link6=Outil Poké Lien SAV_MailBox=Éditeur de boîtes aux lettres -SAV_Medals5=Médailles +SAV_Medals5=Éditeur de Médailles SAV_Misc2=Éditeur divers SAV_Misc3=Éditeur divers SAV_Misc4=Éditeur divers @@ -58,7 +58,7 @@ SAV_PokedexBDSP=Éditeur Pokédex SAV_PokedexGG=Éditeur Pokédex SAV_PokedexLA=Éditeur Pokédex SAV_PokedexORAS=Éditeur Pokédex -SAV_PokedexResearchEditorLA=Éditeur de recherche Pokédex +SAV_PokedexResearchEditorLA=Éditeur de tâches Pokédex SAV_PokedexSM=Éditeur Pokédex SAV_PokedexSV=Éditeur Pokédex SAV_PokedexSVKitakami=Éditeur Pokédex @@ -88,7 +88,7 @@ SAV_Trainer9a=Éditeur de données du Dresseur SAV_Underground=Éditeur du Souterrain SAV_Underground8b=Éditeur des objets du Grand Souterrain SAV_UnityTower=Éditeur Tour Union -SAV_Wondercard=Menu des Cadeaux Mystère +SAV_Wondercard=E/S Cadeau Mystère SAV_ZygardeCell=Éditeur de Cellules/Emblèmes SettingsEditor=Paramètres SuperTrainingEditor=Éditeur de Médailles @@ -443,7 +443,7 @@ Main.B_OpenSuperTraining=SPV Main.B_OpenTrainerInfo=Infos Dress. Main.B_OpenUGSEditor=Souterrain Main.B_OpenUnityTowerEditor=Tour Union -Main.B_OpenWondercards=CarteMiracle +Main.B_OpenWondercards=Cartes Miracle Main.B_OtherSlots=Emplacements+ Main.B_OUTPasserby=PSS Main.B_PlusRecord=Drapeaux Plus @@ -479,7 +479,7 @@ Main.CHK_IsAlpha=Baron Main.CHK_IsEgg=Œuf Main.CHK_IsNoble=Mona. Main.CHK_Nicknamed=Surnom : -Main.CHK_NSparkle=Oui +Main.CHK_NSparkle=Actif Main.CHK_Shadow=Obscur Main.DayCare_HasEgg=Œuf disponible Main.GB_CurrentMoves=Capacités actuelles @@ -1851,7 +1851,7 @@ SAV_OPower.GB_Field=Terrain SAV_Poffin8b.B_All=Tout SAV_Poffin8b.B_Cancel=Annuler SAV_Poffin8b.B_None=Aucun -SAV_Poffin8b.B_Save=Sauvegarder +SAV_Poffin8b.B_Save=Sauv. SAV_Pokeathlon4.B_Cancel=Annuler SAV_Pokeathlon4.B_MedalsClearAll=Tout effacer SAV_Pokeathlon4.B_MedalsGiveAll=Tout donner @@ -2133,7 +2133,7 @@ SAV_PokedexLA.GB_CaughtInWild=Capturé (sauvage) SAV_PokedexLA.GB_Displayed=Montré SAV_PokedexLA.GB_Height=Taille SAV_PokedexLA.GB_Obtained=Obtenue -SAV_PokedexLA.GB_ResearchTasks=Tâches de recherche +SAV_PokedexLA.GB_ResearchTasks=Tâches SAV_PokedexLA.GB_SeenInWild=Vu (sauvage) SAV_PokedexLA.GB_Statistics=Statistiques SAV_PokedexLA.GB_Weight=Poids @@ -2377,7 +2377,7 @@ SAV_RTC3.L_ISecond=Secondes SAV_SealStickers8b.B_All=Tout SAV_SealStickers8b.B_Cancel=Annuler SAV_SealStickers8b.B_None=Aucun -SAV_SealStickers8b.B_Save=Sauvegarder +SAV_SealStickers8b.B_Save=Sauv. SAV_SecretBase.B_Cancel=Annuler SAV_SecretBase.B_Export=Exporter SAV_SecretBase.B_FDelete=X @@ -2887,7 +2887,7 @@ SAV_Underground.TB_UGTreasures=Trésors SAV_Underground8b.B_All=Tout SAV_Underground8b.B_Cancel=Annuler SAV_Underground8b.B_None=Aucun -SAV_Underground8b.B_Save=Sauvegarder +SAV_Underground8b.B_Save=Sauv. SAV_UnityTower.B_Cancel=Annuler SAV_UnityTower.B_ClearLocations=Réinitialiser SAV_UnityTower.B_Save=Sauvegarder diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index 4149cf961..98676500b 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -18,7 +18,7 @@ SAV_BoxList=Visualizzatore Storage SAV_Capture7GG=Editor Record di Catture SAV_Chatter=Editor Schiamazzo SAV_Database=Database -SAV_DLC5=Generation 5 DLC I/O +SAV_DLC5=I/O del DLC di quinta generazione SAV_Donut9a=Editor Ciambella SAV_DonutGenerator9a=Generatore di Ciambelle casuali SAV_Encounters=Database @@ -39,7 +39,7 @@ SAV_Inventory=Editor Inventario SAV_JoinAvenue=Editor Galleria Solidarietà SAV_Link6=Strumenti Link SAV_MailBox=Editor Messaggi -SAV_Medals5=Premi +SAV_Medals5=Editor Premi SAV_Misc2=Editor Varie SAV_Misc3=Editor Dati Allenatore SAV_Misc4=Editor Varie @@ -57,13 +57,13 @@ SAV_Pokedex9a=Editor Pokédex SAV_PokedexBDSP=Editor Pokédex SAV_PokedexGG=Editor Pokédex SAV_PokedexLA=Editor Pokédex -SAV_PokedexORAS=Editor Pokédex (ROZA) -SAV_PokedexResearchEditorLA=Editor Ricerche del Pokédex +SAV_PokedexORAS=Editor Pokédex +SAV_PokedexResearchEditorLA=Editor Incarichi Pokédex SAV_PokedexSM=Editor Pokédex SAV_PokedexSV=Editor Pokédex SAV_PokedexSVKitakami=Editor Pokédex SAV_PokedexSWSH=Editor Pokédex -SAV_PokedexXY=Editor Pokédex (XY) +SAV_PokedexXY=Editor Pokédex SAV_Pokepuff=Editor Pokébignè SAV_Raid8=Editor Parametri Raid SAV_Raid9=Editor Parametri Raid @@ -88,7 +88,7 @@ SAV_Trainer9a=Editor Dati Allenatore SAV_Underground=Editor Sotterranei SAV_Underground8b=Editor Strumenti Sotterranei SAV_UnityTower=Editor Torre Unione -SAV_Wondercard=Dono Segreto I/O +SAV_Wondercard=I/O Dono Segreto SAV_ZygardeCell=Editor Cellule e Adesivi SettingsEditor=Impostazioni SuperTrainingEditor=Editor Medaglie @@ -1439,9 +1439,9 @@ SAV_JoinAvenue.L_IsPromotionActive=Promozione attiva: SAV_JoinAvenue.L_IsShopChangeAllowed=Può cambiare negozio: SAV_JoinAvenue.L_JoinAvenueRank=Rango galleria: SAV_JoinAvenue.L_Language=Lingua: -SAV_JoinAvenue.L_MedalCount=Numero medaglie: -SAV_JoinAvenue.L_MedalHint=Suggerimento medaglia: -SAV_JoinAvenue.L_MedalRank=Rango medaglia: +SAV_JoinAvenue.L_MedalCount=Numero premi: +SAV_JoinAvenue.L_MedalHint=Suggerimento premio: +SAV_JoinAvenue.L_MedalRank=Rango premio: SAV_JoinAvenue.L_MetDay=Giorno incontro: SAV_JoinAvenue.L_MetHour=Ora incontro: SAV_JoinAvenue.L_MetMinute=Minuto incontro: @@ -1529,8 +1529,8 @@ SAV_MailBox.L_HeldItem5=(Mess.) SAV_MailBox.L_HeldItem6=(Mess.) SAV_MailBox.L_MailType=Tipo Mess.: SAV_MailBox.L_MiscValue=Varie: -SAV_MailBox.L_PartyHeld=Cas. Mess. (Squadra) -SAV_MailBox.L_PCBOX=Casella Mess. (PC) +SAV_MailBox.L_PartyHeld=Messaggi (Squadra) +SAV_MailBox.L_PCBOX=Messaggi (PC) SAV_MailBox.L_PKM1=Bulbasaur: SAV_MailBox.L_PKM2=Bulbasaur: SAV_MailBox.L_PKM3=Bulbasaur: @@ -1565,7 +1565,7 @@ SAV_Medals5.Tab_Habitat=Lista zone SAV_Medals5.Tab_Medals=Premi SAV_Misc2.B_Cancel=Annulla SAV_Misc2.B_Save=Salva -SAV_Misc2.B_VirtualConsoleGSBall=Attiva evento Celebi (Virtual Console) +SAV_Misc2.B_VirtualConsoleGSBall=Attiva evento GS Ball (Virtual Console) SAV_Misc3.B_Cancel=Annulla SAV_Misc3.B_ForceMirageIsland=Fai apparire Isola Miraggio: abbina il primo Pokémon in squadra SAV_Misc3.B_GetTickets=Ottieni Biglietti @@ -2133,7 +2133,7 @@ SAV_PokedexLA.GB_CaughtInWild=Catturato (Selvatico) SAV_PokedexLA.GB_Displayed=Visualizzato SAV_PokedexLA.GB_Height=Altezza SAV_PokedexLA.GB_Obtained=Ottenuto -SAV_PokedexLA.GB_ResearchTasks=Missioni Ricerca +SAV_PokedexLA.GB_ResearchTasks=Incarichi SAV_PokedexLA.GB_SeenInWild=Visto (Selvatico) SAV_PokedexLA.GB_Statistics=Statistiche SAV_PokedexLA.GB_Weight=Peso diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index 7b8cd8a6b..03436465c 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -18,7 +18,7 @@ SAV_BoxList=ボックスリスト SAV_Capture7GG=Capture Record Editor SAV_Chatter=おしゃべり SAV_Database=データベース -SAV_DLC5=第5世代 DLC 入出力 +SAV_DLC5=第5世代 DLC入出力 SAV_Donut9a=ドーナツ SAV_DonutGenerator9a=ランダムドーナツジェネレーター SAV_Encounters=データベース @@ -88,7 +88,7 @@ SAV_Trainer9a=トレーナー情報 SAV_Underground=ちかつうろ SAV_Underground8b=地下大洞窟 SAV_UnityTower=ユナイテッドタワー -SAV_Wondercard=ふしぎなおくりもの +SAV_Wondercard=ふしぎなおくりもの入出力 SAV_ZygardeCell=ジガルデ・セル / ヌシール SettingsEditor=設定 SuperTrainingEditor=スパトレ diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index 66ea1e680..f737632c5 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -39,7 +39,7 @@ SAV_Inventory=인벤토리 편집 도구 SAV_JoinAvenue=조인애버뉴 편집 도구 SAV_Link6=포켓몬 링크 도구 SAV_MailBox=메일박스 편집 도구 -SAV_Medals5=메달 +SAV_Medals5=메달 편집 도구 SAV_Misc2=기타 편집 도구 SAV_Misc3=트레이너 데이터 편집 도구 SAV_Misc4=기타 편집 도구 @@ -57,13 +57,13 @@ SAV_Pokedex9a=포켓몬 도감 편집 도구 SAV_PokedexBDSP=포켓몬 도감 편집 도구 SAV_PokedexGG=포켓몬 도감 편집 도구 SAV_PokedexLA=포켓몬 도감 편집 도구 -SAV_PokedexORAS=포켓몬 도감 편집 도구 (ORAS) -SAV_PokedexResearchEditorLA=포켓몬 도감 연구 편집 도구 +SAV_PokedexORAS=포켓몬 도감 편집 도구 +SAV_PokedexResearchEditorLA=도감 과제 편집 도구 SAV_PokedexSM=포켓몬 도감 편집 도구 SAV_PokedexSV=포켓몬 도감 편집 도구 SAV_PokedexSVKitakami=포켓몬 도감 편집 도구 SAV_PokedexSWSH=포켓몬 도감 편집 도구 -SAV_PokedexXY=포켓몬 도감 편집 도구 (XY) +SAV_PokedexXY=포켓몬 도감 편집 도구 SAV_Pokepuff=포플레 편집 도구 SAV_Raid8=레이드 매개변수 편집 도구 SAV_Raid9=레이드 매개변수 편집 도구 @@ -88,7 +88,7 @@ SAV_Trainer9a=트레이너 데이터 편집 도구 SAV_Underground=지하통로 점수 편집 도구 SAV_Underground8b=지하통로 아이템 편집 도구 SAV_UnityTower=유나이티드타워 편집 도구 -SAV_Wondercard=이상한소포 I/O +SAV_Wondercard=이상한 소포 입출력 SAV_ZygardeCell=셀/스티커 편집 도구 SettingsEditor=설정 SuperTrainingEditor=메달 편집 도구 @@ -227,16 +227,16 @@ Funfest5Mission.WhatistheBestPriceB=이상적인 가격은...? (B2) Funfest5Mission.WhatistheRealPriceW=진짜 가격은...? (W2) Funfest5Mission.WhereareFlutteringHearts=두근두근 하트는 어디에? Funfest5Mission.WingsFallingontheDrawbridge=도개교에 춤추듯 떨어지는 날개 -GearCategory.Badges=Badges -GearCategory.Bags=Bags -GearCategory.Bottom=Bottom -GearCategory.Face=Face -GearCategory.Glasses=Glasses -GearCategory.Hair=Hair -GearCategory.Hands=Hands -GearCategory.Head=Head -GearCategory.Shoes=Shoes -GearCategory.Top=Top +GearCategory.Badges=뱃지 +GearCategory.Bags=가방 +GearCategory.Bottom=하의 +GearCategory.Face=얼굴 +GearCategory.Glasses=안경 +GearCategory.Hair=헤어스타일 +GearCategory.Hands=장갑 +GearCategory.Head=모자 +GearCategory.Shoes=신발 +GearCategory.Top=상의 HabitatCompletion5.Caught=잡음 HabitatCompletion5.Complete=완료 HabitatCompletion5.None=없음 @@ -527,7 +527,7 @@ Main.Label_3DSRegion=3DS 지역: Main.Label_Ability=특성: Main.Label_ATK=공격: Main.Label_AVs=AVs -Main.Label_Ball=볼 종류: +Main.Label_Ball=볼: Main.Label_Base=종족값 Main.Label_Beauty=아름다움 Main.Label_CharacteristicPrefix=개성: @@ -641,7 +641,7 @@ Main.mnu_SortLegal=적법함 Main.mnu_SortLevel=레벨 (오름차순) Main.mnu_SortLevelReverse=레벨 (내림차순) Main.mnu_SortMarks=마크 수 -Main.mnu_SortName=포켓몬 종류 +Main.mnu_SortName=포켓몬 이름 Main.mnu_SortOwner=어버이 Main.mnu_SortParty=지닌 포켓몬 Main.mnu_SortPotential=IV 합계 @@ -2093,7 +2093,7 @@ SAV_PokedexGG.L_RHeightMin=최소 SAV_PokedexGG.L_RWeight=몸무게 SAV_PokedexGG.L_RWeightMax=최대 SAV_PokedexGG.L_RWeightMin=최소 -SAV_PokedexLA.B_AdvancedResearch=전체 과제 편집... +SAV_PokedexLA.B_AdvancedResearch=모든 과제 편집... SAV_PokedexLA.B_Cancel=취소 SAV_PokedexLA.B_Report=보고 데이터 SAV_PokedexLA.B_Save=저장 @@ -2133,7 +2133,7 @@ SAV_PokedexLA.GB_CaughtInWild=야생에서 포획함 SAV_PokedexLA.GB_Displayed=표시됨 SAV_PokedexLA.GB_Height=키 SAV_PokedexLA.GB_Obtained=획득함 -SAV_PokedexLA.GB_ResearchTasks=도감 과제 +SAV_PokedexLA.GB_ResearchTasks=과제 SAV_PokedexLA.GB_SeenInWild=야생에서 발견함 SAV_PokedexLA.GB_Statistics=통계 SAV_PokedexLA.GB_Weight=몸무게 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index abd30312f..6de71dbc1 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -39,7 +39,7 @@ SAV_Inventory=物品栏 SAV_JoinAvenue=汇合大道编辑 SAV_Link6=宝可梦连接工具 SAV_MailBox=邮箱编辑 -SAV_Medals5=奖牌 +SAV_Medals5=奖牌编辑 SAV_Misc2=杂项编辑 SAV_Misc3=训练家数据编辑 SAV_Misc4=杂项编辑 @@ -58,7 +58,7 @@ SAV_PokedexBDSP=图鉴编辑 SAV_PokedexGG=图鉴编辑 SAV_PokedexLA=图鉴编辑 SAV_PokedexORAS=图鉴编辑 -SAV_PokedexResearchEditorLA=图鉴研究编辑 +SAV_PokedexResearchEditorLA=图鉴课题编辑 SAV_PokedexSM=图鉴编辑 SAV_PokedexSV=图鉴编辑 SAV_PokedexSVKitakami=图鉴编辑 @@ -88,7 +88,7 @@ SAV_Trainer9a=训练家资料 SAV_Underground=地下世界编辑 SAV_Underground8b=地下世界编辑 SAV_UnityTower=联合塔编辑 -SAV_Wondercard=神秘礼物导入导出 +SAV_Wondercard=神秘礼物输入/输出 SAV_ZygardeCell=细胞/贴纸编辑 SettingsEditor=设置 SuperTrainingEditor=超级训练奖章 @@ -443,7 +443,7 @@ Main.B_OpenSuperTraining=超级训练 Main.B_OpenTrainerInfo=训练家信息 Main.B_OpenUGSEditor=地下世界 Main.B_OpenUnityTowerEditor=联合塔 -Main.B_OpenWondercards=神秘礼物 +Main.B_OpenWondercards=神秘卡片 Main.B_OtherSlots=其他 Main.B_OUTPasserby=路人 Main.B_PlusRecord=加强招式 @@ -527,7 +527,7 @@ Main.Label_3DSRegion=3DS区域: Main.Label_Ability=特性: Main.Label_ATK=攻击: Main.Label_AVs=觉醒值 -Main.Label_Ball=精灵球: +Main.Label_Ball=球: Main.Label_Base=种族值 Main.Label_Beauty=美丽 Main.Label_CharacteristicPrefix=个性: @@ -1439,9 +1439,9 @@ SAV_JoinAvenue.L_IsPromotionActive=促销进行中: SAV_JoinAvenue.L_IsShopChangeAllowed=可更换店铺: SAV_JoinAvenue.L_JoinAvenueRank=大道排名: SAV_JoinAvenue.L_Language=语言: -SAV_JoinAvenue.L_MedalCount=勋章数量: -SAV_JoinAvenue.L_MedalHint=勋章提示: -SAV_JoinAvenue.L_MedalRank=勋章等级: +SAV_JoinAvenue.L_MedalCount=奖牌数量: +SAV_JoinAvenue.L_MedalHint=奖牌提示: +SAV_JoinAvenue.L_MedalRank=奖牌等级: SAV_JoinAvenue.L_MetDay=遇见日: SAV_JoinAvenue.L_MetHour=遇见时: SAV_JoinAvenue.L_MetMinute=遇见分: @@ -2093,7 +2093,7 @@ SAV_PokedexGG.L_RHeightMin=最小 SAV_PokedexGG.L_RWeight=重量 SAV_PokedexGG.L_RWeightMax=最大 SAV_PokedexGG.L_RWeightMin=最小 -SAV_PokedexLA.B_AdvancedResearch=编辑所有任务... +SAV_PokedexLA.B_AdvancedResearch=编辑所有课题... SAV_PokedexLA.B_Cancel=取消 SAV_PokedexLA.B_Report=报告数据 SAV_PokedexLA.B_Save=保存 @@ -2133,7 +2133,7 @@ SAV_PokedexLA.GB_CaughtInWild=在野外捕捉 SAV_PokedexLA.GB_Displayed=显示 SAV_PokedexLA.GB_Height=身高 SAV_PokedexLA.GB_Obtained=捕获 -SAV_PokedexLA.GB_ResearchTasks=研究任务 +SAV_PokedexLA.GB_ResearchTasks=课题 SAV_PokedexLA.GB_SeenInWild=在野外见过 SAV_PokedexLA.GB_Statistics=统计 SAV_PokedexLA.GB_Weight=重量 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index 57d09c358..582bc1ddc 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -39,7 +39,7 @@ SAV_Inventory=物品欄 SAV_JoinAvenue=匯合大道編輯 SAV_Link6=寶可夢連接工具 SAV_MailBox=郵箱編輯 -SAV_Medals5=獎牌 +SAV_Medals5=獎牌編輯 SAV_Misc2=訓練家資料雜項編輯 SAV_Misc3=訓練家資料雜項編輯 SAV_Misc4=訓練家資料雜項編輯 @@ -54,16 +54,16 @@ SAV_PokeBlockORAS=寶可方塊編輯器 SAV_Pokedex4=圖鑒編輯器 SAV_Pokedex5=圖鑒編輯器 SAV_Pokedex9a=圖鑒編輯器 -SAV_PokedexBDSP=圖鑒編輯器(BDSP) +SAV_PokedexBDSP=圖鑒編輯器 SAV_PokedexGG=圖鑒編輯器 -SAV_PokedexLA=圖鑒編輯器(阿爾宙斯) -SAV_PokedexORAS=圖鑒編輯器(ORAS) -SAV_PokedexResearchEditorLA=圖鑒研究編輯器 -SAV_PokedexSM=圖鑒編輯器(SM) -SAV_PokedexSV=圖鑒編輯器(SV) +SAV_PokedexLA=圖鑒編輯器 +SAV_PokedexORAS=圖鑒編輯器 +SAV_PokedexResearchEditorLA=圖鑑課題輯器 +SAV_PokedexSM=圖鑒編輯器 +SAV_PokedexSV=圖鑒編輯器 SAV_PokedexSVKitakami=圖鑒編輯器 -SAV_PokedexSWSH=圖鑒編輯器(SWSH) -SAV_PokedexXY=圖鑒編輯器(XY) +SAV_PokedexSWSH=圖鑒編輯器 +SAV_PokedexXY=圖鑒編輯器 SAV_Pokepuff=寶芙蕾編輯器 SAV_Raid8=極巨巢穴參數編輯器 SAV_Raid9=太晶洞窟參數編輯器 @@ -88,7 +88,7 @@ SAV_Trainer9a=訓練家資料編輯器 SAV_Underground=地下世界編輯器 SAV_Underground8b=地下世界編輯器 SAV_UnityTower=聯合塔編輯器 -SAV_Wondercard=神秘禮物導入匯出 +SAV_Wondercard=神秘禮物輸入/輸出 SAV_ZygardeCell=細胞/貼紙編輯器 SettingsEditor=設置 SuperTrainingEditor=超級訓練獎章器 @@ -443,7 +443,7 @@ Main.B_OpenSuperTraining=超級訓練 Main.B_OpenTrainerInfo=訓練家資訊 Main.B_OpenUGSEditor=地下世界 Main.B_OpenUnityTowerEditor=聯合塔 -Main.B_OpenWondercards=神秘禮物 +Main.B_OpenWondercards=神秘卡片 Main.B_OtherSlots=其他 Main.B_OUTPasserby=路人 Main.B_PlusRecord=強化招式 @@ -527,7 +527,7 @@ Main.Label_3DSRegion=3DS所屬區域: Main.Label_Ability=特性: Main.Label_ATK=攻擊: Main.Label_AVs=覺醒值 -Main.Label_Ball=精靈球種: +Main.Label_Ball=球: Main.Label_Base=種族值 Main.Label_Beauty=美麗 Main.Label_CharacteristicPrefix=個性: @@ -1439,9 +1439,9 @@ SAV_JoinAvenue.L_IsPromotionActive=促銷進行中: SAV_JoinAvenue.L_IsShopChangeAllowed=可更換店鋪: SAV_JoinAvenue.L_JoinAvenueRank=大道排名: SAV_JoinAvenue.L_Language=語言: -SAV_JoinAvenue.L_MedalCount=勳章數量: -SAV_JoinAvenue.L_MedalHint=勳章提示: -SAV_JoinAvenue.L_MedalRank=勳章等級: +SAV_JoinAvenue.L_MedalCount=獎牌數量: +SAV_JoinAvenue.L_MedalHint=獎牌提示: +SAV_JoinAvenue.L_MedalRank=獎牌等級: SAV_JoinAvenue.L_MetDay=遇見日: SAV_JoinAvenue.L_MetHour=遇見時: SAV_JoinAvenue.L_MetMinute=遇見分: @@ -2093,7 +2093,7 @@ SAV_PokedexGG.L_RHeightMin=最小 SAV_PokedexGG.L_RWeight=重量 SAV_PokedexGG.L_RWeightMax=最大 SAV_PokedexGG.L_RWeightMin=最小 -SAV_PokedexLA.B_AdvancedResearch=編輯所有任務... +SAV_PokedexLA.B_AdvancedResearch=編輯所有課題... SAV_PokedexLA.B_Cancel=取消 SAV_PokedexLA.B_Report=報告資料 SAV_PokedexLA.B_Save=儲存 @@ -2133,7 +2133,7 @@ SAV_PokedexLA.GB_CaughtInWild=在野外捕捉 SAV_PokedexLA.GB_Displayed=顯示 SAV_PokedexLA.GB_Height=身高 SAV_PokedexLA.GB_Obtained=捕獲 -SAV_PokedexLA.GB_ResearchTasks=研究任務 +SAV_PokedexLA.GB_ResearchTasks=課題 SAV_PokedexLA.GB_SeenInWild=在野外遇見過 SAV_PokedexLA.GB_Statistics=統計 SAV_PokedexLA.GB_Weight=重量 From 76c3b72ae44072ba706dda1a1e208db098885415 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 7 Jun 2026 15:50:53 -0500 Subject: [PATCH 64/81] Gen5: Flesh out a few more blocks, PGL editor Run a quick translation of the save troubleshooter (force loader) Adds a PGL editor GUI Fleshes out the adventure info block, GTS block, and battle box block; thanks to the PGL DW effort aggregating over 100 save files to give a varied expression of fields :D Fix SpriteUtil failing to yield an item sprite (due to the split of artwork-item/big-item, the method was never repointed). fix wishmkr shiny request failing to return correctly; add in ganlon/salac item set --- .../Templates/Gen3/Gifts/EncounterGift3.cs | 21 + .../Legality/RNG/ClassicEra/Gen3/Wishmkr.cs | 14 + PKHeX.Core/Saves/SAV5.cs | 4 +- .../Substructures/Gen5/AdventureInfo5.cs | 96 +++ .../Saves/Substructures/Gen5/BattleBox5.cs | 22 +- .../Saves/Substructures/Gen5/DateQuad5.cs | 48 ++ PKHeX.Core/Saves/Substructures/Gen5/GTS5.cs | 27 + .../Saves/Substructures/Gen5/GlobalLink5.cs | 98 +++ .../Saves/Substructures/Gen5/MysteryBlock5.cs | 22 - PKHeX.Drawing.PokeSprite/Util/SpriteUtil.cs | 2 +- .../Controls/SAV Editor/SAVEditor.Designer.cs | 89 +-- .../Controls/SAV Editor/SAVEditor.cs | 6 +- PKHeX.WinForms/Resources/text/lang_de.txt | 29 + PKHeX.WinForms/Resources/text/lang_en.txt | 29 + PKHeX.WinForms/Resources/text/lang_es-419.txt | 29 + PKHeX.WinForms/Resources/text/lang_es.txt | 29 + PKHeX.WinForms/Resources/text/lang_fr.txt | 29 + PKHeX.WinForms/Resources/text/lang_it.txt | 29 + PKHeX.WinForms/Resources/text/lang_ja.txt | 29 + PKHeX.WinForms/Resources/text/lang_ko.txt | 29 + .../Resources/text/lang_zh-Hans.txt | 29 + .../Resources/text/lang_zh-Hant.txt | 29 + .../Gen5/SAV_GlobalLink5.Designer.cs | 607 ++++++++++++++++++ .../Save Editors/Gen5/SAV_GlobalLink5.cs | 239 +++++++ .../Subforms/SaveHandlerTroubleshooter.cs | 5 +- 25 files changed, 1517 insertions(+), 73 deletions(-) create mode 100644 PKHeX.Core/Saves/Substructures/Gen5/AdventureInfo5.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen5/DateQuad5.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen5/GTS5.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen5/GlobalLink5.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_GlobalLink5.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_GlobalLink5.cs diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen3/Gifts/EncounterGift3.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen3/Gifts/EncounterGift3.cs index ca4147851..616add704 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen3/Gifts/EncounterGift3.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen3/Gifts/EncounterGift3.cs @@ -210,6 +210,8 @@ private uint SetPINGA(PK3 pk, in EncounterCriteria criteria, PersonalInfo3 pi) pk.PID = pid; pk.IV32 = ClassicEraRNG.GetSequentialIVs(ref seed); pk.RefreshAbility((int)(pk.PID & 1)); + if (ID32 is Wishmkr.TrainerID) + pk.HeldItem = Wishmkr.GetHeldItem(LCRNG.Next16(ref seed)); return seed; } } @@ -239,6 +241,14 @@ public bool GenerateSeed32(PKM pk, uint seed) private static bool TrySetWishmkrShiny(PK3 pk, in EncounterCriteria criteria) { + // 9 shinies, none duplicate nature. If nature is specified, try to set that nature. + if (criteria.Nature.IsFixed && Wishmkr.TryGetSeed(criteria.Nature, out var u16)) + { + GenerateWishmkr(pk, u16); + return true; + } + + // Nature can still be a "pick one of" nature, if specified. bool filterIVs = criteria.IsSpecifiedIVs(2); bool filterNature = criteria.IsSpecifiedNature(); foreach (var s in Wishmkr.All9) @@ -253,12 +263,23 @@ private static bool TrySetWishmkrShiny(PK3 pk, in EncounterCriteria criteria) continue; // try again if (filterIVs && !criteria.IsSatisfiedIVs(iv32)) continue; // try again + pk.PID = pid; pk.IV32 = iv32; + pk.HeldItem = Wishmkr.GetHeldItemFromSeed(s); + return true; } return false; } + public static void GenerateWishmkr(PK3 pk, ushort u16) + { + uint seed = u16; + pk.PID = GetRegular(ref seed); + pk.IV32 = ClassicEraRNG.GetSequentialIVs(ref seed); + pk.HeldItem = Wishmkr.GetHeldItemFromSeed(u16); + } + private static uint GetMethod2(ref uint seed) { var a = LCRNG.Next16(ref seed); diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/Wishmkr.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/Wishmkr.cs index 63d460593..3e968c26c 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/Wishmkr.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/Wishmkr.cs @@ -61,4 +61,18 @@ public static bool TryGetSeed(Nature nature, out ushort seed) seed = Seeds[(int)nature]; return seed != 0; } + + /// + /// Gets the held item for a generated WISHMKR Jirachi. + /// + /// rand() 16-bits immediately after IVs are determined + /// The item is either 170 (Salac) or 169 (Ganlon) + public static byte GetHeldItem(uint rand16) => (byte)(170 - ((rand16 / 3) & 1)); + + /// + /// Gets the held item for a generated WISHMKR Jirachi from the 16-bit seed. + /// + /// The 16-bit seed used to generate the Jirachi. + /// The item is either 170 (Salac) or 169 (Ganlon) + public static byte GetHeldItemFromSeed(ushort seed) => GetHeldItem(LCRNG.Next5(seed) >> 16); } diff --git a/PKHeX.Core/Saves/SAV5.cs b/PKHeX.Core/Saves/SAV5.cs index 40e877901..e272738cf 100644 --- a/PKHeX.Core/Saves/SAV5.cs +++ b/PKHeX.Core/Saves/SAV5.cs @@ -108,8 +108,8 @@ protected override void SetPKM(PKM pk, bool isParty = false) public override int PlayedMinutes { get => PlayerData.PlayedMinutes; set => PlayerData.PlayedMinutes = value; } public override int PlayedSeconds { get => PlayerData.PlayedSeconds; set => PlayerData.PlayedSeconds = value; } public override uint Money { get => Misc.Money; set => Misc.Money = value; } - public override uint SecondsToStart { get => AdventureInfo.SecondsToStart; set => AdventureInfo.SecondsToStart = value; } - public override uint SecondsToFame { get => AdventureInfo.SecondsToFame; set => AdventureInfo.SecondsToFame = value; } + public override uint SecondsToStart { get => (uint)AdventureInfo.SecondsToStart; set => AdventureInfo.SecondsToStart = value; } + public override uint SecondsToFame { get => (uint)AdventureInfo.SecondsToFame; set => AdventureInfo.SecondsToFame = value; } protected override void SetDex(PKM pk) => Zukan.SetDex(pk); public override bool GetCaught(ushort species) => Zukan.GetCaught(species); diff --git a/PKHeX.Core/Saves/Substructures/Gen5/AdventureInfo5.cs b/PKHeX.Core/Saves/Substructures/Gen5/AdventureInfo5.cs new file mode 100644 index 000000000..130aa1f68 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen5/AdventureInfo5.cs @@ -0,0 +1,96 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +public sealed class AdventureInfo5(SAV5 sav, Memory raw) : SaveBlock(sav, raw) +{ + public ulong RTC { get => ReadUInt64LittleEndian(Data); set => WriteUInt64LittleEndian(Data, value); } + public Span ConsoleMACAddress => Data[0x8..0xE]; + public byte BirthMonth { get => Data[0x0E]; set => Data[0x0E] = value; } + public byte BirthDay { get => Data[0x0F]; set => Data[0x0F] = value; } + + public bool Flag { get => Data[0x10] != 0; set => Data[0x10] = (byte)(value ? 1 : 0); } + + public Date5 Date => new(Raw[0x14..0x24]); + public Time5 Time => new(Raw[0x24..0x30]); + + public DateTime? Moment + { + get + { + if (!Date.IsValid || !Time.IsValid) + return null; + var date = Date.ToDateOnly(); + var time = Time.ToTimeOnly(); + return new DateTime(date, time); + } + set + { + if (value is not { } dt) + return; + Date.FromDateOnly(DateOnly.FromDateTime(dt)); + Time.FromTimeOnly(TimeOnly.FromDateTime(dt)); + } + } + + public uint DaysElapsed { get => ReadUInt32LittleEndian(Data[0x30..]); set => WriteUInt32LittleEndian(Data[0x30..], value); } + public ulong SecondsToStart { get => ReadUInt64LittleEndian(Data[0x34..]); set => WriteUInt64LittleEndian(Data[0x34..], value); } + public ulong SecondsToFame { get => ReadUInt64LittleEndian(Data[0x3C..]); set => WriteUInt64LittleEndian(Data[0x3C..], value); } + public uint PenaltyTime { get => ReadUInt32LittleEndian(Data[0x44..]); set => WriteUInt32LittleEndian(Data[0x44..], value); } + + public byte Unknown48 { get => Data[0x48]; set => Data[0x48] = value; } + public byte Unknown49 { get => Data[0x49]; set => Data[0x49] = value; } + // 2 bytes alignment + + public uint Unknown4C { get => ReadUInt32LittleEndian(Data[0x4C..]); set => WriteUInt32LittleEndian(Data[0x4C..], value); } + public uint Unknown50 { get => ReadUInt32LittleEndian(Data[0x50..]); set => WriteUInt32LittleEndian(Data[0x50..], value); } + public uint Unknown54 { get => ReadUInt32LittleEndian(Data[0x54..]); set => WriteUInt32LittleEndian(Data[0x54..], value); } + public uint Unknown58 { get => ReadUInt32LittleEndian(Data[0x58..]); set => WriteUInt32LittleEndian(Data[0x58..], value); } +} + +public struct Date5(Memory Raw) +{ + public Span Data => Raw.Span; + + public uint Year { get => ReadUInt32LittleEndian(Data); set => WriteUInt32LittleEndian(Data, value); } + public uint Month { get => ReadUInt32LittleEndian(Data[4..]); set => WriteUInt32LittleEndian(Data[4..], value); } + public uint Day { get => ReadUInt32LittleEndian(Data[8..]); set => WriteUInt32LittleEndian(Data[8..], value); } + public uint DayOfWeek { get => ReadUInt32LittleEndian(Data[12..]); set => WriteUInt32LittleEndian(Data[12..], value); } + + public uint Epoch = 2000; + public DateOnly ToDateOnly() + { + int year = (int)Year + (int)Epoch; + return new DateOnly(year, (int)Month, (int)Day); + } + + public bool IsEmpty => Year == 0 && Month == 0 && Day == 0 && DayOfWeek == 0; + public bool IsValid => Year <= 99 && Month is (>= 1 and <= 12) + && Day >= 1 && Day <= DateTime.DaysInMonth((int)Year + (int)Epoch, (int)Month) + && ((byte)ToDateOnly().DayOfWeek == DayOfWeek); + public void FromDateOnly(DateOnly date) + { + Year = (uint)date.Year - Epoch; + Month = (uint)date.Month; + Day = (uint)date.Day; + DayOfWeek = (uint)date.DayOfWeek; + } +} + +public struct Time5(Memory Raw) +{ + public Span Data => Raw.Span; + public uint Hour { get => ReadUInt32LittleEndian(Data); set => WriteUInt32LittleEndian(Data, value); } + public uint Minute { get => ReadUInt32LittleEndian(Data[4..]); set => WriteUInt32LittleEndian(Data[4..], value); } + public uint Second { get => ReadUInt32LittleEndian(Data[8..]); set => WriteUInt32LittleEndian(Data[8..], value); } + public bool IsEmpty => Hour == 0 && Minute == 0 && Second == 0; + public bool IsValid => Hour < 24 && Minute < 60 && Second < 60; + public void FromTimeOnly(TimeOnly time) + { + Hour = (uint)time.Hour; + Minute = (uint)time.Minute; + Second = (uint)time.Second; + } + public TimeOnly ToTimeOnly() => new((int)Hour, (int)Minute, (int)Second); +} diff --git a/PKHeX.Core/Saves/Substructures/Gen5/BattleBox5.cs b/PKHeX.Core/Saves/Substructures/Gen5/BattleBox5.cs index 6b72b48a0..eeb850fef 100644 --- a/PKHeX.Core/Saves/Substructures/Gen5/BattleBox5.cs +++ b/PKHeX.Core/Saves/Substructures/Gen5/BattleBox5.cs @@ -13,11 +13,25 @@ public Memory GetSlot(int index) return Raw.Slice(index * SizeStored, SizeStored); } - public Memory this [int index] => GetSlot(index); + public Memory this[int index] => GetSlot(index); - public bool BattleBoxLocked + public Span TeamTrash => Data.Slice(0x330, 0x28); + + public string Name // BOX 1 { - get => Data[0x358] != 0; // Wi-Fi/Live Tournament Active - set => Data[0x358] = value ? (byte)1 : (byte)0; + get => StringConverter5.GetString(TeamTrash); + set => StringConverter5.SetString(TeamTrash, value, 20, 0); + } + + public bool BattleBoxLockedWiFiTournament + { + get => (Data[0x358] & 1u) == 1; + set => Data[0x358] = value ? (byte)(Data[0x358] | 1u) : (byte)(Data[0x358] & ~1u); + } + + public bool BattleBoxLockedLiveTournament // For VGC IRL tournaments. + { + get => (Data[0x358] & 2u) == 2; + set => Data[0x358] = value ? (byte)(Data[0x358] | 2u) : (byte)(Data[0x358] & ~2u); } } diff --git a/PKHeX.Core/Saves/Substructures/Gen5/DateQuad5.cs b/PKHeX.Core/Saves/Substructures/Gen5/DateQuad5.cs new file mode 100644 index 000000000..031391551 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen5/DateQuad5.cs @@ -0,0 +1,48 @@ +using System; + +namespace PKHeX.Core; + +/// +/// Exposes a date stored as 4 bytes, with the format: [DayOfWeek, Day, Month, YearSince2000]. +/// +/// Backing memory for the date. Must be at least 4 bytes long. +public struct DateQuad5(Memory Raw) +{ + public const int SIZE = 4; + public DateQuad5() : this(new byte[SIZE]) { } + + private const int Epoch = 2000; + public Span Data => Raw.Span; + public byte DayOfWeek { get => Data[0x00]; set => Data[0x00] = value; } + public byte Day { get => Data[0x01]; set => Data[0x01] = value; } + public byte Month { get => Data[0x02]; set => Data[0x02] = value; } + public byte Year { get => Data[0x03]; set => Data[0x03] = value; } + + public DateOnly ToDateOnly() + { + int year = Year + 2000; + return new DateOnly(year, Month, Day); + } + + public bool IsEmpty => Year == 0 && Month == 0 && Day == 0 && DayOfWeek == 0; + + public bool IsValid => Year <= 99 && Month is (>= 1 and <= 12) + && Day >= 1 && Day <= DateTime.DaysInMonth(Year + Epoch, Month) + && ((byte)ToDateOnly().DayOfWeek == DayOfWeek); + + public void FromDateOnly(DateOnly date) + { + Year = (byte)(date.Year - Epoch); + Month = (byte)date.Month; + Day = (byte)date.Day; + DayOfWeek = (byte)date.DayOfWeek; + } + + public void SetEmpty() + { + Year = 0; + Month = 0; + Day = 0; + DayOfWeek = 0; + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen5/GTS5.cs b/PKHeX.Core/Saves/Substructures/Gen5/GTS5.cs new file mode 100644 index 000000000..aeca69d16 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen5/GTS5.cs @@ -0,0 +1,27 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +public sealed class GTS5(SAV5 sav, Memory raw) : SaveBlock(sav, raw) +{ + // 0x08: Stored Upload + private const int SizeStored = PokeCrypto.SIZE_5PARTY; + + public Memory Upload => Raw[..SizeStored]; + + // 16 bytes unused (maybe they forgot to update from Gen4 size const?) + + public ushort UnknownEC { get => ReadUInt16LittleEndian(Data[0xEC..]); set => WriteUInt16LittleEndian(Data[0xEC..], value); } + public ushort UnknownEE { get => ReadUInt16LittleEndian(Data[0xEE..]); set => WriteUInt16LittleEndian(Data[0xEE..], value); } + + // Timestamps for interaction tracking: + // Example 1: + // 02 07 08 0C + // 05 02 09 0B + // Example 2: + // 00 00 00 00 + // 04 0E 04 0B + public DateQuad5 DateUpload => new(Raw[0xF0..0xF4]); + public DateQuad5 DateSearch => new(Raw[0xF4..0xF8]); // don't have to upload to search +} diff --git a/PKHeX.Core/Saves/Substructures/Gen5/GlobalLink5.cs b/PKHeX.Core/Saves/Substructures/Gen5/GlobalLink5.cs new file mode 100644 index 000000000..1fb9528a4 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen5/GlobalLink5.cs @@ -0,0 +1,98 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +public sealed class GlobalLink5(SAV5 sav, Memory raw) : SaveBlock(sav, raw) +{ + public DateQuad5 UploadDate => new(Raw[..4]); + + // -1 if never interacted + public int UploadCount { get => ReadInt32LittleEndian(Data[0x04..]); set => WriteInt32LittleEndian(Data[0x04..], value); } + + // 0x08: Stored Upload + private const int SizeStored = PokeCrypto.SIZE_5PARTY; + + public Memory Upload => Raw.Slice(8, SizeStored); + + public const int CountItems = 20; + public ushort GetItem(int index) => ReadUInt16LittleEndian(GetItemSpan(index)); + public void SetItem(int index, ushort value) => WriteUInt16LittleEndian(GetItemSpan(index), value); + + private Span GetItemSpan(int index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, CountItems); + return Data.Slice(0xE4 + (index * 2), 2); + } + + public byte GetItemQuantity(int index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, CountItems); + return Data[0xE4 + (CountItems * 2) + index]; + } + + public void SetItemQuantity(int index, byte value) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, CountItems); + Data[0xE4 + (CountItems * 2) + index] = value; + } + + public const int CountFurniture = 5; + + public DreamFurniture5 GetFurniture(int index) + { + ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual((uint)index, CountFurniture); + return new DreamFurniture5(Raw.Slice(0x120 + (index * DreamFurniture5.SIZE), DreamFurniture5.SIZE)); + } + + // 0x1A2 + public byte UploadStatus { get => Data[0x1A2]; set => Data[0x1A2] = value; } + public bool IsSlotPresent { get => Data[0x1A3] != 0; set => Data[0x1A3] = (byte)(value ? 1 : 0); } + + /// + /// The player can enter the Dream World as if it has a game Pokémon Black or White registered. + /// No Black 2 or White 2 Pokémon Dream World Pokémon appears on demo mode. + /// + public bool IsRegistered { get => Data[0x1A4] != 0; set => Data[0x1A4] = (byte)(value ? 1 : 0); } + + /// + /// To have full access to one's account, players first had to send a Pokémon to the Dream World by using their C-Gear's only Online feature, Game Sync. + /// After doing so, players had full access to the Global Link site. + /// + public bool IsAccountFullAccess { get => Data[0x1A5] != 0; set => Data[0x1A5] = (byte)(value ? 1 : 0); } + + + // 7 bits for selecting one furniture, 0x7F if none. + private byte Furniture { get => Data[0x1A6]; set => Data[0x1A6] = value; } + public byte SelectedFurnitureIndex { get => (byte)(Furniture & 0x7F); set => Furniture = (byte)((Furniture & 0x80) | (value & 0x7F)); } + public bool IsFurnitureSynchronized { get => (Furniture & 0x80) != 0; set => Furniture = (byte)((Furniture & 0x7F) | (value ? 0x80 : 0)); } + + // Track downloaded content. + public byte Musical { get => Data[0x1A7]; set => Data[0x1A7] = value; } + public byte CGearSkin { get => Data[0x1A8]; set => Data[0x1A8] = value; } + public byte DexSkin { get => Data[0x1A9]; set => Data[0x1A9] = value; } + + // 0x1AA,0x1AB: Unused padding +} + +public struct DreamFurniture5(Memory Raw) +{ + public const int SIZE = 0x1A; + public Span Data => Raw.Span; + + // 0x7E uninitialized individual slots. + public ushort Value { get => ReadUInt16LittleEndian(Data); set => WriteUInt16LittleEndian(Data, value); } + + private const int NameLength = 12; + public Span NameTrash => Data.Slice(2, NameLength * sizeof(ushort)); + public string Name { get => StringConverter5.GetString(NameTrash); set => StringConverter5.SetString(NameTrash, value, NameLength, 0); } + + public const string Extension = "dwf5"; + public string FileName => $"{Value:000} - {Name}.{Extension}"; + + public void Clear() + { + Value = 0x7E; + NameTrash.Clear(); + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen5/MysteryBlock5.cs b/PKHeX.Core/Saves/Substructures/Gen5/MysteryBlock5.cs index bf52d9026..9b2e0cebb 100644 --- a/PKHeX.Core/Saves/Substructures/Gen5/MysteryBlock5.cs +++ b/PKHeX.Core/Saves/Substructures/Gen5/MysteryBlock5.cs @@ -82,25 +82,3 @@ public void SetMysteryGiftReceivedFlag(int index, bool value) DataMysteryGift IMysteryGiftStorage.GetMysteryGift(int index) => GetMysteryGift(index); void IMysteryGiftStorage.SetMysteryGift(int index, DataMysteryGift gift) => SetMysteryGift(index, (PGF)gift); } - -public sealed class GTS5(SAV5 sav, Memory raw) : SaveBlock(sav, raw) -{ - // 0x08: Stored Upload - private const int SizeStored = PokeCrypto.SIZE_5STORED; - - public Memory Upload => Raw[..SizeStored]; -} - -public sealed class GlobalLink5(SAV5 sav, Memory raw) : SaveBlock(sav, raw) -{ - // 0x08: Stored Upload - private const int SizeStored = PokeCrypto.SIZE_5STORED; - - public Memory Upload => Raw.Slice(8, SizeStored); -} - -public sealed class AdventureInfo5(SAV5 sav, Memory raw) : SaveBlock(sav, raw) -{ - public uint SecondsToStart { get => ReadUInt32LittleEndian(Data[0x34..]); set => WriteUInt32LittleEndian(Data[0x34..], value); } - public uint SecondsToFame { get => ReadUInt32LittleEndian(Data[0x3C..]); set => WriteUInt32LittleEndian(Data[0x3C..], value); } -} diff --git a/PKHeX.Drawing.PokeSprite/Util/SpriteUtil.cs b/PKHeX.Drawing.PokeSprite/Util/SpriteUtil.cs index ef4e10a1b..7b80e25e8 100644 --- a/PKHeX.Drawing.PokeSprite/Util/SpriteUtil.cs +++ b/PKHeX.Drawing.PokeSprite/Util/SpriteUtil.cs @@ -58,7 +58,7 @@ public static Bitmap GetBallSprite(byte ball) return (Bitmap?)Resources.ResourceManager.GetObject(resource) ?? Resources._ball4; // Poké Ball (default) } - public static Bitmap? GetItemSprite(int item) => Resources.ResourceManager.GetObject($"item_{item}") as Bitmap; + public static Bitmap? GetItemSprite(int item) => Resources.ResourceManager.GetObject($"bitem_{item}") as Bitmap; public static Bitmap? GetItemSpriteA(int item) => Resources.ResourceManager.GetObject($"aitem_{item}") as Bitmap; public static Bitmap GetSprite(ushort species, byte form, byte gender, uint formarg, int item, bool isegg, Shiny shiny, EntityContext context = EntityContext.None) diff --git a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs index 8bde4dae2..615b36af8 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs @@ -87,13 +87,13 @@ private void InitializeComponent() B_OpenGeonetEditor = new System.Windows.Forms.Button(); B_OpenUnityTowerEditor = new System.Windows.Forms.Button(); B_OpenJoinAvenueEditor = new System.Windows.Forms.Button(); + B_OpenPokeathlon = new System.Windows.Forms.Button(); B_OpenMedalsEditor = new System.Windows.Forms.Button(); B_OpenChatterEditor = new System.Windows.Forms.Button(); B_Roamer = new System.Windows.Forms.Button(); B_FestivalPlaza = new System.Windows.Forms.Button(); B_MailBox = new System.Windows.Forms.Button(); B_OpenApricorn = new System.Windows.Forms.Button(); - B_OpenPokeathlon = new System.Windows.Forms.Button(); B_Raids = new System.Windows.Forms.Button(); B_RaidsDLC1 = new System.Windows.Forms.Button(); B_RaidsDLC2 = new System.Windows.Forms.Button(); @@ -114,6 +114,7 @@ private void InitializeComponent() B_ConvertKorean = new System.Windows.Forms.Button(); CB_SaveSlot = new System.Windows.Forms.ComboBox(); L_SaveSlot = new System.Windows.Forms.Label(); + B_OpenGlobalLink = new System.Windows.Forms.Button(); tabBoxMulti.SuspendLayout(); Tab_Box.SuspendLayout(); PopoutMenu.SuspendLayout(); @@ -462,6 +463,7 @@ private void InitializeComponent() FLP_SAVtools.Controls.Add(B_OpenBattlePass); FLP_SAVtools.Controls.Add(B_OpenGear); FLP_SAVtools.Controls.Add(B_OpenFashion); + FLP_SAVtools.Controls.Add(B_OpenGlobalLink); FLP_SAVtools.Dock = System.Windows.Forms.DockStyle.Bottom; FLP_SAVtools.Location = new System.Drawing.Point(0, 173); FLP_SAVtools.Margin = new System.Windows.Forms.Padding(0); @@ -769,20 +771,20 @@ private void InitializeComponent() B_OpenJoinAvenueEditor.UseVisualStyleBackColor = true; B_OpenJoinAvenueEditor.Click += B_OpenJoinAvenueEditor_Click; // - // B_OpenChatterEditor + // B_OpenPokeathlon // - B_OpenChatterEditor.Location = new System.Drawing.Point(316, 244); - B_OpenChatterEditor.Margin = new System.Windows.Forms.Padding(4); - B_OpenChatterEditor.Name = "B_OpenChatterEditor"; - B_OpenChatterEditor.Size = new System.Drawing.Size(96, 32); - B_OpenChatterEditor.TabIndex = 1; - B_OpenChatterEditor.Text = "Chatter"; - B_OpenChatterEditor.UseVisualStyleBackColor = true; - B_OpenChatterEditor.Click += B_OpenChatterEditor_Click; + B_OpenPokeathlon.Location = new System.Drawing.Point(316, 244); + B_OpenPokeathlon.Margin = new System.Windows.Forms.Padding(4); + B_OpenPokeathlon.Name = "B_OpenPokeathlon"; + B_OpenPokeathlon.Size = new System.Drawing.Size(96, 32); + B_OpenPokeathlon.TabIndex = 1; + B_OpenPokeathlon.Text = "Pokéathlon"; + B_OpenPokeathlon.UseVisualStyleBackColor = true; + B_OpenPokeathlon.Click += B_OpenPokeathlon_Click; // // B_OpenMedalsEditor // - B_OpenMedalsEditor.Location = new System.Drawing.Point(316, 364); + B_OpenMedalsEditor.Location = new System.Drawing.Point(4, 284); B_OpenMedalsEditor.Margin = new System.Windows.Forms.Padding(4); B_OpenMedalsEditor.Name = "B_OpenMedalsEditor"; B_OpenMedalsEditor.Size = new System.Drawing.Size(96, 32); @@ -791,9 +793,20 @@ private void InitializeComponent() B_OpenMedalsEditor.UseVisualStyleBackColor = true; B_OpenMedalsEditor.Click += B_OpenMedalsEditor_Click; // + // B_OpenChatterEditor + // + B_OpenChatterEditor.Location = new System.Drawing.Point(108, 284); + B_OpenChatterEditor.Margin = new System.Windows.Forms.Padding(4); + B_OpenChatterEditor.Name = "B_OpenChatterEditor"; + B_OpenChatterEditor.Size = new System.Drawing.Size(96, 32); + B_OpenChatterEditor.TabIndex = 1; + B_OpenChatterEditor.Text = "Chatter"; + B_OpenChatterEditor.UseVisualStyleBackColor = true; + B_OpenChatterEditor.Click += B_OpenChatterEditor_Click; + // // B_Roamer // - B_Roamer.Location = new System.Drawing.Point(4, 284); + B_Roamer.Location = new System.Drawing.Point(212, 284); B_Roamer.Margin = new System.Windows.Forms.Padding(4); B_Roamer.Name = "B_Roamer"; B_Roamer.Size = new System.Drawing.Size(96, 32); @@ -804,7 +817,7 @@ private void InitializeComponent() // // B_FestivalPlaza // - B_FestivalPlaza.Location = new System.Drawing.Point(108, 284); + B_FestivalPlaza.Location = new System.Drawing.Point(316, 284); B_FestivalPlaza.Margin = new System.Windows.Forms.Padding(4); B_FestivalPlaza.Name = "B_FestivalPlaza"; B_FestivalPlaza.Size = new System.Drawing.Size(96, 32); @@ -815,7 +828,7 @@ private void InitializeComponent() // // B_MailBox // - B_MailBox.Location = new System.Drawing.Point(212, 284); + B_MailBox.Location = new System.Drawing.Point(4, 324); B_MailBox.Margin = new System.Windows.Forms.Padding(4); B_MailBox.Name = "B_MailBox"; B_MailBox.Size = new System.Drawing.Size(96, 32); @@ -826,7 +839,7 @@ private void InitializeComponent() // // B_OpenApricorn // - B_OpenApricorn.Location = new System.Drawing.Point(316, 284); + B_OpenApricorn.Location = new System.Drawing.Point(108, 324); B_OpenApricorn.Margin = new System.Windows.Forms.Padding(4); B_OpenApricorn.Name = "B_OpenApricorn"; B_OpenApricorn.Size = new System.Drawing.Size(96, 32); @@ -837,7 +850,7 @@ private void InitializeComponent() // // B_Raids // - B_Raids.Location = new System.Drawing.Point(108, 324); + B_Raids.Location = new System.Drawing.Point(212, 324); B_Raids.Margin = new System.Windows.Forms.Padding(4); B_Raids.Name = "B_Raids"; B_Raids.Size = new System.Drawing.Size(96, 32); @@ -846,20 +859,9 @@ private void InitializeComponent() B_Raids.UseVisualStyleBackColor = true; B_Raids.Click += B_OpenRaids_Click; // - // B_OpenPokeathlon - // - B_OpenPokeathlon.Location = new System.Drawing.Point(4, 324); - B_OpenPokeathlon.Margin = new System.Windows.Forms.Padding(4); - B_OpenPokeathlon.Name = "B_OpenPokeathlon"; - B_OpenPokeathlon.Size = new System.Drawing.Size(96, 32); - B_OpenPokeathlon.TabIndex = 1; - B_OpenPokeathlon.Text = "Pokéathlon"; - B_OpenPokeathlon.UseVisualStyleBackColor = true; - B_OpenPokeathlon.Click += B_OpenPokeathlon_Click; - // // B_RaidsDLC1 // - B_RaidsDLC1.Location = new System.Drawing.Point(212, 324); + B_RaidsDLC1.Location = new System.Drawing.Point(316, 324); B_RaidsDLC1.Margin = new System.Windows.Forms.Padding(4); B_RaidsDLC1.Name = "B_RaidsDLC1"; B_RaidsDLC1.Size = new System.Drawing.Size(96, 32); @@ -870,7 +872,7 @@ private void InitializeComponent() // // B_RaidsDLC2 // - B_RaidsDLC2.Location = new System.Drawing.Point(316, 324); + B_RaidsDLC2.Location = new System.Drawing.Point(4, 364); B_RaidsDLC2.Margin = new System.Windows.Forms.Padding(4); B_RaidsDLC2.Name = "B_RaidsDLC2"; B_RaidsDLC2.Size = new System.Drawing.Size(96, 32); @@ -881,7 +883,7 @@ private void InitializeComponent() // // B_Blocks // - B_Blocks.Location = new System.Drawing.Point(4, 364); + B_Blocks.Location = new System.Drawing.Point(108, 364); B_Blocks.Margin = new System.Windows.Forms.Padding(4); B_Blocks.Name = "B_Blocks"; B_Blocks.Size = new System.Drawing.Size(96, 32); @@ -892,7 +894,7 @@ private void InitializeComponent() // // B_OtherSlots // - B_OtherSlots.Location = new System.Drawing.Point(108, 364); + B_OtherSlots.Location = new System.Drawing.Point(212, 364); B_OtherSlots.Margin = new System.Windows.Forms.Padding(4); B_OtherSlots.Name = "B_OtherSlots"; B_OtherSlots.Size = new System.Drawing.Size(96, 32); @@ -903,7 +905,7 @@ private void InitializeComponent() // // B_OpenSealStickers // - B_OpenSealStickers.Location = new System.Drawing.Point(212, 364); + B_OpenSealStickers.Location = new System.Drawing.Point(316, 364); B_OpenSealStickers.Margin = new System.Windows.Forms.Padding(4); B_OpenSealStickers.Name = "B_OpenSealStickers"; B_OpenSealStickers.Size = new System.Drawing.Size(96, 32); @@ -914,7 +916,7 @@ private void InitializeComponent() // // B_Poffins // - B_Poffins.Location = new System.Drawing.Point(316, 364); + B_Poffins.Location = new System.Drawing.Point(4, 404); B_Poffins.Margin = new System.Windows.Forms.Padding(4); B_Poffins.Name = "B_Poffins"; B_Poffins.Size = new System.Drawing.Size(96, 32); @@ -925,7 +927,7 @@ private void InitializeComponent() // // B_RaidsSevenStar // - B_RaidsSevenStar.Location = new System.Drawing.Point(4, 404); + B_RaidsSevenStar.Location = new System.Drawing.Point(108, 404); B_RaidsSevenStar.Margin = new System.Windows.Forms.Padding(4); B_RaidsSevenStar.Name = "B_RaidsSevenStar"; B_RaidsSevenStar.Size = new System.Drawing.Size(96, 32); @@ -936,7 +938,7 @@ private void InitializeComponent() // // B_OpenBattlePass // - B_OpenBattlePass.Location = new System.Drawing.Point(108, 404); + B_OpenBattlePass.Location = new System.Drawing.Point(212, 404); B_OpenBattlePass.Margin = new System.Windows.Forms.Padding(4); B_OpenBattlePass.Name = "B_OpenBattlePass"; B_OpenBattlePass.Size = new System.Drawing.Size(96, 32); @@ -947,7 +949,7 @@ private void InitializeComponent() // // B_OpenGear // - B_OpenGear.Location = new System.Drawing.Point(212, 404); + B_OpenGear.Location = new System.Drawing.Point(316, 404); B_OpenGear.Margin = new System.Windows.Forms.Padding(4); B_OpenGear.Name = "B_OpenGear"; B_OpenGear.Size = new System.Drawing.Size(96, 32); @@ -958,7 +960,7 @@ private void InitializeComponent() // // B_OpenFashion // - B_OpenFashion.Location = new System.Drawing.Point(316, 404); + B_OpenFashion.Location = new System.Drawing.Point(4, 444); B_OpenFashion.Margin = new System.Windows.Forms.Padding(4); B_OpenFashion.Name = "B_OpenFashion"; B_OpenFashion.Size = new System.Drawing.Size(96, 32); @@ -1067,6 +1069,17 @@ private void InitializeComponent() L_SaveSlot.Text = "Save Slot:"; L_SaveSlot.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // + // B_OpenGlobalLink + // + B_OpenGlobalLink.Location = new System.Drawing.Point(108, 444); + B_OpenGlobalLink.Margin = new System.Windows.Forms.Padding(4); + B_OpenGlobalLink.Name = "B_OpenGlobalLink"; + B_OpenGlobalLink.Size = new System.Drawing.Size(96, 32); + B_OpenGlobalLink.TabIndex = 12; + B_OpenGlobalLink.Text = "Global Link"; + B_OpenGlobalLink.UseVisualStyleBackColor = true; + B_OpenGlobalLink.Click += B_OpenGlobalLink_Click; + // // SAVEditor // AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; @@ -1085,7 +1098,6 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)dcpkx2).EndInit(); ((System.ComponentModel.ISupportInitialize)dcpkx1).EndInit(); Tab_SAV.ResumeLayout(false); - Tab_SAV.PerformLayout(); FLP_SAVtools.ResumeLayout(false); FLP_SAVToolsMisc.ResumeLayout(false); ResumeLayout(false); @@ -1174,5 +1186,6 @@ private void InitializeComponent() private System.Windows.Forms.ContextMenuStrip PopoutMenu; private System.Windows.Forms.ToolStripMenuItem Menu_PopoutBoxSingle; private System.Windows.Forms.ToolStripMenuItem Menu_PopoutBoxAll; + private System.Windows.Forms.Button B_OpenGlobalLink; } } diff --git a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs index 7d2346d4b..58cf34068 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs @@ -648,6 +648,7 @@ private static void OpenDialog(Form f) private void B_OpenUnityTowerEditor_Click(object sender, EventArgs e) => OpenDialog(new SAV_UnityTower((SAV5)SAV)); private void B_OpenJoinAvenueEditor_Click(object sender, EventArgs e) => OpenDialog(new SAV_JoinAvenue((SAV5B2W2)SAV)); private void B_OpenMedalsEditor_Click(object sender, EventArgs e) => OpenDialog(new SAV_Medals5((SAV5B2W2)SAV)); + private void B_OpenGlobalLink_Click(object sender, EventArgs e) => OpenDialog(new SAV_GlobalLink5((SAV5)SAV)); private void B_OpenChatterEditor_Click(object sender, EventArgs e) => OpenDialog(new SAV_Chatter(SAV)); private void B_OpenGear_Click(object sender, EventArgs e) => OpenDialog(new SAV_Gear((SAV4BR)SAV)); private void B_Donuts_Click(object sender, EventArgs e) => OpenDialog(new SAV_Donut9a((SAV9ZA)SAV)); @@ -1312,9 +1313,8 @@ private void ToggleViewSubEditors(SaveFile sav) B_OpenHoneyTreeEditor.Visible = sav is SAV4Sinnoh; B_OpenUGSEditor.Visible = sav is SAV4Sinnoh or SAV8BS; B_OpenGeonetEditor.Visible = sav is SAV4; - B_OpenUnityTowerEditor.Visible = sav is SAV5; - B_OpenJoinAvenueEditor.Visible = sav is SAV5B2W2; - B_OpenMedalsEditor.Visible = sav is SAV5B2W2; + B_OpenGlobalLink.Visible = B_OpenUnityTowerEditor.Visible = sav is SAV5; + B_OpenJoinAvenueEditor.Visible = B_OpenMedalsEditor.Visible = sav is SAV5B2W2; B_OpenChatterEditor.Visible = sav is SAV4 or SAV5; B_OpenBattlePass.Visible = B_OpenGear.Visible = sav is SAV4BR; B_OpenSealStickers.Visible = B_Poffins.Visible = sav is SAV8BS; diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index 7e8fa511a..5e5f3cf9c 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -30,6 +30,7 @@ SAV_FlagWork8b=Event-Flag-Editor SAV_FolderList=Verzeichnis SAV_Gear=Accessoire-Editor SAV_Geonet4=Geonet-Editor +SAV_GlobalLink5=Pokémon Global Link-Editor SAV_HallOfFame=Ruhmeshallen-Editor SAV_HallOfFame1=Ruhmeshallen-Editor SAV_HallOfFame3=Ruhmeshallen-Editor @@ -90,6 +91,7 @@ SAV_Underground8b=Untergrund-Item-Editor SAV_UnityTower=Turm der Einheit-Editor SAV_Wondercard=Geheimgeschenk-E/A SAV_ZygardeCell=Zellen/Sticker-Editor +SaveHandlerTroubleshooter=Fehlerbehebung für Save-Handler SettingsEditor=Einstellungen SuperTrainingEditor=Medaillen-Editor TechRecordEditor=TP-Editor @@ -423,6 +425,7 @@ Main.B_OpenFashion=Mode Main.B_OpenFriendSafari=Kontaktsafari Main.B_OpenGear=Accessoire Main.B_OpenGeonetEditor=Geonet +Main.B_OpenGlobalLink=Pokémon Global Link Main.B_OpenHallofFame=Ruhmeshalle Main.B_OpenHoneyTreeEditor=Honigbaum Main.B_OpenItemPouch=Items @@ -1327,6 +1330,25 @@ SAV_Geonet4.CHK_GlobalFlag=Ganze Weltkugel sichtbar SAV_Geonet4.DGV_Item_Country=Land SAV_Geonet4.DGV_Item_Point=Punkt SAV_Geonet4.DGV_Item_Region=Region +SAV_GlobalLink5.B_Cancel=Abbrechen +SAV_GlobalLink5.B_Save=Speichern +SAV_GlobalLink5.CHK_DateSet=Festlegen +SAV_GlobalLink5.CHK_FurnitureSynchronized=Synchronisiert +SAV_GlobalLink5.CHK_IsFullAccess=Voller Zugriff +SAV_GlobalLink5.CHK_IsRegistered=Spielmodul registriert +SAV_GlobalLink5.CHK_IsSlotPresent=Upload-Slot belegt +SAV_GlobalLink5.DGV_Count=Anzahl +SAV_GlobalLink5.DGV_Item=Gegenstand +SAV_GlobalLink5.L_CGearSkin=C-Gear-Skin: +SAV_GlobalLink5.L_DexSkin=Pokédex-Skin: +SAV_GlobalLink5.L_FurnitureSelected=Ausgewählt: +SAV_GlobalLink5.L_Musical=Musical: +SAV_GlobalLink5.L_UploadCount=Upload-Anzahl: +SAV_GlobalLink5.L_UploadDate=Upload-Datum: +SAV_GlobalLink5.L_UploadStatus=Upload-Status: +SAV_GlobalLink5.Tab_Furniture=Möbel +SAV_GlobalLink5.Tab_General=Allgemein +SAV_GlobalLink5.Tab_Items=Gegenstände SAV_HallOfFame.B_Cancel=Abbrechen SAV_HallOfFame.B_Close=Speichern SAV_HallOfFame.B_CopyText=Txt-Kopie @@ -2918,6 +2940,13 @@ SAV_ZygardeCell.DGV_dgv_ref=Ref SAV_ZygardeCell.DGV_dgv_val=Wert SAV_ZygardeCell.L_Cells=Gelagert: SAV_ZygardeCell.L_Collected=Gesammelt: +SaveHandlerTroubleshooter.B_Browse=Durchsuchen... +SaveHandlerTroubleshooter.B_Continue=Fortfahren +SaveHandlerTroubleshooter.L_Handler=Handler: +SaveHandlerTroubleshooter.L_Language=Sprache: +SaveHandlerTroubleshooter.L_Path=Pfad: +SaveHandlerTroubleshooter.L_SubVersion=Unterversion: +SaveHandlerTroubleshooter.L_Type=Speicherdateityp: SettingsEditor.B_Reset=Zurücks. SettingsEditor.L_Blank=Leere Speicherstand-Version: SkinColorBR.Dark=Dunkel diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index faa209649..6f21d79f8 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -30,6 +30,7 @@ SAV_FlagWork8b=Event Flag Editor SAV_FolderList=Folder List SAV_Gear=Gear Editor SAV_Geonet4=Geonet Editor +SAV_GlobalLink5=Global Link Editor SAV_HallOfFame=Hall of Fame Editor SAV_HallOfFame1=Hall of Fame Viewer SAV_HallOfFame3=Hall of Fame Viewer @@ -90,6 +91,7 @@ SAV_Underground8b=Underground Items Editor SAV_UnityTower=Unity Tower Editor SAV_Wondercard=Mystery Gift I/O SAV_ZygardeCell=Cells/Sticker Editor +SaveHandlerTroubleshooter=Save Handler Troubleshooter SettingsEditor=Settings SuperTrainingEditor=Medal Editor TechRecordEditor=TR Relearn Editor @@ -423,6 +425,7 @@ Main.B_OpenFashion=Fashion Main.B_OpenFriendSafari=Friend Safari Main.B_OpenGear=Gear Main.B_OpenGeonetEditor=Geonet +Main.B_OpenGlobalLink=Global Link Main.B_OpenHallofFame=Hall of Fame Main.B_OpenHoneyTreeEditor=Honey Tree Main.B_OpenItemPouch=Items @@ -1327,6 +1330,25 @@ SAV_Geonet4.CHK_GlobalFlag=Whole Globe Visible SAV_Geonet4.DGV_Item_Country=Country SAV_Geonet4.DGV_Item_Point=Point SAV_Geonet4.DGV_Item_Region=Region +SAV_GlobalLink5.B_Cancel=Cancel +SAV_GlobalLink5.B_Save=Save +SAV_GlobalLink5.CHK_DateSet=Set +SAV_GlobalLink5.CHK_FurnitureSynchronized=Synchronized +SAV_GlobalLink5.CHK_IsFullAccess=Full Access +SAV_GlobalLink5.CHK_IsRegistered=Game Card Registered +SAV_GlobalLink5.CHK_IsSlotPresent=Upload Slot Tucked In +SAV_GlobalLink5.DGV_Count=Count +SAV_GlobalLink5.DGV_Item=Item +SAV_GlobalLink5.L_CGearSkin=CGear Skin: +SAV_GlobalLink5.L_DexSkin=Pokédex Skin: +SAV_GlobalLink5.L_FurnitureSelected=Selected: +SAV_GlobalLink5.L_Musical=Musical: +SAV_GlobalLink5.L_UploadCount=Upload Count: +SAV_GlobalLink5.L_UploadDate=Upload Date: +SAV_GlobalLink5.L_UploadStatus=Upload Status: +SAV_GlobalLink5.Tab_Furniture=Furniture +SAV_GlobalLink5.Tab_General=General +SAV_GlobalLink5.Tab_Items=Items SAV_HallOfFame.B_Cancel=Cancel SAV_HallOfFame.B_Close=Save SAV_HallOfFame.B_CopyText=Copy txt @@ -2918,6 +2940,13 @@ SAV_ZygardeCell.DGV_dgv_ref=Ref SAV_ZygardeCell.DGV_dgv_val=Value SAV_ZygardeCell.L_Cells=Stored: SAV_ZygardeCell.L_Collected=Collected: +SaveHandlerTroubleshooter.B_Browse=Browse... +SaveHandlerTroubleshooter.B_Continue=Continue +SaveHandlerTroubleshooter.L_Handler=Handler: +SaveHandlerTroubleshooter.L_Language=Language: +SaveHandlerTroubleshooter.L_Path=Path: +SaveHandlerTroubleshooter.L_SubVersion=Sub version: +SaveHandlerTroubleshooter.L_Type=Save file type: SettingsEditor.B_Reset=Reset All SettingsEditor.L_Blank=Blank Save Version: SkinColorBR.Dark=Dark diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index 712fdb425..7624076db 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -30,6 +30,7 @@ SAV_FlagWork8b=Editor de marcas de eventos SAV_FolderList=Lista de carpetas SAV_Gear=Editor de accesorios SAV_Geonet4=Editor de Geonet +SAV_GlobalLink5=Editor de Pokémon Global Link SAV_HallOfFame=Editor del Salón de la Fama SAV_HallOfFame1=Visor del Salón de la Fama SAV_HallOfFame3=Visor del Salón de la Fama @@ -90,6 +91,7 @@ SAV_Underground8b=Editor de Objetos del Subsuelo SAV_UnityTower=Editor de la Torre Unión SAV_Wondercard=E/S de Regalo Misterioso SAV_ZygardeCell=Editor de Células/Dominsignias +SaveHandlerTroubleshooter=Solucionador de problemas del manejador de guardado SettingsEditor=Ajustes SuperTrainingEditor=Editor de Superentrenamiento TechRecordEditor=Editor de aprendizaje de DT @@ -423,6 +425,7 @@ Main.B_OpenFashion=Moda Main.B_OpenFriendSafari=Safari Amistad Main.B_OpenGear=Accesorios Main.B_OpenGeonetEditor=Geonet +Main.B_OpenGlobalLink=Pokémon Global Link Main.B_OpenHallofFame=Salón de Fama Main.B_OpenHoneyTreeEditor=Árbol de Miel Main.B_OpenItemPouch=Inventario @@ -1327,6 +1330,25 @@ SAV_Geonet4.CHK_GlobalFlag=Todo el globo visible SAV_Geonet4.DGV_Item_Country=País SAV_Geonet4.DGV_Item_Point=Point SAV_Geonet4.DGV_Item_Region=Región +SAV_GlobalLink5.B_Cancel=Cancelar +SAV_GlobalLink5.B_Save=Guardar +SAV_GlobalLink5.CHK_DateSet=Establecer +SAV_GlobalLink5.CHK_FurnitureSynchronized=Sincronizado +SAV_GlobalLink5.CHK_IsFullAccess=Acceso total +SAV_GlobalLink5.CHK_IsRegistered=Tarjeta de juego registrada +SAV_GlobalLink5.CHK_IsSlotPresent=Ranura de carga ocupada +SAV_GlobalLink5.DGV_Count=Cantidad +SAV_GlobalLink5.DGV_Item=Objeto +SAV_GlobalLink5.L_CGearSkin=Diseño de C-Gear: +SAV_GlobalLink5.L_DexSkin=Diseño de Pokédex: +SAV_GlobalLink5.L_FurnitureSelected=Seleccionado: +SAV_GlobalLink5.L_Musical=Musical: +SAV_GlobalLink5.L_UploadCount=Conteo de cargas: +SAV_GlobalLink5.L_UploadDate=Fecha de carga: +SAV_GlobalLink5.L_UploadStatus=Estado de carga: +SAV_GlobalLink5.Tab_Furniture=Muebles +SAV_GlobalLink5.Tab_General=General +SAV_GlobalLink5.Tab_Items=Objetos SAV_HallOfFame.B_Cancel=Cancelar SAV_HallOfFame.B_Close=Guardar SAV_HallOfFame.B_CopyText=Copiar @@ -2918,6 +2940,13 @@ SAV_ZygardeCell.DGV_dgv_ref=Ref SAV_ZygardeCell.DGV_dgv_val=Valor SAV_ZygardeCell.L_Cells=Almacenado: SAV_ZygardeCell.L_Collected=Coleccionado: +SaveHandlerTroubleshooter.B_Browse=Examinar... +SaveHandlerTroubleshooter.B_Continue=Continuar +SaveHandlerTroubleshooter.L_Handler=Manejador: +SaveHandlerTroubleshooter.L_Language=Idioma: +SaveHandlerTroubleshooter.L_Path=Ruta: +SaveHandlerTroubleshooter.L_SubVersion=Subversión: +SaveHandlerTroubleshooter.L_Type=Tipo de archivo de guardado: SettingsEditor.B_Reset=Reset. todo SettingsEditor.L_Blank=Versión partida vacía: SkinColorBR.Dark=Oscura diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index c5fe03d5e..df8e9c780 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -30,6 +30,7 @@ SAV_FlagWork8b=Editor de marcas de eventos SAV_FolderList=Lista de carpetas SAV_Gear=Editor de accesorios SAV_Geonet4=Editor de Geonet +SAV_GlobalLink5=Editor de Pokémon Global Link SAV_HallOfFame=Editor del Hall de la Fama SAV_HallOfFame1=Visor del Hall de la Fama SAV_HallOfFame3=Visor del Hall de la Fama @@ -90,6 +91,7 @@ SAV_Underground8b=Editor de Objetos del Subsuelo SAV_UnityTower=Editor de la Torre Unión SAV_Wondercard=E/S de Regalo Misterioso SAV_ZygardeCell=Editor de Células/Dominsignias +SaveHandlerTroubleshooter=Solucionador de problemas del gestor de guardado SettingsEditor=Ajustes SuperTrainingEditor=Editor de Superentrenamiento TechRecordEditor=Editor de aprendizaje de DT @@ -423,6 +425,7 @@ Main.B_OpenFashion=Moda Main.B_OpenFriendSafari=Safari Amistad Main.B_OpenGear=Accesorios Main.B_OpenGeonetEditor=Geonet +Main.B_OpenGlobalLink=Pokémon Global Link Main.B_OpenHallofFame=Hall de la Fama Main.B_OpenHoneyTreeEditor=Árbol de Miel Main.B_OpenItemPouch=Inventario @@ -1327,6 +1330,25 @@ SAV_Geonet4.CHK_GlobalFlag=Todo el globo visible SAV_Geonet4.DGV_Item_Country=País SAV_Geonet4.DGV_Item_Point=Point SAV_Geonet4.DGV_Item_Region=Región +SAV_GlobalLink5.B_Cancel=Cancelar +SAV_GlobalLink5.B_Save=Guardar +SAV_GlobalLink5.CHK_DateSet=Establecer +SAV_GlobalLink5.CHK_FurnitureSynchronized=Sincronizado +SAV_GlobalLink5.CHK_IsFullAccess=Acceso total +SAV_GlobalLink5.CHK_IsRegistered=Tarjeta de juego registrada +SAV_GlobalLink5.CHK_IsSlotPresent=Ranura de carga ocupada +SAV_GlobalLink5.DGV_Count=Cantidad +SAV_GlobalLink5.DGV_Item=Objeto +SAV_GlobalLink5.L_CGearSkin=Diseño de C-Gear: +SAV_GlobalLink5.L_DexSkin=Diseño de Pokédex: +SAV_GlobalLink5.L_FurnitureSelected=Seleccionado: +SAV_GlobalLink5.L_Musical=Musical: +SAV_GlobalLink5.L_UploadCount=Conteo de cargas: +SAV_GlobalLink5.L_UploadDate=Fecha de carga: +SAV_GlobalLink5.L_UploadStatus=Estado de carga: +SAV_GlobalLink5.Tab_Furniture=Muebles +SAV_GlobalLink5.Tab_General=General +SAV_GlobalLink5.Tab_Items=Objetos SAV_HallOfFame.B_Cancel=Cancelar SAV_HallOfFame.B_Close=Guardar SAV_HallOfFame.B_CopyText=Copiar @@ -2918,6 +2940,13 @@ SAV_ZygardeCell.DGV_dgv_ref=Ref SAV_ZygardeCell.DGV_dgv_val=Valor SAV_ZygardeCell.L_Cells=Almacenado: SAV_ZygardeCell.L_Collected=Coleccionado: +SaveHandlerTroubleshooter.B_Browse=Examinar... +SaveHandlerTroubleshooter.B_Continue=Continuar +SaveHandlerTroubleshooter.L_Handler=Manejador: +SaveHandlerTroubleshooter.L_Language=Idioma: +SaveHandlerTroubleshooter.L_Path=Ruta: +SaveHandlerTroubleshooter.L_SubVersion=Subversión: +SaveHandlerTroubleshooter.L_Type=Tipo de archivo de guardado: SettingsEditor.B_Reset=Reset. todo SettingsEditor.L_Blank=Versión partida vacía: SkinColorBR.Dark=Oscura diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index 04b2bcefd..226718e2d 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -30,6 +30,7 @@ SAV_FlagWork8b=Éditeur de drapeaux d'évènements SAV_FolderList=Liste des dossiers SAV_Gear=Éditeur d'accessoires SAV_Geonet4=Éditeur Géonet +SAV_GlobalLink5=Éditeur Pokémon Global Link SAV_HallOfFame=Éditeur Panthéon SAV_HallOfFame1=Visualiseur Panthéon SAV_HallOfFame3=Visualiseur Panthéon @@ -90,6 +91,7 @@ SAV_Underground8b=Éditeur des objets du Grand Souterrain SAV_UnityTower=Éditeur Tour Union SAV_Wondercard=E/S Cadeau Mystère SAV_ZygardeCell=Éditeur de Cellules/Emblèmes +SaveHandlerTroubleshooter=Dépannage du gestionnaire de sauvegarde SettingsEditor=Paramètres SuperTrainingEditor=Éditeur de Médailles TechRecordEditor=Éditeur de capacités DT @@ -423,6 +425,7 @@ Main.B_OpenFashion=‎Mode Main.B_OpenFriendSafari=Safari Amis Main.B_OpenGear=Accessoires Main.B_OpenGeonetEditor=Géonet +Main.B_OpenGlobalLink=Pokémon Global Link Main.B_OpenHallofFame=Panthéon Main.B_OpenHoneyTreeEditor=Arbres à miel Main.B_OpenItemPouch=Objets @@ -1327,6 +1330,25 @@ SAV_Geonet4.CHK_GlobalFlag=Globe entier visible SAV_Geonet4.DGV_Item_Country=Pays SAV_Geonet4.DGV_Item_Point=Point SAV_Geonet4.DGV_Item_Region=Région +SAV_GlobalLink5.B_Cancel=Annuler +SAV_GlobalLink5.B_Save=Sauvegarder +SAV_GlobalLink5.CHK_DateSet=Définir +SAV_GlobalLink5.CHK_FurnitureSynchronized=Synchronisé +SAV_GlobalLink5.CHK_IsFullAccess=Accès complet +SAV_GlobalLink5.CHK_IsRegistered=Carte de jeu enregistrée +SAV_GlobalLink5.CHK_IsSlotPresent=Emplacement d'envoi occupé +SAV_GlobalLink5.DGV_Count=Quantité +SAV_GlobalLink5.DGV_Item=Objet +SAV_GlobalLink5.L_CGearSkin=Skin C-Gear : +SAV_GlobalLink5.L_DexSkin=Skin Pokédex : +SAV_GlobalLink5.L_FurnitureSelected=Sélectionné : +SAV_GlobalLink5.L_Musical=Comédie musicale : +SAV_GlobalLink5.L_UploadCount=Nb envois : +SAV_GlobalLink5.L_UploadDate=Date d'envoi : +SAV_GlobalLink5.L_UploadStatus=Statut d'envoi : +SAV_GlobalLink5.Tab_Furniture=Meubles +SAV_GlobalLink5.Tab_General=Général +SAV_GlobalLink5.Tab_Items=Objets SAV_HallOfFame.B_Cancel=Annuler SAV_HallOfFame.B_Close=Sauvegarder SAV_HallOfFame.B_CopyText=Copier txt @@ -2918,6 +2940,13 @@ SAV_ZygardeCell.DGV_dgv_ref=Réf SAV_ZygardeCell.DGV_dgv_val=Valeur SAV_ZygardeCell.L_Cells=Conservé : SAV_ZygardeCell.L_Collected=Obtenu : +SaveHandlerTroubleshooter.B_Browse=Parcourir... +SaveHandlerTroubleshooter.B_Continue=Continuer +SaveHandlerTroubleshooter.L_Handler=Gestionnaire : +SaveHandlerTroubleshooter.L_Language=Langue : +SaveHandlerTroubleshooter.L_Path=Chemin : +SaveHandlerTroubleshooter.L_SubVersion=Sous-version : +SaveHandlerTroubleshooter.L_Type=Type de sauvegarde : SettingsEditor.B_Reset=Réini. SettingsEditor.L_Blank=Version de sauvegarde vide : SkinColorBR.Dark=Sombre diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index 98676500b..d721fabbb 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -30,6 +30,7 @@ SAV_FlagWork8b=Editor Segnali Evento SAV_FolderList=Lista Cartelle SAV_Gear=Editor Accessori SAV_Geonet4=Editor Geonet +SAV_GlobalLink5=Editor Pokémon Global Link SAV_HallOfFame=Editor Sala d'Onore SAV_HallOfFame1=Visualizzatore Sala d'Onore SAV_HallOfFame3=Visualizzatore Sala d'Onore @@ -90,6 +91,7 @@ SAV_Underground8b=Editor Strumenti Sotterranei SAV_UnityTower=Editor Torre Unione SAV_Wondercard=I/O Dono Segreto SAV_ZygardeCell=Editor Cellule e Adesivi +SaveHandlerTroubleshooter=Risoluzione problemi gestore salvataggi SettingsEditor=Impostazioni SuperTrainingEditor=Editor Medaglie TechRecordEditor=Editor DT @@ -423,6 +425,7 @@ Main.B_OpenFashion=Fashion Main.B_OpenFriendSafari=Safari Amici Main.B_OpenGear=Accessori Main.B_OpenGeonetEditor=Geonet +Main.B_OpenGlobalLink=Pokémon Global Link Main.B_OpenHallofFame=Sala d'Onore Main.B_OpenHoneyTreeEditor=Alberi di Miele Main.B_OpenItemPouch=Strumenti @@ -1327,6 +1330,25 @@ SAV_Geonet4.CHK_GlobalFlag=Globo intero visibile SAV_Geonet4.DGV_Item_Country=Nazione SAV_Geonet4.DGV_Item_Point=Punto SAV_Geonet4.DGV_Item_Region=Regione +SAV_GlobalLink5.B_Cancel=Annulla +SAV_GlobalLink5.B_Save=Salva +SAV_GlobalLink5.CHK_DateSet=Imposta +SAV_GlobalLink5.CHK_FurnitureSynchronized=Sincronizzato +SAV_GlobalLink5.CHK_IsFullAccess=Accesso completo +SAV_GlobalLink5.CHK_IsRegistered=Scheda di gioco registrata +SAV_GlobalLink5.CHK_IsSlotPresent=Slot di caricamento occupato +SAV_GlobalLink5.DGV_Count=Quantità +SAV_GlobalLink5.DGV_Item=Strumento +SAV_GlobalLink5.L_CGearSkin=Skin C-Gear: +SAV_GlobalLink5.L_DexSkin=Skin Pokédex: +SAV_GlobalLink5.L_FurnitureSelected=Selezionato: +SAV_GlobalLink5.L_Musical=Musical: +SAV_GlobalLink5.L_UploadCount=Conteggio caricamenti: +SAV_GlobalLink5.L_UploadDate=Data caricamento: +SAV_GlobalLink5.L_UploadStatus=Stato caricamento: +SAV_GlobalLink5.Tab_Furniture=Arredi +SAV_GlobalLink5.Tab_General=Generale +SAV_GlobalLink5.Tab_Items=Strumenti SAV_HallOfFame.B_Cancel=Annulla SAV_HallOfFame.B_Close=Salva SAV_HallOfFame.B_CopyText=Copia txt @@ -2918,6 +2940,13 @@ SAV_ZygardeCell.DGV_dgv_ref=Ref SAV_ZygardeCell.DGV_dgv_val=Valore SAV_ZygardeCell.L_Cells=Stored: SAV_ZygardeCell.L_Collected=Collezionate: +SaveHandlerTroubleshooter.B_Browse=Sfoglia... +SaveHandlerTroubleshooter.B_Continue=Continua +SaveHandlerTroubleshooter.L_Handler=Gestore: +SaveHandlerTroubleshooter.L_Language=Lingua: +SaveHandlerTroubleshooter.L_Path=Percorso: +SaveHandlerTroubleshooter.L_SubVersion=Sottoversione: +SaveHandlerTroubleshooter.L_Type=Tipo file salvataggio: SettingsEditor.B_Reset=Reset tutto SettingsEditor.L_Blank=Versione salvataggio vuota: SkinColorBR.Dark=Dark diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index 03436465c..7bf079fff 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -30,6 +30,7 @@ SAV_FlagWork8b=イベントフラグ SAV_FolderList=フォルダリスト SAV_Gear=パーツ SAV_Geonet4=ジオネット +SAV_GlobalLink5=ポケモングローバルリンク SAV_HallOfFame=殿堂入りデータ SAV_HallOfFame1=殿堂入りデータビューア SAV_HallOfFame3=殿堂入りデータビューア @@ -90,6 +91,7 @@ SAV_Underground8b=地下大洞窟 SAV_UnityTower=ユナイテッドタワー SAV_Wondercard=ふしぎなおくりもの入出力 SAV_ZygardeCell=ジガルデ・セル / ヌシール +SaveHandlerTroubleshooter=セーブハンドラ トラブルシューター SettingsEditor=設定 SuperTrainingEditor=スパトレ TechRecordEditor=TR Relearn Editor @@ -423,6 +425,7 @@ Main.B_OpenFashion=ファッション Main.B_OpenFriendSafari=フレンドサファリ Main.B_OpenGear=パーツ Main.B_OpenGeonetEditor=ジオネット +Main.B_OpenGlobalLink=ポケモングローバルリンク Main.B_OpenHallofFame=殿堂入り Main.B_OpenHoneyTreeEditor=ミツの木 Main.B_OpenItemPouch=アイテム @@ -1327,6 +1330,25 @@ SAV_Geonet4.CHK_GlobalFlag=Whole Globe Visible SAV_Geonet4.DGV_Item_Country=Country SAV_Geonet4.DGV_Item_Point=Point SAV_Geonet4.DGV_Item_Region=Region +SAV_GlobalLink5.B_Cancel=キャンセル +SAV_GlobalLink5.B_Save=保存 +SAV_GlobalLink5.CHK_DateSet=設定 +SAV_GlobalLink5.CHK_FurnitureSynchronized=同期済み +SAV_GlobalLink5.CHK_IsFullAccess=全機能利用可 +SAV_GlobalLink5.CHK_IsRegistered=ゲームカード登録済み +SAV_GlobalLink5.CHK_IsSlotPresent=アップロードスロット使用中 +SAV_GlobalLink5.DGV_Count=個数 +SAV_GlobalLink5.DGV_Item=アイテム +SAV_GlobalLink5.L_CGearSkin=Cギアスキン: +SAV_GlobalLink5.L_DexSkin=ポケモンずかんスキン: +SAV_GlobalLink5.L_FurnitureSelected=選択中: +SAV_GlobalLink5.L_Musical=ミュージカル: +SAV_GlobalLink5.L_UploadCount=アップロード回数: +SAV_GlobalLink5.L_UploadDate=アップロード日: +SAV_GlobalLink5.L_UploadStatus=アップロード状態: +SAV_GlobalLink5.Tab_Furniture=家具 +SAV_GlobalLink5.Tab_General=基本 +SAV_GlobalLink5.Tab_Items=アイテム SAV_HallOfFame.B_Cancel=キャンセル SAV_HallOfFame.B_Close=保存 SAV_HallOfFame.B_CopyText=コピー @@ -2918,6 +2940,13 @@ SAV_ZygardeCell.DGV_dgv_ref=Ref SAV_ZygardeCell.DGV_dgv_val=Value SAV_ZygardeCell.L_Cells=キューブ内 SAV_ZygardeCell.L_Collected=回収 +SaveHandlerTroubleshooter.B_Browse=参照... +SaveHandlerTroubleshooter.B_Continue=続行 +SaveHandlerTroubleshooter.L_Handler=ハンドラ: +SaveHandlerTroubleshooter.L_Language=言語: +SaveHandlerTroubleshooter.L_Path=パス: +SaveHandlerTroubleshooter.L_SubVersion=サブバージョン: +SaveHandlerTroubleshooter.L_Type=セーブファイル種別: SettingsEditor.B_Reset=全てリセット SettingsEditor.L_Blank=Blank セーブの種類: SkinColorBR.Dark=Dark diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index f737632c5..0065d6712 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -30,6 +30,7 @@ SAV_FlagWork8b=이벤트 플래그 편집 도구 SAV_FolderList=폴더 목록 SAV_Gear=장비 편집 도구 SAV_Geonet4=지오넷 편집 도구 +SAV_GlobalLink5=포켓몬 글로벌 링크 편집 도구 SAV_HallOfFame=전당등록 편집 도구 SAV_HallOfFame1=전당등록 편집 도구 SAV_HallOfFame3=전당등록 편집 도구 @@ -90,6 +91,7 @@ SAV_Underground8b=지하통로 아이템 편집 도구 SAV_UnityTower=유나이티드타워 편집 도구 SAV_Wondercard=이상한 소포 입출력 SAV_ZygardeCell=셀/스티커 편집 도구 +SaveHandlerTroubleshooter=세이브 핸들러 문제 해결 도구 SettingsEditor=설정 SuperTrainingEditor=메달 편집 도구 TechRecordEditor=기술레코드 편집 도구 @@ -423,6 +425,7 @@ Main.B_OpenFashion=패션 Main.B_OpenFriendSafari=프렌드사파리 Main.B_OpenGear=장비 Main.B_OpenGeonetEditor=지오넷 +Main.B_OpenGlobalLink=포켓몬 글로벌 링크 Main.B_OpenHallofFame=명예의 전당 Main.B_OpenHoneyTreeEditor=꿀바른 나무 Main.B_OpenItemPouch=아이템 @@ -1327,6 +1330,25 @@ SAV_Geonet4.CHK_GlobalFlag=전 세계 표시 SAV_Geonet4.DGV_Item_Country=국가 SAV_Geonet4.DGV_Item_Point=지점 SAV_Geonet4.DGV_Item_Region=지역 +SAV_GlobalLink5.B_Cancel=취소 +SAV_GlobalLink5.B_Save=저장 +SAV_GlobalLink5.CHK_DateSet=설정 +SAV_GlobalLink5.CHK_FurnitureSynchronized=동기화됨 +SAV_GlobalLink5.CHK_IsFullAccess=전체 접근 +SAV_GlobalLink5.CHK_IsRegistered=게임 카드 등록됨 +SAV_GlobalLink5.CHK_IsSlotPresent=업로드 슬롯 사용 중 +SAV_GlobalLink5.DGV_Count=수량 +SAV_GlobalLink5.DGV_Item=아이템 +SAV_GlobalLink5.L_CGearSkin=C기어 스킨: +SAV_GlobalLink5.L_DexSkin=포켓몬도감 스킨: +SAV_GlobalLink5.L_FurnitureSelected=선택됨: +SAV_GlobalLink5.L_Musical=뮤지컬: +SAV_GlobalLink5.L_UploadCount=업로드 횟수: +SAV_GlobalLink5.L_UploadDate=업로드 날짜: +SAV_GlobalLink5.L_UploadStatus=업로드 상태: +SAV_GlobalLink5.Tab_Furniture=가구 +SAV_GlobalLink5.Tab_General=일반 +SAV_GlobalLink5.Tab_Items=아이템 SAV_HallOfFame.B_Cancel=취소 SAV_HallOfFame.B_Close=저장 SAV_HallOfFame.B_CopyText=글 복사 @@ -2918,6 +2940,13 @@ SAV_ZygardeCell.DGV_dgv_ref=참조 SAV_ZygardeCell.DGV_dgv_val=값 SAV_ZygardeCell.L_Cells=보관됨: SAV_ZygardeCell.L_Collected=회수함: +SaveHandlerTroubleshooter.B_Browse=찾아보기... +SaveHandlerTroubleshooter.B_Continue=계속 +SaveHandlerTroubleshooter.L_Handler=핸들러: +SaveHandlerTroubleshooter.L_Language=언어: +SaveHandlerTroubleshooter.L_Path=경로: +SaveHandlerTroubleshooter.L_SubVersion=하위 버전: +SaveHandlerTroubleshooter.L_Type=세이브 파일 형식: SettingsEditor.B_Reset=모두초기화 SettingsEditor.L_Blank=빈 세이브 버전: SkinColorBR.Dark=어두운 피부 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index 6de71dbc1..3c1b8bf86 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -30,6 +30,7 @@ SAV_FlagWork8b=事件标志编辑器 SAV_FolderList=文件夹列表 SAV_Gear=装扮配件编辑器 SAV_Geonet4=地理网编辑 +SAV_GlobalLink5=宝可梦全球连接编辑器 SAV_HallOfFame=名人堂 SAV_HallOfFame1=名人堂 SAV_HallOfFame3=名人堂 @@ -90,6 +91,7 @@ SAV_Underground8b=地下世界编辑 SAV_UnityTower=联合塔编辑 SAV_Wondercard=神秘礼物输入/输出 SAV_ZygardeCell=细胞/贴纸编辑 +SaveHandlerTroubleshooter=存档处理程序疑难解答 SettingsEditor=设置 SuperTrainingEditor=超级训练奖章 TechRecordEditor=招式记录器编辑 @@ -423,6 +425,7 @@ Main.B_OpenFashion=时装 Main.B_OpenFriendSafari=朋友狩猎 Main.B_OpenGear=装扮配件 Main.B_OpenGeonetEditor=地理网 +Main.B_OpenGlobalLink=宝可梦全球连接 Main.B_OpenHallofFame=名人堂 Main.B_OpenHoneyTreeEditor=甜甜蜜树 Main.B_OpenItemPouch=道具 @@ -1327,6 +1330,25 @@ SAV_Geonet4.CHK_GlobalFlag=全球可见 SAV_Geonet4.DGV_Item_Country=国家 SAV_Geonet4.DGV_Item_Point=地点 SAV_Geonet4.DGV_Item_Region=地区 +SAV_GlobalLink5.B_Cancel=取消 +SAV_GlobalLink5.B_Save=保存 +SAV_GlobalLink5.CHK_DateSet=设定 +SAV_GlobalLink5.CHK_FurnitureSynchronized=已同步 +SAV_GlobalLink5.CHK_IsFullAccess=完全访问 +SAV_GlobalLink5.CHK_IsRegistered=已注册游戏卡 +SAV_GlobalLink5.CHK_IsSlotPresent=上传槽位使用中 +SAV_GlobalLink5.DGV_Count=数量 +SAV_GlobalLink5.DGV_Item=道具 +SAV_GlobalLink5.L_CGearSkin=C装置皮肤: +SAV_GlobalLink5.L_DexSkin=图鉴皮肤: +SAV_GlobalLink5.L_FurnitureSelected=已选中: +SAV_GlobalLink5.L_Musical=音乐剧: +SAV_GlobalLink5.L_UploadCount=上传次数: +SAV_GlobalLink5.L_UploadDate=上传日期: +SAV_GlobalLink5.L_UploadStatus=上传状态: +SAV_GlobalLink5.Tab_Furniture=家具 +SAV_GlobalLink5.Tab_General=常规 +SAV_GlobalLink5.Tab_Items=道具 SAV_HallOfFame.B_Cancel=取消 SAV_HallOfFame.B_Close=保存 SAV_HallOfFame.B_CopyText=复制文本 @@ -2918,6 +2940,13 @@ SAV_ZygardeCell.DGV_dgv_ref=引用 SAV_ZygardeCell.DGV_dgv_val=数值 SAV_ZygardeCell.L_Cells=储存了: SAV_ZygardeCell.L_Collected=收集了: +SaveHandlerTroubleshooter.B_Browse=浏览... +SaveHandlerTroubleshooter.B_Continue=继续 +SaveHandlerTroubleshooter.L_Handler=处理程序: +SaveHandlerTroubleshooter.L_Language=语言: +SaveHandlerTroubleshooter.L_Path=路径: +SaveHandlerTroubleshooter.L_SubVersion=子版本: +SaveHandlerTroubleshooter.L_Type=存档文件类型: SettingsEditor.B_Reset=重置所有 SettingsEditor.L_Blank=空白存档版本: SkinColorBR.Dark=深色 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index 582bc1ddc..f4cb83a5e 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -30,6 +30,7 @@ SAV_FlagWork8b=事件標誌編輯器 SAV_FolderList=資料夾清單 SAV_Gear=裝扮配件編輯器 SAV_Geonet4=寰宇網編輯器 +SAV_GlobalLink5=寶可夢全球連結編輯器 SAV_HallOfFame=名人堂 SAV_HallOfFame1=名人堂 SAV_HallOfFame3=名人堂 @@ -90,6 +91,7 @@ SAV_Underground8b=地下世界編輯器 SAV_UnityTower=聯合塔編輯器 SAV_Wondercard=神秘禮物輸入/輸出 SAV_ZygardeCell=細胞/貼紙編輯器 +SaveHandlerTroubleshooter=存檔處理常式疑難排解 SettingsEditor=設置 SuperTrainingEditor=超級訓練獎章器 TechRecordEditor=招式記錄編輯器 @@ -423,6 +425,7 @@ Main.B_OpenFashion=時裝 Main.B_OpenFriendSafari=朋友狩獵 Main.B_OpenGear=裝扮配件 Main.B_OpenGeonetEditor=寰宇網 +Main.B_OpenGlobalLink=寶可夢全球連結 Main.B_OpenHallofFame=名人堂 Main.B_OpenHoneyTreeEditor=甜甜蜜樹 Main.B_OpenItemPouch=道具 @@ -1327,6 +1330,25 @@ SAV_Geonet4.CHK_GlobalFlag=全球可見 SAV_Geonet4.DGV_Item_Country=國家 SAV_Geonet4.DGV_Item_Point=地點 SAV_Geonet4.DGV_Item_Region=地區 +SAV_GlobalLink5.B_Cancel=取消 +SAV_GlobalLink5.B_Save=儲存 +SAV_GlobalLink5.CHK_DateSet=設定 +SAV_GlobalLink5.CHK_FurnitureSynchronized=已同步 +SAV_GlobalLink5.CHK_IsFullAccess=完全存取 +SAV_GlobalLink5.CHK_IsRegistered=已註冊遊戲卡 +SAV_GlobalLink5.CHK_IsSlotPresent=上傳槽位使用中 +SAV_GlobalLink5.DGV_Count=數量 +SAV_GlobalLink5.DGV_Item=道具 +SAV_GlobalLink5.L_CGearSkin=C裝置皮膚: +SAV_GlobalLink5.L_DexSkin=圖鑑皮膚: +SAV_GlobalLink5.L_FurnitureSelected=已選取: +SAV_GlobalLink5.L_Musical=音樂劇: +SAV_GlobalLink5.L_UploadCount=上傳次數: +SAV_GlobalLink5.L_UploadDate=上傳日期: +SAV_GlobalLink5.L_UploadStatus=上傳狀態: +SAV_GlobalLink5.Tab_Furniture=家具 +SAV_GlobalLink5.Tab_General=常規 +SAV_GlobalLink5.Tab_Items=道具 SAV_HallOfFame.B_Cancel=取消 SAV_HallOfFame.B_Close=儲存 SAV_HallOfFame.B_CopyText=複製文本 @@ -2918,6 +2940,13 @@ SAV_ZygardeCell.DGV_dgv_ref=引用 SAV_ZygardeCell.DGV_dgv_val=數值 SAV_ZygardeCell.L_Cells=儲存了: SAV_ZygardeCell.L_Collected=收集了: +SaveHandlerTroubleshooter.B_Browse=瀏覽... +SaveHandlerTroubleshooter.B_Continue=繼續 +SaveHandlerTroubleshooter.L_Handler=處理常式: +SaveHandlerTroubleshooter.L_Language=語言: +SaveHandlerTroubleshooter.L_Path=路徑: +SaveHandlerTroubleshooter.L_SubVersion=子版本: +SaveHandlerTroubleshooter.L_Type=存檔檔案類型: SettingsEditor.B_Reset=重置所有 SettingsEditor.L_Blank=空白存檔版本: SkinColorBR.Dark=深色 diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_GlobalLink5.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_GlobalLink5.Designer.cs new file mode 100644 index 000000000..911e8b491 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_GlobalLink5.Designer.cs @@ -0,0 +1,607 @@ +namespace PKHeX.WinForms +{ + partial class SAV_GlobalLink5 + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + components.Dispose(); + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + ButtonPanel = new System.Windows.Forms.FlowLayoutPanel(); + B_Save = new System.Windows.Forms.Button(); + B_Cancel = new System.Windows.Forms.Button(); + TC_Main = new System.Windows.Forms.TabControl(); + Tab_General = new System.Windows.Forms.TabPage(); + TLP_Main = new System.Windows.Forms.TableLayoutPanel(); + L_UploadCount = new System.Windows.Forms.Label(); + L_UploadDate = new System.Windows.Forms.Label(); + L_UploadStatus = new System.Windows.Forms.Label(); + NUD_UploadCount = new System.Windows.Forms.NumericUpDown(); + CHK_IsSlotPresent = new System.Windows.Forms.CheckBox(); + L_Musical = new System.Windows.Forms.Label(); + L_CGearSkin = new System.Windows.Forms.Label(); + L_DexSkin = new System.Windows.Forms.Label(); + NUD_DexSkin = new System.Windows.Forms.NumericUpDown(); + NUD_CGearSkin = new System.Windows.Forms.NumericUpDown(); + NUD_Musical = new System.Windows.Forms.NumericUpDown(); + CHK_IsRegistered = new System.Windows.Forms.CheckBox(); + CHK_IsFullAccess = new System.Windows.Forms.CheckBox(); + NUD_UploadStatus = new System.Windows.Forms.NumericUpDown(); + FLP_Date = new System.Windows.Forms.FlowLayoutPanel(); + CHK_DateSet = new System.Windows.Forms.CheckBox(); + CAL_UploadDate = new System.Windows.Forms.DateTimePicker(); + Tab_Items = new System.Windows.Forms.TabPage(); + DGV_Items = new PKHeX.WinForms.Controls.DoubleBufferedDataGridView(); + Tab_Furniture = new System.Windows.Forms.TabPage(); + TLP_Furniture = new System.Windows.Forms.TableLayoutPanel(); + TB_Furniture5 = new System.Windows.Forms.TextBox(); + TB_Furniture4 = new System.Windows.Forms.TextBox(); + TB_Furniture3 = new System.Windows.Forms.TextBox(); + TB_Furniture2 = new System.Windows.Forms.TextBox(); + NUD_Furniture1 = new System.Windows.Forms.NumericUpDown(); + NUD_Furniture2 = new System.Windows.Forms.NumericUpDown(); + NUD_Furniture3 = new System.Windows.Forms.NumericUpDown(); + NUD_Furniture4 = new System.Windows.Forms.NumericUpDown(); + NUD_Furniture5 = new System.Windows.Forms.NumericUpDown(); + TB_Furniture1 = new System.Windows.Forms.TextBox(); + CHK_FurnitureSynchronized = new System.Windows.Forms.CheckBox(); + NUD_FurnitureSelected = new System.Windows.Forms.NumericUpDown(); + L_FurnitureSelected = new System.Windows.Forms.Label(); + ButtonPanel.SuspendLayout(); + TC_Main.SuspendLayout(); + Tab_General.SuspendLayout(); + TLP_Main.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_UploadCount).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_DexSkin).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_CGearSkin).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Musical).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UploadStatus).BeginInit(); + FLP_Date.SuspendLayout(); + Tab_Items.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)DGV_Items).BeginInit(); + Tab_Furniture.SuspendLayout(); + TLP_Furniture.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Furniture1).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Furniture2).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Furniture3).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Furniture4).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Furniture5).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NUD_FurnitureSelected).BeginInit(); + SuspendLayout(); + // + // ButtonPanel + // + ButtonPanel.AutoSize = true; + ButtonPanel.Controls.Add(B_Save); + ButtonPanel.Controls.Add(B_Cancel); + ButtonPanel.Dock = System.Windows.Forms.DockStyle.Bottom; + ButtonPanel.Location = new System.Drawing.Point(0, 332); + ButtonPanel.Name = "ButtonPanel"; + ButtonPanel.Padding = new System.Windows.Forms.Padding(8); + ButtonPanel.RightToLeft = System.Windows.Forms.RightToLeft.Yes; + ButtonPanel.Size = new System.Drawing.Size(424, 49); + ButtonPanel.TabIndex = 1; + ButtonPanel.WrapContents = false; + // + // B_Save + // + B_Save.AutoSize = true; + B_Save.Location = new System.Drawing.Point(353, 11); + B_Save.Name = "B_Save"; + B_Save.Size = new System.Drawing.Size(52, 27); + B_Save.TabIndex = 0; + B_Save.Text = "Save"; + B_Save.UseVisualStyleBackColor = true; + B_Save.Click += B_Save_Click; + // + // B_Cancel + // + B_Cancel.AutoSize = true; + B_Cancel.Location = new System.Drawing.Point(284, 11); + B_Cancel.Name = "B_Cancel"; + B_Cancel.Size = new System.Drawing.Size(63, 27); + B_Cancel.TabIndex = 1; + B_Cancel.Text = "Cancel"; + B_Cancel.UseVisualStyleBackColor = true; + B_Cancel.Click += B_Cancel_Click; + // + // TC_Main + // + TC_Main.Controls.Add(Tab_General); + TC_Main.Controls.Add(Tab_Items); + TC_Main.Controls.Add(Tab_Furniture); + TC_Main.Dock = System.Windows.Forms.DockStyle.Fill; + TC_Main.Location = new System.Drawing.Point(0, 0); + TC_Main.Name = "TC_Main"; + TC_Main.SelectedIndex = 0; + TC_Main.Size = new System.Drawing.Size(424, 332); + TC_Main.TabIndex = 2; + // + // Tab_General + // + Tab_General.Controls.Add(TLP_Main); + Tab_General.Location = new System.Drawing.Point(4, 26); + Tab_General.Margin = new System.Windows.Forms.Padding(0); + Tab_General.Name = "Tab_General"; + Tab_General.Padding = new System.Windows.Forms.Padding(8); + Tab_General.Size = new System.Drawing.Size(416, 302); + Tab_General.TabIndex = 0; + Tab_General.Text = "General"; + Tab_General.UseVisualStyleBackColor = true; + // + // TLP_Main + // + TLP_Main.ColumnCount = 2; + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + TLP_Main.Controls.Add(L_UploadCount, 0, 1); + TLP_Main.Controls.Add(L_UploadDate, 0, 0); + TLP_Main.Controls.Add(L_UploadStatus, 0, 2); + TLP_Main.Controls.Add(NUD_UploadCount, 1, 1); + TLP_Main.Controls.Add(CHK_IsSlotPresent, 1, 3); + TLP_Main.Controls.Add(L_Musical, 0, 6); + TLP_Main.Controls.Add(L_CGearSkin, 0, 7); + TLP_Main.Controls.Add(L_DexSkin, 0, 8); + TLP_Main.Controls.Add(NUD_DexSkin, 1, 8); + TLP_Main.Controls.Add(NUD_CGearSkin, 1, 7); + TLP_Main.Controls.Add(NUD_Musical, 1, 6); + TLP_Main.Controls.Add(CHK_IsRegistered, 1, 4); + TLP_Main.Controls.Add(CHK_IsFullAccess, 1, 5); + TLP_Main.Controls.Add(NUD_UploadStatus, 1, 2); + TLP_Main.Controls.Add(FLP_Date, 1, 0); + TLP_Main.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Main.Location = new System.Drawing.Point(8, 8); + TLP_Main.Margin = new System.Windows.Forms.Padding(0); + TLP_Main.Name = "TLP_Main"; + TLP_Main.RowCount = 10; + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_Main.Size = new System.Drawing.Size(400, 286); + TLP_Main.TabIndex = 3; + // + // L_UploadCount + // + L_UploadCount.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_UploadCount.AutoSize = true; + L_UploadCount.Location = new System.Drawing.Point(4, 38); + L_UploadCount.Name = "L_UploadCount"; + L_UploadCount.Size = new System.Drawing.Size(92, 17); + L_UploadCount.TabIndex = 3; + L_UploadCount.Text = "Upload Count:"; + // + // L_UploadDate + // + L_UploadDate.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_UploadDate.AutoSize = true; + L_UploadDate.Location = new System.Drawing.Point(11, 7); + L_UploadDate.Name = "L_UploadDate"; + L_UploadDate.Size = new System.Drawing.Size(85, 17); + L_UploadDate.TabIndex = 1; + L_UploadDate.Text = "Upload Date:"; + // + // L_UploadStatus + // + L_UploadStatus.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_UploadStatus.AutoSize = true; + L_UploadStatus.Location = new System.Drawing.Point(3, 69); + L_UploadStatus.Name = "L_UploadStatus"; + L_UploadStatus.Size = new System.Drawing.Size(93, 17); + L_UploadStatus.TabIndex = 5; + L_UploadStatus.Text = "Upload Status:"; + // + // NUD_UploadCount + // + NUD_UploadCount.Anchor = System.Windows.Forms.AnchorStyles.Left; + NUD_UploadCount.Location = new System.Drawing.Point(102, 34); + NUD_UploadCount.Maximum = new decimal(new int[] { int.MaxValue, 0, 0, 0 }); + NUD_UploadCount.Minimum = new decimal(new int[] { int.MinValue, 0, 0, int.MinValue }); + NUD_UploadCount.Name = "NUD_UploadCount"; + NUD_UploadCount.Size = new System.Drawing.Size(100, 25); + NUD_UploadCount.TabIndex = 4; + // + // CHK_IsSlotPresent + // + CHK_IsSlotPresent.Anchor = System.Windows.Forms.AnchorStyles.Left; + CHK_IsSlotPresent.AutoSize = true; + CHK_IsSlotPresent.Location = new System.Drawing.Point(102, 96); + CHK_IsSlotPresent.Name = "CHK_IsSlotPresent"; + CHK_IsSlotPresent.Size = new System.Drawing.Size(155, 21); + CHK_IsSlotPresent.TabIndex = 7; + CHK_IsSlotPresent.Text = "Upload Slot Tucked In"; + CHK_IsSlotPresent.UseVisualStyleBackColor = true; + // + // L_Musical + // + L_Musical.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Musical.AutoSize = true; + L_Musical.Location = new System.Drawing.Point(41, 181); + L_Musical.Name = "L_Musical"; + L_Musical.Size = new System.Drawing.Size(55, 17); + L_Musical.TabIndex = 10; + L_Musical.Text = "Musical:"; + // + // L_CGearSkin + // + L_CGearSkin.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_CGearSkin.AutoSize = true; + L_CGearSkin.Location = new System.Drawing.Point(22, 212); + L_CGearSkin.Name = "L_CGearSkin"; + L_CGearSkin.Size = new System.Drawing.Size(74, 17); + L_CGearSkin.TabIndex = 12; + L_CGearSkin.Text = "CGear Skin:"; + // + // L_DexSkin + // + L_DexSkin.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_DexSkin.AutoSize = true; + L_DexSkin.Location = new System.Drawing.Point(9, 243); + L_DexSkin.Name = "L_DexSkin"; + L_DexSkin.Size = new System.Drawing.Size(87, 17); + L_DexSkin.TabIndex = 14; + L_DexSkin.Text = "Pokédex Skin:"; + // + // NUD_DexSkin + // + NUD_DexSkin.Anchor = System.Windows.Forms.AnchorStyles.Left; + NUD_DexSkin.Location = new System.Drawing.Point(102, 239); + NUD_DexSkin.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_DexSkin.Name = "NUD_DexSkin"; + NUD_DexSkin.Size = new System.Drawing.Size(48, 25); + NUD_DexSkin.TabIndex = 15; + // + // NUD_CGearSkin + // + NUD_CGearSkin.Anchor = System.Windows.Forms.AnchorStyles.Left; + NUD_CGearSkin.Location = new System.Drawing.Point(102, 208); + NUD_CGearSkin.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_CGearSkin.Name = "NUD_CGearSkin"; + NUD_CGearSkin.Size = new System.Drawing.Size(48, 25); + NUD_CGearSkin.TabIndex = 13; + // + // NUD_Musical + // + NUD_Musical.Anchor = System.Windows.Forms.AnchorStyles.Left; + NUD_Musical.Location = new System.Drawing.Point(102, 177); + NUD_Musical.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_Musical.Name = "NUD_Musical"; + NUD_Musical.Size = new System.Drawing.Size(48, 25); + NUD_Musical.TabIndex = 11; + // + // CHK_IsRegistered + // + CHK_IsRegistered.Anchor = System.Windows.Forms.AnchorStyles.Left; + CHK_IsRegistered.AutoSize = true; + CHK_IsRegistered.Location = new System.Drawing.Point(102, 123); + CHK_IsRegistered.Name = "CHK_IsRegistered"; + CHK_IsRegistered.Size = new System.Drawing.Size(160, 21); + CHK_IsRegistered.TabIndex = 8; + CHK_IsRegistered.Text = "Game Card Registered"; + CHK_IsRegistered.UseVisualStyleBackColor = true; + // + // CHK_IsFullAccess + // + CHK_IsFullAccess.Anchor = System.Windows.Forms.AnchorStyles.Left; + CHK_IsFullAccess.AutoSize = true; + CHK_IsFullAccess.Location = new System.Drawing.Point(102, 150); + CHK_IsFullAccess.Name = "CHK_IsFullAccess"; + CHK_IsFullAccess.Size = new System.Drawing.Size(89, 21); + CHK_IsFullAccess.TabIndex = 9; + CHK_IsFullAccess.Text = "Full Access"; + CHK_IsFullAccess.UseVisualStyleBackColor = true; + // + // NUD_UploadStatus + // + NUD_UploadStatus.Anchor = System.Windows.Forms.AnchorStyles.Left; + NUD_UploadStatus.Location = new System.Drawing.Point(102, 65); + NUD_UploadStatus.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_UploadStatus.Name = "NUD_UploadStatus"; + NUD_UploadStatus.Size = new System.Drawing.Size(48, 25); + NUD_UploadStatus.TabIndex = 6; + // + // FLP_Date + // + FLP_Date.AutoSize = true; + FLP_Date.Controls.Add(CHK_DateSet); + FLP_Date.Controls.Add(CAL_UploadDate); + FLP_Date.Dock = System.Windows.Forms.DockStyle.Fill; + FLP_Date.Location = new System.Drawing.Point(99, 0); + FLP_Date.Margin = new System.Windows.Forms.Padding(0); + FLP_Date.Name = "FLP_Date"; + FLP_Date.Size = new System.Drawing.Size(301, 31); + FLP_Date.TabIndex = 16; + // + // CHK_DateSet + // + CHK_DateSet.Anchor = System.Windows.Forms.AnchorStyles.Left; + CHK_DateSet.AutoSize = true; + CHK_DateSet.Location = new System.Drawing.Point(0, 5); + CHK_DateSet.Margin = new System.Windows.Forms.Padding(0); + CHK_DateSet.Name = "CHK_DateSet"; + CHK_DateSet.Size = new System.Drawing.Size(45, 21); + CHK_DateSet.TabIndex = 4; + CHK_DateSet.Text = "Set"; + CHK_DateSet.UseVisualStyleBackColor = true; + CHK_DateSet.CheckedChanged += CHK_DateSet_CheckedChanged; + // + // CAL_UploadDate + // + CAL_UploadDate.Anchor = System.Windows.Forms.AnchorStyles.Left; + CAL_UploadDate.Location = new System.Drawing.Point(48, 3); + CAL_UploadDate.MaxDate = new System.DateTime(2099, 12, 31, 0, 0, 0, 0); + CAL_UploadDate.MinDate = new System.DateTime(2000, 1, 1, 0, 0, 0, 0); + CAL_UploadDate.Name = "CAL_UploadDate"; + CAL_UploadDate.Size = new System.Drawing.Size(228, 25); + CAL_UploadDate.TabIndex = 5; + // + // Tab_Items + // + Tab_Items.Controls.Add(DGV_Items); + Tab_Items.Location = new System.Drawing.Point(4, 26); + Tab_Items.Name = "Tab_Items"; + Tab_Items.Size = new System.Drawing.Size(396, 302); + Tab_Items.TabIndex = 1; + Tab_Items.Text = "Items"; + Tab_Items.UseVisualStyleBackColor = true; + // + // DGV_Items + // + dataGridViewCellStyle3.BackColor = System.Drawing.SystemColors.ControlLight; + DGV_Items.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle3; + DGV_Items.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + DGV_Items.Dock = System.Windows.Forms.DockStyle.Fill; + DGV_Items.Location = new System.Drawing.Point(0, 0); + DGV_Items.Name = "DGV_Items"; + DGV_Items.Size = new System.Drawing.Size(396, 302); + DGV_Items.TabIndex = 0; + // + // Tab_Furniture + // + Tab_Furniture.Controls.Add(TLP_Furniture); + Tab_Furniture.Location = new System.Drawing.Point(4, 26); + Tab_Furniture.Name = "Tab_Furniture"; + Tab_Furniture.Padding = new System.Windows.Forms.Padding(3); + Tab_Furniture.Size = new System.Drawing.Size(416, 302); + Tab_Furniture.TabIndex = 2; + Tab_Furniture.Text = "Furniture"; + Tab_Furniture.UseVisualStyleBackColor = true; + // + // TLP_Furniture + // + TLP_Furniture.ColumnCount = 2; + TLP_Furniture.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_Furniture.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_Furniture.Controls.Add(TB_Furniture5, 1, 4); + TLP_Furniture.Controls.Add(TB_Furniture4, 1, 3); + TLP_Furniture.Controls.Add(TB_Furniture3, 1, 2); + TLP_Furniture.Controls.Add(TB_Furniture2, 1, 1); + TLP_Furniture.Controls.Add(NUD_Furniture1, 0, 0); + TLP_Furniture.Controls.Add(NUD_Furniture2, 0, 1); + TLP_Furniture.Controls.Add(NUD_Furniture3, 0, 2); + TLP_Furniture.Controls.Add(NUD_Furniture4, 0, 3); + TLP_Furniture.Controls.Add(NUD_Furniture5, 0, 4); + TLP_Furniture.Controls.Add(TB_Furniture1, 1, 0); + TLP_Furniture.Controls.Add(CHK_FurnitureSynchronized, 1, 5); + TLP_Furniture.Controls.Add(NUD_FurnitureSelected, 1, 6); + TLP_Furniture.Controls.Add(L_FurnitureSelected, 0, 6); + TLP_Furniture.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_Furniture.Location = new System.Drawing.Point(3, 3); + TLP_Furniture.Margin = new System.Windows.Forms.Padding(0); + TLP_Furniture.Name = "TLP_Furniture"; + TLP_Furniture.Padding = new System.Windows.Forms.Padding(8); + TLP_Furniture.RowCount = 8; + TLP_Furniture.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Furniture.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Furniture.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Furniture.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Furniture.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Furniture.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Furniture.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Furniture.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_Furniture.Size = new System.Drawing.Size(410, 296); + TLP_Furniture.TabIndex = 0; + // + // TB_Furniture5 + // + TB_Furniture5.Location = new System.Drawing.Point(81, 135); + TB_Furniture5.Name = "TB_Furniture5"; + TB_Furniture5.Size = new System.Drawing.Size(160, 25); + TB_Furniture5.TabIndex = 10; + // + // TB_Furniture4 + // + TB_Furniture4.Location = new System.Drawing.Point(81, 104); + TB_Furniture4.Name = "TB_Furniture4"; + TB_Furniture4.Size = new System.Drawing.Size(160, 25); + TB_Furniture4.TabIndex = 8; + // + // TB_Furniture3 + // + TB_Furniture3.Location = new System.Drawing.Point(81, 73); + TB_Furniture3.Name = "TB_Furniture3"; + TB_Furniture3.Size = new System.Drawing.Size(160, 25); + TB_Furniture3.TabIndex = 6; + // + // TB_Furniture2 + // + TB_Furniture2.Location = new System.Drawing.Point(81, 42); + TB_Furniture2.Name = "TB_Furniture2"; + TB_Furniture2.Size = new System.Drawing.Size(160, 25); + TB_Furniture2.TabIndex = 4; + // + // NUD_Furniture1 + // + NUD_Furniture1.Location = new System.Drawing.Point(11, 11); + NUD_Furniture1.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_Furniture1.Name = "NUD_Furniture1"; + NUD_Furniture1.Size = new System.Drawing.Size(64, 25); + NUD_Furniture1.TabIndex = 1; + // + // NUD_Furniture2 + // + NUD_Furniture2.Location = new System.Drawing.Point(11, 42); + NUD_Furniture2.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_Furniture2.Name = "NUD_Furniture2"; + NUD_Furniture2.Size = new System.Drawing.Size(64, 25); + NUD_Furniture2.TabIndex = 3; + // + // NUD_Furniture3 + // + NUD_Furniture3.Location = new System.Drawing.Point(11, 73); + NUD_Furniture3.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_Furniture3.Name = "NUD_Furniture3"; + NUD_Furniture3.Size = new System.Drawing.Size(64, 25); + NUD_Furniture3.TabIndex = 5; + // + // NUD_Furniture4 + // + NUD_Furniture4.Location = new System.Drawing.Point(11, 104); + NUD_Furniture4.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_Furniture4.Name = "NUD_Furniture4"; + NUD_Furniture4.Size = new System.Drawing.Size(64, 25); + NUD_Furniture4.TabIndex = 7; + // + // NUD_Furniture5 + // + NUD_Furniture5.Location = new System.Drawing.Point(11, 135); + NUD_Furniture5.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); + NUD_Furniture5.Name = "NUD_Furniture5"; + NUD_Furniture5.Size = new System.Drawing.Size(64, 25); + NUD_Furniture5.TabIndex = 9; + // + // TB_Furniture1 + // + TB_Furniture1.Location = new System.Drawing.Point(81, 11); + TB_Furniture1.Name = "TB_Furniture1"; + TB_Furniture1.Size = new System.Drawing.Size(160, 25); + TB_Furniture1.TabIndex = 2; + // + // CHK_FurnitureSynchronized + // + CHK_FurnitureSynchronized.AutoSize = true; + CHK_FurnitureSynchronized.Location = new System.Drawing.Point(81, 166); + CHK_FurnitureSynchronized.Name = "CHK_FurnitureSynchronized"; + CHK_FurnitureSynchronized.Size = new System.Drawing.Size(104, 21); + CHK_FurnitureSynchronized.TabIndex = 17; + CHK_FurnitureSynchronized.Text = "Synchronized"; + CHK_FurnitureSynchronized.UseVisualStyleBackColor = true; + // + // NUD_FurnitureSelected + // + NUD_FurnitureSelected.Location = new System.Drawing.Point(81, 193); + NUD_FurnitureSelected.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + NUD_FurnitureSelected.Name = "NUD_FurnitureSelected"; + NUD_FurnitureSelected.Size = new System.Drawing.Size(48, 25); + NUD_FurnitureSelected.TabIndex = 19; + // + // L_FurnitureSelected + // + L_FurnitureSelected.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_FurnitureSelected.AutoSize = true; + L_FurnitureSelected.Location = new System.Drawing.Point(15, 197); + L_FurnitureSelected.Name = "L_FurnitureSelected"; + L_FurnitureSelected.Size = new System.Drawing.Size(60, 17); + L_FurnitureSelected.TabIndex = 20; + L_FurnitureSelected.Text = "Selected:"; + // + // SAV_GlobalLink5 + // + AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + ClientSize = new System.Drawing.Size(424, 381); + Controls.Add(TC_Main); + Controls.Add(ButtonPanel); + Icon = Properties.Resources.Icon; + MaximizeBox = false; + MinimumSize = new System.Drawing.Size(440, 420); + Name = "SAV_GlobalLink5"; + StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + Text = "Global Link"; + ButtonPanel.ResumeLayout(false); + ButtonPanel.PerformLayout(); + TC_Main.ResumeLayout(false); + Tab_General.ResumeLayout(false); + TLP_Main.ResumeLayout(false); + TLP_Main.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_UploadCount).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_DexSkin).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_CGearSkin).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Musical).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_UploadStatus).EndInit(); + FLP_Date.ResumeLayout(false); + FLP_Date.PerformLayout(); + Tab_Items.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)DGV_Items).EndInit(); + Tab_Furniture.ResumeLayout(false); + TLP_Furniture.ResumeLayout(false); + TLP_Furniture.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)NUD_Furniture1).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Furniture2).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Furniture3).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Furniture4).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_Furniture5).EndInit(); + ((System.ComponentModel.ISupportInitialize)NUD_FurnitureSelected).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + private System.Windows.Forms.FlowLayoutPanel ButtonPanel; + private System.Windows.Forms.Button B_Save; + private System.Windows.Forms.Button B_Cancel; + private System.Windows.Forms.TabControl TC_Main; + private System.Windows.Forms.TabPage Tab_General; + private System.Windows.Forms.TableLayoutPanel TLP_Main; + private System.Windows.Forms.Label L_UploadCount; + private System.Windows.Forms.Label L_UploadDate; + private System.Windows.Forms.Label L_UploadStatus; + private System.Windows.Forms.TabPage Tab_Items; + private System.Windows.Forms.NumericUpDown NUD_UploadCount; + private System.Windows.Forms.CheckBox CHK_IsSlotPresent; + private System.Windows.Forms.TabPage Tab_Furniture; + private System.Windows.Forms.Label L_Musical; + private System.Windows.Forms.Label L_CGearSkin; + private System.Windows.Forms.Label L_DexSkin; + private System.Windows.Forms.NumericUpDown NUD_DexSkin; + private System.Windows.Forms.NumericUpDown NUD_CGearSkin; + private System.Windows.Forms.NumericUpDown NUD_Musical; + private System.Windows.Forms.CheckBox CHK_IsRegistered; + private System.Windows.Forms.CheckBox CHK_IsFullAccess; + private System.Windows.Forms.NumericUpDown NUD_UploadStatus; + private Controls.DoubleBufferedDataGridView DGV_Items; + private System.Windows.Forms.TableLayoutPanel TLP_Furniture; + private System.Windows.Forms.NumericUpDown NUD_Furniture1; + private System.Windows.Forms.NumericUpDown NUD_Furniture2; + private System.Windows.Forms.NumericUpDown NUD_Furniture3; + private System.Windows.Forms.NumericUpDown NUD_Furniture4; + private System.Windows.Forms.NumericUpDown NUD_Furniture5; + private System.Windows.Forms.TextBox TB_Furniture1; + private System.Windows.Forms.TextBox TB_Furniture5; + private System.Windows.Forms.TextBox TB_Furniture4; + private System.Windows.Forms.TextBox TB_Furniture3; + private System.Windows.Forms.TextBox TB_Furniture2; + private System.Windows.Forms.CheckBox CHK_FurnitureSynchronized; + private System.Windows.Forms.NumericUpDown NUD_FurnitureSelected; + private System.Windows.Forms.Label L_FurnitureSelected; + private System.Windows.Forms.FlowLayoutPanel FLP_Date; + private System.Windows.Forms.CheckBox CHK_DateSet; + private System.Windows.Forms.DateTimePicker CAL_UploadDate; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_GlobalLink5.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_GlobalLink5.cs new file mode 100644 index 000000000..23c74dca2 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_GlobalLink5.cs @@ -0,0 +1,239 @@ +using System; +using System.Windows.Forms; +using PKHeX.Core; +using PKHeX.Drawing.PokeSprite; + +namespace PKHeX.WinForms; + +public sealed partial class SAV_GlobalLink5 : Form +{ + private const int ItemSpriteColumnIndex = 0; + private const int ItemNameColumnIndex = 1; + private const int ItemQuantityColumnIndex = 2; + + private readonly SAV5 Origin; + private readonly SAV5 SAV; + private readonly GlobalLink5 Block; + + public SAV_GlobalLink5(SAV5 sav) + { + InitializeComponent(); + InitializeItemsTab(); + WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); + + Origin = sav; + SAV = (SAV5)sav.Clone(); + Block = SAV.GlobalLink; + + LoadData(); + } + + private void B_Save_Click(object sender, EventArgs e) + { + if (!ValidateChildren()) + return; + + SaveData(); + Origin.CopyChangesFrom(SAV); + Close(); + } + + private void B_Cancel_Click(object sender, EventArgs e) => Close(); + + private void LoadData() + { + var date = Block.UploadDate; + if (date.IsValid) + { + CAL_UploadDate.Value = date.ToDateOnly().ToDateTime(TimeOnly.MinValue); + CAL_UploadDate.Visible = CHK_DateSet.Checked = true; + } + else + { + CAL_UploadDate.Value = DateTime.Today; + CAL_UploadDate.Visible = CHK_DateSet.Checked = false; + } + + NUD_UploadCount.Value = Block.UploadCount; + NUD_UploadStatus.Value = Block.UploadStatus; + CHK_IsSlotPresent.Checked = Block.IsSlotPresent; + CHK_IsRegistered.Checked = Block.IsRegistered; + CHK_IsFullAccess.Checked = Block.IsAccountFullAccess; + NUD_Musical.Value = Block.Musical; + NUD_CGearSkin.Value = Block.CGearSkin; + NUD_DexSkin.Value = Block.DexSkin; + + NUD_FurnitureSelected.Value = Block.SelectedFurnitureIndex; + CHK_FurnitureSynchronized.Checked = Block.IsFurnitureSynchronized; + + for (int i = 0; i < GlobalLink5.CountItems; i++) + { + var itemID = Block.GetItem(i); + var quantity = Block.GetItemQuantity(i); + var row = DGV_Items.Rows[i]; + row.Cells[ItemNameColumnIndex].Value = (int)itemID; + row.Cells[ItemQuantityColumnIndex].Value = quantity; + } + + for (int i = 0; i < GlobalLink5.CountFurniture; i++) + { + var furniture = Block.GetFurniture(i); + var index = i + 1; + GetFurnitureValue(index).Value = furniture.Value; + GetFurnitureName(index).Text = furniture.Name; + } + } + + private void SaveData() + { + var value = CAL_UploadDate.Value; + var date = Block.UploadDate; + if (CHK_DateSet.Checked) + date.FromDateOnly(new DateOnly(value.Year, value.Month, value.Day)); + else + date.SetEmpty(); + + Block.UploadCount = (int)NUD_UploadCount.Value; + Block.UploadStatus = (byte)NUD_UploadStatus.Value; + Block.IsSlotPresent = CHK_IsSlotPresent.Checked; + Block.IsRegistered = CHK_IsRegistered.Checked; + Block.IsAccountFullAccess = CHK_IsFullAccess.Checked; + Block.Musical = (byte)NUD_Musical.Value; + Block.CGearSkin = (byte)NUD_CGearSkin.Value; + Block.DexSkin = (byte)NUD_DexSkin.Value; + + Block.SelectedFurnitureIndex = (byte)NUD_FurnitureSelected.Value; + Block.IsFurnitureSynchronized = CHK_FurnitureSynchronized.Checked; + + for (int i = 0; i < GlobalLink5.CountItems; i++) + { + var row = DGV_Items.Rows[i]; + ushort.TryParse(row.Cells[ItemNameColumnIndex].Value?.ToString(), out var itemID); + Block.SetItem(i, itemID); + byte.TryParse(row.Cells[ItemQuantityColumnIndex].Value?.ToString(), out var quantity); + Block.SetItemQuantity(i, quantity); + } + + for (int i = 0; i < GlobalLink5.CountFurniture; i++) + { + var furniture = Block.GetFurniture(i); + var index = i + 1; + furniture.Value = (ushort)GetFurnitureValue(index).Value; + furniture.Name = GetFurnitureName(index).Text; + } + } + + private void InitializeItemsTab() + { + DGV_Items.AllowUserToAddRows = false; + DGV_Items.AllowUserToDeleteRows = false; + DGV_Items.AllowUserToResizeRows = false; + DGV_Items.AutoGenerateColumns = false; + DGV_Items.EditMode = DataGridViewEditMode.EditOnEnter; + DGV_Items.MultiSelect = false; + DGV_Items.RowHeadersVisible = false; + DGV_Items.SelectionMode = DataGridViewSelectionMode.CellSelect; + DGV_Items.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + + var spriteColumn = new DataGridViewImageColumn + { + Name = "Sprite", + HeaderText = string.Empty, + AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells, + ReadOnly = true, + ImageLayout = DataGridViewImageCellLayout.Zoom, + }; + + var itemColumn = new DataGridViewComboBoxColumn + { + Name = "Item", + HeaderText = "Item", + AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill, + FlatStyle = FlatStyle.Flat, + DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing, + }; + + var items = GameInfo.FilteredSources.Items; + itemColumn.InitializeBinding(); + itemColumn.DataSource = new BindingSource(items, string.Empty); + + var quantityColumn = new DataGridViewTextBoxColumn + { + Name = "Count", + HeaderText = "Count", + AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells, + ValueType = typeof(byte), + MaxInputLength = 3, + DefaultCellStyle = { Alignment = DataGridViewContentAlignment.MiddleCenter }, + }; + + DGV_Items.Columns.Add(spriteColumn); + DGV_Items.Columns.Add(itemColumn); + DGV_Items.Columns.Add(quantityColumn); + DGV_Items.RowCount = GlobalLink5.CountItems; + + DGV_Items.CurrentCellDirtyStateChanged += DGV_Items_CurrentCellDirtyStateChanged; + DGV_Items.CellValueChanged += DGV_Items_CellValueChanged; + DGV_Items.DataError += DGV_Items_DataError; + DGV_Items.EditingControlShowing += DGV_Items_EditingControlShowing; + } + + private NumericUpDown GetFurnitureValue(int index) => index switch + { + 1 => NUD_Furniture1, + 2 => NUD_Furniture2, + 3 => NUD_Furniture3, + 4 => NUD_Furniture4, + 5 => NUD_Furniture5, + _ => throw new ArgumentOutOfRangeException(nameof(index)), + }; + + private TextBox GetFurnitureName(int index) => index switch + { + 1 => TB_Furniture1, + 2 => TB_Furniture2, + 3 => TB_Furniture3, + 4 => TB_Furniture4, + 5 => TB_Furniture5, + _ => throw new ArgumentOutOfRangeException(nameof(index)), + }; + + private void DGV_Items_CurrentCellDirtyStateChanged(object? sender, EventArgs e) + { + if (DGV_Items.IsCurrentCellDirty) + DGV_Items.CommitEdit(DataGridViewDataErrorContexts.Commit); + } + + private void DGV_Items_CellValueChanged(object? sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex < 0 || e.ColumnIndex != ItemNameColumnIndex) + return; + + var row = DGV_Items.Rows[e.RowIndex]; + var value = row.Cells[ItemNameColumnIndex].Value; + if (!ushort.TryParse(value?.ToString(), out var itemID)) + return; + + row.Cells[ItemSpriteColumnIndex].Value = SpriteUtil.GetItemSprite(itemID) ?? new System.Drawing.Bitmap(1, 1); + } + + private static void DGV_Items_DataError(object? sender, DataGridViewDataErrorEventArgs e) + { + e.Cancel = false; + e.ThrowException = false; + } + + private void DGV_Items_EditingControlShowing(object? sender, DataGridViewEditingControlShowingEventArgs e) + { + if (e.Control is ComboBox combo && DGV_Items.CurrentCell?.OwningColumn is DataGridViewComboBoxColumn) + { + DGV_Items.BeginInvoke((MethodInvoker)(() => combo.DroppedDown = true)); + return; + } + + if (e.Control is TextBox tb && DGV_Items.CurrentCell?.ColumnIndex == ItemQuantityColumnIndex) + tb.SelectAll(); + } + + private void CHK_DateSet_CheckedChanged(object sender, EventArgs e) => CAL_UploadDate.Visible = CHK_DateSet.Checked; +} diff --git a/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.cs b/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.cs index 5e06e5b6b..d74aa4a25 100644 --- a/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.cs +++ b/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.cs @@ -8,13 +8,12 @@ namespace PKHeX.WinForms; -internal sealed partial class SaveHandlerTroubleshooter : Form +public sealed partial class SaveHandlerTroubleshooter : Form { private readonly Main _main; - internal SaveHandlerTroubleshooter(Main main) + public SaveHandlerTroubleshooter(Main main) { - ArgumentNullException.ThrowIfNull(main); _main = main; InitializeComponent(); From 092d760ae90cf6432bc731043e791d8d670f2ab0 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 7 Jun 2026 16:15:05 -0500 Subject: [PATCH 65/81] enc->pk: Minor perf improvement Move the %25 into the Criteria check method; only done in 1 method rather than across a few dozen. can potentially skip % operations depending on inputs. also inline some gender calls where gender isn't needed further in the generation pattern, so it can be skipped. --- .../Encounters/Generator/EncounterCriteria.cs | 14 ++++++++++++++ .../Encounters/Templates/Gen3/EncounterEgg3.cs | 2 +- .../Templates/Gen3/EncounterStatic3.cs | 10 ++++------ .../Templates/Gen3/Gifts/EncounterGift3.cs | 8 ++++---- .../Templates/Gen3/Gifts/EncounterGift3JPN.cs | 2 +- .../Templates/Gen3/Gifts/EncounterGift3NY.cs | 5 ++--- .../Encounters/Templates/Gen4/EncounterEgg4.cs | 2 +- .../Templates/Gen4/EncounterStatic4.cs | 8 ++++---- PKHeX.Core/Legality/RNG/CXD/MethodCXD.cs | 18 +++++++++--------- PKHeX.Core/Legality/RNG/CXD/MethodPokeSpot.cs | 2 +- .../RNG/ClassicEra/Gen3/GenerateMethodH.cs | 14 +++++++------- .../RNG/ClassicEra/Gen4/GenerateMethodJ.cs | 2 +- .../RNG/ClassicEra/Gen4/GenerateMethodK.cs | 2 +- PKHeX.Core/MysteryGifts/PGT.cs | 8 ++++---- 14 files changed, 54 insertions(+), 43 deletions(-) diff --git a/PKHeX.Core/Legality/Encounters/Generator/EncounterCriteria.cs b/PKHeX.Core/Legality/Encounters/Generator/EncounterCriteria.cs index 2190c59b6..62626aa8d 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/EncounterCriteria.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/EncounterCriteria.cs @@ -217,6 +217,20 @@ public bool IsSatisfiedNature(Nature nature) return nature == Nature || Mutations.HasFlag(CanMintNature); } + /// + /// Determines whether the Generation 3/4 PID satisfies the Nature criteria. + /// + /// The original PID to check. + /// if the Nature satisfies the criteria; otherwise, . + public bool IsSatisfiedNature(uint pid) + { + if (Mutations.HasFlag(AllowOnlyNeutralNature)) + return ((Nature)(pid % 25)).IsNeutral; + if (Nature == Nature.Random) + return true; + return Mutations.HasFlag(CanMintNature) || ((Nature)(pid % 25)) == Nature; + } + /// /// Determines whether the specified level satisfies the level range criteria. /// diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterEgg3.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterEgg3.cs index 8ec1e5170..4edc396e5 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterEgg3.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterEgg3.cs @@ -97,7 +97,7 @@ private uint GetRandomPID(in EncounterCriteria criteria, byte gr, uint id32) var gender = EntityGender.GetFromPIDAndRatio(pid, gr); if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(gender)) continue; - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; if (criteria.IsSpecifiedAbility() && !criteria.IsSatisfiedAbility((byte)(pid % 2))) continue; diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterStatic3.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterStatic3.cs index 9dbe7e428..60f32f176 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterStatic3.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterStatic3.cs @@ -137,7 +137,7 @@ private static bool SetRoamerPINGA(PK3 pk, in EncounterCriteria criteria) var rand2 = LCRNG.Prev16(ref state); var rand1 = LCRNG.Prev16(ref state); var pid = (rand2 << 16) | rand1; - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; bool shiny = ShinyUtil.GetIsShiny3(id32, pid); if (criteria.Shiny.IsShiny() != shiny) @@ -166,11 +166,10 @@ private static bool TrySetMethod1(PK3 pk, in EncounterCriteria criteria, byte gr { var seed = LCRNG.Prev2(s); // Unwind the RNG to get the real origin seed for the PID/IV var pid = ClassicEraRNG.GetSequentialPID(seed); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; - var gender = EntityGender.GetFromPIDAndRatio(pid, gr); - if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(gender)) + if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(EntityGender.GetFromPIDAndRatio(pid, gr))) continue; var abit = (int)(pid & 1); @@ -179,7 +178,6 @@ private static bool TrySetMethod1(PK3 pk, in EncounterCriteria criteria, byte gr pk.PID = pid; pk.IV32 |= iv2 << 15 | iv1; - pk.Gender = gender; pk.RefreshAbility(abit); return true; } @@ -198,7 +196,7 @@ private static void SetMethod1(PK3 pk, in EncounterCriteria criteria, byte gr, u if (criteria.Shiny.IsShiny() != shiny) continue; - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; var gender = EntityGender.GetFromPIDAndRatio(pid, gr); diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen3/Gifts/EncounterGift3.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen3/Gifts/EncounterGift3.cs index 616add704..781b79564 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen3/Gifts/EncounterGift3.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen3/Gifts/EncounterGift3.cs @@ -202,7 +202,7 @@ private uint SetPINGA(PK3 pk, in EncounterCriteria criteria, PersonalInfo3 pi) _ when Method is Method_2 => GetMethod2(ref seed), _ => GetRegular(ref seed), }; - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; // try again if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(EntityGender.GetFromPIDAndRatio(pid, gr))) continue; @@ -255,7 +255,7 @@ private static bool TrySetWishmkrShiny(PK3 pk, in EncounterCriteria criteria) { uint seed = s; var pid = GetRegular(ref seed); - if (filterNature && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (filterNature && !criteria.IsSatisfiedNature(pid)) continue; // try again var iv32 = ClassicEraRNG.GetSequentialIVs(ref seed); @@ -301,7 +301,7 @@ private static uint SetPINGAChannel(PK3 pk, in EncounterCriteria criteria) continue; SetValuesFromSeedChannel(pk, seed); var pid = pk.EncryptionConstant; - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; // try again if (criteria.Shiny.IsShiny() != ShinyUtil.GetIsShiny3(pk.ID32, pid)) continue; // try again @@ -317,7 +317,7 @@ private static uint SetPINGAChannel(PK3 pk, in EncounterCriteria criteria) SetValuesFromSeedChannel(pk, seed); var pid = pk.EncryptionConstant; - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; // try again if (criteria.Shiny.IsShiny() != ShinyUtil.GetIsShiny3(pk.ID32, pid)) continue; // try again diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen3/Gifts/EncounterGift3JPN.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen3/Gifts/EncounterGift3JPN.cs index 975be5752..de2794af2 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen3/Gifts/EncounterGift3JPN.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen3/Gifts/EncounterGift3JPN.cs @@ -79,7 +79,7 @@ private static void SetPINGA(PK3 pk, in EncounterCriteria criteria, PersonalInfo while (true) { var pid = CommonEvent3.GetRegularAntishiny(ref seed, idXor); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; // try again if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(EntityGender.GetFromPIDAndRatio(pid, gr))) continue; diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen3/Gifts/EncounterGift3NY.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen3/Gifts/EncounterGift3NY.cs index 30dc0a3d5..07b1be33c 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen3/Gifts/EncounterGift3NY.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen3/Gifts/EncounterGift3NY.cs @@ -80,10 +80,9 @@ private static void SetPINGA(PK3 pk, in EncounterCriteria criteria, PersonalInfo while (true) { var pid = CommonEvent3.GetAntishiny(ref seed, idXor); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; // try again - var gender = EntityGender.GetFromPIDAndRatio(pid, gr); - if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(gender)) + if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(EntityGender.GetFromPIDAndRatio(pid, gr))) continue; var iv32 = ClassicEraRNG.GetSequentialIVs(ref seed); if (criteria.IsSpecifiedHiddenPower() && !criteria.IsSatisfiedHiddenPower(iv32)) diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterEgg4.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterEgg4.cs index 064dae4f5..a13d3ed48 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterEgg4.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterEgg4.cs @@ -102,7 +102,7 @@ private uint GetRandomPID(in EncounterCriteria criteria, byte gr, uint id32, out gender = EntityGender.GetFromPIDAndRatio(pid, gr); if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(gender)) continue; - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; if (criteria.IsSpecifiedAbility() && !criteria.IsSatisfiedAbility((byte)(pid % 2))) continue; diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterStatic4.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterStatic4.cs index 8d7aa53d4..2b88fc94c 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterStatic4.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterStatic4.cs @@ -135,7 +135,7 @@ private static bool TrySetMethod1(PK4 pk, in EncounterCriteria criteria, byte gr { var seed = LCRNG.Prev2(s); // Unwind the RNG to get the real origin seed for the PID/IV var pid = ClassicEraRNG.GetSequentialPID(seed); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; var gender = EntityGender.GetFromPIDAndRatio(pid, gr); @@ -167,7 +167,7 @@ private static void SetMethod1(PK4 pk, in EncounterCriteria criteria, byte gr, u if (criteria.Shiny.IsShiny() != shiny) continue; - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; var gender = EntityGender.GetFromPIDAndRatio(pid, gr); @@ -206,7 +206,7 @@ private static bool TrySetChainShiny(PK4 pk, in EncounterCriteria criteria, byte var shiny = ShinyUtil.GetIsShiny3(id32, pid); if (criteria.Shiny.IsShiny() != shiny) continue; - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; var gender = EntityGender.GetFromPIDAndRatio(pid, gr); @@ -234,7 +234,7 @@ private static void SetChainShiny(PK4 pk, in EncounterCriteria criteria, byte gr while (true) { var pid = ClassicEraRNG.GetChainShinyPID(ref seed, id32); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; var gender = EntityGender.GetFromPIDAndRatio(pid, gr); diff --git a/PKHeX.Core/Legality/RNG/CXD/MethodCXD.cs b/PKHeX.Core/Legality/RNG/CXD/MethodCXD.cs index 4609e8a77..c01165128 100644 --- a/PKHeX.Core/Legality/RNG/CXD/MethodCXD.cs +++ b/PKHeX.Core/Legality/RNG/CXD/MethodCXD.cs @@ -27,7 +27,7 @@ public static class MethodCXD // * => IV, IV, ability, PID, PID var s = XDRNG.Next3(seed); uint pid = GetPID(s, id32, noShiny); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(EntityGender.GetFromPIDAndRatio(pid, gr))) continue; @@ -65,7 +65,7 @@ public static bool SetFromIVs(TEntity pk, in EncounterCriteria criteria // * => IV, IV, ability, PID, PID var s = XDRNG.Next3(seed); uint pid = GetPID(s, id32, noShiny); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(EntityGender.GetFromPIDAndRatio(pid, gr))) continue; @@ -122,7 +122,7 @@ public static bool SetStarterFromTrainerID(CK3 pk, in EncounterCriteria criteria pid = GetColoStarterPID(ref s, id32); } - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; // fixed gender & never shiny, ignore @@ -166,7 +166,7 @@ public static bool SetStarterFirstFromIVs(CK3 pk, in EncounterCriteria criteria) var id32 = sid << 16 | tid; uint pid = GetColoStarterPID(ref s, id32); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; // fixed gender & never shiny, ignore @@ -280,7 +280,7 @@ public static bool SetStarterFromTrainerID(XK3 pk, in EncounterCriteria criteria var s = XDRNG.Next7(seed); // tid/sid (2), fake pid (2), ivs (2), ability (1) uint pid = GetPID(s); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(EntityGender.GetFromPID(pid, EntityGender.VM))) continue; @@ -319,7 +319,7 @@ public static bool SetStarterFromIVs(XK3 pk, in EncounterCriteria criteria) var s = XDRNG.Next3(seed); uint pid = GetPID(s); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; var tid = XDRNG.Prev3(seed) >> 16; @@ -359,7 +359,7 @@ public static void SetStarterRandom(XK3 pk, in EncounterCriteria criteria, uint // Get PID seed = XDRNG.Next7(seed); // tid, sid, fakePID x2, IVs x2, ability* => pid1, pid2 var pid = GetPIDRegular(ref seed); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(EntityGender.GetFromPID(pid, EntityGender.VM))) continue; @@ -407,7 +407,7 @@ public static void SetStarterRandom(XK3 pk, in EncounterCriteria criteria, uint { // fakePID x2, IVs x2, ability, pid1*, pid2 var pid = GetPIDReuse(ref seed, id32, noShiny); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(EntityGender.GetFromPIDAndRatio(pid, gender))) continue; @@ -451,7 +451,7 @@ public static void SetRandom(T pk, in EncounterCriteria criteria, PersonalInf { // fakePID x2, IVs x2, ability, pid1*, pid2 var pid = GetPIDReuse(ref seed, id32, noShiny); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(EntityGender.GetFromPIDAndRatio(pid, gender))) continue; diff --git a/PKHeX.Core/Legality/RNG/CXD/MethodPokeSpot.cs b/PKHeX.Core/Legality/RNG/CXD/MethodPokeSpot.cs index 6d572a4db..d9b7e8f95 100644 --- a/PKHeX.Core/Legality/RNG/CXD/MethodPokeSpot.cs +++ b/PKHeX.Core/Legality/RNG/CXD/MethodPokeSpot.cs @@ -258,7 +258,7 @@ public static uint GetRandomPID(uint id32, in EncounterCriteria criteria, byte g continue; } var pid = GetPIDRegular(ref seed); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(EntityGender.GetFromPIDAndRatio(pid, gender))) continue; diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/GenerateMethodH.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/GenerateMethodH.cs index c9c7e85ee..13c4cf0cc 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/GenerateMethodH.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/GenerateMethodH.cs @@ -98,7 +98,7 @@ public static void SetRandomUnown(this T enc, PK3 pk, in EncounterCriteria cr continue; // Check the nature is what the user requested. - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) break; var iv32 = ClassicEraRNG.GetSequentialIVs(ref seed); @@ -132,12 +132,12 @@ public bool SetFromIVs(PK3 pk, PersonalInfo3 pi, in EncounterCriteria criteria, var a = LCRNG.Next16(ref s); var b = LCRNG.Next16(ref s); var pid = GetPIDRegular(a, b); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) { // Try again as Method 2 (AB-DE) var o = seed >> 16; pid = GetPIDRegular(o, a); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; seed = LCRNG.Prev(seed); } @@ -176,7 +176,7 @@ public bool SetFromIVs(PK3 pk, PersonalInfo3 pi, in EncounterCriteria criteria, var a = LCRNG.Next16(ref s); var b = LCRNG.Next16(ref s); var pid = GetPIDRegular(a, b); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; var gender = EntityGender.GetFromPIDAndRatio(pid, gr); @@ -219,12 +219,12 @@ public bool SetFromIVsUnown(PK3 pk, in EncounterCriteria criteria) var a = LCRNG.Next16(ref s); var b = LCRNG.Next16(ref s); var pid = GetPIDUnown(a, b); - if ((criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) || EntityPID.GetUnownForm3(pid) != enc.Form) + if ((criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) || EntityPID.GetUnownForm3(pid) != enc.Form) { // Try again as Method 2 (BA-DE) var o = seed >> 16; pid = GetPIDUnown(o, a); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; var form = EntityPID.GetUnownForm3(pid); if (form != enc.Form) @@ -252,7 +252,7 @@ public bool SetFromIVsUnown(PK3 pk, in EncounterCriteria criteria) var a = LCRNG.Next16(ref s); var b = LCRNG.Next16(ref s); var pid = GetPIDUnown(a, b); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; var form = EntityPID.GetUnownForm3(pid); if (form != enc.Form) diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodJ.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodJ.cs index 4c51b327b..e5598f64c 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodJ.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodJ.cs @@ -125,7 +125,7 @@ public bool SetFromIVsJ(PK4 pk, PersonalInfo4 pi, in EncounterCriteria criteria, var pid = GetPIDRegular(a, b); if (criteria.Shiny.IsShiny() != ShinyUtil.GetIsShiny3(id32, pid)) continue; - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; var gender = EntityGender.GetFromPIDAndRatio(pid, gr); diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodK.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodK.cs index 9bff9423a..dd5b777bd 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodK.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodK.cs @@ -126,7 +126,7 @@ public bool SetFromIVsK(PK4 pk, PersonalInfo4 pi, in EncounterCriteria criteria, var a = LCRNG.Next16(ref s); var b = LCRNG.Next16(ref s); var pid = GetPIDRegular(a, b); - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; var gender = EntityGender.GetFromPIDAndRatio(pid, gr); diff --git a/PKHeX.Core/MysteryGifts/PGT.cs b/PKHeX.Core/MysteryGifts/PGT.cs index 85ad4053a..8c08d6702 100644 --- a/PKHeX.Core/MysteryGifts/PGT.cs +++ b/PKHeX.Core/MysteryGifts/PGT.cs @@ -171,7 +171,7 @@ private static void SetPINGAManaphy(PK4 pk4, in EncounterCriteria criteria, ITra var a = LCRNG.Next16(ref seed); var b = LCRNG.Next16(ref seed); var pid = (b << 16) | a; - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; var c = LCRNG.Next15(ref seed); var d = LCRNG.Next15(ref seed); @@ -209,7 +209,7 @@ private static bool TrySetManaphyFromIVs(PK4 pk4, in EncounterCriteria criteria, // Check for anti-shiny. var xor = (a ^ b) >> 3; bool arng = false; - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) { while (true) { @@ -221,7 +221,7 @@ private static bool TrySetManaphyFromIVs(PK4 pk4, in EncounterCriteria criteria, arng = true; break; } - if (!criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (!criteria.IsSatisfiedNature(pid)) continue; } @@ -371,7 +371,7 @@ private static uint GetPID(PK4 pk4, PersonalInfo4 pi, in EncounterCriteria crite break; pid = ARNG.Next(pid); } - if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25))) + if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(pid)) continue; if (EntityGender.GetFromPIDAndRatio(pid, gr) != gender) continue; From edc6c7c29b3f6641e9a1f6fabe42ac33c7ed7690 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 7 Jun 2026 16:32:24 -0500 Subject: [PATCH 66/81] Re-flow SAV editor button panels --- .../Controls/SAV Editor/SAVEditor.Designer.cs | 400 ++++++++++-------- 1 file changed, 222 insertions(+), 178 deletions(-) diff --git a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs index 615b36af8..615d97066 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs @@ -59,6 +59,7 @@ private void InitializeComponent() DayCare_HasEgg = new System.Windows.Forms.CheckBox(); L_ReadOnlyOther = new System.Windows.Forms.Label(); Tab_SAV = new System.Windows.Forms.TabPage(); + TLP_SAVEditor = new System.Windows.Forms.TableLayoutPanel(); FLP_SAVtools = new System.Windows.Forms.FlowLayoutPanel(); B_OpenTrainerInfo = new System.Windows.Forms.Button(); B_OpenItemPouch = new System.Windows.Forms.Button(); @@ -105,6 +106,7 @@ private void InitializeComponent() B_OpenBattlePass = new System.Windows.Forms.Button(); B_OpenGear = new System.Windows.Forms.Button(); B_OpenFashion = new System.Windows.Forms.Button(); + B_OpenGlobalLink = new System.Windows.Forms.Button(); FLP_SAVToolsMisc = new System.Windows.Forms.FlowLayoutPanel(); B_SaveBoxBin = new System.Windows.Forms.Button(); B_VerifyCHK = new System.Windows.Forms.Button(); @@ -112,9 +114,8 @@ private void InitializeComponent() Menu_ExportBAK = new System.Windows.Forms.Button(); B_JPEG = new System.Windows.Forms.Button(); B_ConvertKorean = new System.Windows.Forms.Button(); - CB_SaveSlot = new System.Windows.Forms.ComboBox(); L_SaveSlot = new System.Windows.Forms.Label(); - B_OpenGlobalLink = new System.Windows.Forms.Button(); + CB_SaveSlot = new System.Windows.Forms.ComboBox(); tabBoxMulti.SuspendLayout(); Tab_Box.SuspendLayout(); PopoutMenu.SuspendLayout(); @@ -124,6 +125,7 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)dcpkx2).BeginInit(); ((System.ComponentModel.ISupportInitialize)dcpkx1).BeginInit(); Tab_SAV.SuspendLayout(); + TLP_SAVEditor.SuspendLayout(); FLP_SAVtools.SuspendLayout(); FLP_SAVToolsMisc.SuspendLayout(); SuspendLayout(); @@ -404,10 +406,7 @@ private void InitializeComponent() // // Tab_SAV // - Tab_SAV.Controls.Add(FLP_SAVtools); - Tab_SAV.Controls.Add(FLP_SAVToolsMisc); - Tab_SAV.Controls.Add(CB_SaveSlot); - Tab_SAV.Controls.Add(L_SaveSlot); + Tab_SAV.Controls.Add(TLP_SAVEditor); Tab_SAV.Location = new System.Drawing.Point(4, 26); Tab_SAV.Name = "Tab_SAV"; Tab_SAV.Size = new System.Drawing.Size(441, 333); @@ -415,9 +414,30 @@ private void InitializeComponent() Tab_SAV.Text = "SAV"; Tab_SAV.UseVisualStyleBackColor = true; // + // TLP_SAVEditor + // + TLP_SAVEditor.ColumnCount = 2; + TLP_SAVEditor.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + TLP_SAVEditor.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_SAVEditor.Controls.Add(FLP_SAVToolsMisc, 0, 0); + TLP_SAVEditor.Controls.Add(FLP_SAVtools, 0, 3); + TLP_SAVEditor.Controls.Add(L_SaveSlot, 0, 1); + TLP_SAVEditor.Controls.Add(CB_SaveSlot, 1, 1); + TLP_SAVEditor.Dock = System.Windows.Forms.DockStyle.Fill; + TLP_SAVEditor.Location = new System.Drawing.Point(0, 0); + TLP_SAVEditor.Name = "TLP_SAVEditor"; + TLP_SAVEditor.RowCount = 4; + TLP_SAVEditor.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_SAVEditor.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F)); + TLP_SAVEditor.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + TLP_SAVEditor.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + TLP_SAVEditor.Size = new System.Drawing.Size(441, 333); + TLP_SAVEditor.TabIndex = 105; + // // FLP_SAVtools // FLP_SAVtools.AutoScroll = true; + TLP_SAVEditor.SetColumnSpan(FLP_SAVtools, 2); FLP_SAVtools.Controls.Add(B_OpenTrainerInfo); FLP_SAVtools.Controls.Add(B_OpenItemPouch); FLP_SAVtools.Controls.Add(B_OpenBoxLayout); @@ -464,19 +484,19 @@ private void InitializeComponent() FLP_SAVtools.Controls.Add(B_OpenGear); FLP_SAVtools.Controls.Add(B_OpenFashion); FLP_SAVtools.Controls.Add(B_OpenGlobalLink); - FLP_SAVtools.Dock = System.Windows.Forms.DockStyle.Bottom; - FLP_SAVtools.Location = new System.Drawing.Point(0, 173); + FLP_SAVtools.Dock = System.Windows.Forms.DockStyle.Fill; + FLP_SAVtools.Location = new System.Drawing.Point(0, 114); FLP_SAVtools.Margin = new System.Windows.Forms.Padding(0); FLP_SAVtools.Name = "FLP_SAVtools"; - FLP_SAVtools.Size = new System.Drawing.Size(441, 160); + FLP_SAVtools.Size = new System.Drawing.Size(441, 219); FLP_SAVtools.TabIndex = 101; // // B_OpenTrainerInfo // - B_OpenTrainerInfo.Location = new System.Drawing.Point(4, 4); - B_OpenTrainerInfo.Margin = new System.Windows.Forms.Padding(4); + B_OpenTrainerInfo.Location = new System.Drawing.Point(2, 2); + B_OpenTrainerInfo.Margin = new System.Windows.Forms.Padding(2); B_OpenTrainerInfo.Name = "B_OpenTrainerInfo"; - B_OpenTrainerInfo.Size = new System.Drawing.Size(96, 32); + B_OpenTrainerInfo.Size = new System.Drawing.Size(128, 40); B_OpenTrainerInfo.TabIndex = 1; B_OpenTrainerInfo.Text = "Trainer Info"; B_OpenTrainerInfo.UseVisualStyleBackColor = true; @@ -484,10 +504,10 @@ private void InitializeComponent() // // B_OpenItemPouch // - B_OpenItemPouch.Location = new System.Drawing.Point(108, 4); - B_OpenItemPouch.Margin = new System.Windows.Forms.Padding(4); + B_OpenItemPouch.Location = new System.Drawing.Point(134, 2); + B_OpenItemPouch.Margin = new System.Windows.Forms.Padding(2); B_OpenItemPouch.Name = "B_OpenItemPouch"; - B_OpenItemPouch.Size = new System.Drawing.Size(96, 32); + B_OpenItemPouch.Size = new System.Drawing.Size(128, 40); B_OpenItemPouch.TabIndex = 1; B_OpenItemPouch.Text = "Items"; B_OpenItemPouch.UseVisualStyleBackColor = true; @@ -495,10 +515,10 @@ private void InitializeComponent() // // B_OpenBoxLayout // - B_OpenBoxLayout.Location = new System.Drawing.Point(212, 4); - B_OpenBoxLayout.Margin = new System.Windows.Forms.Padding(4); + B_OpenBoxLayout.Location = new System.Drawing.Point(266, 2); + B_OpenBoxLayout.Margin = new System.Windows.Forms.Padding(2); B_OpenBoxLayout.Name = "B_OpenBoxLayout"; - B_OpenBoxLayout.Size = new System.Drawing.Size(96, 32); + B_OpenBoxLayout.Size = new System.Drawing.Size(128, 40); B_OpenBoxLayout.TabIndex = 1; B_OpenBoxLayout.Text = "Box Layout"; B_OpenBoxLayout.UseVisualStyleBackColor = true; @@ -506,10 +526,10 @@ private void InitializeComponent() // // B_OpenWondercards // - B_OpenWondercards.Location = new System.Drawing.Point(316, 4); - B_OpenWondercards.Margin = new System.Windows.Forms.Padding(4); + B_OpenWondercards.Location = new System.Drawing.Point(2, 46); + B_OpenWondercards.Margin = new System.Windows.Forms.Padding(2); B_OpenWondercards.Name = "B_OpenWondercards"; - B_OpenWondercards.Size = new System.Drawing.Size(96, 32); + B_OpenWondercards.Size = new System.Drawing.Size(128, 40); B_OpenWondercards.TabIndex = 1; B_OpenWondercards.Text = "Wondercard"; B_OpenWondercards.UseVisualStyleBackColor = true; @@ -517,10 +537,10 @@ private void InitializeComponent() // // B_OpenOPowers // - B_OpenOPowers.Location = new System.Drawing.Point(4, 44); - B_OpenOPowers.Margin = new System.Windows.Forms.Padding(4); + B_OpenOPowers.Location = new System.Drawing.Point(134, 46); + B_OpenOPowers.Margin = new System.Windows.Forms.Padding(2); B_OpenOPowers.Name = "B_OpenOPowers"; - B_OpenOPowers.Size = new System.Drawing.Size(96, 32); + B_OpenOPowers.Size = new System.Drawing.Size(128, 40); B_OpenOPowers.TabIndex = 1; B_OpenOPowers.Text = "O-Powers"; B_OpenOPowers.UseVisualStyleBackColor = true; @@ -528,10 +548,10 @@ private void InitializeComponent() // // B_OpenEventFlags // - B_OpenEventFlags.Location = new System.Drawing.Point(108, 44); - B_OpenEventFlags.Margin = new System.Windows.Forms.Padding(4); + B_OpenEventFlags.Location = new System.Drawing.Point(266, 46); + B_OpenEventFlags.Margin = new System.Windows.Forms.Padding(2); B_OpenEventFlags.Name = "B_OpenEventFlags"; - B_OpenEventFlags.Size = new System.Drawing.Size(96, 32); + B_OpenEventFlags.Size = new System.Drawing.Size(128, 40); B_OpenEventFlags.TabIndex = 1; B_OpenEventFlags.Text = "Event Flags"; B_OpenEventFlags.UseVisualStyleBackColor = true; @@ -539,10 +559,10 @@ private void InitializeComponent() // // B_OpenPokedex // - B_OpenPokedex.Location = new System.Drawing.Point(212, 44); - B_OpenPokedex.Margin = new System.Windows.Forms.Padding(4); + B_OpenPokedex.Location = new System.Drawing.Point(2, 90); + B_OpenPokedex.Margin = new System.Windows.Forms.Padding(2); B_OpenPokedex.Name = "B_OpenPokedex"; - B_OpenPokedex.Size = new System.Drawing.Size(96, 32); + B_OpenPokedex.Size = new System.Drawing.Size(128, 40); B_OpenPokedex.TabIndex = 1; B_OpenPokedex.Text = "Pokédex"; B_OpenPokedex.UseVisualStyleBackColor = true; @@ -550,10 +570,10 @@ private void InitializeComponent() // // B_OpenLinkInfo // - B_OpenLinkInfo.Location = new System.Drawing.Point(316, 44); - B_OpenLinkInfo.Margin = new System.Windows.Forms.Padding(4); + B_OpenLinkInfo.Location = new System.Drawing.Point(134, 90); + B_OpenLinkInfo.Margin = new System.Windows.Forms.Padding(2); B_OpenLinkInfo.Name = "B_OpenLinkInfo"; - B_OpenLinkInfo.Size = new System.Drawing.Size(96, 32); + B_OpenLinkInfo.Size = new System.Drawing.Size(128, 40); B_OpenLinkInfo.TabIndex = 1; B_OpenLinkInfo.Text = "Link Data"; B_OpenLinkInfo.UseVisualStyleBackColor = true; @@ -561,10 +581,10 @@ private void InitializeComponent() // // B_OpenBerryField // - B_OpenBerryField.Location = new System.Drawing.Point(4, 84); - B_OpenBerryField.Margin = new System.Windows.Forms.Padding(4); + B_OpenBerryField.Location = new System.Drawing.Point(266, 90); + B_OpenBerryField.Margin = new System.Windows.Forms.Padding(2); B_OpenBerryField.Name = "B_OpenBerryField"; - B_OpenBerryField.Size = new System.Drawing.Size(96, 32); + B_OpenBerryField.Size = new System.Drawing.Size(128, 40); B_OpenBerryField.TabIndex = 1; B_OpenBerryField.Text = "Berry Field"; B_OpenBerryField.UseVisualStyleBackColor = true; @@ -572,10 +592,10 @@ private void InitializeComponent() // // B_OpenPokeblocks // - B_OpenPokeblocks.Location = new System.Drawing.Point(108, 84); - B_OpenPokeblocks.Margin = new System.Windows.Forms.Padding(4); + B_OpenPokeblocks.Location = new System.Drawing.Point(2, 134); + B_OpenPokeblocks.Margin = new System.Windows.Forms.Padding(2); B_OpenPokeblocks.Name = "B_OpenPokeblocks"; - B_OpenPokeblocks.Size = new System.Drawing.Size(96, 32); + B_OpenPokeblocks.Size = new System.Drawing.Size(128, 40); B_OpenPokeblocks.TabIndex = 1; B_OpenPokeblocks.Text = "Pokéblocks"; B_OpenPokeblocks.UseVisualStyleBackColor = true; @@ -584,10 +604,10 @@ private void InitializeComponent() // // B_OpenSecretBase // - B_OpenSecretBase.Location = new System.Drawing.Point(212, 84); - B_OpenSecretBase.Margin = new System.Windows.Forms.Padding(4); + B_OpenSecretBase.Location = new System.Drawing.Point(134, 134); + B_OpenSecretBase.Margin = new System.Windows.Forms.Padding(2); B_OpenSecretBase.Name = "B_OpenSecretBase"; - B_OpenSecretBase.Size = new System.Drawing.Size(96, 32); + B_OpenSecretBase.Size = new System.Drawing.Size(128, 40); B_OpenSecretBase.TabIndex = 1; B_OpenSecretBase.Text = "Secret Base"; B_OpenSecretBase.UseVisualStyleBackColor = true; @@ -596,10 +616,10 @@ private void InitializeComponent() // // B_OpenPokepuffs // - B_OpenPokepuffs.Location = new System.Drawing.Point(316, 84); - B_OpenPokepuffs.Margin = new System.Windows.Forms.Padding(4); + B_OpenPokepuffs.Location = new System.Drawing.Point(266, 134); + B_OpenPokepuffs.Margin = new System.Windows.Forms.Padding(2); B_OpenPokepuffs.Name = "B_OpenPokepuffs"; - B_OpenPokepuffs.Size = new System.Drawing.Size(96, 32); + B_OpenPokepuffs.Size = new System.Drawing.Size(128, 40); B_OpenPokepuffs.TabIndex = 1; B_OpenPokepuffs.Text = "Poké Puffs"; B_OpenPokepuffs.UseVisualStyleBackColor = true; @@ -608,10 +628,10 @@ private void InitializeComponent() // B_OpenSuperTraining // B_OpenSuperTraining.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F); - B_OpenSuperTraining.Location = new System.Drawing.Point(4, 124); - B_OpenSuperTraining.Margin = new System.Windows.Forms.Padding(4); + B_OpenSuperTraining.Location = new System.Drawing.Point(2, 178); + B_OpenSuperTraining.Margin = new System.Windows.Forms.Padding(2); B_OpenSuperTraining.Name = "B_OpenSuperTraining"; - B_OpenSuperTraining.Size = new System.Drawing.Size(96, 32); + B_OpenSuperTraining.Size = new System.Drawing.Size(128, 40); B_OpenSuperTraining.TabIndex = 1; B_OpenSuperTraining.Text = "Super Train"; B_OpenSuperTraining.UseVisualStyleBackColor = true; @@ -619,10 +639,10 @@ private void InitializeComponent() // // B_OpenHallofFame // - B_OpenHallofFame.Location = new System.Drawing.Point(108, 124); - B_OpenHallofFame.Margin = new System.Windows.Forms.Padding(4); + B_OpenHallofFame.Location = new System.Drawing.Point(134, 178); + B_OpenHallofFame.Margin = new System.Windows.Forms.Padding(2); B_OpenHallofFame.Name = "B_OpenHallofFame"; - B_OpenHallofFame.Size = new System.Drawing.Size(96, 32); + B_OpenHallofFame.Size = new System.Drawing.Size(128, 40); B_OpenHallofFame.TabIndex = 1; B_OpenHallofFame.Text = "Hall of Fame"; B_OpenHallofFame.UseVisualStyleBackColor = true; @@ -630,10 +650,10 @@ private void InitializeComponent() // // B_OUTPasserby // - B_OUTPasserby.Location = new System.Drawing.Point(212, 124); - B_OUTPasserby.Margin = new System.Windows.Forms.Padding(4); + B_OUTPasserby.Location = new System.Drawing.Point(266, 178); + B_OUTPasserby.Margin = new System.Windows.Forms.Padding(2); B_OUTPasserby.Name = "B_OUTPasserby"; - B_OUTPasserby.Size = new System.Drawing.Size(96, 32); + B_OUTPasserby.Size = new System.Drawing.Size(128, 40); B_OUTPasserby.TabIndex = 1; B_OUTPasserby.Text = "Passerby"; B_OUTPasserby.UseVisualStyleBackColor = true; @@ -641,10 +661,10 @@ private void InitializeComponent() // // B_DLC // - B_DLC.Location = new System.Drawing.Point(316, 124); - B_DLC.Margin = new System.Windows.Forms.Padding(4); + B_DLC.Location = new System.Drawing.Point(2, 222); + B_DLC.Margin = new System.Windows.Forms.Padding(2); B_DLC.Name = "B_DLC"; - B_DLC.Size = new System.Drawing.Size(96, 32); + B_DLC.Size = new System.Drawing.Size(128, 40); B_DLC.TabIndex = 1; B_DLC.Text = "DLC I/O"; B_DLC.UseVisualStyleBackColor = true; @@ -652,10 +672,10 @@ private void InitializeComponent() // // B_Donuts // - B_Donuts.Location = new System.Drawing.Point(4, 164); - B_Donuts.Margin = new System.Windows.Forms.Padding(4); + B_Donuts.Location = new System.Drawing.Point(134, 222); + B_Donuts.Margin = new System.Windows.Forms.Padding(2); B_Donuts.Name = "B_Donuts"; - B_Donuts.Size = new System.Drawing.Size(96, 32); + B_Donuts.Size = new System.Drawing.Size(128, 40); B_Donuts.TabIndex = 11; B_Donuts.Text = "Donuts"; B_Donuts.UseVisualStyleBackColor = true; @@ -663,10 +683,10 @@ private void InitializeComponent() // // B_OpenPokeBeans // - B_OpenPokeBeans.Location = new System.Drawing.Point(108, 164); - B_OpenPokeBeans.Margin = new System.Windows.Forms.Padding(4); + B_OpenPokeBeans.Location = new System.Drawing.Point(266, 222); + B_OpenPokeBeans.Margin = new System.Windows.Forms.Padding(2); B_OpenPokeBeans.Name = "B_OpenPokeBeans"; - B_OpenPokeBeans.Size = new System.Drawing.Size(96, 32); + B_OpenPokeBeans.Size = new System.Drawing.Size(128, 40); B_OpenPokeBeans.TabIndex = 1; B_OpenPokeBeans.Text = "Poké Beans"; B_OpenPokeBeans.UseVisualStyleBackColor = true; @@ -674,10 +694,10 @@ private void InitializeComponent() // // B_CellsStickers // - B_CellsStickers.Location = new System.Drawing.Point(212, 164); - B_CellsStickers.Margin = new System.Windows.Forms.Padding(4); + B_CellsStickers.Location = new System.Drawing.Point(2, 266); + B_CellsStickers.Margin = new System.Windows.Forms.Padding(2); B_CellsStickers.Name = "B_CellsStickers"; - B_CellsStickers.Size = new System.Drawing.Size(96, 32); + B_CellsStickers.Size = new System.Drawing.Size(128, 40); B_CellsStickers.TabIndex = 1; B_CellsStickers.Text = "Cells/Stickers"; B_CellsStickers.UseVisualStyleBackColor = true; @@ -685,10 +705,10 @@ private void InitializeComponent() // // B_OpenMiscEditor // - B_OpenMiscEditor.Location = new System.Drawing.Point(316, 164); - B_OpenMiscEditor.Margin = new System.Windows.Forms.Padding(4); + B_OpenMiscEditor.Location = new System.Drawing.Point(134, 266); + B_OpenMiscEditor.Margin = new System.Windows.Forms.Padding(2); B_OpenMiscEditor.Name = "B_OpenMiscEditor"; - B_OpenMiscEditor.Size = new System.Drawing.Size(96, 32); + B_OpenMiscEditor.Size = new System.Drawing.Size(128, 40); B_OpenMiscEditor.TabIndex = 1; B_OpenMiscEditor.Text = "Misc Edits"; B_OpenMiscEditor.UseVisualStyleBackColor = true; @@ -696,10 +716,10 @@ private void InitializeComponent() // // B_OpenHoneyTreeEditor // - B_OpenHoneyTreeEditor.Location = new System.Drawing.Point(4, 204); - B_OpenHoneyTreeEditor.Margin = new System.Windows.Forms.Padding(4); + B_OpenHoneyTreeEditor.Location = new System.Drawing.Point(266, 266); + B_OpenHoneyTreeEditor.Margin = new System.Windows.Forms.Padding(2); B_OpenHoneyTreeEditor.Name = "B_OpenHoneyTreeEditor"; - B_OpenHoneyTreeEditor.Size = new System.Drawing.Size(96, 32); + B_OpenHoneyTreeEditor.Size = new System.Drawing.Size(128, 40); B_OpenHoneyTreeEditor.TabIndex = 1; B_OpenHoneyTreeEditor.Text = "Honey Tree"; B_OpenHoneyTreeEditor.UseVisualStyleBackColor = true; @@ -707,10 +727,10 @@ private void InitializeComponent() // // B_OpenFriendSafari // - B_OpenFriendSafari.Location = new System.Drawing.Point(108, 204); - B_OpenFriendSafari.Margin = new System.Windows.Forms.Padding(4); + B_OpenFriendSafari.Location = new System.Drawing.Point(2, 310); + B_OpenFriendSafari.Margin = new System.Windows.Forms.Padding(2); B_OpenFriendSafari.Name = "B_OpenFriendSafari"; - B_OpenFriendSafari.Size = new System.Drawing.Size(96, 32); + B_OpenFriendSafari.Size = new System.Drawing.Size(128, 40); B_OpenFriendSafari.TabIndex = 1; B_OpenFriendSafari.Text = "Friend Safari"; B_OpenFriendSafari.UseVisualStyleBackColor = true; @@ -718,10 +738,10 @@ private void InitializeComponent() // // B_OpenRTCEditor // - B_OpenRTCEditor.Location = new System.Drawing.Point(212, 204); - B_OpenRTCEditor.Margin = new System.Windows.Forms.Padding(4); + B_OpenRTCEditor.Location = new System.Drawing.Point(134, 310); + B_OpenRTCEditor.Margin = new System.Windows.Forms.Padding(2); B_OpenRTCEditor.Name = "B_OpenRTCEditor"; - B_OpenRTCEditor.Size = new System.Drawing.Size(96, 32); + B_OpenRTCEditor.Size = new System.Drawing.Size(128, 40); B_OpenRTCEditor.TabIndex = 1; B_OpenRTCEditor.Text = "Clock (RTC)"; B_OpenRTCEditor.UseVisualStyleBackColor = true; @@ -729,10 +749,10 @@ private void InitializeComponent() // // B_OpenUGSEditor // - B_OpenUGSEditor.Location = new System.Drawing.Point(316, 204); - B_OpenUGSEditor.Margin = new System.Windows.Forms.Padding(4); + B_OpenUGSEditor.Location = new System.Drawing.Point(266, 310); + B_OpenUGSEditor.Margin = new System.Windows.Forms.Padding(2); B_OpenUGSEditor.Name = "B_OpenUGSEditor"; - B_OpenUGSEditor.Size = new System.Drawing.Size(96, 32); + B_OpenUGSEditor.Size = new System.Drawing.Size(128, 40); B_OpenUGSEditor.TabIndex = 1; B_OpenUGSEditor.Text = "Underground"; B_OpenUGSEditor.UseVisualStyleBackColor = true; @@ -740,10 +760,10 @@ private void InitializeComponent() // // B_OpenGeonetEditor // - B_OpenGeonetEditor.Location = new System.Drawing.Point(4, 244); - B_OpenGeonetEditor.Margin = new System.Windows.Forms.Padding(4); + B_OpenGeonetEditor.Location = new System.Drawing.Point(2, 354); + B_OpenGeonetEditor.Margin = new System.Windows.Forms.Padding(2); B_OpenGeonetEditor.Name = "B_OpenGeonetEditor"; - B_OpenGeonetEditor.Size = new System.Drawing.Size(96, 32); + B_OpenGeonetEditor.Size = new System.Drawing.Size(128, 40); B_OpenGeonetEditor.TabIndex = 1; B_OpenGeonetEditor.Text = "Geonet"; B_OpenGeonetEditor.UseVisualStyleBackColor = true; @@ -751,10 +771,10 @@ private void InitializeComponent() // // B_OpenUnityTowerEditor // - B_OpenUnityTowerEditor.Location = new System.Drawing.Point(108, 244); - B_OpenUnityTowerEditor.Margin = new System.Windows.Forms.Padding(4); + B_OpenUnityTowerEditor.Location = new System.Drawing.Point(134, 354); + B_OpenUnityTowerEditor.Margin = new System.Windows.Forms.Padding(2); B_OpenUnityTowerEditor.Name = "B_OpenUnityTowerEditor"; - B_OpenUnityTowerEditor.Size = new System.Drawing.Size(96, 32); + B_OpenUnityTowerEditor.Size = new System.Drawing.Size(128, 40); B_OpenUnityTowerEditor.TabIndex = 1; B_OpenUnityTowerEditor.Text = "Unity Tower"; B_OpenUnityTowerEditor.UseVisualStyleBackColor = true; @@ -762,10 +782,10 @@ private void InitializeComponent() // // B_OpenJoinAvenueEditor // - B_OpenJoinAvenueEditor.Location = new System.Drawing.Point(212, 244); - B_OpenJoinAvenueEditor.Margin = new System.Windows.Forms.Padding(4); + B_OpenJoinAvenueEditor.Location = new System.Drawing.Point(266, 354); + B_OpenJoinAvenueEditor.Margin = new System.Windows.Forms.Padding(2); B_OpenJoinAvenueEditor.Name = "B_OpenJoinAvenueEditor"; - B_OpenJoinAvenueEditor.Size = new System.Drawing.Size(96, 32); + B_OpenJoinAvenueEditor.Size = new System.Drawing.Size(128, 40); B_OpenJoinAvenueEditor.TabIndex = 1; B_OpenJoinAvenueEditor.Text = "Join Avenue"; B_OpenJoinAvenueEditor.UseVisualStyleBackColor = true; @@ -773,10 +793,10 @@ private void InitializeComponent() // // B_OpenPokeathlon // - B_OpenPokeathlon.Location = new System.Drawing.Point(316, 244); - B_OpenPokeathlon.Margin = new System.Windows.Forms.Padding(4); + B_OpenPokeathlon.Location = new System.Drawing.Point(2, 398); + B_OpenPokeathlon.Margin = new System.Windows.Forms.Padding(2); B_OpenPokeathlon.Name = "B_OpenPokeathlon"; - B_OpenPokeathlon.Size = new System.Drawing.Size(96, 32); + B_OpenPokeathlon.Size = new System.Drawing.Size(128, 40); B_OpenPokeathlon.TabIndex = 1; B_OpenPokeathlon.Text = "Pokéathlon"; B_OpenPokeathlon.UseVisualStyleBackColor = true; @@ -784,10 +804,10 @@ private void InitializeComponent() // // B_OpenMedalsEditor // - B_OpenMedalsEditor.Location = new System.Drawing.Point(4, 284); - B_OpenMedalsEditor.Margin = new System.Windows.Forms.Padding(4); + B_OpenMedalsEditor.Location = new System.Drawing.Point(134, 398); + B_OpenMedalsEditor.Margin = new System.Windows.Forms.Padding(2); B_OpenMedalsEditor.Name = "B_OpenMedalsEditor"; - B_OpenMedalsEditor.Size = new System.Drawing.Size(96, 32); + B_OpenMedalsEditor.Size = new System.Drawing.Size(128, 40); B_OpenMedalsEditor.TabIndex = 1; B_OpenMedalsEditor.Text = "Medals"; B_OpenMedalsEditor.UseVisualStyleBackColor = true; @@ -795,10 +815,10 @@ private void InitializeComponent() // // B_OpenChatterEditor // - B_OpenChatterEditor.Location = new System.Drawing.Point(108, 284); - B_OpenChatterEditor.Margin = new System.Windows.Forms.Padding(4); + B_OpenChatterEditor.Location = new System.Drawing.Point(266, 398); + B_OpenChatterEditor.Margin = new System.Windows.Forms.Padding(2); B_OpenChatterEditor.Name = "B_OpenChatterEditor"; - B_OpenChatterEditor.Size = new System.Drawing.Size(96, 32); + B_OpenChatterEditor.Size = new System.Drawing.Size(128, 40); B_OpenChatterEditor.TabIndex = 1; B_OpenChatterEditor.Text = "Chatter"; B_OpenChatterEditor.UseVisualStyleBackColor = true; @@ -806,10 +826,10 @@ private void InitializeComponent() // // B_Roamer // - B_Roamer.Location = new System.Drawing.Point(212, 284); - B_Roamer.Margin = new System.Windows.Forms.Padding(4); + B_Roamer.Location = new System.Drawing.Point(2, 442); + B_Roamer.Margin = new System.Windows.Forms.Padding(2); B_Roamer.Name = "B_Roamer"; - B_Roamer.Size = new System.Drawing.Size(96, 32); + B_Roamer.Size = new System.Drawing.Size(128, 40); B_Roamer.TabIndex = 1; B_Roamer.Text = "Roamer"; B_Roamer.UseVisualStyleBackColor = true; @@ -817,10 +837,10 @@ private void InitializeComponent() // // B_FestivalPlaza // - B_FestivalPlaza.Location = new System.Drawing.Point(316, 284); - B_FestivalPlaza.Margin = new System.Windows.Forms.Padding(4); + B_FestivalPlaza.Location = new System.Drawing.Point(134, 442); + B_FestivalPlaza.Margin = new System.Windows.Forms.Padding(2); B_FestivalPlaza.Name = "B_FestivalPlaza"; - B_FestivalPlaza.Size = new System.Drawing.Size(96, 32); + B_FestivalPlaza.Size = new System.Drawing.Size(128, 40); B_FestivalPlaza.TabIndex = 1; B_FestivalPlaza.Text = "Festival Plaza"; B_FestivalPlaza.UseVisualStyleBackColor = true; @@ -828,10 +848,10 @@ private void InitializeComponent() // // B_MailBox // - B_MailBox.Location = new System.Drawing.Point(4, 324); - B_MailBox.Margin = new System.Windows.Forms.Padding(4); + B_MailBox.Location = new System.Drawing.Point(266, 442); + B_MailBox.Margin = new System.Windows.Forms.Padding(2); B_MailBox.Name = "B_MailBox"; - B_MailBox.Size = new System.Drawing.Size(96, 32); + B_MailBox.Size = new System.Drawing.Size(128, 40); B_MailBox.TabIndex = 1; B_MailBox.Text = "Mail Box"; B_MailBox.UseVisualStyleBackColor = true; @@ -839,10 +859,10 @@ private void InitializeComponent() // // B_OpenApricorn // - B_OpenApricorn.Location = new System.Drawing.Point(108, 324); - B_OpenApricorn.Margin = new System.Windows.Forms.Padding(4); + B_OpenApricorn.Location = new System.Drawing.Point(2, 486); + B_OpenApricorn.Margin = new System.Windows.Forms.Padding(2); B_OpenApricorn.Name = "B_OpenApricorn"; - B_OpenApricorn.Size = new System.Drawing.Size(96, 32); + B_OpenApricorn.Size = new System.Drawing.Size(128, 40); B_OpenApricorn.TabIndex = 1; B_OpenApricorn.Text = "Apricorns"; B_OpenApricorn.UseVisualStyleBackColor = true; @@ -850,10 +870,10 @@ private void InitializeComponent() // // B_Raids // - B_Raids.Location = new System.Drawing.Point(212, 324); - B_Raids.Margin = new System.Windows.Forms.Padding(4); + B_Raids.Location = new System.Drawing.Point(134, 486); + B_Raids.Margin = new System.Windows.Forms.Padding(2); B_Raids.Name = "B_Raids"; - B_Raids.Size = new System.Drawing.Size(96, 32); + B_Raids.Size = new System.Drawing.Size(128, 40); B_Raids.TabIndex = 1; B_Raids.Text = "Raids"; B_Raids.UseVisualStyleBackColor = true; @@ -861,10 +881,10 @@ private void InitializeComponent() // // B_RaidsDLC1 // - B_RaidsDLC1.Location = new System.Drawing.Point(316, 324); - B_RaidsDLC1.Margin = new System.Windows.Forms.Padding(4); + B_RaidsDLC1.Location = new System.Drawing.Point(266, 486); + B_RaidsDLC1.Margin = new System.Windows.Forms.Padding(2); B_RaidsDLC1.Name = "B_RaidsDLC1"; - B_RaidsDLC1.Size = new System.Drawing.Size(96, 32); + B_RaidsDLC1.Size = new System.Drawing.Size(128, 40); B_RaidsDLC1.TabIndex = 2; B_RaidsDLC1.Text = "Raids (DLC 1)"; B_RaidsDLC1.UseVisualStyleBackColor = true; @@ -872,10 +892,10 @@ private void InitializeComponent() // // B_RaidsDLC2 // - B_RaidsDLC2.Location = new System.Drawing.Point(4, 364); - B_RaidsDLC2.Margin = new System.Windows.Forms.Padding(4); + B_RaidsDLC2.Location = new System.Drawing.Point(2, 530); + B_RaidsDLC2.Margin = new System.Windows.Forms.Padding(2); B_RaidsDLC2.Name = "B_RaidsDLC2"; - B_RaidsDLC2.Size = new System.Drawing.Size(96, 32); + B_RaidsDLC2.Size = new System.Drawing.Size(128, 40); B_RaidsDLC2.TabIndex = 4; B_RaidsDLC2.Text = "Raids (DLC 2)"; B_RaidsDLC2.UseVisualStyleBackColor = true; @@ -883,10 +903,10 @@ private void InitializeComponent() // // B_Blocks // - B_Blocks.Location = new System.Drawing.Point(108, 364); - B_Blocks.Margin = new System.Windows.Forms.Padding(4); + B_Blocks.Location = new System.Drawing.Point(134, 530); + B_Blocks.Margin = new System.Windows.Forms.Padding(2); B_Blocks.Name = "B_Blocks"; - B_Blocks.Size = new System.Drawing.Size(96, 32); + B_Blocks.Size = new System.Drawing.Size(128, 40); B_Blocks.TabIndex = 1; B_Blocks.Text = "Block Data"; B_Blocks.UseVisualStyleBackColor = true; @@ -894,10 +914,10 @@ private void InitializeComponent() // // B_OtherSlots // - B_OtherSlots.Location = new System.Drawing.Point(212, 364); - B_OtherSlots.Margin = new System.Windows.Forms.Padding(4); + B_OtherSlots.Location = new System.Drawing.Point(266, 530); + B_OtherSlots.Margin = new System.Windows.Forms.Padding(2); B_OtherSlots.Name = "B_OtherSlots"; - B_OtherSlots.Size = new System.Drawing.Size(96, 32); + B_OtherSlots.Size = new System.Drawing.Size(128, 40); B_OtherSlots.TabIndex = 3; B_OtherSlots.Text = "Other Slots"; B_OtherSlots.UseVisualStyleBackColor = true; @@ -905,10 +925,10 @@ private void InitializeComponent() // // B_OpenSealStickers // - B_OpenSealStickers.Location = new System.Drawing.Point(316, 364); - B_OpenSealStickers.Margin = new System.Windows.Forms.Padding(4); + B_OpenSealStickers.Location = new System.Drawing.Point(2, 574); + B_OpenSealStickers.Margin = new System.Windows.Forms.Padding(2); B_OpenSealStickers.Name = "B_OpenSealStickers"; - B_OpenSealStickers.Size = new System.Drawing.Size(96, 32); + B_OpenSealStickers.Size = new System.Drawing.Size(128, 40); B_OpenSealStickers.TabIndex = 5; B_OpenSealStickers.Text = "Seal Stickers"; B_OpenSealStickers.UseVisualStyleBackColor = true; @@ -916,10 +936,10 @@ private void InitializeComponent() // // B_Poffins // - B_Poffins.Location = new System.Drawing.Point(4, 404); - B_Poffins.Margin = new System.Windows.Forms.Padding(4); + B_Poffins.Location = new System.Drawing.Point(134, 574); + B_Poffins.Margin = new System.Windows.Forms.Padding(2); B_Poffins.Name = "B_Poffins"; - B_Poffins.Size = new System.Drawing.Size(96, 32); + B_Poffins.Size = new System.Drawing.Size(128, 40); B_Poffins.TabIndex = 6; B_Poffins.Text = "Poffins"; B_Poffins.UseVisualStyleBackColor = true; @@ -927,10 +947,10 @@ private void InitializeComponent() // // B_RaidsSevenStar // - B_RaidsSevenStar.Location = new System.Drawing.Point(108, 404); - B_RaidsSevenStar.Margin = new System.Windows.Forms.Padding(4); + B_RaidsSevenStar.Location = new System.Drawing.Point(266, 574); + B_RaidsSevenStar.Margin = new System.Windows.Forms.Padding(2); B_RaidsSevenStar.Name = "B_RaidsSevenStar"; - B_RaidsSevenStar.Size = new System.Drawing.Size(96, 32); + B_RaidsSevenStar.Size = new System.Drawing.Size(128, 40); B_RaidsSevenStar.TabIndex = 7; B_RaidsSevenStar.Text = "Raids (7 Star)"; B_RaidsSevenStar.UseVisualStyleBackColor = true; @@ -938,10 +958,10 @@ private void InitializeComponent() // // B_OpenBattlePass // - B_OpenBattlePass.Location = new System.Drawing.Point(212, 404); - B_OpenBattlePass.Margin = new System.Windows.Forms.Padding(4); + B_OpenBattlePass.Location = new System.Drawing.Point(2, 618); + B_OpenBattlePass.Margin = new System.Windows.Forms.Padding(2); B_OpenBattlePass.Name = "B_OpenBattlePass"; - B_OpenBattlePass.Size = new System.Drawing.Size(96, 32); + B_OpenBattlePass.Size = new System.Drawing.Size(128, 40); B_OpenBattlePass.TabIndex = 8; B_OpenBattlePass.Text = "Battle Passes"; B_OpenBattlePass.UseVisualStyleBackColor = true; @@ -949,10 +969,10 @@ private void InitializeComponent() // // B_OpenGear // - B_OpenGear.Location = new System.Drawing.Point(316, 404); - B_OpenGear.Margin = new System.Windows.Forms.Padding(4); + B_OpenGear.Location = new System.Drawing.Point(134, 618); + B_OpenGear.Margin = new System.Windows.Forms.Padding(2); B_OpenGear.Name = "B_OpenGear"; - B_OpenGear.Size = new System.Drawing.Size(96, 32); + B_OpenGear.Size = new System.Drawing.Size(128, 40); B_OpenGear.TabIndex = 9; B_OpenGear.Text = "Gear"; B_OpenGear.UseVisualStyleBackColor = true; @@ -960,36 +980,52 @@ private void InitializeComponent() // // B_OpenFashion // - B_OpenFashion.Location = new System.Drawing.Point(4, 444); - B_OpenFashion.Margin = new System.Windows.Forms.Padding(4); + B_OpenFashion.Location = new System.Drawing.Point(266, 618); + B_OpenFashion.Margin = new System.Windows.Forms.Padding(2); B_OpenFashion.Name = "B_OpenFashion"; - B_OpenFashion.Size = new System.Drawing.Size(96, 32); + B_OpenFashion.Size = new System.Drawing.Size(128, 40); B_OpenFashion.TabIndex = 10; B_OpenFashion.Text = "Fashion"; B_OpenFashion.UseVisualStyleBackColor = true; B_OpenFashion.Click += B_OpenFashion_Click; // + // B_OpenGlobalLink + // + B_OpenGlobalLink.Location = new System.Drawing.Point(2, 662); + B_OpenGlobalLink.Margin = new System.Windows.Forms.Padding(2); + B_OpenGlobalLink.Name = "B_OpenGlobalLink"; + B_OpenGlobalLink.Size = new System.Drawing.Size(128, 40); + B_OpenGlobalLink.TabIndex = 12; + B_OpenGlobalLink.Text = "Global Link"; + B_OpenGlobalLink.UseVisualStyleBackColor = true; + B_OpenGlobalLink.Click += B_OpenGlobalLink_Click; + // // FLP_SAVToolsMisc // + FLP_SAVToolsMisc.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + TLP_SAVEditor.SetColumnSpan(FLP_SAVToolsMisc, 2); FLP_SAVToolsMisc.Controls.Add(B_SaveBoxBin); FLP_SAVToolsMisc.Controls.Add(B_VerifyCHK); FLP_SAVToolsMisc.Controls.Add(B_VerifySaveEntities); FLP_SAVToolsMisc.Controls.Add(Menu_ExportBAK); FLP_SAVToolsMisc.Controls.Add(B_JPEG); FLP_SAVToolsMisc.Controls.Add(B_ConvertKorean); - FLP_SAVToolsMisc.Dock = System.Windows.Forms.DockStyle.Top; + FLP_SAVToolsMisc.Dock = System.Windows.Forms.DockStyle.Fill; FLP_SAVToolsMisc.Location = new System.Drawing.Point(0, 0); FLP_SAVToolsMisc.Margin = new System.Windows.Forms.Padding(0); FLP_SAVToolsMisc.Name = "FLP_SAVToolsMisc"; - FLP_SAVToolsMisc.Size = new System.Drawing.Size(441, 52); + FLP_SAVToolsMisc.Size = new System.Drawing.Size(441, 54); FLP_SAVToolsMisc.TabIndex = 104; // // B_SaveBoxBin // + B_SaveBoxBin.AutoSize = true; + B_SaveBoxBin.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + B_SaveBoxBin.Dock = System.Windows.Forms.DockStyle.Fill; B_SaveBoxBin.Location = new System.Drawing.Point(0, 0); B_SaveBoxBin.Margin = new System.Windows.Forms.Padding(0); B_SaveBoxBin.Name = "B_SaveBoxBin"; - B_SaveBoxBin.Size = new System.Drawing.Size(88, 48); + B_SaveBoxBin.Size = new System.Drawing.Size(119, 27); B_SaveBoxBin.TabIndex = 1; B_SaveBoxBin.Text = "Save Box Data++"; B_SaveBoxBin.UseVisualStyleBackColor = true; @@ -997,10 +1033,13 @@ private void InitializeComponent() // // B_VerifyCHK // - B_VerifyCHK.Location = new System.Drawing.Point(88, 0); + B_VerifyCHK.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + B_VerifyCHK.AutoSize = true; + B_VerifyCHK.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + B_VerifyCHK.Location = new System.Drawing.Point(119, 0); B_VerifyCHK.Margin = new System.Windows.Forms.Padding(0); B_VerifyCHK.Name = "B_VerifyCHK"; - B_VerifyCHK.Size = new System.Drawing.Size(88, 48); + B_VerifyCHK.Size = new System.Drawing.Size(118, 27); B_VerifyCHK.TabIndex = 2; B_VerifyCHK.Text = "Verify Checksums"; B_VerifyCHK.UseVisualStyleBackColor = true; @@ -1008,10 +1047,12 @@ private void InitializeComponent() // // B_VerifySaveEntities // - B_VerifySaveEntities.Location = new System.Drawing.Point(176, 0); + B_VerifySaveEntities.AutoSize = true; + B_VerifySaveEntities.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + B_VerifySaveEntities.Location = new System.Drawing.Point(237, 0); B_VerifySaveEntities.Margin = new System.Windows.Forms.Padding(0); B_VerifySaveEntities.Name = "B_VerifySaveEntities"; - B_VerifySaveEntities.Size = new System.Drawing.Size(88, 48); + B_VerifySaveEntities.Size = new System.Drawing.Size(105, 27); B_VerifySaveEntities.TabIndex = 3; B_VerifySaveEntities.Text = "Verify All PKMs"; B_VerifySaveEntities.UseVisualStyleBackColor = true; @@ -1019,10 +1060,12 @@ private void InitializeComponent() // // Menu_ExportBAK // - Menu_ExportBAK.Location = new System.Drawing.Point(264, 0); + Menu_ExportBAK.AutoSize = true; + Menu_ExportBAK.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + Menu_ExportBAK.Location = new System.Drawing.Point(0, 27); Menu_ExportBAK.Margin = new System.Windows.Forms.Padding(0); Menu_ExportBAK.Name = "Menu_ExportBAK"; - Menu_ExportBAK.Size = new System.Drawing.Size(88, 48); + Menu_ExportBAK.Size = new System.Drawing.Size(101, 27); Menu_ExportBAK.TabIndex = 4; Menu_ExportBAK.Text = "Export Backup"; Menu_ExportBAK.UseVisualStyleBackColor = true; @@ -1030,10 +1073,12 @@ private void InitializeComponent() // // B_JPEG // - B_JPEG.Location = new System.Drawing.Point(352, 0); + B_JPEG.AutoSize = true; + B_JPEG.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + B_JPEG.Location = new System.Drawing.Point(101, 27); B_JPEG.Margin = new System.Windows.Forms.Padding(0); B_JPEG.Name = "B_JPEG"; - B_JPEG.Size = new System.Drawing.Size(88, 48); + B_JPEG.Size = new System.Drawing.Size(106, 27); B_JPEG.TabIndex = 5; B_JPEG.Text = "Save PGL .JPEG"; B_JPEG.UseVisualStyleBackColor = true; @@ -1041,44 +1086,39 @@ private void InitializeComponent() // // B_ConvertKorean // - B_ConvertKorean.Location = new System.Drawing.Point(0, 48); + B_ConvertKorean.AutoSize = true; + B_ConvertKorean.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + B_ConvertKorean.Location = new System.Drawing.Point(207, 27); B_ConvertKorean.Margin = new System.Windows.Forms.Padding(0); B_ConvertKorean.Name = "B_ConvertKorean"; - B_ConvertKorean.Size = new System.Drawing.Size(88, 48); + B_ConvertKorean.Size = new System.Drawing.Size(160, 27); B_ConvertKorean.TabIndex = 6; B_ConvertKorean.Text = "Korean Save Conversion"; B_ConvertKorean.UseVisualStyleBackColor = true; B_ConvertKorean.Click += B_ConvertKorean_Click; // - // CB_SaveSlot - // - CB_SaveSlot.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - CB_SaveSlot.FormattingEnabled = true; - CB_SaveSlot.Location = new System.Drawing.Point(152, 144); - CB_SaveSlot.Name = "CB_SaveSlot"; - CB_SaveSlot.Size = new System.Drawing.Size(121, 25); - CB_SaveSlot.TabIndex = 20; - CB_SaveSlot.SelectedIndexChanged += UpdateSaveSlot; - // // L_SaveSlot // - L_SaveSlot.Location = new System.Drawing.Point(32, 144); + L_SaveSlot.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_SaveSlot.AutoSize = true; + L_SaveSlot.Location = new System.Drawing.Point(3, 65); L_SaveSlot.Name = "L_SaveSlot"; - L_SaveSlot.Size = new System.Drawing.Size(120, 24); + L_SaveSlot.Padding = new System.Windows.Forms.Padding(24, 0, 0, 0); + L_SaveSlot.Size = new System.Drawing.Size(88, 17); L_SaveSlot.TabIndex = 19; L_SaveSlot.Text = "Save Slot:"; L_SaveSlot.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // - // B_OpenGlobalLink + // CB_SaveSlot // - B_OpenGlobalLink.Location = new System.Drawing.Point(108, 444); - B_OpenGlobalLink.Margin = new System.Windows.Forms.Padding(4); - B_OpenGlobalLink.Name = "B_OpenGlobalLink"; - B_OpenGlobalLink.Size = new System.Drawing.Size(96, 32); - B_OpenGlobalLink.TabIndex = 12; - B_OpenGlobalLink.Text = "Global Link"; - B_OpenGlobalLink.UseVisualStyleBackColor = true; - B_OpenGlobalLink.Click += B_OpenGlobalLink_Click; + CB_SaveSlot.Anchor = System.Windows.Forms.AnchorStyles.Left; + CB_SaveSlot.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CB_SaveSlot.FormattingEnabled = true; + CB_SaveSlot.Location = new System.Drawing.Point(97, 61); + CB_SaveSlot.Name = "CB_SaveSlot"; + CB_SaveSlot.Size = new System.Drawing.Size(121, 25); + CB_SaveSlot.TabIndex = 20; + CB_SaveSlot.SelectedIndexChanged += UpdateSaveSlot; // // SAVEditor // @@ -1098,8 +1138,11 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)dcpkx2).EndInit(); ((System.ComponentModel.ISupportInitialize)dcpkx1).EndInit(); Tab_SAV.ResumeLayout(false); + TLP_SAVEditor.ResumeLayout(false); + TLP_SAVEditor.PerformLayout(); FLP_SAVtools.ResumeLayout(false); FLP_SAVToolsMisc.ResumeLayout(false); + FLP_SAVToolsMisc.PerformLayout(); ResumeLayout(false); } @@ -1187,5 +1230,6 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem Menu_PopoutBoxSingle; private System.Windows.Forms.ToolStripMenuItem Menu_PopoutBoxAll; private System.Windows.Forms.Button B_OpenGlobalLink; + private System.Windows.Forms.TableLayoutPanel TLP_SAVEditor; } } From 8cb7a133c5ca8ad74a6f092941e1832c63f1283c Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 7 Jun 2026 17:14:24 -0500 Subject: [PATCH 67/81] pk3.Korean always false even if language ID is hacked to Korean, don't return true (since it doesn't exist). --- PKHeX.Core/PKM/Shared/G3PKM.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PKHeX.Core/PKM/Shared/G3PKM.cs b/PKHeX.Core/PKM/Shared/G3PKM.cs index 27922cae3..1042c3ede 100644 --- a/PKHeX.Core/PKM/Shared/G3PKM.cs +++ b/PKHeX.Core/PKM/Shared/G3PKM.cs @@ -28,7 +28,7 @@ public abstract class G3PKM : PKM, IRibbonSetEvent3, IRibbonSetCommon3, IRibbonS // Generated Attributes public sealed override uint PSV => ((PID >> 16) ^ (PID & 0xFFFF)) >> 3; public sealed override uint TSV => (uint)(TID16 ^ SID16) >> 3; - public sealed override bool Japanese => Language == (int)LanguageID.Japanese; + public sealed override bool Korean => false; public sealed override int Ability { get => PersonalInfo.GetAbility(AbilityBit); set { } } public sealed override uint EncryptionConstant { get => PID; set { } } From 9eb5b4737df333a071b8a3fbb299b506d4bc6c80 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 7 Jun 2026 17:14:36 -0500 Subject: [PATCH 68/81] gen5: musical prop unlocks as list --- PKHeX.WinForms/Resources/text/lang_de.txt | 1 - PKHeX.WinForms/Resources/text/lang_en.txt | 1 - PKHeX.WinForms/Resources/text/lang_es-419.txt | 1 - PKHeX.WinForms/Resources/text/lang_es.txt | 1 - PKHeX.WinForms/Resources/text/lang_fr.txt | 1 - PKHeX.WinForms/Resources/text/lang_it.txt | 1 - PKHeX.WinForms/Resources/text/lang_ja.txt | 1 - PKHeX.WinForms/Resources/text/lang_ko.txt | 1 - .../Resources/text/lang_zh-Hans.txt | 1 - .../Resources/text/lang_zh-Hant.txt | 1 - .../Save Editors/Gen5/SAV_Misc5.Designer.cs | 213 ++++++++---------- .../Subforms/Save Editors/Gen5/SAV_Misc5.cs | 18 +- 12 files changed, 107 insertions(+), 134 deletions(-) diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index 5e5f3cf9c..dd17ecf47 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -1748,7 +1748,6 @@ SAV_Misc5.CHK_Invisible=Unsichtbar SAV_Misc5.CHK_LibertyPass=Aktiviere Gartenpass SAV_Misc5.CHK_MultiFriendsSet=Freunde SAV_Misc5.CHK_MultiNPCSet=NPC -SAV_Misc5.CHK_PropObtained=Erhalten SAV_Misc5.CHK_SingleSet=Einzel SAV_Misc5.CHK_Subway0=Flag0 SAV_Misc5.CHK_Subway1=Flag1 diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index 6f21d79f8..52e08a79c 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -1748,7 +1748,6 @@ SAV_Misc5.CHK_Invisible=Invisible SAV_Misc5.CHK_LibertyPass=Activate LibertyPass SAV_Misc5.CHK_MultiFriendsSet=Friends SAV_Misc5.CHK_MultiNPCSet=NPC -SAV_Misc5.CHK_PropObtained=Obtained SAV_Misc5.CHK_SingleSet=Single SAV_Misc5.CHK_Subway0=Flag0 SAV_Misc5.CHK_Subway1=Flag1 diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index 7624076db..45ce7058e 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -1748,7 +1748,6 @@ SAV_Misc5.CHK_Invisible=Invisible SAV_Misc5.CHK_LibertyPass=Activar Ticket Libertad SAV_Misc5.CHK_MultiFriendsSet=Amigos SAV_Misc5.CHK_MultiNPCSet=PNJ -SAV_Misc5.CHK_PropObtained=Obtenido SAV_Misc5.CHK_SingleSet=Individual SAV_Misc5.CHK_Subway0=Flag0 SAV_Misc5.CHK_Subway1=Flag1 diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index df8e9c780..3916c07f2 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -1748,7 +1748,6 @@ SAV_Misc5.CHK_Invisible=Invisible SAV_Misc5.CHK_LibertyPass=Activar Ticket Libertad SAV_Misc5.CHK_MultiFriendsSet=Amigos SAV_Misc5.CHK_MultiNPCSet=PNJ -SAV_Misc5.CHK_PropObtained=Obtenido SAV_Misc5.CHK_SingleSet=Individual SAV_Misc5.CHK_Subway0=Flag0 SAV_Misc5.CHK_Subway1=Flag1 diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index 226718e2d..27591e0ff 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -1748,7 +1748,6 @@ SAV_Misc5.CHK_Invisible=Invisible SAV_Misc5.CHK_LibertyPass=Activer le Pass Liberté SAV_Misc5.CHK_MultiFriendsSet=Ami SAV_Misc5.CHK_MultiNPCSet=PNJ -SAV_Misc5.CHK_PropObtained=Obtenu SAV_Misc5.CHK_SingleSet=Solo SAV_Misc5.CHK_Subway0=Drp.0 SAV_Misc5.CHK_Subway1=Drp.1 diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index d721fabbb..d68e76e14 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -1748,7 +1748,6 @@ SAV_Misc5.CHK_Invisible=Invisibile SAV_Misc5.CHK_LibertyPass=Attiva LiberTicket SAV_Misc5.CHK_MultiFriendsSet=Amici SAV_Misc5.CHK_MultiNPCSet=NPC -SAV_Misc5.CHK_PropObtained=Ottenuto SAV_Misc5.CHK_SingleSet=Singole SAV_Misc5.CHK_Subway0=Flag0 SAV_Misc5.CHK_Subway1=Flag1 diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index 7bf079fff..d3acb5f88 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -1748,7 +1748,6 @@ SAV_Misc5.CHK_Invisible=不可視 SAV_Misc5.CHK_LibertyPass=リバティチケット 有効化 SAV_Misc5.CHK_MultiFriendsSet=フレンド SAV_Misc5.CHK_MultiNPCSet=NPC -SAV_Misc5.CHK_PropObtained=獲得 SAV_Misc5.CHK_SingleSet=シングル SAV_Misc5.CHK_Subway0=Flag0 SAV_Misc5.CHK_Subway1=Flag1 diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index 0065d6712..587acc05b 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -1748,7 +1748,6 @@ SAV_Misc5.CHK_Invisible=투명 SAV_Misc5.CHK_LibertyPass=리버티티켓 활성화 SAV_Misc5.CHK_MultiFriendsSet=친구 SAV_Misc5.CHK_MultiNPCSet=NPC -SAV_Misc5.CHK_PropObtained=획득함 SAV_Misc5.CHK_SingleSet=싱글 SAV_Misc5.CHK_Subway0=플래그0 SAV_Misc5.CHK_Subway1=플래그1 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index 3c1b8bf86..6d44158ab 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -1748,7 +1748,6 @@ SAV_Misc5.CHK_Invisible=隐性 SAV_Misc5.CHK_LibertyPass=激活自由船票 SAV_Misc5.CHK_MultiFriendsSet=朋友 SAV_Misc5.CHK_MultiNPCSet=NPC -SAV_Misc5.CHK_PropObtained=获得 SAV_Misc5.CHK_SingleSet=单打 SAV_Misc5.CHK_Subway0=旗帜0 SAV_Misc5.CHK_Subway1=旗帜1 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index f4cb83a5e..0ffc5d6fe 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -1748,7 +1748,6 @@ SAV_Misc5.CHK_Invisible=隱性 SAV_Misc5.CHK_LibertyPass=啟動自由船票 SAV_Misc5.CHK_MultiFriendsSet=朋友 SAV_Misc5.CHK_MultiNPCSet=NPC -SAV_Misc5.CHK_PropObtained=獲得 SAV_Misc5.CHK_SingleSet=單打 SAV_Misc5.CHK_Subway0=旗幟0 SAV_Misc5.CHK_Subway1=旗幟1 diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.Designer.cs index c19702e9b..e350728a5 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.Designer.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.Designer.cs @@ -182,9 +182,8 @@ private void InitializeComponent() B_ImportFC = new System.Windows.Forms.Button(); B_DumpFC = new System.Windows.Forms.Button(); TAB_Muscial = new System.Windows.Forms.TabPage(); + CLB_MusicalProps = new System.Windows.Forms.CheckedListBox(); B_UnlockAllProps = new System.Windows.Forms.Button(); - CHK_PropObtained = new System.Windows.Forms.CheckBox(); - CB_Prop = new System.Windows.Forms.ComboBox(); TipExpB = new System.Windows.Forms.ToolTip(components); TipExpW = new System.Windows.Forms.ToolTip(components); TC_Misc.SuspendLayout(); @@ -302,11 +301,11 @@ private void InitializeComponent() TAB_Main.Controls.Add(CHK_LibertyPass); TAB_Main.Controls.Add(GB_Roamer); TAB_Main.Controls.Add(GB_FlyDest); - TAB_Main.Location = new System.Drawing.Point(4, 24); + TAB_Main.Location = new System.Drawing.Point(4, 26); TAB_Main.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); TAB_Main.Name = "TAB_Main"; TAB_Main.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); - TAB_Main.Size = new System.Drawing.Size(390, 338); + TAB_Main.Size = new System.Drawing.Size(390, 336); TAB_Main.TabIndex = 0; TAB_Main.Text = "Main"; TAB_Main.UseVisualStyleBackColor = true; @@ -356,14 +355,14 @@ private void InitializeComponent() NUD_Record32V.Location = new System.Drawing.Point(263, 279); NUD_Record32V.Maximum = new decimal(new int[] { -1, 0, 0, 0 }); NUD_Record32V.Name = "NUD_Record32V"; - NUD_Record32V.Size = new System.Drawing.Size(120, 23); + NUD_Record32V.Size = new System.Drawing.Size(120, 25); NUD_Record32V.TabIndex = 8; // // NUD_Record32 // NUD_Record32.Location = new System.Drawing.Point(263, 254); NUD_Record32.Name = "NUD_Record32"; - NUD_Record32.Size = new System.Drawing.Size(120, 23); + NUD_Record32.Size = new System.Drawing.Size(120, 25); NUD_Record32.TabIndex = 7; // // NUD_Record16V @@ -371,14 +370,14 @@ private void InitializeComponent() NUD_Record16V.Location = new System.Drawing.Point(263, 225); NUD_Record16V.Maximum = new decimal(new int[] { 65535, 0, 0, 0 }); NUD_Record16V.Name = "NUD_Record16V"; - NUD_Record16V.Size = new System.Drawing.Size(120, 23); + NUD_Record16V.Size = new System.Drawing.Size(120, 25); NUD_Record16V.TabIndex = 6; // // NUD_Record16 // NUD_Record16.Location = new System.Drawing.Point(263, 200); NUD_Record16.Name = "NUD_Record16"; - NUD_Record16.Size = new System.Drawing.Size(120, 23); + NUD_Record16.Size = new System.Drawing.Size(120, 25); NUD_Record16.TabIndex = 5; // // GB_KeySystem @@ -414,17 +413,17 @@ private void InitializeComponent() CLB_KeySystem.Location = new System.Drawing.Point(7, 59); CLB_KeySystem.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CLB_KeySystem.Name = "CLB_KeySystem"; - CLB_KeySystem.Size = new System.Drawing.Size(149, 58); + CLB_KeySystem.Size = new System.Drawing.Size(149, 44); CLB_KeySystem.TabIndex = 1; // // CHK_LibertyPass // CHK_LibertyPass.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; CHK_LibertyPass.AutoSize = true; - CHK_LibertyPass.Location = new System.Drawing.Point(189, 149); + CHK_LibertyPass.Location = new System.Drawing.Point(179, 149); CHK_LibertyPass.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CHK_LibertyPass.Name = "CHK_LibertyPass"; - CHK_LibertyPass.Size = new System.Drawing.Size(131, 19); + CHK_LibertyPass.Size = new System.Drawing.Size(141, 21); CHK_LibertyPass.TabIndex = 4; CHK_LibertyPass.Text = "Activate LibertyPass"; CHK_LibertyPass.UseVisualStyleBackColor = true; @@ -455,7 +454,7 @@ private void InitializeComponent() CB_RoamStatus.Location = new System.Drawing.Point(93, 88); CB_RoamStatus.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CB_RoamStatus.Name = "CB_RoamStatus"; - CB_RoamStatus.Size = new System.Drawing.Size(101, 23); + CB_RoamStatus.Size = new System.Drawing.Size(101, 25); CB_RoamStatus.TabIndex = 5; // // L_RoamStatus @@ -496,7 +495,7 @@ private void InitializeComponent() CB_Roamer642.Location = new System.Drawing.Point(93, 55); CB_Roamer642.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CB_Roamer642.Name = "CB_Roamer642"; - CB_Roamer642.Size = new System.Drawing.Size(101, 23); + CB_Roamer642.Size = new System.Drawing.Size(101, 25); CB_Roamer642.TabIndex = 3; // // CB_Roamer641 @@ -507,7 +506,7 @@ private void InitializeComponent() CB_Roamer641.Location = new System.Drawing.Point(93, 23); CB_Roamer641.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CB_Roamer641.Name = "CB_Roamer641"; - CB_Roamer641.Size = new System.Drawing.Size(101, 23); + CB_Roamer641.Size = new System.Drawing.Size(101, 25); CB_Roamer641.TabIndex = 1; // // GB_FlyDest @@ -532,7 +531,7 @@ private void InitializeComponent() CLB_FlyDest.Location = new System.Drawing.Point(7, 59); CLB_FlyDest.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CLB_FlyDest.Name = "CLB_FlyDest"; - CLB_FlyDest.Size = new System.Drawing.Size(149, 58); + CLB_FlyDest.Size = new System.Drawing.Size(149, 44); CLB_FlyDest.TabIndex = 1; // // B_AllFlyDest @@ -552,10 +551,10 @@ private void InitializeComponent() TAB_Entralink.Controls.Add(GB_EntreeLevel); TAB_Entralink.Controls.Add(GB_FunfestMissions); TAB_Entralink.Controls.Add(GB_PassPowers); - TAB_Entralink.Location = new System.Drawing.Point(4, 24); + TAB_Entralink.Location = new System.Drawing.Point(4, 26); TAB_Entralink.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); TAB_Entralink.Name = "TAB_Entralink"; - TAB_Entralink.Size = new System.Drawing.Size(390, 338); + TAB_Entralink.Size = new System.Drawing.Size(390, 336); TAB_Entralink.TabIndex = 1; TAB_Entralink.Text = "Entralink"; TAB_Entralink.UseVisualStyleBackColor = true; @@ -604,7 +603,7 @@ private void InitializeComponent() NUD_FMHosted.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); NUD_FMHosted.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_FMHosted.Name = "NUD_FMHosted"; - NUD_FMHosted.Size = new System.Drawing.Size(57, 23); + NUD_FMHosted.Size = new System.Drawing.Size(57, 25); NUD_FMHosted.TabIndex = 4; NUD_FMHosted.Value = new decimal(new int[] { 9999, 0, 0, 0 }); // @@ -624,7 +623,7 @@ private void InitializeComponent() NUD_FMMostParticipants.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); NUD_FMMostParticipants.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); NUD_FMMostParticipants.Name = "NUD_FMMostParticipants"; - NUD_FMMostParticipants.Size = new System.Drawing.Size(50, 23); + NUD_FMMostParticipants.Size = new System.Drawing.Size(50, 25); NUD_FMMostParticipants.TabIndex = 12; NUD_FMMostParticipants.Value = new decimal(new int[] { 255, 0, 0, 0 }); // @@ -634,7 +633,7 @@ private void InitializeComponent() NUD_FMParticipated.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); NUD_FMParticipated.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_FMParticipated.Name = "NUD_FMParticipated"; - NUD_FMParticipated.Size = new System.Drawing.Size(57, 23); + NUD_FMParticipated.Size = new System.Drawing.Size(57, 25); NUD_FMParticipated.TabIndex = 6; NUD_FMParticipated.Value = new decimal(new int[] { 9999, 0, 0, 0 }); // @@ -654,7 +653,7 @@ private void InitializeComponent() NUD_FMCompleted.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); NUD_FMCompleted.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_FMCompleted.Name = "NUD_FMCompleted"; - NUD_FMCompleted.Size = new System.Drawing.Size(57, 23); + NUD_FMCompleted.Size = new System.Drawing.Size(57, 25); NUD_FMCompleted.TabIndex = 10; NUD_FMCompleted.Value = new decimal(new int[] { 9999, 0, 0, 0 }); // @@ -664,7 +663,7 @@ private void InitializeComponent() NUD_FMTopScores.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); NUD_FMTopScores.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_FMTopScores.Name = "NUD_FMTopScores"; - NUD_FMTopScores.Size = new System.Drawing.Size(57, 23); + NUD_FMTopScores.Size = new System.Drawing.Size(57, 25); NUD_FMTopScores.TabIndex = 8; NUD_FMTopScores.Value = new decimal(new int[] { 9999, 0, 0, 0 }); // @@ -702,7 +701,7 @@ private void InitializeComponent() NUD_EntreeWhiteEXP.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); NUD_EntreeWhiteEXP.Maximum = new decimal(new int[] { 49, 0, 0, 0 }); NUD_EntreeWhiteEXP.Name = "NUD_EntreeWhiteEXP"; - NUD_EntreeWhiteEXP.Size = new System.Drawing.Size(43, 23); + NUD_EntreeWhiteEXP.Size = new System.Drawing.Size(43, 25); NUD_EntreeWhiteEXP.TabIndex = 5; NUD_EntreeWhiteEXP.Value = new decimal(new int[] { 49, 0, 0, 0 }); NUD_EntreeWhiteEXP.ValueChanged += NUD_EntreeWhiteEXP_ValueChanged; @@ -714,7 +713,7 @@ private void InitializeComponent() NUD_EntreeBlackEXP.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); NUD_EntreeBlackEXP.Maximum = new decimal(new int[] { 49, 0, 0, 0 }); NUD_EntreeBlackEXP.Name = "NUD_EntreeBlackEXP"; - NUD_EntreeBlackEXP.Size = new System.Drawing.Size(43, 23); + NUD_EntreeBlackEXP.Size = new System.Drawing.Size(43, 25); NUD_EntreeBlackEXP.TabIndex = 2; NUD_EntreeBlackEXP.Value = new decimal(new int[] { 49, 0, 0, 0 }); NUD_EntreeBlackEXP.ValueChanged += NUD_EntreeBlackEXP_ValueChanged; @@ -726,7 +725,7 @@ private void InitializeComponent() NUD_EntreeBlackLV.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); NUD_EntreeBlackLV.Maximum = new decimal(new int[] { 999, 0, 0, 0 }); NUD_EntreeBlackLV.Name = "NUD_EntreeBlackLV"; - NUD_EntreeBlackLV.Size = new System.Drawing.Size(50, 23); + NUD_EntreeBlackLV.Size = new System.Drawing.Size(50, 25); NUD_EntreeBlackLV.TabIndex = 1; NUD_EntreeBlackLV.Value = new decimal(new int[] { 999, 0, 0, 0 }); NUD_EntreeBlackLV.ValueChanged += NUD_EntreeBlackLV_ValueChanged; @@ -738,7 +737,7 @@ private void InitializeComponent() NUD_EntreeWhiteLV.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); NUD_EntreeWhiteLV.Maximum = new decimal(new int[] { 999, 0, 0, 0 }); NUD_EntreeWhiteLV.Name = "NUD_EntreeWhiteLV"; - NUD_EntreeWhiteLV.Size = new System.Drawing.Size(50, 23); + NUD_EntreeWhiteLV.Size = new System.Drawing.Size(50, 25); NUD_EntreeWhiteLV.TabIndex = 4; NUD_EntreeWhiteLV.Value = new decimal(new int[] { 999, 0, 0, 0 }); NUD_EntreeWhiteLV.ValueChanged += NUD_EntreeWhiteLV_ValueChanged; @@ -838,7 +837,7 @@ private void InitializeComponent() NUD_FMBestScore.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); NUD_FMBestScore.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_FMBestScore.Name = "NUD_FMBestScore"; - NUD_FMBestScore.Size = new System.Drawing.Size(57, 23); + NUD_FMBestScore.Size = new System.Drawing.Size(57, 25); NUD_FMBestScore.TabIndex = 8; NUD_FMBestScore.ValueChanged += ChangeFestaMissionValue; // @@ -849,7 +848,7 @@ private void InitializeComponent() NUD_FMBestTotal.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); NUD_FMBestTotal.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_FMBestTotal.Name = "NUD_FMBestTotal"; - NUD_FMBestTotal.Size = new System.Drawing.Size(57, 23); + NUD_FMBestTotal.Size = new System.Drawing.Size(57, 25); NUD_FMBestTotal.TabIndex = 5; NUD_FMBestTotal.ValueChanged += ChangeFestaMissionValue; // @@ -861,7 +860,7 @@ private void InitializeComponent() CB_FMLevel.Location = new System.Drawing.Point(96, 144); CB_FMLevel.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CB_FMLevel.Name = "CB_FMLevel"; - CB_FMLevel.Size = new System.Drawing.Size(104, 23); + CB_FMLevel.Size = new System.Drawing.Size(104, 25); CB_FMLevel.TabIndex = 3; CB_FMLevel.SelectedIndexChanged += ChangeFestaMissionValue; // @@ -890,11 +889,10 @@ private void InitializeComponent() // LB_FunfestMissions.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; LB_FunfestMissions.FormattingEnabled = true; - LB_FunfestMissions.ItemHeight = 15; LB_FunfestMissions.Location = new System.Drawing.Point(7, 47); LB_FunfestMissions.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); LB_FunfestMissions.Name = "LB_FunfestMissions"; - LB_FunfestMissions.Size = new System.Drawing.Size(193, 94); + LB_FunfestMissions.Size = new System.Drawing.Size(193, 89); LB_FunfestMissions.TabIndex = 1; LB_FunfestMissions.SelectedIndexChanged += LB_FunfestMissions_SelectedIndexChanged; // @@ -920,7 +918,7 @@ private void InitializeComponent() CB_PassPower3.Location = new System.Drawing.Point(7, 75); CB_PassPower3.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CB_PassPower3.Name = "CB_PassPower3"; - CB_PassPower3.Size = new System.Drawing.Size(145, 23); + CB_PassPower3.Size = new System.Drawing.Size(145, 25); CB_PassPower3.TabIndex = 2; // // CB_PassPower2 @@ -931,7 +929,7 @@ private void InitializeComponent() CB_PassPower2.Location = new System.Drawing.Point(7, 47); CB_PassPower2.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CB_PassPower2.Name = "CB_PassPower2"; - CB_PassPower2.Size = new System.Drawing.Size(145, 23); + CB_PassPower2.Size = new System.Drawing.Size(145, 25); CB_PassPower2.TabIndex = 1; // // CB_PassPower1 @@ -942,7 +940,7 @@ private void InitializeComponent() CB_PassPower1.Location = new System.Drawing.Point(7, 20); CB_PassPower1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CB_PassPower1.Name = "CB_PassPower1"; - CB_PassPower1.Size = new System.Drawing.Size(145, 23); + CB_PassPower1.Size = new System.Drawing.Size(145, 25); CB_PassPower1.TabIndex = 0; // // TAB_Forest @@ -965,11 +963,11 @@ private void InitializeComponent() TAB_Forest.Controls.Add(CB_Species); TAB_Forest.Controls.Add(CB_Areas); TAB_Forest.Controls.Add(LB_Slots); - TAB_Forest.Location = new System.Drawing.Point(4, 24); + TAB_Forest.Location = new System.Drawing.Point(4, 26); TAB_Forest.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); TAB_Forest.Name = "TAB_Forest"; TAB_Forest.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); - TAB_Forest.Size = new System.Drawing.Size(390, 338); + TAB_Forest.Size = new System.Drawing.Size(390, 336); TAB_Forest.TabIndex = 2; TAB_Forest.Text = "Forest"; TAB_Forest.UseVisualStyleBackColor = true; @@ -994,7 +992,7 @@ private void InitializeComponent() NUD_Unlocked.Maximum = new decimal(new int[] { 8, 0, 0, 0 }); NUD_Unlocked.Minimum = new decimal(new int[] { 2, 0, 0, 0 }); NUD_Unlocked.Name = "NUD_Unlocked"; - NUD_Unlocked.Size = new System.Drawing.Size(43, 23); + NUD_Unlocked.Size = new System.Drawing.Size(43, 25); NUD_Unlocked.TabIndex = 3; NUD_Unlocked.Value = new decimal(new int[] { 2, 0, 0, 0 }); // @@ -1014,10 +1012,10 @@ private void InitializeComponent() CHK_Area9.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; CHK_Area9.AutoSize = true; CHK_Area9.CheckAlign = System.Drawing.ContentAlignment.MiddleRight; - CHK_Area9.Location = new System.Drawing.Point(266, 68); + CHK_Area9.Location = new System.Drawing.Point(255, 68); CHK_Area9.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CHK_Area9.Name = "CHK_Area9"; - CHK_Area9.Size = new System.Drawing.Size(115, 19); + CHK_Area9.Size = new System.Drawing.Size(126, 21); CHK_Area9.TabIndex = 4; CHK_Area9.Text = "Area 9 Unlocked:"; CHK_Area9.UseVisualStyleBackColor = true; @@ -1037,10 +1035,10 @@ private void InitializeComponent() // CHK_Invisible.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; CHK_Invisible.AutoSize = true; - CHK_Invisible.Location = new System.Drawing.Point(297, 313); + CHK_Invisible.Location = new System.Drawing.Point(293, 313); CHK_Invisible.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CHK_Invisible.Name = "CHK_Invisible"; - CHK_Invisible.Size = new System.Drawing.Size(69, 19); + CHK_Invisible.Size = new System.Drawing.Size(73, 21); CHK_Invisible.TabIndex = 16; CHK_Invisible.Text = "Invisible"; CHK_Invisible.UseVisualStyleBackColor = true; @@ -1064,7 +1062,7 @@ private void InitializeComponent() NUD_Animation.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); NUD_Animation.Maximum = new decimal(new int[] { 5, 0, 0, 0 }); NUD_Animation.Name = "NUD_Animation"; - NUD_Animation.Size = new System.Drawing.Size(43, 23); + NUD_Animation.Size = new System.Drawing.Size(43, 25); NUD_Animation.TabIndex = 15; NUD_Animation.ValueChanged += UpdateSlotValue; // @@ -1087,7 +1085,7 @@ private void InitializeComponent() CB_Gender.Location = new System.Drawing.Point(240, 249); CB_Gender.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CB_Gender.Name = "CB_Gender"; - CB_Gender.Size = new System.Drawing.Size(140, 23); + CB_Gender.Size = new System.Drawing.Size(140, 25); CB_Gender.TabIndex = 11; CB_Gender.SelectedIndexChanged += UpdateSlotValue; // @@ -1133,7 +1131,7 @@ private void InitializeComponent() CB_Move.Location = new System.Drawing.Point(240, 276); CB_Move.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CB_Move.Name = "CB_Move"; - CB_Move.Size = new System.Drawing.Size(140, 23); + CB_Move.Size = new System.Drawing.Size(140, 25); CB_Move.TabIndex = 13; CB_Move.SelectedIndexChanged += UpdateSlotValue; // @@ -1145,7 +1143,7 @@ private void InitializeComponent() CB_Form.Location = new System.Drawing.Point(240, 223); CB_Form.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CB_Form.Name = "CB_Form"; - CB_Form.Size = new System.Drawing.Size(140, 23); + CB_Form.Size = new System.Drawing.Size(140, 25); CB_Form.TabIndex = 9; CB_Form.SelectedIndexChanged += UpdateSlotValue; // @@ -1158,7 +1156,7 @@ private void InitializeComponent() CB_Species.Location = new System.Drawing.Point(240, 196); CB_Species.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CB_Species.Name = "CB_Species"; - CB_Species.Size = new System.Drawing.Size(140, 23); + CB_Species.Size = new System.Drawing.Size(140, 25); CB_Species.TabIndex = 7; CB_Species.SelectedIndexChanged += UpdateSlotValue; // @@ -1170,7 +1168,7 @@ private void InitializeComponent() CB_Areas.Location = new System.Drawing.Point(166, 7); CB_Areas.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); CB_Areas.Name = "CB_Areas"; - CB_Areas.Size = new System.Drawing.Size(215, 23); + CB_Areas.Size = new System.Drawing.Size(215, 25); CB_Areas.TabIndex = 1; CB_Areas.SelectedIndexChanged += ChangeArea; // @@ -1178,11 +1176,10 @@ private void InitializeComponent() // LB_Slots.Dock = System.Windows.Forms.DockStyle.Left; LB_Slots.FormattingEnabled = true; - LB_Slots.ItemHeight = 15; LB_Slots.Location = new System.Drawing.Point(4, 3); LB_Slots.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); LB_Slots.Name = "LB_Slots"; - LB_Slots.Size = new System.Drawing.Size(154, 332); + LB_Slots.Size = new System.Drawing.Size(154, 330); LB_Slots.TabIndex = 0; LB_Slots.SelectedIndexChanged += ChangeSlot; // @@ -1197,11 +1194,11 @@ private void InitializeComponent() TAB_Subway.Controls.Add(GB_Multi); TAB_Subway.Controls.Add(GB_Doubles); TAB_Subway.Controls.Add(GB_Singles); - TAB_Subway.Location = new System.Drawing.Point(4, 24); + TAB_Subway.Location = new System.Drawing.Point(4, 26); TAB_Subway.Margin = new System.Windows.Forms.Padding(2); TAB_Subway.Name = "TAB_Subway"; TAB_Subway.Padding = new System.Windows.Forms.Padding(2); - TAB_Subway.Size = new System.Drawing.Size(390, 338); + TAB_Subway.Size = new System.Drawing.Size(390, 336); TAB_Subway.TabIndex = 3; TAB_Subway.Text = "Subway"; TAB_Subway.UseVisualStyleBackColor = true; @@ -1232,7 +1229,7 @@ private void InitializeComponent() CHK_Subway0.Location = new System.Drawing.Point(10, 20); CHK_Subway0.Margin = new System.Windows.Forms.Padding(2); CHK_Subway0.Name = "CHK_Subway0"; - CHK_Subway0.Size = new System.Drawing.Size(54, 19); + CHK_Subway0.Size = new System.Drawing.Size(58, 21); CHK_Subway0.TabIndex = 1; CHK_Subway0.Text = "Flag0"; CHK_Subway0.UseVisualStyleBackColor = true; @@ -1243,7 +1240,7 @@ private void InitializeComponent() CHK_Subway1.Location = new System.Drawing.Point(77, 20); CHK_Subway1.Margin = new System.Windows.Forms.Padding(2); CHK_Subway1.Name = "CHK_Subway1"; - CHK_Subway1.Size = new System.Drawing.Size(54, 19); + CHK_Subway1.Size = new System.Drawing.Size(58, 21); CHK_Subway1.TabIndex = 2; CHK_Subway1.Text = "Flag1"; CHK_Subway1.UseVisualStyleBackColor = true; @@ -1254,7 +1251,7 @@ private void InitializeComponent() CHK_Subway2.Location = new System.Drawing.Point(10, 38); CHK_Subway2.Margin = new System.Windows.Forms.Padding(2); CHK_Subway2.Name = "CHK_Subway2"; - CHK_Subway2.Size = new System.Drawing.Size(54, 19); + CHK_Subway2.Size = new System.Drawing.Size(58, 21); CHK_Subway2.TabIndex = 3; CHK_Subway2.Text = "Flag2"; CHK_Subway2.UseVisualStyleBackColor = true; @@ -1265,7 +1262,7 @@ private void InitializeComponent() CHK_Subway3.Location = new System.Drawing.Point(77, 38); CHK_Subway3.Margin = new System.Windows.Forms.Padding(2); CHK_Subway3.Name = "CHK_Subway3"; - CHK_Subway3.Size = new System.Drawing.Size(54, 19); + CHK_Subway3.Size = new System.Drawing.Size(58, 21); CHK_Subway3.TabIndex = 4; CHK_Subway3.Text = "Flag3"; CHK_Subway3.UseVisualStyleBackColor = true; @@ -1276,7 +1273,7 @@ private void InitializeComponent() CHK_SuperSingle.Location = new System.Drawing.Point(10, 56); CHK_SuperSingle.Margin = new System.Windows.Forms.Padding(2); CHK_SuperSingle.Name = "CHK_SuperSingle"; - CHK_SuperSingle.Size = new System.Drawing.Size(101, 19); + CHK_SuperSingle.Size = new System.Drawing.Size(112, 21); CHK_SuperSingle.TabIndex = 5; CHK_SuperSingle.Text = "Super Singles?"; CHK_SuperSingle.UseVisualStyleBackColor = true; @@ -1287,7 +1284,7 @@ private void InitializeComponent() CHK_SuperMulti.Location = new System.Drawing.Point(10, 74); CHK_SuperMulti.Margin = new System.Windows.Forms.Padding(2); CHK_SuperMulti.Name = "CHK_SuperMulti"; - CHK_SuperMulti.Size = new System.Drawing.Size(92, 19); + CHK_SuperMulti.Size = new System.Drawing.Size(100, 21); CHK_SuperMulti.TabIndex = 7; CHK_SuperMulti.Text = "Super Multi?"; CHK_SuperMulti.UseVisualStyleBackColor = true; @@ -1298,7 +1295,7 @@ private void InitializeComponent() CHK_SuperDouble.Location = new System.Drawing.Point(10, 92); CHK_SuperDouble.Margin = new System.Windows.Forms.Padding(2); CHK_SuperDouble.Name = "CHK_SuperDouble"; - CHK_SuperDouble.Size = new System.Drawing.Size(107, 19); + CHK_SuperDouble.Size = new System.Drawing.Size(119, 21); CHK_SuperDouble.TabIndex = 6; CHK_SuperDouble.Text = "Super Doubles?"; CHK_SuperDouble.UseVisualStyleBackColor = true; @@ -1309,7 +1306,7 @@ private void InitializeComponent() CHK_Subway7.Location = new System.Drawing.Point(10, 110); CHK_Subway7.Margin = new System.Windows.Forms.Padding(2); CHK_Subway7.Name = "CHK_Subway7"; - CHK_Subway7.Size = new System.Drawing.Size(54, 19); + CHK_Subway7.Size = new System.Drawing.Size(58, 21); CHK_Subway7.TabIndex = 8; CHK_Subway7.Text = "Flag7"; CHK_Subway7.UseVisualStyleBackColor = true; @@ -1320,7 +1317,7 @@ private void InitializeComponent() CHK_SWNPCMet.Location = new System.Drawing.Point(64, 110); CHK_SWNPCMet.Margin = new System.Windows.Forms.Padding(2); CHK_SWNPCMet.Name = "CHK_SWNPCMet"; - CHK_SWNPCMet.Size = new System.Drawing.Size(74, 19); + CHK_SWNPCMet.Size = new System.Drawing.Size(78, 21); CHK_SWNPCMet.TabIndex = 8; CHK_SWNPCMet.Text = "NPC met"; CHK_SWNPCMet.UseVisualStyleBackColor = true; @@ -1347,7 +1344,7 @@ private void InitializeComponent() L_CurrentType.Location = new System.Drawing.Point(45, 23); L_CurrentType.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); L_CurrentType.Name = "L_CurrentType"; - L_CurrentType.Size = new System.Drawing.Size(31, 15); + L_CurrentType.Size = new System.Drawing.Size(35, 17); L_CurrentType.TabIndex = 0; L_CurrentType.Text = "Type"; L_CurrentType.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; @@ -1359,7 +1356,7 @@ private void InitializeComponent() L_CurrentBattle.Location = new System.Drawing.Point(17, 47); L_CurrentBattle.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); L_CurrentBattle.Name = "L_CurrentBattle"; - L_CurrentBattle.Size = new System.Drawing.Size(59, 15); + L_CurrentBattle.Size = new System.Drawing.Size(65, 17); L_CurrentBattle.TabIndex = 0; L_CurrentBattle.Text = "Battle No."; L_CurrentBattle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; @@ -1371,7 +1368,7 @@ private void InitializeComponent() NUD_CurrentType.Margin = new System.Windows.Forms.Padding(2); NUD_CurrentType.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); NUD_CurrentType.Name = "NUD_CurrentType"; - NUD_CurrentType.Size = new System.Drawing.Size(48, 23); + NUD_CurrentType.Size = new System.Drawing.Size(48, 25); NUD_CurrentType.TabIndex = 1; // // NUD_CurrentBattle @@ -1381,7 +1378,7 @@ private void InitializeComponent() NUD_CurrentBattle.Margin = new System.Windows.Forms.Padding(2); NUD_CurrentBattle.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); NUD_CurrentBattle.Name = "NUD_CurrentBattle"; - NUD_CurrentBattle.Size = new System.Drawing.Size(48, 23); + NUD_CurrentBattle.Size = new System.Drawing.Size(48, 25); NUD_CurrentBattle.TabIndex = 1; // // GB_SubwaySets @@ -1412,7 +1409,7 @@ private void InitializeComponent() L_NormalSets.Location = new System.Drawing.Point(42, 19); L_NormalSets.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); L_NormalSets.Name = "L_NormalSets"; - L_NormalSets.Size = new System.Drawing.Size(47, 15); + L_NormalSets.Size = new System.Drawing.Size(52, 17); L_NormalSets.TabIndex = 0; L_NormalSets.Text = "Normal"; L_NormalSets.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; @@ -1424,7 +1421,7 @@ private void InitializeComponent() L_SuperSets.Location = new System.Drawing.Point(90, 19); L_SuperSets.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); L_SuperSets.Name = "L_SuperSets"; - L_SuperSets.Size = new System.Drawing.Size(37, 15); + L_SuperSets.Size = new System.Drawing.Size(42, 17); L_SuperSets.TabIndex = 1; L_SuperSets.Text = "Super"; L_SuperSets.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -1436,7 +1433,7 @@ private void InitializeComponent() CHK_SingleSet.Location = new System.Drawing.Point(16, 36); CHK_SingleSet.Margin = new System.Windows.Forms.Padding(2); CHK_SingleSet.Name = "CHK_SingleSet"; - CHK_SingleSet.Size = new System.Drawing.Size(58, 19); + CHK_SingleSet.Size = new System.Drawing.Size(62, 21); CHK_SingleSet.TabIndex = 2; CHK_SingleSet.Text = "Single"; CHK_SingleSet.UseVisualStyleBackColor = true; @@ -1449,7 +1446,7 @@ private void InitializeComponent() CHK_DoubleSet.Location = new System.Drawing.Point(10, 53); CHK_DoubleSet.Margin = new System.Windows.Forms.Padding(2); CHK_DoubleSet.Name = "CHK_DoubleSet"; - CHK_DoubleSet.Size = new System.Drawing.Size(64, 19); + CHK_DoubleSet.Size = new System.Drawing.Size(69, 21); CHK_DoubleSet.TabIndex = 3; CHK_DoubleSet.Text = "Double"; CHK_DoubleSet.UseVisualStyleBackColor = true; @@ -1462,7 +1459,7 @@ private void InitializeComponent() CHK_MultiNPCSet.Location = new System.Drawing.Point(24, 70); CHK_MultiNPCSet.Margin = new System.Windows.Forms.Padding(2); CHK_MultiNPCSet.Name = "CHK_MultiNPCSet"; - CHK_MultiNPCSet.Size = new System.Drawing.Size(50, 19); + CHK_MultiNPCSet.Size = new System.Drawing.Size(52, 21); CHK_MultiNPCSet.TabIndex = 4; CHK_MultiNPCSet.Text = "NPC"; CHK_MultiNPCSet.UseVisualStyleBackColor = true; @@ -1475,7 +1472,7 @@ private void InitializeComponent() CHK_MultiFriendsSet.Location = new System.Drawing.Point(10, 87); CHK_MultiFriendsSet.Margin = new System.Windows.Forms.Padding(2); CHK_MultiFriendsSet.Name = "CHK_MultiFriendsSet"; - CHK_MultiFriendsSet.Size = new System.Drawing.Size(64, 19); + CHK_MultiFriendsSet.Size = new System.Drawing.Size(69, 21); CHK_MultiFriendsSet.TabIndex = 5; CHK_MultiFriendsSet.Text = "Friends"; CHK_MultiFriendsSet.UseVisualStyleBackColor = true; @@ -1575,7 +1572,7 @@ private void InitializeComponent() NUD_SMultiFriendsRecord.Margin = new System.Windows.Forms.Padding(2); NUD_SMultiFriendsRecord.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_SMultiFriendsRecord.Name = "NUD_SMultiFriendsRecord"; - NUD_SMultiFriendsRecord.Size = new System.Drawing.Size(48, 23); + NUD_SMultiFriendsRecord.Size = new System.Drawing.Size(48, 25); NUD_SMultiFriendsRecord.TabIndex = 9; // // L_SMultiFriendsPast @@ -1596,7 +1593,7 @@ private void InitializeComponent() NUD_SMultiFriendsPast.Margin = new System.Windows.Forms.Padding(2); NUD_SMultiFriendsPast.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_SMultiFriendsPast.Name = "NUD_SMultiFriendsPast"; - NUD_SMultiFriendsPast.Size = new System.Drawing.Size(48, 23); + NUD_SMultiFriendsPast.Size = new System.Drawing.Size(48, 25); NUD_SMultiFriendsPast.TabIndex = 7; // // NUD_SMultiNpcRecord @@ -1606,7 +1603,7 @@ private void InitializeComponent() NUD_SMultiNpcRecord.Margin = new System.Windows.Forms.Padding(2); NUD_SMultiNpcRecord.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_SMultiNpcRecord.Name = "NUD_SMultiNpcRecord"; - NUD_SMultiNpcRecord.Size = new System.Drawing.Size(48, 23); + NUD_SMultiNpcRecord.Size = new System.Drawing.Size(48, 25); NUD_SMultiNpcRecord.TabIndex = 4; // // L_SMultiNpcPast @@ -1627,7 +1624,7 @@ private void InitializeComponent() NUD_SMultiNpcPast.Margin = new System.Windows.Forms.Padding(2); NUD_SMultiNpcPast.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_SMultiNpcPast.Name = "NUD_SMultiNpcPast"; - NUD_SMultiNpcPast.Size = new System.Drawing.Size(48, 23); + NUD_SMultiNpcPast.Size = new System.Drawing.Size(48, 25); NUD_SMultiNpcPast.TabIndex = 2; // // L_SMultiFriendsRecord @@ -1674,7 +1671,7 @@ private void InitializeComponent() NUD_SDoubleRecord.Margin = new System.Windows.Forms.Padding(2); NUD_SDoubleRecord.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_SDoubleRecord.Name = "NUD_SDoubleRecord"; - NUD_SDoubleRecord.Size = new System.Drawing.Size(48, 23); + NUD_SDoubleRecord.Size = new System.Drawing.Size(48, 25); NUD_SDoubleRecord.TabIndex = 3; // // L_SDoublePast @@ -1695,7 +1692,7 @@ private void InitializeComponent() NUD_SDoublePast.Margin = new System.Windows.Forms.Padding(2); NUD_SDoublePast.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_SDoublePast.Name = "NUD_SDoublePast"; - NUD_SDoublePast.Size = new System.Drawing.Size(48, 23); + NUD_SDoublePast.Size = new System.Drawing.Size(48, 25); NUD_SDoublePast.TabIndex = 1; // // L_SDoubleRecord @@ -1731,7 +1728,7 @@ private void InitializeComponent() NUD_SSingleRecord.Margin = new System.Windows.Forms.Padding(2); NUD_SSingleRecord.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_SSingleRecord.Name = "NUD_SSingleRecord"; - NUD_SSingleRecord.Size = new System.Drawing.Size(48, 23); + NUD_SSingleRecord.Size = new System.Drawing.Size(48, 25); NUD_SSingleRecord.TabIndex = 3; // // L_SSinglePast @@ -1752,7 +1749,7 @@ private void InitializeComponent() NUD_SSinglePast.Margin = new System.Windows.Forms.Padding(2); NUD_SSinglePast.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_SSinglePast.Name = "NUD_SSinglePast"; - NUD_SSinglePast.Size = new System.Drawing.Size(48, 23); + NUD_SSinglePast.Size = new System.Drawing.Size(48, 25); NUD_SSinglePast.TabIndex = 1; // // L_SSingleRecord @@ -1816,7 +1813,7 @@ private void InitializeComponent() NUD_MultiFriendsRecord.Margin = new System.Windows.Forms.Padding(2); NUD_MultiFriendsRecord.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_MultiFriendsRecord.Name = "NUD_MultiFriendsRecord"; - NUD_MultiFriendsRecord.Size = new System.Drawing.Size(48, 23); + NUD_MultiFriendsRecord.Size = new System.Drawing.Size(48, 25); NUD_MultiFriendsRecord.TabIndex = 9; // // L_MultiFriendsPast @@ -1837,7 +1834,7 @@ private void InitializeComponent() NUD_MultiFriendsPast.Margin = new System.Windows.Forms.Padding(2); NUD_MultiFriendsPast.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_MultiFriendsPast.Name = "NUD_MultiFriendsPast"; - NUD_MultiFriendsPast.Size = new System.Drawing.Size(48, 23); + NUD_MultiFriendsPast.Size = new System.Drawing.Size(48, 25); NUD_MultiFriendsPast.TabIndex = 7; // // NUD_MultiNpcRecord @@ -1847,7 +1844,7 @@ private void InitializeComponent() NUD_MultiNpcRecord.Margin = new System.Windows.Forms.Padding(2); NUD_MultiNpcRecord.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_MultiNpcRecord.Name = "NUD_MultiNpcRecord"; - NUD_MultiNpcRecord.Size = new System.Drawing.Size(48, 23); + NUD_MultiNpcRecord.Size = new System.Drawing.Size(48, 25); NUD_MultiNpcRecord.TabIndex = 4; // // L_MultiNpcPast @@ -1868,7 +1865,7 @@ private void InitializeComponent() NUD_MultiNpcPast.Margin = new System.Windows.Forms.Padding(2); NUD_MultiNpcPast.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_MultiNpcPast.Name = "NUD_MultiNpcPast"; - NUD_MultiNpcPast.Size = new System.Drawing.Size(48, 23); + NUD_MultiNpcPast.Size = new System.Drawing.Size(48, 25); NUD_MultiNpcPast.TabIndex = 2; // // L_MultiFriendsRecord @@ -1915,7 +1912,7 @@ private void InitializeComponent() NUD_DoubleRecord.Margin = new System.Windows.Forms.Padding(2); NUD_DoubleRecord.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_DoubleRecord.Name = "NUD_DoubleRecord"; - NUD_DoubleRecord.Size = new System.Drawing.Size(48, 23); + NUD_DoubleRecord.Size = new System.Drawing.Size(48, 25); NUD_DoubleRecord.TabIndex = 3; // // L_DoublePast @@ -1936,7 +1933,7 @@ private void InitializeComponent() NUD_DoublePast.Margin = new System.Windows.Forms.Padding(2); NUD_DoublePast.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_DoublePast.Name = "NUD_DoublePast"; - NUD_DoublePast.Size = new System.Drawing.Size(48, 23); + NUD_DoublePast.Size = new System.Drawing.Size(48, 25); NUD_DoublePast.TabIndex = 1; // // L_DoubleRecord @@ -1972,7 +1969,7 @@ private void InitializeComponent() NUD_SingleRecord.Margin = new System.Windows.Forms.Padding(2); NUD_SingleRecord.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_SingleRecord.Name = "NUD_SingleRecord"; - NUD_SingleRecord.Size = new System.Drawing.Size(48, 23); + NUD_SingleRecord.Size = new System.Drawing.Size(48, 25); NUD_SingleRecord.TabIndex = 3; // // L_SinglePast @@ -1993,7 +1990,7 @@ private void InitializeComponent() NUD_SinglePast.Margin = new System.Windows.Forms.Padding(2); NUD_SinglePast.Maximum = new decimal(new int[] { 9999, 0, 0, 0 }); NUD_SinglePast.Name = "NUD_SinglePast"; - NUD_SinglePast.Size = new System.Drawing.Size(48, 23); + NUD_SinglePast.Size = new System.Drawing.Size(48, 25); NUD_SinglePast.TabIndex = 1; // // L_SingleRecord @@ -2012,11 +2009,11 @@ private void InitializeComponent() TAB_BWCityForest.Controls.Add(L_FC); TAB_BWCityForest.Controls.Add(B_ImportFC); TAB_BWCityForest.Controls.Add(B_DumpFC); - TAB_BWCityForest.Location = new System.Drawing.Point(4, 24); + TAB_BWCityForest.Location = new System.Drawing.Point(4, 26); TAB_BWCityForest.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); TAB_BWCityForest.Name = "TAB_BWCityForest"; TAB_BWCityForest.Padding = new System.Windows.Forms.Padding(2, 3, 2, 3); - TAB_BWCityForest.Size = new System.Drawing.Size(390, 338); + TAB_BWCityForest.Size = new System.Drawing.Size(390, 336); TAB_BWCityForest.TabIndex = 4; TAB_BWCityForest.Text = "WhiteForest/BlackCity"; TAB_BWCityForest.UseVisualStyleBackColor = true; @@ -2054,17 +2051,25 @@ private void InitializeComponent() // // TAB_Muscial // + TAB_Muscial.Controls.Add(CLB_MusicalProps); TAB_Muscial.Controls.Add(B_UnlockAllProps); - TAB_Muscial.Controls.Add(CHK_PropObtained); - TAB_Muscial.Controls.Add(CB_Prop); - TAB_Muscial.Location = new System.Drawing.Point(4, 24); + TAB_Muscial.Location = new System.Drawing.Point(4, 26); TAB_Muscial.Name = "TAB_Muscial"; TAB_Muscial.Padding = new System.Windows.Forms.Padding(3); - TAB_Muscial.Size = new System.Drawing.Size(390, 338); + TAB_Muscial.Size = new System.Drawing.Size(390, 336); TAB_Muscial.TabIndex = 6; TAB_Muscial.Text = "Musical"; TAB_Muscial.UseVisualStyleBackColor = true; // + // CLB_MusicalProps + // + CLB_MusicalProps.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + CLB_MusicalProps.FormattingEnabled = true; + CLB_MusicalProps.Location = new System.Drawing.Point(6, 6); + CLB_MusicalProps.Name = "CLB_MusicalProps"; + CLB_MusicalProps.Size = new System.Drawing.Size(244, 244); + CLB_MusicalProps.TabIndex = 3; + // // B_UnlockAllProps // B_UnlockAllProps.Location = new System.Drawing.Point(6, 261); @@ -2075,26 +2080,6 @@ private void InitializeComponent() B_UnlockAllProps.UseVisualStyleBackColor = true; B_UnlockAllProps.Click += B_UnlockAllProps_Click; // - // CHK_PropObtained - // - CHK_PropObtained.AutoSize = true; - CHK_PropObtained.Location = new System.Drawing.Point(6, 35); - CHK_PropObtained.Name = "CHK_PropObtained"; - CHK_PropObtained.Size = new System.Drawing.Size(75, 19); - CHK_PropObtained.TabIndex = 1; - CHK_PropObtained.Text = "Obtained"; - CHK_PropObtained.UseVisualStyleBackColor = true; - CHK_PropObtained.CheckedChanged += CHK_PropObtained_CheckedChanged; - // - // CB_Prop - // - CB_Prop.FormattingEnabled = true; - CB_Prop.Location = new System.Drawing.Point(6, 6); - CB_Prop.Name = "CB_Prop"; - CB_Prop.Size = new System.Drawing.Size(378, 23); - CB_Prop.TabIndex = 0; - CB_Prop.SelectedIndexChanged += CB_Prop_SelectedIndexChanged; - // // SAV_Misc5 // AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; @@ -2172,7 +2157,6 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)NUD_SinglePast).EndInit(); TAB_BWCityForest.ResumeLayout(false); TAB_Muscial.ResumeLayout(false); - TAB_Muscial.PerformLayout(); ResumeLayout(false); } @@ -2325,8 +2309,6 @@ private void InitializeComponent() private System.Windows.Forms.Button B_ImportFC; private System.Windows.Forms.Button B_DumpFC; private System.Windows.Forms.TabPage TAB_Muscial; - private System.Windows.Forms.ComboBox CB_Prop; - private System.Windows.Forms.CheckBox CHK_PropObtained; private System.Windows.Forms.Button B_UnlockAllProps; private System.Windows.Forms.Label L_Record32V; private System.Windows.Forms.Label L_Record32; @@ -2336,5 +2318,6 @@ private void InitializeComponent() private System.Windows.Forms.NumericUpDown NUD_Record32; private System.Windows.Forms.NumericUpDown NUD_Record16V; private System.Windows.Forms.NumericUpDown NUD_Record16; + private System.Windows.Forms.CheckedListBox CLB_MusicalProps; } } diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.cs index 41230cc6b..8c54f8af3 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.cs @@ -28,6 +28,7 @@ public SAV_Misc5(SAV5 sav) WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); SAV = (SAV5)(Origin = sav).Clone(); + CLB_MusicalProps.Items.AddRange(PropNames); swp = SAV.BattleSubwayPlay; sw = SAV.BattleSubway; ReadMain(); @@ -46,6 +47,7 @@ private void B_Save_Click(object sender, EventArgs e) SaveForest(); SaveSubway(); SaveEntralink(); + SaveMusical(); SaveRecord(); Forest.EnsureDecrypted(false); @@ -852,18 +854,15 @@ private void B_ImportFC_Click(object sender, EventArgs e) private void ReadMusical() { - CB_Prop.Items.AddRange(PropNames); - CB_Prop.SelectedIndex = 0; + CLB_MusicalProps.SelectedIndex = 0; + for (int i = 0; i < PropNames.Length; i++) + CLB_MusicalProps.SetItemChecked(i, SAV.Musical.GetHasProp(i)); } - private void CB_Prop_SelectedIndexChanged(object sender, EventArgs e) + private void SaveMusical() { - CHK_PropObtained.Checked = SAV.Musical.GetHasProp(CB_Prop.SelectedIndex); - } - - private void CHK_PropObtained_CheckedChanged(object sender, EventArgs e) - { - SAV.Musical.SetHasProp(CB_Prop.SelectedIndex, CHK_PropObtained.Checked); + for (int i = 0; i < PropNames.Length; i++) + SAV.Musical.SetHasProp(i, CLB_MusicalProps.GetItemChecked(i)); } private void CHK_SingleSet_CheckedChanged(object sender, EventArgs e) @@ -910,6 +909,7 @@ private void B_UnlockAllProps_Click(object sender, EventArgs e) { SAV.Musical.UnlockAllMusicalProps(); B_UnlockAllProps.Enabled = false; + ReadMusical(); WinFormsUtil.Asterisk(); } } From c4d4af27197b017817a14dfa75eb57120b6ceeed Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 7 Jun 2026 17:45:55 -0500 Subject: [PATCH 69/81] Sanity check criteria ability before generating no more stunlocking the generator by requesting hidden ability mons from wild encounter slots --- .../Encounters/Generator/EncounterMutation.cs | 47 ++++++++++++++++--- PKHeX.WinForms/Subforms/SAV_Encounters.cs | 4 ++ 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/PKHeX.Core/Legality/Encounters/Generator/EncounterMutation.cs b/PKHeX.Core/Legality/Encounters/Generator/EncounterMutation.cs index 1fc97518f..94b56802a 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/EncounterMutation.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/EncounterMutation.cs @@ -1,4 +1,7 @@ using System; +using static PKHeX.Core.AbilityPermission; +using static PKHeX.Core.EncounterMutation; +using static PKHeX.Core.EntityContext; namespace PKHeX.Core; @@ -25,7 +28,7 @@ public enum EncounterMutation : byte public static class EncounterMutationUtil { - public static bool IsComplexNature(this EncounterMutation m) => m.HasFlag(EncounterMutation.AllowOnlyNeutralNature); + public static bool IsComplexNature(this EncounterMutation m) => m.HasFlag(AllowOnlyNeutralNature); /// /// Gets the suggested post-generation mutations allowed for the given target context and level. @@ -38,18 +41,48 @@ public static EncounterMutation GetSuggested(EntityContext targetContext, byte l return EncounterMutation.None; if (targetContext.IsEraPreSwitch) { - if (targetContext is EntityContext.Gen7b) - return level != 100 ? EncounterMutation.None : EncounterMutation.CanMaxIndividualStat; - return EncounterMutation.CanAbilityCapsule; + if (targetContext is Gen7b) + return level != 100 ? EncounterMutation.None : CanMaxIndividualStat; + return CanAbilityCapsule; } - var result = EncounterMutation.AllCanChange; + var result = AllCanChange; // In PLA, Hyper Training is equivalent to using Grit, which can be done at any level. // If bottle caps can't be used, don't allow maxing IVs. var minBottleLevel = targetContext.GetHyperTrainMinLevel(); - if (level < minBottleLevel && targetContext is not EntityContext.Gen8a) - result &= ~EncounterMutation.CanMaxIndividualStat; + if (level < minBottleLevel && targetContext is not Gen8a) + result &= ~CanMaxIndividualStat; return result; } + + /// + /// Determines if the given mutation allows for the encounter to eventually arrive at the specified ability permissions. + /// + /// The encounter mutation allowed after capture. + /// The encounter's ability permission. + /// The end-state ability permission. + /// True if the mutation allows for the encounter to eventually arrive at the specified ability permissions; otherwise, false. + public static bool CanGetAbility(this EncounterMutation mutation, AbilityPermission start, AbilityPermission end) => start switch + { + Any12 => end switch + { + OnlyHidden => mutation.HasFlag(CanAbilityPatch), + _ => false, + }, + OnlyFirst => end switch + { + OnlySecond => mutation.HasFlag(CanAbilityCapsule), + OnlyHidden => mutation.HasFlag(CanAbilityPatch), + _ => false, + }, + OnlySecond => end switch + { + OnlyFirst => mutation.HasFlag(CanAbilityCapsule), + OnlyHidden => mutation.HasFlag(CanAbilityPatch), + _ => false, + }, + OnlyHidden => end.CanBeHidden() || mutation.HasFlag(CanAbilityPatch), + _ => false, + }; } diff --git a/PKHeX.WinForms/Subforms/SAV_Encounters.cs b/PKHeX.WinForms/Subforms/SAV_Encounters.cs index 2bcd02216..117cbf0ea 100644 --- a/PKHeX.WinForms/Subforms/SAV_Encounters.cs +++ b/PKHeX.WinForms/Subforms/SAV_Encounters.cs @@ -272,8 +272,12 @@ private EncounterCriteria GetCriteria(IEncounterTemplate enc, EncounterDatabaseS } var criteria = _criteriaValue; + // Sanity check gender. if (!isInChain || EntityGender.IsSingleGender(enc.Species)) criteria = criteria with { Gender = Gender.Random }; // Genderless tabs and a gendered enc -> let's play safe. + // Sanity check ability. + if (!criteria.Mutations.CanGetAbility(enc.Ability, criteria.Ability)) + criteria = criteria with { Ability = AbilityPermission.Any12H }; // ignore the Ability requested by user, it's impossible. return criteria; } From a052f59ffe95885bbc7dad938ac168296329f3b5 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 7 Jun 2026 18:24:16 -0500 Subject: [PATCH 70/81] Gen5 entree: remove erroneous Invisible flag was just an impossible form bitflag that causes the game to wig out when set --- .../Substructures/Gen5/Entree/EntreeSlot.cs | 38 ++++++++++--------- PKHeX.WinForms/Resources/text/lang_de.txt | 1 - PKHeX.WinForms/Resources/text/lang_en.txt | 1 - PKHeX.WinForms/Resources/text/lang_es-419.txt | 1 - PKHeX.WinForms/Resources/text/lang_es.txt | 1 - PKHeX.WinForms/Resources/text/lang_fr.txt | 1 - PKHeX.WinForms/Resources/text/lang_it.txt | 1 - PKHeX.WinForms/Resources/text/lang_ja.txt | 1 - PKHeX.WinForms/Resources/text/lang_ko.txt | 1 - .../Resources/text/lang_zh-Hans.txt | 1 - .../Resources/text/lang_zh-Hant.txt | 1 - .../Save Editors/Gen5/SAV_Misc5.Designer.cs | 16 -------- .../Subforms/Save Editors/Gen5/SAV_Misc5.cs | 8 +--- 13 files changed, 23 insertions(+), 49 deletions(-) diff --git a/PKHeX.Core/Saves/Substructures/Gen5/Entree/EntreeSlot.cs b/PKHeX.Core/Saves/Substructures/Gen5/Entree/EntreeSlot.cs index 816d3bfe1..be2360403 100644 --- a/PKHeX.Core/Saves/Substructures/Gen5/Entree/EntreeSlot.cs +++ b/PKHeX.Core/Saves/Substructures/Gen5/Entree/EntreeSlot.cs @@ -38,32 +38,21 @@ public sealed class EntreeSlot(Memory Data) : ISpeciesForm /// /// index /// - public byte Form // bits 23-27 + public byte Form // bits 23-28 (6 bits) { - get => (byte)((RawValue & 0x0F80_0000) >> 23); - set => RawValue = (RawValue & 0xF07F_FFFF) | ((value & 0x1Fu) << 23); - } - - /// - /// Visibility Flag - /// - public bool Invisible // bit 28 - { - get => ((RawValue >> 28) & 1) == 1; - set => RawValue = (RawValue & 0xEFFFFFFF) | (value ? 0 : 1u << 28); + get => (byte)((RawValue & 0x1F80_0000) >> 23); + set => RawValue = (RawValue & 0xE07F_FFFF) | ((value & 0x3Fu) << 23); } /// /// Animation Leash (How many steps it can deviate from its spawn location). /// - public int Animation // bits 29-31 + public EntreeForestAnimation Animation // bits 29-31 { - get => (int)(RawValue >> 29); - set => RawValue = ((RawValue << 3) >> 3) | (uint)((value & 0x7) << 29); + get => (EntreeForestAnimation)(RawValue >> 29); + set => RawValue = ((RawValue << 3) >> 3) | (uint)(((byte)value & 0x7) << 29); } - private Memory Data { get; } = Data; - /// /// Raw Data Value /// @@ -86,3 +75,18 @@ public uint RawValue /// public EntreeForestArea Area { get; init; } } + +/// +/// Movement patterns, as observed in-game. +/// +public enum EntreeForestAnimation : byte +{ + LookRandom = 0, // random looking around + Leash3 = 1, // walking in a 3x3 radius block + Leash5 = 2, // walking in a 5x5 radius block + MoveUpDown = 3, // moving up and down only + MoveLeftRight = 4, // moving left and right only + MoveLeftRightLook = 5, // moving left and right and looking around + RotateClockwise = 6, // clockwise rotating + RotateCounterClockwise = 7, // counterclockwise rotating +} diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index dd17ecf47..fc7a47ba4 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -1744,7 +1744,6 @@ SAV_Misc5.B_UnlockAllProps=Alle Accessoires freischalten SAV_Misc5.CHK_Area9=Areal 9 erreichbar: SAV_Misc5.CHK_DoubleSet=Doppel SAV_Misc5.CHK_FMNew=NEU -SAV_Misc5.CHK_Invisible=Unsichtbar SAV_Misc5.CHK_LibertyPass=Aktiviere Gartenpass SAV_Misc5.CHK_MultiFriendsSet=Freunde SAV_Misc5.CHK_MultiNPCSet=NPC diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index 52e08a79c..27fb84e35 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -1744,7 +1744,6 @@ SAV_Misc5.B_UnlockAllProps=Unlock All Props SAV_Misc5.CHK_Area9=Area 9 Unlocked: SAV_Misc5.CHK_DoubleSet=Double SAV_Misc5.CHK_FMNew=NEW -SAV_Misc5.CHK_Invisible=Invisible SAV_Misc5.CHK_LibertyPass=Activate LibertyPass SAV_Misc5.CHK_MultiFriendsSet=Friends SAV_Misc5.CHK_MultiNPCSet=NPC diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index 45ce7058e..c4d72135e 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -1744,7 +1744,6 @@ SAV_Misc5.B_UnlockAllProps=Desbloq. complementos SAV_Misc5.CHK_Area9=Área 9 desbloqueada: SAV_Misc5.CHK_DoubleSet=Doblr SAV_Misc5.CHK_FMNew=NUEVO -SAV_Misc5.CHK_Invisible=Invisible SAV_Misc5.CHK_LibertyPass=Activar Ticket Libertad SAV_Misc5.CHK_MultiFriendsSet=Amigos SAV_Misc5.CHK_MultiNPCSet=PNJ diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index 3916c07f2..1dce1359f 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -1744,7 +1744,6 @@ SAV_Misc5.B_UnlockAllProps=Desbloq. complementos SAV_Misc5.CHK_Area9=Área 9 desbloqueada: SAV_Misc5.CHK_DoubleSet=Doblr SAV_Misc5.CHK_FMNew=NUEVO -SAV_Misc5.CHK_Invisible=Invisible SAV_Misc5.CHK_LibertyPass=Activar Ticket Libertad SAV_Misc5.CHK_MultiFriendsSet=Amigos SAV_Misc5.CHK_MultiNPCSet=PNJ diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index 27591e0ff..d32343e51 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -1744,7 +1744,6 @@ SAV_Misc5.B_UnlockAllProps=Tout donner SAV_Misc5.CHK_Area9=Zone 9 déverrouillée : SAV_Misc5.CHK_DoubleSet=Duo SAV_Misc5.CHK_FMNew=NOUV. -SAV_Misc5.CHK_Invisible=Invisible SAV_Misc5.CHK_LibertyPass=Activer le Pass Liberté SAV_Misc5.CHK_MultiFriendsSet=Ami SAV_Misc5.CHK_MultiNPCSet=PNJ diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index d68e76e14..673f1058f 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -1744,7 +1744,6 @@ SAV_Misc5.B_UnlockAllProps=Sblocca tutti i gadget SAV_Misc5.CHK_Area9=Area 9 Sbloccata: SAV_Misc5.CHK_DoubleSet=Doppie SAV_Misc5.CHK_FMNew=Nuovo -SAV_Misc5.CHK_Invisible=Invisibile SAV_Misc5.CHK_LibertyPass=Attiva LiberTicket SAV_Misc5.CHK_MultiFriendsSet=Amici SAV_Misc5.CHK_MultiNPCSet=NPC diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index d3acb5f88..f476e8b97 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -1744,7 +1744,6 @@ SAV_Misc5.B_UnlockAllProps=全てのグッズ解放 SAV_Misc5.CHK_Area9=9番目のエリア解放済み: SAV_Misc5.CHK_DoubleSet=ダブル SAV_Misc5.CHK_FMNew=NEW -SAV_Misc5.CHK_Invisible=不可視 SAV_Misc5.CHK_LibertyPass=リバティチケット 有効化 SAV_Misc5.CHK_MultiFriendsSet=フレンド SAV_Misc5.CHK_MultiNPCSet=NPC diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index 587acc05b..82f3a1c2a 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -1744,7 +1744,6 @@ SAV_Misc5.B_UnlockAllProps=모든 굿즈 해금 SAV_Misc5.CHK_Area9=9구역 해금: SAV_Misc5.CHK_DoubleSet=더블 SAV_Misc5.CHK_FMNew=신규 -SAV_Misc5.CHK_Invisible=투명 SAV_Misc5.CHK_LibertyPass=리버티티켓 활성화 SAV_Misc5.CHK_MultiFriendsSet=친구 SAV_Misc5.CHK_MultiNPCSet=NPC diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index 6d44158ab..ded234e8c 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -1744,7 +1744,6 @@ SAV_Misc5.B_UnlockAllProps=解锁所有道具 SAV_Misc5.CHK_Area9=区域 9 解锁: SAV_Misc5.CHK_DoubleSet=双打 SAV_Misc5.CHK_FMNew=新纪录 -SAV_Misc5.CHK_Invisible=隐性 SAV_Misc5.CHK_LibertyPass=激活自由船票 SAV_Misc5.CHK_MultiFriendsSet=朋友 SAV_Misc5.CHK_MultiNPCSet=NPC diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index 0ffc5d6fe..20a7d853c 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -1744,7 +1744,6 @@ SAV_Misc5.B_UnlockAllProps=解鎖全部音樂物品 SAV_Misc5.CHK_Area9=區域 9 解鎖: SAV_Misc5.CHK_DoubleSet=雙打 SAV_Misc5.CHK_FMNew=新紀錄 -SAV_Misc5.CHK_Invisible=隱性 SAV_Misc5.CHK_LibertyPass=啟動自由船票 SAV_Misc5.CHK_MultiFriendsSet=朋友 SAV_Misc5.CHK_MultiNPCSet=NPC diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.Designer.cs index e350728a5..c872a174a 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.Designer.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.Designer.cs @@ -95,7 +95,6 @@ private void InitializeComponent() L_Area18 = new System.Windows.Forms.Label(); CHK_Area9 = new System.Windows.Forms.CheckBox(); PB_SlotPreview = new System.Windows.Forms.PictureBox(); - CHK_Invisible = new System.Windows.Forms.CheckBox(); L_Animation = new System.Windows.Forms.Label(); NUD_Animation = new System.Windows.Forms.NumericUpDown(); L_Gender = new System.Windows.Forms.Label(); @@ -950,7 +949,6 @@ private void InitializeComponent() TAB_Forest.Controls.Add(L_Area18); TAB_Forest.Controls.Add(CHK_Area9); TAB_Forest.Controls.Add(PB_SlotPreview); - TAB_Forest.Controls.Add(CHK_Invisible); TAB_Forest.Controls.Add(L_Animation); TAB_Forest.Controls.Add(NUD_Animation); TAB_Forest.Controls.Add(L_Gender); @@ -1031,19 +1029,6 @@ private void InitializeComponent() PB_SlotPreview.TabIndex = 13; PB_SlotPreview.TabStop = false; // - // CHK_Invisible - // - CHK_Invisible.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; - CHK_Invisible.AutoSize = true; - CHK_Invisible.Location = new System.Drawing.Point(293, 313); - CHK_Invisible.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - CHK_Invisible.Name = "CHK_Invisible"; - CHK_Invisible.Size = new System.Drawing.Size(73, 21); - CHK_Invisible.TabIndex = 16; - CHK_Invisible.Text = "Invisible"; - CHK_Invisible.UseVisualStyleBackColor = true; - CHK_Invisible.CheckedChanged += UpdateSlotValue; - // // L_Animation // L_Animation.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; @@ -2222,7 +2207,6 @@ private void InitializeComponent() private System.Windows.Forms.ComboBox CB_Species; private System.Windows.Forms.Label L_Gender; private System.Windows.Forms.ComboBox CB_Gender; - private System.Windows.Forms.CheckBox CHK_Invisible; private System.Windows.Forms.Label L_Animation; private System.Windows.Forms.NumericUpDown NUD_Animation; private System.Windows.Forms.PictureBox PB_SlotPreview; diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.cs index 8c54f8af3..b24173e78 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen5/SAV_Misc5.cs @@ -559,7 +559,7 @@ private void ChangeSlot(object sender, EventArgs e) CB_Move.SelectedValue = (int)current.Move; CB_Gender.SelectedValue = (int)current.Gender; CB_Form.SelectedIndex = CB_Form.Items.Count <= current.Form ? 0 : current.Form; - NUD_Animation.SetValueClamped(current.Animation); + NUD_Animation.SetValueClamped((int)current.Animation); CurrentSlot = current; SetSprite(current); } @@ -598,13 +598,9 @@ private void UpdateSlotValue(object sender, EventArgs e) { CurrentSlot.Form = (byte)CB_Form.SelectedIndex; } - else if (sender == CHK_Invisible) - { - CurrentSlot.Invisible = CHK_Invisible.Checked; - } else if (sender == NUD_Animation) { - CurrentSlot.Animation = (int)NUD_Animation.Value; + CurrentSlot.Animation = (EntreeForestAnimation)NUD_Animation.Value; } SetSprite(CurrentSlot); From a71b808b772b22be3a896fde8357a73d04c80f9e Mon Sep 17 00:00:00 2001 From: Lusamine <30205550+Lusamine@users.noreply.github.com> Date: Sun, 7 Jun 2026 23:50:49 -0500 Subject: [PATCH 71/81] Label SV block for current location ID --- PKHeX.Core/Saves/Access/SaveBlockAccessor9SV.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/PKHeX.Core/Saves/Access/SaveBlockAccessor9SV.cs b/PKHeX.Core/Saves/Access/SaveBlockAccessor9SV.cs index 0bee2aec8..d15e3c292 100644 --- a/PKHeX.Core/Saves/Access/SaveBlockAccessor9SV.cs +++ b/PKHeX.Core/Saves/Access/SaveBlockAccessor9SV.cs @@ -146,6 +146,7 @@ public Raid9(SAV9SV sav) private const uint KPlayerLastRoomMapName = 0x9F1ABF26; // PlayerSave_LastRoomMapName private const uint KPlayerLastGreenPosition = 0x5C6F8291; // PlayerSave_LastGreenPos private const uint KPlayerCurrentFieldID = 0xF17EB014; // PlayerSave_CurrentFieldId (0 = Paldea, 1 = Kitakami, 2 = Blueberry) + private const uint KPlayerCurrentLocationID = 0x19FC5B7B; // Current position's met location ID // Fashion public const uint KFashionUnlockedEyewear = 0xCBA20ED5; // 1000-1999 From 740a3c5b90bef0cf92ef0352c7a7ec300ebd7b7a Mon Sep 17 00:00:00 2001 From: Kurt Date: Wed, 10 Jun 2026 23:19:55 -0500 Subject: [PATCH 72/81] Restore preview card on system wake pc went to sleep, hover preview was missing (minimized?) this workaround works, maybe I can deduplicate the dllimport in PokePreview, or make this more abstract for future hover card previews like encounters? --- PKHeX.WinForms/Controls/Slots/PokePreview.cs | 1 - .../Controls/Slots/SummaryPreviewer.cs | 24 +++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/PKHeX.WinForms/Controls/Slots/PokePreview.cs b/PKHeX.WinForms/Controls/Slots/PokePreview.cs index a8062b631..068ebe870 100644 --- a/PKHeX.WinForms/Controls/Slots/PokePreview.cs +++ b/PKHeX.WinForms/Controls/Slots/PokePreview.cs @@ -467,7 +467,6 @@ public void MoveForm(int x, int y) const uint SWP_ASYNCWINDOWPOS = 0x4000; const uint flags = SWP_NOZORDER | SWP_NOSIZE | SWP_NOREDRAW | SWP_NOACTIVATE | SWP_NOSENDCHANGING | SWP_ASYNCWINDOWPOS; - const int HWND_TOPMOST = -1; SetWindowPos(Handle, HWND_TOPMOST, x, y, 0, 0, flags); return; diff --git a/PKHeX.WinForms/Controls/Slots/SummaryPreviewer.cs b/PKHeX.WinForms/Controls/Slots/SummaryPreviewer.cs index d785f8806..7be89bd10 100644 --- a/PKHeX.WinForms/Controls/Slots/SummaryPreviewer.cs +++ b/PKHeX.WinForms/Controls/Slots/SummaryPreviewer.cs @@ -70,12 +70,32 @@ private static void SetWindowState(Form frm, bool visible) { try { + if (!frm.IsHandleCreated || frm.IsDisposed) + return; + const int SW_SHOWNOACTIVATE = 4; - var state = visible ? SW_SHOWNOACTIVATE : 0; - ShowWindowAsync(frm.Handle, state); + const int HWND_TOPMOST = -1; + const uint SWP_NOMOVE = 0x0002; + const uint SWP_NOSIZE = 0x0001; + const uint SWP_NOACTIVATE = 0x0010; + const uint SWP_SHOWWINDOW = 0x0040; + const uint SWP_NOOWNERZORDER = 0x0200; + + if (visible) + { + ShowWindowAsync(frm.Handle, SW_SHOWNOACTIVATE); + SetWindowPos(frm.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_SHOWWINDOW | SWP_NOOWNERZORDER); + } + else + { + ShowWindowAsync(frm.Handle, 0); + } [System.Runtime.InteropServices.DllImport("user32.dll")] static extern bool ShowWindowAsync(nint hWnd, int nCmdShow); + + [System.Runtime.InteropServices.DllImport("user32.dll")] + static extern bool SetWindowPos(nint hWnd, nint hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags); } catch { From c514865082b032e5edfb6538c8a057b8b825cc5f Mon Sep 17 00:00:00 2001 From: Kurt Date: Wed, 10 Jun 2026 23:40:30 -0500 Subject: [PATCH 73/81] Gen5: fix basculin-blue reckless ability handling Closes #2058 so many spots needing updating: - ability verifier (legality check) - encounter template=>pk5 (generating) - editor load abilities (show the ability in list) - editor save ability (acknowledge ability index) --- .../GameStrings/FilteredGameDataSource.cs | 14 +++++-- .../Encounters/Generator/EncounterMutation.cs | 2 +- .../Templates/Gen5/EncounterEgg5.cs | 2 + .../Templates/Gen5/EncounterSlot5.cs | 2 + .../Verifiers/Ability/AbilityVerifier.cs | 38 ++++++++++++++++++ PKHeX.Core/PKM/PK5.cs | 7 ++++ PKHeX.WinForms/Controls/PKM Editor/EditPK5.cs | 4 +- .../Controls/PKM Editor/LoadSave.cs | 11 +++-- .../Controls/PKM Editor/PKMEditor.cs | 2 + ...- Basculin - C46358B4FA76 wrongAbility.pk5 | Bin 0 -> 220 bytes 10 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 Tests/PKHeX.Core.Tests/Legality/Legal/Generation 5/0550-01 - Basculin - C46358B4FA76 wrongAbility.pk5 diff --git a/PKHeX.Core/Game/GameStrings/FilteredGameDataSource.cs b/PKHeX.Core/Game/GameStrings/FilteredGameDataSource.cs index b38d3a57e..08ed5e645 100644 --- a/PKHeX.Core/Game/GameStrings/FilteredGameDataSource.cs +++ b/PKHeX.Core/Game/GameStrings/FilteredGameDataSource.cs @@ -135,10 +135,18 @@ private static void LoadAbilityList(IPersonalAbility pi, Span list, R for (int i = 0; i < list.Length; i++) { var value = pi.GetAbilityAtIndex(i); - var name = names[value]; char suffix = i == 2 ? HiddenAbilitySuffix : (char)(AbilityIndexSuffix + i); - var display = $"{name} ({suffix})"; - list[i] = new ComboItem(display, value); + var item = GetAbilityItem(names, value, suffix); + list[i] = item; } } + + public static ComboItem GetAbilityItem(ReadOnlySpan names, int value, char suffix) + => GetAbilityItem(names[value], suffix, value); + + public static ComboItem GetAbilityItem(string name, char suffix, int value) + { + var display = $"{name} ({suffix})"; + return new ComboItem(display, value); + } } diff --git a/PKHeX.Core/Legality/Encounters/Generator/EncounterMutation.cs b/PKHeX.Core/Legality/Encounters/Generator/EncounterMutation.cs index 94b56802a..a19651bdc 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/EncounterMutation.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/EncounterMutation.cs @@ -83,6 +83,6 @@ public static EncounterMutation GetSuggested(EntityContext targetContext, byte l _ => false, }, OnlyHidden => end.CanBeHidden() || mutation.HasFlag(CanAbilityPatch), - _ => false, + _ => true, }; } diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen5/EncounterEgg5.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen5/EncounterEgg5.cs index a0416eed1..704e6ea78 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen5/EncounterEgg5.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen5/EncounterEgg5.cs @@ -77,6 +77,8 @@ public PK5 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) pk.PID = pid; pk.Gender = gender; pk.RefreshAbility(ability); + if (ability == 0 && this is { Species: (int)Core.Species.Basculin, Form: 1 }) + pk.Ability = (int)Core.Ability.Reckless; return pk; } diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen5/EncounterSlot5.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen5/EncounterSlot5.cs index 0ac4e9a42..a627a8f93 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen5/EncounterSlot5.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen5/EncounterSlot5.cs @@ -90,6 +90,8 @@ private void SetPINGA(PK5 pk, in EncounterCriteria criteria, PersonalInfo5B2W2 p var abilityIndex = Ability == AbilityPermission.OnlyHidden ? 2 : (int)((pk.PID >> 16) & 1); pk.RefreshAbility(abilityIndex); criteria.SetRandomIVs(pk); + if (abilityIndex == 0 && this is { Species: (int)Core.Species.Basculin, Form: 1, Version: GameVersion.B or GameVersion.W }) + pk.Ability = (int)Core.Ability.Reckless; } #endregion diff --git a/PKHeX.Core/Legality/Verifiers/Ability/AbilityVerifier.cs b/PKHeX.Core/Legality/Verifiers/Ability/AbilityVerifier.cs index ba4c3ec14..7bcfba611 100644 --- a/PKHeX.Core/Legality/Verifiers/Ability/AbilityVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/Ability/AbilityVerifier.cs @@ -30,6 +30,8 @@ private CheckResult VerifyAbility(LegalityAnalysis data) var pk = data.Entity; if (pk is PA9 pa9) return VerifyBirthAbility(data, pa9); + if (pk is PK5 pk5 && IsEdgeCaseBasculin(data, pk5, out var basc)) + return basc; var abilities = (IPersonalAbility12)data.PersonalInfo; @@ -95,6 +97,42 @@ private CheckResult VerifyAbility(LegalityAnalysis data) return VerifyAbility(data, abilities, abilIndex); } + private bool IsEdgeCaseBasculin(LegalityAnalysis data, PK5 pk5, out CheckResult result) + { + result = default; + // Gen5 Only Edge Case issue: + // - Basculin-Blue (form 1) *should* have Rock Head. + // In B/W, Blue-Striped Basculin have Reckless as its Ability (incorrect) due to referencing the wrong Personal Info. + // - However, the in-game trade Blue-Striped Basculin in White that has Rock Head (correct). + // In B2/W2, wild Blue-Striped Basculin have Rock Head (correct), but bred Blue-Striped Basculin have Reckless (incorrect). + // - When transferred to Pokémon Bank, any Blue-Striped Basculin with Reckless have their Ability changed to Rock Head (fixed). + // Impacted encounter types: Egg|Wild (B/W), Egg (B2/W2) + + if (pk5 is not { Species: (int)Species.Basculin, Form: 1, HiddenAbility: false, Ability: not (int)Ability.Adaptability }) + return false; // check abilities as usual. + + var expect = (int)Ability.RockHead; // correct. + if (pk5.Version is GameVersion.B2 or GameVersion.W2) + { + var enc = data.EncounterMatch; + if (enc is EncounterEgg5) + expect = (int)Ability.Reckless; // incorrect + } + else if (pk5.Version is GameVersion.B or GameVersion.W) + { + var enc = data.EncounterMatch; + if (enc is not EncounterTrade5BW) + expect = (int)Ability.Reckless; // incorrect + } + + var current = pk5.Ability; + if (current == expect) + result = VALID; + else + result = GetInvalid(AbilityUnexpected); + return true; // tell the analyzer to use this result + } + public static bool IsValidAbilityBits(int bitNum) => bitNum is 1 or 2 or 4; private CheckResult VerifyAbility(LegalityAnalysis data, IPersonalAbility12 abilities, int abilIndex) diff --git a/PKHeX.Core/PKM/PK5.cs b/PKHeX.Core/PKM/PK5.cs index e55169d6f..de29cef29 100644 --- a/PKHeX.Core/PKM/PK5.cs +++ b/PKHeX.Core/PKM/PK5.cs @@ -508,6 +508,13 @@ public PK6 ConvertToPK6() StringConverter345.TransferGlyphs56(pk6.NicknameTrash); StringConverter345.TransferString56(OriginalTrainerTrash, pk6.OriginalTrainerTrash); + // Fix Basculin-Blue + if (Species is (ushort)Core.Species.Basculin && Form == 1 && Ability == (int)Core.Ability.Reckless) + { + pk6.Ability = (int)Core.Ability.RockHead; + pk6.AbilityNumber = 1; + } + // Fix Checksum pk6.RefreshChecksum(); diff --git a/PKHeX.WinForms/Controls/PKM Editor/EditPK5.cs b/PKHeX.WinForms/Controls/PKM Editor/EditPK5.cs index e8bab6c17..cca5cb534 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/EditPK5.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/EditPK5.cs @@ -22,7 +22,7 @@ private void PopulateFieldsPK5() if (HaX) DEV_Ability.SelectedValue = pk5.Ability; else if (pk5.HiddenAbility) - CB_Ability.SelectedIndex = CB_Ability.Items.Count - 1; + CB_Ability.SelectedIndex = 2; else LoadAbility4(pk5); @@ -45,7 +45,7 @@ private PK5 PreparePK5() pk5.PokeStarFame = (byte)NUD_PokeStarFame.Value; if (!HaX) { - pk5.HiddenAbility = CB_Ability.SelectedIndex is not (0 or 1); + pk5.HiddenAbility = CB_Ability.SelectedIndex is 2; } else { diff --git a/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs b/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs index ef4131111..183dfb02d 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs @@ -398,11 +398,16 @@ private void LoadAbility4(PKM pk) private static int GetAbilityIndex4(PKM pk) { var pi = pk.PersonalInfo; - int abilityIndex = pi.GetIndexOfAbility(pk.Ability); - if (abilityIndex < 0) - return 0; + var ability = pk.Ability; + int abilityIndex = pi.GetIndexOfAbility(ability); if (abilityIndex >= 2) return 2; + if (abilityIndex < 0) + { + if (ability == (int)Ability.Reckless && pk is { Context: EntityContext.Gen5, Species: (ushort)Species.Basculin, Form: 1 }) + return 3; // manually appended "extra" bug case for Gen5 Basculin-Blue. + return 0; // fall back to first ability. + } var abils = (IPersonalAbility12)pi; if (abils.IsAbility12Same) diff --git a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs index c578eb8ac..a1c86a2bd 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs @@ -513,6 +513,8 @@ private void SetAbilityList() bool tmp = FieldsLoaded; FieldsLoaded = false; var items = GameInfo.FilteredSources.GetAbilityList(Entity.PersonalInfo); + if (Entity is { Context: EntityContext.Gen5, Species: (ushort)Species.Basculin, Form: 1 }) + items = [..items, FilteredGameDataSource.GetAbilityItem(GameInfo.Strings.abilitylist, (int)Ability.Reckless, '*')]; CB_Ability.DataSource = items; CB_Ability.SelectedIndex = Math.Clamp(ability, 0, items.Count - 1); // restore original index if available FieldsLoaded = tmp; diff --git a/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 5/0550-01 - Basculin - C46358B4FA76 wrongAbility.pk5 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 5/0550-01 - Basculin - C46358B4FA76 wrongAbility.pk5 new file mode 100644 index 0000000000000000000000000000000000000000..019b75d918d95eb1b3055b5aeb26c70873e3ba03 GIT binary patch literal 220 zcmXT>wIzaqA^C_J69WSW17A>l2?K*$1p| Date: Thu, 11 Jun 2026 15:24:03 -0500 Subject: [PATCH 74/81] Add item sprite to inventory editor --- .../PKM/Util/Conversion/ItemConverter.cs | 14 +++++ .../Builder/SpriteBuilder.cs | 19 ++++--- .../Subforms/Save Editors/SAV_Inventory.cs | 53 +++++++++++++++++-- 3 files changed, 76 insertions(+), 10 deletions(-) diff --git a/PKHeX.Core/PKM/Util/Conversion/ItemConverter.cs b/PKHeX.Core/PKM/Util/Conversion/ItemConverter.cs index 0b671a987..13572eb3d 100644 --- a/PKHeX.Core/PKM/Util/Conversion/ItemConverter.cs +++ b/PKHeX.Core/PKM/Util/Conversion/ItemConverter.cs @@ -164,6 +164,20 @@ public static byte GetItemFuture1(byte value) return value; } + /// + /// Gets a format specific item index depending on the desired format and the provided item index & origin format. + /// + /// Item ID to convert + /// Current format + /// Converted item ID + public static int GetItemDisplay(int itemID, EntityContext format) => itemID == 0 ? 0 : format switch + { + EntityContext.Gen1 => GetItemFuture2(GetItemFuture1((byte)itemID)), + EntityContext.Gen2 => GetItemFuture2((byte)itemID), + EntityContext.Gen3 => GetItemFuture3((ushort)itemID), + _ => itemID, + }; + /// /// Gets a format specific value depending on the desired format and the provided item index & origin format. /// diff --git a/PKHeX.Drawing.PokeSprite/Builder/SpriteBuilder.cs b/PKHeX.Drawing.PokeSprite/Builder/SpriteBuilder.cs index 60ae21ba4..1f0f882a2 100644 --- a/PKHeX.Drawing.PokeSprite/Builder/SpriteBuilder.cs +++ b/PKHeX.Drawing.PokeSprite/Builder/SpriteBuilder.cs @@ -184,13 +184,7 @@ private Bitmap GetBaseImageFallback(ushort species, byte form, byte gender, uint private Bitmap LayerOverImageItem(Bitmap baseImage, int item, EntityContext context) { - var lump = HeldItemLumpUtil.GetIsLump(item, context); - var itemimg = lump switch - { - HeldItemLumpImage.TechnicalMachine => ItemTM, - HeldItemLumpImage.TechnicalRecord => ItemTR, - _ => (Image?)Resources.ResourceManager.GetObject(GetItemResourceName(item)) ?? UnknownItem, - }; + var itemimg = GetItemSprite(item, context); // Redraw item in bottom right corner; since images are cropped, try to not have them at the edge int x = baseImage.Width - itemimg.Width - ((ItemMaxSize - itemimg.Width) / 4) - ItemShiftX; @@ -198,6 +192,17 @@ private Bitmap LayerOverImageItem(Bitmap baseImage, int item, EntityContext cont return ImageUtil.LayerImage(baseImage, itemimg, x, y); } + public Bitmap GetItemSprite(int item, EntityContext context) + { + var lump = HeldItemLumpUtil.GetIsLump(item, context); + return lump switch + { + HeldItemLumpImage.TechnicalMachine => ItemTM, + HeldItemLumpImage.TechnicalRecord => ItemTR, + _ => (Bitmap?)Resources.ResourceManager.GetObject(GetItemResourceName(item)) ?? UnknownItem, + }; + } + private static Bitmap LayerOverImageShiny(Bitmap baseImage, Shiny shiny) { // Add shiny star to top left of image. diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs index c2482ec9d..61aab606e 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Windows.Forms; using PKHeX.Core; +using PKHeX.Drawing.PokeSprite; using PKHeX.WinForms.Controls; using static PKHeX.Core.MessageStrings; @@ -15,6 +16,8 @@ public sealed partial class SAV_Inventory : Form private static readonly ImageList IL_Pouch = InventoryTypeImageUtil.GetImageList(); + private readonly Bitmap _none = new(1, 1); + public SAV_Inventory(SaveFile sav) { InitializeComponent(); @@ -69,6 +72,9 @@ public SAV_Inventory(SaveFile sav) private readonly bool HasNewShop; private readonly bool HasHeld; private bool IsCountValidationSuppressed; + private bool DropDownNextComboEdit; + + private const int ColumnSprite = 0; // assume that all pouches have the same amount of columns private int ColumnItem; @@ -113,10 +119,13 @@ private DoubleBufferedDataGridView GetDGV(InventoryPouch pouch) { // Add DataGrid var dgv = GetBaseDataGrid(pouch); + dgv.CellMouseDown += Dgv_CellMouseDown; dgv.CellValueChanged += Dgv_CellValueChanged; dgv.EditingControlShowing += Dgv_EditingControlShowing; + dgv.CurrentCellDirtyStateChanged += Dgv_CurrentCellDirtyStateChanged; // Get Columns + dgv.Columns.Add(GetSpriteColumn()); var item = GetItemColumn(ColumnItem = dgv.Columns.Count); dgv.Columns.Add(item); dgv.Columns.Add(GetCountColumn(ColumnCount = dgv.Columns.Count)); @@ -166,9 +175,20 @@ private static DoubleBufferedDataGridView GetBaseDataGrid(InventoryPouch pouch) SelectionMode = DataGridViewSelectionMode.CellSelect, CellBorderStyle = DataGridViewCellBorderStyle.None, + RowTemplate = { Height = 24 }, Tag = pouch, }; + private static DataGridViewImageColumn GetSpriteColumn() => new() + { + HeaderText = string.Empty, + DisplayIndex = ColumnSprite, + ReadOnly = true, + ImageLayout = DataGridViewImageCellLayout.Zoom, + AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader, + DividerWidth = 2, + }; + private DataGridViewComboBoxColumn GetItemColumn(int c, string name = "Item") => new() { HeaderText = name, @@ -193,9 +213,16 @@ private static DataGridViewTextBoxColumn GetCountColumn(int c, string name = "Co DisplayIndex = c, Width = 45, DefaultCellStyle = { Alignment = DataGridViewContentAlignment.MiddleCenter }, + DividerWidth = 2, MaxInputLength = 5 // enough to cover ushort.MaxValue (absolute maximum of any quantity ever allowed) }; + private static void Dgv_CurrentCellDirtyStateChanged(object? sender, EventArgs e) + { + if (sender is DataGridView { IsCurrentCellDirty: true } dgv) + dgv.CommitEdit(DataGridViewDataErrorContexts.Commit); + } + private void LoadAllBags() { foreach (var pouch in Bag.Pouches) @@ -237,6 +264,7 @@ private void GetBag(DataGridView dgv, InventoryPouch pouch) item = pouch.Items[i] = pouch.GetEmpty(); var cells = dgv.Rows[i].Cells; + UpdateSprite(cells, item.Index); cells[ColumnItem].Value = itemlist[item.Index]; cells[ColumnCount].Value = item.Count; @@ -271,13 +299,15 @@ private void Dgv_CellValueChanged(object? sender, DataGridViewCellEventArgs e) if (sender is not DataGridView { Tag: InventoryPouch pouch } dgv) return; - // Sanity check the item count against its maximum var cells = dgv.Rows[e.RowIndex].Cells; var itemName = cells[ColumnItem].Value?.ToString(); if (string.IsNullOrEmpty(itemName)) return; var itemID = itemlist.IndexOf(itemName); + UpdateSprite(cells, itemID); + + // Sanity check the item count against its maximum var cell = cells[ColumnCount]; var text = cell.Value?.ToString(); var count = Util.ToInt32(text); @@ -290,11 +320,28 @@ private void Dgv_CellValueChanged(object? sender, DataGridViewCellEventArgs e) IsCountValidationSuppressed = false; } - private static void Dgv_EditingControlShowing(object? sender, DataGridViewEditingControlShowingEventArgs e) + private void Dgv_CellMouseDown(object? sender, DataGridViewCellMouseEventArgs e) { - if (sender is not DataGridView dgv || e.Control is not ComboBox cb) + DropDownNextComboEdit = sender is DataGridView dgv && + e is { Button: MouseButtons.Left, RowIndex: >= 0, ColumnIndex: >= 0 } && + dgv.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn; + } + + private void UpdateSprite(DataGridViewCellCollection cells, int itemID) + { + var context = Origin.Context; + itemID = ItemConverter.GetItemDisplay(itemID, context); + cells[ColumnSprite].Value = itemID == 0 ? _none : SpriteUtil.Spriter.GetItemSprite(itemID, context); + } + + + private void Dgv_EditingControlShowing(object? sender, DataGridViewEditingControlShowingEventArgs e) + { + if (sender is not DataGridView dgv || e.Control is not ComboBox cb || !DropDownNextComboEdit) return; + DropDownNextComboEdit = false; + if (dgv.CurrentCell?.OwningColumn is not DataGridViewComboBoxColumn) return; From 27c9bf0b8956dd536d6d1b02c8fb7bd81f94ad3e Mon Sep 17 00:00:00 2001 From: Manu <52102823+Manu098vm@users.noreply.github.com> Date: Fri, 12 Jun 2026 02:28:28 +0200 Subject: [PATCH 75/81] PJCS Garchomp (#4820) Co-authored-by: 9B1td0 <157295620+9B1td0@users.noreply.github.com> Co-authored-by: Lusamine <30205550+Lusamine@users.noreply.github.com> --- PKHeX.Core/Legality/Encounters/Data/Live/EncounterServerDate.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/PKHeX.Core/Legality/Encounters/Data/Live/EncounterServerDate.cs b/PKHeX.Core/Legality/Encounters/Data/Live/EncounterServerDate.cs index 571ea9503..f709d02ad 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Live/EncounterServerDate.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Live/EncounterServerDate.cs @@ -244,6 +244,7 @@ public static class EncounterServerDate {9024, new(2024, 10, 16)}, // Shiny Meloetta {9025, new(2024, 11, 01)}, // PokéCenter Birthday Tandemaus {9030, new(2025, 10, 31)}, // PokéCenter Fidough Birthday Gift + {9035, new(2026, 06, 05, +1)} // PJCS26 Garchomp }; /// From 65535efa55c89f7d09480375612114c3cd240c8e Mon Sep 17 00:00:00 2001 From: Kurt Date: Thu, 11 Jun 2026 23:31:22 -0500 Subject: [PATCH 76/81] Misc tweaks Reflow inventory editor, gridlines and too-wide sprite column, row select Make troubleshooting menu items visible for all builds, add localization Show filename in label for savefile force loader --- .../text/program/MessageStrings_de.txt | 4 + .../text/program/MessageStrings_en.txt | 4 + .../text/program/MessageStrings_es-419.txt | 4 + .../text/program/MessageStrings_es.txt | 4 + .../text/program/MessageStrings_fr.txt | 4 + .../text/program/MessageStrings_it.txt | 4 + .../text/program/MessageStrings_ja.txt | 4 + .../text/program/MessageStrings_ko.txt | 4 + .../text/program/MessageStrings_zh-Hans.txt | 4 + .../text/program/MessageStrings_zh-Hant.txt | 4 + PKHeX.Core/Util/MessageStrings.cs | 9 ++ PKHeX.WinForms/MainWindow/Main.Designer.cs | 98 +++++++++++++++---- PKHeX.WinForms/MainWindow/Main.cs | 6 +- PKHeX.WinForms/Resources/text/lang_de.txt | 4 + PKHeX.WinForms/Resources/text/lang_en.txt | 4 + PKHeX.WinForms/Resources/text/lang_es-419.txt | 4 + PKHeX.WinForms/Resources/text/lang_es.txt | 4 + PKHeX.WinForms/Resources/text/lang_fr.txt | 4 + PKHeX.WinForms/Resources/text/lang_it.txt | 4 + PKHeX.WinForms/Resources/text/lang_ja.txt | 4 + PKHeX.WinForms/Resources/text/lang_ko.txt | 4 + .../Resources/text/lang_zh-Hans.txt | 4 + .../Resources/text/lang_zh-Hant.txt | 4 + .../Save Editors/SAV_Inventory.Designer.cs | 97 ++++++++++++------ .../Subforms/Save Editors/SAV_Inventory.cs | 11 +-- .../SaveHandlerTroubleshooter.Designer.cs | 92 +++++++++-------- .../Subforms/SaveHandlerTroubleshooter.cs | 8 +- PKHeX.WinForms/Util/Troubleshooting.cs | 56 ++++++++--- 28 files changed, 343 insertions(+), 114 deletions(-) diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_de.txt b/PKHeX.Core/Resources/text/program/MessageStrings_de.txt index 11a205380..bcbaecfe4 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_de.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_de.txt @@ -94,6 +94,10 @@ MsgDatabase = Die PKHeX Datenbank wurde nicht gefunden. MsgDatabaseAdvice = Bitte exportiere alle Boxen von einem Spielstand, dann stelle sicher, dass der '{0}' Ordner existiert. MsgDatabaseExport = In der PKHeX Datenbank speichern? MsgDatabaseLoad = Von der PKHeX Datenbank laden? +MsgTroubleshootingClipboardEmpty = Zwischenablage ist leer. +MsgTroubleshootingClipboardInvalidHex = Die Zwischenablage enthält keinen gültigen Hex-String. +MsgTroubleshootingPluginListHeader = Geladene {0} Plugins: +MsgTroubleshootingPluginListEmpty = Keine Plugins geladen. MsgPKMLoadNull = Es wurde versucht eine leere Datei zu laden. MsgPKMSuggestionFormat = Vorschläge sind für dieses PKM Format nicht aktiviert. MsgPKMSuggestionMoves = Die vorgeschlagenen Attacken anwenden? diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_en.txt b/PKHeX.Core/Resources/text/program/MessageStrings_en.txt index 1cd53ab2f..12a9139ef 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_en.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_en.txt @@ -94,6 +94,10 @@ MsgDatabase = PKHeX's database was not found. MsgDatabaseAdvice = Please dump all boxes from a save file, then ensure the '{0}' folder exists. MsgDatabaseExport = Save to PKHeX's database? MsgDatabaseLoad = Load from PKHeX's database? +MsgTroubleshootingClipboardEmpty = Clipboard is empty. +MsgTroubleshootingClipboardInvalidHex = Clipboard does not contain a valid hex string. +MsgTroubleshootingPluginListHeader = Loaded {0} plugins: +MsgTroubleshootingPluginListEmpty = No plugins loaded. MsgPKMLoadNull = Attempted to load a null file. MsgPKMSuggestionFormat = Suggestions are not enabled for this PKM format. MsgPKMSuggestionMoves = Apply suggested current moves? diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_es-419.txt b/PKHeX.Core/Resources/text/program/MessageStrings_es-419.txt index f485a2faf..f58bc8efc 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_es-419.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_es-419.txt @@ -94,6 +94,10 @@ MsgDatabase = No se ha encontrado la base de datos de PKHeX. MsgDatabaseAdvice = Por favor, exporta todas las cajas del archivo de guardado, y asegúrate de que el directorio '{0}' exista. MsgDatabaseExport = ¿Guardar a la base de datos de PKHeX? MsgDatabaseLoad = ¿Cargar desde la base de datos de PKHeX? +MsgTroubleshootingClipboardEmpty = El portapapeles está vacío. +MsgTroubleshootingClipboardInvalidHex = El portapapeles no contiene una cadena hexadecimal válida. +MsgTroubleshootingPluginListHeader = Se cargaron {0} complementos: +MsgTroubleshootingPluginListEmpty = No hay complementos cargados. MsgPKMLoadNull = Se ha intentado cargar un archivo nulo. MsgPKMSuggestionFormat = Las sugerencias no están activadas para este formato de PKM. MsgPKMSuggestionMoves = ¿Aplicar movimientos actuales sugeridos? diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_es.txt b/PKHeX.Core/Resources/text/program/MessageStrings_es.txt index e7b3a3c94..5f5d937db 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_es.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_es.txt @@ -94,6 +94,10 @@ MsgDatabase = No se ha encontrado la base de datos de PKHeX. MsgDatabaseAdvice = Por favor, exporta todas las cajas del archivo de guardado, y asegúrate de que el directorio '{0}' exista. MsgDatabaseExport = ¿Guardar a la base de datos de PKHeX? MsgDatabaseLoad = ¿Cargar desde la base de datos de PKHeX? +MsgTroubleshootingClipboardEmpty = El portapapeles está vacío. +MsgTroubleshootingClipboardInvalidHex = El portapapeles no contiene una cadena hexadecimal válida. +MsgTroubleshootingPluginListHeader = Se cargaron {0} complementos: +MsgTroubleshootingPluginListEmpty = No hay complementos cargados. MsgPKMLoadNull = Se ha intentado cargar un archivo nulo. MsgPKMSuggestionFormat = Las sugerencias no están activadas para este formato de PKM. MsgPKMSuggestionMoves = ¿Aplicar movimientos actuales sugeridos? diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_fr.txt b/PKHeX.Core/Resources/text/program/MessageStrings_fr.txt index ad1c7dc87..d37659670 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_fr.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_fr.txt @@ -94,6 +94,10 @@ MsgDatabase = Base de Données PKHeX introuvable. MsgDatabaseAdvice = Veuillez extraire toutes les boîtes d'une sauvegarde, puis assurez-vous que le dossier '{0}' existe. MsgDatabaseExport = Sauvegarder vers la base de données de PKHeX ? MsgDatabaseLoad = Charger depuis la base de données de PKHeX ? +MsgTroubleshootingClipboardEmpty = Le presse-papiers est vide. +MsgTroubleshootingClipboardInvalidHex = Le presse-papiers ne contient pas une chaîne hexadécimale valide. +MsgTroubleshootingPluginListHeader = {0} plugins chargés : +MsgTroubleshootingPluginListEmpty = Aucun plugin chargé. MsgPKMLoadNull = Le fichier n'a pas pu être chargé car il est vide. MsgPKMSuggestionFormat = Pas de suggestions pour ce format PKM. MsgPKMSuggestionMoves = Appliquer les capacités suggérées ? diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_it.txt b/PKHeX.Core/Resources/text/program/MessageStrings_it.txt index 9d08edbd2..a3ea409a3 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_it.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_it.txt @@ -94,6 +94,10 @@ MsgDatabase = Il Database di PKHeXnon è stato trovato. MsgDatabaseAdvice = Per favore, dumpa tutti i box da un file di salvataggio, poi assicurati che la cartella '{0}' esista. MsgDatabaseExport = Salvare nel database di PKHeX? MsgDatabaseLoad = Caricare dal Database di PKHeX? +MsgTroubleshootingClipboardEmpty = Gli appunti sono vuoti. +MsgTroubleshootingClipboardInvalidHex = Gli appunti non contengono una stringa esadecimale valida. +MsgTroubleshootingPluginListHeader = Caricati {0} plugin: +MsgTroubleshootingPluginListEmpty = Nessun plugin caricato. MsgPKMLoadNull = Rilevato caricamento di un file nullo. MsgPKMSuggestionFormat = I suggerimenti non sono abilitati in questo formato PKM. MsgPKMSuggestionMoves = Impostare le mosse attuali suggerite? diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_ja.txt b/PKHeX.Core/Resources/text/program/MessageStrings_ja.txt index ec671c19e..01c7a9c4a 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_ja.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_ja.txt @@ -94,6 +94,10 @@ MsgDatabase = PKHeXデータベースが見つかりませんでした。 MsgDatabaseAdvice = セーブファイルからすべてのボックスをダンプし、 '{0}' フォルダが存在することを確認してください。 MsgDatabaseExport = PKHeXデータベースにセーブしますか? MsgDatabaseLoad = PKHeXデータベースからロードしますか? +MsgTroubleshootingClipboardEmpty = クリップボードは空です。 +MsgTroubleshootingClipboardInvalidHex = クリップボードに有効な16進文字列が含まれていません。 +MsgTroubleshootingPluginListHeader = {0}個のプラグインが読み込まれました: +MsgTroubleshootingPluginListEmpty = 読み込まれたプラグインはありません。 MsgPKMLoadNull = NULLファイルをロードしようとしました。 MsgPKMSuggestionFormat = このPKMフォーマットでは、おすすめ機能は使用できません。 MsgPKMSuggestionMoves = この技のおすすめを適用しますか? diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_ko.txt b/PKHeX.Core/Resources/text/program/MessageStrings_ko.txt index 39bf2709f..072a106c2 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_ko.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_ko.txt @@ -94,6 +94,10 @@ MsgDatabase = PKHeX 데이터베이스를 찾을 수 없습니다. MsgDatabaseAdvice = 세이브 파일의 모든 박스를 덤프하고 '{0}' 폴더가 있는지 확인하세요. MsgDatabaseExport = PKHeX 데이터베이스에 저장하시겠습니까? MsgDatabaseLoad = PKHeX 데이터베이스에서 불러오시겠습니까? +MsgTroubleshootingClipboardEmpty = 클립보드가 비어 있습니다. +MsgTroubleshootingClipboardInvalidHex = 클립보드에 유효한 16진 문자열이 없습니다. +MsgTroubleshootingPluginListHeader = {0}개의 플러그인이 로드되었습니다: +MsgTroubleshootingPluginListEmpty = 로드된 플러그인이 없습니다. MsgPKMLoadNull = null 파일을 불러오려고 시도했습니다. MsgPKMSuggestionFormat = 이 PKM 포맷에는 제안을 사용할 수 없습니다. MsgPKMSuggestionMoves = 현재 기술에 대한 제안을 적용하시겠습니까? diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_zh-Hans.txt b/PKHeX.Core/Resources/text/program/MessageStrings_zh-Hans.txt index 539c7d4d0..e245af770 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_zh-Hans.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_zh-Hans.txt @@ -94,6 +94,10 @@ MsgDatabase = 未找到 PKHeX 的数据库。 MsgDatabaseAdvice = 请导出存档文件的所有盒子, 确保" {0} "文件夹存在。 MsgDatabaseExport = 保存到 PKHeX 的数据库? MsgDatabaseLoad = 从 PKHeX 的数据库导入? +MsgTroubleshootingClipboardEmpty = 剪贴板为空。 +MsgTroubleshootingClipboardInvalidHex = 剪贴板不包含有效的十六进制字符串。 +MsgTroubleshootingPluginListHeader = 已加载 {0} 个插件: +MsgTroubleshootingPluginListEmpty = 未加载插件。 MsgPKMLoadNull = 试图加载了一个空文件。 MsgPKMSuggestionFormat = 对该宝可梦文件格式,建议模式未启用。 MsgPKMSuggestionMoves = 设为下列推荐的招式? diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_zh-Hant.txt b/PKHeX.Core/Resources/text/program/MessageStrings_zh-Hant.txt index 813341903..3be760e74 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_zh-Hant.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_zh-Hant.txt @@ -94,6 +94,10 @@ MsgDatabase = 未找到 PKHeX 之資料庫。 MsgDatabaseAdvice = 請匯出儲存資料檔之所有盒子, 確保「 {0} 」資料夾存在。 MsgDatabaseExport = 是否保存至 PKHeX 資料庫? MsgDatabaseLoad = 是否從 PKHeX 資料庫匯入? +MsgTroubleshootingClipboardEmpty = 剪貼簿為空。 +MsgTroubleshootingClipboardInvalidHex = 剪貼簿中不包含有效的十六進位字串。 +MsgTroubleshootingPluginListHeader = 已載入 {0} 個外掛: +MsgTroubleshootingPluginListEmpty = 未載入任何外掛。 MsgPKMLoadNull = 試圖載入了一個空檔案。 MsgPKMSuggestionFormat = 對此寶可夢檔案格式,建議模式未啟用。 MsgPKMSuggestionMoves = 是否設置為下列推薦之招式? diff --git a/PKHeX.Core/Util/MessageStrings.cs b/PKHeX.Core/Util/MessageStrings.cs index 94a293f82..e33347168 100644 --- a/PKHeX.Core/Util/MessageStrings.cs +++ b/PKHeX.Core/Util/MessageStrings.cs @@ -133,6 +133,15 @@ public static class MessageStrings #endregion + #region Troubleshooting + + public static string MsgTroubleshootingClipboardEmpty { get; set; } = "Clipboard is empty."; + public static string MsgTroubleshootingClipboardInvalidHex { get; set; } = "Clipboard does not contain a valid hex string."; + public static string MsgTroubleshootingPluginListHeader { get; set; } = "Loaded {0} plugins:"; + public static string MsgTroubleshootingPluginListEmpty { get; set; } = "No plugins loaded."; + + #endregion + #region PKM Editor public static string MsgPKMLoadNull { get; set; } = "Attempted to load a null file."; diff --git a/PKHeX.WinForms/MainWindow/Main.Designer.cs b/PKHeX.WinForms/MainWindow/Main.Designer.cs index 2c90a2c13..5aaaccfd1 100644 --- a/PKHeX.WinForms/MainWindow/Main.Designer.cs +++ b/PKHeX.WinForms/MainWindow/Main.Designer.cs @@ -30,6 +30,7 @@ protected override void Dispose(bool disposing) public void InitializeComponent() { components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main)); menuStrip1 = new System.Windows.Forms.MenuStrip(); Menu_File = new System.Windows.Forms.ToolStripMenuItem(); Menu_Open = new System.Windows.Forms.ToolStripMenuItem(); @@ -67,6 +68,15 @@ public void InitializeComponent() PKME_Tabs = new PKHeX.WinForms.Controls.PKMEditor(); C_SAV = new PKHeX.WinForms.Controls.SAVEditor(); splitContainer2 = new System.Windows.Forms.SplitContainer(); + toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); + toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); + toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); menuStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit(); splitContainer1.Panel1.SuspendLayout(); @@ -95,7 +105,7 @@ public void InitializeComponent() // // Menu_File // - Menu_File.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { Menu_Open, Menu_Save, Menu_ExportSAV, Menu_Exit }); + Menu_File.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { Menu_Open, toolStripSeparator9, Menu_Save, Menu_ExportSAV, toolStripSeparator3, Menu_Exit }); Menu_File.Name = "Menu_File"; Menu_File.Size = new System.Drawing.Size(39, 21); Menu_File.Text = "File"; @@ -106,7 +116,7 @@ public void InitializeComponent() Menu_Open.Name = "Menu_Open"; Menu_Open.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O; Menu_Open.ShowShortcutKeys = false; - Menu_Open.Size = new System.Drawing.Size(141, 22); + Menu_Open.Size = new System.Drawing.Size(180, 22); Menu_Open.Text = "&Open..."; Menu_Open.Click += MainMenuOpen; // @@ -116,7 +126,7 @@ public void InitializeComponent() Menu_Save.Name = "Menu_Save"; Menu_Save.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S; Menu_Save.ShowShortcutKeys = false; - Menu_Save.Size = new System.Drawing.Size(141, 22); + Menu_Save.Size = new System.Drawing.Size(180, 22); Menu_Save.Text = "&Save PKM..."; Menu_Save.Click += MainMenuSave; // @@ -126,7 +136,7 @@ public void InitializeComponent() Menu_ExportSAV.Name = "Menu_ExportSAV"; Menu_ExportSAV.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E; Menu_ExportSAV.ShowShortcutKeys = false; - Menu_ExportSAV.Size = new System.Drawing.Size(141, 22); + Menu_ExportSAV.Size = new System.Drawing.Size(180, 22); Menu_ExportSAV.Text = "&Export SAV..."; Menu_ExportSAV.Click += ClickExportSAV; // @@ -136,23 +146,23 @@ public void InitializeComponent() Menu_Exit.Name = "Menu_Exit"; Menu_Exit.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Q; Menu_Exit.ShowShortcutKeys = false; - Menu_Exit.Size = new System.Drawing.Size(141, 22); + Menu_Exit.Size = new System.Drawing.Size(180, 22); Menu_Exit.Text = "&Quit"; Menu_Exit.Click += MainMenuExit; // // Menu_Tools // - Menu_Tools.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { Menu_Showdown, Menu_Data, Menu_Folder }); + Menu_Tools.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { Menu_Showdown, Menu_Data, toolStripSeparator7, Menu_Folder }); Menu_Tools.Name = "Menu_Tools"; Menu_Tools.Size = new System.Drawing.Size(51, 21); Menu_Tools.Text = "Tools"; // // Menu_Showdown // - Menu_Showdown.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { Menu_ShowdownImportPKM, Menu_ShowdownExportPKM, Menu_ShowdownExportParty, Menu_ShowdownExportCurrentBox }); + Menu_Showdown.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { Menu_ShowdownImportPKM, toolStripSeparator8, Menu_ShowdownExportPKM, Menu_ShowdownExportParty, Menu_ShowdownExportCurrentBox }); Menu_Showdown.Image = Properties.Resources.showdown; Menu_Showdown.Name = "Menu_Showdown"; - Menu_Showdown.Size = new System.Drawing.Size(141, 22); + Menu_Showdown.Size = new System.Drawing.Size(180, 22); Menu_Showdown.Text = "Showdown"; // // Menu_ShowdownImportPKM @@ -193,10 +203,10 @@ public void InitializeComponent() // // Menu_Data // - Menu_Data.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { Menu_LoadBoxes, Menu_DumpBoxes, Menu_DumpBox, Menu_Report, Menu_Database, Menu_MGDatabase, Menu_EncDatabase, Menu_BatchEditor }); + Menu_Data.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { Menu_LoadBoxes, Menu_DumpBoxes, Menu_DumpBox, toolStripSeparator4, Menu_Report, toolStripSeparator6, Menu_Database, Menu_MGDatabase, Menu_EncDatabase, toolStripSeparator5, Menu_BatchEditor }); Menu_Data.Image = Properties.Resources.data; Menu_Data.Name = "Menu_Data"; - Menu_Data.Size = new System.Drawing.Size(141, 22); + Menu_Data.Size = new System.Drawing.Size(180, 22); Menu_Data.Text = "Data"; // // Menu_LoadBoxes @@ -279,13 +289,13 @@ public void InitializeComponent() Menu_Folder.Name = "Menu_Folder"; Menu_Folder.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F; Menu_Folder.ShowShortcutKeys = false; - Menu_Folder.Size = new System.Drawing.Size(141, 22); + Menu_Folder.Size = new System.Drawing.Size(180, 22); Menu_Folder.Text = "Open Folder"; Menu_Folder.Click += MainMenuFolder; // // Menu_Options // - Menu_Options.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { Menu_Language, Menu_Undo, Menu_Redo, Menu_Settings, Menu_About }); + Menu_Options.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { Menu_Language, toolStripSeparator1, Menu_Undo, Menu_Redo, toolStripSeparator2, Menu_Settings, Menu_About }); Menu_Options.Name = "Menu_Options"; Menu_Options.Size = new System.Drawing.Size(66, 21); Menu_Options.Text = "Options"; @@ -295,7 +305,7 @@ public void InitializeComponent() Menu_Language.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { CB_MainLanguage }); Menu_Language.Image = Properties.Resources.language; Menu_Language.Name = "Menu_Language"; - Menu_Language.Size = new System.Drawing.Size(175, 22); + Menu_Language.Size = new System.Drawing.Size(180, 22); Menu_Language.Text = "Language"; // // CB_MainLanguage @@ -312,7 +322,7 @@ public void InitializeComponent() Menu_Undo.Name = "Menu_Undo"; Menu_Undo.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.U; Menu_Undo.ShowShortcutKeys = false; - Menu_Undo.Size = new System.Drawing.Size(175, 22); + Menu_Undo.Size = new System.Drawing.Size(180, 22); Menu_Undo.Text = "Undo Last Change"; Menu_Undo.Click += ClickUndo; // @@ -323,7 +333,7 @@ public void InitializeComponent() Menu_Redo.Name = "Menu_Redo"; Menu_Redo.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Y; Menu_Redo.ShowShortcutKeys = false; - Menu_Redo.Size = new System.Drawing.Size(175, 22); + Menu_Redo.Size = new System.Drawing.Size(180, 22); Menu_Redo.Text = "Redo Last Change"; Menu_Redo.Click += ClickRedo; // @@ -333,7 +343,7 @@ public void InitializeComponent() Menu_Settings.Name = "Menu_Settings"; Menu_Settings.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift | System.Windows.Forms.Keys.S; Menu_Settings.ShowShortcutKeys = false; - Menu_Settings.Size = new System.Drawing.Size(175, 22); + Menu_Settings.Size = new System.Drawing.Size(180, 22); Menu_Settings.Text = "Settings"; Menu_Settings.Click += MainMenuSettings; // @@ -343,7 +353,7 @@ public void InitializeComponent() Menu_About.Name = "Menu_About"; Menu_About.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.P; Menu_About.ShowShortcutKeys = false; - Menu_About.Size = new System.Drawing.Size(175, 22); + Menu_About.Size = new System.Drawing.Size(180, 22); Menu_About.Text = "About &PKHeX"; Menu_About.Click += MainMenuAbout; // @@ -475,6 +485,51 @@ public void InitializeComponent() splitContainer2.SplitterWidth = 1; splitContainer2.TabIndex = 106; // + // toolStripSeparator1 + // + toolStripSeparator1.Name = "toolStripSeparator1"; + toolStripSeparator1.Size = new System.Drawing.Size(177, 6); + // + // toolStripSeparator2 + // + toolStripSeparator2.Name = "toolStripSeparator2"; + toolStripSeparator2.Size = new System.Drawing.Size(177, 6); + // + // toolStripSeparator3 + // + toolStripSeparator3.Name = "toolStripSeparator3"; + toolStripSeparator3.Size = new System.Drawing.Size(177, 6); + // + // toolStripSeparator4 + // + toolStripSeparator4.Name = "toolStripSeparator4"; + toolStripSeparator4.Size = new System.Drawing.Size(194, 6); + // + // toolStripSeparator5 + // + toolStripSeparator5.Name = "toolStripSeparator5"; + toolStripSeparator5.Size = new System.Drawing.Size(194, 6); + // + // toolStripSeparator6 + // + toolStripSeparator6.Name = "toolStripSeparator6"; + toolStripSeparator6.Size = new System.Drawing.Size(194, 6); + // + // toolStripSeparator7 + // + toolStripSeparator7.Name = "toolStripSeparator7"; + toolStripSeparator7.Size = new System.Drawing.Size(177, 6); + // + // toolStripSeparator8 + // + toolStripSeparator8.Name = "toolStripSeparator8"; + toolStripSeparator8.Size = new System.Drawing.Size(261, 6); + // + // toolStripSeparator9 + // + toolStripSeparator9.Name = "toolStripSeparator9"; + toolStripSeparator9.Size = new System.Drawing.Size(177, 6); + // // Main // AllowDrop = true; @@ -547,6 +602,15 @@ public void InitializeComponent() private System.Windows.Forms.SplitContainer splitContainer2; private PKHeX.WinForms.Controls.SelectablePictureBox dragout; private System.Windows.Forms.PictureBox PB_Legal; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; } } diff --git a/PKHeX.WinForms/MainWindow/Main.cs b/PKHeX.WinForms/MainWindow/Main.cs index 356b578f3..4ba5929f7 100644 --- a/PKHeX.WinForms/MainWindow/Main.cs +++ b/PKHeX.WinForms/MainWindow/Main.cs @@ -107,6 +107,10 @@ private void FormLoadAddEvents() dragout.ContextMenuStrip = mnu.mnuL; C_SAV.menu.RequestEditorLegality = DisplayLegalityReport; components.Add(mnu); + + // Add translatable extra menu controls. + Menu_Tools.DropDownItems.Add(new ToolStripSeparator()); + Troubleshooting.AddTroubleshootingControls(Menu_Tools, Plugins, true); } public void LoadInitialFiles(StartupArguments args) @@ -169,8 +173,6 @@ private void FormInitializeSecond() CB_MainLanguage.Items.AddRange(Enum.GetNames()); PB_Legal.Visible = !HaX; C_SAV.HaX = PKME_Tabs.HaX = HaX; - - Troubleshooting.AddTroubleshootingControls(Menu_Tools, Plugins); #if DEBUG DevUtil.AddDeveloperControls(Menu_Tools, Plugins); #endif diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index fc7a47ba4..3577003b2 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -594,11 +594,14 @@ Main.Menu_ExportBAK=Exportiere BAK Main.Menu_ExportSAV=Exportiere SAV... Main.Menu_File=Datei Main.Menu_Folder=Öffne Ordner +Main.Menu_ForceLoadSAV=SAV sofort laden +Main.Menu_HexImporter=Hex-Importer Main.Menu_Language=Sprache Main.Menu_LoadBoxes=Lade Boxen Main.Menu_MGDatabase=Wunderkarten Datenbank Main.Menu_Open=Öffnen... Main.Menu_Options=Optionen +Main.Menu_PluginInfo=Plugin-Info Main.Menu_PopoutBoxAll=Alle Boxen Main.Menu_PopoutBoxSingle=Einzelne Box Main.Menu_Redo=Letzte Änderung wiederholen @@ -611,6 +614,7 @@ Main.Menu_ShowdownExportParty=Exportiere Team in Zwischenablage Main.Menu_ShowdownExportPKM=Exportiere Set in Zwischenablage Main.Menu_ShowdownImportPKM=Importiere Set aus Zwischenablage Main.Menu_Tools=Werkzeuge +Main.Menu_Troubleshooting=Fehlersuche Main.Menu_Undo=Letzte Änderung rückgängig machen Main.mnu_Delete=Löschen Main.mnu_DeleteAll=Leeren diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index 27fb84e35..7b2a0cdf6 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -594,11 +594,14 @@ Main.Menu_ExportBAK=Export Backup Main.Menu_ExportSAV=&Export SAV... Main.Menu_File=&File Main.Menu_Folder=Open &Folder +Main.Menu_ForceLoadSAV=Force Load SAV +Main.Menu_HexImporter=Hex Importer 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_PluginInfo=Plugin Info Main.Menu_PopoutBoxAll=&All Boxes Main.Menu_PopoutBoxSingle=&Single Box Main.Menu_Redo=&Redo Last Change @@ -611,6 +614,7 @@ 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_Troubleshooting=Troubleshooting Main.Menu_Undo=&Undo Last Change Main.mnu_Delete=Delete Main.mnu_DeleteAll=Clear diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index c4d72135e..98bcd2d45 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -594,11 +594,14 @@ Main.Menu_ExportBAK=Exportar BAK Main.Menu_ExportSAV=Guardar SAV... Main.Menu_File=Archivo Main.Menu_Folder=Abrir carpeta +Main.Menu_ForceLoadSAV=Forzar carga de SAV +Main.Menu_HexImporter=Importador hex Main.Menu_Language=Idioma Main.Menu_LoadBoxes=Cargar Cajas Main.Menu_MGDatabase=Base de datos de Regalo Misterioso Main.Menu_Open=Abrir... Main.Menu_Options=Opciones +Main.Menu_PluginInfo=Información de complementos Main.Menu_PopoutBoxAll=Todas las cajas Main.Menu_PopoutBoxSingle=Caja individual Main.Menu_Redo=Rehacer último cambio @@ -611,6 +614,7 @@ Main.Menu_ShowdownExportParty=Exportar equipo al portapapeles Main.Menu_ShowdownExportPKM=Exportar al portapapeles Main.Menu_ShowdownImportPKM=Importar set desde el portapapeles Main.Menu_Tools=Herramientas +Main.Menu_Troubleshooting=Solución de problemas Main.Menu_Undo=Deshacer último cambio Main.mnu_Delete=Eliminar Main.mnu_DeleteAll=Limpiar diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index 1dce1359f..87b7ed025 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -594,11 +594,14 @@ Main.Menu_ExportBAK=Exportar BAK Main.Menu_ExportSAV=Guardar SAV... Main.Menu_File=Archivo Main.Menu_Folder=Abrir carpeta +Main.Menu_ForceLoadSAV=Forzar carga de SAV +Main.Menu_HexImporter=Importador hex Main.Menu_Language=Idioma Main.Menu_LoadBoxes=Cargar Cajas Main.Menu_MGDatabase=Base de datos de Regalo Misterioso Main.Menu_Open=Abrir... Main.Menu_Options=Opciones +Main.Menu_PluginInfo=Información de complementos Main.Menu_PopoutBoxAll=Todas las cajas Main.Menu_PopoutBoxSingle=Caja individual Main.Menu_Redo=Rehacer último cambio @@ -611,6 +614,7 @@ Main.Menu_ShowdownExportParty=Exportar equipo al portapapeles Main.Menu_ShowdownExportPKM=Exportar al portapapeles Main.Menu_ShowdownImportPKM=Importar set desde el portapapeles Main.Menu_Tools=Herramientas +Main.Menu_Troubleshooting=Solución de problemas Main.Menu_Undo=Deshacer último cambio Main.mnu_Delete=Eliminar Main.mnu_DeleteAll=Limpiar diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index d32343e51..831d77a4a 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -594,11 +594,14 @@ Main.Menu_ExportBAK=Exporter BAK Main.Menu_ExportSAV=&Exporter SAV... Main.Menu_File=&Fichier Main.Menu_Folder=Ouvrir le dossier +Main.Menu_ForceLoadSAV=Forcer le chargement du SAV +Main.Menu_HexImporter=Importeur hexadécimal Main.Menu_Language=&Langue Main.Menu_LoadBoxes=Charger Boîtes Main.Menu_MGDatabase=Base de données Cadeaux Mystère Main.Menu_Open=&Ouvrir... Main.Menu_Options=&Options +Main.Menu_PluginInfo=Infos plugins Main.Menu_PopoutBoxAll=Toutes les boîtes Main.Menu_PopoutBoxSingle=&Boîte seule Main.Menu_Redo=&Refaire dernier changement @@ -611,6 +614,7 @@ Main.Menu_ShowdownExportParty=Ex&porter l'équipe vers le presse-papiers Main.Menu_ShowdownExportPKM=&Exporter le set vers le presse-papiers Main.Menu_ShowdownImportPKM=&Importer le set vers le presse-papiers Main.Menu_Tools=Ou&tils +Main.Menu_Troubleshooting=Dépannage Main.Menu_Undo=&Revenir en arrière Main.mnu_Delete=Supprimer Main.mnu_DeleteAll=Vider diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index 673f1058f..e910c25da 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -594,11 +594,14 @@ Main.Menu_ExportBAK=Esporta BAK Main.Menu_ExportSAV=Esporta SAV... Main.Menu_File=File Main.Menu_Folder=Apri Cartella +Main.Menu_ForceLoadSAV=Caricamento SAV forzato +Main.Menu_HexImporter=Importatore esadecimale Main.Menu_Language=Lingua Main.Menu_LoadBoxes=Carica Box Main.Menu_MGDatabase=Database Dono Segreto Main.Menu_Open=Apri... Main.Menu_Options=Opzioni +Main.Menu_PluginInfo=Info plugin Main.Menu_PopoutBoxAll=Tutti i Box Main.Menu_PopoutBoxSingle=Singolo Box Main.Menu_Redo=Rifai ultimi cambiamenti @@ -611,6 +614,7 @@ Main.Menu_ShowdownExportParty=Esporta Squadra negli appunti Main.Menu_ShowdownExportPKM=Esporta Set negli appunti Main.Menu_ShowdownImportPKM=Importa set dagli appunti Main.Menu_Tools=Strumenti +Main.Menu_Troubleshooting=Risoluzione problemi Main.Menu_Undo=Annulla ultimo cambiamento Main.mnu_Delete=Elimina Main.mnu_DeleteAll=Ripulisci diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index f476e8b97..c22933bb0 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -594,11 +594,14 @@ Main.Menu_ExportBAK=BAKの保存 Main.Menu_ExportSAV=SAVの保存 Main.Menu_File=ファイル Main.Menu_Folder=オープンフォルダ +Main.Menu_ForceLoadSAV=SAVを強制読み込み +Main.Menu_HexImporter=16進インポーター Main.Menu_Language=言語 Main.Menu_LoadBoxes=ロードボックス Main.Menu_MGDatabase=ふしぎなおくりものデータベース Main.Menu_Open=読み込み Main.Menu_Options=設定 +Main.Menu_PluginInfo=プラグイン情報 Main.Menu_PopoutBoxAll=All Boxes Main.Menu_PopoutBoxSingle=Single Box Main.Menu_Redo=最後の変更をやり直し @@ -611,6 +614,7 @@ Main.Menu_ShowdownExportParty=クリップボードにパーティを書き出 Main.Menu_ShowdownExportPKM=クリップボードにポケモンを書き出し Main.Menu_ShowdownImportPKM=クリップボードからポケモンを読み込む Main.Menu_Tools=ツール +Main.Menu_Troubleshooting=トラブルシューティング Main.Menu_Undo=最後の変更を取り消し Main.mnu_Delete=消去 Main.mnu_DeleteAll=クリア diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index 82f3a1c2a..239ba3e3e 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -594,11 +594,14 @@ Main.Menu_ExportBAK=백업 파일 내보내기 Main.Menu_ExportSAV=세이브 파일로 내보내기... Main.Menu_File=파일 Main.Menu_Folder=폴더 열기 +Main.Menu_ForceLoadSAV=SAV 강제 불러오기 +Main.Menu_HexImporter=16진 가져오기 Main.Menu_Language=언어 Main.Menu_LoadBoxes=박스 불러오기 Main.Menu_MGDatabase=이상한 카드 데이터베이스 Main.Menu_Open=열기... Main.Menu_Options=옵션 +Main.Menu_PluginInfo=플러그인 정보 Main.Menu_PopoutBoxAll=모든 박스 Main.Menu_PopoutBoxSingle=현재 박스 Main.Menu_Redo=다시 실행 @@ -611,6 +614,7 @@ Main.Menu_ShowdownExportParty=클립보드로 파티 내보내기 Main.Menu_ShowdownExportPKM=클립보드로 세트 내보내기 Main.Menu_ShowdownImportPKM=클립보드에서 세트 가져오기 Main.Menu_Tools=도구 +Main.Menu_Troubleshooting=문제 해결 Main.Menu_Undo=실행 취소 Main.mnu_Delete=삭제 Main.mnu_DeleteAll=비우기 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index ded234e8c..a0a8568b4 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -594,11 +594,14 @@ Main.Menu_ExportBAK=保存 BAK Main.Menu_ExportSAV=保存 SAV... Main.Menu_File=文件 Main.Menu_Folder=打开文件夹 +Main.Menu_ForceLoadSAV=强制加载SAV +Main.Menu_HexImporter=十六进制导入器 Main.Menu_Language=语言 Main.Menu_LoadBoxes=加载到盒子 Main.Menu_MGDatabase=神秘礼物数据库 Main.Menu_Open=读取... Main.Menu_Options=选项 +Main.Menu_PluginInfo=插件信息 Main.Menu_PopoutBoxAll=全部方框 Main.Menu_PopoutBoxSingle=单个方框 Main.Menu_Redo=重做最后的改动 @@ -611,6 +614,7 @@ Main.Menu_ShowdownExportParty=导出同行队伍到剪贴板 Main.Menu_ShowdownExportPKM=导出宝可梦到剪贴板 Main.Menu_ShowdownImportPKM=从剪贴板导入宝可梦 Main.Menu_Tools=工具 +Main.Menu_Troubleshooting=疑难解答 Main.Menu_Undo=撤销最后的改动 Main.mnu_Delete=清理 Main.mnu_DeleteAll=清理所有宝可梦 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index 20a7d853c..f9fcd3c4c 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -594,11 +594,14 @@ Main.Menu_ExportBAK=儲存BAK後備資料 Main.Menu_ExportSAV=儲存SAV儲存資料到... Main.Menu_File=檔案 Main.Menu_Folder=打開資料夾 +Main.Menu_ForceLoadSAV=強制載入SAV +Main.Menu_HexImporter=十六進位匯入器 Main.Menu_Language=語言 Main.Menu_LoadBoxes=載入寶可夢檔至盒子 Main.Menu_MGDatabase=神秘禮物資料庫 Main.Menu_Open=讀取... Main.Menu_Options=選項 +Main.Menu_PluginInfo=外掛資訊 Main.Menu_PopoutBoxAll=全部方框 Main.Menu_PopoutBoxSingle=單個方框 Main.Menu_Redo=重做最後之改動 @@ -611,6 +614,7 @@ Main.Menu_ShowdownExportParty=匯出同行隊伍到剪貼簿 Main.Menu_ShowdownExportPKM=匯出寶可夢到剪貼簿 Main.Menu_ShowdownImportPKM=從剪貼板導入寶可夢 Main.Menu_Tools=工具 +Main.Menu_Troubleshooting=疑難排解 Main.Menu_Undo=撤銷最後的改動 Main.mnu_Delete=清理 Main.mnu_DeleteAll=清理所有寶可夢 diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.Designer.cs index e416aa4d4..79482e669 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.Designer.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.Designer.cs @@ -47,18 +47,22 @@ private void InitializeComponent() giveModify = new System.Windows.Forms.ToolStripMenuItem(); L_Count = new System.Windows.Forms.Label(); NUD_Count = new System.Windows.Forms.NumericUpDown(); + tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); sortMenu.SuspendLayout(); giveMenu.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)NUD_Count).BeginInit(); + tableLayoutPanel1.SuspendLayout(); SuspendLayout(); // // B_Cancel // - B_Cancel.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; - B_Cancel.Location = new System.Drawing.Point(215, 326); - B_Cancel.Margin = new System.Windows.Forms.Padding(4); + B_Cancel.Anchor = System.Windows.Forms.AnchorStyles.Right; + B_Cancel.Location = new System.Drawing.Point(252, 37); + B_Cancel.Margin = new System.Windows.Forms.Padding(0, 0, 4, 0); B_Cancel.Name = "B_Cancel"; - B_Cancel.Size = new System.Drawing.Size(88, 24); + B_Cancel.Size = new System.Drawing.Size(88, 27); B_Cancel.TabIndex = 14; B_Cancel.Text = "Cancel"; B_Cancel.UseVisualStyleBackColor = true; @@ -66,11 +70,11 @@ private void InitializeComponent() // // B_Save // - B_Save.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; - B_Save.Location = new System.Drawing.Point(215, 298); - B_Save.Margin = new System.Windows.Forms.Padding(4); + B_Save.Anchor = System.Windows.Forms.AnchorStyles.Right; + B_Save.Location = new System.Drawing.Point(252, 3); + B_Save.Margin = new System.Windows.Forms.Padding(0, 0, 4, 0); B_Save.Name = "B_Save"; - B_Save.Size = new System.Drawing.Size(88, 24); + B_Save.Size = new System.Drawing.Size(88, 27); B_Save.TabIndex = 15; B_Save.Text = "Save"; B_Save.UseVisualStyleBackColor = true; @@ -84,17 +88,18 @@ private void InitializeComponent() tabControl1.Name = "tabControl1"; tabControl1.Padding = new System.Drawing.Point(0, 0); tabControl1.SelectedIndex = 0; - tabControl1.Size = new System.Drawing.Size(316, 292); + tabControl1.Size = new System.Drawing.Size(346, 293); tabControl1.TabIndex = 17; tabControl1.SelectedIndexChanged += SwitchBag; // // B_GiveAll // - B_GiveAll.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; - B_GiveAll.Location = new System.Drawing.Point(12, 326); - B_GiveAll.Margin = new System.Windows.Forms.Padding(4); + B_GiveAll.Anchor = System.Windows.Forms.AnchorStyles.Left; + B_GiveAll.AutoSize = true; + B_GiveAll.Location = new System.Drawing.Point(4, 37); + B_GiveAll.Margin = new System.Windows.Forms.Padding(4, 0, 0, 0); B_GiveAll.Name = "B_GiveAll"; - B_GiveAll.Size = new System.Drawing.Size(88, 24); + B_GiveAll.Size = new System.Drawing.Size(104, 27); B_GiveAll.TabIndex = 18; B_GiveAll.Text = "Give All"; B_GiveAll.UseVisualStyleBackColor = true; @@ -102,12 +107,13 @@ private void InitializeComponent() // // B_Sort // - B_Sort.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + B_Sort.Anchor = System.Windows.Forms.AnchorStyles.Left; + B_Sort.AutoSize = true; B_Sort.ContextMenuStrip = sortMenu; - B_Sort.Location = new System.Drawing.Point(12, 298); - B_Sort.Margin = new System.Windows.Forms.Padding(4); + B_Sort.Location = new System.Drawing.Point(4, 3); + B_Sort.Margin = new System.Windows.Forms.Padding(4, 0, 0, 0); B_Sort.Name = "B_Sort"; - B_Sort.Size = new System.Drawing.Size(88, 24); + B_Sort.Size = new System.Drawing.Size(104, 27); B_Sort.TabIndex = 19; B_Sort.Text = "Sort"; B_Sort.UseVisualStyleBackColor = true; @@ -115,9 +121,9 @@ private void InitializeComponent() // // sortMenu // - sortMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { mnuSortName, mnuSortNameReverse, mnuSortCount, mnuSortCountReverse, mnuSortIndex, mnuSortIndexReverse }); + sortMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { mnuSortName, mnuSortNameReverse, toolStripSeparator2, mnuSortCount, mnuSortCountReverse, toolStripSeparator1, mnuSortIndex, mnuSortIndexReverse }); sortMenu.Name = "modifyMenu"; - sortMenu.Size = new System.Drawing.Size(170, 136); + sortMenu.Size = new System.Drawing.Size(170, 148); // // mnuSortName // @@ -201,7 +207,7 @@ private void InitializeComponent() // L_Count.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; L_Count.AutoSize = true; - L_Count.Location = new System.Drawing.Point(106, 308); + L_Count.Location = new System.Drawing.Point(111, 17); L_Count.Name = "L_Count"; L_Count.Size = new System.Drawing.Size(45, 17); L_Count.TabIndex = 20; @@ -209,25 +215,52 @@ private void InitializeComponent() // // NUD_Count // - NUD_Count.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; - NUD_Count.Location = new System.Drawing.Point(108, 327); + NUD_Count.Anchor = System.Windows.Forms.AnchorStyles.Left; + NUD_Count.Location = new System.Drawing.Point(111, 38); NUD_Count.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); NUD_Count.Name = "NUD_Count"; NUD_Count.Size = new System.Drawing.Size(49, 25); NUD_Count.TabIndex = 21; NUD_Count.Value = new decimal(new int[] { 1, 0, 0, 0 }); // + // tableLayoutPanel1 + // + tableLayoutPanel1.ColumnCount = 3; + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + tableLayoutPanel1.Controls.Add(B_Save, 2, 0); + tableLayoutPanel1.Controls.Add(B_Cancel, 2, 1); + tableLayoutPanel1.Controls.Add(B_GiveAll, 0, 1); + tableLayoutPanel1.Controls.Add(B_Sort, 0, 0); + tableLayoutPanel1.Controls.Add(L_Count, 1, 0); + tableLayoutPanel1.Controls.Add(NUD_Count, 1, 1); + tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Bottom; + tableLayoutPanel1.Location = new System.Drawing.Point(0, 293); + tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(0); + tableLayoutPanel1.Name = "tableLayoutPanel1"; + tableLayoutPanel1.RowCount = 2; + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + tableLayoutPanel1.Size = new System.Drawing.Size(344, 68); + tableLayoutPanel1.TabIndex = 22; + // + // toolStripSeparator1 + // + toolStripSeparator1.Name = "toolStripSeparator1"; + toolStripSeparator1.Size = new System.Drawing.Size(166, 6); + // + // toolStripSeparator2 + // + toolStripSeparator2.Name = "toolStripSeparator2"; + toolStripSeparator2.Size = new System.Drawing.Size(166, 6); + // // SAV_Inventory // AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; - ClientSize = new System.Drawing.Size(314, 361); - Controls.Add(NUD_Count); - Controls.Add(L_Count); - Controls.Add(B_Sort); - Controls.Add(B_GiveAll); + ClientSize = new System.Drawing.Size(344, 361); + Controls.Add(tableLayoutPanel1); Controls.Add(tabControl1); - Controls.Add(B_Save); - Controls.Add(B_Cancel); Icon = Properties.Resources.Icon; MaximizeBox = false; MinimizeBox = false; @@ -238,8 +271,9 @@ private void InitializeComponent() sortMenu.ResumeLayout(false); giveMenu.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)NUD_Count).EndInit(); + tableLayoutPanel1.ResumeLayout(false); + tableLayoutPanel1.PerformLayout(); ResumeLayout(false); - PerformLayout(); } @@ -262,5 +296,8 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem giveModify; private System.Windows.Forms.ToolStripMenuItem mnuSortIndex; private System.Windows.Forms.ToolStripMenuItem mnuSortIndexReverse; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; } } diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs index 61aab606e..adecab1a9 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs @@ -172,11 +172,12 @@ private static DoubleBufferedDataGridView GetBaseDataGrid(InventoryPouch pouch) EditMode = DataGridViewEditMode.EditOnEnter, ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single, ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize, - SelectionMode = DataGridViewSelectionMode.CellSelect, - CellBorderStyle = DataGridViewCellBorderStyle.None, + SelectionMode = DataGridViewSelectionMode.FullRowSelect, + CellBorderStyle = DataGridViewCellBorderStyle.Single, RowTemplate = { Height = 24 }, Tag = pouch, + RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single, }; private static DataGridViewImageColumn GetSpriteColumn() => new() @@ -185,8 +186,7 @@ private static DataGridViewImageColumn GetSpriteColumn() => new() DisplayIndex = ColumnSprite, ReadOnly = true, ImageLayout = DataGridViewImageCellLayout.Zoom, - AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader, - DividerWidth = 2, + Width = 30, }; private DataGridViewComboBoxColumn GetItemColumn(int c, string name = "Item") => new() @@ -211,9 +211,8 @@ private static DataGridViewTextBoxColumn GetCountColumn(int c, string name = "Co { HeaderText = name, DisplayIndex = c, - Width = 45, + Width = 48, DefaultCellStyle = { Alignment = DataGridViewContentAlignment.MiddleCenter }, - DividerWidth = 2, MaxInputLength = 5 // enough to cover ushort.MaxValue (absolute maximum of any quantity ever allowed) }; diff --git a/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.Designer.cs b/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.Designer.cs index 1560efad0..ef6c9820e 100644 --- a/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.Designer.cs +++ b/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.Designer.cs @@ -29,7 +29,6 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { L_Path = new System.Windows.Forms.Label(); - TB_Path = new System.Windows.Forms.TextBox(); B_Browse = new System.Windows.Forms.Button(); L_Type = new System.Windows.Forms.Label(); CB_Type = new System.Windows.Forms.ComboBox(); @@ -41,32 +40,22 @@ private void InitializeComponent() CB_Handler = new System.Windows.Forms.ComboBox(); B_Continue = new System.Windows.Forms.Button(); TLP_Main = new System.Windows.Forms.TableLayoutPanel(); + L_FileName = new System.Windows.Forms.Label(); + TB_Path = new System.Windows.Forms.TextBox(); TLP_Main.SuspendLayout(); SuspendLayout(); // // L_Path // - L_Path.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Path.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; L_Path.AutoSize = true; - L_Path.Location = new System.Drawing.Point(55, 16); + L_Path.Location = new System.Drawing.Point(55, 6); L_Path.Margin = new System.Windows.Forms.Padding(3, 6, 3, 0); L_Path.Name = "L_Path"; L_Path.Size = new System.Drawing.Size(36, 17); L_Path.TabIndex = 0; L_Path.Text = "Path:"; // - // TB_Path - // - TB_Path.AccessibleDescription = "Path to the save file to load with the selected handler."; - TB_Path.AccessibleName = "Save Path"; - TB_Path.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - TB_Path.Location = new System.Drawing.Point(97, 3); - TB_Path.Margin = new System.Windows.Forms.Padding(3, 3, 3, 16); - TB_Path.Name = "TB_Path"; - TB_Path.ReadOnly = true; - TB_Path.Size = new System.Drawing.Size(409, 25); - TB_Path.TabIndex = 1; - // // B_Browse // B_Browse.AccessibleDescription = "Selects the save file to load."; @@ -85,7 +74,7 @@ private void InitializeComponent() // L_Type.Anchor = System.Windows.Forms.AnchorStyles.Right; L_Type.AutoSize = true; - L_Type.Location = new System.Drawing.Point(3, 53); + L_Type.Location = new System.Drawing.Point(3, 62); L_Type.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0); L_Type.Name = "L_Type"; L_Type.Size = new System.Drawing.Size(88, 17); @@ -99,7 +88,7 @@ private void InitializeComponent() CB_Type.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; CB_Type.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; CB_Type.FormattingEnabled = true; - CB_Type.Location = new System.Drawing.Point(97, 47); + CB_Type.Location = new System.Drawing.Point(97, 56); CB_Type.Name = "CB_Type"; CB_Type.Size = new System.Drawing.Size(409, 25); CB_Type.TabIndex = 1; @@ -108,7 +97,7 @@ private void InitializeComponent() // L_SubVersion.Anchor = System.Windows.Forms.AnchorStyles.Right; L_SubVersion.AutoSize = true; - L_SubVersion.Location = new System.Drawing.Point(12, 84); + L_SubVersion.Location = new System.Drawing.Point(12, 93); L_SubVersion.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0); L_SubVersion.Name = "L_SubVersion"; L_SubVersion.Size = new System.Drawing.Size(79, 17); @@ -122,7 +111,7 @@ private void InitializeComponent() CB_SubVersion.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; CB_SubVersion.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; CB_SubVersion.FormattingEnabled = true; - CB_SubVersion.Location = new System.Drawing.Point(97, 78); + CB_SubVersion.Location = new System.Drawing.Point(97, 87); CB_SubVersion.Name = "CB_SubVersion"; CB_SubVersion.Size = new System.Drawing.Size(409, 25); CB_SubVersion.TabIndex = 1; @@ -131,7 +120,7 @@ private void InitializeComponent() // L_Language.Anchor = System.Windows.Forms.AnchorStyles.Right; L_Language.AutoSize = true; - L_Language.Location = new System.Drawing.Point(23, 115); + L_Language.Location = new System.Drawing.Point(23, 124); L_Language.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0); L_Language.Name = "L_Language"; L_Language.Size = new System.Drawing.Size(68, 17); @@ -145,7 +134,7 @@ private void InitializeComponent() CB_Language.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; CB_Language.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; CB_Language.FormattingEnabled = true; - CB_Language.Location = new System.Drawing.Point(97, 109); + CB_Language.Location = new System.Drawing.Point(97, 118); CB_Language.Name = "CB_Language"; CB_Language.Size = new System.Drawing.Size(409, 25); CB_Language.TabIndex = 1; @@ -154,7 +143,7 @@ private void InitializeComponent() // L_Handler.Anchor = System.Windows.Forms.AnchorStyles.Right; L_Handler.AutoSize = true; - L_Handler.Location = new System.Drawing.Point(34, 146); + L_Handler.Location = new System.Drawing.Point(34, 155); L_Handler.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0); L_Handler.Name = "L_Handler"; L_Handler.Size = new System.Drawing.Size(57, 17); @@ -168,7 +157,7 @@ private void InitializeComponent() CB_Handler.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; CB_Handler.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; CB_Handler.FormattingEnabled = true; - CB_Handler.Location = new System.Drawing.Point(97, 140); + CB_Handler.Location = new System.Drawing.Point(97, 149); CB_Handler.Name = "CB_Handler"; CB_Handler.Size = new System.Drawing.Size(409, 25); CB_Handler.TabIndex = 1; @@ -177,9 +166,10 @@ private void InitializeComponent() // B_Continue.AccessibleDescription = "Attempts to load the selected file with the chosen save handler settings."; B_Continue.AccessibleName = "Continue Load"; + B_Continue.Anchor = System.Windows.Forms.AnchorStyles.Left; B_Continue.AutoSize = true; B_Continue.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - B_Continue.Location = new System.Drawing.Point(512, 171); + B_Continue.Location = new System.Drawing.Point(512, 181); B_Continue.Name = "B_Continue"; B_Continue.Size = new System.Drawing.Size(69, 27); B_Continue.TabIndex = 0; @@ -189,46 +179,65 @@ private void InitializeComponent() // // TLP_Main // + TLP_Main.AllowDrop = true; TLP_Main.ColumnCount = 3; TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - TLP_Main.Controls.Add(B_Continue, 2, 5); - TLP_Main.Controls.Add(CB_Handler, 1, 4); - TLP_Main.Controls.Add(L_Handler, 0, 4); - TLP_Main.Controls.Add(CB_Language, 1, 3); - TLP_Main.Controls.Add(L_Language, 0, 3); - TLP_Main.Controls.Add(CB_SubVersion, 1, 2); - TLP_Main.Controls.Add(L_SubVersion, 0, 2); - TLP_Main.Controls.Add(L_Type, 0, 1); + TLP_Main.Controls.Add(B_Continue, 2, 6); + TLP_Main.Controls.Add(CB_Handler, 1, 5); + TLP_Main.Controls.Add(L_Handler, 0, 5); + TLP_Main.Controls.Add(CB_Language, 1, 4); + TLP_Main.Controls.Add(L_Language, 0, 4); + TLP_Main.Controls.Add(CB_SubVersion, 1, 3); + TLP_Main.Controls.Add(L_SubVersion, 0, 3); + TLP_Main.Controls.Add(L_Type, 0, 2); TLP_Main.Controls.Add(B_Browse, 2, 0); - TLP_Main.Controls.Add(CB_Type, 1, 1); + TLP_Main.Controls.Add(CB_Type, 1, 2); TLP_Main.Controls.Add(TB_Path, 1, 0); TLP_Main.Controls.Add(L_Path, 0, 0); - TLP_Main.AllowDrop = true; + TLP_Main.Controls.Add(L_FileName, 1, 1); TLP_Main.Dock = System.Windows.Forms.DockStyle.Fill; TLP_Main.Location = new System.Drawing.Point(0, 0); TLP_Main.Name = "TLP_Main"; - TLP_Main.RowCount = 6; + TLP_Main.RowCount = 7; TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); - TLP_Main.Size = new System.Drawing.Size(584, 201); + TLP_Main.Size = new System.Drawing.Size(584, 213); TLP_Main.TabIndex = 6; TLP_Main.DragDrop += SaveHandlerTroubleshooter_DragDrop; TLP_Main.DragEnter += SaveHandlerTroubleshooter_DragEnter; // + // L_FileName + // + L_FileName.AutoSize = true; + L_FileName.Location = new System.Drawing.Point(97, 33); + L_FileName.Name = "L_FileName"; + L_FileName.Size = new System.Drawing.Size(0, 17); + L_FileName.TabIndex = 3; + // + // TB_Path + // + TB_Path.AccessibleDescription = "Path to the save file to load with the selected handler."; + TB_Path.AccessibleName = "Save Path"; + TB_Path.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + TB_Path.Location = new System.Drawing.Point(97, 3); + TB_Path.Name = "TB_Path"; + TB_Path.ReadOnly = true; + TB_Path.Size = new System.Drawing.Size(409, 25); + TB_Path.TabIndex = 1; + // // SaveHandlerTroubleshooter // AllowDrop = true; AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; - ClientSize = new System.Drawing.Size(584, 201); + ClientSize = new System.Drawing.Size(584, 213); Controls.Add(TLP_Main); - DragDrop += SaveHandlerTroubleshooter_DragDrop; - DragEnter += SaveHandlerTroubleshooter_DragEnter; FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; Icon = Properties.Resources.Icon; MaximizeBox = false; @@ -236,6 +245,8 @@ private void InitializeComponent() Name = "SaveHandlerTroubleshooter"; StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; Text = "Save Handler Troubleshooter"; + DragDrop += SaveHandlerTroubleshooter_DragDrop; + DragEnter += SaveHandlerTroubleshooter_DragEnter; TLP_Main.ResumeLayout(false); TLP_Main.PerformLayout(); ResumeLayout(false); @@ -243,7 +254,6 @@ private void InitializeComponent() #endregion private System.Windows.Forms.Label L_Path; - private System.Windows.Forms.TextBox TB_Path; private System.Windows.Forms.Button B_Browse; private System.Windows.Forms.Label L_Type; private System.Windows.Forms.ComboBox CB_Type; @@ -255,5 +265,7 @@ private void InitializeComponent() private System.Windows.Forms.ComboBox CB_Handler; private System.Windows.Forms.Button B_Continue; private System.Windows.Forms.TableLayoutPanel TLP_Main; + private System.Windows.Forms.Label L_FileName; + private System.Windows.Forms.TextBox TB_Path; } } diff --git a/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.cs b/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.cs index d74aa4a25..d2c4b5e06 100644 --- a/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.cs +++ b/PKHeX.WinForms/Subforms/SaveHandlerTroubleshooter.cs @@ -69,8 +69,10 @@ private void B_Browse_Click(object? sender, EventArgs e) if (!string.IsNullOrWhiteSpace(TB_Path.Text)) ofd.FileName = TB_Path.Text; - if (ofd.ShowDialog(this) == DialogResult.OK) - TB_Path.Text = ofd.FileName; + if (ofd.ShowDialog(this) != DialogResult.OK) + return; + TB_Path.Text = ofd.FileName; + L_FileName.Text = Path.GetFileName(ofd.FileName); } private void B_Continue_Click(object? sender, EventArgs e) @@ -136,7 +138,7 @@ private void B_Continue_Click(object? sender, EventArgs e) } } - private static void SaveHandlerTroubleshooter_DragEnter(object? sender, DragEventArgs e) + private void SaveHandlerTroubleshooter_DragEnter(object? sender, DragEventArgs e) { e.Effect = e.Data?.GetDataPresent(DataFormats.FileDrop) == true ? DragDropEffects.Copy diff --git a/PKHeX.WinForms/Util/Troubleshooting.cs b/PKHeX.WinForms/Util/Troubleshooting.cs index d28326f45..2dddc89af 100644 --- a/PKHeX.WinForms/Util/Troubleshooting.cs +++ b/PKHeX.WinForms/Util/Troubleshooting.cs @@ -9,38 +9,62 @@ namespace PKHeX.WinForms; public static class Troubleshooting { - public static void AddTroubleshootingControls(ToolStripDropDownItem item, List plugins) + public static void AddTroubleshootingControls(ToolStripDropDownItem item, List plugins, bool visible) { - item.DropDownItems.Add(GetSaveHandlerTroubleshooter(Keys.L)); - item.DropDownItems.Add(GetHexImporter(Keys.I)); - item.DropDownItems.Add(GetPluginInfo(Keys.U, plugins)); + if (visible) + { + // Sub-group all controls rather than dumping them in directly. + const string name = "Menu_Troubleshooting"; + var parent = new ToolStripMenuItem + { + Name = name, + Text = name, + Visible = true, + Image = Properties.Resources.settings, + }; + item.DropDownItems.Add(parent); + item = parent; + } + + var saveHandlerItem = GetSaveHandlerTroubleshooter("Menu_ForceLoadSAV", Keys.L); + saveHandlerItem.Image = Properties.Resources.main; + item.DropDownItems.Add(saveHandlerItem); + + var hexImporterItem = GetHexImporter("Menu_HexImporter", Keys.I); + hexImporterItem.Image = Properties.Resources.database; + item.DropDownItems.Add(hexImporterItem); + + var pluginInfoItem = GetPluginInfo("Menu_PluginInfo", Keys.U, plugins); + pluginInfoItem.Image = Properties.Resources.about; + item.DropDownItems.Add(pluginInfoItem); } - private static ToolStripMenuItem GetSaveHandlerTroubleshooter(Keys key) + private static ToolStripMenuItem GetSaveHandlerTroubleshooter(string name, Keys key) { - var item = GetHiddenMenu(key); + var item = GetMenu(name, key); item.Click += (_, _) => OpenSaveHandlerTroubleshooter(); return item; } - private static ToolStripMenuItem GetHexImporter(Keys key) + private static ToolStripMenuItem GetHexImporter(string name, Keys key) { - var item = GetHiddenMenu(key); + var item = GetMenu(name, key); item.Click += (_, _) => OpenFileFromClipboardHex(); return item; } - private static ToolStripMenuItem GetPluginInfo(Keys key, List plugins) + private static ToolStripMenuItem GetPluginInfo(string name, Keys key, List plugins) { - var item = GetHiddenMenu(key); + var item = GetMenu(name, key); item.Click += (_, _) => DisplayPluginList(plugins); return item; } - private static ToolStripMenuItem GetHiddenMenu(Keys key) => new() + private static ToolStripMenuItem GetMenu(string name, Keys key) => new() { + Name = name, + Text = name, // will be replaced by localization, but set to something for design time ShortcutKeys = Keys.Control | Keys.Alt | key, - Visible = false, }; private static void OpenSaveHandlerTroubleshooter() @@ -58,7 +82,7 @@ private static void OpenFileFromClipboardHex() var hex = Clipboard.GetText().Trim(); if (string.IsNullOrEmpty(hex)) { - WinFormsUtil.Alert("Clipboard is empty."); + WinFormsUtil.Alert(MessageStrings.MsgTroubleshootingClipboardEmpty); return; } @@ -69,7 +93,7 @@ private static void OpenFileFromClipboardHex() } catch (FormatException) { - WinFormsUtil.Alert("Clipboard does not contain valid hex data."); + WinFormsUtil.Alert(MessageStrings.MsgTroubleshootingClipboardInvalidHex); } } @@ -77,10 +101,10 @@ private static void DisplayPluginList(List plugins) { var text = new StringBuilder(); - text.AppendLine($"Loaded {plugins.Count} plugins:"); + text.AppendLine(string.Format(MessageStrings.MsgTroubleshootingPluginListHeader, plugins.Count)); if (plugins.Count == 0) { - text.AppendLine("None."); + text.AppendLine(MessageStrings.MsgTroubleshootingPluginListEmpty); WinFormsUtil.Alert(text.ToString()); return; } From b5b5c070f73eae58a9fc0dbfa01d7c6a7841694b Mon Sep 17 00:00:00 2001 From: Ka-n00b Date: Fri, 12 Jun 2026 00:31:44 -0400 Subject: [PATCH 77/81] Translation updates (#4819) * Update MessageStrings_de.txt * Update MessageStrings_ko.txt * Update MessageStrings_es-419.txt * Update MessageStrings_es.txt * Update lang_de.txt * Update lang_en.txt * Update lang_es-419.txt * Update lang_es.txt * Update lang_fr.txt * Update lang_it.txt * Update lang_ja.txt * Update lang_ko.txt * Update lang_zh-Hans.txt * Update lang_zh-Hant.txt * Update lang_es.txt * Update lang_es-419.txt * Update lang_fr.txt * Update lang_it.txt * Update lang_es-419.txt * Update lang_es.txt * Update lang_de.txt --- .../text/program/MessageStrings_de.txt | 2 +- .../text/program/MessageStrings_es-419.txt | 4 +- .../text/program/MessageStrings_es.txt | 4 +- .../text/program/MessageStrings_ko.txt | 4 +- PKHeX.WinForms/Resources/text/lang_de.txt | 20 ++--- PKHeX.WinForms/Resources/text/lang_en.txt | 14 ++-- PKHeX.WinForms/Resources/text/lang_es-419.txt | 42 +++++----- PKHeX.WinForms/Resources/text/lang_es.txt | 40 +++++----- PKHeX.WinForms/Resources/text/lang_fr.txt | 16 ++-- PKHeX.WinForms/Resources/text/lang_it.txt | 6 +- PKHeX.WinForms/Resources/text/lang_ja.txt | 8 +- PKHeX.WinForms/Resources/text/lang_ko.txt | 22 +++--- .../Resources/text/lang_zh-Hans.txt | 78 +++++++++---------- .../Resources/text/lang_zh-Hant.txt | 32 ++++---- 14 files changed, 146 insertions(+), 146 deletions(-) diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_de.txt b/PKHeX.Core/Resources/text/program/MessageStrings_de.txt index bcbaecfe4..1e14feaf1 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_de.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_de.txt @@ -165,7 +165,7 @@ MsgSaveJPEGExportFail = Der Spielstand enthält keine Grafik Daten! MsgSaveGen4ConvertKorean = Möchten Sie diese japanische/internationale Speicherdatei in eine Version umwandeln, die mit Koreanischen Spielen spielbar ist? MsgSaveGen4ConvertInternational = Möchten Sie diese Koreanische Speicherdatei in eine Version umwandeln, die mit japanischen/internationalen Spielen spielbar ist? MsgSaveChecksumFailEdited = Spielstand wurde bearbeitet. Integrität kann nicht geprüft werden. -MsgSaveChecksumValid = Alle Prüfsummen sind gültig. +MsgSaveChecksumValid = Prüfsummen sind gültig. MsgSaveChecksumFailExport = Prüfsummen in die Zwischenablage kopieren? MsgIndexItemRange = Die Item ID liegt außerhalb des gültigen Bereichs: MsgIndexItemGame = Das Item ist in diesem Spiel nicht erhältlich: diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_es-419.txt b/PKHeX.Core/Resources/text/program/MessageStrings_es-419.txt index f58bc8efc..1eb974bd8 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_es-419.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_es-419.txt @@ -165,8 +165,8 @@ MsgSaveJPEGExportFail = ¡No se han encontrado datos de imagen en el archivo de MsgSaveGen4ConvertKorean = ¿Quieres convertir este archivo de guardado Japonés/Internacional para que pueda ser usado en los juegos en Coreano? MsgSaveGen4ConvertInternational = ¿Quieres convertir este archivo de guardado Coreano para que pueda ser usado en los juegos en Japonés/Internacional? MsgSaveChecksumFailEdited = El archivo de guardado ha sido editado. No se puede verificar la integridad. -MsgSaveChecksumValid = Suma de verificación válido. -MsgSaveChecksumFailExport = ¿Exportar información de la suma de verificación al portapapeles? +MsgSaveChecksumValid = Sumas de verificación son válidas. +MsgSaveChecksumFailExport = ¿Exportar información de sumas de verificación al portapapeles? MsgIndexItemRange = Índice de objetos fuera de rango: MsgIndexItemGame = No se puede obtener el objeto en el juego: MsgIndexItemHeld = El objeto no puede ser equipado en el juego: diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_es.txt b/PKHeX.Core/Resources/text/program/MessageStrings_es.txt index 5f5d937db..0de07fa70 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_es.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_es.txt @@ -165,8 +165,8 @@ MsgSaveJPEGExportFail = ¡No se han encontrado datos de imagen en el archivo de MsgSaveGen4ConvertKorean = ¿Quieres convertir este archivo de guardado Japonés/Internacional para que pueda ser usado en los juegos en Coreano? MsgSaveGen4ConvertInternational = ¿Quieres convertir este archivo de guardado Coreano para que pueda ser usado en los juegos en Japonés/Internacional? MsgSaveChecksumFailEdited = El archivo de guardado ha sido editado. No se puede verificar la integridad. -MsgSaveChecksumValid = Suma de verificación válido. -MsgSaveChecksumFailExport = ¿Exportar información de la suma de verificación al portapapeles? +MsgSaveChecksumValid = Sumas de verificación son válidas. +MsgSaveChecksumFailExport = ¿Exportar información de sumas de verificación al portapapeles? MsgIndexItemRange = Índice de objetos fuera de rango: MsgIndexItemGame = No se puede obtener el objeto en el juego: MsgIndexItemHeld = El objeto no puede ser equipado en el juego: diff --git a/PKHeX.Core/Resources/text/program/MessageStrings_ko.txt b/PKHeX.Core/Resources/text/program/MessageStrings_ko.txt index 072a106c2..323664450 100644 --- a/PKHeX.Core/Resources/text/program/MessageStrings_ko.txt +++ b/PKHeX.Core/Resources/text/program/MessageStrings_ko.txt @@ -17,7 +17,7 @@ MsgAll = 모두 MsgYes = 예 MsgNo = 아니오 MsgContinue = 계속하시겠습니까? -MsgGameColosseum = Colosseum +MsgGameColosseum = 콜롯세움 MsgGameXD = XD MsgGameRSBOX = RS Box MsgFileDeleteCount = {0} 파일을 삭제했습니다. @@ -262,7 +262,7 @@ MsgSaveDifferentVersions = 세이브 파일 버전이 일치하지 않습니다. MsgSaveNumberInvalid = {0} 세이브 파일이 잘못되었습니다. MsgSecretBaseDeleteConfirm = {0}의 비밀기지(항목 {1:00})를 기록에서 삭제하시겠습니까? MsgSecretBaseDeleteSelf = 당신의 비밀기지를 삭제할 수 없습니다. -MsgPluginFailLoad = 플러그인 로드에 실패했습니다. 오류 메시지를 참고하여 문제가 있는 플러그인을 확인하세요. 플러그인이 오래되었거나 이 프로그램 빌드와 호환되지 않을 수 있습니다. +MsgPluginFailLoad = 플러그인을 불러오지 못했습니다. 오류 메시지를 참조하여 문제가 발생한 플러그인을 확인해 주세요. 플러그인의 버전이 오래되었거나 현재 프로그램 빌드와 호환되지 않을 수 있습니다. MsgLegalityPopupCaption = 합법성 검사 MsgLegalityPopupCollapsed = 전체 보고서 MsgLegalityPopupExpanded = 전체 보고서 숨기기 diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index 3577003b2..48e1a4a07 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -90,7 +90,7 @@ SAV_Underground=Untergrund-Editor SAV_Underground8b=Untergrund-Item-Editor SAV_UnityTower=Turm der Einheit-Editor SAV_Wondercard=Geheimgeschenk-E/A -SAV_ZygardeCell=Zellen/Sticker-Editor +SAV_ZygardeCell=Zygarde-Zellen/Herrscher-Sticker-Editor SaveHandlerTroubleshooter=Fehlerbehebung für Save-Handler SettingsEditor=Einstellungen SuperTrainingEditor=Medaillen-Editor @@ -406,9 +406,9 @@ LocalizedDescription.VirtualConsoleSourceGen1=Standard-Edition, die beim Transfe LocalizedDescription.VirtualConsoleSourceGen2=Standard-Edition, die beim Transfer von der 3DS Virtual Console (Generation 2) zu Generation 7 festgelegt wird. LocalizedDescription.ZeroHeightWeight=Strenge der Legalitäts Analyse bei Pokémon mit einer Höhe und einem Gewicht von 0. Main.B_Blocks=Block-Daten -Main.B_CellsStickers=Zellen/Stickers +Main.B_CellsStickers=Zellen/Sticker Main.B_Clear=Löschen -Main.B_ConvertKorean=Konv. Spielst. KOR +Main.B_ConvertKorean=Koreanische Spielstand-Konvertierung Main.B_DLC=DLC-Editor Main.B_Donuts=Donuts Main.B_FestivalPlaza=Festival-Plaza @@ -429,7 +429,7 @@ Main.B_OpenGlobalLink=Pokémon Global Link Main.B_OpenHallofFame=Ruhmeshalle Main.B_OpenHoneyTreeEditor=Honigbaum Main.B_OpenItemPouch=Items -Main.B_OpenJoinAvenueEditor=Einklangspass. +Main.B_OpenJoinAvenueEditor=Einklangspassage Main.B_OpenLinkInfo=Pokémon-Link Main.B_OpenMedalsEditor=Medaillen Main.B_OpenMiscEditor=Sonstiges @@ -443,9 +443,9 @@ Main.B_OpenRTCEditor=Uhr (RTC) Main.B_OpenSealStickers=Sticker Main.B_OpenSecretBase=Geheimbasis Main.B_OpenSuperTraining=Supertraining -Main.B_OpenTrainerInfo=Trainerinfo +Main.B_OpenTrainerInfo=Trainer-Info Main.B_OpenUGSEditor=Untergrund -Main.B_OpenUnityTowerEditor=Turm Einheit +Main.B_OpenUnityTowerEditor=Turm der Einheit Main.B_OpenWondercards=Wunderkarten Main.B_OtherSlots=Andere Felder Main.B_OUTPasserby=Passanten @@ -459,7 +459,7 @@ Main.B_RelearnFlags=Wiedererlernbare Main.B_Reset=Zurücks. Main.B_Roamer=Wanderer Main.B_SaveBoxBin=Speichere Boxen -Main.B_VerifyCHK=Prüfsummen +Main.B_VerifyCHK=Prüfsummen prüfen Main.B_VerifySaveEntities=Alle PKM prüfen Main.BTN_History=Erinnerung Main.BTN_Medals=Medaillen @@ -2090,8 +2090,8 @@ SAV_PokedexGG.CHK_L4=Italienisch SAV_PokedexGG.CHK_L5=Deutsch SAV_PokedexGG.CHK_L6=Spanisch SAV_PokedexGG.CHK_L7=Koreanisch -SAV_PokedexGG.CHK_L8=Chinesisch (einf.) -SAV_PokedexGG.CHK_L9=Chinesisch (trad.) +SAV_PokedexGG.CHK_L8=Chinesisch (e.) +SAV_PokedexGG.CHK_L9=Chinesisch (t.) SAV_PokedexGG.CHK_P1=Im Besitz SAV_PokedexGG.CHK_P2=Männlich SAV_PokedexGG.CHK_P3=Weiblich @@ -2359,7 +2359,7 @@ SAV_Pokepuff.B_Sort=Sortieren SAV_Raid8.B_Cancel=Abbrechen SAV_Raid8.B_Save=Speichern SAV_Raid9.B_Cancel=Abbrechen -SAV_Raid9.B_CopyToOthers=Auf andere kopieren +SAV_Raid9.B_CopyToOthers=Auf andere Raids kopieren SAV_Raid9.B_Save=Speichern SAV_Raid9.L_SeedCurrent=Aktueller Seed: SAV_Raid9.L_SeedTomorrow=Morgen: diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index 7b2a0cdf6..a8b2a93cf 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -90,7 +90,7 @@ SAV_Underground=Underground Editor SAV_Underground8b=Underground Items Editor SAV_UnityTower=Unity Tower Editor SAV_Wondercard=Mystery Gift I/O -SAV_ZygardeCell=Cells/Sticker Editor +SAV_ZygardeCell=Zygarde Cells/Totem Sticker Editor SaveHandlerTroubleshooter=Save Handler Troubleshooter SettingsEditor=Settings SuperTrainingEditor=Medal Editor @@ -2090,8 +2090,8 @@ SAV_PokedexGG.CHK_L4=Italian SAV_PokedexGG.CHK_L5=German SAV_PokedexGG.CHK_L6=Spanish SAV_PokedexGG.CHK_L7=Korean -SAV_PokedexGG.CHK_L8=Chinese -SAV_PokedexGG.CHK_L9=Chinese2 +SAV_PokedexGG.CHK_L8=ChineseS +SAV_PokedexGG.CHK_L9=ChineseT SAV_PokedexGG.CHK_P1=Owned SAV_PokedexGG.CHK_P2=Male SAV_PokedexGG.CHK_P3=Female @@ -2221,8 +2221,8 @@ SAV_PokedexSM.CHK_L4=Italian SAV_PokedexSM.CHK_L5=German SAV_PokedexSM.CHK_L6=Spanish SAV_PokedexSM.CHK_L7=Korean -SAV_PokedexSM.CHK_L8=Chinese -SAV_PokedexSM.CHK_L9=Chinese2 +SAV_PokedexSM.CHK_L8=ChineseS +SAV_PokedexSM.CHK_L9=ChineseT SAV_PokedexSM.CHK_P1=Owned SAV_PokedexSM.CHK_P2=Male SAV_PokedexSM.CHK_P3=Female @@ -2307,8 +2307,8 @@ SAV_PokedexSWSH.CHK_L4=Italian SAV_PokedexSWSH.CHK_L5=German SAV_PokedexSWSH.CHK_L6=Spanish SAV_PokedexSWSH.CHK_L7=Korean -SAV_PokedexSWSH.CHK_L8=Chinese -SAV_PokedexSWSH.CHK_L9=Chinese2 +SAV_PokedexSWSH.CHK_L8=ChineseS +SAV_PokedexSWSH.CHK_L9=ChineseT SAV_PokedexSWSH.CHK_S=Shiny SAV_PokedexSWSH.GB_Displayed=Displayed SAV_PokedexSWSH.GB_Language=Languages diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index 98bcd2d45..e4c134a8a 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -35,7 +35,7 @@ SAV_HallOfFame=Editor del Salón de la Fama SAV_HallOfFame1=Visor del Salón de la Fama SAV_HallOfFame3=Visor del Salón de la Fama SAV_HallOfFame7=Visor del Salón de la Fama -SAV_HoneyTree=Editor de Árbol de Miel +SAV_HoneyTree=Editor de Árboles de Miel SAV_Inventory=Editor de Inventario SAV_JoinAvenue=Editor de Pasaje Unión SAV_Link6=Editor del Nexo Pokémon @@ -50,7 +50,7 @@ SAV_MysteryGiftDB=Base de Datos SAV_OPower=Editor de Poder O SAV_Poffin8b=Editor de Pokochos SAV_Pokeathlon4=Editor de Pokéathlon -SAV_Pokebean=Editor de Pokéhaba +SAV_Pokebean=Editor de Pokéhabas SAV_PokeBlockORAS=Editor de Pokécubos SAV_Pokedex4=Editor de Pokédex SAV_Pokedex5=Editor de Pokédex @@ -90,7 +90,7 @@ SAV_Underground=Editor del Subsuelo SAV_Underground8b=Editor de Objetos del Subsuelo SAV_UnityTower=Editor de la Torre Unión SAV_Wondercard=E/S de Regalo Misterioso -SAV_ZygardeCell=Editor de Células/Dominsignias +SAV_ZygardeCell=Editor de Células de Zygarde/Dominsignias SaveHandlerTroubleshooter=Solucionador de problemas del manejador de guardado SettingsEditor=Ajustes SuperTrainingEditor=Editor de Superentrenamiento @@ -406,9 +406,9 @@ LocalizedDescription.VirtualConsoleSourceGen1=Versión por defecto al transferir LocalizedDescription.VirtualConsoleSourceGen2=Versión por defecto al transferir de la 2a generación en la Consola Virtual de la 3DS hacia la 7a generación. LocalizedDescription.ZeroHeightWeight=En la comprobación de legalidad, marcar Severidad si se detecta que el Pokémon tiene los valores de Altura y Peso son ambos cero. Main.B_Blocks=Datos Bloque -Main.B_CellsStickers=Cel./Dominsi. +Main.B_CellsStickers=Células/Insignias Main.B_Clear=Limpiar -Main.B_ConvertKorean=Conv. Partida COR +Main.B_ConvertKorean=Conversión de guardado Coreano Main.B_DLC=Editor de DLC Main.B_Donuts=Donas Main.B_FestivalPlaza=Festi Plaza @@ -426,9 +426,9 @@ Main.B_OpenFriendSafari=Safari Amistad Main.B_OpenGear=Accesorios Main.B_OpenGeonetEditor=Geonet Main.B_OpenGlobalLink=Pokémon Global Link -Main.B_OpenHallofFame=Salón de Fama +Main.B_OpenHallofFame=Salón de la Fama Main.B_OpenHoneyTreeEditor=Árbol de Miel -Main.B_OpenItemPouch=Inventario +Main.B_OpenItemPouch=Objetos Main.B_OpenJoinAvenueEditor=Pasaje Unión Main.B_OpenLinkInfo=Datos Nexo Main.B_OpenMedalsEditor=Insignias @@ -442,24 +442,24 @@ Main.B_OpenPokepuffs=Pokélito Main.B_OpenRTCEditor=Reloj (RTR) Main.B_OpenSealStickers=Sellos Main.B_OpenSecretBase=Base Secreta -Main.B_OpenSuperTraining=Superentren. -Main.B_OpenTrainerInfo=Entrenador +Main.B_OpenSuperTraining=Superentrenamiento +Main.B_OpenTrainerInfo=Info de Entrenador Main.B_OpenUGSEditor=Subsuelo Main.B_OpenUnityTowerEditor=Torre Unión -Main.B_OpenWondercards=Tarjetas Mist. +Main.B_OpenWondercards=Tarjetas Misteriosas Main.B_OtherSlots=Otras ranuras Main.B_OUTPasserby=Transeúntes Main.B_PlusRecord=Marcas + Main.B_Poffins=Pokochos Main.B_Raids=Incursiones -Main.B_RaidsDLC1=Incurs. (DLC 1) -Main.B_RaidsDLC2=Incurs. (DLC 2) -Main.B_RaidsSevenStar=Incurs. 7 Est. +Main.B_RaidsDLC1=Incursiones (DLC 1) +Main.B_RaidsDLC2=Incursiones (DLC 2) +Main.B_RaidsSevenStar=Incursiones (7 estrellas) Main.B_RelearnFlags=Marcas recuerdamov. Main.B_Reset=Reiniciar Main.B_Roamer=Errante Main.B_SaveBoxBin=Guardar Cajas++ -Main.B_VerifyCHK=Suma de verificación +Main.B_VerifyCHK=Verificar sumas de verificación Main.B_VerifySaveEntities=Verificar los PKMs Main.BTN_History=Recuerdos Main.BTN_Medals=Medallas @@ -2090,8 +2090,8 @@ SAV_PokedexGG.CHK_L4=Italiano SAV_PokedexGG.CHK_L5=Alemán SAV_PokedexGG.CHK_L6=Español SAV_PokedexGG.CHK_L7=Coreano -SAV_PokedexGG.CHK_L8=Chino -SAV_PokedexGG.CHK_L9=Chino2 +SAV_PokedexGG.CHK_L8=ChinoS +SAV_PokedexGG.CHK_L9=ChinoT SAV_PokedexGG.CHK_P1=Obtenido SAV_PokedexGG.CHK_P2=Macho SAV_PokedexGG.CHK_P3=Hembra @@ -2221,8 +2221,8 @@ SAV_PokedexSM.CHK_L4=Italiano SAV_PokedexSM.CHK_L5=Alemán SAV_PokedexSM.CHK_L6=Español SAV_PokedexSM.CHK_L7=Coreano -SAV_PokedexSM.CHK_L8=Chino -SAV_PokedexSM.CHK_L9=Chino2 +SAV_PokedexSM.CHK_L8=ChinoS +SAV_PokedexSM.CHK_L9=ChinoT SAV_PokedexSM.CHK_P1=Obtenido SAV_PokedexSM.CHK_P2=Macho SAV_PokedexSM.CHK_P3=Hembra @@ -2307,8 +2307,8 @@ SAV_PokedexSWSH.CHK_L4=Italiano SAV_PokedexSWSH.CHK_L5=Alemán SAV_PokedexSWSH.CHK_L6=Español SAV_PokedexSWSH.CHK_L7=Coreano -SAV_PokedexSWSH.CHK_L8=Chino -SAV_PokedexSWSH.CHK_L9=Chino2 +SAV_PokedexSWSH.CHK_L8=ChinoS +SAV_PokedexSWSH.CHK_L9=ChinoT SAV_PokedexSWSH.CHK_S=Brillante SAV_PokedexSWSH.GB_Displayed=Mostrado SAV_PokedexSWSH.GB_Language=Idiomas @@ -2359,7 +2359,7 @@ SAV_Pokepuff.B_Sort=Editar SAV_Raid8.B_Cancel=Cancelar SAV_Raid8.B_Save=Guardar SAV_Raid9.B_Cancel=Cancelar -SAV_Raid9.B_CopyToOthers=Copiar a otras incurs. +SAV_Raid9.B_CopyToOthers=Copiar a otras incursiones SAV_Raid9.B_Save=Guardar SAV_Raid9.L_SeedCurrent=Semilla actual: SAV_Raid9.L_SeedTomorrow=Mañana: diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index 87b7ed025..5ab4e464b 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -35,7 +35,7 @@ SAV_HallOfFame=Editor del Hall de la Fama SAV_HallOfFame1=Visor del Hall de la Fama SAV_HallOfFame3=Visor del Hall de la Fama SAV_HallOfFame7=Visor del Hall de la Fama -SAV_HoneyTree=Editor de Árbol de Miel +SAV_HoneyTree=Editor de Árboles de Miel SAV_Inventory=Editor de Inventario SAV_JoinAvenue=Editor de Galería Unión SAV_Link6=Editor del Nexo Pokémon @@ -50,7 +50,7 @@ SAV_MysteryGiftDB=Base de Datos SAV_OPower=Editor de Poder O SAV_Poffin8b=Editor de Pokochos SAV_Pokeathlon4=Editor de Pokéathlon -SAV_Pokebean=Editor de Pokéhaba +SAV_Pokebean=Editor de Pokéhabas SAV_PokeBlockORAS=Editor de Pokécubos SAV_Pokedex4=Editor de Pokédex SAV_Pokedex5=Editor de Pokédex @@ -90,7 +90,7 @@ SAV_Underground=Editor del Subsuelo SAV_Underground8b=Editor de Objetos del Subsuelo SAV_UnityTower=Editor de la Torre Unión SAV_Wondercard=E/S de Regalo Misterioso -SAV_ZygardeCell=Editor de Células/Dominsignias +SAV_ZygardeCell=Editor de Células de Zygarde/Dominsignias SaveHandlerTroubleshooter=Solucionador de problemas del gestor de guardado SettingsEditor=Ajustes SuperTrainingEditor=Editor de Superentrenamiento @@ -406,9 +406,9 @@ LocalizedDescription.VirtualConsoleSourceGen1=Versión por defecto al transferir LocalizedDescription.VirtualConsoleSourceGen2=Versión por defecto al transferir de la 2a generación en la Consola Virtual de la 3DS hacia la 7a generación. LocalizedDescription.ZeroHeightWeight=En la comprobación de legalidad, marcar Severidad si se detecta que el Pokémon tiene los valores de Altura y Peso son ambos cero. Main.B_Blocks=Datos Bloque -Main.B_CellsStickers=Cel./Dominsi. +Main.B_CellsStickers=Células/Insignias Main.B_Clear=Limpiar -Main.B_ConvertKorean=Conv. Partida COR +Main.B_ConvertKorean=Conversión de guardado Coreano Main.B_DLC=Editor de DLC Main.B_Donuts=Dónuts Main.B_FestivalPlaza=Festi Plaza @@ -428,7 +428,7 @@ Main.B_OpenGeonetEditor=Geonet Main.B_OpenGlobalLink=Pokémon Global Link Main.B_OpenHallofFame=Hall de la Fama Main.B_OpenHoneyTreeEditor=Árbol de Miel -Main.B_OpenItemPouch=Inventario +Main.B_OpenItemPouch=Objetos Main.B_OpenJoinAvenueEditor=Galería Unión Main.B_OpenLinkInfo=Datos Nexo Main.B_OpenMedalsEditor=Insignias @@ -442,24 +442,24 @@ Main.B_OpenPokepuffs=Pokélito Main.B_OpenRTCEditor=Reloj (RTR) Main.B_OpenSealStickers=Sellos Main.B_OpenSecretBase=Base Secreta -Main.B_OpenSuperTraining=Superentren. -Main.B_OpenTrainerInfo=Entrenador +Main.B_OpenSuperTraining=Superentrenamiento +Main.B_OpenTrainerInfo=Info de Entrenador Main.B_OpenUGSEditor=Subsuelo Main.B_OpenUnityTowerEditor=Torre Unión -Main.B_OpenWondercards=Tarjetas Mist. +Main.B_OpenWondercards=Tarjetas Misteriosas Main.B_OtherSlots=Otras ranuras Main.B_OUTPasserby=Transeúntes Main.B_PlusRecord=Marcas + Main.B_Poffins=Pokochos Main.B_Raids=Incursiones -Main.B_RaidsDLC1=Incurs. (DLC 1) -Main.B_RaidsDLC2=Incurs. (DLC 2) -Main.B_RaidsSevenStar=Incurs. 7 Est. +Main.B_RaidsDLC1=Incursiones (DLC 1) +Main.B_RaidsDLC2=Incursiones (DLC 2) +Main.B_RaidsSevenStar=Incursiones (7 estrellas) Main.B_RelearnFlags=Marcas recuerdamov. Main.B_Reset=Reiniciar Main.B_Roamer=Errante Main.B_SaveBoxBin=Guardar Cajas++ -Main.B_VerifyCHK=Suma de verificación +Main.B_VerifyCHK=Verificar sumas de verificación Main.B_VerifySaveEntities=Verificar los PKMs Main.BTN_History=Recuerdos Main.BTN_Medals=Medallas @@ -2090,8 +2090,8 @@ SAV_PokedexGG.CHK_L4=Italiano SAV_PokedexGG.CHK_L5=Alemán SAV_PokedexGG.CHK_L6=Español SAV_PokedexGG.CHK_L7=Coreano -SAV_PokedexGG.CHK_L8=Chino -SAV_PokedexGG.CHK_L9=Chino2 +SAV_PokedexGG.CHK_L8=ChinoS +SAV_PokedexGG.CHK_L9=ChinoT SAV_PokedexGG.CHK_P1=Obtenido SAV_PokedexGG.CHK_P2=Macho SAV_PokedexGG.CHK_P3=Hembra @@ -2221,8 +2221,8 @@ SAV_PokedexSM.CHK_L4=Italiano SAV_PokedexSM.CHK_L5=Alemán SAV_PokedexSM.CHK_L6=Español SAV_PokedexSM.CHK_L7=Coreano -SAV_PokedexSM.CHK_L8=Chino -SAV_PokedexSM.CHK_L9=Chino2 +SAV_PokedexSM.CHK_L8=ChinoS +SAV_PokedexSM.CHK_L9=ChinoT SAV_PokedexSM.CHK_P1=Obtenido SAV_PokedexSM.CHK_P2=Macho SAV_PokedexSM.CHK_P3=Hembra @@ -2307,8 +2307,8 @@ SAV_PokedexSWSH.CHK_L4=Italiano SAV_PokedexSWSH.CHK_L5=Alemán SAV_PokedexSWSH.CHK_L6=Español SAV_PokedexSWSH.CHK_L7=Coreano -SAV_PokedexSWSH.CHK_L8=Chino -SAV_PokedexSWSH.CHK_L9=Chino2 +SAV_PokedexSWSH.CHK_L8=ChinoS +SAV_PokedexSWSH.CHK_L9=ChinoT SAV_PokedexSWSH.CHK_S=Variocolor SAV_PokedexSWSH.GB_Displayed=Mostrado SAV_PokedexSWSH.GB_Language=Idiomas @@ -2359,7 +2359,7 @@ SAV_Pokepuff.B_Sort=Editar SAV_Raid8.B_Cancel=Cancelar SAV_Raid8.B_Save=Guardar SAV_Raid9.B_Cancel=Cancelar -SAV_Raid9.B_CopyToOthers=Copiar a otras incurs. +SAV_Raid9.B_CopyToOthers=Copiar a otras incursiones SAV_Raid9.B_Save=Guardar SAV_Raid9.L_SeedCurrent=Semilla actual: SAV_Raid9.L_SeedTomorrow=Mañana: diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index 831d77a4a..424a66dc1 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -90,7 +90,7 @@ SAV_Underground=Éditeur du Souterrain SAV_Underground8b=Éditeur des objets du Grand Souterrain SAV_UnityTower=Éditeur Tour Union SAV_Wondercard=E/S Cadeau Mystère -SAV_ZygardeCell=Éditeur de Cellules/Emblèmes +SAV_ZygardeCell=Éditeur de Cellules de Zygarde/Emblèmes des Dominants SaveHandlerTroubleshooter=Dépannage du gestionnaire de sauvegarde SettingsEditor=Paramètres SuperTrainingEditor=Éditeur de Médailles @@ -406,14 +406,14 @@ LocalizedDescription.VirtualConsoleSourceGen1=Version par défaut à utiliser lo LocalizedDescription.VirtualConsoleSourceGen2=Version par défaut à utiliser lors d'un transfert de la Console Virtuelle 3DS 2G vers la 7ème génération. LocalizedDescription.ZeroHeightWeight=Degré de sévérité pour signaler lors d'une Vérification de la Légalité si un Pokémon a une valeur nulle pour sa Taille et son Poids. Main.B_Blocks=Blocs données -Main.B_CellsStickers=Cell./Embl. +Main.B_CellsStickers=Cellules/Emblèmes Main.B_Clear=Effacer -Main.B_ConvertKorean=Conversion sauv. Corée +Main.B_ConvertKorean=Conversion de sauvegarde Coréenne Main.B_DLC=Éditeur DLC Main.B_Donuts=Donuts Main.B_FestivalPlaza=Place Festival Main.B_JPEG=Sauver jpeg PGL -Main.B_MailBox=B. Lettres +Main.B_MailBox=Boîte aux Lettres Main.B_MoveShop=Boutique Capacités Main.B_OpenApricorn=Noigrumes Main.B_OpenBattlePass=Cartes @@ -429,7 +429,7 @@ Main.B_OpenGlobalLink=Pokémon Global Link Main.B_OpenHallofFame=Panthéon Main.B_OpenHoneyTreeEditor=Arbres à miel Main.B_OpenItemPouch=Objets -Main.B_OpenJoinAvenueEditor=Gal. Concorde +Main.B_OpenJoinAvenueEditor=Galerie Concorde Main.B_OpenLinkInfo=Poké Lien Main.B_OpenMedalsEditor=Médailles Main.B_OpenMiscEditor=Éditeur divers @@ -443,7 +443,7 @@ Main.B_OpenRTCEditor=Horloge (HTR) Main.B_OpenSealStickers=Sceaux Main.B_OpenSecretBase=Bases Secrètes Main.B_OpenSuperTraining=SPV -Main.B_OpenTrainerInfo=Infos Dress. +Main.B_OpenTrainerInfo=Infos Dresseur Main.B_OpenUGSEditor=Souterrain Main.B_OpenUnityTowerEditor=Tour Union Main.B_OpenWondercards=Cartes Miracle @@ -454,12 +454,12 @@ Main.B_Poffins=Poffins Main.B_Raids=Raids Main.B_RaidsDLC1=Raids (DLC 1) Main.B_RaidsDLC2=Raids (DLC 2) -Main.B_RaidsSevenStar=Raids 7 Étoiles +Main.B_RaidsSevenStar=Raids (7 Étoiles) Main.B_RelearnFlags=Édit. réapprentisage Main.B_Reset=Réinitialiser Main.B_Roamer=Fuyards Main.B_SaveBoxBin=Sauvegarde boîtes ++ -Main.B_VerifyCHK=Sommes de contrôle +Main.B_VerifyCHK=Vérifier sommes de contrôle Main.B_VerifySaveEntities=Vérifier tous les Pokémon Main.BTN_History=Souvenirs Main.BTN_Medals=Médailles diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index e910c25da..2e11f54aa 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -90,7 +90,7 @@ SAV_Underground=Editor Sotterranei SAV_Underground8b=Editor Strumenti Sotterranei SAV_UnityTower=Editor Torre Unione SAV_Wondercard=I/O Dono Segreto -SAV_ZygardeCell=Editor Cellule e Adesivi +SAV_ZygardeCell=Editor Cellule di Zygarde/Adesivi del dominante SaveHandlerTroubleshooter=Risoluzione problemi gestore salvataggi SettingsEditor=Impostazioni SuperTrainingEditor=Editor Medaglie @@ -406,9 +406,9 @@ LocalizedDescription.VirtualConsoleSourceGen1=Versione predefinita da impostare LocalizedDescription.VirtualConsoleSourceGen2=Versione predefinita da impostare quando si trasferisce dalla Virtual Console 3DS di Gen 2 alla Gen 7. LocalizedDescription.ZeroHeightWeight=Forza una segnalazione di Legalità se il Pokémon ha zero sia nel Peso che nell'Altezza. Main.B_Blocks=Blocchi di Dati -Main.B_CellsStickers=Cell./Adesivi +Main.B_CellsStickers=Cellule/Adesivi Main.B_Clear=Pulisci -Main.B_ConvertKorean=Conv. Salvat. COR +Main.B_ConvertKorean=Conversione salvataggio Coreano Main.B_DLC=Editor DLC Main.B_Donuts=Ciambelle Main.B_FestivalPlaza=Festiplaza diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index c22933bb0..4cd71ab3a 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -36,7 +36,7 @@ SAV_HallOfFame1=殿堂入りデータビューア SAV_HallOfFame3=殿堂入りデータビューア SAV_HallOfFame7=殿堂入りデータビューア SAV_HoneyTree=あまいかおりのするき -SAV_Inventory=アイテム +SAV_Inventory=どうぐ SAV_JoinAvenue=ジョインアベニュー SAV_Link6=ポケモンリンク SAV_MailBox=メールボックス @@ -90,7 +90,7 @@ SAV_Underground=ちかつうろ SAV_Underground8b=地下大洞窟 SAV_UnityTower=ユナイテッドタワー SAV_Wondercard=ふしぎなおくりもの入出力 -SAV_ZygardeCell=ジガルデ・セル / ヌシール +SAV_ZygardeCell=ジガルデ・セル/ヌシール SaveHandlerTroubleshooter=セーブハンドラ トラブルシューター SettingsEditor=設定 SuperTrainingEditor=スパトレ @@ -406,7 +406,7 @@ LocalizedDescription.VirtualConsoleSourceGen1=第1世代のポケモンを第 LocalizedDescription.VirtualConsoleSourceGen2=第2世代のポケモンを第7世代に送る際に設定するデフォルトのバージョン。 LocalizedDescription.ZeroHeightWeight=ポケモンの高さと重さがゼロの場合、正規チェックにフラグを立てる。 Main.B_Blocks=ブロック・データ -Main.B_CellsStickers=ヌシール/セル +Main.B_CellsStickers=セル/ヌシール Main.B_Clear=クリア Main.B_ConvertKorean=韓国語セーブ変換 Main.B_DLC=DLC Editor @@ -428,7 +428,7 @@ Main.B_OpenGeonetEditor=ジオネット Main.B_OpenGlobalLink=ポケモングローバルリンク Main.B_OpenHallofFame=殿堂入り Main.B_OpenHoneyTreeEditor=ミツの木 -Main.B_OpenItemPouch=アイテム +Main.B_OpenItemPouch=どうぐ Main.B_OpenJoinAvenueEditor=ジョインアベニュー Main.B_OpenLinkInfo=ポケモンリンク Main.B_OpenMedalsEditor=メダル diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index 239ba3e3e..3590015d4 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -68,7 +68,7 @@ SAV_PokedexXY=포켓몬 도감 편집 도구 SAV_Pokepuff=포플레 편집 도구 SAV_Raid8=레이드 매개변수 편집 도구 SAV_Raid9=레이드 매개변수 편집 도구 -SAV_RaidSevenStar9=7 Star 레이드 매개변수 편집 도구 +SAV_RaidSevenStar9=7 성 레이드 매개변수 편집 도구 SAV_Roamer3=배회 편집 도구 SAV_Roamer6=배회 편집 도구 SAV_RTC3=RTC 편집 도구 @@ -90,7 +90,7 @@ SAV_Underground=지하통로 점수 편집 도구 SAV_Underground8b=지하통로 아이템 편집 도구 SAV_UnityTower=유나이티드타워 편집 도구 SAV_Wondercard=이상한 소포 입출력 -SAV_ZygardeCell=셀/스티커 편집 도구 +SAV_ZygardeCell=지가르데 셀/주인실 편집 도구 SaveHandlerTroubleshooter=세이브 핸들러 문제 해결 도구 SettingsEditor=설정 SuperTrainingEditor=메달 편집 도구 @@ -406,7 +406,7 @@ LocalizedDescription.VirtualConsoleSourceGen1=1세대 3DS 버추얼 콘솔에서 LocalizedDescription.VirtualConsoleSourceGen2=2세대 3DS 버추얼 콘솔에서 7세대로 보낼 때 설정할 기본 버전입니다. LocalizedDescription.ZeroHeightWeight=포켓몬의 키와 몸무게 값이 모두 0일 경우, 합법성 검사 플래그의 심각도입니다. Main.B_Blocks=블록 데이터 -Main.B_CellsStickers=셀/스티커 +Main.B_CellsStickers=셀/주인실 Main.B_Clear=지우기 Main.B_ConvertKorean=한국 세이브 변환 Main.B_DLC=DLC 편집 도구 @@ -2031,8 +2031,8 @@ SAV_Pokedex9a.B_Modify=모두 수정... SAV_Pokedex9a.B_Save=저장 SAV_Pokedex9a.CHK_DisplayShiny=이로치: SAV_Pokedex9a.CHK_IsNew=신규 -SAV_Pokedex9a.CHK_LangCHS=중국어(간체) -SAV_Pokedex9a.CHK_LangCHT=중국어(번체) +SAV_Pokedex9a.CHK_LangCHS=간체 중국어 +SAV_Pokedex9a.CHK_LangCHT=번체 중국어 SAV_Pokedex9a.CHK_LangENG=영어 SAV_Pokedex9a.CHK_LangFRE=프랑스어 SAV_Pokedex9a.CHK_LangGER=독일어 @@ -2061,8 +2061,8 @@ SAV_PokedexBDSP.B_ModifyForms=수정... SAV_PokedexBDSP.B_Save=저장 SAV_PokedexBDSP.CHK_F=암컷 SAV_PokedexBDSP.CHK_FS=이로치 암컷 -SAV_PokedexBDSP.CHK_LangCHS=중국어(간체) -SAV_PokedexBDSP.CHK_LangCHT=중국어(번체) +SAV_PokedexBDSP.CHK_LangCHS=간체 중국어 +SAV_PokedexBDSP.CHK_LangCHT=번체 중국어 SAV_PokedexBDSP.CHK_LangENG=영어 SAV_PokedexBDSP.CHK_LangFRE=프랑스어 SAV_PokedexBDSP.CHK_LangGER=독일어 @@ -2244,8 +2244,8 @@ SAV_PokedexSV.B_Save=저장 SAV_PokedexSV.CHK_DisplayShiny=이로치 SAV_PokedexSV.CHK_G=성별 다름 SAV_PokedexSV.CHK_IsNew=신규 -SAV_PokedexSV.CHK_LangCHS=중국어(간체) -SAV_PokedexSV.CHK_LangCHT=중국어(번체) +SAV_PokedexSV.CHK_LangCHS=간체 중국어 +SAV_PokedexSV.CHK_LangCHT=번체 중국어 SAV_PokedexSV.CHK_LangENG=영어 SAV_PokedexSV.CHK_LangFRE=프랑스어 SAV_PokedexSV.CHK_LangGER=독일어 @@ -2268,8 +2268,8 @@ SAV_PokedexSVKitakami.B_Modify=모두 수정... SAV_PokedexSVKitakami.B_Save=저장 SAV_PokedexSVKitakami.CHK_BlueberryShiny=이로치 SAV_PokedexSVKitakami.CHK_KitakamiShiny=이로치 -SAV_PokedexSVKitakami.CHK_LangCHS=중국어(간체) -SAV_PokedexSVKitakami.CHK_LangCHT=중국어(번체) +SAV_PokedexSVKitakami.CHK_LangCHS=간체 중국어 +SAV_PokedexSVKitakami.CHK_LangCHT=번체 중국어 SAV_PokedexSVKitakami.CHK_LangENG=영어 SAV_PokedexSVKitakami.CHK_LangFRE=프랑스어 SAV_PokedexSVKitakami.CHK_LangGER=독일어 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index a0a8568b4..a1fc5f1fe 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -9,73 +9,73 @@ MemoryAmie=回忆编辑器 MoveShopEditor=招式商店编辑器 QR=PKHeX 二维码(点击二维码复制图片) RibbonEditor=奖章 -SAV_Apricorn=球果编辑 -SAV_BattlePass=对战通行证编辑 +SAV_Apricorn=球果编辑器 +SAV_BattlePass=对战通行证编辑器 SAV_BerryFieldXY=树果园查看器 SAV_BlockDump8=存档转储 SAV_BoxLayout=盒子外观 SAV_BoxList=寄放系统 -SAV_Capture7GG=捕获记录编辑 +SAV_Capture7GG=捕获记录编辑器 SAV_Chatter=语音编辑器 SAV_Database=数据库 SAV_DLC5=第五世代DLC工具 SAV_Donut9a=甜甜圈编辑器 SAV_DonutGenerator9a=随机甜甜圈生成器 SAV_Encounters=数据库 -SAV_EventFlags=事件旗标编辑 +SAV_EventFlags=事件旗标编辑器 SAV_EventReset1=事件重置 SAV_EventWork=事件标志编辑器 SAV_Fashion9=时装编辑器 SAV_FlagWork8b=事件标志编辑器 SAV_FolderList=文件夹列表 SAV_Gear=装扮配件编辑器 -SAV_Geonet4=地理网编辑 +SAV_Geonet4=地理网编辑器 SAV_GlobalLink5=宝可梦全球连接编辑器 SAV_HallOfFame=名人堂 SAV_HallOfFame1=名人堂 SAV_HallOfFame3=名人堂 SAV_HallOfFame7=名人堂 -SAV_HoneyTree=甜甜蜜树编辑 -SAV_Inventory=物品栏 -SAV_JoinAvenue=汇合大道编辑 +SAV_HoneyTree=甜甜蜜树编辑器 +SAV_Inventory=物品栏编辑器 +SAV_JoinAvenue=汇合大道编辑器 SAV_Link6=宝可梦连接工具 -SAV_MailBox=邮箱编辑 -SAV_Medals5=奖牌编辑 -SAV_Misc2=杂项编辑 -SAV_Misc3=训练家数据编辑 -SAV_Misc4=杂项编辑 -SAV_Misc5=杂项编辑 -SAV_Misc8b=杂项编辑 +SAV_MailBox=邮箱编辑器 +SAV_Medals5=奖牌编辑器 +SAV_Misc2=杂项编辑器 +SAV_Misc3=训练家数据编辑器 +SAV_Misc4=杂项编辑器 +SAV_Misc5=杂项编辑器 +SAV_Misc8b=杂项编辑器 SAV_MysteryGiftDB=礼物数据库 SAV_OPower=O-力量 -SAV_Poffin8b=宝芬编辑 -SAV_Pokeathlon4=宝可全能竞技赛编辑 +SAV_Poffin8b=宝芬编辑器 +SAV_Pokeathlon4=宝可全能竞技赛编辑器 SAV_Pokebean=宝可豆 SAV_PokeBlockORAS=宝可方块 -SAV_Pokedex4=图鉴编辑 -SAV_Pokedex5=图鉴编辑 -SAV_Pokedex9a=图鉴编辑 -SAV_PokedexBDSP=图鉴编辑 -SAV_PokedexGG=图鉴编辑 -SAV_PokedexLA=图鉴编辑 -SAV_PokedexORAS=图鉴编辑 -SAV_PokedexResearchEditorLA=图鉴课题编辑 -SAV_PokedexSM=图鉴编辑 -SAV_PokedexSV=图鉴编辑 -SAV_PokedexSVKitakami=图鉴编辑 -SAV_PokedexSWSH=图鉴编辑 -SAV_PokedexXY=图鉴编辑 +SAV_Pokedex4=图鉴编辑器 +SAV_Pokedex5=图鉴编辑器 +SAV_Pokedex9a=图鉴编辑器 +SAV_PokedexBDSP=图鉴编辑器 +SAV_PokedexGG=图鉴编辑器 +SAV_PokedexLA=图鉴编辑器 +SAV_PokedexORAS=图鉴编辑器 +SAV_PokedexResearchEditorLA=图鉴课题编辑器 +SAV_PokedexSM=图鉴编辑器 +SAV_PokedexSV=图鉴编辑器 +SAV_PokedexSVKitakami=图鉴编辑器 +SAV_PokedexSWSH=图鉴编辑器 +SAV_PokedexXY=图鉴编辑器 SAV_Pokepuff=宝芙蕾 SAV_Raid8=极巨巢穴参数编辑器 SAV_Raid9=太晶洞窟参数编辑器 SAV_RaidSevenStar9=7星太晶洞窟参数编辑器 SAV_Roamer3=游走传说 SAV_Roamer6=游走编辑器 -SAV_RTC3=时钟编辑 +SAV_RTC3=时钟编辑器 SAV_SealStickers8b=球壳装饰列表 SAV_SecretBase=秘密基地 -SAV_SimplePokedex=图鉴编辑 -SAV_SimpleTrainer=训练家数据编辑 +SAV_SimplePokedex=图鉴编辑器 +SAV_SimpleTrainer=训练家数据编辑器 SAV_SuperTrain=超级训练记录 SAV_Trainer=训练家资料 SAV_Trainer4BR=训练家资料 @@ -86,15 +86,15 @@ SAV_Trainer8a=训练家资料 SAV_Trainer8b=训练家资料 SAV_Trainer9=训练家资料 SAV_Trainer9a=训练家资料 -SAV_Underground=地下世界编辑 -SAV_Underground8b=地下世界编辑 -SAV_UnityTower=联合塔编辑 +SAV_Underground=地下世界编辑器 +SAV_Underground8b=地下世界编辑器 +SAV_UnityTower=联合塔编辑器 SAV_Wondercard=神秘礼物输入/输出 -SAV_ZygardeCell=细胞/贴纸编辑 +SAV_ZygardeCell=基格尔德・细胞/霸主贴纸编辑器 SaveHandlerTroubleshooter=存档处理程序疑难解答 SettingsEditor=设置 SuperTrainingEditor=超级训练奖章 -TechRecordEditor=招式记录器编辑 +TechRecordEditor=招式记录器编辑器 TrashEditor=特殊字符 About.L_Thanks=感谢所有研究人员! About.Tab_Changelog=更新日志 @@ -406,7 +406,7 @@ LocalizedDescription.VirtualConsoleSourceGen1=从第1代3DS虚拟传送转移到 LocalizedDescription.VirtualConsoleSourceGen2=从第2代3DS虚拟传送转移到第7代时要设置的默认版本。 LocalizedDescription.ZeroHeightWeight=宝可梦身高体重都为0时合法性检查的严格程度。 Main.B_Blocks=数据块 -Main.B_CellsStickers=细胞/贴纸 +Main.B_CellsStickers=细胞/霸主贴纸 Main.B_Clear=清理 Main.B_ConvertKorean=韩语保存转换 Main.B_DLC=DLC工具 diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index f9fcd3c4c..9afa22666 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -9,20 +9,20 @@ MemoryAmie=回憶編輯器 MoveShopEditor=招式商店編輯器 QR=PKHeX 二維碼(點擊二維碼複製圖片) RibbonEditor=獎章 -SAV_Apricorn=球果編輯 -SAV_BattlePass=對戰通行證編輯 +SAV_Apricorn=球果編輯器 +SAV_BattlePass=對戰通行證編輯器 SAV_BerryFieldXY=樹果園檢視器 SAV_BlockDump8=存檔轉儲 SAV_BoxLayout=盒子外觀 SAV_BoxList=寄放系統 -SAV_Capture7GG=捕獲記錄編輯 +SAV_Capture7GG=捕獲記錄編輯器 SAV_Chatter=語音編輯器 SAV_Database=資料庫 SAV_DLC5=第五世代DLC工具 SAV_Donut9a=甜甜圈編輯器 SAV_DonutGenerator9a=隨機甜甜圈生成器 SAV_Encounters=遇見資料庫 -SAV_EventFlags=事件旗標編輯 +SAV_EventFlags=事件旗標編輯器 SAV_EventReset1=事件重置 SAV_EventWork=事件標誌編輯器 SAV_Fashion9=時裝編輯器 @@ -35,17 +35,17 @@ SAV_HallOfFame=名人堂 SAV_HallOfFame1=名人堂 SAV_HallOfFame3=名人堂 SAV_HallOfFame7=名人堂 -SAV_HoneyTree=甜甜蜜樹編輯 -SAV_Inventory=物品欄 -SAV_JoinAvenue=匯合大道編輯 +SAV_HoneyTree=甜甜蜜樹編輯器 +SAV_Inventory=物品欄編輯器 +SAV_JoinAvenue=匯合大道編輯器 SAV_Link6=寶可夢連接工具 -SAV_MailBox=郵箱編輯 -SAV_Medals5=獎牌編輯 -SAV_Misc2=訓練家資料雜項編輯 -SAV_Misc3=訓練家資料雜項編輯 -SAV_Misc4=訓練家資料雜項編輯 -SAV_Misc5=訓練家資料雜項編輯 -SAV_Misc8b=訓練家資料雜項編輯 +SAV_MailBox=郵箱編輯器 +SAV_Medals5=獎牌編輯器 +SAV_Misc2=訓練家資料雜項編輯器 +SAV_Misc3=訓練家資料雜項編輯器 +SAV_Misc4=訓練家資料雜項編輯器 +SAV_Misc5=訓練家資料雜項編輯器 +SAV_Misc8b=訓練家資料雜項編輯器 SAV_MysteryGiftDB=神秘禮物資料庫 SAV_OPower=O-力量編輯器 SAV_Poffin8b=寶芬編輯器 @@ -90,7 +90,7 @@ SAV_Underground=地下世界編輯器 SAV_Underground8b=地下世界編輯器 SAV_UnityTower=聯合塔編輯器 SAV_Wondercard=神秘禮物輸入/輸出 -SAV_ZygardeCell=細胞/貼紙編輯器 +SAV_ZygardeCell=基格爾德・細胞/霸主贴纸編輯器 SaveHandlerTroubleshooter=存檔處理常式疑難排解 SettingsEditor=設置 SuperTrainingEditor=超級訓練獎章器 @@ -406,7 +406,7 @@ LocalizedDescription.VirtualConsoleSourceGen1=從第1代3DS虛擬傳送轉移到 LocalizedDescription.VirtualConsoleSourceGen2=從第2代3DS虛擬傳送轉移到第7代時要設定的預設版本。 LocalizedDescription.ZeroHeightWeight=對身高體重均為0之寶可夢的合法性檢測嚴格程度。 Main.B_Blocks=資料塊 -Main.B_CellsStickers=細胞/貼紙 +Main.B_CellsStickers=細胞/霸主贴纸 Main.B_Clear=清理 Main.B_ConvertKorean=韓語保存轉換 Main.B_DLC=DLC工具 From 452ddcb49681dd5039369f0b3c7929bffa37c91c Mon Sep 17 00:00:00 2001 From: Kurt Date: Thu, 11 Jun 2026 23:47:56 -0500 Subject: [PATCH 78/81] Update PK5.cs didnt bother checking disassembly; this handles basculin if we just use the RefreshAbility API. --- PKHeX.Core/PKM/PK5.cs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/PKHeX.Core/PKM/PK5.cs b/PKHeX.Core/PKM/PK5.cs index de29cef29..e099c58bc 100644 --- a/PKHeX.Core/PKM/PK5.cs +++ b/PKHeX.Core/PKM/PK5.cs @@ -375,8 +375,6 @@ public PK6 ConvertToPK6() SID16 = SID16, EXP = EXP, PID = GetTransferPID(PID, ID32, out _), - Ability = Ability, - AbilityNumber = 1 << CalculateAbilityIndex(), MarkingValue = MarkingValue, Language = Math.Max((int)LanguageID.Japanese, Language), // Hacked or Bad In-game Trade (Japanese B/W) @@ -508,12 +506,9 @@ public PK6 ConvertToPK6() StringConverter345.TransferGlyphs56(pk6.NicknameTrash); StringConverter345.TransferString56(OriginalTrainerTrash, pk6.OriginalTrainerTrash); - // Fix Basculin-Blue - if (Species is (ushort)Core.Species.Basculin && Form == 1 && Ability == (int)Core.Ability.Reckless) - { - pk6.Ability = (int)Core.Ability.RockHead; - pk6.AbilityNumber = 1; - } + // Fix Abilities - handle changed abilities and bugged ones like Basculin-Blue. + var abilityIndex = CalculateTransferAbilityIndex(); + pk6.RefreshAbility(abilityIndex); // Fix Checksum pk6.RefreshChecksum(); @@ -554,15 +549,18 @@ private static byte CountContestRibbons(ReadOnlySpan data) return (byte)BitOperations.PopCount(((ulong)bits1 << 20) | bits2); } - private int CalculateAbilityIndex() + private int CalculateTransferAbilityIndex() { if (HiddenAbility) return 2; + var pi = PersonalInfo; - if (pi.Ability1 == Ability) + var ability = Ability; + if (ability == pi.Ability1) return 0; - if (pi.Ability2 == Ability) + if (ability == pi.Ability2) return 1; + // reset ability, invalid var pid = PID; if (Gen5) From 3e6895b906693311e9bced13487edf296fa8ab95 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 14 Jun 2026 00:51:11 -0500 Subject: [PATCH 79/81] Misc tweaks Show item sprites for TM/HM in inventory editor, just be more general on the Lumped image method Rework Trainer ID, now updates tooltip as you change TID. Components are separate controls. Re-flow Chatter editor GUI Add Experience bar to pkm editor for more visual editing of the EXP. Matches scroll behavior of EXP/Level textboxes. Exp bar can be hidden via settings. --- .../Program/Settings/EntityEditorSettings.cs | 3 + .../Editors/Controls/TrainerIDManager.cs | 111 ++++++ PKHeX.Core/Items/HeldItemLumpImage.cs | 16 +- PKHeX.Core/Items/ItemStorage4.cs | 1 + PKHeX.Core/Legality/RNG/CXD/MethodPokeSpot.cs | 1 - PKHeX.Core/PKM/Interfaces/ITrainerID32.cs | 31 +- PKHeX.WinForms/Controls/PKM Editor/EditPK1.cs | 2 +- PKHeX.WinForms/Controls/PKM Editor/EditPK2.cs | 2 +- .../PKM Editor/ExperienceBar.Designer.cs | 62 ++++ .../Controls/PKM Editor/ExperienceBar.cs | 193 ++++++++++ .../Controls/PKM Editor/LoadSave.cs | 12 +- .../Controls/PKM Editor/PKMEditor.Designer.cs | 153 ++++---- .../Controls/PKM Editor/PKMEditor.cs | 23 +- .../Controls/PKM Editor/TrainerID.Designer.cs | 87 ++--- .../Controls/PKM Editor/TrainerID.cs | 167 +-------- .../PKM Editor/TrainerSID.Designer.cs | 78 ++++ .../Controls/PKM Editor/TrainerSID.cs | 123 +++++++ .../PKM Editor/TrainerTID.Designer.cs | 78 ++++ .../Controls/PKM Editor/TrainerTID.cs | 114 ++++++ .../Controls/SAV Editor/SAVEditor.Designer.cs | 213 ++++++----- .../Save Editors/Gen7/SAV_Trainer7.cs | 2 +- .../Save Editors/Gen7/SAV_Trainer7GG.cs | 2 +- .../Save Editors/Gen8/SAV_Trainer8.cs | 2 +- .../Save Editors/Gen8/SAV_Trainer8a.cs | 2 +- .../Save Editors/Gen8/SAV_Trainer8b.cs | 2 +- .../Save Editors/Gen9/SAV_Trainer9.cs | 2 +- .../Gen9/SAV_Trainer9a.Designer.cs | 336 +++++++++++------- .../Save Editors/Gen9/SAV_Trainer9a.cs | 11 +- .../Save Editors/SAV_Chatter.Designer.cs | 116 +++--- .../Subforms/Save Editors/SAV_Inventory.cs | 2 - 30 files changed, 1346 insertions(+), 601 deletions(-) create mode 100644 PKHeX.Core/Editing/Saves/Editors/Controls/TrainerIDManager.cs create mode 100644 PKHeX.WinForms/Controls/PKM Editor/ExperienceBar.Designer.cs create mode 100644 PKHeX.WinForms/Controls/PKM Editor/ExperienceBar.cs create mode 100644 PKHeX.WinForms/Controls/PKM Editor/TrainerSID.Designer.cs create mode 100644 PKHeX.WinForms/Controls/PKM Editor/TrainerSID.cs create mode 100644 PKHeX.WinForms/Controls/PKM Editor/TrainerTID.Designer.cs create mode 100644 PKHeX.WinForms/Controls/PKM Editor/TrainerTID.cs diff --git a/PKHeX.Core/Editing/Program/Settings/EntityEditorSettings.cs b/PKHeX.Core/Editing/Program/Settings/EntityEditorSettings.cs index b202551cc..c8119991b 100644 --- a/PKHeX.Core/Editing/Program/Settings/EntityEditorSettings.cs +++ b/PKHeX.Core/Editing/Program/Settings/EntityEditorSettings.cs @@ -13,4 +13,7 @@ public sealed class EntityEditorSettings [LocalizedDescription("When showing an entity, show any stored Status Condition (Sleep/Burn/etc) it may have.")] public bool ShowStatusCondition { get; set; } = true; + + [LocalizedDescription("When showing an entity, show the Experience Bar to allow editing of EXP and Level.")] + public bool ShowExperienceBar { get; set; } = true; } diff --git a/PKHeX.Core/Editing/Saves/Editors/Controls/TrainerIDManager.cs b/PKHeX.Core/Editing/Saves/Editors/Controls/TrainerIDManager.cs new file mode 100644 index 000000000..899c75f1b --- /dev/null +++ b/PKHeX.Core/Editing/Saves/Editors/Controls/TrainerIDManager.cs @@ -0,0 +1,111 @@ +using System; + +namespace PKHeX.Core; + +public sealed class TrainerIDManager : ITrainerIDControl +{ + private bool _loading; + private readonly ITrainerIDControl _tid; + private readonly ITrainerIDControl _sid; + public byte Generation { private get; set; } + + public event EventHandler? ValueChanged; + + public ITrainerID32 Trainer + { + get => field ?? throw new InvalidOperationException("Trainer is not initialized."); + set; + } + + + public TrainerIDManager(ITrainerIDControl tid, ITrainerIDControl sid) + { + _tid = tid; + _sid = sid; + + tid.ValueChanged += RaiseValueChanged; + sid.ValueChanged += RaiseValueChanged; + } + + private void RaiseValueChanged(object? sender, EventArgs e) + { + if (_loading) + return; + _loading = true; + SaveTrainer(Trainer); + if (!_sid.IsValueSame(Trainer)) + _sid.LoadTrainer(Trainer, Trainer.TrainerIDDisplayFormat); + SetToolTip(); + ValueChanged?.Invoke(this, EventArgs.Empty); + _loading = false; + } + + public void LoadTrainer(T trainer) where T : ITrainerID32, IGeneration + { + Generation = trainer.Generation; + LoadTrainer(trainer, trainer.GetTrainerIDFormat()); + } + + public void LoadTrainer(ITrainerID32 trainer, byte generation) + { + Generation = generation; + LoadTrainer(trainer, trainer.GetTrainerIDFormat()); + } + + public void LoadTrainer(ITrainerID32 trainer, TrainerIDFormat displayType) + { + Trainer = trainer; + LoadTrainer(); + } + + public void LoadTrainer() + { + _loading = true; + try + { + var trainer = Trainer; + var format = Trainer.TrainerIDDisplayFormat; + _tid.LoadTrainer(trainer, format); + _sid.LoadTrainer(trainer, format); + SetToolTip(); + } + finally + { + _loading = false; + } + } + + public void SaveTrainer(ITrainerID32 trainer) + { + _sid.SaveTrainer(trainer); + _tid.SaveTrainer(trainer); + } + + public bool IsValueSame(ITrainerID32 trainer) => _tid.IsValueSame(trainer) && _sid.IsValueSame(trainer); + + public void SetToolTip() + { + var tsv = Trainer.GetTSV(Generation); + var text = tsv > ushort.MaxValue + ? string.Empty + : $"TSV: {tsv:D4}{Environment.NewLine}{Trainer.GetTextRepresentation()}"; + + SetToolTip(text); + } + + public void SetToolTip(string text) + { + _tid.SetToolTip(text); + _sid.SetToolTip(text); + } +} + +public interface ITrainerIDControl +{ + event EventHandler? ValueChanged; + + void LoadTrainer(ITrainerID32 trainer, TrainerIDFormat displayType); + void SaveTrainer(ITrainerID32 trainer); + bool IsValueSame(ITrainerID32 trainer); + void SetToolTip(string text); +} diff --git a/PKHeX.Core/Items/HeldItemLumpImage.cs b/PKHeX.Core/Items/HeldItemLumpImage.cs index e975cfac8..069f3b188 100644 --- a/PKHeX.Core/Items/HeldItemLumpImage.cs +++ b/PKHeX.Core/Items/HeldItemLumpImage.cs @@ -39,15 +39,15 @@ public static class HeldItemLumpUtil /// Held Item index /// Generation context /// Evaluation result. - public static HeldItemLumpImage GetIsLump(int item, EntityContext context) => context.Generation switch + public static HeldItemLumpImage GetIsLump(int item, EntityContext context) => item switch { - <= 4 when item is (>= 0328 and <= 0419) => HeldItemLumpImage.TechnicalMachine, // Gen2/3/4 TM - 8 when item is (>= 0328 and <= 0427) => HeldItemLumpImage.TechnicalMachine, // BD/SP TMs - 8 when item is (>= 1130 and <= 1229) => HeldItemLumpImage.TechnicalRecord, // Gen8 TR - 9 when item is (>= 0328 and <= 0419) // TM01-TM92 - or (>= 0618 and <= 0620) // TM093-TM095 - or (>= 0690 and <= 0693) // TM096-TM099 - or (>= 2160 and <= 2289) /* TM100-TM229 */ => HeldItemLumpImage.TechnicalMachine, + (>= 0328 and <= 0425) // TM001-TM092, HM01-06 (Gen2/3/4 TMs) + or (>= 0618 and <= 0620) // TM093-TM095 + or (>= 0690 and <= 0694) or 737 // TM096-TM099, HM07, TM100(pre-Gen9) + or (>= 2160 and <= 2289) // TM100-TM229 + => HeldItemLumpImage.TechnicalMachine, + + (>= 1130 and <= 1229) => HeldItemLumpImage.TechnicalRecord, // Gen8 TR _ => HeldItemLumpImage.NotLump, }; } diff --git a/PKHeX.Core/Items/ItemStorage4.cs b/PKHeX.Core/Items/ItemStorage4.cs index 42b7f9042..c7e01ff07 100644 --- a/PKHeX.Core/Items/ItemStorage4.cs +++ b/PKHeX.Core/Items/ItemStorage4.cs @@ -109,6 +109,7 @@ public abstract class ItemStorage4 public static ReadOnlySpan BallsDPPt => [ + // Safari Ball is only available in Great Marsh - cannot save, cannot give, does not show in pouch. 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ]; diff --git a/PKHeX.Core/Legality/RNG/CXD/MethodPokeSpot.cs b/PKHeX.Core/Legality/RNG/CXD/MethodPokeSpot.cs index d9b7e8f95..ce5bd7e16 100644 --- a/PKHeX.Core/Legality/RNG/CXD/MethodPokeSpot.cs +++ b/PKHeX.Core/Legality/RNG/CXD/MethodPokeSpot.cs @@ -59,7 +59,6 @@ public static PokeSpotSetup IsValidActivation(byte slot, uint seed, out uint ori /// if both the PID and IV origin seeds are successfully retrieved; otherwise, . public static bool TryGetOriginSeeds(PKM pk, EncounterSlot3XD slot, out uint pid, out uint ivs) { - pid = 0; ivs = 0; if (!TryGetOriginSeedPID(pk.PID, slot.SlotNumber, out pid)) return false; diff --git a/PKHeX.Core/PKM/Interfaces/ITrainerID32.cs b/PKHeX.Core/PKM/Interfaces/ITrainerID32.cs index 1cdf27c2e..96225063b 100644 --- a/PKHeX.Core/PKM/Interfaces/ITrainerID32.cs +++ b/PKHeX.Core/PKM/Interfaces/ITrainerID32.cs @@ -1,3 +1,4 @@ +using System.Security.Cryptography; using static PKHeX.Core.TrainerIDFormat; namespace PKHeX.Core; @@ -77,7 +78,8 @@ public bool IsShiny(uint pid, byte generation = 7) public uint SetTrainerTID7(uint value) => tr.ID32 = ((tr.ID32 / 1000000) * 1000000) + value; public uint SetTrainerSID7(uint value) => tr.ID32 = (value * 1000000) + (tr.ID32 % 1000000); public uint SetTrainerID16(ushort tid16, ushort sid16) => tr.ID32 = ((uint)sid16 << 16) | tid16; - public uint SetTrainerID7(uint sid7, uint tid7) => tr.ID32 = (sid7 * 1000000) + tid7; + public uint SetTrainerID7(uint sid7, uint tid7) => tr.ID32 = (sid7 * 1000000) + tid7; // overflow back to sid:0 on bad combination + public bool IsValidTrainerID7(uint sid7, uint tid7) => ((ulong)sid7 * 1_000_000) + tid7 <= uint.MaxValue; public uint GetDisplayTID() => tr.TrainerIDDisplayFormat switch { @@ -117,5 +119,32 @@ public void SetDisplayID(uint tid, uint sid) default: tr.SetTrainerID16((ushort)tid, (ushort)sid); break; } } + + public string GetTextRepresentation() + { + var format = tr.TrainerIDDisplayFormat; + if (format is not SixteenBit) + { + var tid = tr.TID16.ToString(TrainerIDExtensions.TID16); + var sid = tr.SID16.ToString(TrainerIDExtensions.SID16); + return $"ID: {tid}/{sid}"; + } + + var id = tr.ID32; + var sid7 = (id / 1_000_000).ToString(TrainerIDExtensions.SID7); + var tid7 = (id % 1_000_000).ToString(TrainerIDExtensions.TID7); + return $"G7ID: ({sid7}){tid7}"; + } + + public uint GetTSV(byte generation) + { + if (tr.TrainerIDDisplayFormat is None) + return uint.MaxValue; + + var xor = (uint)(tr.SID16 ^ tr.TID16); + if (generation <= 5) + return xor >> 3; + return xor >> 4; + } } } diff --git a/PKHeX.WinForms/Controls/PKM Editor/EditPK1.cs b/PKHeX.WinForms/Controls/PKM Editor/EditPK1.cs index e6cf97fc4..4d54e155a 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/EditPK1.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/EditPK1.cs @@ -11,7 +11,7 @@ private void PopulateFieldsPK1() throw new FormatException(nameof(Entity)); LoadMisc1(pk1); - TID_Trainer.LoadIDValues(pk1, pk1.Format); + TID_Trainer.LoadTrainer(pk1, pk1.Format); CR_PK1.LoadPK1(pk1); // Attempt to detect language diff --git a/PKHeX.WinForms/Controls/PKM Editor/EditPK2.cs b/PKHeX.WinForms/Controls/PKM Editor/EditPK2.cs index 918ae6af6..bcad40274 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/EditPK2.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/EditPK2.cs @@ -18,7 +18,7 @@ private void PopulateFieldsPK2() LoadMisc1(pk2); LoadMisc2(pk2); - TID_Trainer.LoadIDValues(pk2, pk2.Format); + TID_Trainer.LoadTrainer(pk2, pk2.Format); TB_MetLevel.Text = c2.MetLevel.ToString(); CB_MetLocation.SelectedValue = (int)c2.MetLocation; CB_MetTimeOfDay.SelectedIndex = c2.MetTimeOfDay; diff --git a/PKHeX.WinForms/Controls/PKM Editor/ExperienceBar.Designer.cs b/PKHeX.WinForms/Controls/PKM Editor/ExperienceBar.Designer.cs new file mode 100644 index 000000000..0e17a61cc --- /dev/null +++ b/PKHeX.WinForms/Controls/PKM Editor/ExperienceBar.Designer.cs @@ -0,0 +1,62 @@ +namespace PKHeX.WinForms.Controls +{ + partial class ExperienceBar + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + PAN_ExpPercent = new System.Windows.Forms.Panel(); + SuspendLayout(); + // + // PAN_ExpPercent + // + PAN_ExpPercent.BackColor = System.Drawing.Color.DeepSkyBlue; + PAN_ExpPercent.Dock = System.Windows.Forms.DockStyle.Left; + PAN_ExpPercent.Location = new System.Drawing.Point(0, 0); + PAN_ExpPercent.Margin = new System.Windows.Forms.Padding(0); + PAN_ExpPercent.Name = "PAN_ExpPercent"; + PAN_ExpPercent.Size = new System.Drawing.Size(40, 12); + PAN_ExpPercent.TabIndex = 0; + PAN_ExpPercent.MouseClick += HandleClick; + // + // ExperienceBar + // + AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + Controls.Add(PAN_ExpPercent); + Margin = new System.Windows.Forms.Padding(0); + Name = "ExperienceBar"; + Size = new System.Drawing.Size(100, 12); + MouseClick += HandleClick; + MouseWheel += OnScroll; + ResumeLayout(false); + } + + #endregion + + private System.Windows.Forms.Panel PAN_ExpPercent; + } +} diff --git a/PKHeX.WinForms/Controls/PKM Editor/ExperienceBar.cs b/PKHeX.WinForms/Controls/PKM Editor/ExperienceBar.cs new file mode 100644 index 000000000..884f0b601 --- /dev/null +++ b/PKHeX.WinForms/Controls/PKM Editor/ExperienceBar.cs @@ -0,0 +1,193 @@ +using System; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms.Controls; + +public partial class ExperienceBar : UserControl +{ + public EventHandler? ValueChanged; + private byte Growth { get; set; } + private byte Level { get; set; } + public uint EXP { get; private set; } + + public ExperienceBar() => InitializeComponent(); + + private double CurrentPercent => Experience.GetEXPToLevelUpPercentage(Level, EXP, Growth); + private void NotifyUpdate() => ValueChanged?.Invoke(this, EventArgs.Empty); + private int RealWidth => BorderStyle == BorderStyle.None ? Width : Width - SystemInformation.BorderSize.Width * 2; + private int Border => BorderStyle == BorderStyle.None ? 0 : SystemInformation.BorderSize.Width; + + private uint GetEXPEdgeHigh() + { + var next = Experience.GetEXPToLevelUp(Level, Growth); + if (next == 0) + return EXP; + return Experience.GetEXP(Level, Growth) + next - 1; + } + + private void HandleClick(object? sender, MouseEventArgs e) + { + if (e.Button != MouseButtons.Left) + return; // ignore lol + + if (TryAction()) + return; + + var x = e.X; + var border = Border; + if (border != 0) + x = Math.Max(0, x - border); + SetNewPixelPercent(x, false); + } + + /// + /// Returns true if an action was taken, false if the caller should handle it otherwise. + /// + public bool TryAction() + { + if (ModifierKeys.HasFlag(Keys.Alt)) + { + if (ModifierKeys.HasFlag(Keys.Control)) + DownlevelNoEXP(); + else if (EXP != Experience.GetEXP(Level, Growth)) + EdgeLow(); + else + Underflow(); + NotifyUpdate(); + return true; + } + + if (Level >= Experience.MaxLevel) + return true; + + if (ModifierKeys.HasFlag(Keys.Shift)) + { + if (!ModifierKeys.HasFlag(Keys.Control) && EXP != GetEXPEdgeHigh()) + EdgeHigh(); + else + Overflow(); + NotifyUpdate(); + return true; + } + + return false; + } + + private void OnScroll(object? sender, MouseEventArgs e) + { + if ((Level >= Experience.MaxLevel && e.Delta > 0) || (Level <= Experience.MinLevel && e.Delta < 0 && PAN_ExpPercent.Width == 0)) + return; + + int value = 0; + const int increment = 1; + if (e.Delta > 0) + value += increment; + else if (e.Delta < 0) + value -= increment; + else + return; + + SetNewPixelPercent(PAN_ExpPercent.Width + value, true); + } + + private void SetNewPixelPercent(int newWidth, bool scroll) + { + var currentWidth = PAN_ExpPercent.Width; + if (newWidth == currentWidth) + return; // unchanged, so do nothing + + var maxWidth = RealWidth; + // Recalculate EXP, trigger the event, which will trigger another Update. + if (newWidth < 0) + Underflow(); + else if (newWidth >= maxWidth) + Overflow(); + else if (newWidth >= maxWidth + 1) + EdgeHigh(); + else if (newWidth == 0) + EdgeLow(); + else // somewhere in between + { + var range = Experience.GetEXPToLevelUp(Level, Growth); + var pixelsPerEXP = (double)maxWidth / range; + + double delta = newWidth - currentWidth; + // If there aren't enough pixels to represent 1 EXP, round up to ensure at least 1 EXP is gained/lost per scroll increment. + if (pixelsPerEXP > 1 && Math.Abs(delta) < pixelsPerEXP) + delta = Math.Sign(delta) * pixelsPerEXP; + + var adjust = (uint)(int)(delta / pixelsPerEXP); + var newEXP = unchecked(EXP + adjust); + + // don't allow clicking to change levels, in the event the user is trying to manually edge via clicking. + // allow scrolling to change levels over/underflow. + if (!scroll && Experience.GetLevel(newEXP, Growth) != Level) + return; + EXP = newEXP; + } + + NotifyUpdate(); + } + + public void DownlevelNoEXP() + { + if (Level <= Experience.MinLevel) + return; + EXP = Experience.GetEXP((byte)(Level - 1), Growth); + } + + public void Overflow() + { + if (Level >= Experience.MaxLevel) + return; + EXP = Experience.GetEXP((byte)(Level + 1), Growth); + } + + public void Underflow() + { + if (Level <= Experience.MinLevel) + return; + EXP = Experience.GetEXP(Level, Growth) - 1; + } + + public void EdgeLow() + { + EXP = Experience.GetEXP(Level, Growth); + } + + public void EdgeHigh() + { + if (Level >= Experience.MaxLevel) + return; + EXP = GetEXPEdgeHigh(); + } + + public void Update(uint exp, byte growth) => Update(exp, growth, Experience.GetLevel(exp, growth)); + + public void Update(uint exp, byte growth, byte level) + { + EXP = exp; + Growth = growth; + Level = level; + + if (level >= Experience.MaxLevel) + { + PAN_ExpPercent.Width = 0; + return; + } + + SetSizePercentFull(); + } + + private void SetSizePercentFull() + { + // If progress to next level is not entirely empty, round up to at least 1 pixel to show progress. + // If we're off-by-one from the next level, the conversion from percent to int will auto round down to hide 1 pixel. + var gainedPercent = CurrentPercent; + var newWidth = (int)(gainedPercent * RealWidth); + if (newWidth == 0 && gainedPercent != 0) + newWidth = 1; + PAN_ExpPercent.Width = newWidth; + } +} diff --git a/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs b/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs index 183dfb02d..c799dbc90 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs @@ -29,8 +29,14 @@ private void LoadSpeciesLevelEXP(PKM pk) } CB_Species.SelectedValue = (int)pk.Species; - TB_Level.Text = pk.Stat_Level.ToString(); - TB_EXP.Text = pk.EXP.ToString(); + var level = pk.Stat_Level; + var exp = pk.EXP; + TB_Level.Text = level.ToString(); + TB_EXP.Text = exp.ToString(); + + var pi = pk.PersonalInfo; + var growth = pi.EXPGrowth; + ExperienceBar.Update(exp, growth); // don't trust level } private void SaveSpeciesLevelEXP(PKM pk) @@ -236,7 +242,7 @@ private void LoadMisc3(PKM pk) if (pk is IContestStatsReadOnly s) s.CopyContestStatsTo(Contest); - TID_Trainer.LoadIDValues(pk, pk.Format); + TID_Trainer.LoadTrainer(pk, pk.Format); // Load Extrabyte Value var offset = Convert.ToInt32(CB_ExtraBytes.Text, 16); diff --git a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.Designer.cs b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.Designer.cs index 57377819c..845dc168d 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.Designer.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.Designer.cs @@ -155,7 +155,7 @@ private void InitializeComponent() FLP_Relearn4 = new System.Windows.Forms.FlowLayoutPanel(); PB_WarnRelearn4 = new System.Windows.Forms.PictureBox(); CB_RelearnMove4 = new System.Windows.Forms.ComboBox(); - panel1 = new System.Windows.Forms.Panel(); + PAN_MoveFlags = new System.Windows.Forms.Panel(); FLP_MoveFlags = new System.Windows.Forms.FlowLayoutPanel(); B_RelearnFlags = new System.Windows.Forms.Button(); B_MoveShop = new System.Windows.Forms.Button(); @@ -250,6 +250,7 @@ private void InitializeComponent() Tab_Moves = new System.Windows.Forms.TabPage(); Tab_Cosmetic = new System.Windows.Forms.TabPage(); Tab_OTMisc = new System.Windows.Forms.TabPage(); + ExperienceBar = new ExperienceBar(); Hidden_TC.SuspendLayout(); Hidden_Main.SuspendLayout(); TLP_Main.SuspendLayout(); @@ -292,7 +293,7 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)PB_WarnRelearn3).BeginInit(); FLP_Relearn4.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)PB_WarnRelearn4).BeginInit(); - panel1.SuspendLayout(); + PAN_MoveFlags.SuspendLayout(); FLP_MoveFlags.SuspendLayout(); FLP_AlphaMove.SuspendLayout(); Hidden_Cosmetic.SuspendLayout(); @@ -369,31 +370,31 @@ private void InitializeComponent() TLP_Main.ColumnCount = 2; TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 120F)); TLP_Main.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); - TLP_Main.Controls.Add(CR_PK1, 1, 16); - TLP_Main.Controls.Add(L_CatchRate, 0, 16); - TLP_Main.Controls.Add(L_HeartGauge, 0, 15); - TLP_Main.Controls.Add(L_ShadowID, 0, 14); - TLP_Main.Controls.Add(CHK_NSparkle, 1, 13); - TLP_Main.Controls.Add(L_NSparkle, 0, 13); - TLP_Main.Controls.Add(FLP_PKRSRight, 1, 12); - TLP_Main.Controls.Add(Label_PKRS, 0, 12); - TLP_Main.Controls.Add(CHK_IsEgg, 0, 11); - TLP_Main.Controls.Add(FLP_EggPKRSRight, 1, 11); - TLP_Main.Controls.Add(CB_Language, 1, 10); - TLP_Main.Controls.Add(Label_Language, 0, 10); - TLP_Main.Controls.Add(FLP_AbilityRight, 1, 9); - TLP_Main.Controls.Add(FLP_Purification, 1, 15); - TLP_Main.Controls.Add(Label_Ability, 0, 9); - TLP_Main.Controls.Add(CB_HeldItem, 1, 8); - TLP_Main.Controls.Add(Label_HeldItem, 0, 8); - TLP_Main.Controls.Add(FA_Form, 1, 7); - TLP_Main.Controls.Add(L_FormArgument, 0, 7); - TLP_Main.Controls.Add(CB_Form, 1, 6); - TLP_Main.Controls.Add(Label_Form, 0, 6); - TLP_Main.Controls.Add(CB_StatNature, 1, 5); - TLP_Main.Controls.Add(L_StatNature, 0, 5); - TLP_Main.Controls.Add(CB_Nature, 1, 4); - TLP_Main.Controls.Add(Label_Nature, 0, 4); + TLP_Main.Controls.Add(CR_PK1, 1, 17); + TLP_Main.Controls.Add(L_CatchRate, 0, 17); + TLP_Main.Controls.Add(L_HeartGauge, 0, 16); + TLP_Main.Controls.Add(L_ShadowID, 0, 15); + TLP_Main.Controls.Add(CHK_NSparkle, 1, 14); + TLP_Main.Controls.Add(L_NSparkle, 0, 14); + TLP_Main.Controls.Add(FLP_PKRSRight, 1, 13); + TLP_Main.Controls.Add(Label_PKRS, 0, 13); + TLP_Main.Controls.Add(CHK_IsEgg, 0, 12); + TLP_Main.Controls.Add(FLP_EggPKRSRight, 1, 12); + TLP_Main.Controls.Add(CB_Language, 1, 11); + TLP_Main.Controls.Add(Label_Language, 0, 11); + TLP_Main.Controls.Add(FLP_AbilityRight, 1, 10); + TLP_Main.Controls.Add(FLP_Purification, 1, 16); + TLP_Main.Controls.Add(Label_Ability, 0, 10); + TLP_Main.Controls.Add(CB_HeldItem, 1, 9); + TLP_Main.Controls.Add(Label_HeldItem, 0, 9); + TLP_Main.Controls.Add(FA_Form, 1, 8); + TLP_Main.Controls.Add(L_FormArgument, 0, 8); + TLP_Main.Controls.Add(CB_Form, 1, 7); + TLP_Main.Controls.Add(Label_Form, 0, 7); + TLP_Main.Controls.Add(CB_StatNature, 1, 6); + TLP_Main.Controls.Add(L_StatNature, 0, 6); + TLP_Main.Controls.Add(CB_Nature, 1, 5); + TLP_Main.Controls.Add(Label_Nature, 0, 5); TLP_Main.Controls.Add(FLP_EXPLevelRight, 1, 3); TLP_Main.Controls.Add(Label_EXP, 0, 3); TLP_Main.Controls.Add(FLP_NicknameLeft, 0, 2); @@ -402,13 +403,15 @@ private void InitializeComponent() TLP_Main.Controls.Add(Label_Species, 0, 1); TLP_Main.Controls.Add(FLP_PIDRight, 1, 0); TLP_Main.Controls.Add(FLP_PIDLeft, 0, 0); - TLP_Main.Controls.Add(NUD_ShadowID, 1, 14); + TLP_Main.Controls.Add(NUD_ShadowID, 1, 15); + TLP_Main.Controls.Add(ExperienceBar, 1, 4); TLP_Main.Dock = System.Windows.Forms.DockStyle.Fill; TLP_Main.Location = new System.Drawing.Point(0, 0); TLP_Main.Margin = new System.Windows.Forms.Padding(0); TLP_Main.Name = "TLP_Main"; TLP_Main.Padding = new System.Windows.Forms.Padding(0, 16, 0, 0); - TLP_Main.RowCount = 19; + TLP_Main.RowCount = 20; + TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); TLP_Main.RowStyles.Add(new System.Windows.Forms.RowStyle()); @@ -436,7 +439,7 @@ private void InitializeComponent() CR_PK1.AutoSize = true; CR_PK1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; CR_PK1.Dock = System.Windows.Forms.DockStyle.Fill; - CR_PK1.Location = new System.Drawing.Point(120, 451); + CR_PK1.Location = new System.Drawing.Point(120, 465); CR_PK1.Margin = new System.Windows.Forms.Padding(0, 1, 0, 1); CR_PK1.Name = "CR_PK1"; CR_PK1.Size = new System.Drawing.Size(211, 25); @@ -446,7 +449,7 @@ private void InitializeComponent() // L_CatchRate.Anchor = System.Windows.Forms.AnchorStyles.Right; L_CatchRate.AutoSize = true; - L_CatchRate.Location = new System.Drawing.Point(47, 454); + L_CatchRate.Location = new System.Drawing.Point(47, 468); L_CatchRate.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); L_CatchRate.Name = "L_CatchRate"; L_CatchRate.Size = new System.Drawing.Size(73, 17); @@ -458,7 +461,7 @@ private void InitializeComponent() // L_HeartGauge.Anchor = System.Windows.Forms.AnchorStyles.Right; L_HeartGauge.AutoSize = true; - L_HeartGauge.Location = new System.Drawing.Point(35, 426); + L_HeartGauge.Location = new System.Drawing.Point(35, 440); L_HeartGauge.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); L_HeartGauge.Name = "L_HeartGauge"; L_HeartGauge.Size = new System.Drawing.Size(85, 17); @@ -470,7 +473,7 @@ private void InitializeComponent() // L_ShadowID.Anchor = System.Windows.Forms.AnchorStyles.Right; L_ShadowID.AutoSize = true; - L_ShadowID.Location = new System.Drawing.Point(47, 399); + L_ShadowID.Location = new System.Drawing.Point(47, 413); L_ShadowID.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); L_ShadowID.Name = "L_ShadowID"; L_ShadowID.Size = new System.Drawing.Size(73, 17); @@ -481,7 +484,7 @@ private void InitializeComponent() // CHK_NSparkle // CHK_NSparkle.AutoSize = true; - CHK_NSparkle.Location = new System.Drawing.Point(120, 371); + CHK_NSparkle.Location = new System.Drawing.Point(120, 385); CHK_NSparkle.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3); CHK_NSparkle.Name = "CHK_NSparkle"; CHK_NSparkle.Size = new System.Drawing.Size(61, 21); @@ -494,7 +497,7 @@ private void InitializeComponent() // L_NSparkle.Anchor = System.Windows.Forms.AnchorStyles.Right; L_NSparkle.AutoSize = true; - L_NSparkle.Location = new System.Drawing.Point(43, 372); + L_NSparkle.Location = new System.Drawing.Point(43, 386); L_NSparkle.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); L_NSparkle.Name = "L_NSparkle"; L_NSparkle.Size = new System.Drawing.Size(77, 17); @@ -510,7 +513,7 @@ private void InitializeComponent() FLP_PKRSRight.Controls.Add(Label_PKRSdays); FLP_PKRSRight.Controls.Add(CB_PKRSDays); FLP_PKRSRight.Dock = System.Windows.Forms.DockStyle.Fill; - FLP_PKRSRight.Location = new System.Drawing.Point(120, 342); + FLP_PKRSRight.Location = new System.Drawing.Point(120, 356); FLP_PKRSRight.Margin = new System.Windows.Forms.Padding(0); FLP_PKRSRight.Name = "FLP_PKRSRight"; FLP_PKRSRight.Size = new System.Drawing.Size(211, 26); @@ -556,7 +559,7 @@ private void InitializeComponent() // Label_PKRS.Anchor = System.Windows.Forms.AnchorStyles.Right; Label_PKRS.AutoSize = true; - Label_PKRS.Location = new System.Drawing.Point(82, 345); + Label_PKRS.Location = new System.Drawing.Point(82, 359); Label_PKRS.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); Label_PKRS.Name = "Label_PKRS"; Label_PKRS.Size = new System.Drawing.Size(38, 17); @@ -569,7 +572,7 @@ private void InitializeComponent() // CHK_IsEgg.Anchor = System.Windows.Forms.AnchorStyles.Right; CHK_IsEgg.AutoSize = true; - CHK_IsEgg.Location = new System.Drawing.Point(57, 321); + CHK_IsEgg.Location = new System.Drawing.Point(57, 335); CHK_IsEgg.Margin = new System.Windows.Forms.Padding(0, 2, 0, 0); CHK_IsEgg.Name = "CHK_IsEgg"; CHK_IsEgg.Size = new System.Drawing.Size(63, 21); @@ -584,7 +587,7 @@ private void InitializeComponent() FLP_EggPKRSRight.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; FLP_EggPKRSRight.Controls.Add(CHK_Infected); FLP_EggPKRSRight.Controls.Add(CHK_Cured); - FLP_EggPKRSRight.Location = new System.Drawing.Point(120, 319); + FLP_EggPKRSRight.Location = new System.Drawing.Point(120, 333); FLP_EggPKRSRight.Margin = new System.Windows.Forms.Padding(0); FLP_EggPKRSRight.Name = "FLP_EggPKRSRight"; FLP_EggPKRSRight.Size = new System.Drawing.Size(211, 23); @@ -621,7 +624,7 @@ private void InitializeComponent() CB_Language.Anchor = System.Windows.Forms.AnchorStyles.Left; CB_Language.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; CB_Language.FormattingEnabled = true; - CB_Language.Location = new System.Drawing.Point(120, 293); + CB_Language.Location = new System.Drawing.Point(120, 307); CB_Language.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); CB_Language.Name = "CB_Language"; CB_Language.Size = new System.Drawing.Size(144, 25); @@ -632,7 +635,7 @@ private void InitializeComponent() // Label_Language.Anchor = System.Windows.Forms.AnchorStyles.Right; Label_Language.AutoSize = true; - Label_Language.Location = new System.Drawing.Point(52, 296); + Label_Language.Location = new System.Drawing.Point(52, 310); Label_Language.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); Label_Language.Name = "Label_Language"; Label_Language.Size = new System.Drawing.Size(68, 17); @@ -648,7 +651,7 @@ private void InitializeComponent() FLP_AbilityRight.Controls.Add(DEV_Ability); FLP_AbilityRight.Controls.Add(TB_AbilityNumber); FLP_AbilityRight.Dock = System.Windows.Forms.DockStyle.Fill; - FLP_AbilityRight.Location = new System.Drawing.Point(120, 241); + FLP_AbilityRight.Location = new System.Drawing.Point(120, 255); FLP_AbilityRight.Margin = new System.Windows.Forms.Padding(0); FLP_AbilityRight.Name = "FLP_AbilityRight"; FLP_AbilityRight.Size = new System.Drawing.Size(211, 52); @@ -702,7 +705,7 @@ private void InitializeComponent() FLP_Purification.Controls.Add(NUD_Purification); FLP_Purification.Controls.Add(CHK_Shadow); FLP_Purification.Dock = System.Windows.Forms.DockStyle.Fill; - FLP_Purification.Location = new System.Drawing.Point(120, 423); + FLP_Purification.Location = new System.Drawing.Point(120, 437); FLP_Purification.Margin = new System.Windows.Forms.Padding(0, 1, 0, 0); FLP_Purification.Name = "FLP_Purification"; FLP_Purification.Size = new System.Drawing.Size(211, 27); @@ -736,7 +739,7 @@ private void InitializeComponent() // Label_Ability.Anchor = System.Windows.Forms.AnchorStyles.Right; Label_Ability.AutoSize = true; - Label_Ability.Location = new System.Drawing.Point(74, 257); + Label_Ability.Location = new System.Drawing.Point(74, 271); Label_Ability.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); Label_Ability.Name = "Label_Ability"; Label_Ability.Size = new System.Drawing.Size(46, 17); @@ -749,7 +752,7 @@ private void InitializeComponent() CB_HeldItem.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; CB_HeldItem.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; CB_HeldItem.FormattingEnabled = true; - CB_HeldItem.Location = new System.Drawing.Point(120, 215); + CB_HeldItem.Location = new System.Drawing.Point(120, 229); CB_HeldItem.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); CB_HeldItem.Name = "CB_HeldItem"; CB_HeldItem.Size = new System.Drawing.Size(144, 25); @@ -761,7 +764,7 @@ private void InitializeComponent() // Label_HeldItem.Anchor = System.Windows.Forms.AnchorStyles.Right; Label_HeldItem.AutoSize = true; - Label_HeldItem.Location = new System.Drawing.Point(53, 218); + Label_HeldItem.Location = new System.Drawing.Point(53, 232); Label_HeldItem.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); Label_HeldItem.Name = "Label_HeldItem"; Label_HeldItem.Size = new System.Drawing.Size(67, 17); @@ -775,7 +778,7 @@ private void InitializeComponent() FA_Form.AccessibleName = "Form Argument Info"; FA_Form.AutoSize = true; FA_Form.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - FA_Form.Location = new System.Drawing.Point(120, 196); + FA_Form.Location = new System.Drawing.Point(120, 210); FA_Form.Margin = new System.Windows.Forms.Padding(0); FA_Form.Name = "FA_Form"; FA_Form.Size = new System.Drawing.Size(0, 0); @@ -786,7 +789,7 @@ private void InitializeComponent() // L_FormArgument.Anchor = System.Windows.Forms.AnchorStyles.Right; L_FormArgument.AutoSize = true; - L_FormArgument.Location = new System.Drawing.Point(18, 196); + L_FormArgument.Location = new System.Drawing.Point(18, 210); L_FormArgument.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); L_FormArgument.Name = "L_FormArgument"; L_FormArgument.Size = new System.Drawing.Size(102, 17); @@ -801,7 +804,7 @@ private void InitializeComponent() CB_Form.Enabled = false; CB_Form.FormattingEnabled = true; CB_Form.Items.AddRange(new object[] { "" }); - CB_Form.Location = new System.Drawing.Point(120, 170); + CB_Form.Location = new System.Drawing.Point(120, 184); CB_Form.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); CB_Form.Name = "CB_Form"; CB_Form.Size = new System.Drawing.Size(144, 25); @@ -812,7 +815,7 @@ private void InitializeComponent() // Label_Form.Anchor = System.Windows.Forms.AnchorStyles.Right; Label_Form.AutoSize = true; - Label_Form.Location = new System.Drawing.Point(79, 173); + Label_Form.Location = new System.Drawing.Point(79, 187); Label_Form.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); Label_Form.Name = "Label_Form"; Label_Form.Size = new System.Drawing.Size(41, 17); @@ -825,7 +828,7 @@ private void InitializeComponent() CB_StatNature.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; CB_StatNature.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; CB_StatNature.FormattingEnabled = true; - CB_StatNature.Location = new System.Drawing.Point(120, 144); + CB_StatNature.Location = new System.Drawing.Point(120, 158); CB_StatNature.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); CB_StatNature.Name = "CB_StatNature"; CB_StatNature.Size = new System.Drawing.Size(144, 25); @@ -837,7 +840,7 @@ private void InitializeComponent() // L_StatNature.Anchor = System.Windows.Forms.AnchorStyles.Right; L_StatNature.AutoSize = true; - L_StatNature.Location = new System.Drawing.Point(43, 147); + L_StatNature.Location = new System.Drawing.Point(43, 161); L_StatNature.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); L_StatNature.Name = "L_StatNature"; L_StatNature.Size = new System.Drawing.Size(77, 17); @@ -851,7 +854,7 @@ private void InitializeComponent() CB_Nature.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; CB_Nature.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; CB_Nature.FormattingEnabled = true; - CB_Nature.Location = new System.Drawing.Point(120, 118); + CB_Nature.Location = new System.Drawing.Point(120, 132); CB_Nature.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); CB_Nature.Name = "CB_Nature"; CB_Nature.Size = new System.Drawing.Size(144, 25); @@ -863,7 +866,7 @@ private void InitializeComponent() // Label_Nature.Anchor = System.Windows.Forms.AnchorStyles.Right; Label_Nature.AutoSize = true; - Label_Nature.Location = new System.Drawing.Point(69, 121); + Label_Nature.Location = new System.Drawing.Point(69, 135); Label_Nature.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); Label_Nature.Name = "Label_Nature"; Label_Nature.Size = new System.Drawing.Size(51, 17); @@ -1166,7 +1169,7 @@ private void InitializeComponent() // // NUD_ShadowID // - NUD_ShadowID.Location = new System.Drawing.Point(120, 396); + NUD_ShadowID.Location = new System.Drawing.Point(120, 410); NUD_ShadowID.Margin = new System.Windows.Forms.Padding(0, 1, 0, 1); NUD_ShadowID.Maximum = new decimal(new int[] { 127, 0, 0, 0 }); NUD_ShadowID.Name = "NUD_ShadowID"; @@ -1680,7 +1683,7 @@ private void InitializeComponent() FLP_Moves.Controls.Add(FLP_Relearn2); FLP_Moves.Controls.Add(FLP_Relearn3); FLP_Moves.Controls.Add(FLP_Relearn4); - FLP_Moves.Controls.Add(panel1); + FLP_Moves.Controls.Add(PAN_MoveFlags); FLP_Moves.Controls.Add(FLP_AlphaMove); FLP_Moves.Location = new System.Drawing.Point(6, 3); FLP_Moves.Name = "FLP_Moves"; @@ -1948,15 +1951,15 @@ private void InitializeComponent() CB_RelearnMove4.Leave += ValidateComboBox2; CB_RelearnMove4.Validating += ValidateComboBox; // - // panel1 + // PAN_MoveFlags // - panel1.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - panel1.Controls.Add(FLP_MoveFlags); - panel1.Location = new System.Drawing.Point(0, 284); - panel1.Margin = new System.Windows.Forms.Padding(0, 8, 0, 0); - panel1.Name = "panel1"; - panel1.Size = new System.Drawing.Size(290, 32); - panel1.TabIndex = 108; + PAN_MoveFlags.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + PAN_MoveFlags.Controls.Add(FLP_MoveFlags); + PAN_MoveFlags.Location = new System.Drawing.Point(0, 284); + PAN_MoveFlags.Margin = new System.Windows.Forms.Padding(0, 8, 0, 0); + PAN_MoveFlags.Name = "PAN_MoveFlags"; + PAN_MoveFlags.Size = new System.Drawing.Size(290, 32); + PAN_MoveFlags.TabIndex = 108; // // FLP_MoveFlags // @@ -2977,11 +2980,11 @@ private void InitializeComponent() TID_Trainer.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; TLP_OTMisc.SetColumnSpan(TID_Trainer, 2); TID_Trainer.Dock = System.Windows.Forms.DockStyle.Fill; - TID_Trainer.Location = new System.Drawing.Point(64, 33); - TID_Trainer.Margin = new System.Windows.Forms.Padding(64, 0, 0, 0); + TID_Trainer.Location = new System.Drawing.Point(96, 33); + TID_Trainer.Margin = new System.Windows.Forms.Padding(96, 0, 0, 0); TID_Trainer.MinimumSize = new System.Drawing.Size(208, 24); TID_Trainer.Name = "TID_Trainer"; - TID_Trainer.Size = new System.Drawing.Size(267, 25); + TID_Trainer.Size = new System.Drawing.Size(235, 25); TID_Trainer.TabIndex = 1; // // FLP_ExtraBytes @@ -3198,6 +3201,15 @@ private void InitializeComponent() Tab_OTMisc.Text = "OT/Misc"; Tab_OTMisc.UseVisualStyleBackColor = true; // + // ExperienceBar + // + ExperienceBar.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + ExperienceBar.Location = new System.Drawing.Point(120, 118); + ExperienceBar.Margin = new System.Windows.Forms.Padding(0, 0, 0, 4); + ExperienceBar.Name = "ExperienceBar"; + ExperienceBar.Size = new System.Drawing.Size(144, 10); + ExperienceBar.TabIndex = 34; + // // PKMEditor // AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; @@ -3262,8 +3274,8 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)PB_WarnRelearn3).EndInit(); FLP_Relearn4.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)PB_WarnRelearn4).EndInit(); - panel1.ResumeLayout(false); - panel1.PerformLayout(); + PAN_MoveFlags.ResumeLayout(false); + PAN_MoveFlags.PerformLayout(); FLP_MoveFlags.ResumeLayout(false); FLP_MoveFlags.PerformLayout(); FLP_AlphaMove.ResumeLayout(false); @@ -3514,7 +3526,7 @@ private void InitializeComponent() private System.Windows.Forms.FlowLayoutPanel FLP_Relearn2; private System.Windows.Forms.FlowLayoutPanel FLP_Relearn3; private System.Windows.Forms.FlowLayoutPanel FLP_Relearn4; - private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel PAN_MoveFlags; private System.Windows.Forms.Label L_ArrivedDateTime; private System.Windows.Forms.FlowLayoutPanel FLP_WalkingMood; private System.Windows.Forms.Label L_WalkingMood; @@ -3536,5 +3548,6 @@ private void InitializeComponent() private System.Windows.Forms.TableLayoutPanel TLP_OTMisc; private System.Windows.Forms.MaskedTextBox TB_FriendshipHT; private System.Windows.Forms.Label L_FriendshipHT; + private ExperienceBar ExperienceBar; } } diff --git a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs index a1c86a2bd..fa56b91f9 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs @@ -78,6 +78,7 @@ public PKMEditor() TB_EXP.MouseWheel += WinFormsUtil.MouseWheelIncrement1; TB_Level.MouseWheel += WinFormsUtil.MouseWheelIncrement1; TB_Friendship.MouseWheel += WinFormsUtil.MouseWheelIncrement1; + ExperienceBar.ValueChanged += (_, _) => TB_EXP.Text = ExperienceBar.EXP.ToString(); } private void ClickManualAbility(object sender, EventArgs e) @@ -419,7 +420,7 @@ internal void UpdateSprite() } // General Use Functions // - private void SetDetailsOT(T tr) where T : ITrainerInfo + private void SetDetailsOT(T tr) where T : ITrainerInfo, ITrainerID32 { if (string.IsNullOrWhiteSpace(tr.OT)) return; @@ -427,7 +428,7 @@ internal void UpdateSprite() // Get Save Information TB_OT.Text = tr.OT; UC_OTGender.Gender = (byte)(tr.Gender & 1); - TID_Trainer.LoadInfo(tr); + TID_Trainer.LoadTrainer(tr, tr.Generation); if (tr.Version.IsValidSavedVersion()) CB_GameOrigin.SelectedValue = (int)tr.Version; @@ -514,7 +515,7 @@ private void SetAbilityList() FieldsLoaded = false; var items = GameInfo.FilteredSources.GetAbilityList(Entity.PersonalInfo); if (Entity is { Context: EntityContext.Gen5, Species: (ushort)Species.Basculin, Form: 1 }) - items = [..items, FilteredGameDataSource.GetAbilityItem(GameInfo.Strings.abilitylist, (int)Ability.Reckless, '*')]; + items = [.. items, FilteredGameDataSource.GetAbilityItem(GameInfo.Strings.abilitylist, (int)Ability.Reckless, '*')]; CB_Ability.DataSource = items; CB_Ability.SelectedIndex = Math.Clamp(ability, 0, items.Count - 1); // restore original index if available FieldsLoaded = tmp; @@ -565,7 +566,7 @@ static void SetMarkingImage(PictureBox pb, Color color, bool active) if (color.ToArgb() != Color.Black.ToArgb()) bmp = ImageUtil.CopyChangeAllColorTo(bmp, color); if (!active) - bmp = ImageUtil.CopyChangeOpacity(bmp, 1/8f); + bmp = ImageUtil.CopyChangeOpacity(bmp, 1 / 8f); pb.Image = bmp; } } @@ -979,6 +980,8 @@ private void UpdateEXPLevel(object sender, EventArgs e) TB_Level.Text = lvlExp.ToString(); if (expInput != expCalc && !HaX) TB_EXP.Text = expCalc.ToString(); + + ExperienceBar.Update(expCalc, gr, lvlExp); } else { @@ -987,7 +990,10 @@ private void UpdateEXPLevel(object sender, EventArgs e) var level = (byte)Math.Clamp(input, Experience.MinLevel, Experience.MaxLevel); if (input != level && !string.IsNullOrWhiteSpace(TB_Level.Text)) TB_Level.Text = level.ToString(); - TB_EXP.Text = Experience.GetEXP(level, gr).ToString(); + + var expCalc = Experience.GetEXP(level, gr); + TB_EXP.Text = expCalc.ToString(); + ExperienceBar.Update(expCalc, gr, level); } ChangingFields = false; if (FieldsLoaded) // store values back @@ -1278,7 +1284,7 @@ private void UpdateOriginGame(object sender, EventArgs e) return; PB_Origin.Image = GetOriginSprite(Entity); - TID_Trainer.LoadIDValues(Entity, Entity.Format); + TID_Trainer.LoadTrainer(Entity, Entity.Format); UpdateLegality(); } @@ -1648,7 +1654,7 @@ private void UpdateShiny(bool changePID) else { Entity.SetShinySID(type); - TID_Trainer.UpdateSID(); + TID_Trainer.LoadTrainer(); } } else @@ -1668,7 +1674,7 @@ private void UpdateTSV(object sender, EventArgs e) if (Entity.Format <= 2) return; - TID_Trainer.UpdateTSV(); + TID_Trainer.SetToolTip(); Entity.PID = Util.GetHexValue(TB_PID.Text); var tip = $"PSV: {Entity.PSV:d4}"; @@ -2065,6 +2071,7 @@ private void ToggleInterface(PKM t) if (t is not IFormArgument) L_FormArgument.Visible = false; StatusView.Visible = Main.Settings.EntityEditor.ShowStatusCondition; + ExperienceBar.Visible = Main.Settings.EntityEditor.ShowExperienceBar; DEV_Ability.Enabled = DEV_Ability.Visible = DEV_Ability.TabStop = (format > 3 && HaX) || t is PA9; ToggleInterface(Entity.Format); diff --git a/PKHeX.WinForms/Controls/PKM Editor/TrainerID.Designer.cs b/PKHeX.WinForms/Controls/PKM Editor/TrainerID.Designer.cs index bc3c5235c..a12e91f36 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/TrainerID.Designer.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/TrainerID.Designer.cs @@ -31,11 +31,9 @@ private void InitializeComponent() components = new System.ComponentModel.Container(); FLP = new System.Windows.Forms.FlowLayoutPanel(); Label_TID = new System.Windows.Forms.Label(); - TB_TID = new System.Windows.Forms.MaskedTextBox(); - TB_TID7 = new System.Windows.Forms.MaskedTextBox(); + TIDFields = new PKHeX.WinForms.Controls.TrainerTID(); Label_SID = new System.Windows.Forms.Label(); - TB_SID = new System.Windows.Forms.MaskedTextBox(); - TB_SID7 = new System.Windows.Forms.MaskedTextBox(); + SIDFields = new PKHeX.WinForms.Controls.TrainerSID(); TSVTooltip = new System.Windows.Forms.ToolTip(components); FLP.SuspendLayout(); SuspendLayout(); @@ -45,16 +43,14 @@ private void InitializeComponent() FLP.AutoSize = true; FLP.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; FLP.Controls.Add(Label_TID); - FLP.Controls.Add(TB_TID); - FLP.Controls.Add(TB_TID7); + FLP.Controls.Add(TIDFields); FLP.Controls.Add(Label_SID); - FLP.Controls.Add(TB_SID); - FLP.Controls.Add(TB_SID7); + FLP.Controls.Add(SIDFields); FLP.Dock = System.Windows.Forms.DockStyle.Fill; FLP.Location = new System.Drawing.Point(0, 0); FLP.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); FLP.Name = "FLP"; - FLP.Size = new System.Drawing.Size(128, 48); + FLP.Size = new System.Drawing.Size(88, 50); FLP.TabIndex = 0; // // Label_TID @@ -67,33 +63,13 @@ private void InitializeComponent() Label_TID.Text = "TID:"; Label_TID.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // - // TB_TID + // TIDFields // - TB_TID.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - TB_TID.Location = new System.Drawing.Point(40, 0); - TB_TID.Margin = new System.Windows.Forms.Padding(0); - TB_TID.Mask = "00000"; - TB_TID.Name = "TB_TID"; - TB_TID.Size = new System.Drawing.Size(40, 25); - TB_TID.TabIndex = 1; - TB_TID.Text = "12345"; - TB_TID.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; - TB_TID.TextChanged += Update_ID; - TB_TID.MouseHover += UpdateTSV; - // - // TB_TID7 - // - TB_TID7.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - TB_TID7.Location = new System.Drawing.Point(80, 0); - TB_TID7.Margin = new System.Windows.Forms.Padding(0); - TB_TID7.Mask = "000000"; - TB_TID7.Name = "TB_TID7"; - TB_TID7.Size = new System.Drawing.Size(48, 25); - TB_TID7.TabIndex = 2; - TB_TID7.Text = "123456"; - TB_TID7.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; - TB_TID7.TextChanged += Update_ID; - TB_TID7.MouseHover += UpdateTSV; + TIDFields.Location = new System.Drawing.Point(40, 0); + TIDFields.Margin = new System.Windows.Forms.Padding(0); + TIDFields.Name = "TIDFields"; + TIDFields.Size = new System.Drawing.Size(48, 25); + TIDFields.TabIndex = 1; // // Label_SID // @@ -105,33 +81,13 @@ private void InitializeComponent() Label_SID.Text = "SID:"; Label_SID.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // - // TB_SID + // SIDFields // - TB_SID.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - TB_SID.Location = new System.Drawing.Point(40, 25); - TB_SID.Margin = new System.Windows.Forms.Padding(0); - TB_SID.Mask = "00000"; - TB_SID.Name = "TB_SID"; - TB_SID.Size = new System.Drawing.Size(40, 25); - TB_SID.TabIndex = 3; - TB_SID.Text = "12345"; - TB_SID.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; - TB_SID.TextChanged += Update_ID; - TB_SID.MouseHover += UpdateTSV; - // - // TB_SID7 - // - TB_SID7.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - TB_SID7.Location = new System.Drawing.Point(80, 25); - TB_SID7.Margin = new System.Windows.Forms.Padding(0); - TB_SID7.Mask = "0000"; - TB_SID7.Name = "TB_SID7"; - TB_SID7.Size = new System.Drawing.Size(32, 25); - TB_SID7.TabIndex = 4; - TB_SID7.Text = "1234"; - TB_SID7.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; - TB_SID7.TextChanged += Update_ID; - TB_SID7.MouseHover += UpdateTSV; + SIDFields.Location = new System.Drawing.Point(40, 25); + SIDFields.Margin = new System.Windows.Forms.Padding(0); + SIDFields.Name = "SIDFields"; + SIDFields.Size = new System.Drawing.Size(40, 25); + SIDFields.TabIndex = 2; // // TrainerID // @@ -139,9 +95,8 @@ private void InitializeComponent() Controls.Add(FLP); Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); Name = "TrainerID"; - Size = new System.Drawing.Size(128, 48); + Size = new System.Drawing.Size(88, 50); FLP.ResumeLayout(false); - FLP.PerformLayout(); ResumeLayout(false); PerformLayout(); } @@ -149,12 +104,10 @@ private void InitializeComponent() #endregion private System.Windows.Forms.FlowLayoutPanel FLP; - private System.Windows.Forms.MaskedTextBox TB_SID; - private System.Windows.Forms.MaskedTextBox TB_TID; private System.Windows.Forms.Label Label_SID; private System.Windows.Forms.Label Label_TID; - private System.Windows.Forms.MaskedTextBox TB_TID7; - private System.Windows.Forms.MaskedTextBox TB_SID7; + private TrainerTID TIDFields; + private TrainerSID SIDFields; private System.Windows.Forms.ToolTip TSVTooltip; } } diff --git a/PKHeX.WinForms/Controls/PKM Editor/TrainerID.cs b/PKHeX.WinForms/Controls/PKM Editor/TrainerID.cs index 17b962db0..1267bc643 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/TrainerID.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/TrainerID.cs @@ -6,166 +6,19 @@ namespace PKHeX.WinForms.Controls; public partial class TrainerID : UserControl { - public TrainerID() => InitializeComponent(); + private readonly TrainerIDManager _manager; public event EventHandler? UpdatedID; - private bool LoadingFields; - - private int XorFormat; - private TrainerIDFormat DisplayType { get; set; } - private ITrainerID32 Trainer = null!; - - public void UpdateTSV() + public TrainerID() { - var tsv = GetTSV(); - if (tsv > ushort.MaxValue) - return; - - string IDstr = $"TSV: {tsv:d4}{Environment.NewLine}{GetAlternateRepresentation(Trainer, DisplayType)}"; - TSVTooltip.SetToolTip(TB_TID, IDstr); - TSVTooltip.SetToolTip(TB_SID, IDstr); - TSVTooltip.SetToolTip(TB_TID7, IDstr); - TSVTooltip.SetToolTip(TB_SID7, IDstr); + InitializeComponent(); + TIDFields.ToolTip = SIDFields.ToolTip = TSVTooltip; + _manager = new TrainerIDManager(TIDFields, SIDFields); + _manager.ValueChanged += (sender, e) => UpdatedID?.Invoke(sender, e); } - private static string GetAlternateRepresentation(ITrainerID32 tr, TrainerIDFormat format) - { - if (format is not TrainerIDFormat.SixteenBit) - return $"ID: {tr.TID16:D5}/{tr.SID16:D5}"; - var id = tr.ID32; - return $"G7ID: ({id / 1_000_000:D4}){id % 1_000_000:D6}"; - } - - private uint GetTSV() - { - if (DisplayType is TrainerIDFormat.None) - return uint.MaxValue; - var xor = (uint)(Trainer.SID16 ^ Trainer.TID16); - if (XorFormat <= 5) - return xor >> 3; - return xor >> 4; - } - - public void LoadIDValues(ITrainerID32 tr, byte format) - { - Trainer = tr; - var display = tr.GetTrainerIDFormat(); - SetFormat(display, format); - LoadValues(); - } - - public void UpdateSID() => LoadValues(); - - public void LoadInfo(ITrainerInfo info) - { - Trainer.TID16 = info.TID16; - Trainer.SID16 = info.SID16; - LoadValues(); - } - - private void LoadValues() - { - LoadingFields = true; - if (XorFormat <= 2) - TB_TID.Text = Trainer.TID16.ToString(); - else if (DisplayType == TrainerIDFormat.SixteenBit) - LoadTID(Trainer); - else - LoadTID7(Trainer); - LoadingFields = false; - } - - private void LoadTID(ITrainerID32 tr) - { - TB_TID.Text = tr.TID16.ToString(TrainerIDExtensions.TID16); - TB_SID.Text = tr.SID16.ToString(TrainerIDExtensions.SID16); - } - - private void LoadTID7(ITrainerID32 tr) - { - TB_TID7.Text = tr.GetTrainerTID7().ToString(TrainerIDExtensions.TID7); - TB_SID7.Text = tr.GetTrainerSID7().ToString(TrainerIDExtensions.SID7); - } - - private void SetFormat(TrainerIDFormat display, byte format) - { - if ((display, format) == (DisplayType, XorFormat)) - return; - - var controls = GetControlsForFormat(display); - FLP.Controls.Clear(); int i = 0; - foreach (var c in controls) - { - FLP.Controls.Add(c); - FLP.Controls.SetChildIndex(c, i++); // because you don't listen the first time - } - - (DisplayType, XorFormat) = (display, format); - } - - private Control[] GetControlsForFormat(TrainerIDFormat format) => format switch - { - TrainerIDFormat.SixDigit => [Label_SID, TB_SID7, Label_TID, TB_TID7], - TrainerIDFormat.SixteenBitSingle => [Label_TID, TB_TID], // Gen1/2 - _ => [Label_TID, TB_TID, Label_SID, TB_SID], - }; - - private void UpdateTSV(object sender, EventArgs e) => UpdateTSV(); - - private void Update_ID(object sender, EventArgs e) - { - if (sender is not MaskedTextBox mt) - return; - - if (!uint.TryParse(mt.Text, out var value)) - value = 0; - if (mt == TB_TID7) - { - if (value > 999_999) - { - mt.Text = "999999"; - return; - } - if (!uint.TryParse(TB_SID7.Text, out var sid)) - sid = 0; - SanityCheckSID7(value, sid); - } - else if (mt == TB_SID7) - { - if (value > 4294) // max 4 digits of 32bit int - { - mt.Text = "4294"; - return; - } - if (!uint.TryParse(TB_TID7.Text, out var tid)) - tid = 0; - SanityCheckSID7(tid, value); - } - else - { - if (value > ushort.MaxValue) // prior to Gen7 - mt.Text = (value = ushort.MaxValue).ToString(); - - if (mt == TB_TID) - Trainer.TID16 = (ushort)value; - else - Trainer.SID16 = (ushort)value; - } - - UpdatedID?.Invoke(sender, e); - } - - private void SanityCheckSID7(uint tid, uint sid) - { - if (LoadingFields) - return; - - var repack = ((ulong)sid * 1_000_000) + tid; - if (repack > uint.MaxValue) - { - TB_SID7.Text = (sid - 1).ToString(); - return; // GUI triggers change event, so we'll eventually reach below. - } - Trainer.SetTrainerID7(sid, tid); - } + public void LoadTrainer(T trainer) where T : ITrainerID32, IGeneration => _manager.LoadTrainer(trainer); + public void LoadTrainer(ITrainerID32 trainer, byte generation) => _manager.LoadTrainer(trainer, generation); + public void LoadTrainer() => _manager.LoadTrainer(); + public void SetToolTip() => _manager.SetToolTip(); } diff --git a/PKHeX.WinForms/Controls/PKM Editor/TrainerSID.Designer.cs b/PKHeX.WinForms/Controls/PKM Editor/TrainerSID.Designer.cs new file mode 100644 index 000000000..b286889a8 --- /dev/null +++ b/PKHeX.WinForms/Controls/PKM Editor/TrainerSID.Designer.cs @@ -0,0 +1,78 @@ +namespace PKHeX.WinForms.Controls +{ + partial class TrainerSID + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + TB_Five = new System.Windows.Forms.MaskedTextBox(); + TB_Four = new System.Windows.Forms.MaskedTextBox(); + SuspendLayout(); + // + // TB_Five + // + TB_Five.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + TB_Five.Location = new System.Drawing.Point(0, 0); + TB_Five.Margin = new System.Windows.Forms.Padding(0); + TB_Five.Mask = "00000"; + TB_Five.Name = "TB_Five"; + TB_Five.Size = new System.Drawing.Size(40, 25); + TB_Five.TabIndex = 0; + TB_Five.Text = "12345"; + TB_Five.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + TB_Five.TextChanged += RaiseValueChanged; + // + // TB_Four + // + TB_Four.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + TB_Four.Location = new System.Drawing.Point(0, 0); + TB_Four.Margin = new System.Windows.Forms.Padding(0); + TB_Four.Mask = "0000"; + TB_Four.Name = "TB_Four"; + TB_Four.Size = new System.Drawing.Size(32, 25); + TB_Four.TabIndex = 1; + TB_Four.Text = "1234"; + TB_Four.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + TB_Four.TextChanged += RaiseValueChanged; + // + // TrainerSID + // + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + Controls.Add(TB_Four); + Controls.Add(TB_Five); + Margin = new System.Windows.Forms.Padding(0); + Name = "TrainerSID"; + Size = new System.Drawing.Size(40, 25); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private System.Windows.Forms.MaskedTextBox TB_Five; + private System.Windows.Forms.MaskedTextBox TB_Four; + } +} diff --git a/PKHeX.WinForms/Controls/PKM Editor/TrainerSID.cs b/PKHeX.WinForms/Controls/PKM Editor/TrainerSID.cs new file mode 100644 index 000000000..88b5fd329 --- /dev/null +++ b/PKHeX.WinForms/Controls/PKM Editor/TrainerSID.cs @@ -0,0 +1,123 @@ +using System; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms.Controls; + +internal partial class TrainerSID : UserControl, ITrainerIDControl +{ + private TrainerIDFormat Format { get; set; } + public ToolTip? ToolTip { private get; set; } + private bool IsFourDigit => Format is TrainerIDFormat.SixDigit; + private bool IsFiveDigit => Format is TrainerIDFormat.SixteenBit; + + public event EventHandler? ValueChanged; + + public TrainerSID() => InitializeComponent(); + + private void RaiseValueChanged(object? sender, EventArgs e) => ValueChanged?.Invoke(sender, e); + + public void LoadTrainer(ITrainerID32 trainer, TrainerIDFormat displayType) + { + Format = displayType; + TB_Five.Visible = IsFiveDigit; + TB_Four.Visible = IsFourDigit; + LoadTrainer(trainer); + } + + private void LoadTrainer(ITrainerID32 trainer) + { + if (IsFourDigit) + TB_Four.Text = trainer.GetTrainerSID7().ToString(TrainerIDExtensions.SID7); + else if (IsFiveDigit) + TB_Five.Text = trainer.SID16.ToString(TrainerIDExtensions.SID16); + } + + public void SaveTrainer(ITrainerID32 trainer) + { + if (IsFourDigit) + Save4(trainer); + else if (IsFiveDigit) + Save5(trainer); + } + + public bool IsValueSame(ITrainerID32 trainer) + { + if (IsFourDigit) + return trainer.GetTrainerSID7() == (uint.TryParse(TB_Four.Text, out var value) ? value : 0); + if (IsFiveDigit) + return trainer.SID16 == (ushort.TryParse(TB_Five.Text, out var value) ? value : 0); + return true; + } + + private void Save4(ITrainerID32 trainer) + { + var box = TB_Four; + if (box.Text.Length == 0) + { + trainer.SetTrainerSID7(0); + return; + } + + const uint max = 4294u; + if (!uint.TryParse(box.Text, out var value)) + { + value = 0; + } + else if (value > max) + { + value = max; + if (!trainer.IsValidTrainerID7(sid7: value, trainer.GetTrainerTID7())) + value = max - 1; + } + else + { + if (trainer.IsValidTrainerID7(sid7: value, trainer.GetTrainerTID7())) + { + trainer.SetTrainerSID7(value); + return; + } + value = max - 1; + } + + // Invalid. + trainer.SetTrainerSID7(value); + box.Text = value.ToString(TrainerIDExtensions.SID7); + } + + private void Save5(ITrainerID32 trainer) + { + var box = TB_Five; + if (box.Text.Length == 0) + { + trainer.SID16 = 0; + return; + } + + const ushort max = ushort.MaxValue; + if (!uint.TryParse(box.Text, out var value)) + { + value = 0; + } + else if (value > max) + { + value = max; + } + else + { + // Valid value. Set to object. + trainer.SID16 = (ushort)value; + return; + } + + // Invalid; reset and try again. + trainer.SID16 = (ushort)value; + box.Text = value.ToString(TrainerIDExtensions.SID16); + } + + public void SetToolTip(string text) + { + ToolTip?.SetToolTip(TB_Five, text); + ToolTip?.SetToolTip(TB_Four, text); + } +} diff --git a/PKHeX.WinForms/Controls/PKM Editor/TrainerTID.Designer.cs b/PKHeX.WinForms/Controls/PKM Editor/TrainerTID.Designer.cs new file mode 100644 index 000000000..b9fd417c7 --- /dev/null +++ b/PKHeX.WinForms/Controls/PKM Editor/TrainerTID.Designer.cs @@ -0,0 +1,78 @@ +namespace PKHeX.WinForms.Controls +{ + partial class TrainerTID + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + TB_Five = new System.Windows.Forms.MaskedTextBox(); + TB_Six = new System.Windows.Forms.MaskedTextBox(); + SuspendLayout(); + // + // TB_Five + // + TB_Five.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + TB_Five.Location = new System.Drawing.Point(0, 0); + TB_Five.Margin = new System.Windows.Forms.Padding(0); + TB_Five.Mask = "00000"; + TB_Five.Name = "TB_Five"; + TB_Five.Size = new System.Drawing.Size(40, 25); + TB_Five.TabIndex = 0; + TB_Five.Text = "12345"; + TB_Five.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + TB_Five.TextChanged += RaiseValueChanged; + // + // TB_Six + // + TB_Six.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + TB_Six.Location = new System.Drawing.Point(0, 0); + TB_Six.Margin = new System.Windows.Forms.Padding(0); + TB_Six.Mask = "000000"; + TB_Six.Name = "TB_Six"; + TB_Six.Size = new System.Drawing.Size(48, 25); + TB_Six.TabIndex = 1; + TB_Six.Text = "123456"; + TB_Six.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + TB_Six.TextChanged += RaiseValueChanged; + // + // TrainerTID + // + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + Controls.Add(TB_Six); + Controls.Add(TB_Five); + Margin = new System.Windows.Forms.Padding(0); + Name = "TrainerTID"; + Size = new System.Drawing.Size(48, 25); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private System.Windows.Forms.MaskedTextBox TB_Five; + private System.Windows.Forms.MaskedTextBox TB_Six; + } +} diff --git a/PKHeX.WinForms/Controls/PKM Editor/TrainerTID.cs b/PKHeX.WinForms/Controls/PKM Editor/TrainerTID.cs new file mode 100644 index 000000000..9396da239 --- /dev/null +++ b/PKHeX.WinForms/Controls/PKM Editor/TrainerTID.cs @@ -0,0 +1,114 @@ +using System; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms.Controls; + +internal partial class TrainerTID : UserControl, ITrainerIDControl +{ + private TrainerIDFormat Format { get; set; } + public ToolTip? ToolTip { private get; set; } + private bool IsSixDigit => Format is TrainerIDFormat.SixDigit; + public event EventHandler? ValueChanged; + + public TrainerTID() => InitializeComponent(); + + private void RaiseValueChanged(object? sender, EventArgs e) => ValueChanged?.Invoke(sender, e); + + public void LoadTrainer(ITrainerID32 trainer, TrainerIDFormat displayType) + { + Format = displayType; + TB_Five.Visible = !IsSixDigit; + TB_Six.Visible = IsSixDigit; + + if (IsSixDigit) + TB_Six.Text = trainer.GetTrainerTID7().ToString(TrainerIDExtensions.TID7); + else + TB_Five.Text = trainer.TID16.ToString(TrainerIDExtensions.TID16); + } + + public void SaveTrainer(ITrainerID32 trainer) + { + if (IsSixDigit) + Save6(trainer); + else + Save5(trainer); + } + public bool IsValueSame(ITrainerID32 trainer) + { + if (IsSixDigit) + return trainer.GetTrainerTID7() == (uint.TryParse(TB_Six.Text, out var value) ? value : 0); + else + return trainer.TID16 == (ushort.TryParse(TB_Five.Text, out var value) ? value : 0); + } + + private void Save5(ITrainerID32 trainer) + { + var box = TB_Five; + if (box.Text.Length == 0) + { + trainer.TID16 = 0; + return; + } + + const ushort max = ushort.MaxValue; + if (!uint.TryParse(box.Text, out var value)) + { + value = 0; + } + else if (value > max) + { + value = max; + } + else + { + // Valid value. Set to object. + trainer.TID16 = (ushort)value; + return; + } + + // Invalid; reset and try again. + trainer.TID16 = (ushort)value; + box.Text = value.ToString(TrainerIDExtensions.TID16); + } + + private void Save6(ITrainerID32 trainer) + { + var box = TB_Six; + if (box.Text.Length == 0) + { + trainer.SetTrainerTID7(0); + return; + } + + const uint max = 999_999u; + if (!uint.TryParse(box.Text, out var value)) + { + value = 0; + } + if (value > max) + { + value = max; + } + else if (value == max && (trainer.IsValidTrainerID7(sid7: value, trainer.GetTrainerTID7()))) + { + value = max - 1; + } + else + { + // Valid value. Set to object. + trainer.SetTrainerTID7(value); + return; + } + + // Invalid; reset and try again. + trainer.SetTrainerTID7(value); + box.Text = value.ToString(TrainerIDExtensions.TID7); + } + + public void SetToolTip(string text) + { + ToolTip?.SetToolTip(TB_Five, text); + ToolTip?.SetToolTip(TB_Six, text); + } +} diff --git a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs index 615d97066..f3e7b5b8e 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.Designer.cs @@ -60,6 +60,13 @@ private void InitializeComponent() L_ReadOnlyOther = new System.Windows.Forms.Label(); Tab_SAV = new System.Windows.Forms.TabPage(); TLP_SAVEditor = new System.Windows.Forms.TableLayoutPanel(); + FLP_SAVToolsMisc = new System.Windows.Forms.FlowLayoutPanel(); + B_SaveBoxBin = new System.Windows.Forms.Button(); + B_VerifyCHK = new System.Windows.Forms.Button(); + B_VerifySaveEntities = new System.Windows.Forms.Button(); + Menu_ExportBAK = new System.Windows.Forms.Button(); + B_JPEG = new System.Windows.Forms.Button(); + B_ConvertKorean = new System.Windows.Forms.Button(); FLP_SAVtools = new System.Windows.Forms.FlowLayoutPanel(); B_OpenTrainerInfo = new System.Windows.Forms.Button(); B_OpenItemPouch = new System.Windows.Forms.Button(); @@ -107,13 +114,6 @@ private void InitializeComponent() B_OpenGear = new System.Windows.Forms.Button(); B_OpenFashion = new System.Windows.Forms.Button(); B_OpenGlobalLink = new System.Windows.Forms.Button(); - FLP_SAVToolsMisc = new System.Windows.Forms.FlowLayoutPanel(); - B_SaveBoxBin = new System.Windows.Forms.Button(); - B_VerifyCHK = new System.Windows.Forms.Button(); - B_VerifySaveEntities = new System.Windows.Forms.Button(); - Menu_ExportBAK = new System.Windows.Forms.Button(); - B_JPEG = new System.Windows.Forms.Button(); - B_ConvertKorean = new System.Windows.Forms.Button(); L_SaveSlot = new System.Windows.Forms.Label(); CB_SaveSlot = new System.Windows.Forms.ComboBox(); tabBoxMulti.SuspendLayout(); @@ -126,8 +126,8 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)dcpkx1).BeginInit(); Tab_SAV.SuspendLayout(); TLP_SAVEditor.SuspendLayout(); - FLP_SAVtools.SuspendLayout(); FLP_SAVToolsMisc.SuspendLayout(); + FLP_SAVtools.SuspendLayout(); SuspendLayout(); // // tabBoxMulti @@ -434,6 +434,103 @@ private void InitializeComponent() TLP_SAVEditor.Size = new System.Drawing.Size(441, 333); TLP_SAVEditor.TabIndex = 105; // + // FLP_SAVToolsMisc + // + FLP_SAVToolsMisc.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + TLP_SAVEditor.SetColumnSpan(FLP_SAVToolsMisc, 2); + FLP_SAVToolsMisc.Controls.Add(B_SaveBoxBin); + FLP_SAVToolsMisc.Controls.Add(B_VerifyCHK); + FLP_SAVToolsMisc.Controls.Add(B_VerifySaveEntities); + FLP_SAVToolsMisc.Controls.Add(Menu_ExportBAK); + FLP_SAVToolsMisc.Controls.Add(B_JPEG); + FLP_SAVToolsMisc.Controls.Add(B_ConvertKorean); + FLP_SAVToolsMisc.Dock = System.Windows.Forms.DockStyle.Fill; + FLP_SAVToolsMisc.Location = new System.Drawing.Point(0, 0); + FLP_SAVToolsMisc.Margin = new System.Windows.Forms.Padding(0); + FLP_SAVToolsMisc.Name = "FLP_SAVToolsMisc"; + FLP_SAVToolsMisc.Size = new System.Drawing.Size(441, 54); + FLP_SAVToolsMisc.TabIndex = 104; + // + // B_SaveBoxBin + // + B_SaveBoxBin.AutoSize = true; + B_SaveBoxBin.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + B_SaveBoxBin.Dock = System.Windows.Forms.DockStyle.Fill; + B_SaveBoxBin.Location = new System.Drawing.Point(0, 0); + B_SaveBoxBin.Margin = new System.Windows.Forms.Padding(0); + B_SaveBoxBin.Name = "B_SaveBoxBin"; + B_SaveBoxBin.Size = new System.Drawing.Size(119, 27); + B_SaveBoxBin.TabIndex = 1; + B_SaveBoxBin.Text = "Save Box Data++"; + B_SaveBoxBin.UseVisualStyleBackColor = true; + B_SaveBoxBin.Click += B_SaveBoxBin_Click; + // + // B_VerifyCHK + // + B_VerifyCHK.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + B_VerifyCHK.AutoSize = true; + B_VerifyCHK.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + B_VerifyCHK.Location = new System.Drawing.Point(119, 0); + B_VerifyCHK.Margin = new System.Windows.Forms.Padding(0); + B_VerifyCHK.Name = "B_VerifyCHK"; + B_VerifyCHK.Size = new System.Drawing.Size(118, 27); + B_VerifyCHK.TabIndex = 2; + B_VerifyCHK.Text = "Verify Checksums"; + B_VerifyCHK.UseVisualStyleBackColor = true; + B_VerifyCHK.Click += ClickVerifyCHK; + // + // B_VerifySaveEntities + // + B_VerifySaveEntities.AutoSize = true; + B_VerifySaveEntities.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + B_VerifySaveEntities.Location = new System.Drawing.Point(237, 0); + B_VerifySaveEntities.Margin = new System.Windows.Forms.Padding(0); + B_VerifySaveEntities.Name = "B_VerifySaveEntities"; + B_VerifySaveEntities.Size = new System.Drawing.Size(105, 27); + B_VerifySaveEntities.TabIndex = 3; + B_VerifySaveEntities.Text = "Verify All PKMs"; + B_VerifySaveEntities.UseVisualStyleBackColor = true; + B_VerifySaveEntities.Click += ClickVerifyStoredEntities; + // + // Menu_ExportBAK + // + Menu_ExportBAK.AutoSize = true; + Menu_ExportBAK.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + Menu_ExportBAK.Location = new System.Drawing.Point(0, 27); + Menu_ExportBAK.Margin = new System.Windows.Forms.Padding(0); + Menu_ExportBAK.Name = "Menu_ExportBAK"; + Menu_ExportBAK.Size = new System.Drawing.Size(101, 27); + Menu_ExportBAK.TabIndex = 4; + Menu_ExportBAK.Text = "Export Backup"; + Menu_ExportBAK.UseVisualStyleBackColor = true; + Menu_ExportBAK.Click += Menu_ExportBAK_Click; + // + // B_JPEG + // + B_JPEG.AutoSize = true; + B_JPEG.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + B_JPEG.Location = new System.Drawing.Point(101, 27); + B_JPEG.Margin = new System.Windows.Forms.Padding(0); + B_JPEG.Name = "B_JPEG"; + B_JPEG.Size = new System.Drawing.Size(106, 27); + B_JPEG.TabIndex = 5; + B_JPEG.Text = "Save PGL .JPEG"; + B_JPEG.UseVisualStyleBackColor = true; + B_JPEG.Click += B_JPEG_Click; + // + // B_ConvertKorean + // + B_ConvertKorean.AutoSize = true; + B_ConvertKorean.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + B_ConvertKorean.Location = new System.Drawing.Point(207, 27); + B_ConvertKorean.Margin = new System.Windows.Forms.Padding(0); + B_ConvertKorean.Name = "B_ConvertKorean"; + B_ConvertKorean.Size = new System.Drawing.Size(160, 27); + B_ConvertKorean.TabIndex = 6; + B_ConvertKorean.Text = "Korean Save Conversion"; + B_ConvertKorean.UseVisualStyleBackColor = true; + B_ConvertKorean.Click += B_ConvertKorean_Click; + // // FLP_SAVtools // FLP_SAVtools.AutoScroll = true; @@ -627,7 +724,6 @@ private void InitializeComponent() // // B_OpenSuperTraining // - B_OpenSuperTraining.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F); B_OpenSuperTraining.Location = new System.Drawing.Point(2, 178); B_OpenSuperTraining.Margin = new System.Windows.Forms.Padding(2); B_OpenSuperTraining.Name = "B_OpenSuperTraining"; @@ -1000,103 +1096,6 @@ private void InitializeComponent() B_OpenGlobalLink.UseVisualStyleBackColor = true; B_OpenGlobalLink.Click += B_OpenGlobalLink_Click; // - // FLP_SAVToolsMisc - // - FLP_SAVToolsMisc.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - TLP_SAVEditor.SetColumnSpan(FLP_SAVToolsMisc, 2); - FLP_SAVToolsMisc.Controls.Add(B_SaveBoxBin); - FLP_SAVToolsMisc.Controls.Add(B_VerifyCHK); - FLP_SAVToolsMisc.Controls.Add(B_VerifySaveEntities); - FLP_SAVToolsMisc.Controls.Add(Menu_ExportBAK); - FLP_SAVToolsMisc.Controls.Add(B_JPEG); - FLP_SAVToolsMisc.Controls.Add(B_ConvertKorean); - FLP_SAVToolsMisc.Dock = System.Windows.Forms.DockStyle.Fill; - FLP_SAVToolsMisc.Location = new System.Drawing.Point(0, 0); - FLP_SAVToolsMisc.Margin = new System.Windows.Forms.Padding(0); - FLP_SAVToolsMisc.Name = "FLP_SAVToolsMisc"; - FLP_SAVToolsMisc.Size = new System.Drawing.Size(441, 54); - FLP_SAVToolsMisc.TabIndex = 104; - // - // B_SaveBoxBin - // - B_SaveBoxBin.AutoSize = true; - B_SaveBoxBin.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - B_SaveBoxBin.Dock = System.Windows.Forms.DockStyle.Fill; - B_SaveBoxBin.Location = new System.Drawing.Point(0, 0); - B_SaveBoxBin.Margin = new System.Windows.Forms.Padding(0); - B_SaveBoxBin.Name = "B_SaveBoxBin"; - B_SaveBoxBin.Size = new System.Drawing.Size(119, 27); - B_SaveBoxBin.TabIndex = 1; - B_SaveBoxBin.Text = "Save Box Data++"; - B_SaveBoxBin.UseVisualStyleBackColor = true; - B_SaveBoxBin.Click += B_SaveBoxBin_Click; - // - // B_VerifyCHK - // - B_VerifyCHK.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - B_VerifyCHK.AutoSize = true; - B_VerifyCHK.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - B_VerifyCHK.Location = new System.Drawing.Point(119, 0); - B_VerifyCHK.Margin = new System.Windows.Forms.Padding(0); - B_VerifyCHK.Name = "B_VerifyCHK"; - B_VerifyCHK.Size = new System.Drawing.Size(118, 27); - B_VerifyCHK.TabIndex = 2; - B_VerifyCHK.Text = "Verify Checksums"; - B_VerifyCHK.UseVisualStyleBackColor = true; - B_VerifyCHK.Click += ClickVerifyCHK; - // - // B_VerifySaveEntities - // - B_VerifySaveEntities.AutoSize = true; - B_VerifySaveEntities.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - B_VerifySaveEntities.Location = new System.Drawing.Point(237, 0); - B_VerifySaveEntities.Margin = new System.Windows.Forms.Padding(0); - B_VerifySaveEntities.Name = "B_VerifySaveEntities"; - B_VerifySaveEntities.Size = new System.Drawing.Size(105, 27); - B_VerifySaveEntities.TabIndex = 3; - B_VerifySaveEntities.Text = "Verify All PKMs"; - B_VerifySaveEntities.UseVisualStyleBackColor = true; - B_VerifySaveEntities.Click += ClickVerifyStoredEntities; - // - // Menu_ExportBAK - // - Menu_ExportBAK.AutoSize = true; - Menu_ExportBAK.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - Menu_ExportBAK.Location = new System.Drawing.Point(0, 27); - Menu_ExportBAK.Margin = new System.Windows.Forms.Padding(0); - Menu_ExportBAK.Name = "Menu_ExportBAK"; - Menu_ExportBAK.Size = new System.Drawing.Size(101, 27); - Menu_ExportBAK.TabIndex = 4; - Menu_ExportBAK.Text = "Export Backup"; - Menu_ExportBAK.UseVisualStyleBackColor = true; - Menu_ExportBAK.Click += Menu_ExportBAK_Click; - // - // B_JPEG - // - B_JPEG.AutoSize = true; - B_JPEG.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - B_JPEG.Location = new System.Drawing.Point(101, 27); - B_JPEG.Margin = new System.Windows.Forms.Padding(0); - B_JPEG.Name = "B_JPEG"; - B_JPEG.Size = new System.Drawing.Size(106, 27); - B_JPEG.TabIndex = 5; - B_JPEG.Text = "Save PGL .JPEG"; - B_JPEG.UseVisualStyleBackColor = true; - B_JPEG.Click += B_JPEG_Click; - // - // B_ConvertKorean - // - B_ConvertKorean.AutoSize = true; - B_ConvertKorean.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - B_ConvertKorean.Location = new System.Drawing.Point(207, 27); - B_ConvertKorean.Margin = new System.Windows.Forms.Padding(0); - B_ConvertKorean.Name = "B_ConvertKorean"; - B_ConvertKorean.Size = new System.Drawing.Size(160, 27); - B_ConvertKorean.TabIndex = 6; - B_ConvertKorean.Text = "Korean Save Conversion"; - B_ConvertKorean.UseVisualStyleBackColor = true; - B_ConvertKorean.Click += B_ConvertKorean_Click; - // // L_SaveSlot // L_SaveSlot.Anchor = System.Windows.Forms.AnchorStyles.Right; @@ -1140,9 +1139,9 @@ private void InitializeComponent() Tab_SAV.ResumeLayout(false); TLP_SAVEditor.ResumeLayout(false); TLP_SAVEditor.PerformLayout(); - FLP_SAVtools.ResumeLayout(false); FLP_SAVToolsMisc.ResumeLayout(false); FLP_SAVToolsMisc.PerformLayout(); + FLP_SAVtools.ResumeLayout(false); ResumeLayout(false); } diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen7/SAV_Trainer7.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen7/SAV_Trainer7.cs index 4d477216b..5bbf8dd8d 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen7/SAV_Trainer7.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen7/SAV_Trainer7.cs @@ -104,7 +104,7 @@ private void GetTextBoxes() // Display Data TB_OTName.Text = SAV.OT; - trainerID1.LoadIDValues(SAV, SAV.Generation); + trainerID1.LoadTrainer(SAV); MT_Money.Text = SAV.Money.ToString(); CB_Country.SelectedValue = (int)SAV.Country; diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen7/SAV_Trainer7GG.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen7/SAV_Trainer7GG.cs index ca8d17603..23591592a 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen7/SAV_Trainer7GG.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen7/SAV_Trainer7GG.cs @@ -73,7 +73,7 @@ private void LoadTrainerInfo() CB_Game.SelectedValue = (int)SAV.Version; CB_Gender.SelectedIndex = SAV.Gender; - trainerID1.LoadIDValues(SAV, SAV.Generation); + trainerID1.LoadTrainer(SAV); NUD_M.Value = SAV.Coordinates.M; // Sanity Check Map Coordinates diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8.cs index a8084fbca..6c47b5ef8 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8.cs @@ -69,7 +69,7 @@ private void GetTextBoxes() TB_TrainerCardNumber.Text = SAV.Blocks.TrainerCard.Number; MT_TrainerCardID.Text = SAV.Blocks.TrainerCard.TrainerID.ToString("000000"); MT_RotoRally.Text = SAV.Blocks.TrainerCard.RotoRallyScore.ToString(); - trainerID1.LoadIDValues(SAV, SAV.Generation); + trainerID1.LoadTrainer(SAV); MT_Money.Text = SAV.Money.ToString(); MT_Watt.Text = SAV.MyStatus.Watt.ToString(); CB_Language.SelectedValue = SAV.Language; diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8a.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8a.cs index 838908856..b1bcc24ea 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8a.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8a.cs @@ -42,7 +42,7 @@ private void GetTextBoxes() // Display Data TB_OTName.Text = SAV.OT; - trainerID1.LoadIDValues(SAV, SAV.Generation); + trainerID1.LoadTrainer(SAV); MT_Money.Text = SAV.Money.ToString(); CB_Language.SelectedValue = SAV.Language; diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8b.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8b.cs index 236c0da0d..d02da16bf 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8b.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8b.cs @@ -53,7 +53,7 @@ private void GetTextBoxes() // Display Data TB_OTName.Text = SAV.OT; - trainerID1.LoadIDValues(SAV, SAV.Generation); + trainerID1.LoadTrainer(SAV); MT_Money.Text = SAV.Money.ToString(); CB_Language.SelectedValue = SAV.Language; TB_Rival.Text = SAV.RivalName; diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen9/SAV_Trainer9.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen9/SAV_Trainer9.cs index f83f6e7d6..82468852d 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen9/SAV_Trainer9.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen9/SAV_Trainer9.cs @@ -111,7 +111,7 @@ private void GetTextBoxes() // Display Data TB_OTName.Text = SAV.OT; - trainerID1.LoadIDValues(SAV, SAV.Generation); + trainerID1.LoadTrainer(SAV); MT_Money.Text = SAV.Money.ToString(); MT_LP.Text = SAV.LeaguePoints.ToString(); CB_Language.SelectedValue = SAV.Language; diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen9/SAV_Trainer9a.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen9/SAV_Trainer9a.Designer.cs index abfa913d2..79a796c46 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen9/SAV_Trainer9a.Designer.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen9/SAV_Trainer9a.Designer.cs @@ -28,6 +28,7 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SAV_Trainer9a)); B_Cancel = new System.Windows.Forms.Button(); B_Save = new System.Windows.Forms.Button(); TB_OTName = new System.Windows.Forms.TextBox(); @@ -53,7 +54,6 @@ private void InitializeComponent() L_Language = new System.Windows.Forms.Label(); B_MaxCash = new System.Windows.Forms.Button(); CB_Language = new System.Windows.Forms.ComboBox(); - CB_Gender = new System.Windows.Forms.ComboBox(); TB_MBMS = new System.Windows.Forms.MaskedTextBox(); TB_MBMN = new System.Windows.Forms.MaskedTextBox(); TB_MBRS = new System.Windows.Forms.MaskedTextBox(); @@ -90,10 +90,14 @@ private void InitializeComponent() L_SinglesC = new System.Windows.Forms.Label(); TC_Editor = new System.Windows.Forms.TabControl(); Tab_Overview = new System.Windows.Forms.TabPage(); + tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); trainerID1 = new PKHeX.WinForms.Controls.TrainerID(); + CAL_LastSavedTime = new System.Windows.Forms.DateTimePicker(); CAL_LastSavedDate = new System.Windows.Forms.DateTimePicker(); L_LastSaved = new System.Windows.Forms.Label(); - CAL_LastSavedTime = new System.Windows.Forms.DateTimePicker(); + flowLayoutPanel2 = new System.Windows.Forms.FlowLayoutPanel(); + CB_Gender = new PKHeX.WinForms.Controls.GenderToggle(); + FLP_Money = new System.Windows.Forms.FlowLayoutPanel(); Tab_MiscValues = new System.Windows.Forms.TabPage(); B_CollectTechnicalMachines = new System.Windows.Forms.Button(); B_CollectScrews = new System.Windows.Forms.Button(); @@ -121,13 +125,17 @@ private void InitializeComponent() P_Picture2 = new System.Windows.Forms.PictureBox(); P_Picture3 = new System.Windows.Forms.PictureBox(); Tab_DLC = new System.Windows.Forms.TabPage(); + TB_StreetName = new System.Windows.Forms.TextBox(); + L_StreetName = new System.Windows.Forms.Label(); L_HyperspaceSurveyPoints = new System.Windows.Forms.Label(); MT_HyperspaceSurveyPoints = new System.Windows.Forms.MaskedTextBox(); B_HyperspaceSurveyPoints = new System.Windows.Forms.Button(); - TB_StreetName = new System.Windows.Forms.TextBox(); - L_StreetName = new System.Windows.Forms.Label(); + flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); TC_Editor.SuspendLayout(); Tab_Overview.SuspendLayout(); + tableLayoutPanel1.SuspendLayout(); + flowLayoutPanel2.SuspendLayout(); + FLP_Money.SuspendLayout(); Tab_MiscValues.SuspendLayout(); GB_Map.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)NUD_R).BeginInit(); @@ -140,12 +148,14 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)P_Picture2).BeginInit(); ((System.ComponentModel.ISupportInitialize)P_Picture3).BeginInit(); Tab_DLC.SuspendLayout(); + flowLayoutPanel1.SuspendLayout(); SuspendLayout(); // // B_Cancel // - B_Cancel.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; - B_Cancel.Location = new System.Drawing.Point(281, 312); + B_Cancel.Anchor = System.Windows.Forms.AnchorStyles.Left; + B_Cancel.AutoSize = true; + B_Cancel.Location = new System.Drawing.Point(396, 4); B_Cancel.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); B_Cancel.Name = "B_Cancel"; B_Cancel.Size = new System.Drawing.Size(100, 32); @@ -156,8 +166,9 @@ private void InitializeComponent() // // B_Save // - B_Save.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; - B_Save.Location = new System.Drawing.Point(391, 312); + B_Save.Anchor = System.Windows.Forms.AnchorStyles.Left; + B_Save.AutoSize = true; + B_Save.Location = new System.Drawing.Point(506, 4); B_Save.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); B_Save.Name = "B_Save"; B_Save.Size = new System.Drawing.Size(100, 32); @@ -168,9 +179,9 @@ private void InitializeComponent() // // TB_OTName // + TB_OTName.Anchor = System.Windows.Forms.AnchorStyles.Left; TB_OTName.Font = new System.Drawing.Font("Courier New", 8.25F); - TB_OTName.Location = new System.Drawing.Point(170, 14); - TB_OTName.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TB_OTName.Location = new System.Drawing.Point(3, 5); TB_OTName.MaxLength = 12; TB_OTName.Name = "TB_OTName"; TB_OTName.Size = new System.Drawing.Size(120, 20); @@ -181,18 +192,20 @@ private void InitializeComponent() // // L_TrainerName // - L_TrainerName.Location = new System.Drawing.Point(66, 13); - L_TrainerName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + L_TrainerName.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_TrainerName.AutoSize = true; + L_TrainerName.Location = new System.Drawing.Point(35, 6); + L_TrainerName.Margin = new System.Windows.Forms.Padding(3); L_TrainerName.Name = "L_TrainerName"; - L_TrainerName.Size = new System.Drawing.Size(104, 24); + L_TrainerName.Size = new System.Drawing.Size(90, 17); L_TrainerName.TabIndex = 3; L_TrainerName.Text = "Trainer Name:"; L_TrainerName.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // MT_Money // - MT_Money.Location = new System.Drawing.Point(170, 68); - MT_Money.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + MT_Money.Anchor = System.Windows.Forms.AnchorStyles.Left; + MT_Money.Location = new System.Drawing.Point(3, 3); MT_Money.Mask = "0000000"; MT_Money.Name = "MT_Money"; MT_Money.Size = new System.Drawing.Size(67, 25); @@ -202,10 +215,12 @@ private void InitializeComponent() // // L_Money // - L_Money.Location = new System.Drawing.Point(132, 69); - L_Money.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + L_Money.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Money.AutoSize = true; + L_Money.Location = new System.Drawing.Point(107, 62); + L_Money.Margin = new System.Windows.Forms.Padding(3); L_Money.Name = "L_Money"; - L_Money.Size = new System.Drawing.Size(37, 23); + L_Money.Size = new System.Drawing.Size(18, 17); L_Money.TabIndex = 5; L_Money.Text = "$:"; L_Money.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -282,28 +297,32 @@ private void InitializeComponent() // // L_Seconds // - L_Seconds.Location = new System.Drawing.Point(285, 178); - L_Seconds.Margin = new System.Windows.Forms.Padding(0); + L_Seconds.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Seconds.AutoSize = true; + L_Seconds.Location = new System.Drawing.Point(94, 268); + L_Seconds.Margin = new System.Windows.Forms.Padding(3); L_Seconds.Name = "L_Seconds"; - L_Seconds.Size = new System.Drawing.Size(41, 24); + L_Seconds.Size = new System.Drawing.Size(31, 17); L_Seconds.TabIndex = 30; L_Seconds.Text = "Sec:"; L_Seconds.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // L_Minutes // - L_Minutes.Location = new System.Drawing.Point(198, 178); - L_Minutes.Margin = new System.Windows.Forms.Padding(0); + L_Minutes.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Minutes.AutoSize = true; + L_Minutes.Location = new System.Drawing.Point(92, 237); + L_Minutes.Margin = new System.Windows.Forms.Padding(3); L_Minutes.Name = "L_Minutes"; - L_Minutes.Size = new System.Drawing.Size(67, 24); + L_Minutes.Size = new System.Drawing.Size(33, 17); L_Minutes.TabIndex = 29; L_Minutes.Text = "Min:"; L_Minutes.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // MT_Seconds // - MT_Seconds.Location = new System.Drawing.Point(326, 178); - MT_Seconds.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + MT_Seconds.Anchor = System.Windows.Forms.AnchorStyles.Left; + MT_Seconds.Location = new System.Drawing.Point(131, 264); MT_Seconds.Mask = "00"; MT_Seconds.Name = "MT_Seconds"; MT_Seconds.Size = new System.Drawing.Size(25, 25); @@ -313,8 +332,8 @@ private void InitializeComponent() // // MT_Minutes // - MT_Minutes.Location = new System.Drawing.Point(265, 178); - MT_Minutes.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + MT_Minutes.Anchor = System.Windows.Forms.AnchorStyles.Left; + MT_Minutes.Location = new System.Drawing.Point(131, 233); MT_Minutes.Mask = "00"; MT_Minutes.Name = "MT_Minutes"; MT_Minutes.Size = new System.Drawing.Size(25, 25); @@ -324,18 +343,20 @@ private void InitializeComponent() // // L_Hours // - L_Hours.Location = new System.Drawing.Point(100, 178); - L_Hours.Margin = new System.Windows.Forms.Padding(0); + L_Hours.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Hours.AutoSize = true; + L_Hours.Location = new System.Drawing.Point(94, 206); + L_Hours.Margin = new System.Windows.Forms.Padding(3); L_Hours.Name = "L_Hours"; - L_Hours.Size = new System.Drawing.Size(70, 24); + L_Hours.Size = new System.Drawing.Size(31, 17); L_Hours.TabIndex = 26; L_Hours.Text = "Hrs:"; L_Hours.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // MT_Hours // - MT_Hours.Location = new System.Drawing.Point(170, 178); - MT_Hours.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + MT_Hours.Anchor = System.Windows.Forms.AnchorStyles.Left; + MT_Hours.Location = new System.Drawing.Point(131, 202); MT_Hours.Mask = "00000"; MT_Hours.Name = "MT_Hours"; MT_Hours.Size = new System.Drawing.Size(56, 25); @@ -344,18 +365,20 @@ private void InitializeComponent() // // L_Language // - L_Language.Location = new System.Drawing.Point(66, 150); - L_Language.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + L_Language.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Language.AutoSize = true; + L_Language.Location = new System.Drawing.Point(57, 93); + L_Language.Margin = new System.Windows.Forms.Padding(3); L_Language.Name = "L_Language"; - L_Language.Size = new System.Drawing.Size(104, 24); + L_Language.Size = new System.Drawing.Size(68, 17); L_Language.TabIndex = 21; L_Language.Text = "Language:"; L_Language.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // B_MaxCash // - B_MaxCash.Location = new System.Drawing.Point(241, 68); - B_MaxCash.Margin = new System.Windows.Forms.Padding(0); + B_MaxCash.Anchor = System.Windows.Forms.AnchorStyles.Left; + B_MaxCash.Location = new System.Drawing.Point(76, 4); B_MaxCash.Name = "B_MaxCash"; B_MaxCash.Size = new System.Drawing.Size(23, 23); B_MaxCash.TabIndex = 16; @@ -364,25 +387,14 @@ private void InitializeComponent() // // CB_Language // + CB_Language.Anchor = System.Windows.Forms.AnchorStyles.Left; CB_Language.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; CB_Language.FormattingEnabled = true; - CB_Language.Location = new System.Drawing.Point(170, 150); - CB_Language.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CB_Language.Location = new System.Drawing.Point(131, 89); CB_Language.Name = "CB_Language"; - CB_Language.Size = new System.Drawing.Size(120, 25); + CB_Language.Size = new System.Drawing.Size(148, 25); CB_Language.TabIndex = 15; // - // CB_Gender - // - CB_Gender.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - CB_Gender.FormattingEnabled = true; - CB_Gender.Items.AddRange(new object[] { "♂", "♀" }); - CB_Gender.Location = new System.Drawing.Point(298, 13); - CB_Gender.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - CB_Gender.Name = "CB_Gender"; - CB_Gender.Size = new System.Drawing.Size(46, 25); - CB_Gender.TabIndex = 22; - // // TB_MBMS // TB_MBMS.Location = new System.Drawing.Point(0, 0); @@ -632,51 +644,91 @@ private void InitializeComponent() TC_Editor.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); TC_Editor.Name = "TC_Editor"; TC_Editor.SelectedIndex = 0; - TC_Editor.Size = new System.Drawing.Size(496, 307); + TC_Editor.Size = new System.Drawing.Size(611, 335); TC_Editor.TabIndex = 54; // // Tab_Overview // - Tab_Overview.Controls.Add(trainerID1); - Tab_Overview.Controls.Add(CAL_LastSavedDate); - Tab_Overview.Controls.Add(L_LastSaved); - Tab_Overview.Controls.Add(CAL_LastSavedTime); - Tab_Overview.Controls.Add(MT_Hours); - Tab_Overview.Controls.Add(L_Hours); - Tab_Overview.Controls.Add(MT_Minutes); - Tab_Overview.Controls.Add(L_Minutes); - Tab_Overview.Controls.Add(TB_OTName); - Tab_Overview.Controls.Add(CB_Gender); - Tab_Overview.Controls.Add(L_TrainerName); - Tab_Overview.Controls.Add(MT_Money); - Tab_Overview.Controls.Add(L_Money); - Tab_Overview.Controls.Add(L_Language); - Tab_Overview.Controls.Add(CB_Language); - Tab_Overview.Controls.Add(B_MaxCash); - Tab_Overview.Controls.Add(MT_Seconds); - Tab_Overview.Controls.Add(L_Seconds); + Tab_Overview.Controls.Add(tableLayoutPanel1); Tab_Overview.Location = new System.Drawing.Point(4, 26); Tab_Overview.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); Tab_Overview.Name = "Tab_Overview"; Tab_Overview.Padding = new System.Windows.Forms.Padding(5, 4, 5, 4); - Tab_Overview.Size = new System.Drawing.Size(488, 277); + Tab_Overview.Size = new System.Drawing.Size(603, 305); Tab_Overview.TabIndex = 0; Tab_Overview.Text = "Overview"; Tab_Overview.UseVisualStyleBackColor = true; // + // tableLayoutPanel1 + // + tableLayoutPanel1.ColumnCount = 2; + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 128F)); + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + tableLayoutPanel1.Controls.Add(L_TrainerName, 0, 0); + tableLayoutPanel1.Controls.Add(MT_Seconds, 1, 11); + tableLayoutPanel1.Controls.Add(MT_Minutes, 1, 10); + tableLayoutPanel1.Controls.Add(L_Seconds, 0, 11); + tableLayoutPanel1.Controls.Add(L_Hours, 0, 9); + tableLayoutPanel1.Controls.Add(L_Minutes, 0, 10); + tableLayoutPanel1.Controls.Add(MT_Hours, 1, 9); + tableLayoutPanel1.Controls.Add(CAL_LastSavedTime, 1, 7); + tableLayoutPanel1.Controls.Add(CAL_LastSavedDate, 1, 6); + tableLayoutPanel1.Controls.Add(trainerID1, 0, 1); + tableLayoutPanel1.Controls.Add(L_LastSaved, 0, 6); + tableLayoutPanel1.Controls.Add(flowLayoutPanel2, 1, 0); + tableLayoutPanel1.Controls.Add(FLP_Money, 1, 3); + tableLayoutPanel1.Controls.Add(L_Money, 0, 3); + tableLayoutPanel1.Controls.Add(CB_Language, 1, 4); + tableLayoutPanel1.Controls.Add(L_Language, 0, 4); + tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + tableLayoutPanel1.Location = new System.Drawing.Point(5, 4); + tableLayoutPanel1.Name = "tableLayoutPanel1"; + tableLayoutPanel1.RowCount = 13; + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.Size = new System.Drawing.Size(593, 297); + tableLayoutPanel1.TabIndex = 75; + // // trainerID1 // - trainerID1.Location = new System.Drawing.Point(130, 40); - trainerID1.Margin = new System.Windows.Forms.Padding(0); + tableLayoutPanel1.SetColumnSpan(trainerID1, 2); + trainerID1.Dock = System.Windows.Forms.DockStyle.Fill; + trainerID1.Location = new System.Drawing.Point(88, 30); + trainerID1.Margin = new System.Windows.Forms.Padding(88, 0, 0, 0); trainerID1.Name = "trainerID1"; - trainerID1.Size = new System.Drawing.Size(246, 25); + trainerID1.Size = new System.Drawing.Size(593, 25); trainerID1.TabIndex = 74; // + // CAL_LastSavedTime + // + CAL_LastSavedTime.Anchor = System.Windows.Forms.AnchorStyles.Left; + CAL_LastSavedTime.CustomFormat = "HH:mm:ss"; + CAL_LastSavedTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + CAL_LastSavedTime.Location = new System.Drawing.Point(131, 151); + CAL_LastSavedTime.MaxDate = new System.DateTime(2060, 12, 31, 0, 0, 0, 0); + CAL_LastSavedTime.MinDate = new System.DateTime(2000, 1, 1, 0, 0, 0, 0); + CAL_LastSavedTime.Name = "CAL_LastSavedTime"; + CAL_LastSavedTime.ShowUpDown = true; + CAL_LastSavedTime.Size = new System.Drawing.Size(84, 25); + CAL_LastSavedTime.TabIndex = 57; + CAL_LastSavedTime.Value = new System.DateTime(2000, 1, 1, 0, 0, 0, 0); + // // CAL_LastSavedDate // + CAL_LastSavedDate.Anchor = System.Windows.Forms.AnchorStyles.Left; CAL_LastSavedDate.Format = System.Windows.Forms.DateTimePickerFormat.Short; - CAL_LastSavedDate.Location = new System.Drawing.Point(170, 232); - CAL_LastSavedDate.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CAL_LastSavedDate.Location = new System.Drawing.Point(131, 120); CAL_LastSavedDate.MaxDate = new System.DateTime(4095, 12, 31, 0, 0, 0, 0); CAL_LastSavedDate.Name = "CAL_LastSavedDate"; CAL_LastSavedDate.Size = new System.Drawing.Size(120, 25); @@ -685,27 +737,50 @@ private void InitializeComponent() // // L_LastSaved // - L_LastSaved.Location = new System.Drawing.Point(75, 232); - L_LastSaved.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + L_LastSaved.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_LastSaved.AutoSize = true; + L_LastSaved.Location = new System.Drawing.Point(52, 124); + L_LastSaved.Margin = new System.Windows.Forms.Padding(3); L_LastSaved.Name = "L_LastSaved"; - L_LastSaved.Size = new System.Drawing.Size(93, 23); + L_LastSaved.Size = new System.Drawing.Size(73, 17); L_LastSaved.TabIndex = 56; L_LastSaved.Text = "Last Saved:"; L_LastSaved.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // - // CAL_LastSavedTime + // flowLayoutPanel2 // - CAL_LastSavedTime.CustomFormat = "HH:mm:ss"; - CAL_LastSavedTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom; - CAL_LastSavedTime.Location = new System.Drawing.Point(205, 254); - CAL_LastSavedTime.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - CAL_LastSavedTime.MaxDate = new System.DateTime(2060, 12, 31, 0, 0, 0, 0); - CAL_LastSavedTime.MinDate = new System.DateTime(2000, 1, 1, 0, 0, 0, 0); - CAL_LastSavedTime.Name = "CAL_LastSavedTime"; - CAL_LastSavedTime.ShowUpDown = true; - CAL_LastSavedTime.Size = new System.Drawing.Size(84, 25); - CAL_LastSavedTime.TabIndex = 57; - CAL_LastSavedTime.Value = new System.DateTime(2000, 1, 1, 0, 0, 0, 0); + flowLayoutPanel2.AutoSize = true; + flowLayoutPanel2.Controls.Add(TB_OTName); + flowLayoutPanel2.Controls.Add(CB_Gender); + flowLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill; + flowLayoutPanel2.Location = new System.Drawing.Point(128, 0); + flowLayoutPanel2.Margin = new System.Windows.Forms.Padding(0); + flowLayoutPanel2.Name = "flowLayoutPanel2"; + flowLayoutPanel2.Size = new System.Drawing.Size(553, 30); + flowLayoutPanel2.TabIndex = 77; + // + // CB_Gender + // + CB_Gender.AllowClick = true; + CB_Gender.BackgroundImage = (System.Drawing.Image)resources.GetObject("CB_Gender.BackgroundImage"); + CB_Gender.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + CB_Gender.Gender = 2; + CB_Gender.Location = new System.Drawing.Point(129, 3); + CB_Gender.Name = "CB_Gender"; + CB_Gender.Size = new System.Drawing.Size(24, 24); + CB_Gender.TabIndex = 76; + // + // FLP_Money + // + FLP_Money.AutoSize = true; + FLP_Money.Controls.Add(MT_Money); + FLP_Money.Controls.Add(B_MaxCash); + FLP_Money.Dock = System.Windows.Forms.DockStyle.Fill; + FLP_Money.Location = new System.Drawing.Point(128, 55); + FLP_Money.Margin = new System.Windows.Forms.Padding(0); + FLP_Money.Name = "FLP_Money"; + FLP_Money.Size = new System.Drawing.Size(553, 31); + FLP_Money.TabIndex = 78; // // Tab_MiscValues // @@ -723,7 +798,7 @@ private void InitializeComponent() Tab_MiscValues.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); Tab_MiscValues.Name = "Tab_MiscValues"; Tab_MiscValues.Padding = new System.Windows.Forms.Padding(5, 4, 5, 4); - Tab_MiscValues.Size = new System.Drawing.Size(488, 277); + Tab_MiscValues.Size = new System.Drawing.Size(603, 305); Tab_MiscValues.TabIndex = 4; Tab_MiscValues.Text = "Misc"; Tab_MiscValues.UseVisualStyleBackColor = true; @@ -962,7 +1037,7 @@ private void InitializeComponent() Tab_Images.Location = new System.Drawing.Point(4, 26); Tab_Images.Name = "Tab_Images"; Tab_Images.Padding = new System.Windows.Forms.Padding(3); - Tab_Images.Size = new System.Drawing.Size(488, 277); + Tab_Images.Size = new System.Drawing.Size(603, 305); Tab_Images.TabIndex = 5; Tab_Images.Text = "Images"; Tab_Images.UseVisualStyleBackColor = true; @@ -976,7 +1051,7 @@ private void InitializeComponent() FLP_Images.Dock = System.Windows.Forms.DockStyle.Fill; FLP_Images.Location = new System.Drawing.Point(3, 3); FLP_Images.Name = "FLP_Images"; - FLP_Images.Size = new System.Drawing.Size(482, 271); + FLP_Images.Size = new System.Drawing.Size(597, 299); FLP_Images.TabIndex = 0; // // P_Picture1 @@ -1025,11 +1100,32 @@ private void InitializeComponent() Tab_DLC.Location = new System.Drawing.Point(4, 26); Tab_DLC.Name = "Tab_DLC"; Tab_DLC.Padding = new System.Windows.Forms.Padding(3); - Tab_DLC.Size = new System.Drawing.Size(488, 277); + Tab_DLC.Size = new System.Drawing.Size(603, 305); Tab_DLC.TabIndex = 6; Tab_DLC.Text = "DLC"; Tab_DLC.UseVisualStyleBackColor = true; // + // TB_StreetName + // + TB_StreetName.Font = new System.Drawing.Font("Courier New", 8.25F); + TB_StreetName.Location = new System.Drawing.Point(254, 39); + TB_StreetName.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TB_StreetName.MaxLength = 18; + TB_StreetName.Name = "TB_StreetName"; + TB_StreetName.Size = new System.Drawing.Size(145, 20); + TB_StreetName.TabIndex = 92; + TB_StreetName.Text = "WWWWWWWWWWWWWWWWWW"; + // + // L_StreetName + // + L_StreetName.Location = new System.Drawing.Point(9, 35); + L_StreetName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + L_StreetName.Name = "L_StreetName"; + L_StreetName.Size = new System.Drawing.Size(241, 24); + L_StreetName.TabIndex = 93; + L_StreetName.Text = "Street Name:"; + L_StreetName.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // // L_HyperspaceSurveyPoints // L_HyperspaceSurveyPoints.Location = new System.Drawing.Point(5, 3); @@ -1061,34 +1157,23 @@ private void InitializeComponent() B_HyperspaceSurveyPoints.Text = "+"; B_HyperspaceSurveyPoints.UseVisualStyleBackColor = true; // - // TB_StreetName + // flowLayoutPanel1 // - TB_StreetName.Font = new System.Drawing.Font("Courier New", 8.25F); - TB_StreetName.Location = new System.Drawing.Point(254, 39); - TB_StreetName.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - TB_StreetName.MaxLength = 18; - TB_StreetName.Name = "TB_StreetName"; - TB_StreetName.Size = new System.Drawing.Size(145, 20); - TB_StreetName.TabIndex = 92; - TB_StreetName.Text = "WWWWWWWWWWWWWWWWWW"; - // - // L_StreetName - // - L_StreetName.Location = new System.Drawing.Point(9, 35); - L_StreetName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - L_StreetName.Name = "L_StreetName"; - L_StreetName.Size = new System.Drawing.Size(241, 24); - L_StreetName.TabIndex = 93; - L_StreetName.Text = "Street Name:"; - L_StreetName.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + flowLayoutPanel1.Controls.Add(B_Save); + flowLayoutPanel1.Controls.Add(B_Cancel); + flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Bottom; + flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft; + flowLayoutPanel1.Location = new System.Drawing.Point(0, 338); + flowLayoutPanel1.Name = "flowLayoutPanel1"; + flowLayoutPanel1.Size = new System.Drawing.Size(611, 43); + flowLayoutPanel1.TabIndex = 55; // // SAV_Trainer9a // AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; - ClientSize = new System.Drawing.Size(496, 353); + ClientSize = new System.Drawing.Size(611, 381); + Controls.Add(flowLayoutPanel1); Controls.Add(TC_Editor); - Controls.Add(B_Save); - Controls.Add(B_Cancel); Icon = Properties.Resources.Icon; Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); MaximizeBox = false; @@ -1098,7 +1183,12 @@ private void InitializeComponent() Text = "Trainer Data Editor"; TC_Editor.ResumeLayout(false); Tab_Overview.ResumeLayout(false); - Tab_Overview.PerformLayout(); + tableLayoutPanel1.ResumeLayout(false); + tableLayoutPanel1.PerformLayout(); + flowLayoutPanel2.ResumeLayout(false); + flowLayoutPanel2.PerformLayout(); + FLP_Money.ResumeLayout(false); + FLP_Money.PerformLayout(); Tab_MiscValues.ResumeLayout(false); Tab_MiscValues.PerformLayout(); GB_Map.ResumeLayout(false); @@ -1114,6 +1204,8 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)P_Picture3).EndInit(); Tab_DLC.ResumeLayout(false); Tab_DLC.PerformLayout(); + flowLayoutPanel1.ResumeLayout(false); + flowLayoutPanel1.PerformLayout(); ResumeLayout(false); } @@ -1152,7 +1244,6 @@ private void InitializeComponent() private System.Windows.Forms.Label L_DoublesC; private System.Windows.Forms.Label L_SinglesC; private System.Windows.Forms.Label L_Language; - private System.Windows.Forms.ComboBox CB_Gender; private System.Windows.Forms.MaskedTextBox TB_MBMS; private System.Windows.Forms.MaskedTextBox TB_MBMN; private System.Windows.Forms.MaskedTextBox TB_MBRS; @@ -1217,5 +1308,10 @@ private void InitializeComponent() private System.Windows.Forms.Button B_HyperspaceSurveyPoints; private System.Windows.Forms.TextBox TB_StreetName; private System.Windows.Forms.Label L_StreetName; + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel2; + private Controls.GenderToggle CB_Gender; + private System.Windows.Forms.FlowLayoutPanel FLP_Money; } } diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen9/SAV_Trainer9a.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen9/SAV_Trainer9a.cs index b1c2062d9..d4e450dad 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen9/SAV_Trainer9a.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen9/SAV_Trainer9a.cs @@ -29,9 +29,6 @@ public SAV_Trainer9a(SAV9ZA sav) B_RoyaleInfiniteMax.Click += (_, _) => MT_RoyaleInfinite.Text = 50_000.ToString(); B_HyperspaceSurveyPoints.Click += (_, _) => MT_HyperspaceSurveyPoints.Text = 100_000.ToString(); - CB_Gender.Items.Clear(); - CB_Gender.Items.AddRange(Main.GenderSymbols.Take(2).ToArray()); // m/f depending on unicode selection - GetImages(); GetComboBoxes(); GetTextBoxes(); @@ -107,11 +104,11 @@ private void GetComboBoxes() private void GetTextBoxes() { // Get Data - CB_Gender.SelectedIndex = SAV.Gender; + CB_Gender.Gender = SAV.Gender; // Display Data TB_OTName.Text = SAV.OT; - trainerID1.LoadIDValues(SAV, SAV.Generation); + trainerID1.LoadTrainer(SAV); MT_Money.Text = SAV.Money.ToString(); CB_Language.SelectedValue = SAV.Language; @@ -165,9 +162,9 @@ private void SaveMap() private void SaveTrainerInfo() { - if (SAV.Gender != (byte)CB_Gender.SelectedIndex) + if (SAV.Gender != CB_Gender.Gender) { - SAV.Gender = (byte)CB_Gender.SelectedIndex; + SAV.Gender = CB_Gender.Gender; SAV.PlayerFashion.Reset(); } diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_Chatter.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_Chatter.Designer.cs index aac16eba3..71cdc727c 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_Chatter.Designer.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_Chatter.Designer.cs @@ -37,15 +37,17 @@ private void InitializeComponent() CHK_Initialized = new System.Windows.Forms.CheckBox(); B_ExportWAV = new System.Windows.Forms.Button(); B_PlayRecording = new System.Windows.Forms.Button(); + tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + tableLayoutPanel1.SuspendLayout(); SuspendLayout(); // // B_Save // - B_Save.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; - B_Save.Location = new System.Drawing.Point(157, 135); - B_Save.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + B_Save.Anchor = System.Windows.Forms.AnchorStyles.Right; + B_Save.Location = new System.Drawing.Point(159, 130); + B_Save.Margin = new System.Windows.Forms.Padding(4); B_Save.Name = "B_Save"; - B_Save.Size = new System.Drawing.Size(120, 27); + B_Save.Size = new System.Drawing.Size(121, 27); B_Save.TabIndex = 26; B_Save.Text = "Save"; B_Save.UseVisualStyleBackColor = true; @@ -53,11 +55,12 @@ private void InitializeComponent() // // B_Cancel // - B_Cancel.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; - B_Cancel.Location = new System.Drawing.Point(29, 135); - B_Cancel.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + B_Cancel.Anchor = System.Windows.Forms.AnchorStyles.Right; + tableLayoutPanel1.SetColumnSpan(B_Cancel, 3); + B_Cancel.Location = new System.Drawing.Point(30, 130); + B_Cancel.Margin = new System.Windows.Forms.Padding(4); B_Cancel.Name = "B_Cancel"; - B_Cancel.Size = new System.Drawing.Size(120, 27); + B_Cancel.Size = new System.Drawing.Size(121, 27); B_Cancel.TabIndex = 25; B_Cancel.Text = "Cancel"; B_Cancel.UseVisualStyleBackColor = true; @@ -65,11 +68,12 @@ private void InitializeComponent() // // B_ImportPCM // - B_ImportPCM.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - B_ImportPCM.Location = new System.Drawing.Point(157, 12); - B_ImportPCM.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + B_ImportPCM.Anchor = System.Windows.Forms.AnchorStyles.Right; + B_ImportPCM.AutoSize = true; + B_ImportPCM.Location = new System.Drawing.Point(159, 4); + B_ImportPCM.Margin = new System.Windows.Forms.Padding(4); B_ImportPCM.Name = "B_ImportPCM"; - B_ImportPCM.Size = new System.Drawing.Size(120, 27); + B_ImportPCM.Size = new System.Drawing.Size(121, 27); B_ImportPCM.TabIndex = 27; B_ImportPCM.Text = "Import .pcm"; B_ImportPCM.UseVisualStyleBackColor = true; @@ -77,11 +81,12 @@ private void InitializeComponent() // // B_ExportPCM // - B_ExportPCM.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - B_ExportPCM.Location = new System.Drawing.Point(157, 45); - B_ExportPCM.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + B_ExportPCM.Anchor = System.Windows.Forms.AnchorStyles.Right; + B_ExportPCM.AutoSize = true; + B_ExportPCM.Location = new System.Drawing.Point(159, 39); + B_ExportPCM.Margin = new System.Windows.Forms.Padding(4); B_ExportPCM.Name = "B_ExportPCM"; - B_ExportPCM.Size = new System.Drawing.Size(120, 27); + B_ExportPCM.Size = new System.Drawing.Size(121, 27); B_ExportPCM.TabIndex = 28; B_ExportPCM.Text = "Export .pcm"; B_ExportPCM.UseVisualStyleBackColor = true; @@ -89,8 +94,10 @@ private void InitializeComponent() // // MT_Confusion // + MT_Confusion.Anchor = System.Windows.Forms.AnchorStyles.Left; + tableLayoutPanel1.SetColumnSpan(MT_Confusion, 2); MT_Confusion.Enabled = false; - MT_Confusion.Location = new System.Drawing.Point(104, 79); + MT_Confusion.Location = new System.Drawing.Point(94, 75); MT_Confusion.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); MT_Confusion.Mask = "000"; MT_Confusion.Name = "MT_Confusion"; @@ -100,20 +107,22 @@ private void InitializeComponent() // // L_Confusion // - L_Confusion.Location = new System.Drawing.Point(13, 79); - L_Confusion.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + L_Confusion.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_Confusion.AutoSize = true; + L_Confusion.Location = new System.Drawing.Point(3, 79); + L_Confusion.Margin = new System.Windows.Forms.Padding(3); L_Confusion.Name = "L_Confusion"; - L_Confusion.Size = new System.Drawing.Size(83, 23); + L_Confusion.Size = new System.Drawing.Size(84, 17); L_Confusion.TabIndex = 64; L_Confusion.Text = "Confusion %:"; L_Confusion.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // CHK_Initialized // - CHK_Initialized.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; CHK_Initialized.AutoSize = true; - CHK_Initialized.Location = new System.Drawing.Point(15, 50); - CHK_Initialized.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + tableLayoutPanel1.SetColumnSpan(CHK_Initialized, 2); + CHK_Initialized.Location = new System.Drawing.Point(8, 39); + CHK_Initialized.Margin = new System.Windows.Forms.Padding(8, 4, 4, 4); CHK_Initialized.Name = "CHK_Initialized"; CHK_Initialized.Size = new System.Drawing.Size(81, 21); CHK_Initialized.TabIndex = 66; @@ -123,11 +132,12 @@ private void InitializeComponent() // // B_ExportWAV // - B_ExportWAV.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - B_ExportWAV.Location = new System.Drawing.Point(157, 79); - B_ExportWAV.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + B_ExportWAV.Anchor = System.Windows.Forms.AnchorStyles.Right; + B_ExportWAV.AutoSize = true; + B_ExportWAV.Location = new System.Drawing.Point(159, 74); + B_ExportWAV.Margin = new System.Windows.Forms.Padding(4); B_ExportWAV.Name = "B_ExportWAV"; - B_ExportWAV.Size = new System.Drawing.Size(120, 27); + B_ExportWAV.Size = new System.Drawing.Size(121, 27); B_ExportWAV.TabIndex = 67; B_ExportWAV.Text = "Export .wav"; B_ExportWAV.UseVisualStyleBackColor = true; @@ -135,9 +145,9 @@ private void InitializeComponent() // // B_PlayRecording // - B_PlayRecording.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - B_PlayRecording.Location = new System.Drawing.Point(13, 12); - B_PlayRecording.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + tableLayoutPanel1.SetColumnSpan(B_PlayRecording, 3); + B_PlayRecording.Location = new System.Drawing.Point(4, 4); + B_PlayRecording.Margin = new System.Windows.Forms.Padding(4); B_PlayRecording.Name = "B_PlayRecording"; B_PlayRecording.Size = new System.Drawing.Size(120, 27); B_PlayRecording.TabIndex = 68; @@ -145,30 +155,51 @@ private void InitializeComponent() B_PlayRecording.UseVisualStyleBackColor = true; B_PlayRecording.Click += B_PlayRecording_Click; // + // tableLayoutPanel1 + // + tableLayoutPanel1.ColumnCount = 4; + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + tableLayoutPanel1.Controls.Add(B_PlayRecording, 0, 0); + tableLayoutPanel1.Controls.Add(CHK_Initialized, 0, 1); + tableLayoutPanel1.Controls.Add(L_Confusion, 0, 2); + tableLayoutPanel1.Controls.Add(MT_Confusion, 1, 2); + tableLayoutPanel1.Controls.Add(B_ImportPCM, 3, 0); + tableLayoutPanel1.Controls.Add(B_ExportPCM, 3, 1); + tableLayoutPanel1.Controls.Add(B_ExportWAV, 3, 2); + tableLayoutPanel1.Controls.Add(B_Save, 3, 4); + tableLayoutPanel1.Controls.Add(B_Cancel, 0, 4); + tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + tableLayoutPanel1.Name = "tableLayoutPanel1"; + tableLayoutPanel1.RowCount = 5; + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.Size = new System.Drawing.Size(284, 161); + tableLayoutPanel1.TabIndex = 69; + // // SAV_Chatter // AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; - ClientSize = new System.Drawing.Size(290, 173); - Controls.Add(B_PlayRecording); - Controls.Add(B_ExportWAV); - Controls.Add(CHK_Initialized); - Controls.Add(MT_Confusion); - Controls.Add(L_Confusion); - Controls.Add(B_ExportPCM); - Controls.Add(B_ImportPCM); - Controls.Add(B_Cancel); - Controls.Add(B_Save); + ClientSize = new System.Drawing.Size(284, 161); + Controls.Add(tableLayoutPanel1); FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; Icon = Properties.Resources.Icon; Margin = new System.Windows.Forms.Padding(2); MaximizeBox = false; MinimizeBox = false; - MinimumSize = new System.Drawing.Size(306, 212); + MinimumSize = new System.Drawing.Size(300, 200); Name = "SAV_Chatter"; StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; Text = "Chatter Editor"; + tableLayoutPanel1.ResumeLayout(false); + tableLayoutPanel1.PerformLayout(); ResumeLayout(false); - PerformLayout(); } #endregion @@ -181,5 +212,6 @@ private void InitializeComponent() private System.Windows.Forms.CheckBox CHK_Initialized; private System.Windows.Forms.Button B_ExportWAV; private System.Windows.Forms.Button B_PlayRecording; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; } } diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs index adecab1a9..0cbf5cc11 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs @@ -175,9 +175,7 @@ private static DoubleBufferedDataGridView GetBaseDataGrid(InventoryPouch pouch) SelectionMode = DataGridViewSelectionMode.FullRowSelect, CellBorderStyle = DataGridViewCellBorderStyle.Single, - RowTemplate = { Height = 24 }, Tag = pouch, - RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single, }; private static DataGridViewImageColumn GetSpriteColumn() => new() From bbef47e0bd02e2b54411ac7de4b886342dee4c56 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 14 Jun 2026 13:47:18 -0500 Subject: [PATCH 80/81] Localize StatNature => Stat Alignment bulbapedia's Contest Stat nature amp table for neutral natures is wrong lol https://bulbapedia.bulbagarden.net/wiki/Contest_condition#Natures --- .../BattleTemplate/Showdown/ShowdownSet.cs | 8 +- PKHeX.Core/Editing/Bulk/Entity/BatchMods.cs | 4 +- PKHeX.Core/Editing/CommonEdits.cs | 6 +- PKHeX.Core/Editing/NatureAmp.cs | 36 +++++-- PKHeX.Core/Editing/PKM/EntitySummary.cs | 2 +- .../Program/Settings/SetImportSettings.cs | 5 +- PKHeX.Core/Editing/Program/StartupUtil.cs | 2 +- .../Templates/GO/EncounterSlot7GO.cs | 2 +- .../Templates/GO/EncounterSlot8GO.cs | 2 +- .../Templates/Gen6/EncounterEgg6.cs | 2 +- .../Templates/Gen7/EncounterEgg7.cs | 2 +- .../Templates/Gen8/EncounterEgg8.cs | 2 +- .../Templates/Gen8/EncounterSlot8.cs | 2 +- .../Templates/Gen8/EncounterStatic8.cs | 2 +- .../Templates/Gen8/EncounterTrade8.cs | 2 +- .../Templates/Gen8b/EncounterEgg8b.cs | 2 +- .../Templates/Gen8b/EncounterSlot8b.cs | 2 +- .../Templates/Gen8b/EncounterTrade8b.cs | 2 +- .../Templates/Gen9/EncounterEgg9.cs | 2 +- .../Templates/Gen9/EncounterFixed9.cs | 2 +- .../Templates/Gen9/EncounterOutbreak9.cs | 2 +- .../Templates/Gen9/EncounterSlot9.cs | 2 +- .../Templates/Gen9/EncounterStatic9.cs | 2 +- .../Templates/Gen9/EncounterTrade9.cs | 4 +- .../Templates/Gen9a/EncounterTrade9a.cs | 2 +- .../Encounters/Templates/Gen9a/LumioseRNG.cs | 2 +- .../Localization/LegalityCheckLocalization.cs | 4 +- .../LegalityCheckResultCodeExtensions.cs | 2 +- .../Legality/RNG/Methods/Gen8/RaidRNG.cs | 8 +- .../RNG/Methods/Gen8a/Overworld8aRNG.cs | 2 +- .../RNG/Methods/Gen8b/Roaming8bRNG.cs | 2 +- .../Legality/RNG/Methods/Gen8b/Wild8bRNG.cs | 2 +- .../RNG/Methods/Gen9/Encounter9RNG.cs | 2 +- .../Structures/LegalityCheckResultCode.cs | 2 +- .../Legality/Verifiers/Egg/EggVerifier.cs | 2 +- .../Verifiers/Misc/ContestStatInfo.cs | 12 +-- .../Verifiers/Misc/MiscVerifierHelpers.cs | 12 +-- .../Verifiers/Misc/MiscVerifierPA8.cs | 2 +- .../Verifiers/Misc/MiscVerifierPA9.cs | 2 +- .../Verifiers/Misc/MiscVerifierPB8.cs | 2 +- .../Verifiers/Misc/MiscVerifierPK8.cs | 2 +- .../Verifiers/Misc/MiscVerifierPK9.cs | 2 +- PKHeX.Core/MysteryGifts/WA8.cs | 2 +- PKHeX.Core/MysteryGifts/WA9.cs | 2 +- PKHeX.Core/MysteryGifts/WB8.cs | 2 +- PKHeX.Core/MysteryGifts/WC8.cs | 2 +- PKHeX.Core/MysteryGifts/WC9.cs | 2 +- PKHeX.Core/PKM/HOME/GameDataCore.cs | 6 +- PKHeX.Core/PKM/HOME/PKH.cs | 2 +- PKHeX.Core/PKM/PA8.cs | 4 +- PKHeX.Core/PKM/PA9.cs | 2 +- PKHeX.Core/PKM/PK9.cs | 2 +- PKHeX.Core/PKM/PKM.cs | 6 +- PKHeX.Core/PKM/Searching/SearchSettings.cs | 2 +- PKHeX.Core/PKM/Shared/G8PKM.cs | 2 +- .../localize/legality/legality_de.json | 4 +- .../localize/legality/legality_en.json | 4 +- .../localize/legality/legality_es-419.json | 4 +- .../localize/legality/legality_es.json | 4 +- .../localize/legality/legality_fr.json | 4 +- .../localize/legality/legality_it.json | 8 +- .../localize/legality/legality_ja.json | 4 +- .../localize/legality/legality_ko.json | 4 +- .../localize/legality/legality_zh-hans.json | 4 +- .../localize/legality/legality_zh-hant.json | 4 +- .../Controls/PKM Editor/ExperienceBar.cs | 10 +- .../Controls/PKM Editor/LoadSave.cs | 20 ++-- .../Controls/PKM Editor/PKMEditor.Designer.cs | 94 +++++++++---------- .../Controls/PKM Editor/PKMEditor.cs | 22 ++--- .../Controls/PKM Editor/StatEditor.cs | 2 +- PKHeX.WinForms/Resources/text/lang_de.txt | 4 +- PKHeX.WinForms/Resources/text/lang_en.txt | 4 +- PKHeX.WinForms/Resources/text/lang_es-419.txt | 4 +- PKHeX.WinForms/Resources/text/lang_es.txt | 4 +- PKHeX.WinForms/Resources/text/lang_fr.txt | 4 +- PKHeX.WinForms/Resources/text/lang_it.txt | 4 +- PKHeX.WinForms/Resources/text/lang_ja.txt | 4 +- PKHeX.WinForms/Resources/text/lang_ko.txt | 4 +- .../Resources/text/lang_zh-Hans.txt | 4 +- .../Resources/text/lang_zh-Hant.txt | 4 +- 80 files changed, 233 insertions(+), 198 deletions(-) diff --git a/PKHeX.Core/Editing/BattleTemplate/Showdown/ShowdownSet.cs b/PKHeX.Core/Editing/BattleTemplate/Showdown/ShowdownSet.cs index b05c2b32e..c8249051f 100644 --- a/PKHeX.Core/Editing/BattleTemplate/Showdown/ShowdownSet.cs +++ b/PKHeX.Core/Editing/BattleTemplate/Showdown/ShowdownSet.cs @@ -623,8 +623,8 @@ private void AddEVs(List result, in BattleTemplateExportSettings setting var nameEVs = cfg.GetStatDisplay(settings.StatsEVs); var line = token switch { - BattleTemplateToken.EVsWithNature => GetStringStatsNatureAmp(EVs, 0, nameEVs, Nature), - BattleTemplateToken.EVsAppendNature => GetStringStatsNatureAmp(EVs, 0, nameEVs, Nature), + BattleTemplateToken.EVsWithNature => GetStringStatsStatAlignmentAmp(EVs, 0, nameEVs, Nature), + BattleTemplateToken.EVsAppendNature => GetStringStatsStatAlignmentAmp(EVs, 0, nameEVs, Nature), _ => GetStringStats(EVs, 0, nameEVs), }; if (token is BattleTemplateToken.EVsAppendNature && Nature.IsFixed) @@ -654,7 +654,7 @@ private static string GetAbilityHeldItem(GameStrings strings, int ability, int i /// /// Appends the nature amplification to the stat values, if not a neutral nature. - public static string GetStringStatsNatureAmp(ReadOnlySpan stats, T ignoreValue, StatDisplayConfig statNames, Nature nature) where T : IEquatable + public static string GetStringStatsStatAlignmentAmp(ReadOnlySpan stats, T ignoreValue, StatDisplayConfig statNames, Nature nature) where T : IEquatable { var (plus, minus) = nature.GetNatureModification(); if (plus == minus) @@ -806,7 +806,7 @@ public ShowdownSet(PKM pk, BattleTemplateLocalization? localization = null) if (Moves.Contains((ushort)Move.HiddenPower)) HiddenPowerType = (sbyte)HiddenPower.GetType(IVs, Context); - Nature = pk.StatNature; + Nature = pk.StatAlignment; Gender = pk.Gender < 2 ? pk.Gender : (byte)2; Friendship = pk.CurrentFriendship; Level = pk.CurrentLevel; diff --git a/PKHeX.Core/Editing/Bulk/Entity/BatchMods.cs b/PKHeX.Core/Editing/Bulk/Entity/BatchMods.cs index 9db627c63..67830b48c 100644 --- a/PKHeX.Core/Editing/Bulk/Entity/BatchMods.cs +++ b/PKHeX.Core/Editing/Bulk/Entity/BatchMods.cs @@ -28,8 +28,8 @@ public static class BatchMods new TypeSuggestion(nameof(PKM.EggMetDate), p => p.EggMetDate = p.MetDate), new TypeSuggestion(nameof(PKM.MetDate), p => p.MetDate = p.EggMetDate), - new TypeSuggestion(nameof(PKM.Nature), p => p.Format >= 8, p => p.Nature = p.StatNature), - new TypeSuggestion(nameof(PKM.StatNature), p => p.Format >= 8, p => p.StatNature = p.Nature), + new TypeSuggestion(nameof(PKM.Nature), p => p.Format >= 8, p => p.Nature = p.StatAlignment), + new TypeSuggestion(nameof(PKM.StatAlignment), p => p.Format >= 8, p => p.StatAlignment = p.Nature), new TypeSuggestion(nameof(PKM.Stats), p => p.ResetPartyStats()), new TypeSuggestion(nameof(PKM.Ball), p => BallApplicator.ApplyBallLegalByColor(p)), new TypeSuggestion(nameof(PKM.Heal), p => p.Heal()), diff --git a/PKHeX.Core/Editing/CommonEdits.cs b/PKHeX.Core/Editing/CommonEdits.cs index 5856cfbd4..3dd887990 100644 --- a/PKHeX.Core/Editing/CommonEdits.cs +++ b/PKHeX.Core/Editing/CommonEdits.cs @@ -13,7 +13,7 @@ public static class CommonEdits public static bool ShowdownSetIVMarkings { get; set; } = true; /// - /// Setting which causes the to the in Gen8+ formats. + /// Setting which causes the to the in Gen8+ formats. /// public static bool ShowdownSetBehaviorNature { get; set; } @@ -144,7 +144,7 @@ public void SetNature(Nature nature) var format = pk.Format; if (format >= 8) - pk.StatNature = nature; + pk.StatAlignment = nature; else if (format is 3 or 4) pk.SetPIDNature(nature); else @@ -250,7 +250,7 @@ public void ApplySetDetails(IBattleTemplate set) s.SetMoveShopFlags(set.Moves, pk); if (ShowdownSetBehaviorNature && pk.Format >= 8) - pk.Nature = pk.StatNature; + pk.Nature = pk.StatAlignment; var legal = new LegalityAnalysis(pk); if (pk is ITechRecord t) diff --git a/PKHeX.Core/Editing/NatureAmp.cs b/PKHeX.Core/Editing/NatureAmp.cs index 486ef706b..c2af8dee1 100644 --- a/PKHeX.Core/Editing/NatureAmp.cs +++ b/PKHeX.Core/Editing/NatureAmp.cs @@ -13,7 +13,7 @@ public static class NatureAmp /// /// Mutate the nature amp indexes to match the request /// - /// Stat Index to mutate + /// Stat Index to mutate, internal order /// Current nature to derive the current amps from /// New nature value public Nature GetNewNature(int statIndex, Nature currentNature) @@ -26,6 +26,9 @@ public Nature GetNewNature(int statIndex, Nature currentNature) return type.GetNewNature(statIndex, up, dn); } + /// Stat Index to mutate, internal order + /// Current increased stat index, internal order + /// Current decreased stat index, internal order /// public Nature GetNewNature(int statIndex, int up, int dn) { @@ -54,6 +57,7 @@ public Nature GetNewNature(int statIndex, int up, int dn) /// /// Decompose the nature to the two stat indexes that are modified /// + /// Tuple containing the increased and decreased stat indexes, internal order public (int up, int dn) GetNatureModification() { var up = ((byte)nature / 5); @@ -71,8 +75,8 @@ public bool IsNeutralOrInvalid() /// /// Checks if the nature is out of range or the stat amplifications are not neutral. /// - /// Increased stat - /// Decreased stat + /// Increased stat, internal order + /// Decreased stat, internal order /// True if nature modification values are equal or the Nature is out of range. public bool IsNeutralOrInvalid(int up, int dn) { @@ -83,7 +87,7 @@ public bool IsNeutralOrInvalid(int up, int dn) /// Updates stats according to the specified nature. ///
/// Current stats to amplify if appropriate - public void ModifyStatsForNature(Span stats) + public void ModifyStatsForAlignment(Span stats) { var (up, dn) = nature.GetNatureModification(); if (nature.IsNeutralOrInvalid(up, dn)) @@ -99,8 +103,8 @@ public void ModifyStatsForNature(Span stats) /// /// Recombine the stat amps into a nature value. /// - /// Increased stat - /// Decreased stat + /// Increased stat, internal order + /// Decreased stat, internal order /// Nature public static Nature CreateNatureFromAmps(int up, int dn) { @@ -110,7 +114,7 @@ public static Nature CreateNatureFromAmps(int up, int dn) } /// - /// Nature Amplification Table + /// Nature / Stat Alignment Amplification Table, speed last (visual order). /// /// -1 is 90%, 0 is 100%, 1 is 110%. public static ReadOnlySpan Table => @@ -145,6 +149,13 @@ public static Nature CreateNatureFromAmps(int up, int dn) private const byte NatureCount = 25; private const int AmpWidth = 5; + /// + /// Amplify the stat according to the nature. If the nature is out of range, it will be treated as neutral. + /// + /// Nature to use for amplification + /// Stat index to amplify (0-4), visual index + /// Initial stat value + /// Amplified stat value public static int AmplifyStat(Nature nature, int index, int initial) => GetNatureAmp(nature, index) switch { 1 => 110 * initial / 100, // 110% @@ -152,6 +163,12 @@ public static Nature CreateNatureFromAmps(int up, int dn) _ => initial, }; + /// + /// Get the nature amp for the specified stat index. If the nature is out of range, it will be treated as neutral. + /// + /// Nature to use for amplification + /// Stat index to amplify (0-4), visual index + /// Nature amp value: 1 for 110%, -1 for 90%, 0 for 100%. private static sbyte GetNatureAmp(Nature nature, int index) { if ((uint)nature >= NatureCount) @@ -160,6 +177,11 @@ private static sbyte GetNatureAmp(Nature nature, int index) return amps[index]; } + /// + /// Get the nature amps for all stats. If the nature is out of range, it will be treated as neutral. + /// + /// Nature to use for amplification + /// ReadOnlySpan of stat amps for all stats (visual order) public static ReadOnlySpan GetAmps(Nature nature) { if ((uint)nature >= NatureCount) diff --git a/PKHeX.Core/Editing/PKM/EntitySummary.cs b/PKHeX.Core/Editing/PKM/EntitySummary.cs index e1efd943e..d51a423af 100644 --- a/PKHeX.Core/Editing/PKM/EntitySummary.cs +++ b/PKHeX.Core/Editing/PKM/EntitySummary.cs @@ -19,7 +19,7 @@ public class EntitySummary : IFatefulEncounterReadOnly // do NOT seal, allow inh public virtual string Position => "???"; public string Nickname => Entity.Nickname; public string Species => Get(Strings.specieslist, Entity.Species); - public string Nature => Get(Strings.natures, (byte)Entity.StatNature); + public string Nature => Get(Strings.natures, (byte)Entity.StatAlignment); public string Gender => Get(GenderSymbols, Entity.Gender); public string ESV => Entity.PSV.ToString("0000"); public string HP_Type => GetSpan(Strings.HiddenPowerTypes, Entity.HPType); diff --git a/PKHeX.Core/Editing/Program/Settings/SetImportSettings.cs b/PKHeX.Core/Editing/Program/Settings/SetImportSettings.cs index f49e3f793..b5f3309a3 100644 --- a/PKHeX.Core/Editing/Program/Settings/SetImportSettings.cs +++ b/PKHeX.Core/Editing/Program/Settings/SetImportSettings.cs @@ -2,8 +2,9 @@ namespace PKHeX.Core; public sealed class SetImportSettings { - [LocalizedDescription("Apply StatNature to Nature on Import")] - public bool ApplyNature { get; set; } = true; + [LocalizedDescription("Apply Stat Alignment to Nature on Import")] + public bool ApplyStatAlignment { get; set; } = true; + [LocalizedDescription("Apply Markings on Import")] public bool ApplyMarkings { get; set; } = true; } diff --git a/PKHeX.Core/Editing/Program/StartupUtil.cs b/PKHeX.Core/Editing/Program/StartupUtil.cs index b87c61ae0..da2397ec7 100644 --- a/PKHeX.Core/Editing/Program/StartupUtil.cs +++ b/PKHeX.Core/Editing/Program/StartupUtil.cs @@ -23,7 +23,7 @@ public static void ReloadSettings(IProgramSettings settings) SaveFile.SetUpdatePKM = write.SetUpdatePKM ? EntityImportOption.Enable : EntityImportOption.Disable; SaveFile.SetUpdateRecords = write.SetUpdateRecords ? EntityImportOption.Enable : EntityImportOption.Disable; CommonEdits.ShowdownSetIVMarkings = settings.Import.ApplyMarkings; - CommonEdits.ShowdownSetBehaviorNature = settings.Import.ApplyNature; + CommonEdits.ShowdownSetBehaviorNature = settings.Import.ApplyStatAlignment; ParseSettings.Initialize(settings.Legality); var converter = settings.Converter; diff --git a/PKHeX.Core/Legality/Encounters/Templates/GO/EncounterSlot7GO.cs b/PKHeX.Core/Legality/Encounters/Templates/GO/EncounterSlot7GO.cs index 7d73b3755..9cb1e0254 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/GO/EncounterSlot7GO.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/GO/EncounterSlot7GO.cs @@ -88,7 +88,7 @@ private void SetPINGA(PB7 pk, in EncounterCriteria criteria) var ability = criteria.GetAbilityFromNumber(Ability); criteria.SetRandomIVsGO(pk, Type.MinimumIV); - pk.Nature = pk.StatNature = nature; + pk.Nature = pk.StatAlignment = nature; pk.Gender = gender; pk.RefreshAbility(ability); diff --git a/PKHeX.Core/Legality/Encounters/Templates/GO/EncounterSlot8GO.cs b/PKHeX.Core/Legality/Encounters/Templates/GO/EncounterSlot8GO.cs index 4f1194c4c..785323637 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/GO/EncounterSlot8GO.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/GO/EncounterSlot8GO.cs @@ -173,7 +173,7 @@ private void SetPINGA(PKM pk, in EncounterCriteria criteria) var nature = criteria.GetNature(); var ability = criteria.GetAbilityFromNumber(Ability); - pk.Nature = pk.StatNature = nature; + pk.Nature = pk.StatAlignment = nature; pk.Gender = gender; pk.AbilityNumber = 1 << ability; diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen6/EncounterEgg6.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen6/EncounterEgg6.cs index 017355030..8f6660e78 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen6/EncounterEgg6.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen6/EncounterEgg6.cs @@ -68,7 +68,7 @@ public PK6 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) Country = geo.Country, Region = geo.Region, }; - pk.StatNature = pk.Nature; + pk.StatAlignment = pk.Nature; pk.SetHatchMemory6(); if (Species is (int)Core.Species.Scatterbug) diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen7/EncounterEgg7.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen7/EncounterEgg7.cs index b4cd7474e..926d5787c 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen7/EncounterEgg7.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen7/EncounterEgg7.cs @@ -66,7 +66,7 @@ public PK7 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) Country = geo.Country, Region = geo.Region, }; - pk.StatNature = pk.Nature; + pk.StatAlignment = pk.Nature; if (Species is (int)Core.Species.Scatterbug) pk.Form = Vivillon3DS.GetPattern(pk.Country, pk.Region); diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterEgg8.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterEgg8.cs index 229dfb3fa..af2ba09b8 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterEgg8.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterEgg8.cs @@ -59,7 +59,7 @@ public PK8 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) Nature = criteria.GetNature(), Gender = criteria.GetGender(pi), }; - pk.StatNature = pk.Nature; + pk.StatAlignment = pk.Nature; SetEncounterMoves(pk); diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterSlot8.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterSlot8.cs index d93bec282..54f7745b8 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterSlot8.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterSlot8.cs @@ -94,7 +94,7 @@ private void SetPINGA(PK8 pk, in EncounterCriteria criteria, PersonalInfo8SWSH p { bool symbol = Parent.PermitCrossover; pk.RefreshAbility(criteria.GetAbilityFromNumber(Ability)); - pk.Nature = pk.StatNature = criteria.GetNature(); + pk.Nature = pk.StatAlignment = criteria.GetNature(); pk.Gender = criteria.GetGender(pi); var req = GetRequirement(pk); diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterStatic8.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterStatic8.cs index c5563c96c..b80957dad 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterStatic8.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterStatic8.cs @@ -119,7 +119,7 @@ private void SetPINGA(PK8 pk, in EncounterCriteria criteria) var pi = PersonalTable.SWSH[Species, Form]; pk.RefreshAbility(criteria.GetAbilityFromNumber(Ability)); - pk.Nature = pk.StatNature = criteria.GetNature(); + pk.Nature = pk.StatAlignment = criteria.GetNature(); pk.Gender = criteria.GetGender(Gender, pi); var req = GetRequirement(pk); diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterTrade8.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterTrade8.cs index a936f7197..fe4909937 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterTrade8.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterTrade8.cs @@ -154,7 +154,7 @@ private void SetPINGA(PK8 pk, in EncounterCriteria criteria, PersonalInfo8SWSH p var gender = criteria.GetGender(Gender, pi); var nature = criteria.GetNature(Nature); int ability = criteria.GetAbilityFromNumber(Ability); - pk.Nature = pk.StatNature = nature; + pk.Nature = pk.StatAlignment = nature; pk.Gender = gender; pk.RefreshAbility(ability); if (IVs.IsSpecified) diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen8b/EncounterEgg8b.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen8b/EncounterEgg8b.cs index 4538bbdf8..067b6f66d 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen8b/EncounterEgg8b.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen8b/EncounterEgg8b.cs @@ -179,7 +179,7 @@ private void SetPINGA(PB8 pk, in EncounterCriteria criteria, PersonalInfo8BDSP p // Set the rest of the values as per our generating via the egg seed. pk.EncryptionConstant = rng.NextUInt(); // PID would be re-rolled after here, but we aren't going to have re-rolls in our hypothetical setup. pk.SetIVs(ivs); - pk.StatNature = pk.Nature = criteria.GetNature(); // Everstone (see above) + pk.StatAlignment = pk.Nature = criteria.GetNature(); // Everstone (see above) pk.Gender = gender; pk.RefreshAbility(abilityIndex); return; diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen8b/EncounterSlot8b.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen8b/EncounterSlot8b.cs index 380fee297..b3fb5ed54 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen8b/EncounterSlot8b.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen8b/EncounterSlot8b.cs @@ -106,7 +106,7 @@ private void SetPINGA(PB8 pk, in EncounterCriteria criteria, PersonalInfo8BDSP p pk.PID = EncounterUtil.GetRandomPID(pk, rnd, criteria.Shiny); pk.EncryptionConstant = rnd.Rand32(); criteria.SetRandomIVs(pk); - pk.Nature = pk.StatNature = criteria.GetNature(); + pk.Nature = pk.StatAlignment = criteria.GetNature(); pk.Gender = criteria.GetGender(pi); pk.RefreshAbility(criteria.GetAbilityFromNumber(Ability)); diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen8b/EncounterTrade8b.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen8b/EncounterTrade8b.cs index d3de9ae94..3f7301a0f 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen8b/EncounterTrade8b.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen8b/EncounterTrade8b.cs @@ -88,7 +88,7 @@ public PB8 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) MetDate = EncounterDate.GetDateSwitch(), Gender = Gender, Nature = Nature, - StatNature = Nature, + StatAlignment = Nature, Ball = (byte)FixedBall, ID32 = ID32, diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterEgg9.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterEgg9.cs index 4500f86c4..b22ff96c5 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterEgg9.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterEgg9.cs @@ -60,7 +60,7 @@ public PK9 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) Nature = criteria.GetNature(), Gender = criteria.GetGender(pi), }; - pk.StatNature = pk.Nature; + pk.StatAlignment = pk.Nature; SetEncounterMoves(pk); diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterFixed9.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterFixed9.cs index 269512213..2e19b4fad 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterFixed9.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterFixed9.cs @@ -115,7 +115,7 @@ private void SetPINGA(PK9 pk, in EncounterCriteria criteria, PersonalInfo9SV pi) var rnd = Util.Rand; pk.PID = EncounterUtil.GetRandomPID(pk, rnd, criteria.Shiny); pk.EncryptionConstant = rnd.Rand32(); - pk.Nature = pk.StatNature = criteria.GetNature(); + pk.Nature = pk.StatAlignment = criteria.GetNature(); pk.Gender = criteria.GetGender(pi); pk.RefreshAbility(criteria.GetAbilityFromNumber(Ability)); diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterOutbreak9.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterOutbreak9.cs index 2d836f915..218e42b47 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterOutbreak9.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterOutbreak9.cs @@ -116,7 +116,7 @@ private void SetPINGA(PK9 pk, in EncounterCriteria criteria, PersonalInfo9SV pi) var rnd = Util.Rand; pk.PID = EncounterUtil.GetRandomPID(pk, rnd, criteria.Shiny); pk.EncryptionConstant = rnd.Rand32(); - pk.Nature = pk.StatNature = criteria.GetNature(); + pk.Nature = pk.StatAlignment = criteria.GetNature(); pk.Gender = criteria.GetGender(pi); pk.RefreshAbility(criteria.GetAbilityFromNumber(Ability)); diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterSlot9.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterSlot9.cs index 7c67fb6ee..0437543b9 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterSlot9.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterSlot9.cs @@ -88,7 +88,7 @@ private void SetPINGA(PK9 pk, in EncounterCriteria criteria, PersonalInfo9SV pi) pk.EncryptionConstant = rnd.Rand32(); criteria.SetRandomIVs(pk); - pk.Nature = pk.StatNature = criteria.GetNature(); + pk.Nature = pk.StatAlignment = criteria.GetNature(); pk.Gender = criteria.GetGender(Gender, pi); pk.RefreshAbility(criteria.GetAbilityFromNumber(Ability)); diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterStatic9.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterStatic9.cs index 6b83a47d2..26f92c39c 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterStatic9.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterStatic9.cs @@ -155,7 +155,7 @@ private void SetPINGA(PK9 pk, in EncounterCriteria criteria, PersonalInfo9SV pi) if (Gender != FixedGenderUtil.GenderRandom) pk.Gender = Gender; if (Nature.IsFixed) - pk.Nature = pk.StatNature = Nature; + pk.Nature = pk.StatAlignment = Nature; } #endregion diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterTrade9.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterTrade9.cs index c61fc1b4e..8107eb3a6 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterTrade9.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterTrade9.cs @@ -84,7 +84,7 @@ public PK9 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) MetDate = EncounterDate.GetDateSwitch(), Gender = Gender, Nature = Nature, - StatNature = Nature, + StatAlignment = Nature, Ball = (byte)FixedBall, ID32 = ID32, @@ -130,7 +130,7 @@ private void SetPINGA(PK9 pk, in EncounterCriteria criteria, PersonalInfo9SV pi) var rnd = Util.Rand; pk.PID = EncounterUtil.GetRandomPID(pk, rnd, Shiny, criteria.Shiny); pk.EncryptionConstant = rnd.Rand32(); - pk.Nature = pk.StatNature = criteria.GetNature(Nature); + pk.Nature = pk.StatAlignment = criteria.GetNature(Nature); pk.Gender = criteria.GetGender(Gender, pi); pk.RefreshAbility(criteria.GetAbilityFromNumber(Ability)); criteria.SetRandomIVs(pk, IVs); diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen9a/EncounterTrade9a.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen9a/EncounterTrade9a.cs index e12339b71..6e35384a2 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen9a/EncounterTrade9a.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen9a/EncounterTrade9a.cs @@ -75,7 +75,7 @@ public PA9 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) MetDate = EncounterDate.GetDateSwitch(), Gender = Gender, Nature = Nature, - StatNature = Nature, + StatAlignment = Nature, Ball = (byte)FixedBall, ID32 = ID32, diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen9a/LumioseRNG.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen9a/LumioseRNG.cs index 90a3737cf..be7f9574b 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen9a/LumioseRNG.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen9a/LumioseRNG.cs @@ -110,7 +110,7 @@ public static bool GenerateData(PA9 pk, in GenerateParam9a enc, in EncounterCrit // Compromise on Nature -- some are fixed, some are random. If the request wants a specific nature, just mint it. if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(nature)) return false; - pk.Nature = pk.StatNature = nature; + pk.Nature = pk.StatAlignment = nature; // If Hyperspace, the player can have an active Teensy/Humungo boost. The scale is pre-determined outside of the seed=>pa9, consider it not correlated or traceable. // When calling the method to verify the entity, pass SizeType9.VALUE instead. diff --git a/PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs b/PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs index 6e00d2aff..844d7cb55 100644 --- a/PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs +++ b/PKHeX.Core/Legality/Localization/LegalityCheckLocalization.cs @@ -94,7 +94,7 @@ public sealed class LegalityCheckLocalization public string EggLocationTrade { get; init; } = "Able to hatch a traded Egg at Met Location."; public string EggLocationTradeFail { get; init; } = "Invalid Egg Location, shouldn't be 'traded' while an Egg."; public string EggMetLocationFail { get; init; } = "Can't obtain Egg from Egg Location."; - public string EggNature { get; init; } = "Eggs cannot have their Stat Nature changed."; + public string EggNature { get; init; } = "Eggs cannot have their Stat Alignment changed."; public string EggPP { get; init; } = "Eggs cannot have modified move PP counts."; public string EggPPUp { get; init; } = "Cannot apply PP Ups to an Egg."; public string EggRelearnFlags { get; init; } = "Expected no Relearn Move Flags."; @@ -370,7 +370,7 @@ public sealed class LegalityCheckLocalization public string StatIncorrectCP { get; init; } = "Calculated CP does not match stored value."; public string StatGigantamaxInvalid { get; init; } = "Gigantamax Flag mismatch."; public string StatGigantamaxValid { get; init; } = "Gigantamax Flag was changed via Max Soup."; - public string StatNatureInvalid { get; init; } = "Stat Nature is not within the expected range."; + public string StatAlignmentInvalid { get; init; } = "Stat Alignment is not within the expected range."; public string StatBattleVersionInvalid { get; init; } = "Battle Version is not within the expected range."; public string StatNobleInvalid { get; init; } = "Noble Flag mismatch."; public string StatAlphaInvalid { get; init; } = "Alpha Flag mismatch."; diff --git a/PKHeX.Core/Legality/Localization/LegalityCheckResultCodeExtensions.cs b/PKHeX.Core/Legality/Localization/LegalityCheckResultCodeExtensions.cs index dd7308edc..3858d2ada 100644 --- a/PKHeX.Core/Legality/Localization/LegalityCheckResultCodeExtensions.cs +++ b/PKHeX.Core/Legality/Localization/LegalityCheckResultCodeExtensions.cs @@ -367,7 +367,7 @@ public static class LegalityCheckResultCodeExtensions StatIncorrectCP_0 => localization.StatIncorrectCP, StatGigantamaxInvalid => localization.StatGigantamaxInvalid, StatGigantamaxValid => localization.StatGigantamaxValid, - StatNatureInvalid => localization.StatNatureInvalid, + StatAlignmentInvalid => localization.StatAlignmentInvalid, StatBattleVersionInvalid => localization.StatBattleVersionInvalid, StatNobleInvalid => localization.StatNobleInvalid, StatAlphaInvalid => localization.StatAlphaInvalid, diff --git a/PKHeX.Core/Legality/RNG/Methods/Gen8/RaidRNG.cs b/PKHeX.Core/Legality/RNG/Methods/Gen8/RaidRNG.cs index 0650a992b..ba7a3c313 100644 --- a/PKHeX.Core/Legality/RNG/Methods/Gen8/RaidRNG.cs +++ b/PKHeX.Core/Legality/RNG/Methods/Gen8/RaidRNG.cs @@ -139,9 +139,13 @@ public static bool Verify(PKM pk, ulong seed, Span ivs, in GenerateParam8 p if (s.WeightScalar != weight) { if (height == 0 && s.WeightScalar == 0 && HomeQuirks.HasEnteredSetZeroScale(pk)) - { } // OK + { + // OK + } else + { return false; + } } } } @@ -251,7 +255,7 @@ public static bool TryApply(PK8 pk, ulong seed, Span ivs, in GenerateParam8 if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(nature)) return false; - pk.Nature = pk.StatNature = nature; + pk.Nature = pk.StatAlignment = nature; var height = rng.NextInt(0x81) + rng.NextInt(0x80); var weight = rng.NextInt(0x81) + rng.NextInt(0x80); diff --git a/PKHeX.Core/Legality/RNG/Methods/Gen8a/Overworld8aRNG.cs b/PKHeX.Core/Legality/RNG/Methods/Gen8a/Overworld8aRNG.cs index f6a9c1993..21d7b695e 100644 --- a/PKHeX.Core/Legality/RNG/Methods/Gen8a/Overworld8aRNG.cs +++ b/PKHeX.Core/Legality/RNG/Methods/Gen8a/Overworld8aRNG.cs @@ -176,7 +176,7 @@ public static bool TryApplyFromSeed(PA8 pk, in EncounterCriteria criteria, in Ov var nature = (Nature)rand.NextInt(25); if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(nature)) return false; - pk.Nature = pk.StatNature = nature; + pk.Nature = pk.StatAlignment = nature; var (height, weight) = para.IsAlpha ? (byte.MaxValue, byte.MaxValue) diff --git a/PKHeX.Core/Legality/RNG/Methods/Gen8b/Roaming8bRNG.cs b/PKHeX.Core/Legality/RNG/Methods/Gen8b/Roaming8bRNG.cs index 94f9634e1..0c01221c6 100644 --- a/PKHeX.Core/Legality/RNG/Methods/Gen8b/Roaming8bRNG.cs +++ b/PKHeX.Core/Legality/RNG/Methods/Gen8b/Roaming8bRNG.cs @@ -22,7 +22,7 @@ public static void ApplyDetails(PB8 pk, in EncounterCriteria criteria, Shiny shi // Since the inner methods do not set Gender (only fixed Genders are applicable) and Nature (assume Synchronize used), set them here. pk.Gender = (byte)(pk.Species == (int)Species.Cresselia ? 1 : 2); // Mesprit - pk.Nature = pk.StatNature = criteria.GetNature(); + pk.Nature = pk.StatAlignment = criteria.GetNature(); int ctr = 0; var rnd = Util.Rand; diff --git a/PKHeX.Core/Legality/RNG/Methods/Gen8b/Wild8bRNG.cs b/PKHeX.Core/Legality/RNG/Methods/Gen8b/Wild8bRNG.cs index 36f101b53..9e4d1f304 100644 --- a/PKHeX.Core/Legality/RNG/Methods/Gen8b/Wild8bRNG.cs +++ b/PKHeX.Core/Legality/RNG/Methods/Gen8b/Wild8bRNG.cs @@ -134,7 +134,7 @@ public static bool TryApplyFromSeed(PB8 pk, in EncounterCriteria criteria, Shiny if (!criteria.IsSatisfiedNature(nature)) return false; - pk.StatNature = pk.Nature = nature; + pk.StatAlignment = pk.Nature = nature; // Remainder pk.HeightScalar = (byte)(xors.NextUInt(0x81) + xors.NextUInt(0x80)); diff --git a/PKHeX.Core/Legality/RNG/Methods/Gen9/Encounter9RNG.cs b/PKHeX.Core/Legality/RNG/Methods/Gen9/Encounter9RNG.cs index 3a31316bb..0d7bbee60 100644 --- a/PKHeX.Core/Legality/RNG/Methods/Gen9/Encounter9RNG.cs +++ b/PKHeX.Core/Legality/RNG/Methods/Gen9/Encounter9RNG.cs @@ -128,7 +128,7 @@ public static bool GenerateData(PK9 pk, in GenerateParam9 enc, in EncounterCrite // Compromise on Nature -- some are fixed, some are random. If the request wants a specific nature, just mint it. if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature(nature)) return false; - pk.Nature = pk.StatNature = nature; + pk.Nature = pk.StatAlignment = nature; pk.HeightScalar = enc.Height != 0 ? enc.Height : (byte)(rand.NextInt(0x81) + rand.NextInt(0x80)); pk.WeightScalar = enc.Weight != 0 ? enc.Weight : (byte)(rand.NextInt(0x81) + rand.NextInt(0x80)); diff --git a/PKHeX.Core/Legality/Structures/LegalityCheckResultCode.cs b/PKHeX.Core/Legality/Structures/LegalityCheckResultCode.cs index 0263ed74b..de2afd9c0 100644 --- a/PKHeX.Core/Legality/Structures/LegalityCheckResultCode.cs +++ b/PKHeX.Core/Legality/Structures/LegalityCheckResultCode.cs @@ -311,7 +311,7 @@ public enum LegalityCheckResultCode : ushort StatInvalidHeightWeight, StatGigantamaxInvalid, StatGigantamaxValid, - StatNatureInvalid, + StatAlignmentInvalid, StatBattleVersionInvalid, StatNobleInvalid, StatAlphaInvalid, diff --git a/PKHeX.Core/Legality/Verifiers/Egg/EggVerifier.cs b/PKHeX.Core/Legality/Verifiers/Egg/EggVerifier.cs index 835e3079d..cb60fd444 100644 --- a/PKHeX.Core/Legality/Verifiers/Egg/EggVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/Egg/EggVerifier.cs @@ -57,7 +57,7 @@ internal void VerifyCommon(LegalityAnalysis data, PKM pk) { if (record.GetMoveRecordFlagAny()) data.AddLine(GetInvalid(Egg, EggRelearnFlags)); - if (pk.StatNature != pk.Nature) + if (pk.StatAlignment != pk.Nature) data.AddLine(GetInvalid(Egg, EggNature)); } } diff --git a/PKHeX.Core/Legality/Verifiers/Misc/ContestStatInfo.cs b/PKHeX.Core/Legality/Verifiers/Misc/ContestStatInfo.cs index f35a271c9..4bb048ec7 100644 --- a/PKHeX.Core/Legality/Verifiers/Misc/ContestStatInfo.cs +++ b/PKHeX.Core/Legality/Verifiers/Misc/ContestStatInfo.cs @@ -177,12 +177,12 @@ private static int GetAverageFeel(IContestStatsReadOnly s, Nature nature, IConte return (int)Math.Ceiling(sum / 5f); } - // Indexes into the NatureAmpTable - private const int AmpIndexCool = 0; // Spicy - private const int AmpIndexTough = 1; // Sour - private const int AmpIndexBeauty = 2; // Dry - private const int AmpIndexSmart = 3; // Bitter - private const int AmpIndexCute = 4; // Sweet + // Indexes into the NatureAmpTable (visual index) + private const int AmpIndexCool = 0; // Spicy (Attack) + private const int AmpIndexTough = 1; // Sour (Defense) + private const int AmpIndexBeauty = 2; // Dry (Sp. Attack) + private const int AmpIndexSmart = 3; // Bitter (Sp. Defense) + private const int AmpIndexCute = 4; // Sweet (Speed) private static int GetGainedSum(IContestStatsReadOnly s, Nature nature, IContestStatsReadOnly initial) { diff --git a/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierHelpers.cs b/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierHelpers.cs index 671c96996..49c93dc0d 100644 --- a/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierHelpers.cs +++ b/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierHelpers.cs @@ -8,17 +8,17 @@ namespace PKHeX.Core; internal static class MiscVerifierHelpers { - internal static void VerifyStatNature(LegalityAnalysis data, PKM pk) + internal static void VerifyStatAlignment(LegalityAnalysis data, PKM pk) { - // No encounters innately come with a different Stat Nature... + // No encounters innately come with a different Stat Alignment... // If it matches the Nature, it is valid. If it doesn't, it should be one of the mint natures. - var statNature = pk.StatNature; - if (statNature == pk.Nature) + var alignment = pk.StatAlignment; + if (alignment == pk.Nature) return; // Must be a valid mint nature. - if (!statNature.IsMint) - data.AddLine(Get(Invalid, Misc, StatNatureInvalid)); + if (!alignment.IsMint) + data.AddLine(Get(Invalid, Misc, StatAlignmentInvalid)); } internal static void VerifyAbsoluteSizes(LegalityAnalysis data, T pk) where T : IScaledSizeValue diff --git a/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPA8.cs b/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPA8.cs index d532f66d0..aa1404d10 100644 --- a/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPA8.cs +++ b/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPA8.cs @@ -18,7 +18,7 @@ public override void Verify(LegalityAnalysis data) internal void Verify(LegalityAnalysis data, PA8 pk) { Arceus.Verify(data); - MiscVerifierHelpers.VerifyStatNature(data, pk); + MiscVerifierHelpers.VerifyStatAlignment(data, pk); MiscVerifierHelpers.VerifyAbsoluteSizes(data, pk); MiscVerifierPK8.VerifyTechRecordFlags(data, pk); // copied from SW/SH via HOME FullnessRules.Verify(data, pk); diff --git a/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPA9.cs b/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPA9.cs index 71697b2b0..b0b6ae10d 100644 --- a/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPA9.cs +++ b/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPA9.cs @@ -17,7 +17,7 @@ public override void Verify(LegalityAnalysis data) internal void Verify(LegalityAnalysis data, PA9 pa9) { - MiscVerifierHelpers.VerifyStatNature(data, pa9); + MiscVerifierHelpers.VerifyStatAlignment(data, pa9); LegendsZA.Verify(data); if (!pa9.IsBattleVersionValid(data.Info.EvoChainsAllGens)) diff --git a/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPB8.cs b/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPB8.cs index 6640a9528..24dccf574 100644 --- a/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPB8.cs +++ b/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPB8.cs @@ -15,7 +15,7 @@ public override void Verify(LegalityAnalysis data) internal void Verify(LegalityAnalysis data, PB8 pk) { - MiscVerifierHelpers.VerifyStatNature(data, pk); + MiscVerifierHelpers.VerifyStatAlignment(data, pk); MiscVerifierPK8.VerifyTechRecordFlags(data, pk); // copied from SW/SH via HOME FullnessRules.Verify(data, pk); diff --git a/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPK8.cs b/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPK8.cs index ee1d53f25..122fbc4c0 100644 --- a/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPK8.cs +++ b/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPK8.cs @@ -15,7 +15,7 @@ public override void Verify(LegalityAnalysis data) internal void Verify(LegalityAnalysis data, PK8 pk) { - MiscVerifierHelpers.VerifyStatNature(data, pk); + MiscVerifierHelpers.VerifyStatAlignment(data, pk); VerifyTechRecordFlags(data, pk); FullnessRules.Verify(data, pk); diff --git a/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPK9.cs b/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPK9.cs index f21ae1fc3..01a2eec39 100644 --- a/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPK9.cs +++ b/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierPK9.cs @@ -16,7 +16,7 @@ public override void Verify(LegalityAnalysis data) internal void Verify(LegalityAnalysis data, PK9 pk) { - MiscVerifierHelpers.VerifyStatNature(data, pk); + MiscVerifierHelpers.VerifyStatAlignment(data, pk); VerifyTechRecordFlags(data, pk); if (!pk.IsBattleVersionValid(data.Info.EvoChainsAllGens)) diff --git a/PKHeX.Core/MysteryGifts/WA8.cs b/PKHeX.Core/MysteryGifts/WA8.cs index 980e331c0..6c38913e3 100644 --- a/PKHeX.Core/MysteryGifts/WA8.cs +++ b/PKHeX.Core/MysteryGifts/WA8.cs @@ -549,7 +549,7 @@ private void SetEggMetData(PA8 pk) private void SetPINGA(PA8 pk, in EncounterCriteria criteria) { var pi = pk.PersonalInfo; - pk.Nature = pk.StatNature = criteria.GetNature((sbyte)Nature == -1 ? Nature.Random : Nature); + pk.Nature = pk.StatAlignment = criteria.GetNature((sbyte)Nature == -1 ? Nature.Random : Nature); pk.Gender = criteria.GetGender(Gender, pi); var av = GetAbilityIndex(criteria); pk.RefreshAbility(av); diff --git a/PKHeX.Core/MysteryGifts/WA9.cs b/PKHeX.Core/MysteryGifts/WA9.cs index 25625d19a..5510af1ac 100644 --- a/PKHeX.Core/MysteryGifts/WA9.cs +++ b/PKHeX.Core/MysteryGifts/WA9.cs @@ -528,7 +528,7 @@ private void SetPINGA(PA9 pk, EncounterCriteria criteria, PersonalInfo9ZA pi) { if (IsHOMEGift) // Do not use LumioseRNG for HOME gifts { - pk.Nature = pk.StatNature = criteria.GetNature((sbyte)Nature == -1 ? Nature.Random : Nature); + pk.Nature = pk.StatAlignment = criteria.GetNature((sbyte)Nature == -1 ? Nature.Random : Nature); pk.Gender = criteria.GetGender(Gender, pi); var av = GetAbilityIndex(criteria, AbilityType); pk.RefreshAbility(av); diff --git a/PKHeX.Core/MysteryGifts/WB8.cs b/PKHeX.Core/MysteryGifts/WB8.cs index 141b914f8..395774110 100644 --- a/PKHeX.Core/MysteryGifts/WB8.cs +++ b/PKHeX.Core/MysteryGifts/WB8.cs @@ -549,7 +549,7 @@ private void SetEggMetData(PB8 pk, DateOnly date) private void SetPINGA(PB8 pk, in EncounterCriteria criteria) { var pi = pk.PersonalInfo; - pk.Nature = pk.StatNature = criteria.GetNature((sbyte)Nature == -1 ? Nature.Random : Nature); + pk.Nature = pk.StatAlignment = criteria.GetNature((sbyte)Nature == -1 ? Nature.Random : Nature); pk.Gender = criteria.GetGender(Gender, pi); var av = GetAbilityIndex(criteria); pk.RefreshAbility(av); diff --git a/PKHeX.Core/MysteryGifts/WC8.cs b/PKHeX.Core/MysteryGifts/WC8.cs index dc8381843..579692fa6 100644 --- a/PKHeX.Core/MysteryGifts/WC8.cs +++ b/PKHeX.Core/MysteryGifts/WC8.cs @@ -568,7 +568,7 @@ private void SetEggMetData(PK8 pk) private void SetPINGA(PK8 pk, in EncounterCriteria criteria) { var pi = pk.PersonalInfo; - pk.Nature = pk.StatNature = criteria.GetNature((sbyte)Nature == -1 ? Nature.Random : Nature); + pk.Nature = pk.StatAlignment = criteria.GetNature((sbyte)Nature == -1 ? Nature.Random : Nature); pk.Gender = criteria.GetGender(Gender, pi); var av = GetAbilityIndex(criteria); pk.RefreshAbility(av); diff --git a/PKHeX.Core/MysteryGifts/WC9.cs b/PKHeX.Core/MysteryGifts/WC9.cs index 3143804ea..e3becad66 100644 --- a/PKHeX.Core/MysteryGifts/WC9.cs +++ b/PKHeX.Core/MysteryGifts/WC9.cs @@ -570,7 +570,7 @@ private void SetEggMetData(PK9 pk) private void SetPINGA(PK9 pk, in EncounterCriteria criteria) { var pi = pk.PersonalInfo; - pk.Nature = pk.StatNature = criteria.GetNature((sbyte)Nature == -1 ? Nature.Random : Nature); + pk.Nature = pk.StatAlignment = criteria.GetNature((sbyte)Nature == -1 ? Nature.Random : Nature); pk.Gender = criteria.GetGender(Gender, pi); var av = GetAbilityIndex(criteria); pk.RefreshAbility(av); diff --git a/PKHeX.Core/PKM/HOME/GameDataCore.cs b/PKHeX.Core/PKM/HOME/GameDataCore.cs index a512b456b..cc2777f8b 100644 --- a/PKHeX.Core/PKM/HOME/GameDataCore.cs +++ b/PKHeX.Core/PKM/HOME/GameDataCore.cs @@ -43,7 +43,7 @@ public int WriteTo(Span result) public ushort MarkingValue { get => ReadUInt16LittleEndian(Data[0x18..]); set => WriteUInt16LittleEndian(Data[0x18..], value); } public uint PID { get => ReadUInt32LittleEndian(Data[0x1A..]); set => WriteUInt32LittleEndian(Data[0x1A..], value); } public Nature Nature { get => (Nature)Data[0x1E]; set => Data[0x1E] = (byte)value; } - public Nature StatNature { get => (Nature)Data[0x1F]; set => Data[0x1F] = (byte)value; } + public Nature StatAlignment { get => (Nature)Data[0x1F]; set => Data[0x1F] = (byte)value; } public bool FatefulEncounter { get => Data[0x20] != 0; set => Data[0x20] = (byte)(value ? 1 : 0); } public byte Gender { get => Data[0x21]; set => Data[0x21] = value; } public byte Form { get => Data[0x22]; set => WriteUInt16LittleEndian(Data[0x22..], value); } @@ -333,7 +333,7 @@ public void CopyFrom(PKM pk) EXP = pk.EXP; MarkingValue = pk is IAppliedMarkings7 m7 ? m7.MarkingValue : (ushort)0; Nature = pk.Nature; - StatNature = pk.StatNature; + StatAlignment = pk.StatAlignment; FatefulEncounter = pk.FatefulEncounter; // HeldItem = pk.HeldItem; IV_HP = pk.IV_HP; @@ -391,7 +391,7 @@ public void CopyTo(PKM pk) if (pk is IAppliedMarkings7 m7) m7.MarkingValue = MarkingValue; pk.Nature = Nature; - pk.StatNature = StatNature; + pk.StatAlignment = StatAlignment; pk.FatefulEncounter = FatefulEncounter; pk.HeldItem = HeldItem; pk.IV_HP = IV_HP; diff --git a/PKHeX.Core/PKM/HOME/PKH.cs b/PKHeX.Core/PKM/HOME/PKH.cs index 3f568d313..f82da580a 100644 --- a/PKHeX.Core/PKM/HOME/PKH.cs +++ b/PKHeX.Core/PKM/HOME/PKH.cs @@ -106,7 +106,7 @@ private static Memory DecryptHome(Memory data) public ushort MarkingValue { get => Core.MarkingValue; set => Core.MarkingValue = value; } public override uint PID { get => Core.PID; set => Core.PID = value; } public override Nature Nature { get => Core.Nature; set => Core.Nature = value; } - public override Nature StatNature { get => Core.StatNature; set => Core.StatNature = value; } + public override Nature StatAlignment { get => Core.StatAlignment; set => Core.StatAlignment = value; } public override bool FatefulEncounter { get => Core.FatefulEncounter; set => Core.FatefulEncounter = value; } public override byte Gender { get => Core.Gender; set => Core.Gender = value; } public override byte Form { get => Core.Form; set => Core.Form = value; } diff --git a/PKHeX.Core/PKM/PA8.cs b/PKHeX.Core/PKM/PA8.cs index 96292c1e8..c6ac77c64 100644 --- a/PKHeX.Core/PKM/PA8.cs +++ b/PKHeX.Core/PKM/PA8.cs @@ -138,7 +138,7 @@ public void FixRelearn() // 0x1B alignment unused public override uint PID { get => ReadUInt32LittleEndian(Data[0x1C..]); set => WriteUInt32LittleEndian(Data[0x1C..], value); } public override Nature Nature { get => (Nature)Data[0x20]; set => Data[0x20] = (byte)value; } - public override Nature StatNature { get => (Nature)Data[0x21]; set => Data[0x21] = (byte)value; } + public override Nature StatAlignment { get => (Nature)Data[0x21]; set => Data[0x21] = (byte)value; } public override bool FatefulEncounter { get => (Data[0x22] & 1) == 1; set => Data[0x22] = (byte)((Data[0x22] & ~0x01) | (value ? 1 : 0)); } public bool Flag2 { get => (Data[0x22] & 2) == 2; set => Data[0x22] = (byte)((Data[0x22] & ~0x02) | (value ? 2 : 0)); } public override byte Gender { get => (byte)((Data[0x22] >> 2) & 0x3); set => Data[0x22] = (byte)((Data[0x22] & 0xF3) | (value << 2)); } @@ -514,7 +514,7 @@ public ulong Tracker public override void LoadStats(IBaseStat p, Span stats) { var level = CurrentLevel; - var nature = StatNature; + var nature = StatAlignment; stats[0] = (ushort)(GetGanbaruStat(p.HP, HT_HP ? 31 : IV_HP, GV_HP, level) + GetStatHp(p.HP, level)); stats[1] = (ushort)(GetGanbaruStat(p.ATK, HT_ATK ? 31 : IV_ATK, GV_ATK, level) + GetStat(p.ATK, level, nature, 0)); diff --git a/PKHeX.Core/PKM/PA9.cs b/PKHeX.Core/PKM/PA9.cs index 8f208fd7b..84b3b83df 100644 --- a/PKHeX.Core/PKM/PA9.cs +++ b/PKHeX.Core/PKM/PA9.cs @@ -126,7 +126,7 @@ public void FixRelearn() // 0x1B alignment unused public override uint PID { get => ReadUInt32LittleEndian(Data[0x1C..]); set => WriteUInt32LittleEndian(Data[0x1C..], value); } public override Nature Nature { get => (Nature)Data[0x20]; set => Data[0x20] = (byte)value; } - public override Nature StatNature { get => (Nature)Data[0x21]; set => Data[0x21] = (byte)value; } + public override Nature StatAlignment { get => (Nature)Data[0x21]; set => Data[0x21] = (byte)value; } public override bool FatefulEncounter { get => (Data[0x22] & 1) == 1; set => Data[0x22] = (byte)((Data[0x22] & ~0x01) | (value ? 1 : 0)); } public override byte Gender { get => (byte)((Data[0x22] >> 1) & 0x3); set => Data[0x22] = (byte)((Data[0x22] & 0xF9) | (value << 1)); } public bool IsAlpha { get => Data[0x23] != 0; set => Data[0x23] = (byte)(value ? 1 : 0); } diff --git a/PKHeX.Core/PKM/PK9.cs b/PKHeX.Core/PKM/PK9.cs index 5f3fe4c75..3435e5213 100644 --- a/PKHeX.Core/PKM/PK9.cs +++ b/PKHeX.Core/PKM/PK9.cs @@ -131,7 +131,7 @@ public void FixRelearn() // 0x1B alignment unused public override uint PID { get => ReadUInt32LittleEndian(Data[0x1C..]); set => WriteUInt32LittleEndian(Data[0x1C..], value); } public override Nature Nature { get => (Nature)Data[0x20]; set => Data[0x20] = (byte)value; } - public override Nature StatNature { get => (Nature)Data[0x21]; set => Data[0x21] = (byte)value; } + public override Nature StatAlignment { get => (Nature)Data[0x21]; set => Data[0x21] = (byte)value; } public override bool FatefulEncounter { get => (Data[0x22] & 1) == 1; set => Data[0x22] = (byte)((Data[0x22] & ~0x01) | (value ? 1 : 0)); } public override byte Gender { get => (byte)((Data[0x22] >> 1) & 0x3); set => Data[0x22] = (byte)((Data[0x22] & 0xF9) | (value << 1)); } // 0x23 alignment unused diff --git a/PKHeX.Core/PKM/PKM.cs b/PKHeX.Core/PKM/PKM.cs index f184778ea..7355114e8 100644 --- a/PKHeX.Core/PKM/PKM.cs +++ b/PKHeX.Core/PKM/PKM.cs @@ -105,7 +105,7 @@ public virtual void WriteEncryptedDataParty(Span stored, Span party) public abstract int HeldItem { get; set; } public abstract byte Gender { get; set; } public abstract Nature Nature { get; set; } - public virtual Nature StatNature { get => Nature; set => Nature = value; } + public virtual Nature StatAlignment { get => Nature; set => Nature = value; } public abstract int Ability { get; set; } public abstract byte CurrentFriendship { get; set; } public abstract byte Form { get; set; } @@ -753,8 +753,8 @@ public virtual void LoadStats(IBaseStat p, Span stats) else LoadStats(stats, p, level); - // Amplify stats based on the stat nature. - StatNature.ModifyStatsForNature(stats); + // Amplify stats based on the stat alignment. + StatAlignment.ModifyStatsForAlignment(stats); } private void LoadStats(Span stats, IBaseStat p, IHyperTrain t, byte level) diff --git a/PKHeX.Core/PKM/Searching/SearchSettings.cs b/PKHeX.Core/PKM/Searching/SearchSettings.cs index 227a912d9..90fc035d0 100644 --- a/PKHeX.Core/PKM/Searching/SearchSettings.cs +++ b/PKHeX.Core/PKM/Searching/SearchSettings.cs @@ -168,7 +168,7 @@ private bool SearchSimple(PKM pk) return false; if (Ability > -1 && pk.Ability != Ability) return false; - if (Nature.IsFixed && pk.StatNature != Nature) + if (Nature.IsFixed && pk.StatAlignment != Nature) return false; if (Item > -1 && pk.HeldItem != Item) return false; diff --git a/PKHeX.Core/PKM/Shared/G8PKM.cs b/PKHeX.Core/PKM/Shared/G8PKM.cs index 58665458f..38f699bea 100644 --- a/PKHeX.Core/PKM/Shared/G8PKM.cs +++ b/PKHeX.Core/PKM/Shared/G8PKM.cs @@ -112,7 +112,7 @@ public void FixRelearn() // 0x1B alignment unused public override uint PID { get => ReadUInt32LittleEndian(Data[0x1C..]); set => WriteUInt32LittleEndian(Data[0x1C..], value); } public override Nature Nature { get => (Nature)Data[0x20]; set => Data[0x20] = (byte)value; } - public override Nature StatNature { get => (Nature)Data[0x21]; set => Data[0x21] = (byte)value; } + public override Nature StatAlignment { get => (Nature)Data[0x21]; set => Data[0x21] = (byte)value; } public override bool FatefulEncounter { get => (Data[0x22] & 1) == 1; set => Data[0x22] = (byte)((Data[0x22] & ~0x01) | (value ? 1 : 0)); } public bool Flag2 { get => (Data[0x22] & 2) == 2; set => Data[0x22] = (byte)((Data[0x22] & ~0x02) | (value ? 2 : 0)); } public override byte Gender { get => (byte)((Data[0x22] >> 2) & 0x3); set => Data[0x22] = (byte)((Data[0x22] & 0xF3) | (value << 2)); } diff --git a/PKHeX.Core/Resources/localize/legality/legality_de.json b/PKHeX.Core/Resources/localize/legality/legality_de.json index ce627c4d7..a5234a0e6 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_de.json +++ b/PKHeX.Core/Resources/localize/legality/legality_de.json @@ -53,7 +53,7 @@ "EggLocationTrade": "Ein getauschtes Ei kann am Fundort ausgebrütet werden.", "EggLocationTradeFail": "Ungültiger Ei-Ort, sollte im Ei-Status nicht 'getauscht' sein.", "EggMetLocationFail": "Ei kann an diesem Ei-Ort nicht erhalten werden.", - "EggNature": "Das Wesen (Statuswerte) eines Eis kann nicht geändert werden.", + "EggNature": "Statuswertanpassung eines Ei kann nicht geändert werden.", "EggPP": "Eier können keine modifizierten AP-Werte haben.", "EggPPUp": "AP-Plus kann nicht auf ein Ei angewendet werden.", "EggRelearnFlags": "Keine Markierungen für wiedererlernbare Attacken erwartet.", @@ -293,7 +293,7 @@ "StatIncorrectCP": "Berechnete WP stimmen nicht mit dem gespeicherten Wert überein.", "StatGigantamaxInvalid": "Gigadynamax-Markierung fehlerhaft.", "StatGigantamaxValid": "Gigadynamax-Markierung wurde durch Dyna-Suppe geändert.", - "StatNatureInvalid": "Status-Wesen liegt nicht im erwarteten Bereich.", + "StatAlignmentInvalid": "Statuswertanpassung liegt nicht im erwarteten Bereich.", "StatBattleVersionInvalid": "Kampf-Version liegt nicht im erwarteten Bereich.", "StatNobleInvalid": "Königliche-Markierung fehlerhaft.", "StatAlphaInvalid": "Elite-Markierung fehlerhaft.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_en.json b/PKHeX.Core/Resources/localize/legality/legality_en.json index 93cad188e..ca935356e 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_en.json +++ b/PKHeX.Core/Resources/localize/legality/legality_en.json @@ -53,7 +53,7 @@ "EggLocationTrade": "Able to hatch a traded Egg at Met Location.", "EggLocationTradeFail": "Invalid Egg Location, shouldn't be 'traded' while an Egg.", "EggMetLocationFail": "Can't obtain Egg from Egg Location.", - "EggNature": "Eggs cannot have their Stat Nature changed.", + "EggNature": "Eggs cannot have their Stat Alignment changed.", "EggPP": "Eggs cannot have modified move PP counts.", "EggPPUp": "Cannot apply PP Ups to an Egg.", "EggRelearnFlags": "Expected no Relearn Move Flags.", @@ -293,7 +293,7 @@ "StatIncorrectCP": "Calculated CP does not match stored value.", "StatGigantamaxInvalid": "Gigantamax Flag mismatch.", "StatGigantamaxValid": "Gigantamax Flag was changed via Max Soup.", - "StatNatureInvalid": "Stat Nature is not within the expected range.", + "StatAlignmentInvalid": "Stat Alignment is not within the expected range.", "StatBattleVersionInvalid": "Battle Version is not within the expected range.", "StatNobleInvalid": "Noble Flag mismatch.", "StatAlphaInvalid": "Alpha Flag mismatch.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_es-419.json b/PKHeX.Core/Resources/localize/legality/legality_es-419.json index 69bb3de80..552479c5e 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_es-419.json +++ b/PKHeX.Core/Resources/localize/legality/legality_es-419.json @@ -53,7 +53,7 @@ "EggLocationTrade": "Se puede eclosionar el Huevo intercambiado en la localización.", "EggLocationTradeFail": "Localización del Huevo inválida, no debería haber sido intercambiado mientras era un Huevo.", "EggMetLocationFail": "No se puede obtener el Huevo en la localización.", - "EggNature": "Los Huevos no pueden tener Naturaleza estadística.", + "EggNature": "Los Huevos no pueden tener ajustes de estadísticas.", "EggPP": "Los Huevos no pueden tener los contadores de PP modificados.", "EggPPUp": "No se puede aplicar Más PP a un huevo.", "EggRelearnFlags": "Los Huevos no pueden tener Discos Técnicos marcados.", @@ -293,7 +293,7 @@ "StatIncorrectCP": "Los PC calculados no coinciden con el valor almacenado.", "StatGigantamaxInvalid": "Gigamax incompatible.", "StatGigantamaxValid": "La marca de Gigamax fue cambiada por Maxisopa.", - "StatNatureInvalid": "La estadística de la naturaleza no está dentro del rango esperado.", + "StatAlignmentInvalid": "La variación de características no está dentro del rango esperado.", "StatBattleVersionInvalid": "La Versión de Batalla no está dentro del rango esperado.", "StatNobleInvalid": "Pokémon señorial incompatible.", "StatAlphaInvalid": "Alfa incompatible.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_es.json b/PKHeX.Core/Resources/localize/legality/legality_es.json index 60bd2c727..13d4c3596 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_es.json +++ b/PKHeX.Core/Resources/localize/legality/legality_es.json @@ -53,7 +53,7 @@ "EggLocationTrade": "Se puede eclosionar el Huevo intercambiado en la localización.", "EggLocationTradeFail": "Localización del Huevo inválida, no debería haber sido intercambiado mientras era un Huevo.", "EggMetLocationFail": "No se puede obtener el Huevo en la localización.", - "EggNature": "Los Huevos no pueden tener Naturaleza estadística.", + "EggNature": "Los Huevos no pueden tener ajustes de estadísticas.", "EggPP": "Los Huevos no pueden tener los contadores de PP modificados.", "EggPPUp": "No se puede aplicar Más PP a un huevo.", "EggRelearnFlags": "Los Huevos no pueden tener Discos Técnicos marcados.", @@ -293,7 +293,7 @@ "StatIncorrectCP": "Los PC calculados no coinciden con el valor almacenado.", "StatGigantamaxInvalid": "Gigamax incompatible.", "StatGigantamaxValid": "La marca de Gigamax fue cambiada por Maxisopa.", - "StatNatureInvalid": "La estadística de la naturaleza no está dentro del rango esperado.", + "StatAlignmentInvalid": "La variación de características no está dentro del rango esperado.", "StatBattleVersionInvalid": "La Versión de Batalla no está dentro del rango esperado.", "StatNobleInvalid": "Pokémon señorial incompatible.", "StatAlphaInvalid": "Alfa incompatible.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_fr.json b/PKHeX.Core/Resources/localize/legality/legality_fr.json index 5c6937350..06849c8a2 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_fr.json +++ b/PKHeX.Core/Resources/localize/legality/legality_fr.json @@ -53,7 +53,7 @@ "EggLocationTrade": "Œuf échangé peut éclore au Lieu de Rencontre.", "EggLocationTradeFail": "Lieu de Rencontre de l'Œuf non valide, ne devrait pas être « échangé » en Œuf.", "EggMetLocationFail": "L'Œuf ne peut pas être obtenu au Lieu de Rencontre.", - "EggNature": "Impossible de modifier la statistique de Nature d'un Œuf.", + "EggNature": "Impossible de modifier l'ajustement des statistiques d'un Œuf.", "EggPP": "Impossible de modifier les PP d'un Œuf.", "EggPPUp": "Impossible d'appliquer des PP Plus à un Œuf.", "EggRelearnFlags": "Aucun drapeau de Capacité Réapprise attendu.", @@ -293,7 +293,7 @@ "StatIncorrectCP": "Les PCs calculés ne correspondent pas à la valeur enregistrée.", "StatGigantamaxInvalid": "Le drapeau de Gigamax est incorrect.", "StatGigantamaxValid": "Le drapeau de Gigamax a été changé avec une Maxi Soupe.", - "StatNatureInvalid": "La Stat de la Nature n'est pas dans la plage attendue.", + "StatAlignmentInvalid": "La Ajust. de stats n'est pas dans la plage attendue.", "StatBattleVersionInvalid": "La Version de Combat n'est pas dans la plage attendue.", "StatNobleInvalid": "Le drapeau de Monarque est incorrect.", "StatAlphaInvalid": "Le drapeau de Baron est incorrect.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_it.json b/PKHeX.Core/Resources/localize/legality/legality_it.json index 323f04443..8dae98791 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_it.json +++ b/PKHeX.Core/Resources/localize/legality/legality_it.json @@ -53,7 +53,7 @@ "EggLocationTrade": "È possibile schiudere un Uovo scambiato nel luogo di incontro.", "EggLocationTradeFail": "Il luogo di incontro non dovrebbe essere 'Scambio', se è un Uovo.", "EggMetLocationFail": "Impossibile ottenre l'Uovo nel Luogo dell'Uovo.", - "EggNature": "Le Uova non possono avere la Natura delle Statistiche cambiata.", + "EggNature": "Le Uova non possono avere l'aggiustamento delle statistiche cambiato.", "EggPP": "Le Uova non possono avere modifiche ai PP.", "EggPPUp": "Non si possono applicare PP Up alle Uova.", "EggRelearnFlags": "Non sono previsti segnali di Mosse Ricordabili.", @@ -293,9 +293,9 @@ "StatIncorrectCP": "I PL calcolati non combaciano con il valore nei dati.", "StatGigantamaxInvalid": "Gigamax non corrispondente.", "StatGigantamaxValid": "Gigamax ottenuto con la Zuppamax.", - "StatNatureInvalid": "La Natura delle Statistiche non è in un range accettabile.", - "StatBattleVersionInvalid": "la Versione Lotta non è in un range accettabile.", - "StatNobleInvalid": "Sgnale Nobile non corrispondente.", + "StatAlignmentInvalid": "La calibrazione statistiche non è in un range accettabile.", + "StatBattleVersionInvalid": "La Versione Lotta non è in un range accettabile.", + "StatNobleInvalid": "Segnale Nobile non corrispondente.", "StatAlphaInvalid": "Alfa non corrispondente.", "StoredSourceEgg": "L'uovo deve trovarsi nei Box o in squadra.", "StoredSlotSourceInvalid_0": "Origine della fusione non valida: {0}", diff --git a/PKHeX.Core/Resources/localize/legality/legality_ja.json b/PKHeX.Core/Resources/localize/legality/legality_ja.json index e9bf71bf8..09dc6fb9f 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_ja.json +++ b/PKHeX.Core/Resources/localize/legality/legality_ja.json @@ -53,7 +53,7 @@ "EggLocationTrade": "出会った場所で交換したタマゴを孵化させることができます。", "EggLocationTradeFail": "もらった場所が無効です。タマゴの状態で交換してはいけません。", "EggMetLocationFail": "そのもらった場所では、タマゴを入手できません。", - "EggNature": "タマゴはミントで性格変更できません。", + "EggNature": "タマゴは能力調整を変更できません。", "EggPP": "タマゴは技のPPを変更することはできません。", "EggPPUp": "タマゴにポイントアップは使用できません", "EggRelearnFlags": "技を思い出すフラグがないと思われます。", @@ -293,7 +293,7 @@ "StatIncorrectCP": "計算されたCPが保存値と一致しません。", "StatGigantamaxInvalid": "キョダイマックスフラグの不一致。", "StatGigantamaxValid": "ダイスープによってキョダイマックスフラグが変更されました。", - "StatNatureInvalid": "ミント性格補正が予想の範囲内にありません。", + "StatAlignmentInvalid": "ミント能力補正予想の範囲内にありません。", "StatBattleVersionInvalid": "バトルバージョンは予想の範囲内ではありません。", "StatNobleInvalid": "キング/クイーンのフラグが不一致。", "StatAlphaInvalid": "オヤブンフラグ不一致。", diff --git a/PKHeX.Core/Resources/localize/legality/legality_ko.json b/PKHeX.Core/Resources/localize/legality/legality_ko.json index 845996fdf..c79a69ef6 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_ko.json +++ b/PKHeX.Core/Resources/localize/legality/legality_ko.json @@ -53,7 +53,7 @@ "EggLocationTrade": "만난 장소에서 교환한 알을 부화시킬 수 있습니다.", "EggLocationTradeFail": "알을 만난 장소가 잘못되었습니다. 부화 전 알을 교환할 수 없습니다.", "EggMetLocationFail": "알을 만난 장소에서 알을 얻을 수 없습니다.", - "EggNature": "알은 성격과 능력치 성격이 서로 다를 수 없습니다.", + "EggNature": "알은 능력치 조정을 변경할 수 없습니다.", "EggPP": "알은 PP를 수정할 수 없습니다.", "EggPPUp": "알에는 PP업을 적용할 수 없습니다.", "EggRelearnFlags": "떠올리기 기술 플래그가 없어야 합니다.", @@ -293,7 +293,7 @@ "StatIncorrectCP": "계산된 CP와 저장된 값이 일치하지 않습니다.", "StatGigantamaxInvalid": "거다이맥스 플래그가 일치하지 않습니다.", "StatGigantamaxValid": "거다이맥스 플래그가 다이수프를 통해 변경되었습니다.", - "StatNatureInvalid": "능력치 성격 수치가 예상 범위 내에 있지 않습니다.", + "StatAlignmentInvalid": "능력 보정 수치가 예상 범위 내에 있지 않습니다.", "StatBattleVersionInvalid": "배틀 버전 수치가 예상 범위 내에 있지 않습니다.", "StatNobleInvalid": "왕/여왕 플래그가 일치하지 않습니다.", "StatAlphaInvalid": "우두머리 플래그가 일치하지 않습니다.", diff --git a/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json b/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json index cd705b17d..835096817 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json +++ b/PKHeX.Core/Resources/localize/legality/legality_zh-hans.json @@ -53,7 +53,7 @@ "EggLocationTrade": "能在相遇地点孵化交易的蛋。", "EggLocationTradeFail": "非法蛋取得场所, 不能在还是蛋时“交换”", "EggMetLocationFail": "不能在蛋取得场所获得蛋。", - "EggNature": "不能改变蛋的能力性格(薄荷)。", + "EggNature": "不能改变蛋的能力调整(薄荷)。", "EggPP": "蛋不能有PP数变动。", "EggPPUp": "不能对蛋使用PP提升剂。", "EggRelearnFlags": "蛋没有回忆招式。", @@ -293,7 +293,7 @@ "StatIncorrectCP": "计算的CP值与存储值不匹配。", "StatGigantamaxInvalid": "超极巨标志不匹配。", "StatGigantamaxValid": "超极巨标志已被极巨汤修改。", - "StatNatureInvalid": "性格不在期望范围内。", + "StatAlignmentInvalid": "能力调整不在期望范围内。", "StatBattleVersionInvalid": "对战版本不在期望范围内。", "StatNobleInvalid": "王标记非法。", "StatAlphaInvalid": "头目标记不匹配。", diff --git a/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json b/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json index ddd455bc5..d5b0b78ae 100644 --- a/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json +++ b/PKHeX.Core/Resources/localize/legality/legality_zh-hant.json @@ -53,7 +53,7 @@ "EggLocationTrade": "可於遇見地點孵化「連線交換」所得蛋。", "EggLocationTradeFail": "不合法之蛋取得場所, 無法於寶可夢仍是蛋時「連線交換」。", "EggMetLocationFail": "無法於設定之蛋取得場所獲得該蛋。", - "EggNature": "無法使用「薄荷」修正蛋之性格。", + "EggNature": "無法使用「薄荷」修正蛋之能力調整。", "EggPP": "蛋不能修改 PP 值。", "EggPPUp": "不能對蛋使用 PP 提升劑。", "EggRelearnFlags": "預期不會重新學習技能標記。", @@ -293,7 +293,7 @@ "StatIncorrectCP": "計算之 CP 值與存儲值不匹配。", "StatGigantamaxInvalid": "超極巨標識不匹配。", "StatGigantamaxValid": "超極巨標識已被極巨湯修改。", - "StatNatureInvalid": "薄荷修正之性格表現不在期望範圍內。", + "StatAlignmentInvalid": "能力調整現不在期望範圍內。", "StatBattleVersionInvalid": "對戰版本不在期望範圍內。", "StatNobleInvalid": "王標識不合法。", "StatAlphaInvalid": "頭目標識不合法。", diff --git a/PKHeX.WinForms/Controls/PKM Editor/ExperienceBar.cs b/PKHeX.WinForms/Controls/PKM Editor/ExperienceBar.cs index 884f0b601..13272c399 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/ExperienceBar.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/ExperienceBar.cs @@ -15,7 +15,7 @@ public partial class ExperienceBar : UserControl private double CurrentPercent => Experience.GetEXPToLevelUpPercentage(Level, EXP, Growth); private void NotifyUpdate() => ValueChanged?.Invoke(this, EventArgs.Empty); - private int RealWidth => BorderStyle == BorderStyle.None ? Width : Width - SystemInformation.BorderSize.Width * 2; + private int RealWidth => BorderStyle == BorderStyle.None ? Width : Width - (SystemInformation.BorderSize.Width * 2); private int Border => BorderStyle == BorderStyle.None ? 0 : SystemInformation.BorderSize.Width; private uint GetEXPEdgeHigh() @@ -100,13 +100,21 @@ private void SetNewPixelPercent(int newWidth, bool scroll) var maxWidth = RealWidth; // Recalculate EXP, trigger the event, which will trigger another Update. if (newWidth < 0) + { Underflow(); + } else if (newWidth >= maxWidth) + { Overflow(); + } else if (newWidth >= maxWidth + 1) + { EdgeHigh(); + } else if (newWidth == 0) + { EdgeLow(); + } else // somewhere in between { var range = Experience.GetEXPToLevelUp(Level, Growth); diff --git a/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs b/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs index c799dbc90..84e6e935a 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs @@ -423,7 +423,7 @@ private static int GetAbilityIndex4(PKM pk) private void LoadMisc8(PK8 pk8) { - CB_StatNature.SelectedValue = (int)pk8.StatNature; + CB_StatAlignment.SelectedValue = (int)pk8.StatAlignment; LoadClamp(Stats.CB_DynamaxLevel, pk8.DynamaxLevel); Stats.CHK_Gigantamax.Checked = pk8.CanGigantamax; CB_HTLanguage.SelectedValue = (int)pk8.HandlingTrainerLanguage; @@ -433,7 +433,7 @@ private void LoadMisc8(PK8 pk8) private void SaveMisc8(PK8 pk8) { - pk8.StatNature = (Nature)WinFormsUtil.GetIndex(CB_StatNature); + pk8.StatAlignment = (Nature)WinFormsUtil.GetIndex(CB_StatAlignment); pk8.DynamaxLevel = (byte)Math.Max(0, Stats.CB_DynamaxLevel.SelectedIndex); pk8.CanGigantamax = Stats.CHK_Gigantamax.Checked; pk8.HandlingTrainerLanguage = (byte)WinFormsUtil.GetIndex(CB_HTLanguage); @@ -442,7 +442,7 @@ private void SaveMisc8(PK8 pk8) private void LoadMisc8(PB8 pk8) { - CB_StatNature.SelectedValue = (int)pk8.StatNature; + CB_StatAlignment.SelectedValue = (int)pk8.StatAlignment; LoadClamp(Stats.CB_DynamaxLevel, pk8.DynamaxLevel); Stats.CHK_Gigantamax.Checked = pk8.CanGigantamax; CB_HTLanguage.SelectedValue = (int)pk8.HandlingTrainerLanguage; @@ -452,7 +452,7 @@ private void LoadMisc8(PB8 pk8) private void SaveMisc8(PB8 pk8) { - pk8.StatNature = (Nature)WinFormsUtil.GetIndex(CB_StatNature); + pk8.StatAlignment = (Nature)WinFormsUtil.GetIndex(CB_StatAlignment); pk8.DynamaxLevel = (byte)Math.Max(0, Stats.CB_DynamaxLevel.SelectedIndex); pk8.CanGigantamax = Stats.CHK_Gigantamax.Checked; pk8.HandlingTrainerLanguage = (byte)WinFormsUtil.GetIndex(CB_HTLanguage); @@ -461,7 +461,7 @@ private void SaveMisc8(PB8 pk8) private void LoadMisc8(PA8 pk8) { - CB_StatNature.SelectedValue = (int)pk8.StatNature; + CB_StatAlignment.SelectedValue = (int)pk8.StatAlignment; LoadClamp(Stats.CB_DynamaxLevel, pk8.DynamaxLevel); Stats.CHK_Gigantamax.Checked = pk8.CanGigantamax; CB_HTLanguage.SelectedValue = (int)pk8.HandlingTrainerLanguage; @@ -474,7 +474,7 @@ private void LoadMisc8(PA8 pk8) private void SaveMisc8(PA8 pk8) { - pk8.StatNature = (Nature)WinFormsUtil.GetIndex(CB_StatNature); + pk8.StatAlignment = (Nature)WinFormsUtil.GetIndex(CB_StatAlignment); pk8.DynamaxLevel = (byte)Math.Max(0, Stats.CB_DynamaxLevel.SelectedIndex); pk8.CanGigantamax = Stats.CHK_Gigantamax.Checked; pk8.HandlingTrainerLanguage = (byte)WinFormsUtil.GetIndex(CB_HTLanguage); @@ -486,7 +486,7 @@ private void SaveMisc8(PA8 pk8) private void LoadMisc9(PK9 pk9) { - CB_StatNature.SelectedValue = (int)pk9.StatNature; + CB_StatAlignment.SelectedValue = (int)pk9.StatAlignment; CB_HTLanguage.SelectedValue = (int)pk9.HandlingTrainerLanguage; TB_HomeTracker.Text = pk9.Tracker.ToString("X16"); CB_BattleVersion.SelectedValue = (int)pk9.BattleVersion; @@ -497,7 +497,7 @@ private void LoadMisc9(PK9 pk9) private void SaveMisc9(PK9 pk9) { - pk9.StatNature = (Nature)WinFormsUtil.GetIndex(CB_StatNature); + pk9.StatAlignment = (Nature)WinFormsUtil.GetIndex(CB_StatAlignment); pk9.HandlingTrainerLanguage = (byte)WinFormsUtil.GetIndex(CB_HTLanguage); pk9.BattleVersion = (GameVersion)WinFormsUtil.GetIndex(CB_BattleVersion); pk9.TeraTypeOriginal = (MoveType)WinFormsUtil.GetIndex(Stats.CB_TeraTypeOriginal); @@ -507,7 +507,7 @@ private void SaveMisc9(PK9 pk9) private void LoadMisc9(PA9 pk9) { - CB_StatNature.SelectedValue = (int)pk9.StatNature; + CB_StatAlignment.SelectedValue = (int)pk9.StatAlignment; CB_HTLanguage.SelectedValue = (int)pk9.HandlingTrainerLanguage; TB_HomeTracker.Text = pk9.Tracker.ToString("X16"); CB_BattleVersion.SelectedValue = (int)pk9.BattleVersion; @@ -517,7 +517,7 @@ private void LoadMisc9(PA9 pk9) private void SaveMisc9(PA9 pk9) { - pk9.StatNature = (Nature)WinFormsUtil.GetIndex(CB_StatNature); + pk9.StatAlignment = (Nature)WinFormsUtil.GetIndex(CB_StatAlignment); pk9.HandlingTrainerLanguage = (byte)WinFormsUtil.GetIndex(CB_HTLanguage); pk9.BattleVersion = (GameVersion)WinFormsUtil.GetIndex(CB_BattleVersion); pk9.ObedienceLevel = (byte)Util.ToInt32(TB_ObedienceLevel.Text); diff --git a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.Designer.cs b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.Designer.cs index 845dc168d..f36ad6810 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.Designer.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.Designer.cs @@ -65,8 +65,8 @@ private void InitializeComponent() L_FormArgument = new System.Windows.Forms.Label(); CB_Form = new System.Windows.Forms.ComboBox(); Label_Form = new System.Windows.Forms.Label(); - CB_StatNature = new System.Windows.Forms.ComboBox(); - L_StatNature = new System.Windows.Forms.Label(); + CB_StatAlignment = new System.Windows.Forms.ComboBox(); + L_StatAlignment = new System.Windows.Forms.Label(); CB_Nature = new System.Windows.Forms.ComboBox(); Label_Nature = new System.Windows.Forms.Label(); FLP_EXPLevelRight = new System.Windows.Forms.FlowLayoutPanel(); @@ -92,6 +92,7 @@ private void InitializeComponent() PB_ShinyStar = new SelectablePictureBox(); PB_ShinySquare = new SelectablePictureBox(); NUD_ShadowID = new System.Windows.Forms.NumericUpDown(); + ExperienceBar = new ExperienceBar(); Hidden_Met = new System.Windows.Forms.TabPage(); FLP_Met = new System.Windows.Forms.FlowLayoutPanel(); FLP_OriginGame = new System.Windows.Forms.FlowLayoutPanel(); @@ -250,7 +251,6 @@ private void InitializeComponent() Tab_Moves = new System.Windows.Forms.TabPage(); Tab_Cosmetic = new System.Windows.Forms.TabPage(); Tab_OTMisc = new System.Windows.Forms.TabPage(); - ExperienceBar = new ExperienceBar(); Hidden_TC.SuspendLayout(); Hidden_Main.SuspendLayout(); TLP_Main.SuspendLayout(); @@ -391,8 +391,8 @@ private void InitializeComponent() TLP_Main.Controls.Add(L_FormArgument, 0, 8); TLP_Main.Controls.Add(CB_Form, 1, 7); TLP_Main.Controls.Add(Label_Form, 0, 7); - TLP_Main.Controls.Add(CB_StatNature, 1, 6); - TLP_Main.Controls.Add(L_StatNature, 0, 6); + TLP_Main.Controls.Add(CB_StatAlignment, 1, 6); + TLP_Main.Controls.Add(L_StatAlignment, 0, 6); TLP_Main.Controls.Add(CB_Nature, 1, 5); TLP_Main.Controls.Add(Label_Nature, 0, 5); TLP_Main.Controls.Add(FLP_EXPLevelRight, 1, 3); @@ -823,31 +823,31 @@ private void InitializeComponent() Label_Form.Text = "Form:"; Label_Form.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // - // CB_StatNature + // CB_StatAlignment // - CB_StatNature.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - CB_StatNature.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - CB_StatNature.FormattingEnabled = true; - CB_StatNature.Location = new System.Drawing.Point(120, 158); - CB_StatNature.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); - CB_StatNature.Name = "CB_StatNature"; - CB_StatNature.Size = new System.Drawing.Size(144, 25); - CB_StatNature.TabIndex = 11; - CB_StatNature.SelectedIndexChanged += ValidateComboBox2; - CB_StatNature.Validating += ValidateComboBox; + CB_StatAlignment.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CB_StatAlignment.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CB_StatAlignment.FormattingEnabled = true; + CB_StatAlignment.Location = new System.Drawing.Point(120, 158); + CB_StatAlignment.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + CB_StatAlignment.Name = "CB_StatAlignment"; + CB_StatAlignment.Size = new System.Drawing.Size(144, 25); + CB_StatAlignment.TabIndex = 11; + CB_StatAlignment.SelectedIndexChanged += ValidateComboBox2; + CB_StatAlignment.Validating += ValidateComboBox; // - // L_StatNature + // L_StatAlignment // - L_StatNature.Anchor = System.Windows.Forms.AnchorStyles.Right; - L_StatNature.AutoSize = true; - L_StatNature.Location = new System.Drawing.Point(43, 161); - L_StatNature.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); - L_StatNature.Name = "L_StatNature"; - L_StatNature.Size = new System.Drawing.Size(77, 17); - L_StatNature.TabIndex = 10; - L_StatNature.Text = "Stat Nature:"; - L_StatNature.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - L_StatNature.Click += ClickNature; + L_StatAlignment.Anchor = System.Windows.Forms.AnchorStyles.Right; + L_StatAlignment.AutoSize = true; + L_StatAlignment.Location = new System.Drawing.Point(25, 161); + L_StatAlignment.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2); + L_StatAlignment.Name = "L_StatAlignment"; + L_StatAlignment.Size = new System.Drawing.Size(95, 17); + L_StatAlignment.TabIndex = 10; + L_StatAlignment.Text = "Stat Alignment:"; + L_StatAlignment.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + L_StatAlignment.Click += ClickNature; // // CB_Nature // @@ -1177,6 +1177,15 @@ private void InitializeComponent() NUD_ShadowID.TabIndex = 29; NUD_ShadowID.ValueChanged += UpdateShadowID; // + // ExperienceBar + // + ExperienceBar.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + ExperienceBar.Location = new System.Drawing.Point(120, 118); + ExperienceBar.Margin = new System.Windows.Forms.Padding(0, 0, 0, 4); + ExperienceBar.Name = "ExperienceBar"; + ExperienceBar.Size = new System.Drawing.Size(144, 10); + ExperienceBar.TabIndex = 34; + // // Hidden_Met // Hidden_Met.AllowDrop = true; @@ -1692,10 +1701,10 @@ private void InitializeComponent() // // GB_CurrentMoves // - GB_CurrentMoves.Location = new System.Drawing.Point(56, 8); - GB_CurrentMoves.Margin = new System.Windows.Forms.Padding(56, 8, 0, 0); + GB_CurrentMoves.Location = new System.Drawing.Point(48, 8); + GB_CurrentMoves.Margin = new System.Windows.Forms.Padding(48, 8, 0, 0); GB_CurrentMoves.Name = "GB_CurrentMoves"; - GB_CurrentMoves.Size = new System.Drawing.Size(136, 24); + GB_CurrentMoves.Size = new System.Drawing.Size(158, 24); GB_CurrentMoves.TabIndex = 48; GB_CurrentMoves.Text = "Current Moves"; GB_CurrentMoves.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; @@ -1707,7 +1716,7 @@ private void InitializeComponent() FLP_PP.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; FLP_PP.Controls.Add(Label_CurPP); FLP_PP.Controls.Add(Label_PPups); - FLP_PP.Location = new System.Drawing.Point(192, 8); + FLP_PP.Location = new System.Drawing.Point(206, 8); FLP_PP.Margin = new System.Windows.Forms.Padding(0, 8, 0, 0); FLP_PP.Name = "FLP_PP"; FLP_PP.Size = new System.Drawing.Size(64, 24); @@ -1721,7 +1730,7 @@ private void InitializeComponent() Label_CurPP.Size = new System.Drawing.Size(24, 24); Label_CurPP.TabIndex = 2; Label_CurPP.Text = "PP"; - Label_CurPP.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + Label_CurPP.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; Label_CurPP.Click += ClickPP; // // Label_PPups @@ -1732,7 +1741,7 @@ private void InitializeComponent() Label_PPups.Size = new System.Drawing.Size(40, 24); Label_PPups.TabIndex = 12; Label_PPups.Text = "Ups"; - Label_PPups.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + Label_PPups.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; Label_PPups.Click += ClickPPUps; // // MC_Move1 @@ -1794,10 +1803,10 @@ private void InitializeComponent() // GB_RelearnMoves // FLP_Moves.SetFlowBreak(GB_RelearnMoves, true); - GB_RelearnMoves.Location = new System.Drawing.Point(56, 148); - GB_RelearnMoves.Margin = new System.Windows.Forms.Padding(56, 8, 0, 0); + GB_RelearnMoves.Location = new System.Drawing.Point(48, 148); + GB_RelearnMoves.Margin = new System.Windows.Forms.Padding(48, 8, 0, 0); GB_RelearnMoves.Name = "GB_RelearnMoves"; - GB_RelearnMoves.Size = new System.Drawing.Size(216, 24); + GB_RelearnMoves.Size = new System.Drawing.Size(224, 24); GB_RelearnMoves.TabIndex = 50; GB_RelearnMoves.Text = "Relearn Moves"; GB_RelearnMoves.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; @@ -3201,15 +3210,6 @@ private void InitializeComponent() Tab_OTMisc.Text = "OT/Misc"; Tab_OTMisc.UseVisualStyleBackColor = true; // - // ExperienceBar - // - ExperienceBar.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - ExperienceBar.Location = new System.Drawing.Point(120, 118); - ExperienceBar.Margin = new System.Windows.Forms.Padding(0, 0, 0, 4); - ExperienceBar.Name = "ExperienceBar"; - ExperienceBar.Size = new System.Drawing.Size(144, 10); - ExperienceBar.TabIndex = 34; - // // PKMEditor // AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; @@ -3460,8 +3460,8 @@ private void InitializeComponent() private CatchRate CR_PK1; public SizeCP SizeCP; private System.Windows.Forms.PictureBox PB_Favorite; - private System.Windows.Forms.Label L_StatNature; - private System.Windows.Forms.ComboBox CB_StatNature; + private System.Windows.Forms.Label L_StatAlignment; + private System.Windows.Forms.ComboBox CB_StatAlignment; private System.Windows.Forms.PictureBox PB_Origin; private System.Windows.Forms.ComboBox CB_HTLanguage; private System.Windows.Forms.Button B_RelearnFlags; diff --git a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs index fa56b91f9..0e099cd34 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs @@ -48,7 +48,7 @@ public PKMEditor() new([CB_EggLocation], pk => pk.Format >= 4, Criteria), new([CB_Country, CB_SubRegion], pk => pk is PK6 or PK7, Criteria), new(Relearn, pk => pk.Format >= 6, Criteria), - new([CB_StatNature], pk => pk.Format >= 8, Criteria), + new([CB_StatAlignment], pk => pk.Format >= 8, Criteria), new([CB_AlphaMastered], pk => pk is PA8, Criteria), ]; @@ -118,7 +118,7 @@ public void InitializeBinding() { ComboBox[] cbs = [ - CB_Nature, CB_StatNature, + CB_Nature, CB_StatAlignment, CB_Country, CB_SubRegion, CB_3DSReg, CB_Language, CB_Ball, CB_HeldItem, CB_Species, DEV_Ability, CB_GroundTile, CB_GameOrigin, CB_BattleVersion, CB_Ability, CB_MetLocation, CB_EggLocation, CB_Language, CB_HTLanguage, CB_AlphaMastered, @@ -343,7 +343,7 @@ private void LoadFieldsFromPKM(PKM pk, bool focus = true, bool skipConversionChe Stats.UpdateIVs(this, EventArgs.Empty); UpdatePKRSInfected(this, EventArgs.Empty); UpdatePKRSCured(this, EventArgs.Empty); - UpdateNatureModification(CB_StatNature, Entity.StatNature); + UpdateNatureModification(CB_StatAlignment, Entity.StatAlignment); if (HaX) { @@ -766,9 +766,9 @@ private void ClickNature(object sender, EventArgs e) if (Entity.Format < 8) return; if (sender == Label_Nature) - CB_Nature.SelectedIndex = CB_StatNature.SelectedIndex; + CB_Nature.SelectedIndex = CB_StatAlignment.SelectedIndex; else - CB_StatNature.SelectedIndex = CB_Nature.SelectedIndex; + CB_StatAlignment.SelectedIndex = CB_Nature.SelectedIndex; } private void ClickMoves(object? sender, EventArgs e) @@ -1371,7 +1371,7 @@ public void ChangeNature(Nature newNature) if (Entity.Format < 3) return; - var cb = Entity.Format >= 8 ? CB_StatNature : CB_Nature; + var cb = Entity.Format >= 8 ? CB_StatAlignment : CB_Nature; cb.SelectedValue = (int)newNature; } @@ -1796,10 +1796,10 @@ private void ValidateComboBox2(object? sender, EventArgs e) Stats.UpdateIVs(sender, EventArgs.Empty); // updating Nature will trigger stats to update as well UpdateLegality(); } - else if (sender == CB_StatNature) + else if (sender == CB_StatAlignment) { - Entity.StatNature = (Nature)WinFormsUtil.GetIndex(CB_StatNature); - UpdateNatureModification(CB_StatNature, Entity.StatNature); + Entity.StatAlignment = (Nature)WinFormsUtil.GetIndex(CB_StatAlignment); + UpdateNatureModification(CB_StatAlignment, Entity.StatAlignment); Stats.UpdateIVs(sender, EventArgs.Empty); // updating Nature will trigger stats to update as well UpdateLegality(); } @@ -2103,7 +2103,7 @@ private void ToggleInterface(byte format) CB_Ability.Visible = CB_Ability.TabStop = !DEV_Ability.Enabled && format >= 3; Label_Nature.Visible = CB_Nature.Visible = format >= 3; - L_StatNature.Visible = CB_StatNature.Visible = format >= 8; + L_StatAlignment.Visible = CB_StatAlignment.Visible = format >= 8; Label_Ability.Visible = FLP_AbilityRight.Visible = format >= 3; FLP_ExtraBytes.Visible = format >= 3; GB_Markings.Visible = GB_Markings.TabStop = format >= 3; @@ -2296,7 +2296,7 @@ private void InitializeLanguage(ITrainerInfo sav) CB_GroundTile.DataSource = new BindingSource(source.G4GroundTiles, string.Empty); CB_Nature.DataSource = new BindingSource(source.Natures, string.Empty); - CB_StatNature.DataSource = new BindingSource(source.Natures, string.Empty); + CB_StatAlignment.DataSource = new BindingSource(source.Natures, string.Empty); // Sub-editors Stats.InitializeDataSources(); diff --git a/PKHeX.WinForms/Controls/PKM Editor/StatEditor.cs b/PKHeX.WinForms/Controls/PKM Editor/StatEditor.cs index 285d42f01..364f53c47 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/StatEditor.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/StatEditor.cs @@ -351,7 +351,7 @@ private void ClickStatLabel(object sender, MouseEventArgs e) _ => NatureAmpRequest.Increase, }; - var newNature = request.GetNewNature(index, Entity.StatNature); + var newNature = request.GetNewNature(index, Entity.StatAlignment); if (newNature == Nature.Random) return; diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index 48e1a4a07..a367e994b 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -272,7 +272,7 @@ LocalizedDescription.AllowGen1Tradeback=Erlaube Gen 1 Rücktausch LocalizedDescription.AllowGuessRejuvenateHOME=Erlaube der PKM Konvertierung, legale Begegnungs Daten, welche nicht im vorherigen Format gespeichert sind, zu erraten. LocalizedDescription.AllowIncompatibleConversion=Erlaube PKM Transfer Methoden, die nicht offiziell möglich sind. Einzelne Eigenschaften werden der Reihe nach kopiert. LocalizedDescription.ApplyMarkings=Markierungen beim Import anwenden -LocalizedDescription.ApplyNature=Statuswesen auf Wesen beim Import anwenden +LocalizedDescription.ApplyStatAlignment=Statuswertanpassung auf Wesen beim Import anwenden LocalizedDescription.AutoLoadSaveOnStartup=Spielstand beim Programmstart automatisch erkennen LocalizedDescription.BackupPath=Pfad zum Backup-Ordner, in dem Sicherungskopien der Spielstände aufbewahrt werden. LocalizedDescription.BAKEnabled=Automatische Spielstand Backups aktiviert @@ -519,7 +519,7 @@ Main.L_SaveSlot=Speicher-Slot: Main.L_Scale=Größe: Main.L_ShadowID=Crypto-ID: Main.L_Spirit7b=Elan: -Main.L_StatNature=Status-Wesen: +Main.L_StatAlignment=Stat‑Anp.: Main.L_TeraTypeOriginal=Original Tera Typ: Main.L_TeraTypeOverride=Überschr. Tera Typ: Main.L_WalkingMood=Lauf-Laune: diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index a8b2a93cf..ed3130c2c 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -272,7 +272,7 @@ LocalizedDescription.AllowGen1Tradeback=GB: Allow Generation 2 tradeback learnse LocalizedDescription.AllowGuessRejuvenateHOME=Allow PKM file conversion paths to guess the legal original encounter data that is not stored in the format that it was converted from. LocalizedDescription.AllowIncompatibleConversion=Allow PKM file conversion paths that are not possible via official methods. Individual properties will be copied sequentially. LocalizedDescription.ApplyMarkings=Apply Markings on Import -LocalizedDescription.ApplyNature=Apply StatNature to Nature on Import +LocalizedDescription.ApplyStatAlignment=Apply Stat Alignment to Nature on Import LocalizedDescription.AutoLoadSaveOnStartup=Automatically Detect Save File on Program Startup LocalizedDescription.BackupPath=Path to the backup folder for keeping save file backups. LocalizedDescription.BAKEnabled=Automatic Save File Backups Enabled @@ -519,7 +519,7 @@ Main.L_SaveSlot=Save Slot: Main.L_Scale=Scale: Main.L_ShadowID=Shadow ID: Main.L_Spirit7b=Spirit: -Main.L_StatNature=Stat Nature: +Main.L_StatAlignment=Stat Alignment: Main.L_TeraTypeOriginal=Original Tera Type: Main.L_TeraTypeOverride=Override Tera Type: Main.L_WalkingMood=Walking Mood: diff --git a/PKHeX.WinForms/Resources/text/lang_es-419.txt b/PKHeX.WinForms/Resources/text/lang_es-419.txt index e4c134a8a..e8d860c34 100644 --- a/PKHeX.WinForms/Resources/text/lang_es-419.txt +++ b/PKHeX.WinForms/Resources/text/lang_es-419.txt @@ -272,7 +272,7 @@ LocalizedDescription.AllowGen1Tradeback=GB: Permitir intercambio de movimientos LocalizedDescription.AllowGuessRejuvenateHOME=Permitir adivinar a la ruta de conversión de archivos PKM los datos del encuentro original que no estén almacenados en el formato origen. LocalizedDescription.AllowIncompatibleConversion=Permitir direcciones de conversión de archivos PKM que no son posibles por métodos oficiales. Las propiedades individuales serán copiadas secuencialmente. LocalizedDescription.ApplyMarkings=Aplicar marcadores al importar -LocalizedDescription.ApplyNature=Aplicar Naturaleza Estadística a la naturaleza al importar +LocalizedDescription.ApplyStatAlignment=Aplicar Variación de características a la naturaleza al importar LocalizedDescription.AutoLoadSaveOnStartup=Detectar automáticamente el archivo de guardado al iniciar el programa LocalizedDescription.BackupPath=Ruta a la carpeta de respaldos para conservar las copias de seguridad de las partidas. LocalizedDescription.BAKEnabled=Respaldo Automático de archivos de guardado habilitado @@ -519,7 +519,7 @@ Main.L_SaveSlot=Ranura de guardado: Main.L_Scale=Escala: Main.L_ShadowID=ID Oscuro: Main.L_Spirit7b=Ánimo: -Main.L_StatNature=Naturaleza Estad.: +Main.L_StatAlignment=Var. carac.: Main.L_TeraTypeOriginal=Teratipo original: Main.L_TeraTypeOverride=Teratipo sobreescrito: Main.L_WalkingMood=Humor de Caminar: diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index 5ab4e464b..f35de7d13 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -272,7 +272,7 @@ LocalizedDescription.AllowGen1Tradeback=GB: Permitir intercambio de movimientos LocalizedDescription.AllowGuessRejuvenateHOME=Permitir adivinar a la ruta de conversión de archivos PKM los datos del encuentro original que no estén almacenados en el formato origen. LocalizedDescription.AllowIncompatibleConversion=Permitir direcciones de conversión de archivos PKM que no son posibles por métodos oficiales. Las propiedades individuales serán copiadas secuencialmente. LocalizedDescription.ApplyMarkings=Aplicar marcadores al importar -LocalizedDescription.ApplyNature=Aplicar Naturaleza Estadística a la naturaleza al importar +LocalizedDescription.ApplyStatAlignment=Aplicar Variación de características a la naturaleza al importar LocalizedDescription.AutoLoadSaveOnStartup=Detectar automáticamente el archivo de guardado al iniciar el programa LocalizedDescription.BackupPath=Ruta a la carpeta de copias de seguridad para guardar los archivos de respaldo. LocalizedDescription.BAKEnabled=Respaldo Automático de archivos de guardado habilitado @@ -519,7 +519,7 @@ Main.L_SaveSlot=Ranura de guardado: Main.L_Scale=Escala: Main.L_ShadowID=ID Oscuro: Main.L_Spirit7b=Ánimo: -Main.L_StatNature=Naturaleza Estad.: +Main.L_StatAlignment=Var. carac.: Main.L_TeraTypeOriginal=Teratipo original: Main.L_TeraTypeOverride=Teratipo sobreescrito: Main.L_WalkingMood=Humor de Caminar: diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index 424a66dc1..81c0c2a0f 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -272,7 +272,7 @@ LocalizedDescription.AllowGen1Tradeback=GB : Autorise les attaques de revenants LocalizedDescription.AllowGuessRejuvenateHOME=Autorise les chemins de conversion des fichiers PKM de deviner les données de rencontre originales légales qui ne sont pas stockées dans le format à partir duquel elles ont été converties. LocalizedDescription.AllowIncompatibleConversion=Autorise les chemins de conversion des fichiers PKM qui ne sont pas possibles via les méthodes officielles. Les propriétés individuelles seront copiées de manière séquentielle. LocalizedDescription.ApplyMarkings=Appliquer des Marques lors de l'import -LocalizedDescription.ApplyNature=Appliquer StatNature à la Nature lors de l'import +LocalizedDescription.ApplyStatAlignment=Appliquer Ajust. de stats à la Nature lors de l'import LocalizedDescription.AutoLoadSaveOnStartup=Détection automatique du fichier de sauvegarde au démarrage du programme LocalizedDescription.BackupPath=Chemin vers le dossier de secours (backup) pour conserver des copies des sauvegardes. LocalizedDescription.BAKEnabled=Sauvegarde automatique des fichiers activée @@ -519,7 +519,7 @@ Main.L_SaveSlot=Sauvegarde : Main.L_Scale=Échelle : Main.L_ShadowID=ID Obscur : Main.L_Spirit7b=Esprit : -Main.L_StatNature=Stat nature : +Main.L_StatAlignment=Stat alignement : Main.L_TeraTypeOriginal=Type Téra d'origine : Main.L_TeraTypeOverride=Type Téra remplaçant : Main.L_WalkingMood=Humeur de marche : diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index 2e11f54aa..494d645c3 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -272,7 +272,7 @@ LocalizedDescription.AllowGen1Tradeback=GB:Consenti insieme di mosse tradeback d LocalizedDescription.AllowGuessRejuvenateHOME=Prova ad indovinare dati di incontro originali legali, quando questi non sono contenuti all'interno del file di origine. LocalizedDescription.AllowIncompatibleConversion=Consenti conversioni di file PKM via percorsi non possibili con metodi ufficiali. Le proprietà individuali verranno copiate in maniera sequenziale. LocalizedDescription.ApplyMarkings=Applica Segnalini durante l'importazione -LocalizedDescription.ApplyNature=Applica la Natura delle Statistiche alla Natura durante l'importazine. +LocalizedDescription.ApplyStatAlignment=Applica Calibrazione statistiche alla Natura durante l'importazione. LocalizedDescription.AutoLoadSaveOnStartup=Rileva automaticamente il tipo del Salvtaggio durante l'Avvio. LocalizedDescription.BackupPath=Percorso della cartella di backup per la conservazione dei salvataggi. LocalizedDescription.BAKEnabled=Backup automatico dei File di Salvataggio attivo. @@ -519,7 +519,7 @@ Main.L_SaveSlot=Slot Salvataggio: Main.L_Scale=Scala: Main.L_ShadowID=ID Ombra: Main.L_Spirit7b=Entusiasmo: -Main.L_StatNature=Natura Statistiche: +Main.L_StatAlignment=Calib. stat.: Main.L_TeraTypeOriginal=Teratipo originale: Main.L_TeraTypeOverride=Teratipo sostitutivo: Main.L_WalkingMood=Umore a spasso: diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index 4cd71ab3a..05efa6a49 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -272,7 +272,7 @@ LocalizedDescription.AllowGen1Tradeback=GB: 第2世代からの逆輸入によ LocalizedDescription.AllowGuessRejuvenateHOME=PKMファイル変換時、変換元形式に保存されていない正規な元の出会い情報を推測することを許可します。 LocalizedDescription.AllowIncompatibleConversion=公式手段では不可能なPKMファイル変換経路を許可します。各プロパティは順番にコピーされます。 LocalizedDescription.ApplyMarkings=インポート時にマーキングを適用する。 -LocalizedDescription.ApplyNature=インポート時に、ミントによって変化した性格を元々の性格として適用します。 +LocalizedDescription.ApplyStatAlignment=インポート時に、ミントによって変化した能力補正を元々の能力補正として適用します。 LocalizedDescription.AutoLoadSaveOnStartup=起動時にセーブファイルを自動的に検出します。 LocalizedDescription.BackupPath=セーブファイルのバックアップを保存するためのバックアップフォルダーのパス。 LocalizedDescription.BAKEnabled=セーブデータの自動バックアップを有効にします。 @@ -519,7 +519,7 @@ Main.L_SaveSlot=セーブスロット: Main.L_Scale=サイズ Main.L_ShadowID=ダークポケモンID Main.L_Spirit7b=やるき: -Main.L_StatNature=ミント性格補正 +Main.L_StatAlignment=能力補正 Main.L_TeraTypeOriginal=元のテラスタイプ Main.L_TeraTypeOverride=変更テラスタイプ Main.L_WalkingMood=きげん: diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index 3590015d4..ee6c6348e 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -272,7 +272,7 @@ LocalizedDescription.AllowGen1Tradeback=GB: 2세대에서 옮겨온 1세대 기 LocalizedDescription.AllowGuessRejuvenateHOME=변환된 형식에 저장되지 않은 합법적인 원래 출현 데이터를 PKM 파일 변환 경로가 추측하도록 허용. LocalizedDescription.AllowIncompatibleConversion=공식 방식으로는 불가능한 PKM 파일 변환 경로를 허용합니다. 개별 속성은 순차적으로 복사됩니다. LocalizedDescription.ApplyMarkings=가져오기 시 마킹하기 -LocalizedDescription.ApplyNature=임포트시 자연에 StatNature 적용 +LocalizedDescription.ApplyStatAlignment=임포트시 자연에 능력 보정 적용 LocalizedDescription.AutoLoadSaveOnStartup=프로그램 시작 시 저장 파일 자동 감지 LocalizedDescription.BackupPath=저장 파일 백업을 위한 백업 폴더 경로 LocalizedDescription.BAKEnabled=세이브 파일 자동 백업 사용 @@ -519,7 +519,7 @@ Main.L_SaveSlot=세이브 슬롯: Main.L_Scale=배율: Main.L_ShadowID=다크 ID: Main.L_Spirit7b=의욕: -Main.L_StatNature=능력치 성격: +Main.L_StatAlignment=능력 보정: Main.L_TeraTypeOriginal=원래 테라스탈타입: Main.L_TeraTypeOverride=변경된 테라스탈타입: Main.L_WalkingMood=걷는 기분: diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt index a1fc5f1fe..b37ba715f 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hans.txt @@ -272,7 +272,7 @@ LocalizedDescription.AllowGen1Tradeback=GB 允许二代传回的招式组合 LocalizedDescription.AllowGuessRejuvenateHOME=允许在PKM文件转换中猜测那些未在文件中存储的合法原始相遇数据。 LocalizedDescription.AllowIncompatibleConversion=允许在PKM文件使用非官方方法转换,其个体值将按顺序复制。 LocalizedDescription.ApplyMarkings=导入时标记。 -LocalizedDescription.ApplyNature=在导入时将修正性格应用于性格。 +LocalizedDescription.ApplyStatAlignment=在导入时将能力调整应用为原始的能力调整。 LocalizedDescription.AutoLoadSaveOnStartup=在程序启动时自动加载存档文件。 LocalizedDescription.BackupPath=用于保存存档备份的备份文件夹路径。 LocalizedDescription.BAKEnabled=自动保存文件备份已启用 @@ -519,7 +519,7 @@ Main.L_SaveSlot=存档槽: Main.L_Scale=大小: Main.L_ShadowID=黑暗ID: Main.L_Spirit7b=干劲: -Main.L_StatNature=薄荷修正: +Main.L_StatAlignment=能力调整: Main.L_TeraTypeOriginal=原始太晶属性: Main.L_TeraTypeOverride=修正太晶属性: Main.L_WalkingMood=跟随宝可梦心情: diff --git a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt index 9afa22666..3396d70a3 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh-Hant.txt @@ -272,7 +272,7 @@ LocalizedDescription.AllowGen1Tradeback=GB 允許從第二世代傳回之招式 LocalizedDescription.AllowGuessRejuvenateHOME=允許 PKM 檔轉換時猜測未於轉換格式存儲的合法原始遇見數據。 LocalizedDescription.AllowIncompatibleConversion=允許 PKM 檔依照非官方方法進行轉換。個體值將按順序複製。 LocalizedDescription.ApplyMarkings=導入時標記 -LocalizedDescription.ApplyNature=在導入時將修正性格應用於性格 +LocalizedDescription.ApplyStatAlignment=在導入時將能力調整套用為原始的能力調整。 LocalizedDescription.AutoLoadSaveOnStartup=在程式啟動時自動載入儲存資料檔 LocalizedDescription.BackupPath=用於保存存檔備份的備份資料夾路徑。 LocalizedDescription.BAKEnabled=自動保儲存資料案備份已啟用 @@ -519,7 +519,7 @@ Main.L_SaveSlot=儲存資料槽: Main.L_Scale=尺寸: Main.L_ShadowID=黑暗ID: Main.L_Spirit7b=幹勁: -Main.L_StatNature=薄荷修正性格: +Main.L_StatAlignment=能力調整: Main.L_TeraTypeOriginal=原始太晶屬性: Main.L_TeraTypeOverride=轉變太晶屬性: Main.L_WalkingMood=跟隨寶可夢心情: From d41aac175ffdf695a051e2b27ad74153dbee3799 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 14 Jun 2026 15:02:00 -0500 Subject: [PATCH 81/81] Allow !? for jpn gen2 strings Closes #4821 not sure this is a perfect solution (traded from gen1=>nicknamed complainers, or iterator prefer-matching gen1 when having !?) --- PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs | 2 +- .../Legality/Verifiers/TrainerNameVerifier.cs | 2 +- PKHeX.Core/PKM/Strings/StringConverter2.cs | 15 ++++++++++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs b/PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs index 2457969d7..3e92928dd 100644 --- a/PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs @@ -370,7 +370,7 @@ private void VerifyG1NicknameWithinBounds(LegalityAnalysis data, ReadOnlySpan 10) data.AddLine(GetInvalid(NickLengthLong, 10)); } - else if (StringConverter1.GetIsJapanese(str)) + else if (data.EncounterOriginal.Generation == 1 ? StringConverter1.GetIsJapanese(str) : StringConverter2.GetIsJapanese(str)) { if (str.Length > 5) data.AddLine(GetInvalid(NickLengthLong, 5)); diff --git a/PKHeX.Core/Legality/Verifiers/TrainerNameVerifier.cs b/PKHeX.Core/Legality/Verifiers/TrainerNameVerifier.cs index d01180bc0..16c1af44e 100644 --- a/PKHeX.Core/Legality/Verifiers/TrainerNameVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/TrainerNameVerifier.cs @@ -146,7 +146,7 @@ private void VerifyGBOTWithinBounds(LegalityAnalysis data, ReadOnlySpan st { if (str.Length > 5) data.AddLine(GetInvalid(OTLong, 5)); - if (!StringConverter1.GetIsJapanese(str)) + if (data.EncounterOriginal.Generation == 1 ? !StringConverter1.GetIsJapanese(str) : !StringConverter2.GetIsJapanese(str)) data.AddLine(GetInvalid(G1CharOT)); } else if (pk.Korean) diff --git a/PKHeX.Core/PKM/Strings/StringConverter2.cs b/PKHeX.Core/PKM/Strings/StringConverter2.cs index 067e23989..84174feba 100644 --- a/PKHeX.Core/PKM/Strings/StringConverter2.cs +++ b/PKHeX.Core/PKM/Strings/StringConverter2.cs @@ -18,7 +18,20 @@ public static class StringConverter2 public const char TradeOT = StringConverter1.TradeOT; public const char LineBreak = '⏎'; // Mail - public static bool GetIsJapanese(ReadOnlySpan str) => StringConverter1.GetIsJapanese(str); + /// + /// Quick check if the input string is entirely Japanese characters. + /// + /// . This also adds ? and !. + public static bool GetIsJapanese(ReadOnlySpan str) + { + foreach (var x in str) + { + if (!IsJapanese(x)) + return false; + } + return true; + static bool IsJapanese(char c) => c is (>= '\u3000' and <= '\u30FC') or ('?' or '!'); + } public static bool GetIsEnglish(ReadOnlySpan str) => !GetIsJapanese(str); public static bool GetIsJapanese(ReadOnlySpan raw) => AllCharsInTable(raw, TableJP);